@ohtaman/washi 0.1.1 → 0.1.2

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 (46) hide show
  1. package/README.ja.md +49 -21
  2. package/README.md +49 -21
  3. package/README.zh-CN.md +49 -21
  4. package/dist/browser/_washi-optional-engine-282Ug7Gw.js +7 -0
  5. package/dist/browser/highs-browser-runtime-D13gHOT5.js +4189 -0
  6. package/dist/browser/highs-loader-T47YOyos.js +58 -0
  7. package/dist/browser/highs-worker.js +21 -0
  8. package/dist/{lib/demo → browser}/highs.wasm +0 -0
  9. package/dist/browser/highs.wasm.LICENSE +22 -0
  10. package/dist/browser/washi.js +1547 -0
  11. package/dist/browser/washi.min.js +5 -0
  12. package/dist/lib/{glpk-BC32ZaPG.js → glpk-5cUpjyb9.js} +14 -5
  13. package/dist/lib/highs-assets.js +1 -0
  14. package/dist/lib/highs-browser-runtime.js +4189 -0
  15. package/dist/lib/highs-loader-Blb99785.js +50 -0
  16. package/dist/lib/highs-node-runtime.js +1 -0
  17. package/dist/lib/highs-worker-factory.js +1 -0
  18. package/dist/lib/highs-worker.js +21 -0
  19. package/dist/lib/highs.wasm +0 -0
  20. package/dist/lib/solvers/glpk.js +1 -1
  21. package/dist/lib/solvers/z3.js +2 -2
  22. package/dist/lib/washi.js +34 -33
  23. package/dist/lib/z3-C6GeIicJ.js +509 -0
  24. package/dist/types/glpk-loader.d.ts.map +1 -1
  25. package/dist/types/highs-assets.d.ts +3 -0
  26. package/dist/types/highs-assets.d.ts.map +1 -0
  27. package/dist/types/highs-browser-runtime.d.ts +2 -0
  28. package/dist/types/highs-browser-runtime.d.ts.map +1 -0
  29. package/dist/types/highs-loader.d.ts +1 -1
  30. package/dist/types/highs-loader.d.ts.map +1 -1
  31. package/dist/types/highs-node-runtime.d.ts +2 -0
  32. package/dist/types/highs-node-runtime.d.ts.map +1 -0
  33. package/dist/types/highs-worker-client.d.ts.map +1 -1
  34. package/dist/types/highs-worker-factory.d.ts +3 -0
  35. package/dist/types/highs-worker-factory.d.ts.map +1 -0
  36. package/dist/types/modeler/solvers/highs.d.ts +6 -0
  37. package/dist/types/modeler/solvers/highs.d.ts.map +1 -1
  38. package/dist/types/modeler/solvers/types.d.ts +1 -1
  39. package/dist/types/modeler/solvers/types.d.ts.map +1 -1
  40. package/dist/types/modeler/solvers/z3.d.ts +4 -5
  41. package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
  42. package/package.json +18 -6
  43. package/dist/lib/assets/highs-worker-DeDWU6KI.js +0 -3
  44. package/dist/lib/washi-logo.png +0 -0
  45. package/dist/lib/washi-logo.svg +0 -70
  46. package/dist/lib/z3-C8g-PtmP.js +0 -582
