@ohtaman/washi 0.1.2 → 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 +76 -2
- package/README.md +76 -2
- package/README.zh-CN.md +76 -2
- package/dist/browser/highs-worker.js +2 -2
- package/dist/browser/{highs-loader-T47YOyos.js → loader-CVt4CloI.js} +2 -2
- 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 +142 -476
- package/dist/browser/washi.min.js +3 -3
- package/dist/lib/async-mutex-Duo4jwzn.js +195 -0
- package/dist/lib/constraint-XWdn0ID9.js +93 -0
- package/dist/lib/highs-worker.js +2 -2
- package/dist/lib/{highs-loader-Blb99785.js → loader-Dti0v9yC.js} +1 -1
- 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 +400 -91
- 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/{highs-assets.d.ts → modeler/solvers/highs/assets.d.ts} +1 -1
- 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} +2 -2
- package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -0
- package/dist/types/{highs-node-runtime.d.ts → modeler/solvers/highs/node-runtime.d.ts} +1 -1
- 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/{highs-worker-factory.d.ts → modeler/solvers/highs/worker-factory.d.ts} +1 -1
- 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 -31
- 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/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 -35
- package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
- package/package.json +19 -5
- package/dist/browser/_washi-optional-engine-282Ug7Gw.js +0 -7
- package/dist/lib/glpk-5cUpjyb9.js +0 -135
- package/dist/lib/z3-C6GeIicJ.js +0 -509
- package/dist/types/glpk-loader.d.ts +0 -8
- package/dist/types/glpk-loader.d.ts.map +0 -1
- package/dist/types/highs-assets.d.ts.map +0 -1
- package/dist/types/highs-browser-runtime.d.ts +0 -2
- package/dist/types/highs-browser-runtime.d.ts.map +0 -1
- package/dist/types/highs-loader.d.ts.map +0 -1
- package/dist/types/highs-node-runtime.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-factory.d.ts.map +0 -1
- package/dist/types/highs-worker.d.ts +0 -2
- package/dist/types/highs-worker.d.ts.map +0 -1
- /package/dist/browser/{highs-browser-runtime-D13gHOT5.js → browser-runtime-D13gHOT5.js} +0 -0
package/dist/browser/washi.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./
|
|
1
|
+
import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./loader-CVt4CloI.js";
|
|
2
2
|
//#region src/modeler/boolean-expr.ts
|
|
3
3
|
var l = 0, u = class {
|
|
4
4
|
and(e) {
|
|
@@ -56,7 +56,7 @@ function _(...e) {
|
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/modeler/constraint.ts
|
|
59
|
-
var
|
|
59
|
+
var ee = 0, v = class {
|
|
60
60
|
id;
|
|
61
61
|
lhs;
|
|
62
62
|
sense;
|
|
@@ -65,7 +65,7 @@ var v = 0, y = class {
|
|
|
65
65
|
slack = null;
|
|
66
66
|
dual = null;
|
|
67
67
|
constructor(e, t, n, r) {
|
|
68
|
-
this.id = ++
|
|
68
|
+
this.id = ++ee, this.lhs = e, this.sense = t, this.rhs = n, this.name = r || `c_${this.id}`;
|
|
69
69
|
}
|
|
70
70
|
get pi() {
|
|
71
71
|
return this.dual;
|
|
@@ -92,11 +92,11 @@ var v = 0, y = class {
|
|
|
92
92
|
};
|
|
93
93
|
//#endregion
|
|
94
94
|
//#region src/modeler/quad-expr.ts
|
|
95
|
-
function
|
|
95
|
+
function y(e, t) {
|
|
96
96
|
let n = e.id, r = t.id;
|
|
97
97
|
return n <= r ? `${n}:${r}` : `${r}:${n}`;
|
|
98
98
|
}
|
|
99
|
-
var
|
|
99
|
+
var b = class e {
|
|
100
100
|
linearTerms;
|
|
101
101
|
quadTerms;
|
|
102
102
|
constant;
|
|
@@ -109,7 +109,7 @@ var x = class e {
|
|
|
109
109
|
return new e(this.linearTerms, this.quadTerms, this.constant);
|
|
110
110
|
}
|
|
111
111
|
getQuadCoeff(e, t) {
|
|
112
|
-
let n =
|
|
112
|
+
let n = y(e, t), r = this.quadTerms.get(n);
|
|
113
113
|
return r ? r.coeff : 0;
|
|
114
114
|
}
|
|
115
115
|
add(t) {
|
|
@@ -182,14 +182,14 @@ var x = class e {
|
|
|
182
182
|
return this.value;
|
|
183
183
|
}
|
|
184
184
|
static fromProduct(t, n, r = 1) {
|
|
185
|
-
let i = new e(), a =
|
|
185
|
+
let i = new e(), a = y(t, n);
|
|
186
186
|
return i.quadTerms.set(a, {
|
|
187
187
|
var1: t.id <= n.id ? t : n,
|
|
188
188
|
var2: t.id <= n.id ? n : t,
|
|
189
189
|
coeff: r
|
|
190
190
|
}), i;
|
|
191
191
|
}
|
|
192
|
-
},
|
|
192
|
+
}, x = class e {
|
|
193
193
|
terms;
|
|
194
194
|
constant;
|
|
195
195
|
constructor(e = /* @__PURE__ */ new Map(), t = 0) {
|
|
@@ -199,7 +199,7 @@ var x = class e {
|
|
|
199
199
|
return new e(this.terms, this.constant);
|
|
200
200
|
}
|
|
201
201
|
add(e) {
|
|
202
|
-
if (e instanceof
|
|
202
|
+
if (e instanceof b) return e.add(this);
|
|
203
203
|
let t = this.clone();
|
|
204
204
|
if (typeof e == "number") t.constant += e;
|
|
205
205
|
else if ("terms" in e) {
|
|
@@ -215,7 +215,7 @@ var x = class e {
|
|
|
215
215
|
return t;
|
|
216
216
|
}
|
|
217
217
|
sub(e) {
|
|
218
|
-
return e instanceof
|
|
218
|
+
return e instanceof b ? e.neg().add(this) : typeof e == "number" ? this.add(-e) : ("terms" in e, this.add(e.mul(-1)));
|
|
219
219
|
}
|
|
220
220
|
mul(t) {
|
|
221
221
|
if (typeof t == "number") {
|
|
@@ -226,9 +226,9 @@ var x = class e {
|
|
|
226
226
|
}
|
|
227
227
|
return n;
|
|
228
228
|
}
|
|
229
|
-
let n = new
|
|
229
|
+
let n = new b();
|
|
230
230
|
Math.abs(this.constant) >= 1e-12 && n.linearTerms.set(t, this.constant);
|
|
231
|
-
for (let [e, r] of this.terms) n = n.add(
|
|
231
|
+
for (let [e, r] of this.terms) n = n.add(b.fromProduct(e, t, r));
|
|
232
232
|
return n;
|
|
233
233
|
}
|
|
234
234
|
div(e) {
|
|
@@ -271,7 +271,7 @@ var x = class e {
|
|
|
271
271
|
let i = this.clone(), a = 0;
|
|
272
272
|
typeof n == "number" ? a = n : "terms" in n ? (i = i.sub(new e(n.terms, 0)), a = n.constant) : i = i.sub(n);
|
|
273
273
|
let o = a - i.constant;
|
|
274
|
-
return i.constant = 0, new
|
|
274
|
+
return i.constant = 0, new v(i, t, o, r);
|
|
275
275
|
}
|
|
276
276
|
toString() {
|
|
277
277
|
let e = [], t = !0;
|
|
@@ -286,7 +286,7 @@ var x = class e {
|
|
|
286
286
|
return e.join(" ") || "0";
|
|
287
287
|
}
|
|
288
288
|
};
|
|
289
|
-
function
|
|
289
|
+
function S(e, t) {
|
|
290
290
|
let n = /* @__PURE__ */ new Map(), r = 0, i = 0;
|
|
291
291
|
for (let a of e) {
|
|
292
292
|
let e = t ? t(a, i++) : a;
|
|
@@ -304,9 +304,9 @@ function C(e, t) {
|
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
for (let [e, t] of n) Math.abs(t) < 1e-12 && n.delete(e);
|
|
307
|
-
return new
|
|
307
|
+
return new x(n, r);
|
|
308
308
|
}
|
|
309
|
-
var
|
|
309
|
+
var C = S, w = S, T = 0, E = class e {
|
|
310
310
|
id;
|
|
311
311
|
name;
|
|
312
312
|
type;
|
|
@@ -315,7 +315,7 @@ var w = C, T = C, E = 0, D = class e {
|
|
|
315
315
|
value = null;
|
|
316
316
|
reducedCost = null;
|
|
317
317
|
constructor(e = {}) {
|
|
318
|
-
this.id = ++
|
|
318
|
+
this.id = ++T, this.name = e.name || `x_${this.id}`, this.type = e.type || "Continuous", this.type === "Binary" ? (this.lb = 0, this.ub = 1) : (this.lb = e.lb === void 0 ? 0 : e.lb, this.ub = e.ub === void 0 ? Infinity : e.ub);
|
|
319
319
|
}
|
|
320
320
|
get x() {
|
|
321
321
|
return this.value;
|
|
@@ -324,39 +324,39 @@ var w = C, T = C, E = 0, D = class e {
|
|
|
324
324
|
return this.value;
|
|
325
325
|
}
|
|
326
326
|
mul(t) {
|
|
327
|
-
if (typeof t == "number") return new
|
|
328
|
-
if (t instanceof e) return
|
|
329
|
-
let n = new
|
|
327
|
+
if (typeof t == "number") return new x(/* @__PURE__ */ new Map([[this, t]]), 0);
|
|
328
|
+
if (t instanceof e) return b.fromProduct(this, t, 1);
|
|
329
|
+
let n = new b();
|
|
330
330
|
Math.abs(t.constant) >= 1e-12 && n.linearTerms.set(this, t.constant);
|
|
331
331
|
for (let [e, r] of t.terms) {
|
|
332
|
-
let t =
|
|
332
|
+
let t = b.fromProduct(this, e, r);
|
|
333
333
|
n = n.add(t);
|
|
334
334
|
}
|
|
335
335
|
return n;
|
|
336
336
|
}
|
|
337
337
|
add(e) {
|
|
338
|
-
return e instanceof
|
|
338
|
+
return e instanceof b ? e.add(this) : new x(/* @__PURE__ */ new Map([[this, 1]]), 0).add(e);
|
|
339
339
|
}
|
|
340
340
|
sub(e) {
|
|
341
|
-
return e instanceof
|
|
341
|
+
return e instanceof b ? e.neg().add(this) : new x(/* @__PURE__ */ new Map([[this, 1]]), 0).sub(e);
|
|
342
342
|
}
|
|
343
343
|
neg() {
|
|
344
344
|
return this.mul(-1);
|
|
345
345
|
}
|
|
346
346
|
le(e, t) {
|
|
347
|
-
return new
|
|
347
|
+
return new x(/* @__PURE__ */ new Map([[this, 1]]), 0).le(e, t);
|
|
348
348
|
}
|
|
349
349
|
lessThanOrEqual(e, t) {
|
|
350
350
|
return this.le(e, t);
|
|
351
351
|
}
|
|
352
352
|
ge(e, t) {
|
|
353
|
-
return new
|
|
353
|
+
return new x(/* @__PURE__ */ new Map([[this, 1]]), 0).ge(e, t);
|
|
354
354
|
}
|
|
355
355
|
greaterThanOrEqual(e, t) {
|
|
356
356
|
return this.ge(e, t);
|
|
357
357
|
}
|
|
358
358
|
eq(e, t) {
|
|
359
|
-
return new
|
|
359
|
+
return new x(/* @__PURE__ */ new Map([[this, 1]]), 0).eq(e, t);
|
|
360
360
|
}
|
|
361
361
|
equalTo(e, t) {
|
|
362
362
|
return this.eq(e, t);
|
|
@@ -367,7 +367,7 @@ var w = C, T = C, E = 0, D = class e {
|
|
|
367
367
|
};
|
|
368
368
|
//#endregion
|
|
369
369
|
//#region src/modeler/parser.ts
|
|
370
|
-
function
|
|
370
|
+
function te(e) {
|
|
371
371
|
let t = [], n = 0, r = e.length;
|
|
372
372
|
for (; n < r;) {
|
|
373
373
|
let i = e[n];
|
|
@@ -423,7 +423,7 @@ function ee(e) {
|
|
|
423
423
|
}
|
|
424
424
|
return t;
|
|
425
425
|
}
|
|
426
|
-
var
|
|
426
|
+
var ne = class {
|
|
427
427
|
tokens;
|
|
428
428
|
pos = 0;
|
|
429
429
|
resolver;
|
|
@@ -485,12 +485,12 @@ var te = class {
|
|
|
485
485
|
let e = this.consume();
|
|
486
486
|
return this.resolveVariable(e.value).mul(t);
|
|
487
487
|
}
|
|
488
|
-
return new
|
|
488
|
+
return new x(/* @__PURE__ */ new Map(), t);
|
|
489
489
|
}
|
|
490
490
|
if (e.type === "IDENT") {
|
|
491
491
|
this.consume();
|
|
492
492
|
let t = this.resolveVariable(e.value);
|
|
493
|
-
return new
|
|
493
|
+
return new x(/* @__PURE__ */ new Map([[t, 1]]), 0);
|
|
494
494
|
}
|
|
495
495
|
if (e.type === "LPAREN") {
|
|
496
496
|
this.consume("LPAREN");
|
|
@@ -505,10 +505,10 @@ var te = class {
|
|
|
505
505
|
return t;
|
|
506
506
|
}
|
|
507
507
|
};
|
|
508
|
-
function
|
|
509
|
-
return new te(
|
|
508
|
+
function D(e, t) {
|
|
509
|
+
return new ne(te(e), t).parseExpression();
|
|
510
510
|
}
|
|
511
|
-
function
|
|
511
|
+
function O(e, t, n) {
|
|
512
512
|
let r = e.match(/(<=|>=|==|=<|=>|=)/);
|
|
513
513
|
if (!r) throw Error(`Constraint must contain a comparison operator (<=, >=, ==, =): "${e}"`);
|
|
514
514
|
let i = r[0], a = r.index, o = e.substring(0, a).trim(), s = e.substring(a + i.length).trim(), c;
|
|
@@ -516,18 +516,18 @@ function k(e, t, n) {
|
|
|
516
516
|
else if (i === ">=" || i === "=>") c = ">=";
|
|
517
517
|
else if (i === "==" || i === "=") c = "==";
|
|
518
518
|
else throw Error(`Unsupported operator "${i}"`);
|
|
519
|
-
let l =
|
|
519
|
+
let l = D(o, t), u = D(s, t);
|
|
520
520
|
return c === "<=" ? l.le(u, n) : c === ">=" ? l.ge(u, n) : l.eq(u, n);
|
|
521
521
|
}
|
|
522
|
-
function
|
|
522
|
+
function k(e, t) {
|
|
523
523
|
let n = /* @__PURE__ */ new Map(), r = "";
|
|
524
524
|
for (let i = 0; i < e.length; i++) if (r += e[i], i < t.length) {
|
|
525
525
|
let e = t[i];
|
|
526
526
|
if (typeof e == "number") r += `(${e})`;
|
|
527
|
-
else if (e instanceof
|
|
527
|
+
else if (e instanceof E) {
|
|
528
528
|
let t = `__v_${i}__`;
|
|
529
529
|
n.set(t, e), r += t;
|
|
530
|
-
} else if (e instanceof
|
|
530
|
+
} else if (e instanceof x) {
|
|
531
531
|
`${i}`, r += `(${e.toString()})`;
|
|
532
532
|
for (let [t] of e.terms) n.set(t.name, t);
|
|
533
533
|
}
|
|
@@ -537,42 +537,42 @@ function A(e, t) {
|
|
|
537
537
|
resolver: (e) => n.get(e)
|
|
538
538
|
};
|
|
539
539
|
}
|
|
540
|
-
function ne(e, ...t) {
|
|
541
|
-
let { fullText: n, resolver: r } = A(e, t);
|
|
542
|
-
return k(n, r);
|
|
543
|
-
}
|
|
544
540
|
function re(e, ...t) {
|
|
545
|
-
let { fullText: n, resolver: r } =
|
|
546
|
-
return
|
|
541
|
+
let { fullText: n, resolver: r } = k(e, t);
|
|
542
|
+
return O(n, r);
|
|
543
|
+
}
|
|
544
|
+
function ie(e, ...t) {
|
|
545
|
+
let { fullText: n, resolver: r } = k(e, t);
|
|
546
|
+
return /(<=|>=|==|=<|=>|=)/.test(n) ? O(n, r) : D(n, r);
|
|
547
547
|
}
|
|
548
548
|
//#endregion
|
|
549
549
|
//#region src/modeler/lp-writer.ts
|
|
550
|
-
function
|
|
550
|
+
function A(e, t, n) {
|
|
551
551
|
let r = e.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
552
552
|
return /^[0-9]/.test(r) && (r = `${t}_${r}`), (!r || r.length === 0) && (r = `${t}_${n}`), r;
|
|
553
553
|
}
|
|
554
|
-
function
|
|
554
|
+
function j(e) {
|
|
555
555
|
let { sense: t, objective: n, constraints: r, variables: i } = e, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Set();
|
|
556
556
|
for (let e of i) {
|
|
557
|
-
let t =
|
|
557
|
+
let t = A(e.name, "x", e.id), n = t, r = 1;
|
|
558
558
|
for (; c.has(n);) n = `${t}_${r++}`;
|
|
559
559
|
c.add(n), o.set(e, n), a.set(n, e);
|
|
560
560
|
}
|
|
561
561
|
let l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();
|
|
562
562
|
for (let e of r) {
|
|
563
|
-
let t =
|
|
563
|
+
let t = A(e.name, "c", e.id), n = t, r = 1;
|
|
564
564
|
for (; l.has(n);) n = `${t}_${r++}`;
|
|
565
565
|
l.add(n), u.set(e, n), s.set(n, e);
|
|
566
566
|
}
|
|
567
567
|
let d = [];
|
|
568
568
|
d.push(t === "Maximize" ? "Maximize" : "Minimize");
|
|
569
|
-
let f = [], p = !0, m = n instanceof
|
|
569
|
+
let f = [], p = !0, m = n instanceof b ? n.linearTerms : n.terms;
|
|
570
570
|
if (m) for (let [e, t] of m) {
|
|
571
571
|
if (Math.abs(t) < 1e-12) continue;
|
|
572
572
|
let n = o.get(e), r = t >= 0 ? p ? "" : "+ " : "- ", i = Math.abs(t), a = i === 1 ? "" : `${i} `;
|
|
573
573
|
f.push(`${r}${a}${n}`), p = !1;
|
|
574
574
|
}
|
|
575
|
-
if (n instanceof
|
|
575
|
+
if (n instanceof b && n.quadTerms.size > 0) {
|
|
576
576
|
let e = [], t = !0;
|
|
577
577
|
for (let r of n.quadTerms.values()) {
|
|
578
578
|
if (Math.abs(r.coeff) < 1e-12) continue;
|
|
@@ -623,8 +623,39 @@ function M(e) {
|
|
|
623
623
|
};
|
|
624
624
|
}
|
|
625
625
|
//#endregion
|
|
626
|
+
//#region src/modeler/solvers/registry.ts
|
|
627
|
+
var M = Symbol.for("washi.solverRegistry"), N = Symbol.for("washi.defaultSolverFactory"), P = globalThis;
|
|
628
|
+
P[M] || (P[M] = /* @__PURE__ */ new Map());
|
|
629
|
+
var F = P[M];
|
|
630
|
+
function I(e, t) {
|
|
631
|
+
F.set(e.toLowerCase(), t);
|
|
632
|
+
}
|
|
633
|
+
function L(e) {
|
|
634
|
+
if (typeof e == "string") {
|
|
635
|
+
let t = F.get(e.toLowerCase());
|
|
636
|
+
if (!t) throw Error(`Solver '${e}' is not registered.`);
|
|
637
|
+
P[N] = t;
|
|
638
|
+
} else P[N] = typeof e == "function" ? e : () => e;
|
|
639
|
+
}
|
|
640
|
+
function R(e, t) {
|
|
641
|
+
if (!e) {
|
|
642
|
+
let e = P[N] || F.get("highs");
|
|
643
|
+
if (!e) throw Error(`No default solver available. Available solvers: ${z().join(", ")}`);
|
|
644
|
+
return e(t);
|
|
645
|
+
}
|
|
646
|
+
if (typeof e == "string") {
|
|
647
|
+
let n = e.toLowerCase(), r = F.get(n);
|
|
648
|
+
if (!r) throw Error(n === "glpk" ? `Solver 'glpk' not found. Available solvers: ${z().join(", ")}. Please import '@ohtaman/washi/solvers/glpk' before selecting this solver.` : n === "z3" ? `Solver 'z3' not found. Available solvers: ${z().join(", ")}. Please import '@ohtaman/washi/solvers/z3' before selecting this solver.` : `Solver '${e}' not found. Available solvers: ${z().join(", ")}`);
|
|
649
|
+
return r(t);
|
|
650
|
+
}
|
|
651
|
+
return e;
|
|
652
|
+
}
|
|
653
|
+
function z() {
|
|
654
|
+
return Array.from(F.keys());
|
|
655
|
+
}
|
|
656
|
+
//#endregion
|
|
626
657
|
//#region \0washi-browser-worker-factory
|
|
627
|
-
function
|
|
658
|
+
function ae() {
|
|
628
659
|
let e = r("highs-worker.js");
|
|
629
660
|
if (new URL(e).origin === window.location.origin) return new Worker(e, { type: "module" });
|
|
630
661
|
let t = URL.createObjectURL(new Blob(["import " + JSON.stringify(e) + ";"], { type: "text/javascript" }));
|
|
@@ -636,42 +667,42 @@ function ie() {
|
|
|
636
667
|
}
|
|
637
668
|
}
|
|
638
669
|
//#endregion
|
|
639
|
-
//#region src/highs
|
|
640
|
-
var
|
|
641
|
-
function
|
|
670
|
+
//#region src/modeler/solvers/highs/worker-client.ts
|
|
671
|
+
var B = null, V = 0, H = /* @__PURE__ */ new Map();
|
|
672
|
+
function U() {
|
|
642
673
|
if (typeof window > "u" || typeof Worker > "u") return null;
|
|
643
|
-
if (!
|
|
644
|
-
|
|
645
|
-
let e =
|
|
646
|
-
|
|
647
|
-
let { type: t, id: n, result: r, runTime: i, error: a } = e.data, o =
|
|
648
|
-
o && (
|
|
674
|
+
if (!B) try {
|
|
675
|
+
B = ae();
|
|
676
|
+
let e = B;
|
|
677
|
+
B.onmessage = (e) => {
|
|
678
|
+
let { type: t, id: n, result: r, runTime: i, error: a } = e.data, o = H.get(n);
|
|
679
|
+
o && (H.delete(n), t === "SOLVE_SUCCESS" ? o.resolve({
|
|
649
680
|
result: r,
|
|
650
681
|
runTime: i
|
|
651
682
|
}) : o.reject(Error(a || "Worker solve failed")));
|
|
652
683
|
};
|
|
653
684
|
let t = (t) => {
|
|
654
|
-
if (
|
|
655
|
-
|
|
656
|
-
for (let e of
|
|
657
|
-
|
|
685
|
+
if (B === e) {
|
|
686
|
+
B = null, e.terminate();
|
|
687
|
+
for (let e of H.values()) e.reject(t);
|
|
688
|
+
H.clear();
|
|
658
689
|
}
|
|
659
690
|
};
|
|
660
|
-
|
|
661
|
-
} catch
|
|
662
|
-
|
|
691
|
+
B.onerror = (e) => t(/* @__PURE__ */ Error(`[WaSHI] HiGHS Worker failed to load or execute. Check Worker assets, CORS and CSP. ${e?.message || ""}`)), B.onmessageerror = () => t(/* @__PURE__ */ Error("[WaSHI] Could not deserialize the HiGHS Worker response."));
|
|
692
|
+
} catch {
|
|
693
|
+
B = null;
|
|
663
694
|
}
|
|
664
|
-
return
|
|
695
|
+
return B;
|
|
665
696
|
}
|
|
666
|
-
async function
|
|
667
|
-
let r = await a(n.wasmUrl), i = n.useWorker ?? typeof window < "u" ?
|
|
697
|
+
async function W(e, n = {}) {
|
|
698
|
+
let r = await a(n.wasmUrl), i = n.useWorker ?? typeof window < "u" ? U() : null;
|
|
668
699
|
if (!i) return t(e, n);
|
|
669
700
|
let o = {
|
|
670
701
|
...n,
|
|
671
702
|
wasmUrl: r
|
|
672
|
-
}, s = `req_${++
|
|
703
|
+
}, s = `req_${++V}`;
|
|
673
704
|
return new Promise((t, n) => {
|
|
674
|
-
|
|
705
|
+
H.set(s, {
|
|
675
706
|
resolve: t,
|
|
676
707
|
reject: n
|
|
677
708
|
});
|
|
@@ -683,13 +714,13 @@ async function se(e, n = {}) {
|
|
|
683
714
|
options: o
|
|
684
715
|
});
|
|
685
716
|
} catch (e) {
|
|
686
|
-
|
|
717
|
+
H.delete(s), n(e);
|
|
687
718
|
}
|
|
688
719
|
});
|
|
689
720
|
}
|
|
690
721
|
//#endregion
|
|
691
|
-
//#region src/modeler/solvers/highs.ts
|
|
692
|
-
function
|
|
722
|
+
//#region src/modeler/solvers/highs/solver.ts
|
|
723
|
+
function G(e) {
|
|
693
724
|
if (typeof e != "string") return "Unknown";
|
|
694
725
|
let t = e.trim();
|
|
695
726
|
if (!t) return "Unknown";
|
|
@@ -718,7 +749,7 @@ function ce(e) {
|
|
|
718
749
|
let n = t.toLowerCase();
|
|
719
750
|
return n.includes("infeasible") && n.includes("unbounded") ? "Unknown" : n.includes("infeasible") ? "Infeasible" : n.includes("unbounded") ? "Unbounded" : n.includes("time limit") || n.includes("timelimit") ? "TimeLimit" : n.includes("iteration limit") || n.includes("iterationlimit") ? "IterationLimit" : n.includes("error") ? "Error" : n === "optimal" ? "Optimal" : "Unknown";
|
|
720
751
|
}
|
|
721
|
-
var
|
|
752
|
+
var K = class e {
|
|
722
753
|
static capabilities = {
|
|
723
754
|
supportsMIP: !0,
|
|
724
755
|
supportsQP: !0
|
|
@@ -734,7 +765,7 @@ var F = class e {
|
|
|
734
765
|
let r = {
|
|
735
766
|
...this.options,
|
|
736
767
|
...n
|
|
737
|
-
}, { lpString: i, nameToVar: a, nameToConstraint: o } = t, { result: s, runTime: c } = await
|
|
768
|
+
}, { lpString: i, nameToVar: a, nameToConstraint: o } = t, { result: s, runTime: c } = await W(i, r), l = G(s?.Status), u = s.ObjectiveValue, d = typeof u == "number" ? u + e.objective.constant : null, f = {}, p = {}, m = {}, h = {};
|
|
738
769
|
if (s.Columns) for (let [e, t] of Object.entries(s.Columns)) {
|
|
739
770
|
let n = a.get(e);
|
|
740
771
|
if (n) {
|
|
@@ -763,129 +794,14 @@ var F = class e {
|
|
|
763
794
|
raw: s
|
|
764
795
|
};
|
|
765
796
|
}
|
|
766
|
-
},
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
try {
|
|
770
|
-
let e = await import("./_washi-optional-engine-282Ug7Gw.js");
|
|
771
|
-
return await (e.default || e)();
|
|
772
|
-
} catch (e) {
|
|
773
|
-
throw Error("[WaSHI] Could not load GLPK. Install the optional glpk.js dependency before selecting this solver.", { cause: e });
|
|
774
|
-
}
|
|
775
|
-
})(), I);
|
|
797
|
+
}, q = K;
|
|
798
|
+
function oe() {
|
|
799
|
+
I("highs", (e) => new K(e)), L((e) => new K(e));
|
|
776
800
|
}
|
|
801
|
+
oe();
|
|
777
802
|
//#endregion
|
|
778
|
-
//#region src/modeler/solvers/
|
|
779
|
-
var
|
|
780
|
-
static capabilities = {
|
|
781
|
-
supportsMIP: !0,
|
|
782
|
-
supportsQP: !1
|
|
783
|
-
};
|
|
784
|
-
name = "GLPK";
|
|
785
|
-
version = "5.0.0";
|
|
786
|
-
capabilities = e.capabilities;
|
|
787
|
-
options;
|
|
788
|
-
constructor(e = {}) {
|
|
789
|
-
this.options = e;
|
|
790
|
-
}
|
|
791
|
-
async solve(e, t, n = {}) {
|
|
792
|
-
let r = {
|
|
793
|
-
...this.options,
|
|
794
|
-
...n
|
|
795
|
-
}, i = await L(), { nameToVar: a, nameToConstraint: o } = t, s = /* @__PURE__ */ new Map();
|
|
796
|
-
for (let [e, t] of a.entries()) s.set(t, e);
|
|
797
|
-
let c = /* @__PURE__ */ new Map();
|
|
798
|
-
for (let [e, t] of o.entries()) c.set(t, e);
|
|
799
|
-
let l = [], u = "linearTerms" in e.objective ? e.objective.linearTerms : e.objective.terms;
|
|
800
|
-
if (u) for (let [e, t] of u) {
|
|
801
|
-
if (Math.abs(t) < 1e-12) continue;
|
|
802
|
-
let n = s.get(e) || e.name;
|
|
803
|
-
l.push({
|
|
804
|
-
name: n,
|
|
805
|
-
coef: Number(t)
|
|
806
|
-
});
|
|
807
|
-
}
|
|
808
|
-
let d = [];
|
|
809
|
-
for (let t of e.constraints) {
|
|
810
|
-
let e = c.get(t) || t.name || `c_${d.length + 1}`, n = [];
|
|
811
|
-
for (let [e, r] of t.lhs.terms) {
|
|
812
|
-
if (Math.abs(r) < 1e-12) continue;
|
|
813
|
-
let t = s.get(e) || e.name;
|
|
814
|
-
n.push({
|
|
815
|
-
name: t,
|
|
816
|
-
coef: Number(r)
|
|
817
|
-
});
|
|
818
|
-
}
|
|
819
|
-
let r;
|
|
820
|
-
r = t.sense === "==" ? {
|
|
821
|
-
type: i.GLP_FX,
|
|
822
|
-
lb: t.rhs,
|
|
823
|
-
ub: t.rhs
|
|
824
|
-
} : t.sense === "<=" ? {
|
|
825
|
-
type: i.GLP_UP,
|
|
826
|
-
lb: -Infinity,
|
|
827
|
-
ub: t.rhs
|
|
828
|
-
} : {
|
|
829
|
-
type: i.GLP_LO,
|
|
830
|
-
lb: t.rhs,
|
|
831
|
-
ub: Infinity
|
|
832
|
-
}, d.push({
|
|
833
|
-
name: e,
|
|
834
|
-
vars: n,
|
|
835
|
-
bnds: r
|
|
836
|
-
});
|
|
837
|
-
}
|
|
838
|
-
let f = [], p = [], m = [];
|
|
839
|
-
for (let t of e.variables) {
|
|
840
|
-
let e = s.get(t) || t.name;
|
|
841
|
-
t.type === "Binary" ? f.push(e) : t.type === "Integer" && p.push(e);
|
|
842
|
-
let n = t.lb, r = t.ub, a;
|
|
843
|
-
a = n === -Infinity && r === Infinity ? i.GLP_FR : n !== -Infinity && r === Infinity ? i.GLP_LO : n === -Infinity && r !== Infinity ? i.GLP_UP : n === r ? i.GLP_FX : i.GLP_DB, m.push({
|
|
844
|
-
name: e,
|
|
845
|
-
type: a,
|
|
846
|
-
lb: n === -Infinity ? 0 : n,
|
|
847
|
-
ub: r === Infinity ? 0 : r
|
|
848
|
-
});
|
|
849
|
-
}
|
|
850
|
-
let h = {
|
|
851
|
-
name: e.name || "GLPK_Model",
|
|
852
|
-
objective: {
|
|
853
|
-
direction: e.sense === "Maximize" ? i.GLP_MAX : i.GLP_MIN,
|
|
854
|
-
name: "obj",
|
|
855
|
-
vars: l
|
|
856
|
-
},
|
|
857
|
-
subjectTo: d
|
|
858
|
-
};
|
|
859
|
-
m.length > 0 && (h.bounds = m), f.length > 0 && (h.binaries = f), p.length > 0 && (h.generals = p);
|
|
860
|
-
let g = {
|
|
861
|
-
msglev: r.verbose ? i.GLP_MSG_ALL : i.GLP_MSG_OFF,
|
|
862
|
-
presol: r.presolve !== "off"
|
|
863
|
-
};
|
|
864
|
-
typeof r.timeLimit == "number" && (g.tmlim = r.timeLimit), typeof r.mipGap == "number" && (g.mipgap = r.mipGap);
|
|
865
|
-
let _ = performance.now(), v = await i.solve(h, g), y = (performance.now() - _) / 1e3, b = v?.result?.status, x;
|
|
866
|
-
x = b === i.GLP_OPT ? "Optimal" : b === i.GLP_FEAS ? "Feasible" : b === i.GLP_INFEAS || b === i.GLP_NOFEAS ? "Infeasible" : b === i.GLP_UNBND ? "Unbounded" : "Optimal";
|
|
867
|
-
let S = v?.result?.z, C = typeof S == "number" ? S + e.objective.constant : null, w = {}, T = v?.result?.vars || {};
|
|
868
|
-
for (let [e, t] of Object.entries(T)) {
|
|
869
|
-
let n = a.get(e), r = n ? n.name : e;
|
|
870
|
-
w[r] = typeof t == "number" ? Math.abs(t) < 1e-9 ? 0 : t : 0;
|
|
871
|
-
}
|
|
872
|
-
for (let t of e.variables) w[t.name] === void 0 && (w[t.name] = 0);
|
|
873
|
-
let E = {};
|
|
874
|
-
if (v?.result?.dual) for (let [e, t] of Object.entries(v.result.dual)) {
|
|
875
|
-
let n = o.get(e), r = n ? n.name : e;
|
|
876
|
-
E[r] = Number(t);
|
|
877
|
-
}
|
|
878
|
-
return {
|
|
879
|
-
status: x,
|
|
880
|
-
objectiveValue: C,
|
|
881
|
-
values: w,
|
|
882
|
-
duals: E,
|
|
883
|
-
runTime: v?.time || y,
|
|
884
|
-
logs: [`GLPK solved in ${(v?.time || y) * 1e3} ms.`],
|
|
885
|
-
raw: v
|
|
886
|
-
};
|
|
887
|
-
}
|
|
888
|
-
}, z = class {
|
|
803
|
+
//#region src/modeler/solvers/mock.ts
|
|
804
|
+
var J = class {
|
|
889
805
|
name;
|
|
890
806
|
capabilities;
|
|
891
807
|
options;
|
|
@@ -911,265 +827,11 @@ var R = class e {
|
|
|
911
827
|
raw: { mock: !0 }
|
|
912
828
|
};
|
|
913
829
|
}
|
|
914
|
-
}, B = /* @__PURE__ */ new Map();
|
|
915
|
-
B.set("highs", (e) => new F(e)), B.set("glpk", (e) => new R(e)), B.set("mock", (e) => new z(e));
|
|
916
|
-
var V = (e) => new F(e);
|
|
917
|
-
function H(e, t) {
|
|
918
|
-
B.set(e.toLowerCase(), t);
|
|
919
|
-
}
|
|
920
|
-
function ue(e) {
|
|
921
|
-
if (typeof e == "string") {
|
|
922
|
-
let t = B.get(e.toLowerCase());
|
|
923
|
-
if (!t) throw Error(`Solver '${e}' is not registered.`);
|
|
924
|
-
V = t;
|
|
925
|
-
} else V = typeof e == "function" ? e : () => e;
|
|
926
|
-
}
|
|
927
|
-
function U(e, t) {
|
|
928
|
-
if (!e) return V(t);
|
|
929
|
-
if (typeof e == "string") {
|
|
930
|
-
let n = B.get(e.toLowerCase());
|
|
931
|
-
if (!n) throw Error(`Solver '${e}' not found. Available solvers: ${W().join(", ")}`);
|
|
932
|
-
return n(t);
|
|
933
|
-
}
|
|
934
|
-
return e;
|
|
935
|
-
}
|
|
936
|
-
function W() {
|
|
937
|
-
return Array.from(B.keys());
|
|
938
|
-
}
|
|
939
|
-
//#endregion
|
|
940
|
-
//#region src/modeler/solvers/z3.ts
|
|
941
|
-
var G = null;
|
|
942
|
-
async function K() {
|
|
943
|
-
if (!G) {
|
|
944
|
-
let e = (async () => {
|
|
945
|
-
try {
|
|
946
|
-
return await (await import("./_washi-optional-engine-282Ug7Gw.js")).init();
|
|
947
|
-
} catch (e) {
|
|
948
|
-
throw Error(`[WaSHI] Failed to load z3-solver. Ensure the optional dependency is installed (npm install z3-solver) and supported in this environment. Error: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
949
|
-
}
|
|
950
|
-
})();
|
|
951
|
-
e.catch(() => {
|
|
952
|
-
G === e && (G = null);
|
|
953
|
-
}), G = e;
|
|
954
|
-
}
|
|
955
|
-
return G;
|
|
956
|
-
}
|
|
957
|
-
var q = class {
|
|
958
|
-
name = "z3";
|
|
959
|
-
capabilities = {
|
|
960
|
-
supportsMIP: !0,
|
|
961
|
-
supportsQP: !1,
|
|
962
|
-
supportsSMT: !0,
|
|
963
|
-
supportsUnsatCore: !0
|
|
964
|
-
};
|
|
965
|
-
createContextTranslator(e) {
|
|
966
|
-
let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map();
|
|
967
|
-
function r(n) {
|
|
968
|
-
if (!t.has(n.name)) {
|
|
969
|
-
let r = n.type === "Continuous" || n.type === "CONTINUOUS" ? e.Real.const(n.name) : e.Int.const(n.name);
|
|
970
|
-
t.set(n.name, r);
|
|
971
|
-
}
|
|
972
|
-
return t.get(n.name);
|
|
973
|
-
}
|
|
974
|
-
function i(t) {
|
|
975
|
-
if (!n.has(t.name)) {
|
|
976
|
-
let r = e.Bool.const(t.name);
|
|
977
|
-
n.set(t.name, r);
|
|
978
|
-
}
|
|
979
|
-
return n.get(t.name);
|
|
980
|
-
}
|
|
981
|
-
function a(t) {
|
|
982
|
-
return typeof e.isInt == "function" && e.isInt(t) ? e.ToReal(t) : t;
|
|
983
|
-
}
|
|
984
|
-
function o(t, n) {
|
|
985
|
-
let r = typeof e.isInt == "function" && e.isInt(t), i = typeof e.isInt == "function" && e.isInt(n);
|
|
986
|
-
return r && i ? t.add(n) : a(t).add(a(n));
|
|
987
|
-
}
|
|
988
|
-
function s(t, n) {
|
|
989
|
-
return typeof e.isInt == "function" && e.isInt(t) && Number.isInteger(n) ? t.mul(e.Int.val(n)) : a(t).mul(e.Real.val(n));
|
|
990
|
-
}
|
|
991
|
-
function c(t, n) {
|
|
992
|
-
let r = typeof e.isInt == "function" && e.isInt(t), i = typeof e.isInt == "function" && e.isInt(n);
|
|
993
|
-
return r && i ? t.mul(n) : a(t).mul(a(n));
|
|
994
|
-
}
|
|
995
|
-
function l(t, n) {
|
|
996
|
-
return n && Number.isInteger(t) ? e.Int.val(t) : e.Real.val(t);
|
|
997
|
-
}
|
|
998
|
-
function u(t, n, r) {
|
|
999
|
-
let i = typeof e.isInt == "function" && e.isInt(t) && Number.isInteger(r), o = i ? t : a(t), s = i ? e.Int.val(r) : e.Real.val(r);
|
|
1000
|
-
return n === "<=" ? o.le(s) : n === ">=" ? o.ge(s) : o.eq(s);
|
|
1001
|
-
}
|
|
1002
|
-
function p(t) {
|
|
1003
|
-
let n = null;
|
|
1004
|
-
if (t && t.terms) for (let [e, i] of t.terms.entries()) {
|
|
1005
|
-
let t = s(r(e), i);
|
|
1006
|
-
n = n === null ? t : o(n, t);
|
|
1007
|
-
}
|
|
1008
|
-
let i = t && typeof t.constant == "number" ? t.constant : 0;
|
|
1009
|
-
if (i !== 0 || n === null) {
|
|
1010
|
-
let t = l(i, n === null || typeof e.isInt == "function" && e.isInt(n));
|
|
1011
|
-
n = n === null ? t : o(n, t);
|
|
1012
|
-
}
|
|
1013
|
-
return n;
|
|
1014
|
-
}
|
|
1015
|
-
function m(t) {
|
|
1016
|
-
let n = null;
|
|
1017
|
-
if (t.linearTerms) for (let [e, i] of t.linearTerms.entries()) {
|
|
1018
|
-
let t = s(r(e), i);
|
|
1019
|
-
n = n === null ? t : o(n, t);
|
|
1020
|
-
}
|
|
1021
|
-
if (t.quadTerms) for (let e of t.quadTerms.values()) {
|
|
1022
|
-
let t = s(c(r(e.var1), r(e.var2)), e.coeff);
|
|
1023
|
-
n = n === null ? t : o(n, t);
|
|
1024
|
-
}
|
|
1025
|
-
let i = t && typeof t.constant == "number" ? t.constant : 0;
|
|
1026
|
-
if (i !== 0 || n === null) {
|
|
1027
|
-
let t = l(i, n === null || typeof e.isInt == "function" && e.isInt(n));
|
|
1028
|
-
n = n === null ? t : o(n, t);
|
|
1029
|
-
}
|
|
1030
|
-
return n;
|
|
1031
|
-
}
|
|
1032
|
-
function h(e) {
|
|
1033
|
-
let t = e.lhs instanceof Object && "quadTerms" in e.lhs ? m(e.lhs) : p(e.lhs), n = typeof e.rhs == "number" ? e.rhs : 0;
|
|
1034
|
-
return u(t, e.sense, n);
|
|
1035
|
-
}
|
|
1036
|
-
function g(t) {
|
|
1037
|
-
if (t instanceof d) return i(t);
|
|
1038
|
-
if (t instanceof y) return h(t);
|
|
1039
|
-
if (t instanceof f) switch (t.op) {
|
|
1040
|
-
case "and": return e.And(...t.children.map(g));
|
|
1041
|
-
case "or": return e.Or(...t.children.map(g));
|
|
1042
|
-
case "not": return e.Not(g(t.children[0]));
|
|
1043
|
-
case "implies": return e.Implies(g(t.children[0]), g(t.children[1]));
|
|
1044
|
-
case "xor": return e.Xor(g(t.children[0]), g(t.children[1]));
|
|
1045
|
-
default: throw Error(`Unsupported boolean operation: ${t.op}`);
|
|
1046
|
-
}
|
|
1047
|
-
throw Error(`Unknown logic element: ${String(t)}`);
|
|
1048
|
-
}
|
|
1049
|
-
function _(e) {
|
|
1050
|
-
if (!e) return 0;
|
|
1051
|
-
if (typeof e.asNumber == "function") return e.asNumber();
|
|
1052
|
-
let t = e.toString();
|
|
1053
|
-
if (t.startsWith("(/ ")) {
|
|
1054
|
-
let e = t.slice(3, -1).trim().split(/\s+/);
|
|
1055
|
-
if (e.length === 2) return Number(e[0]) / Number(e[1]);
|
|
1056
|
-
}
|
|
1057
|
-
return Number(t);
|
|
1058
|
-
}
|
|
1059
|
-
return {
|
|
1060
|
-
getVarAst: r,
|
|
1061
|
-
getBoolVarAst: i,
|
|
1062
|
-
compareAstWithNumber: u,
|
|
1063
|
-
translateLinExpr: p,
|
|
1064
|
-
translateQuadExpr: m,
|
|
1065
|
-
translateConstraint: h,
|
|
1066
|
-
translateBoolExpr: g,
|
|
1067
|
-
parseAstValue: _,
|
|
1068
|
-
varAstMap: t,
|
|
1069
|
-
boolVarAstMap: n
|
|
1070
|
-
};
|
|
1071
|
-
}
|
|
1072
|
-
async check(e, t = {}) {
|
|
1073
|
-
let { Context: n } = await K(), r = new n(`check_${Date.now()}_${Math.random().toString(36).substring(2, 7)}`), i = new r.Solver(), a = this.createContextTranslator(r), o = e.variables || e.vars || [], s = e.boolVars || [], c = e.constraints || [], l = e.logicalConstraints || [];
|
|
1074
|
-
for (let e of o) {
|
|
1075
|
-
let t = a.getVarAst(e);
|
|
1076
|
-
e.lb !== -Infinity && i.add(a.compareAstWithNumber(t, ">=", e.lb)), e.ub !== Infinity && i.add(a.compareAstWithNumber(t, "<=", e.ub)), (e.type === "Binary" || e.type === "BINARY") && (i.add(a.compareAstWithNumber(t, ">=", 0)), i.add(a.compareAstWithNumber(t, "<=", 1)));
|
|
1077
|
-
}
|
|
1078
|
-
for (let e of c) {
|
|
1079
|
-
let t = a.translateConstraint(e), n = r.Bool.const(e.name);
|
|
1080
|
-
i.addAndTrack(t, n);
|
|
1081
|
-
}
|
|
1082
|
-
for (let e = 0; e < l.length; e++) {
|
|
1083
|
-
let t = l[e], n = t && t.name || `lc_${e + 1}`, o = t && t.expr || t, s = a.translateBoolExpr(o), c = r.Bool.const(n);
|
|
1084
|
-
i.addAndTrack(s, c);
|
|
1085
|
-
}
|
|
1086
|
-
let u = (await i.check()).toString();
|
|
1087
|
-
if (u === "sat") {
|
|
1088
|
-
let e = i.model(), t = {};
|
|
1089
|
-
for (let n of o) {
|
|
1090
|
-
let r = a.getVarAst(n), i = e.eval(r);
|
|
1091
|
-
t[n.name] = a.parseAstValue(i);
|
|
1092
|
-
}
|
|
1093
|
-
for (let n of s) {
|
|
1094
|
-
let r = a.getBoolVarAst(n), i = e.eval(r);
|
|
1095
|
-
t[n.name] = i.toString() === "true";
|
|
1096
|
-
}
|
|
1097
|
-
return {
|
|
1098
|
-
status: "Sat",
|
|
1099
|
-
values: t
|
|
1100
|
-
};
|
|
1101
|
-
}
|
|
1102
|
-
if (u === "unsat") {
|
|
1103
|
-
let e = i.unsatCore(), t = [], n = typeof e.length == "function" ? e.length() : e.length;
|
|
1104
|
-
for (let r = 0; r < n; r++) t.push(e.get(r).toString());
|
|
1105
|
-
return {
|
|
1106
|
-
status: "Unsat",
|
|
1107
|
-
values: {},
|
|
1108
|
-
unsatCore: t
|
|
1109
|
-
};
|
|
1110
|
-
}
|
|
1111
|
-
return {
|
|
1112
|
-
status: "Unknown",
|
|
1113
|
-
values: {}
|
|
1114
|
-
};
|
|
1115
|
-
}
|
|
1116
|
-
async solve(e, t, n = {}) {
|
|
1117
|
-
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))) {
|
|
1118
|
-
let t = await this.check(e, n), r = {};
|
|
1119
|
-
for (let [e, n] of Object.entries(t.values)) r[e] = typeof n == "boolean" ? +!!n : n;
|
|
1120
|
-
return {
|
|
1121
|
-
status: t.status === "Sat" ? "Optimal" : t.status === "Unsat" ? "Infeasible" : "Error",
|
|
1122
|
-
objectiveValue: 0,
|
|
1123
|
-
values: r
|
|
1124
|
-
};
|
|
1125
|
-
}
|
|
1126
|
-
let { Context: r } = await K(), 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 || [];
|
|
1127
|
-
for (let e of s) {
|
|
1128
|
-
let t = o.getVarAst(e);
|
|
1129
|
-
e.lb !== -Infinity && a.add(o.compareAstWithNumber(t, ">=", e.lb)), e.ub !== Infinity && a.add(o.compareAstWithNumber(t, "<=", e.ub)), (e.type === "Binary" || e.type === "BINARY") && (a.add(o.compareAstWithNumber(t, ">=", 0)), a.add(o.compareAstWithNumber(t, "<=", 1)));
|
|
1130
|
-
}
|
|
1131
|
-
for (let e of l) {
|
|
1132
|
-
let t = o.translateConstraint(e);
|
|
1133
|
-
a.add(t);
|
|
1134
|
-
}
|
|
1135
|
-
for (let e of u) {
|
|
1136
|
-
let t = e && e.expr || e, n = o.translateBoolExpr(t);
|
|
1137
|
-
a.add(n);
|
|
1138
|
-
}
|
|
1139
|
-
let d = e.objective instanceof Object && "quadTerms" in e.objective ? o.translateQuadExpr(e.objective) : o.translateLinExpr(e.objective);
|
|
1140
|
-
(e.sense || "MINIMIZE").toUpperCase() === "MAXIMIZE" ? a.maximize(d) : a.minimize(d);
|
|
1141
|
-
let f = (await a.check()).toString();
|
|
1142
|
-
if (f === "sat") {
|
|
1143
|
-
let e = a.model(), t = {};
|
|
1144
|
-
for (let n of s) {
|
|
1145
|
-
let r = o.getVarAst(n), i = e.eval(r);
|
|
1146
|
-
t[n.name] = o.parseAstValue(i);
|
|
1147
|
-
}
|
|
1148
|
-
for (let n of c) {
|
|
1149
|
-
let r = o.getBoolVarAst(n), i = e.eval(r);
|
|
1150
|
-
t[n.name] = +(i.toString() === "true");
|
|
1151
|
-
}
|
|
1152
|
-
return {
|
|
1153
|
-
status: "Optimal",
|
|
1154
|
-
objectiveValue: o.parseAstValue(e.eval(d)),
|
|
1155
|
-
values: t
|
|
1156
|
-
};
|
|
1157
|
-
}
|
|
1158
|
-
return f === "unsat" ? {
|
|
1159
|
-
status: "Infeasible",
|
|
1160
|
-
objectiveValue: null,
|
|
1161
|
-
values: {}
|
|
1162
|
-
} : {
|
|
1163
|
-
status: "Error",
|
|
1164
|
-
objectiveValue: null,
|
|
1165
|
-
values: {}
|
|
1166
|
-
};
|
|
1167
|
-
}
|
|
1168
830
|
};
|
|
1169
|
-
function
|
|
1170
|
-
|
|
831
|
+
function se() {
|
|
832
|
+
I("mock", (e) => new J(e));
|
|
1171
833
|
}
|
|
1172
|
-
|
|
834
|
+
se();
|
|
1173
835
|
//#endregion
|
|
1174
836
|
//#region src/modeler/model.ts
|
|
1175
837
|
var Y = class {
|
|
@@ -1189,8 +851,12 @@ var Y = class {
|
|
|
1189
851
|
runTime = 0;
|
|
1190
852
|
solution = null;
|
|
1191
853
|
solver = null;
|
|
1192
|
-
constructor(e = {}) {
|
|
1193
|
-
|
|
854
|
+
constructor(e = {}, t) {
|
|
855
|
+
let n;
|
|
856
|
+
n = typeof e == "string" ? {
|
|
857
|
+
...t,
|
|
858
|
+
name: e
|
|
859
|
+
} : e, this.name = n.name || "OptimizationModel", this.sense = n.sense || "Minimize", this.objective = new x(), n.solver && (this.solver = R(n.solver));
|
|
1194
860
|
}
|
|
1195
861
|
get vars() {
|
|
1196
862
|
return this.variables;
|
|
@@ -1212,7 +878,7 @@ var Y = class {
|
|
|
1212
878
|
lb: n,
|
|
1213
879
|
ub: r
|
|
1214
880
|
} : e || {};
|
|
1215
|
-
let a = new
|
|
881
|
+
let a = new E(i);
|
|
1216
882
|
if (this.varMapByName.has(a.name)) throw Error(`Variable with name '${a.name}' already exists in model`);
|
|
1217
883
|
return this.variables.push(a), this.varMapByName.set(a.name, a), a;
|
|
1218
884
|
}
|
|
@@ -1267,7 +933,7 @@ var Y = class {
|
|
|
1267
933
|
return this.constrMapByName.get(e);
|
|
1268
934
|
}
|
|
1269
935
|
setObjective(e, t) {
|
|
1270
|
-
t && (this.sense = t), this.objective = typeof e == "string" ?
|
|
936
|
+
t && (this.sense = t), this.objective = typeof e == "string" ? D(e, (e) => this.getVarByName(e)) : typeof e == "number" ? new x(/* @__PURE__ */ new Map(), e) : e instanceof b || "terms" in e ? e.clone() : new x(/* @__PURE__ */ new Map([[e, 1]]), 0);
|
|
1271
937
|
}
|
|
1272
938
|
maximize(e) {
|
|
1273
939
|
this.setObjective(e, "Maximize");
|
|
@@ -1288,7 +954,7 @@ var Y = class {
|
|
|
1288
954
|
}), e;
|
|
1289
955
|
}
|
|
1290
956
|
let n;
|
|
1291
|
-
if (typeof e == "string" ? n =
|
|
957
|
+
if (typeof e == "string" ? n = O(e, (e) => this.getVarByName(e), t) : (n = e, t && (n.name = t)), this.constrMapByName.has(n.name)) throw Error(`Constraint with name '${n.name}' already exists in model`);
|
|
1292
958
|
return this.constraints.push(n), this.constrMapByName.set(n.name, n), n;
|
|
1293
959
|
}
|
|
1294
960
|
addConstr(e, t) {
|
|
@@ -1302,7 +968,7 @@ var Y = class {
|
|
|
1302
968
|
for (let t of e) this.add(t);
|
|
1303
969
|
return this;
|
|
1304
970
|
}
|
|
1305
|
-
return e instanceof
|
|
971
|
+
return e instanceof E ? (this.varMapByName.has(e.name) || (this.variables.push(e), this.varMapByName.set(e.name, e)), this) : (this.addConstraint(e, t), this);
|
|
1306
972
|
}
|
|
1307
973
|
addIndicator(e, t, n = {}) {
|
|
1308
974
|
let r = n.activeValue === void 0 ? 1 : n.activeValue, i = n.M === void 0 ? 1e5 : n.M, a = n.name || `ind_${e.name}_${t.name}`, o = [], { lhs: s, sense: c, rhs: l } = t;
|
|
@@ -1328,7 +994,7 @@ var Y = class {
|
|
|
1328
994
|
return o;
|
|
1329
995
|
}
|
|
1330
996
|
toLpString() {
|
|
1331
|
-
let { lpString: e } =
|
|
997
|
+
let { lpString: e } = j({
|
|
1332
998
|
name: this.name,
|
|
1333
999
|
sense: this.sense,
|
|
1334
1000
|
objective: this.objective,
|
|
@@ -1339,7 +1005,7 @@ var Y = class {
|
|
|
1339
1005
|
}
|
|
1340
1006
|
async optimize(e, t) {
|
|
1341
1007
|
let n, r;
|
|
1342
|
-
if (e && typeof e == "object" && "solve" in e && typeof e.solve == "function" ? (n = e, r = t || {}) : typeof e == "function" ? (n = new e(t), r = t || {}) : typeof e == "string" ? (n =
|
|
1008
|
+
if (e && typeof e == "object" && "solve" in e && typeof e.solve == "function" ? (n = e, r = t || {}) : typeof e == "function" ? (n = new e(t), r = t || {}) : typeof e == "string" ? (n = R(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = R(r.solver, r), delete r.solver) : n = this.solver || R()), this.objective instanceof b && this.objective.quadTerms.size > 0 && n.capabilities?.supportsQP === !1) throw Error(`Solver "${n.name}" does not support quadratic objectives (QP). Please use a QP-capable solver such as HiGHS or Clarabel.`);
|
|
1343
1009
|
let i = {
|
|
1344
1010
|
name: this.name,
|
|
1345
1011
|
sense: this.sense,
|
|
@@ -1348,7 +1014,7 @@ var Y = class {
|
|
|
1348
1014
|
variables: this.variables,
|
|
1349
1015
|
logicalConstraints: this.logicalConstraints,
|
|
1350
1016
|
boolVars: this.boolVars
|
|
1351
|
-
}, a =
|
|
1017
|
+
}, a = j(i), o = await n.solve(i, a, r);
|
|
1352
1018
|
this.runTime = o.runTime ?? 0, this.status = o.status, this.objectiveValue = o.objectiveValue ?? null;
|
|
1353
1019
|
let s = {}, c = {}, l = {}, u = {};
|
|
1354
1020
|
if (this.values.clear(), o.values) for (let [e, t] of Object.entries(o.values)) {
|
|
@@ -1384,7 +1050,7 @@ var Y = class {
|
|
|
1384
1050
|
}
|
|
1385
1051
|
async check(e, t) {
|
|
1386
1052
|
let n, r;
|
|
1387
|
-
if (e && typeof e == "object" && "solve" in e && typeof e.solve == "function" ? (n = e, r = t || {}) : typeof e == "function" ? (n = new e(t), r = t || {}) : typeof e == "string" ? (n =
|
|
1053
|
+
if (e && typeof e == "object" && "solve" in e && typeof e.solve == "function" ? (n = e, r = t || {}) : typeof e == "function" ? (n = new e(t), r = t || {}) : typeof e == "string" ? (n = R(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = R(r.solver, r), delete r.solver) : n = this.solver || R()), this.logicalConstraints.length > 0 && n.capabilities?.supportsSMT !== !0) throw Error(`Solver "${n.name}" does not support SMT / logical constraints (or, implies, not, xor). Please use an SMT-capable solver such as Z3.`);
|
|
1388
1054
|
if (typeof n.check == "function") {
|
|
1389
1055
|
let e = await n.check({
|
|
1390
1056
|
name: this.name,
|
|
@@ -1405,7 +1071,7 @@ var Y = class {
|
|
|
1405
1071
|
}
|
|
1406
1072
|
let i = this.objective, a = this.sense;
|
|
1407
1073
|
try {
|
|
1408
|
-
this.objective = new
|
|
1074
|
+
this.objective = new x(), this.sense = "Minimize";
|
|
1409
1075
|
let e = await this.optimize(n, r), t = e === "Optimal" || e === "Feasible", i = e === "Infeasible", a = {};
|
|
1410
1076
|
for (let e of this.variables) a[e.name] = e.value ?? 0;
|
|
1411
1077
|
return {
|
|
@@ -1417,7 +1083,7 @@ var Y = class {
|
|
|
1417
1083
|
this.objective = i, this.sense = a;
|
|
1418
1084
|
}
|
|
1419
1085
|
}
|
|
1420
|
-
}, X = "Minimize",
|
|
1086
|
+
}, X = "Minimize", ce = "Maximize", le = "Continuous", ue = "Integer", de = "Binary", Z = {
|
|
1421
1087
|
Optimal: "Optimal",
|
|
1422
1088
|
Feasible: "Feasible",
|
|
1423
1089
|
Infeasible: "Infeasible",
|
|
@@ -1429,7 +1095,7 @@ var Y = class {
|
|
|
1429
1095
|
Sat: "Sat",
|
|
1430
1096
|
Unsat: "Unsat",
|
|
1431
1097
|
Unknown: "Unknown"
|
|
1432
|
-
},
|
|
1098
|
+
}, fe = class e extends E {
|
|
1433
1099
|
constructor(e, t, n, r = "Continuous") {
|
|
1434
1100
|
super({
|
|
1435
1101
|
name: e,
|
|
@@ -1447,10 +1113,10 @@ var Y = class {
|
|
|
1447
1113
|
return o;
|
|
1448
1114
|
}
|
|
1449
1115
|
};
|
|
1450
|
-
function
|
|
1116
|
+
function pe(e) {
|
|
1451
1117
|
return e == null ? null : typeof e == "number" ? e : e.value;
|
|
1452
1118
|
}
|
|
1453
|
-
var
|
|
1119
|
+
var me = class {
|
|
1454
1120
|
model;
|
|
1455
1121
|
constructor(e = "NoName", t = X) {
|
|
1456
1122
|
this.model = new Y({
|
|
@@ -1488,7 +1154,7 @@ var Z = class {
|
|
|
1488
1154
|
setObjective(e) {
|
|
1489
1155
|
if (typeof e == "object" && e) {
|
|
1490
1156
|
if ("terms" in e) for (let [t] of e.terms) this.addVariable(t);
|
|
1491
|
-
else e instanceof
|
|
1157
|
+
else e instanceof E && this.addVariable(e);
|
|
1492
1158
|
}
|
|
1493
1159
|
this.model.setObjective(e);
|
|
1494
1160
|
}
|
|
@@ -1497,7 +1163,7 @@ var Z = class {
|
|
|
1497
1163
|
return this.model.addConstraint(e, t);
|
|
1498
1164
|
}
|
|
1499
1165
|
add(e, t) {
|
|
1500
|
-
typeof e == "string" ? /(<=|>=|==|=<|=>|=)/.test(e) ? this.addConstraint(e, t) : this.setObjective(e) : e instanceof
|
|
1166
|
+
typeof e == "string" ? /(<=|>=|==|=<|=>|=)/.test(e) ? this.addConstraint(e, t) : this.setObjective(e) : e instanceof v ? this.addConstraint(e, t) : this.setObjective(e);
|
|
1501
1167
|
}
|
|
1502
1168
|
async solve(e, t) {
|
|
1503
1169
|
return this.model.optimize(e, t);
|
|
@@ -1505,20 +1171,20 @@ var Z = class {
|
|
|
1505
1171
|
toLpString() {
|
|
1506
1172
|
return this.model.toLpString();
|
|
1507
1173
|
}
|
|
1508
|
-
}, Q = "Minimize", $ = "Maximize",
|
|
1509
|
-
function
|
|
1174
|
+
}, Q = "Minimize", $ = "Maximize", he = "Binary", ge = "Integer", _e = "Continuous";
|
|
1175
|
+
function ve(e) {
|
|
1510
1176
|
return {
|
|
1511
1177
|
expr: e,
|
|
1512
1178
|
sense: $
|
|
1513
1179
|
};
|
|
1514
1180
|
}
|
|
1515
|
-
function
|
|
1181
|
+
function ye(e) {
|
|
1516
1182
|
return {
|
|
1517
1183
|
expr: e,
|
|
1518
1184
|
sense: Q
|
|
1519
1185
|
};
|
|
1520
1186
|
}
|
|
1521
|
-
var
|
|
1187
|
+
var be = class extends Y {
|
|
1522
1188
|
constructor(e = "MipModel", t = Q) {
|
|
1523
1189
|
super({
|
|
1524
1190
|
name: e,
|
|
@@ -1544,4 +1210,4 @@ var Ce = class extends Y {
|
|
|
1544
1210
|
}
|
|
1545
1211
|
};
|
|
1546
1212
|
//#endregion
|
|
1547
|
-
export {
|
|
1213
|
+
export { he as BINARY, u as BoolExpr, f as BoolOp, d as BoolVar, _e as CONTINUOUS, v as Constraint, q as HiGHS, K as HighsSolver, ge as INTEGER, x as LinExpr, de as LpBinary, le as LpContinuous, ue as LpInteger, ce as LpMaximize, X as LpMinimize, me as LpProblem, Z as LpStatus, fe as LpVariable, $ as MAXIMIZE, Q as MINIMIZE, be as MipModel, J as MockSolver, Y as Model, c as OFFICIAL_HIGHS_CDN_WASM_URL, b as QuadExpr, E as Var, p as and, re as c, ie as expr, j as generateLpString, i as getHighs, o as getHighsWasmUrl, R as getSolver, g as implies, n as isValidWasmHeader, z as listAvailableSolvers, w as lpSum, ve as maximize, ye as minimize, h as not, m as or, O as parseConstraint, D as parseExpr, e as probeWasmUrl, I as registerSolver, a as resolveBrowserWasmUrl, L as setDefaultSolver, s as setHighsWasmUrl, t as solveLpWithHighs, S as sum, pe as value, _ as xor, C as xsum };
|