@ohtaman/washi 0.3.0 → 0.5.0

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 (97) hide show
  1. package/README.ja.md +111 -118
  2. package/README.md +109 -116
  3. package/README.zh-CN.md +112 -119
  4. package/dist/browser/highs-worker.js +21 -3
  5. package/dist/browser/loader-CtaDHef_.js +273 -0
  6. package/dist/browser/solvers/glpk.js +433 -286
  7. package/dist/browser/solvers/glpk.min.js +1 -1
  8. package/dist/browser/solvers/z3.js +1002 -981
  9. package/dist/browser/solvers/z3.min.js +2 -2
  10. package/dist/browser/washi.js +2178 -622
  11. package/dist/browser/washi.min.js +4 -4
  12. package/dist/lib/highs-worker.js +21 -3
  13. package/dist/lib/loader-DmNC_UNk.js +279 -0
  14. package/dist/lib/registry-BEfvpZW3.js +951 -0
  15. package/dist/lib/solvers/glpk.js +201 -90
  16. package/dist/lib/solvers/z3.js +399 -259
  17. package/dist/lib/washi.js +1674 -932
  18. package/dist/types/index.d.ts +4 -4
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/dist/types/modeler/big-m.d.ts +75 -0
  21. package/dist/types/modeler/big-m.d.ts.map +1 -0
  22. package/dist/types/modeler/boolean-expr.d.ts +103 -14
  23. package/dist/types/modeler/boolean-expr.d.ts.map +1 -1
  24. package/dist/types/modeler/constraint.d.ts +36 -9
  25. package/dist/types/modeler/constraint.d.ts.map +1 -1
  26. package/dist/types/modeler/expression.d.ts +117 -27
  27. package/dist/types/modeler/expression.d.ts.map +1 -1
  28. package/dist/types/modeler/index.d.ts +10 -6
  29. package/dist/types/modeler/index.d.ts.map +1 -1
  30. package/dist/types/modeler/lp-writer.d.ts +27 -2
  31. package/dist/types/modeler/lp-writer.d.ts.map +1 -1
  32. package/dist/types/modeler/model.d.ts +491 -140
  33. package/dist/types/modeler/model.d.ts.map +1 -1
  34. package/dist/types/modeler/objective.d.ts +59 -0
  35. package/dist/types/modeler/objective.d.ts.map +1 -0
  36. package/dist/types/modeler/parser.d.ts +39 -14
  37. package/dist/types/modeler/parser.d.ts.map +1 -1
  38. package/dist/types/modeler/quad-expr.d.ts +28 -7
  39. package/dist/types/modeler/quad-expr.d.ts.map +1 -1
  40. package/dist/types/modeler/solution-validator.d.ts +93 -0
  41. package/dist/types/modeler/solution-validator.d.ts.map +1 -0
  42. package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -2
  43. package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -1
  44. package/dist/types/modeler/solvers/highs/loader.d.ts +36 -11
  45. package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -1
  46. package/dist/types/modeler/solvers/highs/solver.d.ts +11 -4
  47. package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -1
  48. package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -1
  49. package/dist/types/modeler/solvers/mock.d.ts +14 -5
  50. package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
  51. package/dist/types/modeler/solvers/types.d.ts +71 -11
  52. package/dist/types/modeler/solvers/types.d.ts.map +1 -1
  53. package/dist/types/modeler/solvers/z3/loader.d.ts +2 -3
  54. package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -1
  55. package/dist/types/modeler/solvers/z3/solver.d.ts +15 -5
  56. package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -1
  57. package/dist/types/modeler/types.d.ts +60 -2
  58. package/dist/types/modeler/types.d.ts.map +1 -1
  59. package/dist/types/modeler/validation.d.ts +56 -0
  60. package/dist/types/modeler/validation.d.ts.map +1 -0
  61. package/dist/types/modeler/variable.d.ts +53 -13
  62. package/dist/types/modeler/variable.d.ts.map +1 -1
  63. package/docs/examples/diet-sensitivity.md +90 -0
  64. package/docs/examples/ecommerce-coupons.md +106 -0
  65. package/docs/examples/index.md +53 -0
  66. package/docs/examples/knapsack.md +60 -0
  67. package/docs/examples/portfolio-qp.md +83 -0
  68. package/docs/examples/production.md +51 -0
  69. package/docs/examples/shift-scheduling.md +175 -0
  70. package/docs/examples/smt-security.md +74 -0
  71. package/docs/examples/transportation.md +90 -0
  72. package/docs/examples/unsat-core.md +64 -0
  73. package/docs/getting-started/ai-agents.md +267 -0
  74. package/docs/getting-started/cross-origin.md +87 -0
  75. package/docs/getting-started/index.md +116 -0
  76. package/docs/getting-started/runtimes.md +227 -0
  77. package/docs/guide/constraints.md +177 -0
  78. package/docs/guide/expressions.md +204 -0
  79. package/docs/guide/objectives.md +170 -0
  80. package/docs/guide/unsat-core.md +147 -0
  81. package/docs/guide/variables.md +188 -0
  82. package/docs/ja/getting-started/ai-agents.md +266 -0
  83. package/docs/solvers/custom-solver.md +525 -0
  84. package/docs/solvers/glpk.md +66 -0
  85. package/docs/solvers/highs.md +93 -0
  86. package/docs/solvers/index.md +42 -0
  87. package/docs/solvers/z3.md +78 -0
  88. package/docs/zh/getting-started/ai-agents.md +266 -0
  89. package/llms-full.txt +3249 -0
  90. package/llms.txt +197 -0
  91. package/package.json +19 -6
  92. package/skills/washi/SKILL.md +197 -0
  93. package/dist/browser/loader-CVt4CloI.js +0 -58
  94. package/dist/lib/async-mutex-Duo4jwzn.js +0 -195
  95. package/dist/lib/constraint-BRuB3ooC.js +0 -90
  96. package/dist/lib/loader-Dti0v9yC.js +0 -50
  97. package/dist/lib/registry-DksqCSjI.js +0 -32
