@ohtaman/washi 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.ja.md +381 -0
- package/README.md +380 -2
- package/README.zh-CN.md +381 -0
- package/THIRD_PARTY_LICENSES.md +83 -0
- package/dist/lib/assets/highs-worker-DeDWU6KI.js +3 -0
- package/dist/lib/demo/highs.wasm +0 -0
- package/dist/lib/glpk-BC32ZaPG.js +126 -0
- package/dist/lib/highs.wasm +0 -0
- package/dist/lib/highs.wasm.LICENSE +22 -0
- package/dist/lib/solvers/glpk.js +2 -0
- package/dist/lib/solvers/z3.js +2 -0
- package/dist/lib/washi-logo.png +0 -0
- package/dist/lib/washi-logo.svg +70 -0
- package/dist/lib/washi.js +908 -0
- package/dist/lib/z3-C8g-PtmP.js +582 -0
- package/dist/types/glpk-loader.d.ts +8 -0
- package/dist/types/glpk-loader.d.ts.map +1 -0
- package/dist/types/highs-loader.d.ts +55 -0
- package/dist/types/highs-loader.d.ts.map +1 -0
- package/dist/types/highs-worker-client.d.ts +12 -0
- package/dist/types/highs-worker-client.d.ts.map +1 -0
- package/dist/types/highs-worker.d.ts +2 -0
- package/dist/types/highs-worker.d.ts.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/modeler/boolean-expr.d.ts +38 -0
- package/dist/types/modeler/boolean-expr.d.ts.map +1 -0
- package/dist/types/modeler/constraint.d.ts +28 -0
- package/dist/types/modeler/constraint.d.ts.map +1 -0
- package/dist/types/modeler/expression.d.ts +79 -0
- package/dist/types/modeler/expression.d.ts.map +1 -0
- package/dist/types/modeler/index.d.ts +14 -0
- package/dist/types/modeler/index.d.ts.map +1 -0
- package/dist/types/modeler/lp-writer.d.ts +30 -0
- package/dist/types/modeler/lp-writer.d.ts.map +1 -0
- package/dist/types/modeler/mip-compat.d.ts +43 -0
- package/dist/types/modeler/mip-compat.d.ts.map +1 -0
- package/dist/types/modeler/model.d.ts +156 -0
- package/dist/types/modeler/model.d.ts.map +1 -0
- package/dist/types/modeler/parser.d.ts +27 -0
- package/dist/types/modeler/parser.d.ts.map +1 -0
- package/dist/types/modeler/pulp-compat.d.ts +67 -0
- package/dist/types/modeler/pulp-compat.d.ts.map +1 -0
- package/dist/types/modeler/quad-expr.d.ts +55 -0
- package/dist/types/modeler/quad-expr.d.ts.map +1 -0
- package/dist/types/modeler/solvers/glpk.d.ts +22 -0
- package/dist/types/modeler/solvers/glpk.d.ts.map +1 -0
- package/dist/types/modeler/solvers/highs.d.ts +26 -0
- package/dist/types/modeler/solvers/highs.d.ts.map +1 -0
- package/dist/types/modeler/solvers/index.d.ts +7 -0
- package/dist/types/modeler/solvers/index.d.ts.map +1 -0
- package/dist/types/modeler/solvers/mock.d.ts +25 -0
- package/dist/types/modeler/solvers/mock.d.ts.map +1 -0
- package/dist/types/modeler/solvers/registry.d.ts +20 -0
- package/dist/types/modeler/solvers/registry.d.ts.map +1 -0
- package/dist/types/modeler/solvers/types.d.ts +86 -0
- package/dist/types/modeler/solvers/types.d.ts.map +1 -0
- package/dist/types/modeler/solvers/z3.d.ts +37 -0
- package/dist/types/modeler/solvers/z3.d.ts.map +1 -0
- package/dist/types/modeler/types.d.ts +27 -0
- package/dist/types/modeler/types.d.ts.map +1 -0
- package/dist/types/modeler/variable.d.ts +52 -0
- package/dist/types/modeler/variable.d.ts.map +1 -0
- package/package.json +98 -4
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { t as e } from "./glpk-BC32ZaPG.js";
|
|
2
|
+
//#region src/modeler/boolean-expr.ts
|
|
3
|
+
var t = 0, n = class {
|
|
4
|
+
and(e) {
|
|
5
|
+
return new i("and", [this, e]);
|
|
6
|
+
}
|
|
7
|
+
or(e) {
|
|
8
|
+
return new i("or", [this, e]);
|
|
9
|
+
}
|
|
10
|
+
implies(e) {
|
|
11
|
+
return new i("implies", [this, e]);
|
|
12
|
+
}
|
|
13
|
+
xor(e) {
|
|
14
|
+
return new i("xor", [this, e]);
|
|
15
|
+
}
|
|
16
|
+
not() {
|
|
17
|
+
return new i("not", [this]);
|
|
18
|
+
}
|
|
19
|
+
}, r = class extends n {
|
|
20
|
+
id;
|
|
21
|
+
name;
|
|
22
|
+
value = null;
|
|
23
|
+
constructor(e) {
|
|
24
|
+
super(), this.id = ++t, this.name = e || `p_${this.id}`;
|
|
25
|
+
}
|
|
26
|
+
toString() {
|
|
27
|
+
return this.name;
|
|
28
|
+
}
|
|
29
|
+
}, i = class extends n {
|
|
30
|
+
op;
|
|
31
|
+
children;
|
|
32
|
+
constructor(e, t) {
|
|
33
|
+
super(), this.op = e, this.children = t;
|
|
34
|
+
}
|
|
35
|
+
toString() {
|
|
36
|
+
return this.op === "not" ? `not(${this.children[0].toString()})` : `(${this.children.map((e) => e.toString()).join(` ${this.op} `)})`;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
function a(...e) {
|
|
40
|
+
if (e.length === 0) throw Error("and() requires at least one expression");
|
|
41
|
+
return new i("and", e);
|
|
42
|
+
}
|
|
43
|
+
function o(...e) {
|
|
44
|
+
if (e.length === 0) throw Error("or() requires at least one expression");
|
|
45
|
+
return new i("or", e);
|
|
46
|
+
}
|
|
47
|
+
function s(e) {
|
|
48
|
+
return new i("not", [e]);
|
|
49
|
+
}
|
|
50
|
+
function c(e, t) {
|
|
51
|
+
return new i("implies", [e, t]);
|
|
52
|
+
}
|
|
53
|
+
function l(...e) {
|
|
54
|
+
if (e.length === 0) throw Error("xor() requires at least one expression");
|
|
55
|
+
return new i("xor", e);
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/modeler/constraint.ts
|
|
59
|
+
var u = 0, d = class {
|
|
60
|
+
id;
|
|
61
|
+
lhs;
|
|
62
|
+
sense;
|
|
63
|
+
rhs;
|
|
64
|
+
name;
|
|
65
|
+
slack = null;
|
|
66
|
+
dual = null;
|
|
67
|
+
constructor(e, t, n, r) {
|
|
68
|
+
this.id = ++u, this.lhs = e, this.sense = t, this.rhs = n, this.name = r || `c_${this.id}`;
|
|
69
|
+
}
|
|
70
|
+
get pi() {
|
|
71
|
+
return this.dual;
|
|
72
|
+
}
|
|
73
|
+
and(e) {
|
|
74
|
+
return new i("and", [this, e]);
|
|
75
|
+
}
|
|
76
|
+
or(e) {
|
|
77
|
+
return new i("or", [this, e]);
|
|
78
|
+
}
|
|
79
|
+
implies(e) {
|
|
80
|
+
return new i("implies", [this, e]);
|
|
81
|
+
}
|
|
82
|
+
xor(e) {
|
|
83
|
+
return new i("xor", [this, e]);
|
|
84
|
+
}
|
|
85
|
+
not() {
|
|
86
|
+
return new i("not", [this]);
|
|
87
|
+
}
|
|
88
|
+
toString() {
|
|
89
|
+
let e = this.sense === "==" ? "=" : this.sense;
|
|
90
|
+
return `${this.name}: ${this.lhs.toString()} ${e} ${this.rhs}`;
|
|
91
|
+
}
|
|
92
|
+
}, f = "https://cdn.jsdelivr.net/npm/highs@1.15.3/build/highs.wasm", p = null, m = null;
|
|
93
|
+
function h(e) {
|
|
94
|
+
m = e, p = null;
|
|
95
|
+
}
|
|
96
|
+
function g() {
|
|
97
|
+
return m;
|
|
98
|
+
}
|
|
99
|
+
function _(e) {
|
|
100
|
+
return e.length >= 4 && e[0] === 0 && e[1] === 97 && e[2] === 115 && e[3] === 109;
|
|
101
|
+
}
|
|
102
|
+
async function v(e) {
|
|
103
|
+
try {
|
|
104
|
+
let t = await fetch(e, { headers: { Range: "bytes=0-3" } });
|
|
105
|
+
if (!t.ok || (t.headers.get("content-type") || "").includes("text/html")) return !1;
|
|
106
|
+
if (!t.body) return !0;
|
|
107
|
+
let n = t.body.getReader(), { value: r, done: i } = await n.read();
|
|
108
|
+
return await n.cancel(), i || !r || r.length < 4 ? !1 : _(r);
|
|
109
|
+
} catch {
|
|
110
|
+
return !1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function y(e) {
|
|
114
|
+
if (e) return e;
|
|
115
|
+
if (m) return m;
|
|
116
|
+
let t = typeof window < "u" ? new URL("/highs.wasm", window.location.origin).href : typeof self < "u" && self.location ? new URL("highs.wasm", self.location.href).href : "/highs.wasm";
|
|
117
|
+
return await v(t) ? t : (typeof console < "u" && console.info && console.info(`[WaSHI] Local highs.wasm not found or invalid at "${t}". Automatically falling back to official CDN: ${f}`), f);
|
|
118
|
+
}
|
|
119
|
+
async function b(e = {}) {
|
|
120
|
+
return p || (p = (async () => {
|
|
121
|
+
let t = await import("highs"), n = t.default || t;
|
|
122
|
+
if (typeof process < "u" && process.versions && process.versions.node && process.type !== "renderer") return await n();
|
|
123
|
+
let r = await y(e.wasmUrl);
|
|
124
|
+
return await n({ locateFile: (e) => e.endsWith(".wasm") ? r : e });
|
|
125
|
+
})(), p);
|
|
126
|
+
}
|
|
127
|
+
async function x(e, t = {}) {
|
|
128
|
+
let n = await b(t), r = performance.now(), i = { output_flag: t.outputFlag ?? !1 };
|
|
129
|
+
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), {
|
|
130
|
+
result: n.solve(e, i),
|
|
131
|
+
runTime: (performance.now() - r) / 1e3
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/highs-worker-client.ts
|
|
136
|
+
var S = null, C = 0, w = /* @__PURE__ */ new Map();
|
|
137
|
+
function T() {
|
|
138
|
+
if (typeof window > "u" || typeof Worker > "u") return null;
|
|
139
|
+
if (!S) try {
|
|
140
|
+
S = new Worker(new URL(
|
|
141
|
+
/* @vite-ignore */
|
|
142
|
+
"/assets/highs-worker-DeDWU6KI.js",
|
|
143
|
+
"" + import.meta.url
|
|
144
|
+
), { type: "module" }), S.onmessage = (e) => {
|
|
145
|
+
let { type: t, id: n, result: r, runTime: i, error: a } = e.data, o = w.get(n);
|
|
146
|
+
o && (w.delete(n), t === "SOLVE_SUCCESS" ? o.resolve({
|
|
147
|
+
result: r,
|
|
148
|
+
runTime: i
|
|
149
|
+
}) : o.reject(Error(a || "Worker solve failed")));
|
|
150
|
+
}, S.onerror = (e) => {
|
|
151
|
+
console.error("HiGHS Web Worker error:", e);
|
|
152
|
+
};
|
|
153
|
+
} catch (e) {
|
|
154
|
+
console.warn("Could not instantiate Web Worker, falling back to main thread:", e), S = null;
|
|
155
|
+
}
|
|
156
|
+
return S;
|
|
157
|
+
}
|
|
158
|
+
async function E(e, t = {}) {
|
|
159
|
+
let n = t.useWorker ?? typeof window < "u" ? T() : null;
|
|
160
|
+
if (!n) return x(e, t);
|
|
161
|
+
let r = await y(t.wasmUrl), i = {
|
|
162
|
+
...t,
|
|
163
|
+
wasmUrl: r
|
|
164
|
+
}, a = `req_${++C}`;
|
|
165
|
+
return new Promise((t, r) => {
|
|
166
|
+
w.set(a, {
|
|
167
|
+
resolve: t,
|
|
168
|
+
reject: r
|
|
169
|
+
}), n.postMessage({
|
|
170
|
+
type: "SOLVE",
|
|
171
|
+
id: a,
|
|
172
|
+
lpString: e,
|
|
173
|
+
options: i
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//#endregion
|
|
178
|
+
//#region src/modeler/solvers/highs.ts
|
|
179
|
+
var D = class e {
|
|
180
|
+
static capabilities = {
|
|
181
|
+
supportsMIP: !0,
|
|
182
|
+
supportsQP: !0
|
|
183
|
+
};
|
|
184
|
+
name = "HiGHS";
|
|
185
|
+
version = "1.15.3";
|
|
186
|
+
capabilities = e.capabilities;
|
|
187
|
+
options;
|
|
188
|
+
constructor(e = {}) {
|
|
189
|
+
this.options = e;
|
|
190
|
+
}
|
|
191
|
+
async solve(e, t, n = {}) {
|
|
192
|
+
let r = {
|
|
193
|
+
...this.options,
|
|
194
|
+
...n
|
|
195
|
+
}, { lpString: i, nameToVar: a, nameToConstraint: o } = t, { result: s, runTime: c } = await E(i, r), l = s.Status || "Unknown", u;
|
|
196
|
+
u = l.includes("Optimal") ? "Optimal" : l.includes("Infeasible") ? "Infeasible" : l.includes("Unbounded") ? "Unbounded" : l.includes("TimeLimit") || l.includes("Time limit") ? "TimeLimit" : l.includes("IterationLimit") ? "IterationLimit" : "Optimal";
|
|
197
|
+
let d = s.ObjectiveValue, f = typeof d == "number" ? d + e.objective.constant : null, p = {}, m = {}, h = {}, g = {};
|
|
198
|
+
if (s.Columns) for (let [e, t] of Object.entries(s.Columns)) {
|
|
199
|
+
let n = a.get(e);
|
|
200
|
+
if (n) {
|
|
201
|
+
let e = Math.abs(t.Primal) < 1e-9 ? 0 : t.Primal;
|
|
202
|
+
p[n.name] = e, t.Dual !== void 0 && (h[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (s.Rows) {
|
|
206
|
+
let e = Array.isArray(s.Rows) ? s.Rows : Object.values(s.Rows);
|
|
207
|
+
for (let t of e) {
|
|
208
|
+
let e = t.Name, n = o.get(e);
|
|
209
|
+
if (n && (t.Dual !== void 0 && (m[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual), t.Primal !== void 0)) {
|
|
210
|
+
let e = n.rhs - t.Primal;
|
|
211
|
+
g[n.name] = Math.abs(e) < 1e-9 ? 0 : e;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
status: u,
|
|
217
|
+
objectiveValue: f,
|
|
218
|
+
values: p,
|
|
219
|
+
reducedCosts: h,
|
|
220
|
+
duals: m,
|
|
221
|
+
slacks: g,
|
|
222
|
+
runTime: c,
|
|
223
|
+
raw: s
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}, O = D, k = class {
|
|
227
|
+
name;
|
|
228
|
+
capabilities;
|
|
229
|
+
options;
|
|
230
|
+
constructor(e = {}) {
|
|
231
|
+
this.name = e.name || "MockSolver", this.capabilities = e.capabilities || {
|
|
232
|
+
supportsMIP: !0,
|
|
233
|
+
supportsQP: !0
|
|
234
|
+
}, this.options = e;
|
|
235
|
+
}
|
|
236
|
+
async solve(e, t, n = {}) {
|
|
237
|
+
let r = {
|
|
238
|
+
...this.options,
|
|
239
|
+
...n
|
|
240
|
+
};
|
|
241
|
+
return r.delayMs && r.delayMs > 0 && await new Promise((e) => setTimeout(e, r.delayMs)), {
|
|
242
|
+
status: r.status || "Optimal",
|
|
243
|
+
objectiveValue: r.objectiveValue ?? 0,
|
|
244
|
+
values: r.values || {},
|
|
245
|
+
reducedCosts: r.reducedCosts,
|
|
246
|
+
duals: r.duals,
|
|
247
|
+
slacks: r.slacks,
|
|
248
|
+
runTime: .001,
|
|
249
|
+
raw: { mock: !0 }
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}, A = /* @__PURE__ */ new Map();
|
|
253
|
+
A.set("highs", (e) => new D(e)), A.set("glpk", (t) => new e(t)), A.set("mock", (e) => new k(e));
|
|
254
|
+
var j = (e) => new D(e);
|
|
255
|
+
function M(e, t) {
|
|
256
|
+
A.set(e.toLowerCase(), t);
|
|
257
|
+
}
|
|
258
|
+
function N(e) {
|
|
259
|
+
if (typeof e == "string") {
|
|
260
|
+
let t = A.get(e.toLowerCase());
|
|
261
|
+
if (!t) throw Error(`Solver '${e}' is not registered.`);
|
|
262
|
+
j = t;
|
|
263
|
+
} else j = typeof e == "function" ? e : () => e;
|
|
264
|
+
}
|
|
265
|
+
function P(e, t) {
|
|
266
|
+
if (!e) return j(t);
|
|
267
|
+
if (typeof e == "string") {
|
|
268
|
+
let n = A.get(e.toLowerCase());
|
|
269
|
+
if (!n) throw Error(`Solver '${e}' not found. Available solvers: ${F().join(", ")}`);
|
|
270
|
+
return n(t);
|
|
271
|
+
}
|
|
272
|
+
return e;
|
|
273
|
+
}
|
|
274
|
+
function F() {
|
|
275
|
+
return Array.from(A.keys());
|
|
276
|
+
}
|
|
277
|
+
//#endregion
|
|
278
|
+
//#region src/modeler/solvers/z3.ts
|
|
279
|
+
var I = null;
|
|
280
|
+
async function L() {
|
|
281
|
+
return I ||= (async () => {
|
|
282
|
+
try {
|
|
283
|
+
return await (await import("z3-solver")).init();
|
|
284
|
+
} catch (e) {
|
|
285
|
+
throw Error(`Failed to load z3-solver. Ensure it is installed: npm install z3-solver. Error: ${e instanceof Error ? e.message : String(e)}`);
|
|
286
|
+
}
|
|
287
|
+
})(), I;
|
|
288
|
+
}
|
|
289
|
+
var R = class {
|
|
290
|
+
name = "z3";
|
|
291
|
+
capabilities = {
|
|
292
|
+
supportsMIP: !0,
|
|
293
|
+
supportsQP: !1,
|
|
294
|
+
supportsSMT: !0,
|
|
295
|
+
supportsUnsatCore: !0
|
|
296
|
+
};
|
|
297
|
+
createContextTranslator(e) {
|
|
298
|
+
let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map();
|
|
299
|
+
function a(n) {
|
|
300
|
+
if (!t.has(n.name)) {
|
|
301
|
+
let r = n.type === "Continuous" || n.type === "CONTINUOUS" ? e.Real.const(n.name) : e.Int.const(n.name);
|
|
302
|
+
t.set(n.name, r);
|
|
303
|
+
}
|
|
304
|
+
return t.get(n.name);
|
|
305
|
+
}
|
|
306
|
+
function o(t) {
|
|
307
|
+
if (!n.has(t.name)) {
|
|
308
|
+
let r = e.Bool.const(t.name);
|
|
309
|
+
n.set(t.name, r);
|
|
310
|
+
}
|
|
311
|
+
return n.get(t.name);
|
|
312
|
+
}
|
|
313
|
+
function s(t) {
|
|
314
|
+
let n = null;
|
|
315
|
+
if (t && t.terms) for (let [e, r] of t.terms.entries()) {
|
|
316
|
+
let t = a(e).mul(r);
|
|
317
|
+
n = n === null ? t : n.add(t);
|
|
318
|
+
}
|
|
319
|
+
let r = t && typeof t.constant == "number" ? t.constant : 0;
|
|
320
|
+
if (r !== 0 || n === null) {
|
|
321
|
+
let t = e.Real.val(r);
|
|
322
|
+
n = n === null ? t : n.add(t);
|
|
323
|
+
}
|
|
324
|
+
return n;
|
|
325
|
+
}
|
|
326
|
+
function c(t) {
|
|
327
|
+
let n = null;
|
|
328
|
+
if (t.linearTerms) for (let [e, r] of t.linearTerms.entries()) {
|
|
329
|
+
let t = a(e).mul(r);
|
|
330
|
+
n = n === null ? t : n.add(t);
|
|
331
|
+
}
|
|
332
|
+
if (t.quadTerms) for (let e of t.quadTerms.values()) {
|
|
333
|
+
let t = a(e.var1), r = a(e.var2), i = t.mul(r).mul(e.coeff);
|
|
334
|
+
n = n === null ? i : n.add(i);
|
|
335
|
+
}
|
|
336
|
+
let r = t && typeof t.constant == "number" ? t.constant : 0;
|
|
337
|
+
if (r !== 0 || n === null) {
|
|
338
|
+
let t = e.Real.val(r);
|
|
339
|
+
n = n === null ? t : n.add(t);
|
|
340
|
+
}
|
|
341
|
+
return n;
|
|
342
|
+
}
|
|
343
|
+
function l(e) {
|
|
344
|
+
let t = e.lhs instanceof Object && "quadTerms" in e.lhs ? c(e.lhs) : s(e.lhs), n = typeof e.rhs == "number" ? e.rhs : 0;
|
|
345
|
+
return e.sense === "<=" ? t.le(n) : e.sense === ">=" ? t.ge(n) : t.eq(n);
|
|
346
|
+
}
|
|
347
|
+
function u(t) {
|
|
348
|
+
if (t instanceof r) return o(t);
|
|
349
|
+
if (t instanceof d) return l(t);
|
|
350
|
+
if (t instanceof i) switch (t.op) {
|
|
351
|
+
case "and": return e.And(...t.children.map(u));
|
|
352
|
+
case "or": return e.Or(...t.children.map(u));
|
|
353
|
+
case "not": return e.Not(u(t.children[0]));
|
|
354
|
+
case "implies": return e.Implies(u(t.children[0]), u(t.children[1]));
|
|
355
|
+
case "xor": return e.Xor(u(t.children[0]), u(t.children[1]));
|
|
356
|
+
default: throw Error(`Unsupported boolean operation: ${t.op}`);
|
|
357
|
+
}
|
|
358
|
+
throw Error(`Unknown logic element: ${String(t)}`);
|
|
359
|
+
}
|
|
360
|
+
function f(e) {
|
|
361
|
+
if (!e) return 0;
|
|
362
|
+
if (typeof e.asNumber == "function") return e.asNumber();
|
|
363
|
+
let t = e.toString();
|
|
364
|
+
if (t.startsWith("(/ ")) {
|
|
365
|
+
let e = t.slice(3, -1).trim().split(/\s+/);
|
|
366
|
+
if (e.length === 2) return Number(e[0]) / Number(e[1]);
|
|
367
|
+
}
|
|
368
|
+
return Number(t);
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
getVarAst: a,
|
|
372
|
+
getBoolVarAst: o,
|
|
373
|
+
translateLinExpr: s,
|
|
374
|
+
translateQuadExpr: c,
|
|
375
|
+
translateConstraint: l,
|
|
376
|
+
translateBoolExpr: u,
|
|
377
|
+
parseAstValue: f,
|
|
378
|
+
varAstMap: t,
|
|
379
|
+
boolVarAstMap: n
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
async check(e, t = {}) {
|
|
383
|
+
if (typeof window < "u" && window.document !== void 0) return this.fallbackCheck(e);
|
|
384
|
+
try {
|
|
385
|
+
let { Context: t } = await L(), n = new t(`check_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`), r = new n.Solver(), i = this.createContextTranslator(n), a = e.variables || e.vars || [], o = e.boolVars || [], s = e.constraints || [], c = e.logicalConstraints || [];
|
|
386
|
+
for (let e of a) {
|
|
387
|
+
let t = i.getVarAst(e);
|
|
388
|
+
e.lb !== -Infinity && r.add(t.ge(e.lb)), e.ub !== Infinity && r.add(t.le(e.ub)), (e.type === "Binary" || e.type === "BINARY") && (r.add(t.ge(0)), r.add(t.le(1)));
|
|
389
|
+
}
|
|
390
|
+
for (let e of s) {
|
|
391
|
+
let t = i.translateConstraint(e), a = n.Bool.const(e.name);
|
|
392
|
+
r.addAndTrack(t, a);
|
|
393
|
+
}
|
|
394
|
+
for (let e = 0; e < c.length; e++) {
|
|
395
|
+
let t = c[e], a = t && t.name || `lc_${e + 1}`, o = t && t.expr || t, s = i.translateBoolExpr(o), l = n.Bool.const(a);
|
|
396
|
+
r.addAndTrack(s, l);
|
|
397
|
+
}
|
|
398
|
+
let l = (await r.check()).toString();
|
|
399
|
+
if (l === "sat") {
|
|
400
|
+
let e = r.model(), t = {};
|
|
401
|
+
for (let n of a) {
|
|
402
|
+
let r = i.getVarAst(n), a = e.eval(r);
|
|
403
|
+
t[n.name] = i.parseAstValue(a);
|
|
404
|
+
}
|
|
405
|
+
for (let n of o) {
|
|
406
|
+
let r = i.getBoolVarAst(n), a = e.eval(r);
|
|
407
|
+
t[n.name] = a.toString() === "true";
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
status: "Sat",
|
|
411
|
+
values: t
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
if (l === "unsat") {
|
|
415
|
+
let e = r.unsatCore(), t = [], n = typeof e.length == "function" ? e.length() : e.length;
|
|
416
|
+
for (let r = 0; r < n; r++) t.push(e.get(r).toString());
|
|
417
|
+
return {
|
|
418
|
+
status: "Unsat",
|
|
419
|
+
values: {},
|
|
420
|
+
unsatCore: t
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
return {
|
|
424
|
+
status: "Unknown",
|
|
425
|
+
values: {}
|
|
426
|
+
};
|
|
427
|
+
} catch {
|
|
428
|
+
return this.fallbackCheck(e);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
fallbackCheck(e) {
|
|
432
|
+
let t = performance.now(), n = e.variables || e.vars || [], a = e.boolVars || [], o = e.constraints || [], s = e.logicalConstraints || [];
|
|
433
|
+
function c(e, t) {
|
|
434
|
+
let n = e.constant || 0;
|
|
435
|
+
if (e.terms && e.terms instanceof Map) for (let [r, i] of e.terms.entries()) {
|
|
436
|
+
let e = typeof r == "string" ? r : r.name;
|
|
437
|
+
n += i * (t.get(e) ?? 0);
|
|
438
|
+
}
|
|
439
|
+
return n;
|
|
440
|
+
}
|
|
441
|
+
function l(e, t) {
|
|
442
|
+
let n = c(e.lhs, t), r = 1e-6;
|
|
443
|
+
return e.sense === "<=" ? n <= e.rhs + r : e.sense === ">=" ? n >= e.rhs - r : e.sense === "==" && Math.abs(n - e.rhs) <= r;
|
|
444
|
+
}
|
|
445
|
+
function u(e, t, n) {
|
|
446
|
+
if (e instanceof r) return t.get(e.name) ?? !1;
|
|
447
|
+
if (e instanceof d) return l(e, n);
|
|
448
|
+
if (e instanceof i) switch (e.op) {
|
|
449
|
+
case "and": return e.children.every((e) => u(e, t, n));
|
|
450
|
+
case "or": return e.children.some((e) => u(e, t, n));
|
|
451
|
+
case "not": return !u(e.children[0], t, n);
|
|
452
|
+
case "implies": return !u(e.children[0], t, n) || u(e.children[1], t, n);
|
|
453
|
+
case "xor": return u(e.children[0], t, n) !== u(e.children[1], t, n);
|
|
454
|
+
}
|
|
455
|
+
return !1;
|
|
456
|
+
}
|
|
457
|
+
let f = /* @__PURE__ */ new Map();
|
|
458
|
+
for (let e of n) {
|
|
459
|
+
let t = /* @__PURE__ */ new Set();
|
|
460
|
+
e.lb !== -Infinity && t.add(e.lb), e.ub !== Infinity && t.add(e.ub), t.add(0);
|
|
461
|
+
for (let n of o) if (n.lhs.terms && n.lhs.terms.has(e)) {
|
|
462
|
+
let r = n.lhs.terms.get(e) || 1, i = (n.rhs - (n.lhs.constant || 0)) / r;
|
|
463
|
+
t.add(i), t.add(i - 1), t.add(i + 1);
|
|
464
|
+
}
|
|
465
|
+
for (let n of s) {
|
|
466
|
+
let r = n.expr || n, a = (n) => {
|
|
467
|
+
if (n instanceof d) {
|
|
468
|
+
if (n.lhs.terms && n.lhs.terms.has(e)) {
|
|
469
|
+
let r = n.lhs.terms.get(e) || 1, i = (n.rhs - (n.lhs.constant || 0)) / r;
|
|
470
|
+
t.add(i), t.add(i - 1), t.add(i + 1);
|
|
471
|
+
}
|
|
472
|
+
} else n instanceof i && n.children.forEach(a);
|
|
473
|
+
};
|
|
474
|
+
a(r);
|
|
475
|
+
}
|
|
476
|
+
if ((e.type === "Integer" || e.type === "INTEGER") && e.lb >= 0 && e.ub <= 25) for (let n = e.lb; n <= e.ub; n++) t.add(n);
|
|
477
|
+
f.set(e.name, Array.from(t).filter((t) => t >= (e.lb ?? -Infinity) && t <= (e.ub ?? Infinity)));
|
|
478
|
+
}
|
|
479
|
+
function p(e, t) {
|
|
480
|
+
let r = a.map((e) => e.name), i = 1 << r.length, o = n.map((e) => e.name), s = [/* @__PURE__ */ new Map()];
|
|
481
|
+
for (let e of o) {
|
|
482
|
+
let t = f.get(e) || [0], n = [];
|
|
483
|
+
for (let r of s) for (let i of t) {
|
|
484
|
+
let t = new Map(r);
|
|
485
|
+
t.set(e, i), n.push(t);
|
|
486
|
+
}
|
|
487
|
+
s = n.slice(0, 500);
|
|
488
|
+
}
|
|
489
|
+
for (let n = 0; n < i; n++) {
|
|
490
|
+
let i = /* @__PURE__ */ new Map();
|
|
491
|
+
for (let e = 0; e < r.length; e++) i.set(r[e], !!(n & 1 << e));
|
|
492
|
+
for (let n of s) if (e.every((e) => l(e, n)) && t.every((e) => u(e.expr, i, n))) return {
|
|
493
|
+
isSat: !0,
|
|
494
|
+
boolMap: i,
|
|
495
|
+
numMap: n
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
return { isSat: !1 };
|
|
499
|
+
}
|
|
500
|
+
let m = s.map((e, t) => ({
|
|
501
|
+
name: e?.name || `lc_${t + 1}`,
|
|
502
|
+
expr: e?.expr || e
|
|
503
|
+
})), h = p(o, m), g = (performance.now() - t) / 1e3;
|
|
504
|
+
if (h.isSat && h.boolMap && h.numMap) {
|
|
505
|
+
let e = {};
|
|
506
|
+
for (let [t, n] of h.numMap.entries()) e[t] = n;
|
|
507
|
+
for (let [t, n] of h.boolMap.entries()) e[t] = n;
|
|
508
|
+
return {
|
|
509
|
+
status: "Sat",
|
|
510
|
+
values: e,
|
|
511
|
+
runTime: g
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
let _ = [];
|
|
515
|
+
for (let e = 0; e < o.length; e++) p(o.filter((t, n) => n !== e), m).isSat && _.push(o[e].name);
|
|
516
|
+
for (let e = 0; e < m.length; e++) p(o, m.filter((t, n) => n !== e)).isSat && _.push(m[e].name);
|
|
517
|
+
return {
|
|
518
|
+
status: "Unsat",
|
|
519
|
+
values: {},
|
|
520
|
+
unsatCore: _.length > 0 ? _ : o.map((e) => e.name),
|
|
521
|
+
runTime: g
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
async solve(e, t, n = {}) {
|
|
525
|
+
if (!(e.objective !== null && e.objective !== void 0 && ("terms" in e.objective && e.objective.terms.size > 0 || "quadTerms" in e.objective && e.objective.quadTerms.length > 0 || e.objective.offset && e.objective.offset !== 0))) {
|
|
526
|
+
let t = await this.check(e, n), r = {};
|
|
527
|
+
for (let [e, n] of Object.entries(t.values)) r[e] = typeof n == "boolean" ? +!!n : n;
|
|
528
|
+
return {
|
|
529
|
+
status: t.status === "Sat" ? "Optimal" : t.status === "Unsat" ? "Infeasible" : "Error",
|
|
530
|
+
objectiveValue: 0,
|
|
531
|
+
values: r
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
let { Context: r } = await L(), i = new r(`opt_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`), a = new i.Optimize(), o = this.createContextTranslator(i), s = e.variables || e.vars || [], c = e.boolVars || [], l = e.constraints || [], u = e.logicalConstraints || [];
|
|
535
|
+
for (let e of s) {
|
|
536
|
+
let t = o.getVarAst(e);
|
|
537
|
+
e.lb !== -Infinity && a.add(t.ge(e.lb)), e.ub !== Infinity && a.add(t.le(e.ub)), (e.type === "Binary" || e.type === "BINARY") && (a.add(t.ge(0)), a.add(t.le(1)));
|
|
538
|
+
}
|
|
539
|
+
for (let e of l) {
|
|
540
|
+
let t = o.translateConstraint(e);
|
|
541
|
+
a.add(t);
|
|
542
|
+
}
|
|
543
|
+
for (let e of u) {
|
|
544
|
+
let t = e && e.expr || e, n = o.translateBoolExpr(t);
|
|
545
|
+
a.add(n);
|
|
546
|
+
}
|
|
547
|
+
let d = e.objective instanceof Object && "quadTerms" in e.objective ? o.translateQuadExpr(e.objective) : o.translateLinExpr(e.objective);
|
|
548
|
+
(e.sense || "MINIMIZE").toUpperCase() === "MAXIMIZE" ? a.maximize(d) : a.minimize(d);
|
|
549
|
+
let f = (await a.check()).toString();
|
|
550
|
+
if (f === "sat") {
|
|
551
|
+
let e = a.model(), t = {};
|
|
552
|
+
for (let n of s) {
|
|
553
|
+
let r = o.getVarAst(n), i = e.eval(r);
|
|
554
|
+
t[n.name] = o.parseAstValue(i);
|
|
555
|
+
}
|
|
556
|
+
for (let n of c) {
|
|
557
|
+
let r = o.getBoolVarAst(n), i = e.eval(r);
|
|
558
|
+
t[n.name] = +(i.toString() === "true");
|
|
559
|
+
}
|
|
560
|
+
return {
|
|
561
|
+
status: "Optimal",
|
|
562
|
+
objectiveValue: o.parseAstValue(e.eval(d)),
|
|
563
|
+
values: t
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
return f === "unsat" ? {
|
|
567
|
+
status: "Infeasible",
|
|
568
|
+
objectiveValue: null,
|
|
569
|
+
values: {}
|
|
570
|
+
} : {
|
|
571
|
+
status: "Error",
|
|
572
|
+
objectiveValue: null,
|
|
573
|
+
values: {}
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
function z() {
|
|
578
|
+
M("z3", () => new R());
|
|
579
|
+
}
|
|
580
|
+
z();
|
|
581
|
+
//#endregion
|
|
582
|
+
export { c as C, l as E, a as S, o as T, x as _, M as a, i as b, O as c, b as d, g as f, h as g, y as h, F as i, D as l, v as m, z as n, N as o, _ as p, P as r, k as s, R as t, f as u, d as v, s as w, r as x, n as y };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader for GLPK (GNU Linear Programming Kit) WebAssembly / JS engine.
|
|
3
|
+
* Supports both Node.js (glpk.js/node) and modern browsers (glpk.js worker).
|
|
4
|
+
*/
|
|
5
|
+
type GlpkInstance = any;
|
|
6
|
+
export declare function getGlpk(): Promise<GlpkInstance>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=glpk-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glpk-loader.d.ts","sourceRoot":"","sources":["../../src/glpk-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,YAAY,GAAG,GAAG,CAAC;AAIxB,wBAAsB,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CA0BrD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SolveOptions } from "./modeler/types.js";
|
|
2
|
+
export declare const OFFICIAL_HIGHS_CDN_WASM_URL = "https://cdn.jsdelivr.net/npm/highs@1.15.3/build/highs.wasm";
|
|
3
|
+
type HighsInstance = any;
|
|
4
|
+
export declare function setHighsWasmUrl(url: string | null): void;
|
|
5
|
+
export declare function getHighsWasmUrl(): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Check if the given byte array begins with the standard WebAssembly magic header (\0asm).
|
|
8
|
+
*/
|
|
9
|
+
export declare function isValidWasmHeader(bytes: Uint8Array): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Probe a URL to determine whether it serves a valid WebAssembly binary
|
|
12
|
+
* without downloading the entire file. Cancels the stream after checking the first chunk.
|
|
13
|
+
*/
|
|
14
|
+
export declare function probeWasmUrl(url: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the HiGHS WASM URL for browser / worker environments.
|
|
17
|
+
* - Explicit URLs (customWasmUrl or options.wasmUrl) are strictly used (no CDN fallback).
|
|
18
|
+
* - Default resolution probes the local origin; if missing or returning HTML, falls back to the official CDN.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveBrowserWasmUrl(explicitUrl?: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Get or initialize the HiGHS WebAssembly solver instance.
|
|
23
|
+
* Works seamlessly in Node.js, Web Browsers, and Web Workers.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getHighs(options?: SolveOptions): Promise<HighsInstance>;
|
|
26
|
+
export interface RawHighsSolveResult {
|
|
27
|
+
Status: string;
|
|
28
|
+
ObjectiveValue: number;
|
|
29
|
+
Columns: Record<string, {
|
|
30
|
+
Index: number;
|
|
31
|
+
Lower: number;
|
|
32
|
+
Upper: number;
|
|
33
|
+
Type: string;
|
|
34
|
+
Primal: number;
|
|
35
|
+
Dual?: number;
|
|
36
|
+
Name: string;
|
|
37
|
+
}>;
|
|
38
|
+
Rows?: Record<string, {
|
|
39
|
+
Index: number;
|
|
40
|
+
Lower: number;
|
|
41
|
+
Upper: number;
|
|
42
|
+
Dual?: number;
|
|
43
|
+
Primal?: number;
|
|
44
|
+
Name: string;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Solve an LP formatted model using HiGHS WASM
|
|
49
|
+
*/
|
|
50
|
+
export declare function solveLpWithHighs(lpString: string, options?: SolveOptions): Promise<{
|
|
51
|
+
result: RawHighsSolveResult;
|
|
52
|
+
runTime: number;
|
|
53
|
+
}>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=highs-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highs-loader.d.ts","sourceRoot":"","sources":["../../src/highs-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,2BAA2B,+DACsB,CAAC;AAE/D,KAAK,aAAa,GAAG,GAAG,CAAC;AAKzB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,QAIjD;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAQ5D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgChE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BjF;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoCjF;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B3D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SolveOptions } from "./modeler/types.js";
|
|
2
|
+
import { type RawHighsSolveResult } from "./highs-loader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Solve an LP model either in a background Web Worker or on the current thread
|
|
5
|
+
*/
|
|
6
|
+
export declare function solveLp(lpString: string, options?: SolveOptions & {
|
|
7
|
+
useWorker?: boolean;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
result: RawHighsSolveResult;
|
|
10
|
+
runTime: number;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=highs-worker-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highs-worker-client.d.ts","sourceRoot":"","sources":["../../src/highs-worker-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAgD3B;;GAEG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACnD,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highs-worker.d.ts","sourceRoot":"","sources":["../../src/highs-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opt-ts: Modern Mathematical Optimization Modeler for TypeScript & JavaScript
|
|
3
|
+
*
|
|
4
|
+
* Elegant PuLP/python-mip style modeling with WebAssembly (HiGHS) and pluggable solvers.
|
|
5
|
+
* Supports LP (Linear Programming), MIP (Mixed-Integer Programming), and QP (Quadratic Programming).
|
|
6
|
+
*/
|
|
7
|
+
export { Model, type ModelOptions, Var, type VarOptions, LinExpr, sum, xsum, lpSum, QuadExpr, type QuadTerm, Constraint, BoolVar, BoolExpr, BoolOp, and, or, not, implies, xor, parseExpr, parseConstraint, expr, c, generateLpString, type LpModelData, type LpExportResult, } from "./modeler/index.js";
|
|
8
|
+
export type { VarType, OptimizationSense, ComparisonSense, SolverStatus, SolveOptions, SolverSolution, } from "./modeler/types.js";
|
|
9
|
+
export { LpProblem, LpVariable, LpMinimize, LpMaximize, LpContinuous, LpInteger, LpBinary, LpStatus, value, } from "./modeler/pulp-compat.js";
|
|
10
|
+
export { MipModel, MINIMIZE, MAXIMIZE, CONTINUOUS, INTEGER, BINARY, maximize, minimize, } from "./modeler/mip-compat.js";
|
|
11
|
+
export { type Solver, type SolverOptions, type SolverResult, type SolverCheckResult, type SolverCapabilities, HighsSolver, HiGHS, GLPKSolver, Z3Solver, registerZ3Solver, MockSolver, registerSolver, getSolver, setDefaultSolver, listAvailableSolvers, } from "./modeler/solvers/index.js";
|
|
12
|
+
export { getHighs, solveLpWithHighs, setHighsWasmUrl, getHighsWasmUrl, OFFICIAL_HIGHS_CDN_WASM_URL, isValidWasmHeader, probeWasmUrl, resolveBrowserWasmUrl, } from "./highs-loader.js";
|
|
13
|
+
export { getGlpk } from "./glpk-loader.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|