@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.
Files changed (97) hide show
  1. package/README.ja.md +124 -22
  2. package/README.md +124 -22
  3. package/README.zh-CN.md +124 -22
  4. package/dist/browser/browser-runtime-D13gHOT5.js +4189 -0
  5. package/dist/browser/highs-worker.js +21 -0
  6. package/dist/{lib/demo → browser}/highs.wasm +0 -0
  7. package/dist/browser/highs.wasm.LICENSE +22 -0
  8. package/dist/browser/loader-CVt4CloI.js +58 -0
  9. package/dist/browser/solvers/glpk.js +1057 -0
  10. package/dist/browser/solvers/glpk.min.js +1 -0
  11. package/dist/browser/solvers/z3-built.js +8245 -0
  12. package/dist/browser/solvers/z3-built.wasm +4 -0
  13. package/dist/browser/solvers/z3.js +7528 -0
  14. package/dist/browser/solvers/z3.min.js +5 -0
  15. package/dist/browser/washi.js +1213 -0
  16. package/dist/browser/washi.min.js +5 -0
  17. package/dist/lib/async-mutex-Duo4jwzn.js +195 -0
  18. package/dist/lib/constraint-XWdn0ID9.js +93 -0
  19. package/dist/lib/highs-assets.js +1 -0
  20. package/dist/lib/highs-browser-runtime.js +4189 -0
  21. package/dist/lib/highs-node-runtime.js +1 -0
  22. package/dist/lib/highs-worker-factory.js +1 -0
  23. package/dist/lib/highs-worker.js +21 -0
  24. package/dist/lib/highs.wasm +0 -0
  25. package/dist/lib/loader-Dti0v9yC.js +50 -0
  26. package/dist/lib/registry-DksqCSjI.js +32 -0
  27. package/dist/lib/solvers/glpk.js +153 -2
  28. package/dist/lib/solvers/z3-assets.js +1 -0
  29. package/dist/lib/solvers/z3-built.js +8245 -0
  30. package/dist/lib/solvers/z3-built.wasm +4 -0
  31. package/dist/lib/solvers/z3.js +451 -2
  32. package/dist/lib/washi.js +388 -78
  33. package/dist/types/index.d.ts +2 -3
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/modeler/index.d.ts +1 -1
  36. package/dist/types/modeler/index.d.ts.map +1 -1
  37. package/dist/types/modeler/model.d.ts +1 -1
  38. package/dist/types/modeler/model.d.ts.map +1 -1
  39. package/dist/types/modeler/solvers/glpk/index.d.ts +3 -0
  40. package/dist/types/modeler/solvers/glpk/index.d.ts.map +1 -0
  41. package/dist/types/modeler/solvers/glpk/loader.d.ts +16 -0
  42. package/dist/types/modeler/solvers/glpk/loader.d.ts.map +1 -0
  43. package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -0
  44. package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -0
  45. package/dist/types/modeler/solvers/glpk.d.ts +1 -21
  46. package/dist/types/modeler/solvers/glpk.d.ts.map +1 -1
  47. package/dist/types/modeler/solvers/highs/assets.d.ts +3 -0
  48. package/dist/types/modeler/solvers/highs/assets.d.ts.map +1 -0
  49. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts +2 -0
  50. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts.map +1 -0
  51. package/dist/types/modeler/solvers/highs/index.d.ts +6 -0
  52. package/dist/types/modeler/solvers/highs/index.d.ts.map +1 -0
  53. package/dist/types/{highs-loader.d.ts → modeler/solvers/highs/loader.d.ts} +3 -3
  54. package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -0
  55. package/dist/types/modeler/solvers/highs/node-runtime.d.ts +2 -0
  56. package/dist/types/modeler/solvers/highs/node-runtime.d.ts.map +1 -0
  57. package/dist/types/modeler/solvers/highs/solver.d.ts +33 -0
  58. package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -0
  59. package/dist/types/modeler/solvers/highs/worker-client.d.ts +13 -0
  60. package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -0
  61. package/dist/types/modeler/solvers/highs/worker-factory.d.ts +3 -0
  62. package/dist/types/modeler/solvers/highs/worker-factory.d.ts.map +1 -0
  63. package/dist/types/modeler/solvers/highs/worker.d.ts +2 -0
  64. package/dist/types/modeler/solvers/highs/worker.d.ts.map +1 -0
  65. package/dist/types/modeler/solvers/highs.d.ts +1 -25
  66. package/dist/types/modeler/solvers/highs.d.ts.map +1 -1
  67. package/dist/types/modeler/solvers/index.d.ts +0 -2
  68. package/dist/types/modeler/solvers/index.d.ts.map +1 -1
  69. package/dist/types/modeler/solvers/mock.d.ts +1 -0
  70. package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
  71. package/dist/types/modeler/solvers/registry.d.ts +1 -2
  72. package/dist/types/modeler/solvers/registry.d.ts.map +1 -1
  73. package/dist/types/modeler/solvers/types.d.ts +1 -1
  74. package/dist/types/modeler/solvers/types.d.ts.map +1 -1
  75. package/dist/types/modeler/solvers/z3/assets.d.ts +11 -0
  76. package/dist/types/modeler/solvers/z3/assets.d.ts.map +1 -0
  77. package/dist/types/modeler/solvers/z3/index.d.ts +3 -0
  78. package/dist/types/modeler/solvers/z3/index.d.ts.map +1 -0
  79. package/dist/types/modeler/solvers/z3/loader.d.ts +44 -0
  80. package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -0
  81. package/dist/types/modeler/solvers/z3/solver.d.ts +34 -0
  82. package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -0
  83. package/dist/types/modeler/solvers/z3.d.ts +1 -36
  84. package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
  85. package/package.json +35 -9
  86. package/dist/lib/assets/highs-worker-DeDWU6KI.js +0 -3
  87. package/dist/lib/glpk-BC32ZaPG.js +0 -126
  88. package/dist/lib/washi-logo.png +0 -0
  89. package/dist/lib/washi-logo.svg +0 -70
  90. package/dist/lib/z3-C8g-PtmP.js +0 -582
  91. package/dist/types/glpk-loader.d.ts +0 -8
  92. package/dist/types/glpk-loader.d.ts.map +0 -1
  93. package/dist/types/highs-loader.d.ts.map +0 -1
  94. package/dist/types/highs-worker-client.d.ts +0 -12
  95. package/dist/types/highs-worker-client.d.ts.map +0 -1
  96. package/dist/types/highs-worker.d.ts +0 -2
  97. 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
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 };
@@ -1,2 +1,153 @@
1
- import { t as e } from "../glpk-BC32ZaPG.js";
2
- export { e as GLPKSolver };
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 }; }