@@ -1,8 +1,8 @@
1
- import { r as e } from "../registry-DksqCSjI.js";
1
+ import { a as e, r as t, s as n } from "../registry-BEfvpZW3.js";
2
2
  //#region src/modeler/solvers/glpk/loader.ts
3
- var t = null, n = null;
4
- async function r() {
5
- if (t) return t;
3
+ var r = null, i = null;
4
+ async function a() {
5
+ if (r) return r;
6
6
  let e = (async () => {
7
7
  let e = typeof process < "u" && process.versions && process.versions.node && process.type !== "renderer";
8
8
  try {
@@ -12,150 +12,261 @@ async function r() {
12
12
  /* @vite-ignore */
13
13
  "glpk.js/node"
14
14
  ), t = await (e.default || e)();
15
- return n = t, t;
15
+ return i = t, t;
16
16
  }
17
- let t = await import("glpk.js"), r = await (t.default || t)();
18
- return n = r, r;
17
+ let t = await import("glpk.js"), n = await (t.default || t)();
18
+ return i = n, n;
19
19
  } catch (e) {
20
20
  throw Error("[WaSHI] Could not load GLPK. Install the optional glpk.js dependency before selecting this solver.", { cause: e });
21
21
  }
22
22
  })();
23
23
  return e.catch(() => {
24
- t === e && (t = null, n = null);
25
- }), t = e, e;
24
+ r === e && (r = null, i = null);
25
+ }), r = e, e;
26
26
  }
