@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.
Files changed (286) hide show
  1. package/README.md +78 -37
  2. package/dist/bdd/index.d.ts +4 -0
  3. package/dist/bdd/index.d.ts.map +1 -0
  4. package/dist/bdd/index.js +29 -0
  5. package/dist/bdd/index.js.map +1 -0
  6. package/dist/bdd/manager.d.ts +122 -0
  7. package/dist/bdd/manager.d.ts.map +1 -0
  8. package/dist/bdd/manager.js +524 -0
  9. package/dist/bdd/manager.js.map +1 -0
  10. package/dist/bdd/types.d.ts +20 -0
  11. package/dist/bdd/types.d.ts.map +1 -0
  12. package/dist/bdd/types.js +28 -0
  13. package/dist/bdd/types.js.map +1 -0
  14. package/dist/game-theory/common-games.d.ts +50 -0
  15. package/dist/game-theory/common-games.d.ts.map +1 -0
  16. package/dist/game-theory/common-games.js +112 -0
  17. package/dist/game-theory/common-games.js.map +1 -0
  18. package/dist/game-theory/dominance.d.ts +26 -0
  19. package/dist/game-theory/dominance.d.ts.map +1 -0
  20. package/dist/game-theory/dominance.js +203 -0
  21. package/dist/game-theory/dominance.js.map +1 -0
  22. package/dist/game-theory/index.d.ts +8 -0
  23. package/dist/game-theory/index.d.ts.map +1 -0
  24. package/dist/game-theory/index.js +47 -0
  25. package/dist/game-theory/index.js.map +1 -0
  26. package/dist/game-theory/lemke-howson.d.ts +3 -0
  27. package/dist/game-theory/lemke-howson.d.ts.map +1 -0
  28. package/dist/game-theory/lemke-howson.js +269 -0
  29. package/dist/game-theory/lemke-howson.js.map +1 -0
  30. package/dist/game-theory/linalg.d.ts +7 -0
  31. package/dist/game-theory/linalg.d.ts.map +1 -0
  32. package/dist/game-theory/linalg.js +69 -0
  33. package/dist/game-theory/linalg.js.map +1 -0
  34. package/dist/game-theory/pure-nash.d.ts +3 -0
  35. package/dist/game-theory/pure-nash.d.ts.map +1 -0
  36. package/dist/game-theory/pure-nash.js +86 -0
  37. package/dist/game-theory/pure-nash.js.map +1 -0
  38. package/dist/game-theory/support-enumeration.d.ts +3 -0
  39. package/dist/game-theory/support-enumeration.d.ts.map +1 -0
  40. package/dist/game-theory/support-enumeration.js +214 -0
  41. package/dist/game-theory/support-enumeration.js.map +1 -0
  42. package/dist/game-theory/types.d.ts +57 -0
  43. package/dist/game-theory/types.d.ts.map +1 -0
  44. package/dist/game-theory/types.js +191 -0
  45. package/dist/game-theory/types.js.map +1 -0
  46. package/dist/index.d.ts +19 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +75 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/information-theory/index.d.ts +29 -0
  51. package/dist/information-theory/index.d.ts.map +1 -0
  52. package/dist/information-theory/index.js +323 -0
  53. package/dist/information-theory/index.js.map +1 -0
  54. package/dist/namespaces/logic.d.ts +42 -0
  55. package/dist/namespaces/logic.d.ts.map +1 -0
  56. package/dist/namespaces/logic.js +112 -0
  57. package/dist/namespaces/logic.js.map +1 -0
  58. package/dist/namespaces/proof-systems.d.ts +18 -0
  59. package/dist/namespaces/proof-systems.d.ts.map +1 -0
  60. package/dist/namespaces/proof-systems.js +59 -0
  61. package/dist/namespaces/proof-systems.js.map +1 -0
  62. package/dist/namespaces/reasoning.d.ts +26 -0
  63. package/dist/namespaces/reasoning.d.ts.map +1 -0
  64. package/dist/namespaces/reasoning.js +72 -0
  65. package/dist/namespaces/reasoning.js.map +1 -0
  66. package/dist/namespaces/semantics.d.ts +21 -0
  67. package/dist/namespaces/semantics.d.ts.map +1 -0
  68. package/dist/namespaces/semantics.js +64 -0
  69. package/dist/namespaces/semantics.js.map +1 -0
  70. package/dist/namespaces/solvers.d.ts +22 -0
  71. package/dist/namespaces/solvers.d.ts.map +1 -0
  72. package/dist/namespaces/solvers.js +66 -0
  73. package/dist/namespaces/solvers.js.map +1 -0
  74. package/dist/namespaces/type-theory.d.ts +22 -0
  75. package/dist/namespaces/type-theory.d.ts.map +1 -0
  76. package/dist/namespaces/type-theory.js +65 -0
  77. package/dist/namespaces/type-theory.js.map +1 -0
  78. package/dist/optimization/branch-and-bound.d.ts +11 -0
  79. package/dist/optimization/branch-and-bound.d.ts.map +1 -0
  80. package/dist/optimization/branch-and-bound.js +311 -0
  81. package/dist/optimization/branch-and-bound.js.map +1 -0
  82. package/dist/optimization/index.d.ts +5 -0
  83. package/dist/optimization/index.d.ts.map +1 -0
  84. package/dist/optimization/index.js +20 -0
  85. package/dist/optimization/index.js.map +1 -0
  86. package/dist/optimization/simplex.d.ts +8 -0
  87. package/dist/optimization/simplex.d.ts.map +1 -0
  88. package/dist/optimization/simplex.js +408 -0
  89. package/dist/optimization/simplex.js.map +1 -0
  90. package/dist/optimization/standard-form.d.ts +11 -0
  91. package/dist/optimization/standard-form.d.ts.map +1 -0
  92. package/dist/optimization/standard-form.js +112 -0
  93. package/dist/optimization/standard-form.js.map +1 -0
  94. package/dist/optimization/types.d.ts +44 -0
  95. package/dist/optimization/types.d.ts.map +1 -0
  96. package/dist/optimization/types.js +15 -0
  97. package/dist/optimization/types.js.map +1 -0
  98. package/dist/profiles/hol/connectives.d.ts +46 -0
  99. package/dist/profiles/hol/connectives.d.ts.map +1 -0
  100. package/dist/profiles/hol/connectives.js +104 -0
  101. package/dist/profiles/hol/connectives.js.map +1 -0
  102. package/dist/profiles/hol/index.d.ts +7 -0
  103. package/dist/profiles/hol/index.d.ts.map +1 -0
  104. package/dist/profiles/hol/index.js +77 -0
  105. package/dist/profiles/hol/index.js.map +1 -0
  106. package/dist/profiles/hol/rules.d.ts +31 -0
  107. package/dist/profiles/hol/rules.d.ts.map +1 -0
  108. package/dist/profiles/hol/rules.js +258 -0
  109. package/dist/profiles/hol/rules.js.map +1 -0
  110. package/dist/profiles/hol/term.d.ts +52 -0
  111. package/dist/profiles/hol/term.d.ts.map +1 -0
  112. package/dist/profiles/hol/term.js +345 -0
  113. package/dist/profiles/hol/term.js.map +1 -0
  114. package/dist/profiles/hol/type-system.d.ts +38 -0
  115. package/dist/profiles/hol/type-system.d.ts.map +1 -0
  116. package/dist/profiles/hol/type-system.js +133 -0
  117. package/dist/profiles/hol/type-system.js.map +1 -0
  118. package/dist/profiles/hol/types.d.ts +59 -0
  119. package/dist/profiles/hol/types.d.ts.map +1 -0
  120. package/dist/profiles/hol/types.js +26 -0
  121. package/dist/profiles/hol/types.js.map +1 -0
  122. package/dist/smt-lib/ast.d.ts +138 -0
  123. package/dist/smt-lib/ast.d.ts.map +1 -0
  124. package/dist/smt-lib/ast.js +73 -0
  125. package/dist/smt-lib/ast.js.map +1 -0
  126. package/dist/smt-lib/emitter.d.ts +12 -0
  127. package/dist/smt-lib/emitter.d.ts.map +1 -0
  128. package/dist/smt-lib/emitter.js +174 -0
  129. package/dist/smt-lib/emitter.js.map +1 -0
  130. package/dist/smt-lib/index.d.ts +6 -0
  131. package/dist/smt-lib/index.d.ts.map +1 -0
  132. package/dist/smt-lib/index.js +31 -0
  133. package/dist/smt-lib/index.js.map +1 -0
  134. package/dist/smt-lib/parser.d.ts +13 -0
  135. package/dist/smt-lib/parser.d.ts.map +1 -0
  136. package/dist/smt-lib/parser.js +614 -0
  137. package/dist/smt-lib/parser.js.map +1 -0
  138. package/dist/smt-lib/tokenizer.d.ts +16 -0
  139. package/dist/smt-lib/tokenizer.d.ts.map +1 -0
  140. package/dist/smt-lib/tokenizer.js +234 -0
  141. package/dist/smt-lib/tokenizer.js.map +1 -0
  142. package/dist/tests/api/namespaces.test.d.ts +9 -0
  143. package/dist/tests/api/namespaces.test.d.ts.map +1 -0
  144. package/dist/tests/api/namespaces.test.js +218 -0
  145. package/dist/tests/api/namespaces.test.js.map +1 -0
  146. package/dist/tests/bdd/manager.test.d.ts +2 -0
  147. package/dist/tests/bdd/manager.test.d.ts.map +1 -0
  148. package/dist/tests/bdd/manager.test.js +472 -0
  149. package/dist/tests/bdd/manager.test.js.map +1 -0
  150. package/dist/tests/game-theory/game-theory.test.d.ts +2 -0
  151. package/dist/tests/game-theory/game-theory.test.d.ts.map +1 -0
  152. package/dist/tests/game-theory/game-theory.test.js +252 -0
  153. package/dist/tests/game-theory/game-theory.test.js.map +1 -0
  154. package/dist/tests/hol/hol.test.d.ts +2 -0
  155. package/dist/tests/hol/hol.test.d.ts.map +1 -0
  156. package/dist/tests/hol/hol.test.js +340 -0
  157. package/dist/tests/hol/hol.test.js.map +1 -0
  158. package/dist/tests/information-theory/information-theory.test.d.ts +2 -0
  159. package/dist/tests/information-theory/information-theory.test.d.ts.map +1 -0
  160. package/dist/tests/information-theory/information-theory.test.js +291 -0
  161. package/dist/tests/information-theory/information-theory.test.js.map +1 -0
  162. package/dist/tests/optimization/ilp.test.d.ts +2 -0
  163. package/dist/tests/optimization/ilp.test.d.ts.map +1 -0
  164. package/dist/tests/optimization/ilp.test.js +204 -0
  165. package/dist/tests/optimization/ilp.test.js.map +1 -0
  166. package/dist/tests/optimization/lp.test.d.ts +2 -0
  167. package/dist/tests/optimization/lp.test.d.ts.map +1 -0
  168. package/dist/tests/optimization/lp.test.js +224 -0
  169. package/dist/tests/optimization/lp.test.js.map +1 -0
  170. package/dist/tests/properties/agm.property.test.d.ts +2 -0
  171. package/dist/tests/properties/agm.property.test.d.ts.map +1 -0
  172. package/dist/tests/properties/agm.property.test.js +75 -0
  173. package/dist/tests/properties/agm.property.test.js.map +1 -0
  174. package/dist/tests/properties/anti-unification.property.test.d.ts +2 -0
  175. package/dist/tests/properties/anti-unification.property.test.d.ts.map +1 -0
  176. package/dist/tests/properties/anti-unification.property.test.js +43 -0
  177. package/dist/tests/properties/anti-unification.property.test.js.map +1 -0
  178. package/dist/tests/properties/argumentation.property.test.d.ts +2 -0
  179. package/dist/tests/properties/argumentation.property.test.d.ts.map +1 -0
  180. package/dist/tests/properties/argumentation.property.test.js +51 -0
  181. package/dist/tests/properties/argumentation.property.test.js.map +1 -0
  182. package/dist/tests/properties/bayesian.property.test.d.ts +2 -0
  183. package/dist/tests/properties/bayesian.property.test.d.ts.map +1 -0
  184. package/dist/tests/properties/bayesian.property.test.js +32 -0
  185. package/dist/tests/properties/bayesian.property.test.js.map +1 -0
  186. package/dist/tests/properties/bisimulation.property.test.d.ts +2 -0
  187. package/dist/tests/properties/bisimulation.property.test.d.ts.map +1 -0
  188. package/dist/tests/properties/bisimulation.property.test.js +50 -0
  189. package/dist/tests/properties/bisimulation.property.test.js.map +1 -0
  190. package/dist/tests/properties/cdcl.property.test.d.ts +2 -0
  191. package/dist/tests/properties/cdcl.property.test.d.ts.map +1 -0
  192. package/dist/tests/properties/cdcl.property.test.js +70 -0
  193. package/dist/tests/properties/cdcl.property.test.js.map +1 -0
  194. package/dist/tests/properties/coinduction.property.test.d.ts +2 -0
  195. package/dist/tests/properties/coinduction.property.test.d.ts.map +1 -0
  196. package/dist/tests/properties/coinduction.property.test.js +34 -0
  197. package/dist/tests/properties/coinduction.property.test.js.map +1 -0
  198. package/dist/tests/properties/constructive-reals.property.test.d.ts +2 -0
  199. package/dist/tests/properties/constructive-reals.property.test.d.ts.map +1 -0
  200. package/dist/tests/properties/constructive-reals.property.test.js +59 -0
  201. package/dist/tests/properties/constructive-reals.property.test.js.map +1 -0
  202. package/dist/tests/properties/csp.property.test.d.ts +2 -0
  203. package/dist/tests/properties/csp.property.test.d.ts.map +1 -0
  204. package/dist/tests/properties/csp.property.test.js +58 -0
  205. package/dist/tests/properties/csp.property.test.js.map +1 -0
  206. package/dist/tests/properties/generators.d.ts +78 -0
  207. package/dist/tests/properties/generators.d.ts.map +1 -0
  208. package/dist/tests/properties/generators.js +348 -0
  209. package/dist/tests/properties/generators.js.map +1 -0
  210. package/dist/tests/properties/ho-unify.property.test.d.ts +2 -0
  211. package/dist/tests/properties/ho-unify.property.test.d.ts.map +1 -0
  212. package/dist/tests/properties/ho-unify.property.test.js +46 -0
  213. package/dist/tests/properties/ho-unify.property.test.js.map +1 -0
  214. package/dist/tests/properties/hyperreal.property.test.d.ts +2 -0
  215. package/dist/tests/properties/hyperreal.property.test.d.ts.map +1 -0
  216. package/dist/tests/properties/hyperreal.property.test.js +33 -0
  217. package/dist/tests/properties/hyperreal.property.test.js.map +1 -0
  218. package/dist/tests/properties/intuit-nj.property.test.d.ts +2 -0
  219. package/dist/tests/properties/intuit-nj.property.test.d.ts.map +1 -0
  220. package/dist/tests/properties/intuit-nj.property.test.js +57 -0
  221. package/dist/tests/properties/intuit-nj.property.test.js.map +1 -0
  222. package/dist/tests/properties/lambda-calc.property.test.d.ts +2 -0
  223. package/dist/tests/properties/lambda-calc.property.test.d.ts.map +1 -0
  224. package/dist/tests/properties/lambda-calc.property.test.js +35 -0
  225. package/dist/tests/properties/lambda-calc.property.test.js.map +1 -0
  226. package/dist/tests/properties/mln.property.test.d.ts +2 -0
  227. package/dist/tests/properties/mln.property.test.d.ts.map +1 -0
  228. package/dist/tests/properties/mln.property.test.js +41 -0
  229. package/dist/tests/properties/mln.property.test.js.map +1 -0
  230. package/dist/tests/properties/mltt.property.test.d.ts +2 -0
  231. package/dist/tests/properties/mltt.property.test.d.ts.map +1 -0
  232. package/dist/tests/properties/mltt.property.test.js +33 -0
  233. package/dist/tests/properties/mltt.property.test.js.map +1 -0
  234. package/dist/tests/properties/nbe.property.test.d.ts +2 -0
  235. package/dist/tests/properties/nbe.property.test.d.ts.map +1 -0
  236. package/dist/tests/properties/nbe.property.test.js +44 -0
  237. package/dist/tests/properties/nbe.property.test.js.map +1 -0
  238. package/dist/tests/properties/planning.property.test.d.ts +2 -0
  239. package/dist/tests/properties/planning.property.test.d.ts.map +1 -0
  240. package/dist/tests/properties/planning.property.test.js +51 -0
  241. package/dist/tests/properties/planning.property.test.js.map +1 -0
  242. package/dist/tests/properties/profile-bridge.property.test.d.ts +2 -0
  243. package/dist/tests/properties/profile-bridge.property.test.d.ts.map +1 -0
  244. package/dist/tests/properties/profile-bridge.property.test.js +71 -0
  245. package/dist/tests/properties/profile-bridge.property.test.js.map +1 -0
  246. package/dist/tests/properties/refinement-types.property.test.d.ts +2 -0
  247. package/dist/tests/properties/refinement-types.property.test.d.ts.map +1 -0
  248. package/dist/tests/properties/refinement-types.property.test.js +37 -0
  249. package/dist/tests/properties/refinement-types.property.test.js.map +1 -0
  250. package/dist/tests/properties/sequent-g3.property.test.d.ts +2 -0
  251. package/dist/tests/properties/sequent-g3.property.test.d.ts.map +1 -0
  252. package/dist/tests/properties/sequent-g3.property.test.js +34 -0
  253. package/dist/tests/properties/sequent-g3.property.test.js.map +1 -0
  254. package/dist/tests/properties/symbolic-diff.property.test.d.ts +2 -0
  255. package/dist/tests/properties/symbolic-diff.property.test.d.ts.map +1 -0
  256. package/dist/tests/properties/symbolic-diff.property.test.js +49 -0
  257. package/dist/tests/properties/symbolic-diff.property.test.js.map +1 -0
  258. package/dist/tests/properties/system-f.property.test.d.ts +2 -0
  259. package/dist/tests/properties/system-f.property.test.d.ts.map +1 -0
  260. package/dist/tests/properties/system-f.property.test.js +37 -0
  261. package/dist/tests/properties/system-f.property.test.js.map +1 -0
  262. package/dist/tests/properties/theorem-cache.property.test.d.ts +2 -0
  263. package/dist/tests/properties/theorem-cache.property.test.d.ts.map +1 -0
  264. package/dist/tests/properties/theorem-cache.property.test.js +38 -0
  265. package/dist/tests/properties/theorem-cache.property.test.js.map +1 -0
  266. package/dist/tests/properties/trs.property.test.d.ts +2 -0
  267. package/dist/tests/properties/trs.property.test.d.ts.map +1 -0
  268. package/dist/tests/properties/trs.property.test.js +34 -0
  269. package/dist/tests/properties/trs.property.test.js.map +1 -0
  270. package/dist/tests/properties/unification.property.test.d.ts +2 -0
  271. package/dist/tests/properties/unification.property.test.d.ts.map +1 -0
  272. package/dist/tests/properties/unification.property.test.js +42 -0
  273. package/dist/tests/properties/unification.property.test.js.map +1 -0
  274. package/dist/tests/smt-lib/emitter.test.d.ts +2 -0
  275. package/dist/tests/smt-lib/emitter.test.d.ts.map +1 -0
  276. package/dist/tests/smt-lib/emitter.test.js +155 -0
  277. package/dist/tests/smt-lib/emitter.test.js.map +1 -0
  278. package/dist/tests/smt-lib/parser.test.d.ts +2 -0
  279. package/dist/tests/smt-lib/parser.test.d.ts.map +1 -0
  280. package/dist/tests/smt-lib/parser.test.js +164 -0
  281. package/dist/tests/smt-lib/parser.test.js.map +1 -0
  282. package/dist/tests/smt-lib/tokenizer.test.d.ts +2 -0
  283. package/dist/tests/smt-lib/tokenizer.test.d.ts.map +1 -0
  284. package/dist/tests/smt-lib/tokenizer.test.js +59 -0
  285. package/dist/tests/smt-lib/tokenizer.test.js.map +1 -0
  286. 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":"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"}
@@ -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"}