91 lines
3.0 KiB
Markdown
91 lines
3.0 KiB
Markdown
# Solver Matrix
|
|
|
|
Current Solver:
|
|
* Matrix.lua: Contain class of Matrix
|
|
* SolverMatrix.lua: Common code of solvers
|
|
* SolverMatrixAlgebra.lua: Specifique code of Algebra calculation
|
|
* SolverMatrixSimplex.lua: Specifique code of Simplex method calculation
|
|
|
|
# Classes
|
|
|
|
## Matrix
|
|
Container for all informations
|
|
* field objectives is the input value, key column/value
|
|
* field objective_values is the input value, index column/value, is use with icol value in the code
|
|
|
|
```
|
|
---@class Matrix
|
|
---@field columns {[integer] : MatrixHeader}
|
|
---@field headers {[integer] : MatrixHeader}
|
|
---@field rows {[integer] : {[integer] : number}}
|
|
---@field columnIndex {[string] : integer}
|
|
---@field parameters {[integer] : MatrixRowParameters}
|
|
---@field objectives {[string] : number}
|
|
---@field objective_values {[integer] : number}
|
|
```
|
|
|
|
## MatrixHeader
|
|
Header of row or column
|
|
```
|
|
---@class MatrixHeader
|
|
---@field index uint
|
|
---@field key string
|
|
---@field type string
|
|
---@field name string
|
|
---@field sysname string
|
|
---@field tooltip string
|
|
---@field is_ingredient boolean
|
|
---@field product table
|
|
```
|
|
|
|
## MatrixRow
|
|
Row of matrix
|
|
```
|
|
---@class MatrixRow
|
|
---@field type string
|
|
---@field name string
|
|
---@field tooltip string
|
|
---@field header MatrixHeader
|
|
---@field columns {[integer] : MatrixHeader}
|
|
---@field values {[integer] : number}
|
|
---@field columnIndex {[string] : integer}
|
|
```
|
|
|
|
## MatrixRowParameters
|
|
Parameters on recipe of row
|
|
This stores all values for a recipe
|
|
```
|
|
---@class MatrixRowParameters
|
|
---@field base string
|
|
---@field contraint table
|
|
---@field factory_count number
|
|
---@field factory_speed number
|
|
---@field recipe_count number
|
|
---@field recipe_production number
|
|
---@field recipe_energy number
|
|
---@field coefficient number
|
|
```
|
|
|
|
# Matrix Debugger in factorio
|
|
|
|
To active the debugger: find it in the menu Settings/Mod Settings/Map, in helmod section enable "Active the debug solver"
|
|
|
|
After to see something use refresh in helmod to generate cache of matrix (only need one time)
|
|
|
|
Click on Open debug button
|
|
|
|

|
|
|
|
# Simplex code algorithm
|
|
|
|
1. Prepare initial matrix `SolverMatrix.get_block_matrix(block, parameters)`
|
|
1. Inject objectives in matrix `SolverMatrix:prepare_z_and_objectives(matrix, reverse)`
|
|
1. Start of program `SolverMatrixSimplex:solve_matrix(Mbase, debug, by_factory, time)`
|
|
1. Add ingredient recipes in rows and Inject initial recipes in columns `SolverMatrixSimplex:prepare(matrix)`
|
|
1. Search a pivot, greater positive value in row Z is the column, the greater division of coefficient bettween positive value of the colum is the row `SolverMatrixSimplex:get_pivot(matrix)`
|
|
1. Apply Gaussian pivot `SolverMatrixSimplex:pivot(matrix, xrow, xcol)`
|
|
1. Loop at "Search a pivot" while a pivot found
|
|
1. Compute the final Matrix, copy the recipe result in the parameters and compute the % production on each recipe `SolverMatrixSimplex:table_compute(matrix, matrix_result)` and `SolverMatrixSimplex:line_compute(matrix, xrow)`
|
|
1. Finalize the row Z `SolverMatrix:finalize(matrix)`
|
|
1. Apply status on products/ingredients `SolverMatrix:apply_state(matrix)`
|