27
- function i() {
28
- if (n && typeof n.terminate == "function") try {
29
- n.terminate();
27
+ function o() {
28
+ if (i && typeof i.terminate == "function") try {
29
+ i.terminate();
30
30
  } catch {}
31
- n = null, t = null;
31
+ i = null, r = null;
32
32
  }
33
- function a() {
34
- i();
33
+ function s() {
34
+ o();
35
35
  }
36
36
  //#endregion
37
37
  //#region src/modeler/solvers/glpk/solver.ts
38
- var o = class e {
38
+ function c(e, t, n) {
39
+ Object.defineProperty(e, t, {
40
+ value: n,
41
+ enumerable: !0,
42
+ writable: !0,
43
+ configurable: !0
44
+ });
45
+ }
46
+ var l = class t {
39
47
  static capabilities = {
40
48
  supportsMIP: !0,
41
- supportsQP: !1
49
+ supportsQP: !1,
50
+ supportsWarmStart: !1
42
51
  };
43
52
  name = "GLPK";
44
53
  version = "5.0.0";
45
- capabilities = e.capabilities;
54
+ capabilities = t.capabilities;
46
55
  options;
47
56
  constructor(e = {}) {
48
57
  this.options = e;
49
58
  }
50
- async solve(e, t, n = {}) {
51
- let i = {
59
+ async solve(t, r, i) {
60
+ if (t.variables?.some((e) => e.initialValue !== void 0)) throw Error(`Solver "${this.name}" does not support primal initial values (initialValue). Please use a solver with warm-start support such as HiGHS.`);
61
+ let o = n(r), s = (o ? i : r) ?? {}, l = {
52
62
  ...this.options,
53
- ...n
54
- }, a = await r(), { nameToVar: o, nameToConstraint: s } = t, c = /* @__PURE__ */ new Map();
55
- for (let [e, t] of o.entries()) c.set(t, e);
56
- let l = /* @__PURE__ */ new Map();
57
- for (let [e, t] of s.entries()) l.set(t, e);
58
- let u = [], d = "linearTerms" in e.objective ? e.objective.linearTerms : e.objective.terms;
59
- if (d) for (let [e, t] of d) {
60
- if (Math.abs(t) < 1e-12) continue;
61
- let n = c.get(e) || e.name;
62
- u.push({
63
+ ...s
64
+ };
65
+ if (l.signal?.aborted) return {
66
+ status: "Unknown",
67
+ terminationStatus: "Interrupted",
68
+ hasPrimalSolution: !1,
69
+ objectiveValue: null,
70
+ values: {},
71
+ duals: {},
72
+ slacks: {},
73
+ runTime: 0,
74
+ logs: ["GLPK solve was cancelled before execution."]
75
+ };
76
+ let d = await a();
77
+ if (l.signal?.aborted) return {
78
+ status: "Unknown",
79
+ terminationStatus: "Interrupted",
80
+ hasPrimalSolution: !1,
81
+ objectiveValue: null,
82
+ values: {},
83
+ duals: {},
84
+ slacks: {},
85
+ runTime: 0,
86
+ logs: ["GLPK solve was cancelled before execution."]
87
+ };
88
+ let f, p, m, h;
89
+ if (o && (r.nameToVar.size > 0 || r.nameToConstraint.size > 0)) {
90
+ f = r.nameToVar, m = r.nameToConstraint, p = /* @__PURE__ */ new Map();
91
+ for (let [e, t] of f.entries()) p.set(t, e);
92
+ h = /* @__PURE__ */ new Map();
93
+ for (let [e, t] of m.entries()) h.set(t, e);
94
+ } else ({nameToVar: f, varToName: p, nameToConstraint: m, constraintToName: h} = e(t));
95
+ let g = [], _ = "linearTerms" in t.objective ? t.objective.linearTerms : t.objective.terms;
96
+ if (_) for (let [e, t] of _) {
97
+ if (t === 0) continue;
98
+ let n = p.get(e) || e.name;
99
+ g.push({
63
100
  name: n,
64
101
  coef: Number(t)
65
102
  });
66
103
  }
67
- let f = [];
68
- for (let t of e.constraints) {
69
- let e = l.get(t) || t.name || `c_${f.length + 1}`, n = [];
70
- for (let [e, r] of t.lhs.terms) {
71
- if (Math.abs(r) < 1e-12) continue;
72
- let t = c.get(e) || e.name;
104
+ let v = [];
105
+ for (let e of t.constraints) {
106
+ let t = h.get(e) || e.name || `c_${v.length + 1}`, n = [];
107
+ for (let [t, r] of e.lhs.terms) {
108
+ if (r === 0) continue;
109
+ let e = p.get(t) || t.name;
73
110
  n.push({
74
- name: t,
111
+ name: e,
75
112
  coef: Number(r)
76
113
  });
77
114
  }
78
115
  let r;
79
- r = t.sense === "==" ? {
80
- type: a.GLP_FX,
81
- lb: t.rhs,
82
- ub: t.rhs
83
- } : t.sense === "<=" ? {
84
- type: a.GLP_UP,
116
+ r = e.sense === "==" ? {
117
+ type: d.GLP_FX,
118
+ lb: e.rhs,
119
+ ub: e.rhs
120
+ } : e.sense === "<=" ? {
121
+ type: d.GLP_UP,
85
122
  lb: -Infinity,
86
- ub: t.rhs
123
+ ub: e.rhs
87
124
  } : {
88
- type: a.GLP_LO,
89
- lb: t.rhs,
125
+ type: d.GLP_LO,
126
+ lb: e.rhs,
90
127
  ub: Infinity
91
- }, f.push({
92
- name: e,
128
+ }, v.push({
129
+ name: t,
93
130
  vars: n,
94
131
  bnds: r
95
132
  });
96
133
  }
97
- let p = [], m = [], h = [];
98
- for (let t of e.variables) {
99
- let e = c.get(t) || t.name;
100
- t.type === "Binary" ? p.push(e) : t.type === "Integer" && m.push(e);
101
- let n = t.lb, r = t.ub, i;
102
- i = n === -Infinity && r === Infinity ? a.GLP_FR : n !== -Infinity && r === Infinity ? a.GLP_LO : n === -Infinity && r !== Infinity ? a.GLP_UP : n === r ? a.GLP_FX : a.GLP_DB, h.push({
103
- name: e,
134
+ let y = [], b = [], x = [];
135
+ for (let e of t.variables) {
136
+ let t = p.get(e) || e.name;
137
+ e.type === "Binary" ? y.push(t) : e.type === "Integer" && b.push(t);
138
+ let n = e.lb, r = e.ub, i;
139
+ i = n === -Infinity && r === Infinity ? d.GLP_FR : n !== -Infinity && r === Infinity ? d.GLP_LO : n === -Infinity && r !== Infinity ? d.GLP_UP : n === r ? d.GLP_FX : d.GLP_DB, x.push({
140
+ name: t,
104
141
  type: i,
105
142
  lb: n === -Infinity ? 0 : n,
106
143
  ub: r === Infinity ? 0 : r
107
144
  });
108
145
  }
109
- let g = {
110
- name: e.name || "GLPK_Model",
146
+ let S = {
147
+ name: t.name || "GLPK_Model",
111
148
  objective: {
112
- direction: e.sense && e.sense.toLowerCase() === "maximize" ? a.GLP_MAX : a.GLP_MIN,
149
+ direction: t.sense && t.sense.toLowerCase() === "maximize" ? d.GLP_MAX : d.GLP_MIN,
113
150
  name: "obj",
114
- vars: u
151
+ vars: g
115
152
  },
116
- subjectTo: f
153
+ subjectTo: v
117
154
  };
118
- h.length > 0 && (g.bounds = h), p.length > 0 && (g.binaries = p), m.length > 0 && (g.generals = m);
119
- let _ = {
120
- msglev: i.verbose ? a.GLP_MSG_ALL : a.GLP_MSG_OFF,
121
- presol: i.presolve !== "off"
155
+ x.length > 0 && (S.bounds = x), y.length > 0 && (S.binaries = y), b.length > 0 && (S.generals = b);
156
+ let C = {
157
+ msglev: l.verbose ? d.GLP_MSG_ALL : d.GLP_MSG_OFF,
158
+ presol: l.presolve !== "off"
122
159
  };
123
- typeof i.timeLimit == "number" && (_.tmlim = i.timeLimit), typeof i.mipGap == "number" && (_.mipgap = i.mipGap);
124
- let v = performance.now(), y = await a.solve(g, _), b = (performance.now() - v) / 1e3, x = y?.result?.status, S;
125
- if (S = x === a.GLP_OPT ? "Optimal" : x === a.GLP_FEAS ? "Feasible" : x === a.GLP_INFEAS || x === a.GLP_NOFEAS ? "Infeasible" : x === a.GLP_UNBND ? "Unbounded" : "Optimal", S === "Infeasible" || S === "Unbounded") return {
126
- status: S,
160
+ typeof l.timeLimit == "number" && (C.tmlim = l.timeLimit);
161
+ let w = typeof l.mipGap == "number" ? l.mipGap : typeof l.relGap == "number" ? l.relGap : void 0;
162
+ w !== void 0 && (C.mipgap = w);
163
+ let T = typeof t.objective?.constant == "number" && Number.isFinite(t.objective.constant) ? t.objective.constant : 0, E = null;
164
+ if (T !== 0 && C.presol) {
165
+ let e = "__washi_obj_const";
166
+ for (; f.has(e);) e = `_${e}`;
167
+ E = e, g.push({
168
+ name: E,
169
+ coef: T
170
+ }), x.push({
171
+ name: E,
172
+ type: d.GLP_FX,
173
+ lb: 1,
174
+ ub: 1
175
+ }), S.bounds = x;
176
+ }
177
+ let D = E === null ? T : 0, O = performance.now(), k = 0;
178
+ l.onProgress && (C.cb = {
179
+ each: 1,
180
+ call: (e) => {
181
+ k++;
182
+ let t = e?.z, n = typeof t == "number" && Number.isFinite(t) && Number.isFinite(t + D) ? t + D : void 0, r = (performance.now() - O) / 1e3;
183
+ l.onProgress?.({
184
+ elapsedTime: r,
185
+ elapsedSeconds: r,
186
+ ...n === void 0 ? {} : { objectiveValue: n }
187
+ });
188
+ }
189
+ });
190
+ let A = await d.solve(S, C), j = (performance.now() - O) / 1e3, M = typeof A?.time == "number" && Number.isFinite(A.time) ? A.time : j, N = A?.result?.status, P = u(N, d);
191
+ if (P !== "Optimal" && P !== "Feasible") return l.onProgress && k === 0 && l.onProgress({
192
+ elapsedTime: M,
193
+ elapsedSeconds: M
194
+ }), {
195
+ status: P,
196
+ terminationStatus: N === (d?.GLP_INFEAS ?? 3) ? "Unknown" : P,
197
+ hasPrimalSolution: !1,
127
198
  objectiveValue: null,
128
199
  values: {},
129
200
  duals: {},
130
201
  slacks: {},
131
- runTime: b,
132
- raw: y
202
+ runTime: M,
203
+ logs: [`GLPK solve finished with status: ${P}.`],
204
+ raw: A
133
205
  };
134
- let C = y?.result?.z, w = typeof C == "number" ? C + e.objective.constant : null, T = {}, E = y?.result?.vars || {};
135
- for (let [e, t] of Object.entries(E)) {
136
- let n = o.get(e), r = n ? n.name : e;
137
- T[r] = typeof t == "number" ? Math.abs(t) < 1e-9 ? 0 : t : 0;
206
+ let F = A?.result?.z, I = A?.result?.vars, L = typeof F == "number" && Number.isFinite(F) && Number.isFinite(F + D), R = typeof I == "object" && !!I && !Array.isArray(I), z = {}, B = R;
207
+ if (R) {
208
+ for (let [e, t] of Object.entries(I)) {
209
+ if (e === E) continue;
210
+ if (typeof t != "number" || !Number.isFinite(t)) {
211
+ B = !1;
212
+ break;
213
+ }
214
+ let n = f.get(e);
215
+ c(z, n ? n.name : e, Math.abs(t) < 1e-9 ? 0 : t);
216
+ }
217
+ if (B) for (let e of t.variables) {
218
+ let t = p.get(e) || e.name;
219
+ if (!Object.prototype.hasOwnProperty.call(I, t) && !Object.prototype.hasOwnProperty.call(I, e.name)) {
220
+ B = !1;
221
+ break;
222
+ }
223
+ }
138
224
  }
139
- for (let t of e.variables) T[t.name] === void 0 && (T[t.name] = 0);
140
- let D = {};
141
- if (y?.result?.dual) for (let [e, t] of Object.entries(y.result.dual)) {
142
- let n = s.get(e), r = n ? n.name : e;
143
- D[r] = Number(t);
225
+ if (!L || !B) return {
226
+ status: "Error",
227
+ terminationStatus: "Error",
228
+ hasPrimalSolution: !1,
229
+ objectiveValue: null,
230
+ values: {},
231
+ duals: {},
232
+ slacks: {},
233
+ runTime: M,
234
+ logs: [`GLPK reported status ${P} (${String(N)}), but the primal solution payload was missing or malformed.`],
235
+ raw: A
236
+ };
237
+ let V = F + D;
238
+ l.onProgress && k === 0 && l.onProgress({
239
+ elapsedTime: M,
240
+ elapsedSeconds: M,
241
+ objectiveValue: V
242
+ });
243
+ let H = {};
244
+ if (A?.result?.dual && typeof A.result.dual == "object" && !Array.isArray(A.result.dual)) for (let [e, t] of Object.entries(A.result.dual)) {
245
+ if (typeof t != "number" || !Number.isFinite(t)) continue;
246
+ let n = m.get(e);
247
+ c(H, n ? n.name : e, Math.abs(t) < 1e-9 ? 0 : t);
144
248
  }
145
249
  return {
146
- status: S,
147
- objectiveValue: w,
148
- values: T,
149
- duals: D,
150
- runTime: y?.time || b,
151
- logs: [`GLPK solved in ${(y?.time || b) * 1e3} ms.`],
152
- raw: y
250
+ status: P,
251
+ terminationStatus: P === "Feasible" ? "Unknown" : P,
252
+ hasPrimalSolution: !0,
253
+ objectiveValue: V,
254
+ values: z,
255
+ duals: H,
256
+ runTime: M,
257
+ logs: [`GLPK solved in ${M * 1e3} ms.`],
258
+ raw: A
153
259
  };
154
260
  }
155
261
  };
156
- function s() {
157
- e("glpk", (e) => new o(e));
262
+ function u(e, t) {
263
+ if (typeof e != "number") return "Unknown";
264
+ let n = t?.GLP_OPT ?? 5, r = t?.GLP_FEAS ?? 2, i = t?.GLP_INFEAS ?? 3, a = t?.GLP_NOFEAS ?? 4, o = t?.GLP_UNBND ?? 6;
265
+ return t?.GLP_UNDEF, e === n ? "Optimal" : e === r ? "Feasible" : e === i || e === a ? "Infeasible" : e === o ? "Unbounded" : "Unknown";
266
+ }
267
+ function d() {
268
+ t("glpk", (e) => new l(e));
158
269
  }
159
- s();
270
+ d();
160
271
  //#endregion
161
- export { o as GLPKSolver, r as getGlpk, s as registerGLPKSolver, a as resetGlpkCache, i as terminateGlpk };
272
+ export { l as GLPKSolver, a as getGlpk, u as mapGlpkStatus, d as registerGLPKSolver, s as resetGlpkCache, o as terminateGlpk };