@stevenvo780/st-lang 4.5.0 → 4.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -37
- package/dist/bdd/index.d.ts +4 -0
- package/dist/bdd/index.d.ts.map +1 -0
- package/dist/bdd/index.js +29 -0
- package/dist/bdd/index.js.map +1 -0
- package/dist/bdd/manager.d.ts +122 -0
- package/dist/bdd/manager.d.ts.map +1 -0
- package/dist/bdd/manager.js +524 -0
- package/dist/bdd/manager.js.map +1 -0
- package/dist/bdd/types.d.ts +20 -0
- package/dist/bdd/types.d.ts.map +1 -0
- package/dist/bdd/types.js +28 -0
- package/dist/bdd/types.js.map +1 -0
- package/dist/game-theory/common-games.d.ts +50 -0
- package/dist/game-theory/common-games.d.ts.map +1 -0
- package/dist/game-theory/common-games.js +112 -0
- package/dist/game-theory/common-games.js.map +1 -0
- package/dist/game-theory/dominance.d.ts +26 -0
- package/dist/game-theory/dominance.d.ts.map +1 -0
- package/dist/game-theory/dominance.js +203 -0
- package/dist/game-theory/dominance.js.map +1 -0
- package/dist/game-theory/index.d.ts +8 -0
- package/dist/game-theory/index.d.ts.map +1 -0
- package/dist/game-theory/index.js +47 -0
- package/dist/game-theory/index.js.map +1 -0
- package/dist/game-theory/lemke-howson.d.ts +3 -0
- package/dist/game-theory/lemke-howson.d.ts.map +1 -0
- package/dist/game-theory/lemke-howson.js +269 -0
- package/dist/game-theory/lemke-howson.js.map +1 -0
- package/dist/game-theory/linalg.d.ts +7 -0
- package/dist/game-theory/linalg.d.ts.map +1 -0
- package/dist/game-theory/linalg.js +69 -0
- package/dist/game-theory/linalg.js.map +1 -0
- package/dist/game-theory/pure-nash.d.ts +3 -0
- package/dist/game-theory/pure-nash.d.ts.map +1 -0
- package/dist/game-theory/pure-nash.js +86 -0
- package/dist/game-theory/pure-nash.js.map +1 -0
- package/dist/game-theory/support-enumeration.d.ts +3 -0
- package/dist/game-theory/support-enumeration.d.ts.map +1 -0
- package/dist/game-theory/support-enumeration.js +214 -0
- package/dist/game-theory/support-enumeration.js.map +1 -0
- package/dist/game-theory/types.d.ts +57 -0
- package/dist/game-theory/types.d.ts.map +1 -0
- package/dist/game-theory/types.js +191 -0
- package/dist/game-theory/types.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -1
- package/dist/index.js.map +1 -1
- package/dist/information-theory/index.d.ts +29 -0
- package/dist/information-theory/index.d.ts.map +1 -0
- package/dist/information-theory/index.js +323 -0
- package/dist/information-theory/index.js.map +1 -0
- package/dist/namespaces/logic.d.ts +42 -0
- package/dist/namespaces/logic.d.ts.map +1 -0
- package/dist/namespaces/logic.js +112 -0
- package/dist/namespaces/logic.js.map +1 -0
- package/dist/namespaces/proof-systems.d.ts +18 -0
- package/dist/namespaces/proof-systems.d.ts.map +1 -0
- package/dist/namespaces/proof-systems.js +59 -0
- package/dist/namespaces/proof-systems.js.map +1 -0
- package/dist/namespaces/reasoning.d.ts +26 -0
- package/dist/namespaces/reasoning.d.ts.map +1 -0
- package/dist/namespaces/reasoning.js +72 -0
- package/dist/namespaces/reasoning.js.map +1 -0
- package/dist/namespaces/semantics.d.ts +21 -0
- package/dist/namespaces/semantics.d.ts.map +1 -0
- package/dist/namespaces/semantics.js +64 -0
- package/dist/namespaces/semantics.js.map +1 -0
- package/dist/namespaces/solvers.d.ts +22 -0
- package/dist/namespaces/solvers.d.ts.map +1 -0
- package/dist/namespaces/solvers.js +66 -0
- package/dist/namespaces/solvers.js.map +1 -0
- package/dist/namespaces/type-theory.d.ts +22 -0
- package/dist/namespaces/type-theory.d.ts.map +1 -0
- package/dist/namespaces/type-theory.js +65 -0
- package/dist/namespaces/type-theory.js.map +1 -0
- package/dist/optimization/branch-and-bound.d.ts +11 -0
- package/dist/optimization/branch-and-bound.d.ts.map +1 -0
- package/dist/optimization/branch-and-bound.js +311 -0
- package/dist/optimization/branch-and-bound.js.map +1 -0
- package/dist/optimization/index.d.ts +5 -0
- package/dist/optimization/index.d.ts.map +1 -0
- package/dist/optimization/index.js +20 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/optimization/simplex.d.ts +8 -0
- package/dist/optimization/simplex.d.ts.map +1 -0
- package/dist/optimization/simplex.js +408 -0
- package/dist/optimization/simplex.js.map +1 -0
- package/dist/optimization/standard-form.d.ts +11 -0
- package/dist/optimization/standard-form.d.ts.map +1 -0
- package/dist/optimization/standard-form.js +112 -0
- package/dist/optimization/standard-form.js.map +1 -0
- package/dist/optimization/types.d.ts +44 -0
- package/dist/optimization/types.d.ts.map +1 -0
- package/dist/optimization/types.js +15 -0
- package/dist/optimization/types.js.map +1 -0
- package/dist/profiles/hol/connectives.d.ts +46 -0
- package/dist/profiles/hol/connectives.d.ts.map +1 -0
- package/dist/profiles/hol/connectives.js +104 -0
- package/dist/profiles/hol/connectives.js.map +1 -0
- package/dist/profiles/hol/index.d.ts +7 -0
- package/dist/profiles/hol/index.d.ts.map +1 -0
- package/dist/profiles/hol/index.js +77 -0
- package/dist/profiles/hol/index.js.map +1 -0
- package/dist/profiles/hol/rules.d.ts +31 -0
- package/dist/profiles/hol/rules.d.ts.map +1 -0
- package/dist/profiles/hol/rules.js +258 -0
- package/dist/profiles/hol/rules.js.map +1 -0
- package/dist/profiles/hol/term.d.ts +52 -0
- package/dist/profiles/hol/term.d.ts.map +1 -0
- package/dist/profiles/hol/term.js +345 -0
- package/dist/profiles/hol/term.js.map +1 -0
- package/dist/profiles/hol/type-system.d.ts +38 -0
- package/dist/profiles/hol/type-system.d.ts.map +1 -0
- package/dist/profiles/hol/type-system.js +133 -0
- package/dist/profiles/hol/type-system.js.map +1 -0
- package/dist/profiles/hol/types.d.ts +59 -0
- package/dist/profiles/hol/types.d.ts.map +1 -0
- package/dist/profiles/hol/types.js +26 -0
- package/dist/profiles/hol/types.js.map +1 -0
- package/dist/smt-lib/ast.d.ts +138 -0
- package/dist/smt-lib/ast.d.ts.map +1 -0
- package/dist/smt-lib/ast.js +73 -0
- package/dist/smt-lib/ast.js.map +1 -0
- package/dist/smt-lib/emitter.d.ts +12 -0
- package/dist/smt-lib/emitter.d.ts.map +1 -0
- package/dist/smt-lib/emitter.js +174 -0
- package/dist/smt-lib/emitter.js.map +1 -0
- package/dist/smt-lib/index.d.ts +6 -0
- package/dist/smt-lib/index.d.ts.map +1 -0
- package/dist/smt-lib/index.js +31 -0
- package/dist/smt-lib/index.js.map +1 -0
- package/dist/smt-lib/parser.d.ts +13 -0
- package/dist/smt-lib/parser.d.ts.map +1 -0
- package/dist/smt-lib/parser.js +614 -0
- package/dist/smt-lib/parser.js.map +1 -0
- package/dist/smt-lib/tokenizer.d.ts +16 -0
- package/dist/smt-lib/tokenizer.d.ts.map +1 -0
- package/dist/smt-lib/tokenizer.js +234 -0
- package/dist/smt-lib/tokenizer.js.map +1 -0
- package/dist/tests/api/namespaces.test.d.ts +9 -0
- package/dist/tests/api/namespaces.test.d.ts.map +1 -0
- package/dist/tests/api/namespaces.test.js +218 -0
- package/dist/tests/api/namespaces.test.js.map +1 -0
- package/dist/tests/bdd/manager.test.d.ts +2 -0
- package/dist/tests/bdd/manager.test.d.ts.map +1 -0
- package/dist/tests/bdd/manager.test.js +472 -0
- package/dist/tests/bdd/manager.test.js.map +1 -0
- package/dist/tests/game-theory/game-theory.test.d.ts +2 -0
- package/dist/tests/game-theory/game-theory.test.d.ts.map +1 -0
- package/dist/tests/game-theory/game-theory.test.js +252 -0
- package/dist/tests/game-theory/game-theory.test.js.map +1 -0
- package/dist/tests/hol/hol.test.d.ts +2 -0
- package/dist/tests/hol/hol.test.d.ts.map +1 -0
- package/dist/tests/hol/hol.test.js +340 -0
- package/dist/tests/hol/hol.test.js.map +1 -0
- package/dist/tests/information-theory/information-theory.test.d.ts +2 -0
- package/dist/tests/information-theory/information-theory.test.d.ts.map +1 -0
- package/dist/tests/information-theory/information-theory.test.js +291 -0
- package/dist/tests/information-theory/information-theory.test.js.map +1 -0
- package/dist/tests/optimization/ilp.test.d.ts +2 -0
- package/dist/tests/optimization/ilp.test.d.ts.map +1 -0
- package/dist/tests/optimization/ilp.test.js +204 -0
- package/dist/tests/optimization/ilp.test.js.map +1 -0
- package/dist/tests/optimization/lp.test.d.ts +2 -0
- package/dist/tests/optimization/lp.test.d.ts.map +1 -0
- package/dist/tests/optimization/lp.test.js +224 -0
- package/dist/tests/optimization/lp.test.js.map +1 -0
- package/dist/tests/properties/agm.property.test.d.ts +2 -0
- package/dist/tests/properties/agm.property.test.d.ts.map +1 -0
- package/dist/tests/properties/agm.property.test.js +75 -0
- package/dist/tests/properties/agm.property.test.js.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts +2 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.js +43 -0
- package/dist/tests/properties/anti-unification.property.test.js.map +1 -0
- package/dist/tests/properties/argumentation.property.test.d.ts +2 -0
- package/dist/tests/properties/argumentation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/argumentation.property.test.js +51 -0
- package/dist/tests/properties/argumentation.property.test.js.map +1 -0
- package/dist/tests/properties/bayesian.property.test.d.ts +2 -0
- package/dist/tests/properties/bayesian.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bayesian.property.test.js +32 -0
- package/dist/tests/properties/bayesian.property.test.js.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts +2 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.js +50 -0
- package/dist/tests/properties/bisimulation.property.test.js.map +1 -0
- package/dist/tests/properties/cdcl.property.test.d.ts +2 -0
- package/dist/tests/properties/cdcl.property.test.d.ts.map +1 -0
- package/dist/tests/properties/cdcl.property.test.js +70 -0
- package/dist/tests/properties/cdcl.property.test.js.map +1 -0
- package/dist/tests/properties/coinduction.property.test.d.ts +2 -0
- package/dist/tests/properties/coinduction.property.test.d.ts.map +1 -0
- package/dist/tests/properties/coinduction.property.test.js +34 -0
- package/dist/tests/properties/coinduction.property.test.js.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts +2 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.js +59 -0
- package/dist/tests/properties/constructive-reals.property.test.js.map +1 -0
- package/dist/tests/properties/csp.property.test.d.ts +2 -0
- package/dist/tests/properties/csp.property.test.d.ts.map +1 -0
- package/dist/tests/properties/csp.property.test.js +58 -0
- package/dist/tests/properties/csp.property.test.js.map +1 -0
- package/dist/tests/properties/generators.d.ts +78 -0
- package/dist/tests/properties/generators.d.ts.map +1 -0
- package/dist/tests/properties/generators.js +348 -0
- package/dist/tests/properties/generators.js.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts +2 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.js +46 -0
- package/dist/tests/properties/ho-unify.property.test.js.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts +2 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.js +33 -0
- package/dist/tests/properties/hyperreal.property.test.js.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts +2 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.js +57 -0
- package/dist/tests/properties/intuit-nj.property.test.js.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts +2 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.js +35 -0
- package/dist/tests/properties/lambda-calc.property.test.js.map +1 -0
- package/dist/tests/properties/mln.property.test.d.ts +2 -0
- package/dist/tests/properties/mln.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mln.property.test.js +41 -0
- package/dist/tests/properties/mln.property.test.js.map +1 -0
- package/dist/tests/properties/mltt.property.test.d.ts +2 -0
- package/dist/tests/properties/mltt.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mltt.property.test.js +33 -0
- package/dist/tests/properties/mltt.property.test.js.map +1 -0
- package/dist/tests/properties/nbe.property.test.d.ts +2 -0
- package/dist/tests/properties/nbe.property.test.d.ts.map +1 -0
- package/dist/tests/properties/nbe.property.test.js +44 -0
- package/dist/tests/properties/nbe.property.test.js.map +1 -0
- package/dist/tests/properties/planning.property.test.d.ts +2 -0
- package/dist/tests/properties/planning.property.test.d.ts.map +1 -0
- package/dist/tests/properties/planning.property.test.js +51 -0
- package/dist/tests/properties/planning.property.test.js.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts +2 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.js +71 -0
- package/dist/tests/properties/profile-bridge.property.test.js.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts +2 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.js +37 -0
- package/dist/tests/properties/refinement-types.property.test.js.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts +2 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.js +34 -0
- package/dist/tests/properties/sequent-g3.property.test.js.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts +2 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.js +49 -0
- package/dist/tests/properties/symbolic-diff.property.test.js.map +1 -0
- package/dist/tests/properties/system-f.property.test.d.ts +2 -0
- package/dist/tests/properties/system-f.property.test.d.ts.map +1 -0
- package/dist/tests/properties/system-f.property.test.js +37 -0
- package/dist/tests/properties/system-f.property.test.js.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts +2 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.js +38 -0
- package/dist/tests/properties/theorem-cache.property.test.js.map +1 -0
- package/dist/tests/properties/trs.property.test.d.ts +2 -0
- package/dist/tests/properties/trs.property.test.d.ts.map +1 -0
- package/dist/tests/properties/trs.property.test.js +34 -0
- package/dist/tests/properties/trs.property.test.js.map +1 -0
- package/dist/tests/properties/unification.property.test.d.ts +2 -0
- package/dist/tests/properties/unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/unification.property.test.js +42 -0
- package/dist/tests/properties/unification.property.test.js.map +1 -0
- package/dist/tests/smt-lib/emitter.test.d.ts +2 -0
- package/dist/tests/smt-lib/emitter.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/emitter.test.js +155 -0
- package/dist/tests/smt-lib/emitter.test.js.map +1 -0
- package/dist/tests/smt-lib/parser.test.d.ts +2 -0
- package/dist/tests/smt-lib/parser.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/parser.test.js +164 -0
- package/dist/tests/smt-lib/parser.test.js.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts +2 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.js +59 -0
- package/dist/tests/smt-lib/tokenizer.test.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Simplex de dos fases sobre tableau denso.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Implementa el método simplex revisado (forma tableau) con Bland's
|
|
6
|
+
// rule para evitar ciclos. Fase 1 construye una solución básica
|
|
7
|
+
// factible (BFS) introduciendo variables artificiales y minimizando
|
|
8
|
+
// su suma; si el óptimo de Fase 1 no es cero, el problema original
|
|
9
|
+
// es infactible. Fase 2 optimiza la función objetivo real partiendo
|
|
10
|
+
// de la BFS obtenida.
|
|
11
|
+
//
|
|
12
|
+
// Convenciones internas (DESPUÉS de pasar por `standardForm`):
|
|
13
|
+
// - Maximizar c·x s.t. Ax ≤ b, x ≥ 0.
|
|
14
|
+
// - Añadimos slacks s_i para cada restricción: Ax + Is = b.
|
|
15
|
+
// - Si algún b_i < 0, multiplicamos la fila por -1 (invierte el
|
|
16
|
+
// operador). Tras ese arreglo, si una fila no es naturalmente
|
|
17
|
+
// básica (slack negativo no nos sirve), introducimos artificial
|
|
18
|
+
// y entramos a Fase 1.
|
|
19
|
+
//
|
|
20
|
+
// El tableau se almacena como Float64Array por filas en un arreglo
|
|
21
|
+
// de length (m+1) * (n+m+a+1), donde m = #restricciones, n = #vars
|
|
22
|
+
// originales, a = #artificiales y la última columna es el RHS. La
|
|
23
|
+
// fila final es el costo reducido (objetivo).
|
|
24
|
+
//
|
|
25
|
+
// Tolerancia numérica: epsilon configurable. Bland's rule selecciona
|
|
26
|
+
// la columna entrante de menor índice con costo reducido > 0
|
|
27
|
+
// (estrictamente). Esto garantiza terminación finita aunque sea más
|
|
28
|
+
// lento que Dantzig en problemas degenerados.
|
|
29
|
+
// ============================================================
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.solveLP = solveLP;
|
|
32
|
+
const standard_form_1 = require("./standard-form");
|
|
33
|
+
const DEFAULT_EPS = 1e-9;
|
|
34
|
+
const DEFAULT_MAX_ITER = 5000;
|
|
35
|
+
function buildTableau(std, _eps) {
|
|
36
|
+
const m = std.constraints.length;
|
|
37
|
+
const n = std.objective.coefficients.length;
|
|
38
|
+
// Detectar filas con RHS negativo y reflejarlas. Aún así, los
|
|
39
|
+
// slacks no nos darán siempre una BFS positiva (si reflejamos,
|
|
40
|
+
// el slack queda con coeficiente -1 en su fila, ya no sirve como
|
|
41
|
+
// básico). En esas filas necesitamos artificial.
|
|
42
|
+
const rows = [];
|
|
43
|
+
for (const c of std.constraints) {
|
|
44
|
+
if (c.operator !== '<=') {
|
|
45
|
+
throw new Error('buildTableau: se esperaban solo ≤ tras standardForm');
|
|
46
|
+
}
|
|
47
|
+
if (c.rhs >= 0) {
|
|
48
|
+
rows.push({ a: c.coefficients.slice(), b: c.rhs, needsArtificial: false });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
rows.push({
|
|
52
|
+
a: c.coefficients.map((v) => -v),
|
|
53
|
+
b: -c.rhs,
|
|
54
|
+
needsArtificial: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const artificialRows = [];
|
|
59
|
+
for (let i = 0; i < m; i++) {
|
|
60
|
+
const row = rows[i];
|
|
61
|
+
if (row && row.needsArtificial)
|
|
62
|
+
artificialRows.push(i);
|
|
63
|
+
}
|
|
64
|
+
const a = artificialRows.length;
|
|
65
|
+
const ncols = n + m + a + 1; // vars + slacks + artificiales + RHS
|
|
66
|
+
const T = [];
|
|
67
|
+
const basis = new Array(m).fill(-1);
|
|
68
|
+
const artificialCols = [];
|
|
69
|
+
// Filas del tableau
|
|
70
|
+
for (let i = 0; i < m; i++) {
|
|
71
|
+
const row = new Array(ncols).fill(0);
|
|
72
|
+
const src = rows[i];
|
|
73
|
+
if (!src)
|
|
74
|
+
throw new Error('buildTableau: fila no inicializada');
|
|
75
|
+
for (let j = 0; j < n; j++) {
|
|
76
|
+
row[j] = src.a[j] ?? 0;
|
|
77
|
+
}
|
|
78
|
+
// Slack en columna n + i. Si la fila se reflejó, el "slack"
|
|
79
|
+
// realmente tiene signo -1 (es un excedente). Para mantener
|
|
80
|
+
// base inicial limpia, usamos artificial.
|
|
81
|
+
row[n + i] = src.needsArtificial ? -1 : 1;
|
|
82
|
+
row[ncols - 1] = src.b;
|
|
83
|
+
T.push(row);
|
|
84
|
+
if (!src.needsArtificial) {
|
|
85
|
+
basis[i] = n + i; // slack como básico inicial
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Columnas artificiales
|
|
89
|
+
let artIdx = 0;
|
|
90
|
+
for (const i of artificialRows) {
|
|
91
|
+
const col = n + m + artIdx;
|
|
92
|
+
const rowI = T[i];
|
|
93
|
+
if (!rowI)
|
|
94
|
+
throw new Error('buildTableau: fila artificial inexistente');
|
|
95
|
+
rowI[col] = 1;
|
|
96
|
+
basis[i] = col;
|
|
97
|
+
artificialCols.push(col);
|
|
98
|
+
artIdx++;
|
|
99
|
+
}
|
|
100
|
+
// Fila objetivo (placeholder; phase1/phase2 la sobrescriben).
|
|
101
|
+
T.push(new Array(ncols).fill(0));
|
|
102
|
+
return { T, basis, ncols, m, n, artificialCols };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Pivot reducido sobre fila r, columna c. La columna c se vuelve
|
|
106
|
+
* columna unidad con 1 en la fila r y 0 en las demás (incluida la
|
|
107
|
+
* fila objetivo, que es la última).
|
|
108
|
+
*/
|
|
109
|
+
function pivot(T, r, c, eps) {
|
|
110
|
+
const rowR = T[r];
|
|
111
|
+
if (!rowR)
|
|
112
|
+
throw new Error('pivot: fila inexistente');
|
|
113
|
+
const piv = rowR[c];
|
|
114
|
+
if (piv === undefined || Math.abs(piv) < eps) {
|
|
115
|
+
throw new Error('pivot: elemento pivote degenerado');
|
|
116
|
+
}
|
|
117
|
+
const ncols = rowR.length;
|
|
118
|
+
// Normalizar fila pivote
|
|
119
|
+
for (let j = 0; j < ncols; j++) {
|
|
120
|
+
rowR[j] = (rowR[j] ?? 0) / piv;
|
|
121
|
+
}
|
|
122
|
+
// Eliminar columna c en las demás filas
|
|
123
|
+
for (let i = 0; i < T.length; i++) {
|
|
124
|
+
if (i === r)
|
|
125
|
+
continue;
|
|
126
|
+
const rowI = T[i];
|
|
127
|
+
if (!rowI)
|
|
128
|
+
continue;
|
|
129
|
+
const factor = rowI[c] ?? 0;
|
|
130
|
+
if (Math.abs(factor) < eps)
|
|
131
|
+
continue;
|
|
132
|
+
for (let j = 0; j < ncols; j++) {
|
|
133
|
+
rowI[j] = (rowI[j] ?? 0) - factor * (rowR[j] ?? 0);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Selecciona la columna entrante con Bland's rule: el menor índice
|
|
139
|
+
* j tal que el costo reducido z_j - c_j sea estrictamente negativo
|
|
140
|
+
* (es decir, c_j - z_j > 0 en formulación de maximización; aquí
|
|
141
|
+
* almacenamos en la última fila el "reduced cost" con signo tal
|
|
142
|
+
* que <0 significa "entra"). Devuelve -1 si todos son ≥ -eps
|
|
143
|
+
* (óptimo alcanzado).
|
|
144
|
+
*/
|
|
145
|
+
function selectEnteringBland(state, eps) {
|
|
146
|
+
const T = state.T;
|
|
147
|
+
const objRow = T[state.m];
|
|
148
|
+
if (!objRow)
|
|
149
|
+
return -1;
|
|
150
|
+
const limit = state.ncols - 1; // excluye RHS
|
|
151
|
+
for (let j = 0; j < limit; j++) {
|
|
152
|
+
if ((objRow[j] ?? 0) < -eps)
|
|
153
|
+
return j;
|
|
154
|
+
}
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Selecciona la fila saliente por la regla del cociente mínimo.
|
|
159
|
+
* Devuelve -1 si la columna no tiene ningún coeficiente positivo
|
|
160
|
+
* (problema unbounded).
|
|
161
|
+
*/
|
|
162
|
+
function selectLeaving(state, col, eps) {
|
|
163
|
+
const T = state.T;
|
|
164
|
+
let bestRow = -1;
|
|
165
|
+
let bestRatio = Infinity;
|
|
166
|
+
for (let i = 0; i < state.m; i++) {
|
|
167
|
+
const row = T[i];
|
|
168
|
+
if (!row)
|
|
169
|
+
continue;
|
|
170
|
+
const aij = row[col] ?? 0;
|
|
171
|
+
if (aij > eps) {
|
|
172
|
+
const ratio = (row[state.ncols - 1] ?? 0) / aij;
|
|
173
|
+
if (ratio < bestRatio - eps) {
|
|
174
|
+
bestRatio = ratio;
|
|
175
|
+
bestRow = i;
|
|
176
|
+
}
|
|
177
|
+
else if (Math.abs(ratio - bestRatio) <= eps && bestRow !== -1) {
|
|
178
|
+
// Bland's tie-break: menor índice de variable básica saliente.
|
|
179
|
+
const curBasic = state.basis[bestRow] ?? Number.POSITIVE_INFINITY;
|
|
180
|
+
const newBasic = state.basis[i] ?? Number.POSITIVE_INFINITY;
|
|
181
|
+
if (newBasic < curBasic)
|
|
182
|
+
bestRow = i;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return bestRow;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Ejecuta iteraciones simplex sobre el tableau hasta que no haya
|
|
190
|
+
* columna entrante (óptimo) o se exceda el límite. Retorna:
|
|
191
|
+
* - 'optimal' si terminó normal,
|
|
192
|
+
* - 'unbounded' si una columna sin razón positiva fue elegida,
|
|
193
|
+
* - 'iteration_limit' si excedió maxIter.
|
|
194
|
+
*/
|
|
195
|
+
function runSimplex(state, maxIter, eps) {
|
|
196
|
+
let iterations = 0;
|
|
197
|
+
while (iterations < maxIter) {
|
|
198
|
+
const col = selectEnteringBland(state, eps);
|
|
199
|
+
if (col === -1)
|
|
200
|
+
return { status: 'optimal', iterations };
|
|
201
|
+
const row = selectLeaving(state, col, eps);
|
|
202
|
+
if (row === -1)
|
|
203
|
+
return { status: 'unbounded', iterations };
|
|
204
|
+
pivot(state.T, row, col, eps);
|
|
205
|
+
state.basis[row] = col;
|
|
206
|
+
iterations++;
|
|
207
|
+
}
|
|
208
|
+
return { status: 'iteration_limit', iterations };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Construye la fila objetivo de Fase I: minimizar la suma de las
|
|
212
|
+
* artificiales (equivalente a maximizar -Σ a_i). En tableau de
|
|
213
|
+
* maximización, costo reducido z_j - c_j para artificiales debe
|
|
214
|
+
* ser 0 inicialmente; aplicamos eliminación gaussiana para que la
|
|
215
|
+
* fila objetivo refleje correctamente la BFS inicial.
|
|
216
|
+
*/
|
|
217
|
+
function setupPhase1Objective(state, eps) {
|
|
218
|
+
const objRow = state.T[state.m];
|
|
219
|
+
if (!objRow)
|
|
220
|
+
throw new Error('phase1: fila objetivo inexistente');
|
|
221
|
+
for (let j = 0; j < state.ncols; j++)
|
|
222
|
+
objRow[j] = 0;
|
|
223
|
+
// Minimizar Σ a_i ≡ maximizar -Σ a_i. En forma "reduced cost <0
|
|
224
|
+
// entra" para maximización, ponemos +1 en columnas artificiales
|
|
225
|
+
// (queremos que entren si reducen ese coste). Tras restar las
|
|
226
|
+
// filas básicas correspondientes, la fila quedará en forma
|
|
227
|
+
// canónica respecto de la base.
|
|
228
|
+
for (const col of state.artificialCols) {
|
|
229
|
+
objRow[col] = 1;
|
|
230
|
+
}
|
|
231
|
+
// Convertir a forma canónica: para cada artificial básica en la
|
|
232
|
+
// fila i, restamos la fila i de la objetivo (eliminando el 1).
|
|
233
|
+
for (let i = 0; i < state.m; i++) {
|
|
234
|
+
const basicCol = state.basis[i] ?? -1;
|
|
235
|
+
if (state.artificialCols.includes(basicCol)) {
|
|
236
|
+
const rowI = state.T[i];
|
|
237
|
+
if (!rowI)
|
|
238
|
+
continue;
|
|
239
|
+
for (let j = 0; j < state.ncols; j++) {
|
|
240
|
+
objRow[j] = (objRow[j] ?? 0) - (rowI[j] ?? 0);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
void eps;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Construye la fila objetivo de Fase II a partir de la BFS de
|
|
248
|
+
* Fase I. Maximiza c·x, donde x son las variables originales
|
|
249
|
+
* (columnas 0..n-1). Pone las artificiales con coste prohibitivo
|
|
250
|
+
* (lo cual es innecesario si Fase I las dejó en 0; las anulamos).
|
|
251
|
+
*/
|
|
252
|
+
function setupPhase2Objective(state, c, eps) {
|
|
253
|
+
const objRow = state.T[state.m];
|
|
254
|
+
if (!objRow)
|
|
255
|
+
throw new Error('phase2: fila objetivo inexistente');
|
|
256
|
+
for (let j = 0; j < state.ncols; j++)
|
|
257
|
+
objRow[j] = 0;
|
|
258
|
+
// En convención "reduced cost <0 entra" para maximización,
|
|
259
|
+
// la fila objetivo inicial es -c en las columnas de variables
|
|
260
|
+
// originales (y 0 en slacks/artificiales).
|
|
261
|
+
for (let j = 0; j < c.length; j++) {
|
|
262
|
+
objRow[j] = -(c[j] ?? 0);
|
|
263
|
+
}
|
|
264
|
+
// Las artificiales deben evitarse: les ponemos cost reducido
|
|
265
|
+
// positivo grande. Ya están en base con valor 0 (asumido); si
|
|
266
|
+
// por degeneración no lo están, los pivots de Fase II no las
|
|
267
|
+
// elegirán porque su columna no aporta valor real.
|
|
268
|
+
for (const col of state.artificialCols) {
|
|
269
|
+
objRow[col] = 1e9;
|
|
270
|
+
}
|
|
271
|
+
// Convertir a forma canónica respecto de la base actual.
|
|
272
|
+
for (let i = 0; i < state.m; i++) {
|
|
273
|
+
const basicCol = state.basis[i] ?? -1;
|
|
274
|
+
const coeff = objRow[basicCol] ?? 0;
|
|
275
|
+
if (Math.abs(coeff) > eps) {
|
|
276
|
+
const rowI = state.T[i];
|
|
277
|
+
if (!rowI)
|
|
278
|
+
continue;
|
|
279
|
+
for (let j = 0; j < state.ncols; j++) {
|
|
280
|
+
objRow[j] = (objRow[j] ?? 0) - coeff * (rowI[j] ?? 0);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Extrae la solución x ∈ ℝⁿ desde el tableau, leyendo cada
|
|
287
|
+
* variable básica de las filas. Las no básicas valen 0.
|
|
288
|
+
*/
|
|
289
|
+
function extractSolution(state) {
|
|
290
|
+
const x = new Array(state.n).fill(0);
|
|
291
|
+
for (let i = 0; i < state.m; i++) {
|
|
292
|
+
const col = state.basis[i] ?? -1;
|
|
293
|
+
if (col >= 0 && col < state.n) {
|
|
294
|
+
const row = state.T[i];
|
|
295
|
+
if (row)
|
|
296
|
+
x[col] = row[state.ncols - 1] ?? 0;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return x;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Solver LP principal. Acepta el problema en cualquier forma
|
|
303
|
+
* (min/max, ≤/≥/=, con o sin cotas), lo lleva a standardForm y
|
|
304
|
+
* ejecuta simplex de dos fases.
|
|
305
|
+
*/
|
|
306
|
+
function solveLP(problem, opts = {}) {
|
|
307
|
+
const eps = opts.eps ?? DEFAULT_EPS;
|
|
308
|
+
const maxIter = opts.maxIterations ?? DEFAULT_MAX_ITER;
|
|
309
|
+
const n = problem.objective.coefficients.length;
|
|
310
|
+
// Validaciones rápidas
|
|
311
|
+
for (const c of problem.constraints) {
|
|
312
|
+
if (c.coefficients.length !== n) {
|
|
313
|
+
throw new Error(`solveLP: constraint con ${String(c.coefficients.length)} coefs, esperado ${String(n)}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const wasMinimize = problem.objective.kind === 'minimize';
|
|
317
|
+
const std = (0, standard_form_1.standardForm)(problem);
|
|
318
|
+
// standardForm devuelve objective.kind = 'maximize' siempre; los
|
|
319
|
+
// coeficientes ya están negados si era minimización. Guardamos
|
|
320
|
+
// wasMinimize para negar el resultado al reportar.
|
|
321
|
+
const state = buildTableau(std, eps);
|
|
322
|
+
let totalIterations = 0;
|
|
323
|
+
// Fase I si hay artificiales
|
|
324
|
+
if (state.artificialCols.length > 0) {
|
|
325
|
+
setupPhase1Objective(state, eps);
|
|
326
|
+
const ph1 = runSimplex(state, maxIter, eps);
|
|
327
|
+
totalIterations += ph1.iterations;
|
|
328
|
+
if (ph1.status === 'iteration_limit') {
|
|
329
|
+
return {
|
|
330
|
+
status: 'iteration_limit',
|
|
331
|
+
variables: extractSolution(state),
|
|
332
|
+
objectiveValue: NaN,
|
|
333
|
+
iterations: totalIterations,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
// El valor óptimo de Fase I es -RHS de la fila objetivo (negado
|
|
337
|
+
// por nuestra convención). Si > eps, infactible.
|
|
338
|
+
const objRow = state.T[state.m];
|
|
339
|
+
const phase1Val = objRow ? -(objRow[state.ncols - 1] ?? 0) : 0;
|
|
340
|
+
if (phase1Val > 1e-6) {
|
|
341
|
+
return {
|
|
342
|
+
status: 'infeasible',
|
|
343
|
+
variables: new Array(n).fill(0),
|
|
344
|
+
objectiveValue: NaN,
|
|
345
|
+
iterations: totalIterations,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
// Si alguna artificial sigue en base con valor 0, intentamos
|
|
349
|
+
// pivotearla fuera (no es estrictamente necesario para nuestros
|
|
350
|
+
// tests pero da estabilidad). Si no se puede (fila degenerada),
|
|
351
|
+
// continuamos: Fase II la mantendrá con cost prohibitivo.
|
|
352
|
+
for (let i = 0; i < state.m; i++) {
|
|
353
|
+
const bc = state.basis[i] ?? -1;
|
|
354
|
+
if (!state.artificialCols.includes(bc))
|
|
355
|
+
continue;
|
|
356
|
+
// buscar columna no artificial con coef ≠ 0
|
|
357
|
+
const row = state.T[i];
|
|
358
|
+
if (!row)
|
|
359
|
+
continue;
|
|
360
|
+
let swapCol = -1;
|
|
361
|
+
for (let j = 0; j < state.n + state.m; j++) {
|
|
362
|
+
if (state.artificialCols.includes(j))
|
|
363
|
+
continue;
|
|
364
|
+
if (Math.abs(row[j] ?? 0) > eps) {
|
|
365
|
+
swapCol = j;
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (swapCol !== -1) {
|
|
370
|
+
pivot(state.T, i, swapCol, eps);
|
|
371
|
+
state.basis[i] = swapCol;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Fase II
|
|
376
|
+
setupPhase2Objective(state, std.objective.coefficients, eps);
|
|
377
|
+
const ph2 = runSimplex(state, maxIter, eps);
|
|
378
|
+
totalIterations += ph2.iterations;
|
|
379
|
+
const x = extractSolution(state);
|
|
380
|
+
if (ph2.status === 'unbounded') {
|
|
381
|
+
return {
|
|
382
|
+
status: 'unbounded',
|
|
383
|
+
variables: x,
|
|
384
|
+
objectiveValue: wasMinimize ? -Infinity : Infinity,
|
|
385
|
+
iterations: totalIterations,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
if (ph2.status === 'iteration_limit') {
|
|
389
|
+
return {
|
|
390
|
+
status: 'iteration_limit',
|
|
391
|
+
variables: x,
|
|
392
|
+
objectiveValue: NaN,
|
|
393
|
+
iterations: totalIterations,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
// Valor objetivo respecto del problema original (no el standardForm)
|
|
397
|
+
let value = 0;
|
|
398
|
+
for (let j = 0; j < n; j++) {
|
|
399
|
+
value += (problem.objective.coefficients[j] ?? 0) * (x[j] ?? 0);
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
status: 'optimal',
|
|
403
|
+
variables: x,
|
|
404
|
+
objectiveValue: value,
|
|
405
|
+
iterations: totalIterations,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=simplex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplex.js","sourceRoot":"","sources":["../../src/optimization/simplex.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,4CAA4C;AAC5C,+DAA+D;AAC/D,oEAAoE;AACpE,gEAAgE;AAChE,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,sBAAsB;AACtB,EAAE;AACF,+DAA+D;AAC/D,wCAAwC;AACxC,8DAA8D;AAC9D,kEAAkE;AAClE,kEAAkE;AAClE,oEAAoE;AACpE,2BAA2B;AAC3B,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,kEAAkE;AAClE,8CAA8C;AAC9C,EAAE;AACF,qEAAqE;AACrE,6DAA6D;AAC7D,oEAAoE;AACpE,8CAA8C;AAC9C,+DAA+D;;AAiS/D,0BA4GC;AA3YD,mDAA+C;AAG/C,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAiB9B,SAAS,YAAY,CAAC,GAAc,EAAE,IAAY;IAChD,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC;IAE5C,8DAA8D;IAC9D,+DAA+D;IAC/D,iEAAiE;IACjE,iDAAiD;IACjD,MAAM,IAAI,GAA2D,EAAE,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC;gBACR,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;gBACT,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe;YAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAqC;IAClE,MAAM,CAAC,GAAe,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,4DAA4D;QAC5D,4DAA4D;QAC5D,0CAA0C;QAC1C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;QAChD,CAAC;IACH,CAAC;IACD,wBAAwB;IACxB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACf,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,8DAA8D;IAC9D,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAS,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,SAAS,KAAK,CAAC,CAAa,EAAE,CAAS,EAAE,CAAS,EAAE,GAAW;IAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,yBAAyB;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;IACjC,CAAC;IACD,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG;YAAE,SAAS;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,KAAmB,EAAE,GAAW;IAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAmB,EAAE,GAAW,EAAE,GAAW;IAClE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YAChD,IAAI,KAAK,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;gBAC5B,SAAS,GAAG,KAAK,CAAC;gBAClB,OAAO,GAAG,CAAC,CAAC;YACd,CAAC;iBAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBAChE,+DAA+D;gBAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC;gBAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC;gBAC5D,IAAI,QAAQ,GAAG,QAAQ;oBAAE,OAAO,GAAG,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,KAAmB,EACnB,OAAe,EACf,GAAW;IAEX,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAC3D,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACvB,UAAU,EAAE,CAAC;IACf,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,KAAmB,EAAE,GAAW;IAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,gEAAgE;IAChE,gEAAgE;IAChE,8DAA8D;IAC9D,2DAA2D;IAC3D,gCAAgC;IAChC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,gEAAgE;IAChE,+DAA+D;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,GAAG,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,KAAmB,EAAE,CAAW,EAAE,GAAW;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,2DAA2D;IAC3D,8DAA8D;IAC9D,2CAA2C;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,6DAA6D;IAC7D,8DAA8D;IAC9D,6DAA6D;IAC7D,mDAAmD;IACnD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,yDAAyD;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAmB;IAC1C,MAAM,CAAC,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG;gBAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,OAAkB,EAAE,OAAkB,EAAE;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,gBAAgB,CAAC;IACvD,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC;IAEhD,uBAAuB;IACvB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,oBAAoB,MAAM,CAAC,CAAC,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAA,4BAAY,EAAC,OAAO,CAAC,CAAC;IAClC,iEAAiE;IACjE,+DAA+D;IAC/D,mDAAmD;IAEnD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,6BAA6B;IAC7B,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5C,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,GAAG,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,iBAAiB;gBACzB,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC;gBACjC,cAAc,EAAE,GAAG;gBACnB,UAAU,EAAE,eAAe;aAC5B,CAAC;QACJ,CAAC;QACD,gEAAgE;QAChE,iDAAiD;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO;gBACL,MAAM,EAAE,YAAY;gBACpB,SAAS,EAAE,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvC,cAAc,EAAE,GAAG;gBACnB,UAAU,EAAE,eAAe;aAC5B,CAAC;QACJ,CAAC;QACD,6DAA6D;QAC7D,gEAAgE;QAChE,gEAAgE;QAChE,0DAA0D;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,SAAS;YACjD,4CAA4C;YAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;oBAChC,OAAO,GAAG,CAAC,CAAC;oBACZ,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;gBAChC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;IACV,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5C,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC;IAClC,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAClD,UAAU,EAAE,eAAe;SAC5B,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,CAAC;YACZ,cAAc,EAAE,GAAG;YACnB,UAAU,EAAE,eAAe;SAC5B,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,eAAe;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LPProblem } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Convierte un LPProblem arbitrario a forma estándar:
|
|
4
|
+
* maximizar c·x sujeto a Ax ≤ b con x ≥ 0 (sin cotas explícitas).
|
|
5
|
+
* Preserva el sentido original mediante `objective.kind`:
|
|
6
|
+
* si el original era 'minimize', el resultado lo refleja con
|
|
7
|
+
* coeficientes negados (el caller debe negar el valor objetivo
|
|
8
|
+
* al interpretarlo).
|
|
9
|
+
*/
|
|
10
|
+
export declare function standardForm(lp: LPProblem): LPProblem;
|
|
11
|
+
//# sourceMappingURL=standard-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-form.d.ts","sourceRoot":"","sources":["../../src/optimization/standard-form.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAiFrD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Conversión a forma estándar para simplex.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// El simplex de dos fases que implementamos opera sobre forma
|
|
6
|
+
// estándar de maximización con restricciones ≤ y variables ≥ 0
|
|
7
|
+
// (más slacks que se añaden internamente en el tableau).
|
|
8
|
+
//
|
|
9
|
+
// Reglas de conversión:
|
|
10
|
+
// - 'minimize c·x' → 'maximize (-c)·x', se invierte el valor al
|
|
11
|
+
// final.
|
|
12
|
+
// - Restricción 'a·x ≥ b' → '(-a)·x ≤ -b'.
|
|
13
|
+
// - Restricción 'a·x = b' se expande a dos restricciones (≤ b y
|
|
14
|
+
// ≥ b convertida a ≤ -b). La igualdad podría implementarse con
|
|
15
|
+
// una sola variable artificial en Fase I, pero la duplicación
|
|
16
|
+
// es estable y suficiente para nuestros tamaños de problema.
|
|
17
|
+
// - Cotas inferiores l ≠ 0 se trasladan: x = x' + l, con x' ≥ 0.
|
|
18
|
+
// - Cotas superiores u se vuelven restricciones ≤ u (sobre la
|
|
19
|
+
// variable trasladada).
|
|
20
|
+
//
|
|
21
|
+
// Esta función devuelve un LPProblem equivalente con SOLO ≤ y
|
|
22
|
+
// objetivo de maximización, sin cotas (todas pasadas a constraints).
|
|
23
|
+
// ============================================================
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.standardForm = standardForm;
|
|
26
|
+
/**
|
|
27
|
+
* Convierte un LPProblem arbitrario a forma estándar:
|
|
28
|
+
* maximizar c·x sujeto a Ax ≤ b con x ≥ 0 (sin cotas explícitas).
|
|
29
|
+
* Preserva el sentido original mediante `objective.kind`:
|
|
30
|
+
* si el original era 'minimize', el resultado lo refleja con
|
|
31
|
+
* coeficientes negados (el caller debe negar el valor objetivo
|
|
32
|
+
* al interpretarlo).
|
|
33
|
+
*/
|
|
34
|
+
function standardForm(lp) {
|
|
35
|
+
const n = lp.objective.coefficients.length;
|
|
36
|
+
// Trasladamos cotas inferiores l_i (default 0) sumando l_i a la
|
|
37
|
+
// variable. Esto produce un offset constante en el objetivo y en
|
|
38
|
+
// los RHS de las restricciones que el caller necesita reaplicar
|
|
39
|
+
// al recuperar la solución. Para mantener el API simple, esta
|
|
40
|
+
// función NO traslada cotas: el solver maneja cotas inferiores
|
|
41
|
+
// ≠ 0 reescribiendo internamente. Solo expandimos = y ≥ → ≤.
|
|
42
|
+
const newCoeffs = lp.objective.kind === 'minimize'
|
|
43
|
+
? lp.objective.coefficients.map((c) => -c)
|
|
44
|
+
: lp.objective.coefficients.slice();
|
|
45
|
+
const newConstraints = [];
|
|
46
|
+
for (const c of lp.constraints) {
|
|
47
|
+
if (c.coefficients.length !== n) {
|
|
48
|
+
throw new Error(`standardForm: constraint con ${String(c.coefficients.length)} coeficientes, esperado ${String(n)}`);
|
|
49
|
+
}
|
|
50
|
+
if (c.operator === '<=') {
|
|
51
|
+
newConstraints.push({
|
|
52
|
+
coefficients: c.coefficients.slice(),
|
|
53
|
+
operator: '<=',
|
|
54
|
+
rhs: c.rhs,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else if (c.operator === '>=') {
|
|
58
|
+
newConstraints.push({
|
|
59
|
+
coefficients: c.coefficients.map((v) => -v),
|
|
60
|
+
operator: '<=',
|
|
61
|
+
rhs: -c.rhs,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// '=' → ≤ y ≥ (este último convertido a ≤)
|
|
66
|
+
newConstraints.push({
|
|
67
|
+
coefficients: c.coefficients.slice(),
|
|
68
|
+
operator: '<=',
|
|
69
|
+
rhs: c.rhs,
|
|
70
|
+
});
|
|
71
|
+
newConstraints.push({
|
|
72
|
+
coefficients: c.coefficients.map((v) => -v),
|
|
73
|
+
operator: '<=',
|
|
74
|
+
rhs: -c.rhs,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Añadimos las cotas superiores como restricciones ≤ u.
|
|
79
|
+
if (lp.variableBounds) {
|
|
80
|
+
for (let i = 0; i < lp.variableBounds.length; i++) {
|
|
81
|
+
const b = lp.variableBounds[i];
|
|
82
|
+
if (!b)
|
|
83
|
+
continue;
|
|
84
|
+
if (b.upper !== undefined && Number.isFinite(b.upper)) {
|
|
85
|
+
const row = new Array(n).fill(0);
|
|
86
|
+
row[i] = 1;
|
|
87
|
+
newConstraints.push({ coefficients: row, operator: '<=', rhs: b.upper });
|
|
88
|
+
}
|
|
89
|
+
// Cota inferior negativa o positiva ≠ 0: a este nivel del API,
|
|
90
|
+
// el solver lo maneja como restricción adicional x_i ≥ l_i
|
|
91
|
+
// (que se convierte a -x_i ≤ -l_i). Si l_i < 0 además
|
|
92
|
+
// dividimos la variable en x⁺ - x⁻ (no implementado aquí,
|
|
93
|
+
// el solver lo asume no-negativo por defecto; el lower 0
|
|
94
|
+
// implícito ya está cubierto por la no-negatividad).
|
|
95
|
+
if (b.lower !== undefined && b.lower > 0) {
|
|
96
|
+
const row = new Array(n).fill(0);
|
|
97
|
+
row[i] = -1;
|
|
98
|
+
newConstraints.push({ coefficients: row, operator: '<=', rhs: -b.lower });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
objective: {
|
|
104
|
+
kind: 'maximize',
|
|
105
|
+
coefficients: newCoeffs,
|
|
106
|
+
},
|
|
107
|
+
constraints: newConstraints,
|
|
108
|
+
variableNames: lp.variableNames ? lp.variableNames.slice() : undefined,
|
|
109
|
+
// Cotas ya absorbidas en restricciones.
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=standard-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-form.js","sourceRoot":"","sources":["../../src/optimization/standard-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type ObjectiveKind = 'minimize' | 'maximize';
|
|
2
|
+
export type ConstraintOperator = '<=' | '>=' | '=';
|
|
3
|
+
export interface LPConstraint {
|
|
4
|
+
coefficients: number[];
|
|
5
|
+
operator: ConstraintOperator;
|
|
6
|
+
rhs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LPProblem {
|
|
9
|
+
objective: {
|
|
10
|
+
kind: ObjectiveKind;
|
|
11
|
+
coefficients: number[];
|
|
12
|
+
};
|
|
13
|
+
constraints: LPConstraint[];
|
|
14
|
+
variableBounds?: Array<{
|
|
15
|
+
lower?: number;
|
|
16
|
+
upper?: number;
|
|
17
|
+
}>;
|
|
18
|
+
variableNames?: string[];
|
|
19
|
+
}
|
|
20
|
+
export type LPStatus = 'optimal' | 'unbounded' | 'infeasible' | 'iteration_limit';
|
|
21
|
+
export interface LPSolution {
|
|
22
|
+
status: LPStatus;
|
|
23
|
+
variables: number[];
|
|
24
|
+
objectiveValue: number;
|
|
25
|
+
iterations: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ILPProblem extends LPProblem {
|
|
28
|
+
integerVars: number[];
|
|
29
|
+
binaryVars?: number[];
|
|
30
|
+
}
|
|
31
|
+
export interface ILPSolution extends LPSolution {
|
|
32
|
+
nodesExplored: number;
|
|
33
|
+
gap?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface LPOptions {
|
|
36
|
+
maxIterations?: number;
|
|
37
|
+
eps?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ILPOptions {
|
|
40
|
+
maxNodes?: number;
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
lpOptions?: LPOptions;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/optimization/types.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE;QACT,IAAI,EAAE,aAAa,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IACF,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAElF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Linear / Integer Programming — tipos de borde.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Un LPProblem describe el problema en forma "natural": objetivo
|
|
6
|
+
// (minimizar o maximizar) + lista de restricciones lineales con
|
|
7
|
+
// operador ≤, ≥ o = y RHS escalar. Las cotas por variable son
|
|
8
|
+
// opcionales (default: x ≥ 0, sin cota superior).
|
|
9
|
+
//
|
|
10
|
+
// Las soluciones reportan estado simbólico ('optimal' | 'unbounded'
|
|
11
|
+
// | 'infeasible' | 'iteration_limit') más el vector de variables en
|
|
12
|
+
// el orden original del problema y el valor objetivo evaluado.
|
|
13
|
+
// ============================================================
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/optimization/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,iDAAiD;AACjD,+DAA+D;AAC/D,iEAAiE;AACjE,gEAAgE;AAChE,8DAA8D;AAC9D,kDAAkD;AAClD,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,+DAA+D;AAC/D,+DAA+D"}
|