@ohtaman/washi 0.1.1 → 0.2.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 +124 -22
- package/README.md +124 -22
- package/README.zh-CN.md +124 -22
- package/dist/browser/browser-runtime-D13gHOT5.js +4189 -0
- package/dist/browser/highs-worker.js +21 -0
- package/dist/{lib/demo → browser}/highs.wasm +0 -0
- package/dist/browser/highs.wasm.LICENSE +22 -0
- package/dist/browser/loader-CVt4CloI.js +58 -0
- package/dist/browser/solvers/glpk.js +1057 -0
- package/dist/browser/solvers/glpk.min.js +1 -0
- package/dist/browser/solvers/z3-built.js +8245 -0
- package/dist/browser/solvers/z3-built.wasm +4 -0
- package/dist/browser/solvers/z3.js +7528 -0
- package/dist/browser/solvers/z3.min.js +5 -0
- package/dist/browser/washi.js +1213 -0
- package/dist/browser/washi.min.js +5 -0
- package/dist/lib/async-mutex-Duo4jwzn.js +195 -0
- package/dist/lib/constraint-XWdn0ID9.js +93 -0
- package/dist/lib/highs-assets.js +1 -0
- package/dist/lib/highs-browser-runtime.js +4189 -0
- package/dist/lib/highs-node-runtime.js +1 -0
- package/dist/lib/highs-worker-factory.js +1 -0
- package/dist/lib/highs-worker.js +21 -0
- package/dist/lib/highs.wasm +0 -0
- package/dist/lib/loader-Dti0v9yC.js +50 -0
- package/dist/lib/registry-DksqCSjI.js +32 -0
- package/dist/lib/solvers/glpk.js +153 -2
- package/dist/lib/solvers/z3-assets.js +1 -0
- package/dist/lib/solvers/z3-built.js +8245 -0
- package/dist/lib/solvers/z3-built.wasm +4 -0
- package/dist/lib/solvers/z3.js +451 -2
- package/dist/lib/washi.js +388 -78
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modeler/index.d.ts +1 -1
- package/dist/types/modeler/index.d.ts.map +1 -1
- package/dist/types/modeler/model.d.ts +1 -1
- package/dist/types/modeler/model.d.ts.map +1 -1
- package/dist/types/modeler/solvers/glpk/index.d.ts +3 -0
- package/dist/types/modeler/solvers/glpk/index.d.ts.map +1 -0
- package/dist/types/modeler/solvers/glpk/loader.d.ts +16 -0
- package/dist/types/modeler/solvers/glpk/loader.d.ts.map +1 -0
- package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -0
- package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -0
- package/dist/types/modeler/solvers/glpk.d.ts +1 -21
- package/dist/types/modeler/solvers/glpk.d.ts.map +1 -1
- package/dist/types/modeler/solvers/highs/assets.d.ts +3 -0
- package/dist/types/modeler/solvers/highs/assets.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/browser-runtime.d.ts +2 -0
- package/dist/types/modeler/solvers/highs/browser-runtime.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/index.d.ts +6 -0
- package/dist/types/modeler/solvers/highs/index.d.ts.map +1 -0
- package/dist/types/{highs-loader.d.ts → modeler/solvers/highs/loader.d.ts} +3 -3
- package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/node-runtime.d.ts +2 -0
- package/dist/types/modeler/solvers/highs/node-runtime.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/solver.d.ts +33 -0
- package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/worker-client.d.ts +13 -0
- package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/worker-factory.d.ts +3 -0
- package/dist/types/modeler/solvers/highs/worker-factory.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs/worker.d.ts +2 -0
- package/dist/types/modeler/solvers/highs/worker.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs.d.ts +1 -25
- package/dist/types/modeler/solvers/highs.d.ts.map +1 -1
- package/dist/types/modeler/solvers/index.d.ts +0 -2
- package/dist/types/modeler/solvers/index.d.ts.map +1 -1
- package/dist/types/modeler/solvers/mock.d.ts +1 -0
- package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
- package/dist/types/modeler/solvers/registry.d.ts +1 -2
- package/dist/types/modeler/solvers/registry.d.ts.map +1 -1
- package/dist/types/modeler/solvers/types.d.ts +1 -1
- package/dist/types/modeler/solvers/types.d.ts.map +1 -1
- package/dist/types/modeler/solvers/z3/assets.d.ts +11 -0
- package/dist/types/modeler/solvers/z3/assets.d.ts.map +1 -0
- package/dist/types/modeler/solvers/z3/index.d.ts +3 -0
- package/dist/types/modeler/solvers/z3/index.d.ts.map +1 -0
- package/dist/types/modeler/solvers/z3/loader.d.ts +44 -0
- package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -0
- package/dist/types/modeler/solvers/z3/solver.d.ts +34 -0
- package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -0
- package/dist/types/modeler/solvers/z3.d.ts +1 -36
- package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
- package/package.json +35 -9
- package/dist/lib/assets/highs-worker-DeDWU6KI.js +0 -3
- package/dist/lib/glpk-BC32ZaPG.js +0 -126
- package/dist/lib/washi-logo.png +0 -0
- package/dist/lib/washi-logo.svg +0 -70
- package/dist/lib/z3-C8g-PtmP.js +0 -582
- package/dist/types/glpk-loader.d.ts +0 -8
- package/dist/types/glpk-loader.d.ts.map +0 -1
- package/dist/types/highs-loader.d.ts.map +0 -1
- package/dist/types/highs-worker-client.d.ts +0 -12
- package/dist/types/highs-worker-client.d.ts.map +0 -1
- package/dist/types/highs-worker.d.ts +0 -2
- package/dist/types/highs-worker.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export async function loadNodeHighs() { return (await import(/* webpackIgnore: true */ /* @vite-ignore */ "highs")).default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function createHighsWorker() { return new Worker(new URL("./highs-worker.js", import.meta.url), { type: "module" }); }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { c as e } from "./loader-Dti0v9yC.js";
|
|
2
|
+
//#region src/modeler/solvers/highs/worker.ts
|
|
3
|
+
self.onmessage = async (t) => {
|
|
4
|
+
let { type: n, id: r, lpString: i, options: a } = t.data;
|
|
5
|
+
if (n === "SOLVE") try {
|
|
6
|
+
let { result: t, runTime: n } = await e(i, a);
|
|
7
|
+
self.postMessage({
|
|
8
|
+
type: "SOLVE_SUCCESS",
|
|
9
|
+
id: r,
|
|
10
|
+
result: t,
|
|
11
|
+
runTime: n
|
|
12
|
+
});
|
|
13
|
+
} catch (e) {
|
|
14
|
+
self.postMessage({
|
|
15
|
+
type: "SOLVE_ERROR",
|
|
16
|
+
id: r,
|
|
17
|
+
error: e?.message || String(e)
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
package/dist/lib/highs.wasm
CHANGED
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getBundledWasmUrl as e } from "./highs-assets.js";
|
|
2
|
+
import { loadNodeHighs as t } from "./highs-node-runtime.js";
|
|
3
|
+
//#region src/modeler/solvers/highs/loader.ts
|
|
4
|
+
var n = "https://cdn.jsdelivr.net/npm/highs@1.15.3/build/highs.wasm", r = null, i = null, a = null;
|
|
5
|
+
function o(e) {
|
|
6
|
+
a = e, r = null, i = null;
|
|
7
|
+
}
|
|
8
|
+
function s() {
|
|
9
|
+
return a;
|
|
10
|
+
}
|
|
11
|
+
function c(e) {
|
|
12
|
+
return e.length >= 4 && e[0] === 0 && e[1] === 97 && e[2] === 115 && e[3] === 109;
|
|
13
|
+
}
|
|
14
|
+
async function l(e) {
|
|
15
|
+
try {
|
|
16
|
+
let t = await fetch(e, { headers: { Range: "bytes=0-3" } });
|
|
17
|
+
if (!t.ok || (t.headers.get("content-type") || "").includes("text/html")) return !1;
|
|
18
|
+
if (!t.body) return !0;
|
|
19
|
+
let n = t.body.getReader(), { value: r, done: i } = await n.read();
|
|
20
|
+
return await n.cancel(), i || !r || r.length < 4 ? !1 : c(r);
|
|
21
|
+
} catch {
|
|
22
|
+
return !1;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function u(t) {
|
|
26
|
+
return t || a || e();
|
|
27
|
+
}
|
|
28
|
+
async function d(e = {}) {
|
|
29
|
+
let n = typeof process < "u" && process.versions?.node && process.type !== "renderer", a = n ? null : await u(e.wasmUrl), o = a ?? "node";
|
|
30
|
+
if (r && i === o) return r;
|
|
31
|
+
i = o;
|
|
32
|
+
let s = (async () => {
|
|
33
|
+
let e = n ? await t() : (await import("./highs-browser-runtime.js")).default;
|
|
34
|
+
return n ? await e() : await e({ locateFile: (e) => e.endsWith(".wasm") ? a : e });
|
|
35
|
+
})().catch((e) => {
|
|
36
|
+
r === s && (r = null, i = null);
|
|
37
|
+
let t = e instanceof Error ? e.message : String(e);
|
|
38
|
+
throw Error(`[WaSHI] Failed to initialize HiGHS${a ? ` from "${a}"` : ""}. Deploy the package's WASM asset or explicitly set wasmUrl; no CDN fallback is attempted. ${t}`, { cause: e });
|
|
39
|
+
});
|
|
40
|
+
return r = s, s;
|
|
41
|
+
}
|
|
42
|
+
async function f(e, t = {}) {
|
|
43
|
+
let n = await d(t), r = performance.now(), i = { output_flag: t.outputFlag ?? !1 };
|
|
44
|
+
return t.timeLimit !== void 0 && (i.time_limit = t.timeLimit), t.presolve !== void 0 && (i.presolve = t.presolve), t.solver !== void 0 && (i.solver = t.solver), t.relGap !== void 0 && (i.mip_rel_gap = t.relGap), t.absGap !== void 0 && (i.mip_abs_gap = t.absGap), {
|
|
45
|
+
result: n.solve(e, i),
|
|
46
|
+
runTime: (performance.now() - r) / 1e3
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { l as a, f as c, c as i, d as n, u as o, s as r, o as s, n as t };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/modeler/solvers/registry.ts
|
|
2
|
+
var e = Symbol.for("washi.solverRegistry"), t = Symbol.for("washi.defaultSolverFactory"), n = globalThis;
|
|
3
|
+
n[e] || (n[e] = /* @__PURE__ */ new Map());
|
|
4
|
+
var r = n[e];
|
|
5
|
+
function i(e, t) {
|
|
6
|
+
r.set(e.toLowerCase(), t);
|
|
7
|
+
}
|
|
8
|
+
function a(e) {
|
|
9
|
+
if (typeof e == "string") {
|
|
10
|
+
let i = r.get(e.toLowerCase());
|
|
11
|
+
if (!i) throw Error(`Solver '${e}' is not registered.`);
|
|
12
|
+
n[t] = i;
|
|
13
|
+
} else n[t] = typeof e == "function" ? e : () => e;
|
|
14
|
+
}
|
|
15
|
+
function o(e, i) {
|
|
16
|
+
if (!e) {
|
|
17
|
+
let e = n[t] || r.get("highs");
|
|
18
|
+
if (!e) throw Error(`No default solver available. Available solvers: ${s().join(", ")}`);
|
|
19
|
+
return e(i);
|
|
20
|
+
}
|
|
21
|
+
if (typeof e == "string") {
|
|
22
|
+
let t = e.toLowerCase(), n = r.get(t);
|
|
23
|
+
if (!n) throw Error(t === "glpk" ? `Solver 'glpk' not found. Available solvers: ${s().join(", ")}. Please import '@ohtaman/washi/solvers/glpk' before selecting this solver.` : t === "z3" ? `Solver 'z3' not found. Available solvers: ${s().join(", ")}. Please import '@ohtaman/washi/solvers/z3' before selecting this solver.` : `Solver '${e}' not found. Available solvers: ${s().join(", ")}`);
|
|
24
|
+
return n(i);
|
|
25
|
+
}
|
|
26
|
+
return e;
|
|
27
|
+
}
|
|
28
|
+
function s() {
|
|
29
|
+
return Array.from(r.keys());
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { a as i, s as n, i as r, o as t };
|
package/dist/lib/solvers/glpk.js
CHANGED
|
@@ -1,2 +1,153 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { r as e } from "../registry-DksqCSjI.js";
|
|
2
|
+
//#region src/modeler/solvers/glpk/loader.ts
|
|
3
|
+
var t = null, n = null;
|
|
4
|
+
async function r() {
|
|
5
|
+
if (t) return t;
|
|
6
|
+
let e = (async () => {
|
|
7
|
+
let e = typeof process < "u" && process.versions && process.versions.node && process.type !== "renderer";
|
|
8
|
+
try {
|
|
9
|
+
if (e) {
|
|
10
|
+
let e = await import(
|
|
11
|
+
/* webpackIgnore: true */
|
|
12
|
+
/* @vite-ignore */
|
|
13
|
+
"glpk.js/node"
|
|
14
|
+
), t = await (e.default || e)();
|
|
15
|
+
return n = t, t;
|
|
16
|
+
}
|
|
17
|
+
let t = await import("glpk.js"), r = await (t.default || t)();
|
|
18
|
+
return n = r, r;
|
|
19
|
+
} catch (e) {
|
|
20
|
+
throw Error("[WaSHI] Could not load GLPK. Install the optional glpk.js dependency before selecting this solver.", { cause: e });
|
|
21
|
+
}
|
|
22
|
+
})();
|
|
23
|
+
return e.catch(() => {
|
|
24
|
+
t === e && (t = null, n = null);
|
|
25
|
+
}), t = e, e;
|
|
26
|
+
}
|
|
27
|
+
function i() {
|
|
28
|
+
if (n && typeof n.terminate == "function") try {
|
|
29
|
+
n.terminate();
|
|
30
|
+
} catch {}
|
|
31
|
+
n = null, t = null;
|
|
32
|
+
}
|
|
33
|
+
function a() {
|
|
34
|
+
i();
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/modeler/solvers/glpk/solver.ts
|
|
38
|
+
var o = class e {
|
|
39
|
+
static capabilities = {
|
|
40
|
+
supportsMIP: !0,
|
|
41
|
+
supportsQP: !1
|
|
42
|
+
};
|
|
43
|
+
name = "GLPK";
|
|
44
|
+
version = "5.0.0";
|
|
45
|
+
capabilities = e.capabilities;
|
|
46
|
+
options;
|
|
47
|
+
constructor(e = {}) {
|
|
48
|
+
this.options = e;
|
|
49
|
+
}
|
|
50
|
+
async solve(e, t, n = {}) {
|
|
51
|
+
let i = {
|
|
52
|
+
...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
|
+
name: n,
|
|
64
|
+
coef: Number(t)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
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;
|
|
73
|
+
n.push({
|
|
74
|
+
name: t,
|
|
75
|
+
coef: Number(r)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
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,
|
|
85
|
+
lb: -Infinity,
|
|
86
|
+
ub: t.rhs
|
|
87
|
+
} : {
|
|
88
|
+
type: a.GLP_LO,
|
|
89
|
+
lb: t.rhs,
|
|
90
|
+
ub: Infinity
|
|
91
|
+
}, f.push({
|
|
92
|
+
name: e,
|
|
93
|
+
vars: n,
|
|
94
|
+
bnds: r
|
|
95
|
+
});
|
|
96
|
+
}
|
|
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,
|
|
104
|
+
type: i,
|
|
105
|
+
lb: n === -Infinity ? 0 : n,
|
|
106
|
+
ub: r === Infinity ? 0 : r
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
let g = {
|
|
110
|
+
name: e.name || "GLPK_Model",
|
|
111
|
+
objective: {
|
|
112
|
+
direction: e.sense === "Maximize" ? a.GLP_MAX : a.GLP_MIN,
|
|
113
|
+
name: "obj",
|
|
114
|
+
vars: u
|
|
115
|
+
},
|
|
116
|
+
subjectTo: f
|
|
117
|
+
};
|
|
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"
|
|
122
|
+
};
|
|
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
|
+
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";
|
|
126
|
+
let C = y?.result?.z, w = typeof C == "number" ? C + e.objective.constant : null, T = {}, E = y?.result?.vars || {};
|
|
127
|
+
for (let [e, t] of Object.entries(E)) {
|
|
128
|
+
let n = o.get(e), r = n ? n.name : e;
|
|
129
|
+
T[r] = typeof t == "number" ? Math.abs(t) < 1e-9 ? 0 : t : 0;
|
|
130
|
+
}
|
|
131
|
+
for (let t of e.variables) T[t.name] === void 0 && (T[t.name] = 0);
|
|
132
|
+
let D = {};
|
|
133
|
+
if (y?.result?.dual) for (let [e, t] of Object.entries(y.result.dual)) {
|
|
134
|
+
let n = s.get(e), r = n ? n.name : e;
|
|
135
|
+
D[r] = Number(t);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
status: S,
|
|
139
|
+
objectiveValue: w,
|
|
140
|
+
values: T,
|
|
141
|
+
duals: D,
|
|
142
|
+
runTime: y?.time || b,
|
|
143
|
+
logs: [`GLPK solved in ${(y?.time || b) * 1e3} ms.`],
|
|
144
|
+
raw: y
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
function s() {
|
|
149
|
+
e("glpk", (e) => new o(e));
|
|
150
|
+
}
|
|
151
|
+
s();
|
|
152
|
+
//#endregion
|
|
153
|
+
export { o as GLPKSolver, r as getGlpk, s as registerGLPKSolver, a as resetGlpkCache, i as terminateGlpk };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getBundledZ3AssetUrls() { return { jsUrl: new URL("./z3-built.js", import.meta.url).href, wasmUrl: new URL("./z3-built.wasm", import.meta.url).href }; }
|