Skip to content

Commit

Permalink
Replace combinatoric linear algebra with linear program.
Browse files Browse the repository at this point in the history
  • Loading branch information
KirkMcDonald committed May 5, 2018
1 parent e519228 commit 6d3d9a8
Show file tree
Hide file tree
Showing 11 changed files with 362 additions and 437 deletions.
5 changes: 3 additions & 2 deletions calc.html
Expand Up @@ -26,6 +26,7 @@
<script src="matrix.js"></script>
<script src="dropdown.js"></script>
<script src="color.js"></script>
<script src="simplex.js"></script>
<script src="vectorize.js"></script>
<script src="subgraphs.js"></script>
<script src="factory.js"></script>
Expand Down Expand Up @@ -233,8 +234,8 @@ <h3>How can I give you money?</h3>
</div>

<div id="debug_tab" class="tab">
Solutions:
<div id="solutions"></div>
Last solution:
<div id="solution"></div>
Recipe matrixes:
<div id="matrixes"></div>
</div>
Expand Down
162 changes: 84 additions & 78 deletions debug.js
@@ -1,6 +1,6 @@
"use strict"

function getSolutionHeader(matrixSolver) {
function getSolutionHeader(matrixSolver, answerHeader) {
var row = document.createElement("tr")
var allImages = matrixSolver.recipes
for (var i = 0; i < allImages.length; i++) {
Expand All @@ -9,9 +9,64 @@ function getSolutionHeader(matrixSolver) {
cell.appendChild(getImage(obj))
row.appendChild(cell)
}
var cell = document.createElement("th")
cell.appendChild(new Text("tax"))
row.appendChild(cell)
var items = matrixSolver.items
for (var i = 0; i < items.length; i++) {
var item = items[i]
var cell = document.createElement("th")
cell.appendChild(new Text("s"))
cell.appendChild(getImage(item))
row.appendChild(cell)
}
var cell = document.createElement("th")
cell.appendChild(new Text("C"))
row.appendChild(cell)
if (answerHeader) {
var cell = document.createElement("th")
cell.appendChild(new Text("answer"))
row.appendChild(cell)
}
return row
}

function renderMatrix(matrixSolver, A, rowIcons) {
var table = document.createElement("table")
table.border = "1"
var header = getSolutionHeader(matrixSolver, true)
if (rowIcons) {
header.insertBefore(document.createElement("th"), header.firstChild)
}
table.appendChild(header)
for (var j = 0; j < A.rows; j++) {
var row = document.createElement("tr")
table.appendChild(row)
if (rowIcons) {
var td = document.createElement("td")
if (j < matrixSolver.items.length) {
var item = matrixSolver.items[j]
td.appendChild(getImage(item))
} else if (j == A.rows - 2) {
td.appendChild(new Text("tax"))
} else if (j == A.rows - 1) {
td.appendChild(new Text("cost"))
}
row.appendChild(td)
}
for (var k = 0; k < A.cols; k++) {
var cell = document.createElement("td")
cell.classList.add("right-align")
row.appendChild(cell)
var x = A.index(j, k)
var tt = document.createElement("tt")
tt.textContent = x.toMixed()
cell.appendChild(tt)
}
}
return table
}

function renderDebug() {
var debugTab = document.getElementById("debug_tab")

Expand All @@ -21,94 +76,45 @@ function renderDebug() {
debugTab.replaceChild(node, oldMatrixes)

for (var i = 0; i < solver.matrixSolvers.length; i++) {
var table = document.createElement("table")
table.border = "1"
node.appendChild(table)
var matrixSolver = solver.matrixSolvers[i]
var header = getSolutionHeader(matrixSolver)
header.insertBefore(document.createElement("th"), header.firstChild)
table.appendChild(header)
for (var j = 0; j < matrixSolver.items.length; j++) {
var item = matrixSolver.items[j]
var row = document.createElement("tr")
table.appendChild(row)
var td = document.createElement("td")
td.appendChild(getImage(item))
row.appendChild(td)
for (var k = 0; k < matrixSolver.recipes.length; k++) {
var cell = document.createElement("td")
cell.classList.add("right-align")
row.appendChild(cell)
var x = matrixSolver.matrix.index(j, k)
var tt = document.createElement("tt")
tt.textContent = x.toMixed()
cell.appendChild(tt)
}
}
var A = matrixSolver.matrix
var table = renderMatrix(matrixSolver, A, true)
node.appendChild(table)
}

var oldSolutions = document.getElementById("solutions")
var oldSolutions = document.getElementById("solution")
node = document.createElement("div")
node.id = "solutions"
node.id = "solution"
debugTab.replaceChild(node, oldSolutions)

for (var i = 0; i < solver.matrixSolvers.length; i++) {
var matrixSolver = solver.matrixSolvers[i]
var A = matrixSolver.lastProblem
if (A) {
var table = renderMatrix(matrixSolver, A, false)
node.appendChild(table)
}
var A = matrixSolver.lastSolution
/*if (A) {
var table = renderMatrix(matrixSolver, A, false)
node.appendChild(table)
}*/
var basis = getBasis(A)
var table = document.createElement("table")
table.border = "1"
node.appendChild(table)
var matrixSolver = solver.matrixSolvers[i]
var header = getSolutionHeader(matrixSolver)
var reasonHeader = document.createElement("th")
reasonHeader.textContent = "reason"
header.insertBefore(reasonHeader, header.firstChild)
for (var j = 0; j < matrixSolver.outputItems.length; j++) {
var item = matrixSolver.outputItems[j]
var cell = document.createElement("th")
cell.appendChild(new Text("-"))
cell.appendChild(getImage(item))
header.appendChild(cell)
}
table.appendChild(header)
for (var j = 0; j < matrixSolver.lastSolutions.length; j++) {
var solution = matrixSolver.lastSolutions[j]
var row = document.createElement("tr")
table.appendChild(row)
var reason = ""
if (solution.reason) {
reason = solution.reason
}
var reasonCell = document.createElement("td")
reasonCell.textContent = reason
row.appendChild(reasonCell)
var zeroOut = 0
var ignore = 0
var cols
if (solution.rates) {
cols = solution.rates.length
} else {
cols = solution.cols - 1
}
for (var k = 0; k < cols; k++) {
var cell = document.createElement("td")
var tt = document.createElement("tt")
cell.appendChild(tt)
if (solution.rates) {
var rate = solution.rates[k]
tt.textContent = alignRate(rate)
} else {
tt.textContent = "\u2014"
}
cell.classList.add("right-align")
if (k == solution.zero[zeroOut]) {
zeroOut++
cell.classList.add("zero-out")
}
if (k == solution.ignore[ignore]) {
ignore++
cell.classList.add("ignore")
}
row.appendChild(cell)
}
var row = document.createElement("tr")
table.appendChild(row)
for (var j = 0; j < basis.length; j++) {
var cell = document.createElement("td")
cell.classList.add("right-align")
row.appendChild(cell)
var x = basis[j]
var tt = document.createElement("tt")
tt.textContent = x.toDecimal(3)
cell.appendChild(tt)
}
node.appendChild(table)
}
}
4 changes: 2 additions & 2 deletions display.js
Expand Up @@ -776,7 +776,7 @@ function RecipeTable(node) {
var headers = [
Header("items/" + rateName, 2),
Header("belts", 2),
Header("waste/" + rateName),
Header("surplus/" + rateName),
Header("factories", 2),
Header("modules", 1),
Header("beacons", 1),
Expand Down Expand Up @@ -827,7 +827,7 @@ RecipeTable.prototype = {
constructor: RecipeTable,
setRecipeHeader: function() {
this.recipeHeader.textContent = "items/" + rateName
this.wasteHeader.textContent = "waste/" + rateName
this.wasteHeader.textContent = "surplus/" + rateName
},
updateDisplayedModules: function() {
for (var i = 0; i < this.rowArray.length; i++) {
Expand Down
4 changes: 2 additions & 2 deletions fragment.js
Expand Up @@ -30,8 +30,8 @@ function formatSettings() {
if (preferredFuel.name != DEFAULT_FUEL) {
settings += "fuel=" + preferredFuel.name + "&"
}
if (priorityName != DEFAULT_PRIORITY) {
settings += "p=" + priorityName + "&"
if (oilGroup != DEFAULT_OIL) {
settings += "p=" + oilGroup + "&"
}
if (kovarexEnabled != DEFAULT_KOVAREX) {
settings += "k=off&"
Expand Down
6 changes: 6 additions & 0 deletions matrix.js
Expand Up @@ -62,6 +62,12 @@ Matrix.prototype = {
this.setIndex(i, col, x.mul(value))
}
},
mulRow: function(row, value) {
for (var i = 0; i < this.cols; i++) {
var x = this.index(row, i)
this.setIndex(row, i, x.mul(value))
}
},
appendColumn: function(column) {
var mat = []
for (var i = 0; i < this.rows; i++) {
Expand Down
2 changes: 1 addition & 1 deletion rational.js
Expand Up @@ -110,7 +110,7 @@ Rational.prototype = {
},
abs: function() {
if (this.less(zero)) {
return this.mul(new Rational(bigInt.minusOne, bigInt.one))
return this.mul(minusOne)
}
return this
},
Expand Down
22 changes: 16 additions & 6 deletions settings.js
Expand Up @@ -249,10 +249,19 @@ var OIL_OPTIONS = [
new Oil("coal-liquefaction", "coal")
]

var priorityName
var DEFAULT_OIL = "default"

var OIL_EXCLUSION = {
"default": {},
"basic": {"advanced-oil-processing": true},
"coal": {"advanced-oil-processing": true, "basic-oil-processing": true}
}

var oilGroup = DEFAULT_OIL

function renderOil(settings) {
var oil = DEFAULT_PRIORITY
var oil = DEFAULT_OIL
// Named "p" for historical reasons.
if ("p" in settings) {
oil = settings.p
}
Expand All @@ -271,8 +280,9 @@ function renderOil(settings) {
}

function setOilRecipe(name) {
solver.setPriority(name)
priorityName = name
solver.removeDisabledRecipes(OIL_EXCLUSION[oilGroup])
oilGroup = name
solver.addDisabledRecipes(OIL_EXCLUSION[oilGroup])
}

// kovarex
Expand All @@ -293,9 +303,9 @@ function renderKovarex(settings) {
function setKovarex(enabled) {
kovarexEnabled = enabled
if (enabled) {
solver.setDisabledRecipes({})
solver.removeDisabledRecipes({"kovarex-enrichment-process": true})
} else {
solver.setDisabledRecipes({"kovarex-enrichment-process": true})
solver.addDisabledRecipes({"kovarex-enrichment-process": true})
}
}

Expand Down

0 comments on commit 6d3d9a8

Please sign in to comment.