@@ -0,0 +1,1547 @@
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 "./highs-loader-T47YOyos.js";
2
+ //#region src/modeler/boolean-expr.ts
3
+ var l = 0, u = class {
4
+ and(e) {
5
+ return new f("and", [this, e]);
6
+ }
7
+ or(e) {
8
+ return new f("or", [this, e]);
9
+ }
10
+ implies(e) {
11
+ return new f("implies", [this, e]);
12
+ }
13
+ xor(e) {
14
+ return new f("xor", [this, e]);
15
+ }
16
+ not() {
17
+ return new f("not", [this]);
18
+ }
19
+ }, d = class extends u {
20
+ id;
21
+ name;
22
+ value = null;
23
+ constructor(e) {
24
+ super(), this.id = ++l, this.name = e || `p_${this.id}`;
25
+ }
26
+ toString() {
27
+ return this.name;
28
+ }
29
+ }, f = class extends u {
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 p(...e) {
40
+ if (e.length === 0) throw Error("and() requires at least one expression");
41
+ return new f("and", e);
42
+ }
43
+ function m(...e) {
44
+ if (e.length === 0) throw Error("or() requires at least one expression");
45
+ return new f("or", e);
46
+ }
47
+ function h(e) {
48
+ return new f("not", [e]);
49
+ }
50
+ function g(e, t) {
51
+ return new f("implies", [e, t]);
52
+ }
53
+ function _(...e) {
54
+ if (e.length === 0) throw Error("xor() requires at least one expression");
55
+ return new f("xor", e);
56
+ }
57
+ //#endregion
58
+ //#region src/modeler/constraint.ts
59
+ var v = 0, y = 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 = ++v, 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 f("and", [this, e]);
75
+ }
76
+ or(e) {
77
+ return new f("or", [this, e]);
78
+ }
79
+ implies(e) {
80
+ return new f("implies", [this, e]);
81
+ }
82
+ xor(e) {
83
+ return new f("xor", [this, e]);
84
+ }
85
+ not() {
86
+ return new f("not", [this]);
87
+ }
88
+ toString() {
89
+ let e = this.sense === "==" ? "=" : this.sense;
90
+ return `${this.name}: ${this.lhs.toString()} ${e} ${this.rhs}`;
91
+ }
92
+ };
93
+ //#endregion
94
+ //#region src/modeler/quad-expr.ts
95
+ function b(e, t) {
96
+ let n = e.id, r = t.id;
97
+ return n <= r ? `${n}:${r}` : `${r}:${n}`;
98
+ }
99
+ var x = class e {
100
+ linearTerms;
101
+ quadTerms;
102
+ constant;
103
+ constructor(e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), n = 0) {
104
+ this.linearTerms = new Map(e), this.quadTerms = /* @__PURE__ */ new Map();
105
+ for (let [e, n] of t) this.quadTerms.set(e, { ...n });
106
+ this.constant = n;
107
+ }
108
+ clone() {
109
+ return new e(this.linearTerms, this.quadTerms, this.constant);
110
+ }
111
+ getQuadCoeff(e, t) {
112
+ let n = b(e, t), r = this.quadTerms.get(n);
113
+ return r ? r.coeff : 0;
114
+ }
115
+ add(t) {
116
+ let n = this.clone();
117
+ if (typeof t == "number") return n.constant += t, n;
118
+ if (t instanceof e) {
119
+ for (let [e, r] of t.quadTerms) {
120
+ let t = n.quadTerms.get(e), i = (t ? t.coeff : 0) + r.coeff;
121
+ Math.abs(i) < 1e-12 ? n.quadTerms.delete(e) : n.quadTerms.set(e, {
122
+ var1: r.var1,
123
+ var2: r.var2,
124
+ coeff: i
125
+ });
126
+ }
127
+ for (let [e, r] of t.linearTerms) {
128
+ let t = (n.linearTerms.get(e) || 0) + r;
129
+ Math.abs(t) < 1e-12 ? n.linearTerms.delete(e) : n.linearTerms.set(e, t);
130
+ }
131
+ return n.constant += t.constant, n;
132
+ }
133
+ if ("terms" in t && t.terms instanceof Map) {
134
+ for (let [e, r] of t.terms) {
135
+ let t = (n.linearTerms.get(e) || 0) + r;
136
+ Math.abs(t) < 1e-12 ? n.linearTerms.delete(e) : n.linearTerms.set(e, t);
137
+ }
138
+ return n.constant += t.constant, n;
139
+ }
140
+ let r = t, i = (n.linearTerms.get(r) || 0) + 1;
141
+ return Math.abs(i) < 1e-12 ? n.linearTerms.delete(r) : n.linearTerms.set(r, i), n;
142
+ }
143
+ sub(t) {
144
+ return typeof t == "number" ? this.add(-t) : t instanceof e ? this.add(t.neg()) : ("terms" in t && t.terms instanceof Map, this.add(t.mul(-1)));
145
+ }
146
+ mul(t) {
147
+ let n = new e(/* @__PURE__ */ new Map(), /* @__PURE__ */ new Map(), this.constant * t);
148
+ for (let [e, r] of this.linearTerms) {
149
+ let i = r * t;
150
+ Math.abs(i) >= 1e-12 && n.linearTerms.set(e, i);
151
+ }
152
+ for (let [e, r] of this.quadTerms) {
153
+ let i = r.coeff * t;
154
+ Math.abs(i) >= 1e-12 && n.quadTerms.set(e, {
155
+ var1: r.var1,
156
+ var2: r.var2,
157
+ coeff: i
158
+ });
159
+ }
160
+ return n;
161
+ }
162
+ div(e) {
163
+ if (Math.abs(e) < 1e-12) throw Error("Division by zero in QuadExpr.div()");
164
+ return this.mul(1 / e);
165
+ }
166
+ neg() {
167
+ return this.mul(-1);
168
+ }
169
+ get value() {
170
+ let e = this.constant;
171
+ for (let [t, n] of this.linearTerms) {
172
+ if (t.value === null) return null;
173
+ e += n * t.value;
174
+ }
175
+ for (let t of this.quadTerms.values()) {
176
+ if (t.var1.value === null || t.var2.value === null) return null;
177
+ e += t.coeff * t.var1.value * t.var2.value;
178
+ }
179
+ return e;
180
+ }
181
+ getValue() {
182
+ return this.value;
183
+ }
184
+ static fromProduct(t, n, r = 1) {
185
+ let i = new e(), a = b(t, n);
186
+ return i.quadTerms.set(a, {
187
+ var1: t.id <= n.id ? t : n,
188
+ var2: t.id <= n.id ? n : t,
189
+ coeff: r
190
+ }), i;
191
+ }
192
+ }, S = class e {
193
+ terms;
194
+ constant;
195
+ constructor(e = /* @__PURE__ */ new Map(), t = 0) {
196
+ this.terms = new Map(e), this.constant = t;
197
+ }
198
+ clone() {
199
+ return new e(this.terms, this.constant);
200
+ }
201
+ add(e) {
202
+ if (e instanceof x) return e.add(this);
203
+ let t = this.clone();
204
+ if (typeof e == "number") t.constant += e;
205
+ else if ("terms" in e) {
206
+ for (let [n, r] of e.terms) {
207
+ let e = (t.terms.get(n) || 0) + r;
208
+ Math.abs(e) < 1e-12 ? t.terms.delete(n) : t.terms.set(n, e);
209
+ }
210
+ t.constant += e.constant;
211
+ } else {
212
+ let n = (t.terms.get(e) || 0) + 1;
213
+ Math.abs(n) < 1e-12 ? t.terms.delete(e) : t.terms.set(e, n);
214
+ }
215
+ return t;
216
+ }
217
+ sub(e) {
218
+ return e instanceof x ? e.neg().add(this) : typeof e == "number" ? this.add(-e) : ("terms" in e, this.add(e.mul(-1)));
219
+ }
220
+ mul(t) {
221
+ if (typeof t == "number") {
222
+ let n = new e(/* @__PURE__ */ new Map(), this.constant * t);
223
+ for (let [e, r] of this.terms) {
224
+ let i = r * t;
225
+ Math.abs(i) >= 1e-12 && n.terms.set(e, i);
226
+ }
227
+ return n;
228
+ }
229
+ let n = new x();
230
+ Math.abs(this.constant) >= 1e-12 && n.linearTerms.set(t, this.constant);
231
+ for (let [e, r] of this.terms) n = n.add(x.fromProduct(e, t, r));
232
+ return n;
233
+ }
234
+ div(e) {
235
+ if (Math.abs(e) < 1e-12) throw Error("Division by zero in LinExpr.div()");
236
+ return this.mul(1 / e);
237
+ }
238
+ neg() {
239
+ return this.mul(-1);
240
+ }
241
+ get value() {
242
+ let e = this.constant;
243
+ for (let [t, n] of this.terms) {
244
+ if (t.value === null) return null;
245
+ e += n * t.value;
246
+ }
247
+ return e;
248
+ }
249
+ getValue() {
250
+ return this.value;
251
+ }
252
+ le(e, t) {
253
+ return this.toConstraint("<=", e, t);
254
+ }
255
+ lessThanOrEqual(e, t) {
256
+ return this.le(e, t);
257
+ }
258
+ ge(e, t) {
259
+ return this.toConstraint(">=", e, t);
260
+ }
261
+ greaterThanOrEqual(e, t) {
262
+ return this.ge(e, t);
263
+ }
264
+ eq(e, t) {
265
+ return this.toConstraint("==", e, t);
266
+ }
267
+ equalTo(e, t) {
268
+ return this.eq(e, t);
269
+ }
270
+ toConstraint(t, n, r) {
271
+ let i = this.clone(), a = 0;
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
+ let o = a - i.constant;
274
+ return i.constant = 0, new y(i, t, o, r);
275
+ }
276
+ toString() {
277
+ let e = [], t = !0;
278
+ for (let [n, r] of this.terms) {
279
+ let i = r >= 0 ? t ? "" : "+ " : "- ", a = Math.abs(r), o = a === 1 ? "" : `${a} `;
280
+ e.push(`${i}${o}${n.name}`), t = !1;
281
+ }
282
+ if (this.constant !== 0 || e.length === 0) {
283
+ let n = this.constant >= 0 ? t ? "" : "+ " : "- ";
284
+ e.push(`${n}${Math.abs(this.constant)}`);
285
+ }
286
+ return e.join(" ") || "0";
287
+ }
288
+ };
289
+ function C(e, t) {
290
+ let n = /* @__PURE__ */ new Map(), r = 0, i = 0;
291
+ for (let a of e) {
292
+ let e = t ? t(a, i++) : a;
293
+ if (typeof e == "number") r += e;
294
+ else if (e && typeof e == "object" && "terms" in e) {
295
+ let t = e;
296
+ for (let [e, r] of t.terms) {
297
+ let t = n.get(e) || 0;
298
+ n.set(e, t + r);
299
+ }
300
+ r += t.constant;
301
+ } else if (e) {
302
+ let t = e, r = n.get(t) || 0;
303
+ n.set(t, r + 1);
304
+ }
305
+ }
306
+ for (let [e, t] of n) Math.abs(t) < 1e-12 && n.delete(e);
307
+ return new S(n, r);
308
+ }
309
+ var w = C, T = C, E = 0, D = class e {
310
+ id;
311
+ name;
312
+ type;
313
+ lb;
314
+ ub;
315
+ value = null;
316
+ reducedCost = null;
317
+ constructor(e = {}) {
318
+ this.id = ++E, 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
+ }
320
+ get x() {
321
+ return this.value;
322
+ }
323
+ get varValue() {
324
+ return this.value;
325
+ }
326
+ mul(t) {
327
+ if (typeof t == "number") return new S(/* @__PURE__ */ new Map([[this, t]]), 0);
328
+ if (t instanceof e) return x.fromProduct(this, t, 1);
329
+ let n = new x();
330
+ Math.abs(t.constant) >= 1e-12 && n.linearTerms.set(this, t.constant);
331
+ for (let [e, r] of t.terms) {
332
+ let t = x.fromProduct(this, e, r);
333
+ n = n.add(t);
334
+ }
335
+ return n;
336
+ }
337
+ add(e) {
338
+ return e instanceof x ? e.add(this) : new S(/* @__PURE__ */ new Map([[this, 1]]), 0).add(e);
339
+ }
340
+ sub(e) {
341
+ return e instanceof x ? e.neg().add(this) : new S(/* @__PURE__ */ new Map([[this, 1]]), 0).sub(e);
342
+ }
343
+ neg() {
344
+ return this.mul(-1);
345
+ }
346
+ le(e, t) {
347
+ return new S(/* @__PURE__ */ new Map([[this, 1]]), 0).le(e, t);
348
+ }
349
+ lessThanOrEqual(e, t) {
350
+ return this.le(e, t);
351
+ }
352
+ ge(e, t) {
353
+ return new S(/* @__PURE__ */ new Map([[this, 1]]), 0).ge(e, t);
354
+ }
355
+ greaterThanOrEqual(e, t) {
356
+ return this.ge(e, t);
357
+ }
358
+ eq(e, t) {
359
+ return new S(/* @__PURE__ */ new Map([[this, 1]]), 0).eq(e, t);
360
+ }
361
+ equalTo(e, t) {
362
+ return this.eq(e, t);
363
+ }
364
+ toString() {
365
+ return this.name;
366
+ }
367
+ };
368
+ //#endregion
369
+ //#region src/modeler/parser.ts
370
+ function ee(e) {
371
+ let t = [], n = 0, r = e.length;
372
+ for (; n < r;) {
373
+ let i = e[n];
374
+ if (/\s/.test(i)) {
375
+ n++;
376
+ continue;
377
+ }
378
+ if (i === "+") t.push({
379
+ type: "PLUS",
380
+ value: "+"
381
+ }), n++;
382
+ else if (i === "-") t.push({
383
+ type: "MINUS",
384
+ value: "-"
385
+ }), n++;
386
+ else if (i === "*") t.push({
387
+ type: "STAR",
388
+ value: "*"
389
+ }), n++;
390
+ else if (i === "/") t.push({
391
+ type: "SLASH",
392
+ value: "/"
393
+ }), n++;
394
+ else if (i === "(") t.push({
395
+ type: "LPAREN",
396
+ value: "("
397
+ }), n++;
398
+ else if (i === ")") t.push({
399
+ type: "RPAREN",
400
+ value: ")"
401
+ }), n++;
402
+ else if (i === "<" || i === ">" || i === "=") {
403
+ let a = i;
404
+ n + 1 < r && (e[n + 1] === "=" || e[n + 1] === "<" || e[n + 1] === ">") ? (a += e[n + 1], n += 2) : n++, t.push({
405
+ type: "COMP",
406
+ value: a
407
+ });
408
+ } else if (/[0-9.]/.test(i)) {
409
+ let i = "";
410
+ for (; n < r && /[0-9.]/.test(e[n]);) i += e[n], n++;
411
+ t.push({
412
+ type: "NUMBER",
413
+ value: i
414
+ });
415
+ } else if (/[a-zA-Z_]/.test(i)) {
416
+ let i = "";
417
+ for (; n < r && /[a-zA-Z0-9_]/.test(e[n]);) i += e[n], n++;
418
+ t.push({
419
+ type: "IDENT",
420
+ value: i
421
+ });
422
+ } else throw Error(`Unexpected character '${i}' at position ${n} in: "${e}"`);
423
+ }
424
+ return t;
425
+ }
426
+ var te = class {
427
+ tokens;
428
+ pos = 0;
429
+ resolver;
430
+ constructor(e, t) {
431
+ this.tokens = e, this.resolver = t;
432
+ }
433
+ peek() {
434
+ return this.tokens[this.pos];
435
+ }
436
+ consume(e) {
437
+ let t = this.tokens[this.pos++];
438
+ if (!t) throw Error("Unexpected end of input");
439
+ if (e && t.value !== e && t.type !== e) throw Error(`Expected '${e}', but found '${t.value}'`);
440
+ return t;
441
+ }
442
+ parseExpression() {
443
+ let e = this.parseTerm();
444
+ for (; this.pos < this.tokens.length;) {
445
+ let t = this.peek();
446
+ if (!t) break;
447
+ if (t.type === "PLUS") this.consume(), e = e.add(this.parseTerm());
448
+ else if (t.type === "MINUS") this.consume(), e = e.sub(this.parseTerm());
449
+ else break;
450
+ }
451
+ return e;
452
+ }
453
+ parseTerm() {
454
+ let e = this.parseFactor();
455
+ for (; this.pos < this.tokens.length;) {
456
+ let t = this.peek();
457
+ if (!t) break;
458
+ if (t.type === "STAR") {
459
+ this.consume();
460
+ let t = this.parseFactor();
461
+ e = this.multiplyExpressions(e, t);
462
+ } else if (t.type === "SLASH") {
463
+ this.consume();
464
+ let t = this.parseFactor();
465
+ if (t.terms.size > 0) throw Error("Cannot divide by variable in linear expression");
466
+ if (Math.abs(t.constant) < 1e-12) throw Error("Division by zero in expression");
467
+ e = e.div(t.constant);
468
+ } else break;
469
+ }
470
+ return e;
471
+ }
472
+ multiplyExpressions(e, t) {
473
+ if (e.terms.size > 0 && t.terms.size > 0) throw Error("Multiplication of two variables creates a non-linear term (not allowed in MILP/LP)");
474
+ return e.terms.size === 0 ? t.mul(e.constant) : e.mul(t.constant);
475
+ }
476
+ parseFactor() {
477
+ let e = this.peek();
478
+ if (!e) throw Error("Unexpected end of expression");
479
+ if (e.type === "PLUS") return this.consume(), this.parseFactor();
480
+ if (e.type === "MINUS") return this.consume(), this.parseFactor().neg();
481
+ if (e.type === "NUMBER") {
482
+ this.consume();
483
+ let t = parseFloat(e.value);
484
+ if (this.peek()?.type === "IDENT") {
485
+ let e = this.consume();
486
+ return this.resolveVariable(e.value).mul(t);
487
+ }
488
+ return new S(/* @__PURE__ */ new Map(), t);
489
+ }
490
+ if (e.type === "IDENT") {
491
+ this.consume();
492
+ let t = this.resolveVariable(e.value);
493
+ return new S(/* @__PURE__ */ new Map([[t, 1]]), 0);
494
+ }
495
+ if (e.type === "LPAREN") {
496
+ this.consume("LPAREN");
497
+ let e = this.parseExpression();
498
+ return this.consume("RPAREN"), e;
499
+ }
500
+ throw Error(`Unexpected token '${e.value}' in expression`);
501
+ }
502
+ resolveVariable(e) {
503
+ let t = this.resolver(e);
504
+ if (!t) throw Error(`Unknown variable '${e}' in expression`);
505
+ return t;
506
+ }
507
+ };
508
+ function O(e, t) {
509
+ return new te(ee(e), t).parseExpression();
510
+ }
511
+ function k(e, t, n) {
512
+ let r = e.match(/(<=|>=|==|=<|=>|=)/);
513
+ if (!r) throw Error(`Constraint must contain a comparison operator (<=, >=, ==, =): "${e}"`);
514
+ let i = r[0], a = r.index, o = e.substring(0, a).trim(), s = e.substring(a + i.length).trim(), c;
515
+ if (i === "<=" || i === "=<") c = "<=";
516
+ else if (i === ">=" || i === "=>") c = ">=";
517
+ else if (i === "==" || i === "=") c = "==";
518
+ else throw Error(`Unsupported operator "${i}"`);
519
+ let l = O(o, t), u = O(s, t);
520
+ return c === "<=" ? l.le(u, n) : c === ">=" ? l.ge(u, n) : l.eq(u, n);
521
+ }
522
+ function A(e, t) {
523
+ let n = /* @__PURE__ */ new Map(), r = "";
524
+ for (let i = 0; i < e.length; i++) if (r += e[i], i < t.length) {
525
+ let e = t[i];
526
+ if (typeof e == "number") r += `(${e})`;
527
+ else if (e instanceof D) {
528
+ let t = `__v_${i}__`;
529
+ n.set(t, e), r += t;
530
+ } else if (e instanceof S) {
531
+ `${i}`, r += `(${e.toString()})`;
532
+ for (let [t] of e.terms) n.set(t.name, t);
533
+ }
534
+ }
535
+ return {
536
+ fullText: r,
537
+ resolver: (e) => n.get(e)
538
+ };
539
+ }
540
+ function ne(e, ...t) {
541
+ let { fullText: n, resolver: r } = A(e, t);
542
+ return k(n, r);
543
+ }
544
+ function re(e, ...t) {
545
+ let { fullText: n, resolver: r } = A(e, t);
546
+ return /(<=|>=|==|=<|=>|=)/.test(n) ? k(n, r) : O(n, r);
547
+ }
548
+ //#endregion
549
+ //#region src/modeler/lp-writer.ts
550
+ function j(e, t, n) {
551
+ let r = e.replace(/[^a-zA-Z0-9_]/g, "_");
552
+ return /^[0-9]/.test(r) && (r = `${t}_${r}`), (!r || r.length === 0) && (r = `${t}_${n}`), r;
553
+ }
554
+ function M(e) {
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
+ for (let e of i) {
557
+ let t = j(e.name, "x", e.id), n = t, r = 1;
558
+ for (; c.has(n);) n = `${t}_${r++}`;
559
+ c.add(n), o.set(e, n), a.set(n, e);
560
+ }
561
+ let l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();
562
+ for (let e of r) {
563
+ let t = j(e.name, "c", e.id), n = t, r = 1;
564
+ for (; l.has(n);) n = `${t}_${r++}`;
565
+ l.add(n), u.set(e, n), s.set(n, e);
566
+ }
567
+ let d = [];
568
+ d.push(t === "Maximize" ? "Maximize" : "Minimize");
569
+ let f = [], p = !0, m = n instanceof x ? n.linearTerms : n.terms;
570
+ if (m) for (let [e, t] of m) {
571
+ if (Math.abs(t) < 1e-12) continue;
572
+ let n = o.get(e), r = t >= 0 ? p ? "" : "+ " : "- ", i = Math.abs(t), a = i === 1 ? "" : `${i} `;
573
+ f.push(`${r}${a}${n}`), p = !1;
574
+ }
575
+ if (n instanceof x && n.quadTerms.size > 0) {
576
+ let e = [], t = !0;
577
+ for (let r of n.quadTerms.values()) {
578
+ if (Math.abs(r.coeff) < 1e-12) continue;
579
+ let n = 2 * r.coeff, i = n >= 0 ? t ? "" : "+ " : "- ", a = Math.abs(n), s = a === 1 ? "" : `${a} `, c = o.get(r.var1), l = o.get(r.var2);
580
+ r.var1 === r.var2 ? e.push(`${i}${s}${c} ^ 2`) : e.push(`${i}${s}${c} * ${l}`), t = !1;
581
+ }
582
+ if (e.length > 0) {
583
+ let t = `[ ${e.join(" ")} ] / 2`;
584
+ f.length > 0 ? f.push("+", t) : f.push(t);
585
+ }
586
+ }
587
+ let h = f.length > 0 ? f.join(" ") : "0";
588
+ d.push(` obj: ${h}`), d.push("Subject To");
589
+ for (let e of r) {
590
+ let t = u.get(e), n = [], r = !0;
591
+ for (let [t, i] of e.lhs.terms) {
592
+ if (Math.abs(i) < 1e-12) continue;
593
+ let e = o.get(t), a = i >= 0 ? r ? "" : "+ " : "- ", s = Math.abs(i), c = s === 1 ? "" : `${s} `;
594
+ n.push(`${a}${c}${e}`), r = !1;
595
+ }
596
+ let i = n.length > 0 ? n.join(" ") : "0", a = e.sense === "==" ? "=" : e.sense;
597
+ d.push(` ${t}: ${i} ${a} ${e.rhs}`);
598
+ }
599
+ d.push("Bounds");
600
+ let g = [], _ = [];
601
+ for (let e of i) {
602
+ let t = o.get(e);
603
+ if (e.type === "Binary") {
604
+ _.push(t);
605
+ continue;
606
+ }
607
+ e.type === "Integer" && g.push(t);
608
+ let n = e.lb === -Infinity, r = e.ub === Infinity;
609
+ n && r ? d.push(` ${t} free`) : n && !r ? d.push(` -infinity <= ${t} <= ${e.ub}`) : !n && r ? e.lb !== 0 && d.push(` ${t} >= ${e.lb}`) : d.push(` ${e.lb} <= ${t} <= ${e.ub}`);
610
+ }
611
+ if (g.length > 0) {
612
+ d.push("Generals");
613
+ for (let e = 0; e < g.length; e += 10) d.push(" " + g.slice(e, e + 10).join(" "));
614
+ }
615
+ if (_.length > 0) {
616
+ d.push("Binary");
617
+ for (let e = 0; e < _.length; e += 10) d.push(" " + _.slice(e, e + 10).join(" "));
618
+ }
619
+ return d.push("End"), {
620
+ lpString: d.join("\n") + "\n",
621
+ nameToVar: a,
622
+ nameToConstraint: s
623
+ };
624
+ }
625
+ //#endregion
626
+ //#region \0washi-browser-worker-factory
627
+ function ie() {
628
+ let e = r("highs-worker.js");
629
+ if (new URL(e).origin === window.location.origin) return new Worker(e, { type: "module" });
630
+ let t = URL.createObjectURL(new Blob(["import " + JSON.stringify(e) + ";"], { type: "text/javascript" }));
631
+ try {
632
+ let e = new Worker(t, { type: "module" }), n = () => URL.revokeObjectURL(t);
633
+ return e.addEventListener("message", n, { once: !0 }), e.addEventListener("error", n, { once: !0 }), e;
634
+ } catch (e) {
635
+ throw URL.revokeObjectURL(t), e;
636
+ }
637
+ }
638
+ //#endregion
639
+ //#region src/highs-worker-client.ts
640
+ var N = null, ae = 0, P = /* @__PURE__ */ new Map();
641
+ function oe() {
642
+ if (typeof window > "u" || typeof Worker > "u") return null;
643
+ if (!N) try {
644
+ N = ie();
645
+ let e = N;
646
+ N.onmessage = (e) => {
647
+ let { type: t, id: n, result: r, runTime: i, error: a } = e.data, o = P.get(n);
648
+ o && (P.delete(n), t === "SOLVE_SUCCESS" ? o.resolve({
649
+ result: r,
650
+ runTime: i
651
+ }) : o.reject(Error(a || "Worker solve failed")));
652
+ };
653
+ let t = (t) => {
654
+ if (N === e) {
655
+ N = null, e.terminate();
656
+ for (let e of P.values()) e.reject(t);
657
+ P.clear();
658
+ }
659
+ };
660
+ N.onerror = (e) => t(/* @__PURE__ */ Error(`[WaSHI] HiGHS Worker failed to load or execute. Check Worker assets, CORS and CSP. ${e.message || ""}`)), N.onmessageerror = () => t(/* @__PURE__ */ Error("[WaSHI] Could not deserialize the HiGHS Worker response."));
661
+ } catch (e) {
662
+ console.warn("Could not instantiate Web Worker, falling back to main thread:", e), N = null;
663
+ }
664
+ return N;
665
+ }
666
+ async function se(e, n = {}) {
667
+ let r = await a(n.wasmUrl), i = n.useWorker ?? typeof window < "u" ? oe() : null;
668
+ if (!i) return t(e, n);
669
+ let o = {
670
+ ...n,
671
+ wasmUrl: r
672
+ }, s = `req_${++ae}`;
673
+ return new Promise((t, n) => {
674
+ P.set(s, {
675
+ resolve: t,
676
+ reject: n
677
+ });
678
+ try {
679
+ i.postMessage({
680
+ type: "SOLVE",
681
+ id: s,
682
+ lpString: e,
683
+ options: o
684
+ });
685
+ } catch (e) {
686
+ P.delete(s), n(e);
687
+ }
688
+ });
689
+ }
690
+ //#endregion
691
+ //#region src/modeler/solvers/highs.ts
692
+ function ce(e) {
693
+ if (typeof e != "string") return "Unknown";
694
+ let t = e.trim();
695
+ if (!t) return "Unknown";
696
+ switch (t) {
697
+ case "Optimal": return "Optimal";
698
+ case "Infeasible": return "Infeasible";
699
+ case "Unbounded": return "Unbounded";
700
+ case "Primal infeasible or unbounded": return "Unknown";
701
+ case "Time limit reached":
702
+ case "TimeLimit": return "TimeLimit";
703
+ case "Iteration limit reached":
704
+ case "IterationLimit": return "IterationLimit";
705
+ case "Bound on objective reached":
706
+ case "Target for objective reached":
707
+ case "Feasible": return "Feasible";
708
+ case "Not Set": return "NotSolved";
709
+ case "Load error":
710
+ case "Model error":
711
+ case "Presolve error":
712
+ case "Solve error":
713
+ case "Postsolve error":
714
+ case "Error": return "Error";
715
+ case "Empty":
716
+ case "Unknown": return "Unknown";
717
+ }
718
+ let n = t.toLowerCase();
719
+ 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
+ }
721
+ var F = class e {
722
+ static capabilities = {
723
+ supportsMIP: !0,
724
+ supportsQP: !0
725
+ };
726
+ name = "HiGHS";
727
+ version = "1.15.3";
728
+ capabilities = e.capabilities;
729
+ options;
730
+ constructor(e = {}) {
731
+ this.options = e;
732
+ }
733
+ async solve(e, t, n = {}) {
734
+ let r = {
735
+ ...this.options,
736
+ ...n
737
+ }, { lpString: i, nameToVar: a, nameToConstraint: o } = t, { result: s, runTime: c } = await se(i, r), l = ce(s?.Status), u = s.ObjectiveValue, d = typeof u == "number" ? u + e.objective.constant : null, f = {}, p = {}, m = {}, h = {};
738
+ if (s.Columns) for (let [e, t] of Object.entries(s.Columns)) {
739
+ let n = a.get(e);
740
+ if (n) {
741
+ let e = Math.abs(t.Primal) < 1e-9 ? 0 : t.Primal;
742
+ f[n.name] = e, t.Dual !== void 0 && (m[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual);
743
+ }
744
+ }
745
+ if (s.Rows) {
746
+ let e = Array.isArray(s.Rows) ? s.Rows : Object.values(s.Rows);
747
+ for (let t of e) {
748
+ let e = t.Name, n = o.get(e);
749
+ if (n && (t.Dual !== void 0 && (p[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual), t.Primal !== void 0)) {
750
+ let e = n.rhs - t.Primal;
751
+ h[n.name] = Math.abs(e) < 1e-9 ? 0 : e;
752
+ }
753
+ }
754
+ }
755
+ return {
756
+ status: l,
757
+ objectiveValue: d,
758
+ values: f,
759
+ reducedCosts: m,
760
+ duals: p,
761
+ slacks: h,
762
+ runTime: c,
763
+ raw: s
764
+ };
765
+ }
766
+ }, le = F, I = null;
767
+ async function L() {
768
+ return I || (I = (async () => {
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);
776
+ }
777
+ //#endregion
778
+ //#region src/modeler/solvers/glpk.ts
779
+ var R = class e {
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 {
889
+ name;
890
+ capabilities;
891
+ options;
892
+ constructor(e = {}) {
893
+ this.name = e.name || "MockSolver", this.capabilities = e.capabilities || {
894
+ supportsMIP: !0,
895
+ supportsQP: !0
896
+ }, this.options = e;
897
+ }
898
+ async solve(e, t, n = {}) {
899
+ let r = {
900
+ ...this.options,
901
+ ...n
902
+ };
903
+ return r.delayMs && r.delayMs > 0 && await new Promise((e) => setTimeout(e, r.delayMs)), {
904
+ status: r.status || "Optimal",
905
+ objectiveValue: r.objectiveValue ?? 0,
906
+ values: r.values || {},
907
+ reducedCosts: r.reducedCosts,
908
+ duals: r.duals,
909
+ slacks: r.slacks,
910
+ runTime: .001,
911
+ raw: { mock: !0 }
912
+ };
913
+ }
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
+ };
1169
+ function J() {
1170
+ H("z3", () => new q());
1171
+ }
1172
+ J();
1173
+ //#endregion
1174
+ //#region src/modeler/model.ts
1175
+ var Y = class {
1176
+ name;
1177
+ sense;
1178
+ objective;
1179
+ variables = [];
1180
+ constraints = [];
1181
+ boolVars = [];
1182
+ logicalConstraints = [];
1183
+ unsatCore = [];
1184
+ values = /* @__PURE__ */ new Map();
1185
+ varMapByName = /* @__PURE__ */ new Map();
1186
+ constrMapByName = /* @__PURE__ */ new Map();
1187
+ status = "NotSolved";
1188
+ objectiveValue = null;
1189
+ runTime = 0;
1190
+ solution = null;
1191
+ solver = null;
1192
+ constructor(e = {}) {
1193
+ this.name = e.name || "OptimizationModel", this.sense = e.sense || "Minimize", this.objective = new S(), e.solver && (this.solver = U(e.solver));
1194
+ }
1195
+ get vars() {
1196
+ return this.variables;
1197
+ }
1198
+ get constrs() {
1199
+ return this.constraints;
1200
+ }
1201
+ get numVars() {
1202
+ return this.variables.length;
1203
+ }
1204
+ get numConstrs() {
1205
+ return this.constraints.length;
1206
+ }
1207
+ addVar(e, t, n, r) {
1208
+ let i;
1209
+ i = typeof e == "string" ? {
1210
+ name: e,
1211
+ type: t,
1212
+ lb: n,
1213
+ ub: r
1214
+ } : e || {};
1215
+ let a = new D(i);
1216
+ if (this.varMapByName.has(a.name)) throw Error(`Variable with name '${a.name}' already exists in model`);
1217
+ return this.variables.push(a), this.varMapByName.set(a.name, a), a;
1218
+ }
1219
+ addVars(e, t, n) {
1220
+ if (typeof t == "number" || Array.isArray(t)) {
1221
+ let r = typeof e == "number" ? Array.from({ length: e }, (e, t) => t) : e, i = typeof t == "number" ? Array.from({ length: t }, (e, t) => t) : t, a = n || {}, o = a.prefix || a.name || "x", s = {};
1222
+ for (let e of r) {
1223
+ s[e] = {};
1224
+ for (let t of i) s[e][t] = this.addVar({
1225
+ ...a,
1226
+ name: `${o}_${e}_${t}`
1227
+ });
1228
+ }
1229
+ return s;
1230
+ }
1231
+ let r = t || {}, i = r.prefix || r.name;
1232
+ if (typeof e == "number") {
1233
+ let t = [], n = i || "x";
1234
+ for (let i = 0; i < e; i++) t.push(this.addVar({
1235
+ ...r,
1236
+ name: `${n}_${i}`
1237
+ }));
1238
+ return t;
1239
+ }
1240
+ {
1241
+ let t = {};
1242
+ for (let n of e) {
1243
+ let e = i ? `${i}_${n}` : `${n}`;
1244
+ t[n] = this.addVar({
1245
+ ...r,
1246
+ name: e
1247
+ });
1248
+ }
1249
+ return t;
1250
+ }
1251
+ }
1252
+ addVars2D(e, t, n) {
1253
+ let r = {}, i = n?.name || "x";
1254
+ for (let a of e) {
1255
+ r[a] = {};
1256
+ for (let e of t) r[a][e] = this.addVar({
1257
+ ...n,
1258
+ name: `${i}_${a}_${e}`
1259
+ });
1260
+ }
1261
+ return r;
1262
+ }
1263
+ getVarByName(e) {
1264
+ return this.varMapByName.get(e);
1265
+ }
1266
+ getConstraintByName(e) {
1267
+ return this.constrMapByName.get(e);
1268
+ }
1269
+ setObjective(e, t) {
1270
+ t && (this.sense = t), this.objective = typeof e == "string" ? O(e, (e) => this.getVarByName(e)) : typeof e == "number" ? new S(/* @__PURE__ */ new Map(), e) : e instanceof x || "terms" in e ? e.clone() : new S(/* @__PURE__ */ new Map([[e, 1]]), 0);
1271
+ }
1272
+ maximize(e) {
1273
+ this.setObjective(e, "Maximize");
1274
+ }
1275
+ minimize(e) {
1276
+ this.setObjective(e, "Minimize");
1277
+ }
1278
+ addBoolVar(e) {
1279
+ let t = new d(e);
1280
+ return this.boolVars.push(t), t;
1281
+ }
1282
+ addConstraint(e, t) {
1283
+ if (e instanceof u) {
1284
+ let n = t || `lc_${this.logicalConstraints.length + 1}`;
1285
+ return this.logicalConstraints.push({
1286
+ name: n,
1287
+ expr: e
1288
+ }), e;
1289
+ }
1290
+ let n;
1291
+ if (typeof e == "string" ? n = k(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
+ return this.constraints.push(n), this.constrMapByName.set(n.name, n), n;
1293
+ }
1294
+ addConstr(e, t) {
1295
+ return this.addConstraint(e, t);
1296
+ }
1297
+ addConstrs(e) {
1298
+ return e.map((e) => this.addConstraint(e));
1299
+ }
1300
+ add(e, t) {
1301
+ if (Array.isArray(e)) {
1302
+ for (let t of e) this.add(t);
1303
+ return this;
1304
+ }
1305
+ return e instanceof D ? (this.varMapByName.has(e.name) || (this.variables.push(e), this.varMapByName.set(e.name, e)), this) : (this.addConstraint(e, t), this);
1306
+ }
1307
+ addIndicator(e, t, n = {}) {
1308
+ 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;
1309
+ if (r === 1) {
1310
+ if (c === "<=" || c === "==") {
1311
+ let t = this.addConstraint(s.add(e.mul(i)).le(l + i), c === "==" ? `${a}_le` : a);
1312
+ o.push(t);
1313
+ }
1314
+ if (c === ">=" || c === "==") {
1315
+ let t = this.addConstraint(s.sub(e.mul(i)).ge(l - i), c === "==" ? `${a}_ge` : a);
1316
+ o.push(t);
1317
+ }
1318
+ } else {
1319
+ if (c === "<=" || c === "==") {
1320
+ let t = this.addConstraint(s.sub(e.mul(i)).le(l), c === "==" ? `${a}_le` : a);
1321
+ o.push(t);
1322
+ }
1323
+ if (c === ">=" || c === "==") {
1324
+ let t = this.addConstraint(s.add(e.mul(i)).ge(l), c === "==" ? `${a}_ge` : a);
1325
+ o.push(t);
1326
+ }
1327
+ }
1328
+ return o;
1329
+ }
1330
+ toLpString() {
1331
+ let { lpString: e } = M({
1332
+ name: this.name,
1333
+ sense: this.sense,
1334
+ objective: this.objective,
1335
+ constraints: this.constraints,
1336
+ variables: this.variables
1337
+ });
1338
+ return e;
1339
+ }
1340
+ async optimize(e, t) {
1341
+ 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 = U(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = U(r.solver, r), delete r.solver) : n = this.solver || U()), this.objective instanceof x && 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
+ let i = {
1344
+ name: this.name,
1345
+ sense: this.sense,
1346
+ objective: this.objective,
1347
+ constraints: this.constraints,
1348
+ variables: this.variables,
1349
+ logicalConstraints: this.logicalConstraints,
1350
+ boolVars: this.boolVars
1351
+ }, a = M(i), o = await n.solve(i, a, r);
1352
+ this.runTime = o.runTime ?? 0, this.status = o.status, this.objectiveValue = o.objectiveValue ?? null;
1353
+ let s = {}, c = {}, l = {}, u = {};
1354
+ if (this.values.clear(), o.values) for (let [e, t] of Object.entries(o.values)) {
1355
+ this.values.set(e, t);
1356
+ let n = this.getVarByName(e) || a.nameToVar.get(e);
1357
+ n && (n.value = t, s[n.name] = t);
1358
+ }
1359
+ if (o.reducedCosts) for (let [e, t] of Object.entries(o.reducedCosts)) {
1360
+ let n = this.getVarByName(e) || a.nameToVar.get(e);
1361
+ n && (n.reducedCost = t, l[n.name] = t);
1362
+ }
1363
+ if (o.duals) for (let [e, t] of Object.entries(o.duals)) {
1364
+ let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
1365
+ n && (n.dual = t, c[n.name] = t);
1366
+ }
1367
+ if (o.slacks) for (let [e, t] of Object.entries(o.slacks)) {
1368
+ let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
1369
+ n && (n.slack = t, u[n.name] = t);
1370
+ }
1371
+ return this.solution = {
1372
+ status: this.status,
1373
+ objectiveValue: this.objectiveValue,
1374
+ values: s,
1375
+ duals: c,
1376
+ reducedCosts: l,
1377
+ slacks: u,
1378
+ runTime: this.runTime,
1379
+ raw: o.raw
1380
+ }, this.status;
1381
+ }
1382
+ async solve(e, t) {
1383
+ return this.optimize(e, t);
1384
+ }
1385
+ async check(e, t) {
1386
+ 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 = U(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = U(r.solver, r), delete r.solver) : n = this.solver || U()), 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
+ if (typeof n.check == "function") {
1389
+ let e = await n.check({
1390
+ name: this.name,
1391
+ variables: this.variables,
1392
+ boolVars: this.boolVars,
1393
+ constraints: this.constraints,
1394
+ logicalConstraints: this.logicalConstraints
1395
+ }, r);
1396
+ if (this.status = e.status, this.runTime = e.runTime ?? 0, this.unsatCore = e.unsatCore || [], e.values) {
1397
+ this.values.clear();
1398
+ for (let [t, n] of Object.entries(e.values)) {
1399
+ this.values.set(t, n);
1400
+ let e = this.getVarByName(t);
1401
+ e && typeof n == "number" && (e.value = n);
1402
+ }
1403
+ }
1404
+ return e;
1405
+ }
1406
+ let i = this.objective, a = this.sense;
1407
+ try {
1408
+ this.objective = new S(), this.sense = "Minimize";
1409
+ let e = await this.optimize(n, r), t = e === "Optimal" || e === "Feasible", i = e === "Infeasible", a = {};
1410
+ for (let e of this.variables) a[e.name] = e.value ?? 0;
1411
+ return {
1412
+ status: t ? "Sat" : i ? "Unsat" : "Unknown",
1413
+ values: a,
1414
+ runTime: this.runTime
1415
+ };
1416
+ } finally {
1417
+ this.objective = i, this.sense = a;
1418
+ }
1419
+ }
1420
+ }, X = "Minimize", de = "Maximize", fe = "Continuous", pe = "Integer", me = "Binary", he = {
1421
+ Optimal: "Optimal",
1422
+ Feasible: "Feasible",
1423
+ Infeasible: "Infeasible",
1424
+ Unbounded: "Unbounded",
1425
+ TimeLimit: "Not Solved (Time Limit)",
1426
+ IterationLimit: "Not Solved (Iteration Limit)",
1427
+ Error: "Error",
1428
+ NotSolved: "Not Solved",
1429
+ Sat: "Sat",
1430
+ Unsat: "Unsat",
1431
+ Unknown: "Unknown"
1432
+ }, ge = class e extends D {
1433
+ constructor(e, t, n, r = "Continuous") {
1434
+ super({
1435
+ name: e,
1436
+ lb: t === void 0 ? 0 : t,
1437
+ ub: n === void 0 ? Infinity : n,
1438
+ type: r
1439
+ });
1440
+ }
1441
+ static dicts(t, n, r, i, a = "Continuous") {
1442
+ let o = {};
1443
+ for (let s of n) {
1444
+ let n = `${t}_${s}`;
1445
+ o[s] = new e(n, r, i, a);
1446
+ }
1447
+ return o;
1448
+ }
1449
+ };
1450
+ function _e(e) {
1451
+ return e == null ? null : typeof e == "number" ? e : e.value;
1452
+ }
1453
+ var Z = class {
1454
+ model;
1455
+ constructor(e = "NoName", t = X) {
1456
+ this.model = new Y({
1457
+ name: e,
1458
+ sense: t
1459
+ });
1460
+ }
1461
+ get name() {
1462
+ return this.model.name;
1463
+ }
1464
+ get sense() {
1465
+ return this.model.sense;
1466
+ }
1467
+ set sense(e) {
1468
+ this.model.sense = e;
1469
+ }
1470
+ get objective() {
1471
+ return this.model.objective;
1472
+ }
1473
+ get variables() {
1474
+ return this.model.variables;
1475
+ }
1476
+ get constraints() {
1477
+ return this.model.constraints;
1478
+ }
1479
+ get status() {
1480
+ return this.model.status;
1481
+ }
1482
+ get objectiveValue() {
1483
+ return this.model.objectiveValue;
1484
+ }
1485
+ addVariable(e) {
1486
+ return this.model.getVarByName(e.name) || (this.model.variables.push(e), this.model.varMapByName.set(e.name, e)), e;
1487
+ }
1488
+ setObjective(e) {
1489
+ if (typeof e == "object" && e) {
1490
+ if ("terms" in e) for (let [t] of e.terms) this.addVariable(t);
1491
+ else e instanceof D && this.addVariable(e);
1492
+ }
1493
+ this.model.setObjective(e);
1494
+ }
1495
+ addConstraint(e, t) {
1496
+ if (typeof e == "object" && e && "lhs" in e) for (let [t] of e.lhs.terms) this.addVariable(t);
1497
+ return this.model.addConstraint(e, t);
1498
+ }
1499
+ add(e, t) {
1500
+ typeof e == "string" ? /(<=|>=|==|=<|=>|=)/.test(e) ? this.addConstraint(e, t) : this.setObjective(e) : e instanceof y ? this.addConstraint(e, t) : this.setObjective(e);
1501
+ }
1502
+ async solve(e, t) {
1503
+ return this.model.optimize(e, t);
1504
+ }
1505
+ toLpString() {
1506
+ return this.model.toLpString();
1507
+ }
1508
+ }, Q = "Minimize", $ = "Maximize", ve = "Binary", ye = "Integer", be = "Continuous";
1509
+ function xe(e) {
1510
+ return {
1511
+ expr: e,
1512
+ sense: $
1513
+ };
1514
+ }
1515
+ function Se(e) {
1516
+ return {
1517
+ expr: e,
1518
+ sense: Q
1519
+ };
1520
+ }
1521
+ var Ce = class extends Y {
1522
+ constructor(e = "MipModel", t = Q) {
1523
+ super({
1524
+ name: e,
1525
+ sense: t
1526
+ });
1527
+ }
1528
+ add_var(e = {}) {
1529
+ return this.addVar({
1530
+ name: e.name,
1531
+ type: e.var_type,
1532
+ lb: e.lb,
1533
+ ub: e.ub
1534
+ });
1535
+ }
1536
+ set objective_spec(e) {
1537
+ this.setObjective(e.expr, e.sense);
1538
+ }
1539
+ get objective_value() {
1540
+ return this.objectiveValue;
1541
+ }
1542
+ add_constr(e, t) {
1543
+ return this.addConstraint(e, t);
1544
+ }
1545
+ };
1546
+ //#endregion
1547
+ export { ve as BINARY, u as BoolExpr, f as BoolOp, d as BoolVar, be as CONTINUOUS, y as Constraint, R as GLPKSolver, le as HiGHS, F as HighsSolver, ye as INTEGER, S as LinExpr, me as LpBinary, fe as LpContinuous, pe as LpInteger, de as LpMaximize, X as LpMinimize, Z as LpProblem, he as LpStatus, ge as LpVariable, $ as MAXIMIZE, Q as MINIMIZE, Ce as MipModel, z as MockSolver, Y as Model, c as OFFICIAL_HIGHS_CDN_WASM_URL, x as QuadExpr, D as Var, q as Z3Solver, p as and, ne as c, re as expr, M as generateLpString, L as getGlpk, i as getHighs, o as getHighsWasmUrl, U as getSolver, g as implies, n as isValidWasmHeader, W as listAvailableSolvers, T as lpSum, xe as maximize, Se as minimize, h as not, m as or, k as parseConstraint, O as parseExpr, e as probeWasmUrl, H as registerSolver, J as registerZ3Solver, a as resolveBrowserWasmUrl, ue as setDefaultSolver, s as setHighsWasmUrl, t as solveLpWithHighs, C as sum, _e as value, _ as xor, w as xsum };