@ohtaman/washi 0.4.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.
- package/README.ja.md +100 -107
- package/README.md +98 -105
- package/README.zh-CN.md +101 -108
- package/dist/browser/highs-worker.js +21 -3
- package/dist/browser/loader-CtaDHef_.js +273 -0
- package/dist/browser/solvers/glpk.js +433 -286
- package/dist/browser/solvers/glpk.min.js +1 -1
- package/dist/browser/solvers/z3.js +1002 -981
- package/dist/browser/solvers/z3.min.js +2 -2
- package/dist/browser/washi.js +2129 -676
- package/dist/browser/washi.min.js +4 -4
- package/dist/lib/highs-worker.js +21 -3
- package/dist/lib/loader-DmNC_UNk.js +279 -0
- package/dist/lib/registry-BEfvpZW3.js +951 -0
- package/dist/lib/solvers/glpk.js +201 -90
- package/dist/lib/solvers/z3.js +399 -259
- package/dist/lib/washi.js +1627 -988
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modeler/big-m.d.ts +75 -0
- package/dist/types/modeler/big-m.d.ts.map +1 -0
- package/dist/types/modeler/boolean-expr.d.ts +103 -14
- package/dist/types/modeler/boolean-expr.d.ts.map +1 -1
- package/dist/types/modeler/constraint.d.ts +36 -9
- package/dist/types/modeler/constraint.d.ts.map +1 -1
- package/dist/types/modeler/expression.d.ts +113 -28
- package/dist/types/modeler/expression.d.ts.map +1 -1
- package/dist/types/modeler/index.d.ts +10 -6
- package/dist/types/modeler/index.d.ts.map +1 -1
- package/dist/types/modeler/lp-writer.d.ts +27 -2
- package/dist/types/modeler/lp-writer.d.ts.map +1 -1
- package/dist/types/modeler/model.d.ts +478 -131
- package/dist/types/modeler/model.d.ts.map +1 -1
- package/dist/types/modeler/objective.d.ts +59 -0
- package/dist/types/modeler/objective.d.ts.map +1 -0
- package/dist/types/modeler/parser.d.ts +34 -10
- package/dist/types/modeler/parser.d.ts.map +1 -1
- package/dist/types/modeler/quad-expr.d.ts +26 -7
- package/dist/types/modeler/quad-expr.d.ts.map +1 -1
- package/dist/types/modeler/solution-validator.d.ts +93 -0
- package/dist/types/modeler/solution-validator.d.ts.map +1 -0
- package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -2
- package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -1
- package/dist/types/modeler/solvers/highs/loader.d.ts +36 -11
- package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -1
- package/dist/types/modeler/solvers/highs/solver.d.ts +11 -4
- package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -1
- package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -1
- package/dist/types/modeler/solvers/mock.d.ts +14 -5
- package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
- package/dist/types/modeler/solvers/types.d.ts +71 -11
- package/dist/types/modeler/solvers/types.d.ts.map +1 -1
- package/dist/types/modeler/solvers/z3/loader.d.ts +2 -3
- package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -1
- package/dist/types/modeler/solvers/z3/solver.d.ts +15 -5
- package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -1
- package/dist/types/modeler/types.d.ts +59 -1
- package/dist/types/modeler/types.d.ts.map +1 -1
- package/dist/types/modeler/validation.d.ts +56 -0
- package/dist/types/modeler/validation.d.ts.map +1 -0
- package/dist/types/modeler/variable.d.ts +48 -14
- package/dist/types/modeler/variable.d.ts.map +1 -1
- package/docs/examples/diet-sensitivity.md +90 -0
- package/docs/examples/ecommerce-coupons.md +106 -0
- package/docs/examples/index.md +53 -0
- package/docs/examples/knapsack.md +60 -0
- package/docs/examples/portfolio-qp.md +83 -0
- package/docs/examples/production.md +51 -0
- package/docs/examples/shift-scheduling.md +175 -0
- package/docs/examples/smt-security.md +74 -0
- package/docs/examples/transportation.md +90 -0
- package/docs/examples/unsat-core.md +64 -0
- package/docs/getting-started/ai-agents.md +267 -0
- package/docs/getting-started/cross-origin.md +87 -0
- package/docs/getting-started/index.md +116 -0
- package/docs/getting-started/runtimes.md +227 -0
- package/docs/guide/constraints.md +177 -0
- package/docs/guide/expressions.md +204 -0
- package/docs/guide/objectives.md +170 -0
- package/docs/guide/unsat-core.md +147 -0
- package/docs/guide/variables.md +188 -0
- package/docs/ja/getting-started/ai-agents.md +266 -0
- package/docs/solvers/custom-solver.md +525 -0
- package/docs/solvers/glpk.md +66 -0
- package/docs/solvers/highs.md +93 -0
- package/docs/solvers/index.md +42 -0
- package/docs/solvers/z3.md +78 -0
- package/docs/zh/getting-started/ai-agents.md +266 -0
- package/llms-full.txt +3249 -0
- package/llms.txt +197 -0
- package/package.json +18 -5
- package/skills/washi/SKILL.md +197 -0
- package/dist/browser/loader-CVt4CloI.js +0 -58
- package/dist/lib/async-mutex-Duo4jwzn.js +0 -195
- package/dist/lib/constraint-BRuB3ooC.js +0 -90
- package/dist/lib/loader-Dti0v9yC.js +0 -50
- package/dist/lib/registry-DksqCSjI.js +0 -32
package/dist/lib/solvers/glpk.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
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
|
|
4
|
-
async function
|
|
5
|
-
if (
|
|
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
|
|
15
|
+
return i = t, t;
|
|
16
16
|
}
|
|
17
|
-
let t = await import("glpk.js"),
|
|
18
|
-
return
|
|
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
|
-
|
|
25
|
-
}),
|
|
24
|
+
r === e && (r = null, i = null);
|
|
25
|
+
}), r = e, e;
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
if (
|
|
29
|
-
|
|
27
|
+
function o() {
|
|
28
|
+
if (i && typeof i.terminate == "function") try {
|
|
29
|
+
i.terminate();
|
|
30
30
|
} catch {}
|
|
31
|
-
|
|
31
|
+
i = null, r = null;
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
|
|
33
|
+
function s() {
|
|
34
|
+
o();
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/modeler/solvers/glpk/solver.ts
|
|
38
|
-
|
|
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 =
|
|
54
|
+
capabilities = t.capabilities;
|
|
46
55
|
options;
|
|
47
56
|
constructor(e = {}) {
|
|
48
57
|
this.options = e;
|
|
49
58
|
}
|
|
50
|
-
async solve(
|
|
51
|
-
|
|
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
|
-
...
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
68
|
-
for (let
|
|
69
|
-
let
|
|
70
|
-
for (let [
|
|
71
|
-
if (
|
|
72
|
-
let
|
|
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:
|
|
111
|
+
name: e,
|
|
75
112
|
coef: Number(r)
|
|
76
113
|
});
|
|
77
114
|
}
|
|
78
115
|
let r;
|
|
79
|
-
r =
|
|
80
|
-
type:
|
|
81
|
-
lb:
|
|
82
|
-
ub:
|
|
83
|
-
} :
|
|
84
|
-
type:
|
|
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:
|
|
123
|
+
ub: e.rhs
|
|
87
124
|
} : {
|
|
88
|
-
type:
|
|
89
|
-
lb:
|
|
125
|
+
type: d.GLP_LO,
|
|
126
|
+
lb: e.rhs,
|
|
90
127
|
ub: Infinity
|
|
91
|
-
},
|
|
92
|
-
name:
|
|
128
|
+
}, v.push({
|
|
129
|
+
name: t,
|
|
93
130
|
vars: n,
|
|
94
131
|
bnds: r
|
|
95
132
|
});
|
|
96
133
|
}
|
|
97
|
-
let
|
|
98
|
-
for (let
|
|
99
|
-
let
|
|
100
|
-
|
|
101
|
-
let n =
|
|
102
|
-
i = n === -Infinity && r === Infinity ?
|
|
103
|
-
name:
|
|
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
|
|
110
|
-
name:
|
|
146
|
+
let S = {
|
|
147
|
+
name: t.name || "GLPK_Model",
|
|
111
148
|
objective: {
|
|
112
|
-
direction:
|
|
149
|
+
direction: t.sense && t.sense.toLowerCase() === "maximize" ? d.GLP_MAX : d.GLP_MIN,
|
|
113
150
|
name: "obj",
|
|
114
|
-
vars:
|
|
151
|
+
vars: g
|
|
115
152
|
},
|
|
116
|
-
subjectTo:
|
|
153
|
+
subjectTo: v
|
|
117
154
|
};
|
|
118
|
-
|
|
119
|
-
let
|
|
120
|
-
msglev:
|
|
121
|
-
presol:
|
|
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
|
|
124
|
-
let
|
|
125
|
-
|
|
126
|
-
|
|
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:
|
|
132
|
-
|
|
202
|
+
runTime: M,
|
|
203
|
+
logs: [`GLPK solve finished with status: ${P}.`],
|
|
204
|
+
raw: A
|
|
133
205
|
};
|
|
134
|
-
let
|
|
135
|
-
|
|
136
|
-
let
|
|
137
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
157
|
-
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
|
-
|
|
270
|
+
d();
|
|
160
271
|
//#endregion
|
|
161
|
-
export {
|
|
272
|
+
export { l as GLPKSolver, a as getGlpk, u as mapGlpkStatus, d as registerGLPKSolver, s as resetGlpkCache, o as terminateGlpk };
|