@ohtaman/washi 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.ja.md +124 -22
  2. package/README.md +124 -22
  3. package/README.zh-CN.md +124 -22
  4. package/dist/browser/browser-runtime-D13gHOT5.js +4189 -0
  5. package/dist/browser/highs-worker.js +21 -0
  6. package/dist/{lib/demo → browser}/highs.wasm +0 -0
  7. package/dist/browser/highs.wasm.LICENSE +22 -0
  8. package/dist/browser/loader-CVt4CloI.js +58 -0
  9. package/dist/browser/solvers/glpk.js +1057 -0
  10. package/dist/browser/solvers/glpk.min.js +1 -0
  11. package/dist/browser/solvers/z3-built.js +8245 -0
  12. package/dist/browser/solvers/z3-built.wasm +4 -0
  13. package/dist/browser/solvers/z3.js +7528 -0
  14. package/dist/browser/solvers/z3.min.js +5 -0
  15. package/dist/browser/washi.js +1213 -0
  16. package/dist/browser/washi.min.js +5 -0
  17. package/dist/lib/async-mutex-Duo4jwzn.js +195 -0
  18. package/dist/lib/constraint-XWdn0ID9.js +93 -0
  19. package/dist/lib/highs-assets.js +1 -0
  20. package/dist/lib/highs-browser-runtime.js +4189 -0
  21. package/dist/lib/highs-node-runtime.js +1 -0
  22. package/dist/lib/highs-worker-factory.js +1 -0
  23. package/dist/lib/highs-worker.js +21 -0
  24. package/dist/lib/highs.wasm +0 -0
  25. package/dist/lib/loader-Dti0v9yC.js +50 -0
  26. package/dist/lib/registry-DksqCSjI.js +32 -0
  27. package/dist/lib/solvers/glpk.js +153 -2
  28. package/dist/lib/solvers/z3-assets.js +1 -0
  29. package/dist/lib/solvers/z3-built.js +8245 -0
  30. package/dist/lib/solvers/z3-built.wasm +4 -0
  31. package/dist/lib/solvers/z3.js +451 -2
  32. package/dist/lib/washi.js +388 -78
  33. package/dist/types/index.d.ts +2 -3
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/modeler/index.d.ts +1 -1
  36. package/dist/types/modeler/index.d.ts.map +1 -1
  37. package/dist/types/modeler/model.d.ts +1 -1
  38. package/dist/types/modeler/model.d.ts.map +1 -1
  39. package/dist/types/modeler/solvers/glpk/index.d.ts +3 -0
  40. package/dist/types/modeler/solvers/glpk/index.d.ts.map +1 -0
  41. package/dist/types/modeler/solvers/glpk/loader.d.ts +16 -0
  42. package/dist/types/modeler/solvers/glpk/loader.d.ts.map +1 -0
  43. package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -0
  44. package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -0
  45. package/dist/types/modeler/solvers/glpk.d.ts +1 -21
  46. package/dist/types/modeler/solvers/glpk.d.ts.map +1 -1
  47. package/dist/types/modeler/solvers/highs/assets.d.ts +3 -0
  48. package/dist/types/modeler/solvers/highs/assets.d.ts.map +1 -0
  49. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts +2 -0
  50. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts.map +1 -0
  51. package/dist/types/modeler/solvers/highs/index.d.ts +6 -0
  52. package/dist/types/modeler/solvers/highs/index.d.ts.map +1 -0
  53. package/dist/types/{highs-loader.d.ts → modeler/solvers/highs/loader.d.ts} +3 -3
  54. package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -0
  55. package/dist/types/modeler/solvers/highs/node-runtime.d.ts +2 -0
  56. package/dist/types/modeler/solvers/highs/node-runtime.d.ts.map +1 -0
  57. package/dist/types/modeler/solvers/highs/solver.d.ts +33 -0
  58. package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -0
  59. package/dist/types/modeler/solvers/highs/worker-client.d.ts +13 -0
  60. package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -0
  61. package/dist/types/modeler/solvers/highs/worker-factory.d.ts +3 -0
  62. package/dist/types/modeler/solvers/highs/worker-factory.d.ts.map +1 -0
  63. package/dist/types/modeler/solvers/highs/worker.d.ts +2 -0
  64. package/dist/types/modeler/solvers/highs/worker.d.ts.map +1 -0
  65. package/dist/types/modeler/solvers/highs.d.ts +1 -25
  66. package/dist/types/modeler/solvers/highs.d.ts.map +1 -1
  67. package/dist/types/modeler/solvers/index.d.ts +0 -2
  68. package/dist/types/modeler/solvers/index.d.ts.map +1 -1
  69. package/dist/types/modeler/solvers/mock.d.ts +1 -0
  70. package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
  71. package/dist/types/modeler/solvers/registry.d.ts +1 -2
  72. package/dist/types/modeler/solvers/registry.d.ts.map +1 -1
  73. package/dist/types/modeler/solvers/types.d.ts +1 -1
  74. package/dist/types/modeler/solvers/types.d.ts.map +1 -1
  75. package/dist/types/modeler/solvers/z3/assets.d.ts +11 -0
  76. package/dist/types/modeler/solvers/z3/assets.d.ts.map +1 -0
  77. package/dist/types/modeler/solvers/z3/index.d.ts +3 -0
  78. package/dist/types/modeler/solvers/z3/index.d.ts.map +1 -0
  79. package/dist/types/modeler/solvers/z3/loader.d.ts +44 -0
  80. package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -0
  81. package/dist/types/modeler/solvers/z3/solver.d.ts +34 -0
  82. package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -0
  83. package/dist/types/modeler/solvers/z3.d.ts +1 -36
  84. package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
  85. package/package.json +35 -9
  86. package/dist/lib/assets/highs-worker-DeDWU6KI.js +0 -3
  87. package/dist/lib/glpk-BC32ZaPG.js +0 -126
  88. package/dist/lib/washi-logo.png +0 -0
  89. package/dist/lib/washi-logo.svg +0 -70
  90. package/dist/lib/z3-C8g-PtmP.js +0 -582
  91. package/dist/types/glpk-loader.d.ts +0 -8
  92. package/dist/types/glpk-loader.d.ts.map +0 -1
  93. package/dist/types/highs-loader.d.ts.map +0 -1
  94. package/dist/types/highs-worker-client.d.ts +0 -12
  95. package/dist/types/highs-worker-client.d.ts.map +0 -1
  96. package/dist/types/highs-worker.d.ts +0 -2
  97. package/dist/types/highs-worker.d.ts.map +0 -1
@@ -0,0 +1,1213 @@
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
+ //#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 ee = 0, v = 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 = ++ee, 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 y(e, t) {
96
+ let n = e.id, r = t.id;
97
+ return n <= r ? `${n}:${r}` : `${r}:${n}`;
98
+ }
99
+ var b = 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 = y(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 = y(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
+ }, x = 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 b) 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 b ? 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 b();
230
+ Math.abs(this.constant) >= 1e-12 && n.linearTerms.set(t, this.constant);
231
+ for (let [e, r] of this.terms) n = n.add(b.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 v(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 S(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 x(n, r);
308
+ }
309
+ var C = S, w = S, T = 0, E = class e {
310
+ id;
311
+ name;
312
+ type;
313
+ lb;
314
+ ub;
315
+ value = null;
316
+ reducedCost = null;
317
+ constructor(e = {}) {
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
+ }
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 x(/* @__PURE__ */ new Map([[this, t]]), 0);
328
+ if (t instanceof e) return b.fromProduct(this, t, 1);
329
+ let n = new b();
330
+ Math.abs(t.constant) >= 1e-12 && n.linearTerms.set(this, t.constant);
331
+ for (let [e, r] of t.terms) {
332
+ let t = b.fromProduct(this, e, r);
333
+ n = n.add(t);
334
+ }
335
+ return n;
336
+ }
337
+ add(e) {
338
+ return e instanceof b ? e.add(this) : new x(/* @__PURE__ */ new Map([[this, 1]]), 0).add(e);
339
+ }
340
+ sub(e) {
341
+ return e instanceof b ? e.neg().add(this) : new x(/* @__PURE__ */ new Map([[this, 1]]), 0).sub(e);
342
+ }
343
+ neg() {
344
+ return this.mul(-1);
345
+ }
346
+ le(e, t) {
347
+ return new x(/* @__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 x(/* @__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 x(/* @__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 te(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 ne = 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 x(/* @__PURE__ */ new Map(), t);
489
+ }
490
+ if (e.type === "IDENT") {
491
+ this.consume();
492
+ let t = this.resolveVariable(e.value);
493
+ return new x(/* @__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 D(e, t) {
509
+ return new ne(te(e), t).parseExpression();
510
+ }
511
+ function O(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 = D(o, t), u = D(s, t);
520
+ return c === "<=" ? l.le(u, n) : c === ">=" ? l.ge(u, n) : l.eq(u, n);
521
+ }
522
+ function k(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 E) {
528
+ let t = `__v_${i}__`;
529
+ n.set(t, e), r += t;
530
+ } else if (e instanceof x) {
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 re(e, ...t) {
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
+ }
548
+ //#endregion
549
+ //#region src/modeler/lp-writer.ts
550
+ function A(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 j(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 = A(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 = A(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 b ? 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 b && 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 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
657
+ //#region \0washi-browser-worker-factory
658
+ function ae() {
659
+ let e = r("highs-worker.js");
660
+ if (new URL(e).origin === window.location.origin) return new Worker(e, { type: "module" });
661
+ let t = URL.createObjectURL(new Blob(["import " + JSON.stringify(e) + ";"], { type: "text/javascript" }));
662
+ try {
663
+ let e = new Worker(t, { type: "module" }), n = () => URL.revokeObjectURL(t);
664
+ return e.addEventListener("message", n, { once: !0 }), e.addEventListener("error", n, { once: !0 }), e;
665
+ } catch (e) {
666
+ throw URL.revokeObjectURL(t), e;
667
+ }
668
+ }
669
+ //#endregion
670
+ //#region src/modeler/solvers/highs/worker-client.ts
671
+ var B = null, V = 0, H = /* @__PURE__ */ new Map();
672
+ function U() {
673
+ if (typeof window > "u" || typeof Worker > "u") return null;
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({
680
+ result: r,
681
+ runTime: i
682
+ }) : o.reject(Error(a || "Worker solve failed")));
683
+ };
684
+ let t = (t) => {
685
+ if (B === e) {
686
+ B = null, e.terminate();
687
+ for (let e of H.values()) e.reject(t);
688
+ H.clear();
689
+ }
690
+ };
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;
694
+ }
695
+ return B;
696
+ }
697
+ async function W(e, n = {}) {
698
+ let r = await a(n.wasmUrl), i = n.useWorker ?? typeof window < "u" ? U() : null;
699
+ if (!i) return t(e, n);
700
+ let o = {
701
+ ...n,
702
+ wasmUrl: r
703
+ }, s = `req_${++V}`;
704
+ return new Promise((t, n) => {
705
+ H.set(s, {
706
+ resolve: t,
707
+ reject: n
708
+ });
709
+ try {
710
+ i.postMessage({
711
+ type: "SOLVE",
712
+ id: s,
713
+ lpString: e,
714
+ options: o
715
+ });
716
+ } catch (e) {
717
+ H.delete(s), n(e);
718
+ }
719
+ });
720
+ }
721
+ //#endregion
722
+ //#region src/modeler/solvers/highs/solver.ts
723
+ function G(e) {
724
+ if (typeof e != "string") return "Unknown";
725
+ let t = e.trim();
726
+ if (!t) return "Unknown";
727
+ switch (t) {
728
+ case "Optimal": return "Optimal";
729
+ case "Infeasible": return "Infeasible";
730
+ case "Unbounded": return "Unbounded";
731
+ case "Primal infeasible or unbounded": return "Unknown";
732
+ case "Time limit reached":
733
+ case "TimeLimit": return "TimeLimit";
734
+ case "Iteration limit reached":
735
+ case "IterationLimit": return "IterationLimit";
736
+ case "Bound on objective reached":
737
+ case "Target for objective reached":
738
+ case "Feasible": return "Feasible";
739
+ case "Not Set": return "NotSolved";
740
+ case "Load error":
741
+ case "Model error":
742
+ case "Presolve error":
743
+ case "Solve error":
744
+ case "Postsolve error":
745
+ case "Error": return "Error";
746
+ case "Empty":
747
+ case "Unknown": return "Unknown";
748
+ }
749
+ let n = t.toLowerCase();
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";
751
+ }
752
+ var K = class e {
753
+ static capabilities = {
754
+ supportsMIP: !0,
755
+ supportsQP: !0
756
+ };
757
+ name = "HiGHS";
758
+ version = "1.15.3";
759
+ capabilities = e.capabilities;
760
+ options;
761
+ constructor(e = {}) {
762
+ this.options = e;
763
+ }
764
+ async solve(e, t, n = {}) {
765
+ let r = {
766
+ ...this.options,
767
+ ...n
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 = {};
769
+ if (s.Columns) for (let [e, t] of Object.entries(s.Columns)) {
770
+ let n = a.get(e);
771
+ if (n) {
772
+ let e = Math.abs(t.Primal) < 1e-9 ? 0 : t.Primal;
773
+ f[n.name] = e, t.Dual !== void 0 && (m[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual);
774
+ }
775
+ }
776
+ if (s.Rows) {
777
+ let e = Array.isArray(s.Rows) ? s.Rows : Object.values(s.Rows);
778
+ for (let t of e) {
779
+ let e = t.Name, n = o.get(e);
780
+ if (n && (t.Dual !== void 0 && (p[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual), t.Primal !== void 0)) {
781
+ let e = n.rhs - t.Primal;
782
+ h[n.name] = Math.abs(e) < 1e-9 ? 0 : e;
783
+ }
784
+ }
785
+ }
786
+ return {
787
+ status: l,
788
+ objectiveValue: d,
789
+ values: f,
790
+ reducedCosts: m,
791
+ duals: p,
792
+ slacks: h,
793
+ runTime: c,
794
+ raw: s
795
+ };
796
+ }
797
+ }, q = K;
798
+ function oe() {
799
+ I("highs", (e) => new K(e)), L((e) => new K(e));
800
+ }
801
+ oe();
802
+ //#endregion
803
+ //#region src/modeler/solvers/mock.ts
804
+ var J = class {
805
+ name;
806
+ capabilities;
807
+ options;
808
+ constructor(e = {}) {
809
+ this.name = e.name || "MockSolver", this.capabilities = e.capabilities || {
810
+ supportsMIP: !0,
811
+ supportsQP: !0
812
+ }, this.options = e;
813
+ }
814
+ async solve(e, t, n = {}) {
815
+ let r = {
816
+ ...this.options,
817
+ ...n
818
+ };
819
+ return r.delayMs && r.delayMs > 0 && await new Promise((e) => setTimeout(e, r.delayMs)), {
820
+ status: r.status || "Optimal",
821
+ objectiveValue: r.objectiveValue ?? 0,
822
+ values: r.values || {},
823
+ reducedCosts: r.reducedCosts,
824
+ duals: r.duals,
825
+ slacks: r.slacks,
826
+ runTime: .001,
827
+ raw: { mock: !0 }
828
+ };
829
+ }
830
+ };
831
+ function se() {
832
+ I("mock", (e) => new J(e));
833
+ }
834
+ se();
835
+ //#endregion
836
+ //#region src/modeler/model.ts
837
+ var Y = class {
838
+ name;
839
+ sense;
840
+ objective;
841
+ variables = [];
842
+ constraints = [];
843
+ boolVars = [];
844
+ logicalConstraints = [];
845
+ unsatCore = [];
846
+ values = /* @__PURE__ */ new Map();
847
+ varMapByName = /* @__PURE__ */ new Map();
848
+ constrMapByName = /* @__PURE__ */ new Map();
849
+ status = "NotSolved";
850
+ objectiveValue = null;
851
+ runTime = 0;
852
+ solution = null;
853
+ solver = null;
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));
860
+ }
861
+ get vars() {
862
+ return this.variables;
863
+ }
864
+ get constrs() {
865
+ return this.constraints;
866
+ }
867
+ get numVars() {
868
+ return this.variables.length;
869
+ }
870
+ get numConstrs() {
871
+ return this.constraints.length;
872
+ }
873
+ addVar(e, t, n, r) {
874
+ let i;
875
+ i = typeof e == "string" ? {
876
+ name: e,
877
+ type: t,
878
+ lb: n,
879
+ ub: r
880
+ } : e || {};
881
+ let a = new E(i);
882
+ if (this.varMapByName.has(a.name)) throw Error(`Variable with name '${a.name}' already exists in model`);
883
+ return this.variables.push(a), this.varMapByName.set(a.name, a), a;
884
+ }
885
+ addVars(e, t, n) {
886
+ if (typeof t == "number" || Array.isArray(t)) {
887
+ 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 = {};
888
+ for (let e of r) {
889
+ s[e] = {};
890
+ for (let t of i) s[e][t] = this.addVar({
891
+ ...a,
892
+ name: `${o}_${e}_${t}`
893
+ });
894
+ }
895
+ return s;
896
+ }
897
+ let r = t || {}, i = r.prefix || r.name;
898
+ if (typeof e == "number") {
899
+ let t = [], n = i || "x";
900
+ for (let i = 0; i < e; i++) t.push(this.addVar({
901
+ ...r,
902
+ name: `${n}_${i}`
903
+ }));
904
+ return t;
905
+ }
906
+ {
907
+ let t = {};
908
+ for (let n of e) {
909
+ let e = i ? `${i}_${n}` : `${n}`;
910
+ t[n] = this.addVar({
911
+ ...r,
912
+ name: e
913
+ });
914
+ }
915
+ return t;
916
+ }
917
+ }
918
+ addVars2D(e, t, n) {
919
+ let r = {}, i = n?.name || "x";
920
+ for (let a of e) {
921
+ r[a] = {};
922
+ for (let e of t) r[a][e] = this.addVar({
923
+ ...n,
924
+ name: `${i}_${a}_${e}`
925
+ });
926
+ }
927
+ return r;
928
+ }
929
+ getVarByName(e) {
930
+ return this.varMapByName.get(e);
931
+ }
932
+ getConstraintByName(e) {
933
+ return this.constrMapByName.get(e);
934
+ }
935
+ setObjective(e, t) {
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);
937
+ }
938
+ maximize(e) {
939
+ this.setObjective(e, "Maximize");
940
+ }
941
+ minimize(e) {
942
+ this.setObjective(e, "Minimize");
943
+ }
944
+ addBoolVar(e) {
945
+ let t = new d(e);
946
+ return this.boolVars.push(t), t;
947
+ }
948
+ addConstraint(e, t) {
949
+ if (e instanceof u) {
950
+ let n = t || `lc_${this.logicalConstraints.length + 1}`;
951
+ return this.logicalConstraints.push({
952
+ name: n,
953
+ expr: e
954
+ }), e;
955
+ }
956
+ let 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`);
958
+ return this.constraints.push(n), this.constrMapByName.set(n.name, n), n;
959
+ }
960
+ addConstr(e, t) {
961
+ return this.addConstraint(e, t);
962
+ }
963
+ addConstrs(e) {
964
+ return e.map((e) => this.addConstraint(e));
965
+ }
966
+ add(e, t) {
967
+ if (Array.isArray(e)) {
968
+ for (let t of e) this.add(t);
969
+ return this;
970
+ }
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);
972
+ }
973
+ addIndicator(e, t, n = {}) {
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;
975
+ if (r === 1) {
976
+ if (c === "<=" || c === "==") {
977
+ let t = this.addConstraint(s.add(e.mul(i)).le(l + i), c === "==" ? `${a}_le` : a);
978
+ o.push(t);
979
+ }
980
+ if (c === ">=" || c === "==") {
981
+ let t = this.addConstraint(s.sub(e.mul(i)).ge(l - i), c === "==" ? `${a}_ge` : a);
982
+ o.push(t);
983
+ }
984
+ } else {
985
+ if (c === "<=" || c === "==") {
986
+ let t = this.addConstraint(s.sub(e.mul(i)).le(l), c === "==" ? `${a}_le` : a);
987
+ o.push(t);
988
+ }
989
+ if (c === ">=" || c === "==") {
990
+ let t = this.addConstraint(s.add(e.mul(i)).ge(l), c === "==" ? `${a}_ge` : a);
991
+ o.push(t);
992
+ }
993
+ }
994
+ return o;
995
+ }
996
+ toLpString() {
997
+ let { lpString: e } = j({
998
+ name: this.name,
999
+ sense: this.sense,
1000
+ objective: this.objective,
1001
+ constraints: this.constraints,
1002
+ variables: this.variables
1003
+ });
1004
+ return e;
1005
+ }
1006
+ async optimize(e, t) {
1007
+ let n, r;
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.`);
1009
+ let i = {
1010
+ name: this.name,
1011
+ sense: this.sense,
1012
+ objective: this.objective,
1013
+ constraints: this.constraints,
1014
+ variables: this.variables,
1015
+ logicalConstraints: this.logicalConstraints,
1016
+ boolVars: this.boolVars
1017
+ }, a = j(i), o = await n.solve(i, a, r);
1018
+ this.runTime = o.runTime ?? 0, this.status = o.status, this.objectiveValue = o.objectiveValue ?? null;
1019
+ let s = {}, c = {}, l = {}, u = {};
1020
+ if (this.values.clear(), o.values) for (let [e, t] of Object.entries(o.values)) {
1021
+ this.values.set(e, t);
1022
+ let n = this.getVarByName(e) || a.nameToVar.get(e);
1023
+ n && (n.value = t, s[n.name] = t);
1024
+ }
1025
+ if (o.reducedCosts) for (let [e, t] of Object.entries(o.reducedCosts)) {
1026
+ let n = this.getVarByName(e) || a.nameToVar.get(e);
1027
+ n && (n.reducedCost = t, l[n.name] = t);
1028
+ }
1029
+ if (o.duals) for (let [e, t] of Object.entries(o.duals)) {
1030
+ let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
1031
+ n && (n.dual = t, c[n.name] = t);
1032
+ }
1033
+ if (o.slacks) for (let [e, t] of Object.entries(o.slacks)) {
1034
+ let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
1035
+ n && (n.slack = t, u[n.name] = t);
1036
+ }
1037
+ return this.solution = {
1038
+ status: this.status,
1039
+ objectiveValue: this.objectiveValue,
1040
+ values: s,
1041
+ duals: c,
1042
+ reducedCosts: l,
1043
+ slacks: u,
1044
+ runTime: this.runTime,
1045
+ raw: o.raw
1046
+ }, this.status;
1047
+ }
1048
+ async solve(e, t) {
1049
+ return this.optimize(e, t);
1050
+ }
1051
+ async check(e, t) {
1052
+ let n, r;
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.`);
1054
+ if (typeof n.check == "function") {
1055
+ let e = await n.check({
1056
+ name: this.name,
1057
+ variables: this.variables,
1058
+ boolVars: this.boolVars,
1059
+ constraints: this.constraints,
1060
+ logicalConstraints: this.logicalConstraints
1061
+ }, r);
1062
+ if (this.status = e.status, this.runTime = e.runTime ?? 0, this.unsatCore = e.unsatCore || [], e.values) {
1063
+ this.values.clear();
1064
+ for (let [t, n] of Object.entries(e.values)) {
1065
+ this.values.set(t, n);
1066
+ let e = this.getVarByName(t);
1067
+ e && typeof n == "number" && (e.value = n);
1068
+ }
1069
+ }
1070
+ return e;
1071
+ }
1072
+ let i = this.objective, a = this.sense;
1073
+ try {
1074
+ this.objective = new x(), this.sense = "Minimize";
1075
+ let e = await this.optimize(n, r), t = e === "Optimal" || e === "Feasible", i = e === "Infeasible", a = {};
1076
+ for (let e of this.variables) a[e.name] = e.value ?? 0;
1077
+ return {
1078
+ status: t ? "Sat" : i ? "Unsat" : "Unknown",
1079
+ values: a,
1080
+ runTime: this.runTime
1081
+ };
1082
+ } finally {
1083
+ this.objective = i, this.sense = a;
1084
+ }
1085
+ }
1086
+ }, X = "Minimize", ce = "Maximize", le = "Continuous", ue = "Integer", de = "Binary", Z = {
1087
+ Optimal: "Optimal",
1088
+ Feasible: "Feasible",
1089
+ Infeasible: "Infeasible",
1090
+ Unbounded: "Unbounded",
1091
+ TimeLimit: "Not Solved (Time Limit)",
1092
+ IterationLimit: "Not Solved (Iteration Limit)",
1093
+ Error: "Error",
1094
+ NotSolved: "Not Solved",
1095
+ Sat: "Sat",
1096
+ Unsat: "Unsat",
1097
+ Unknown: "Unknown"
1098
+ }, fe = class e extends E {
1099
+ constructor(e, t, n, r = "Continuous") {
1100
+ super({
1101
+ name: e,
1102
+ lb: t === void 0 ? 0 : t,
1103
+ ub: n === void 0 ? Infinity : n,
1104
+ type: r
1105
+ });
1106
+ }
1107
+ static dicts(t, n, r, i, a = "Continuous") {
1108
+ let o = {};
1109
+ for (let s of n) {
1110
+ let n = `${t}_${s}`;
1111
+ o[s] = new e(n, r, i, a);
1112
+ }
1113
+ return o;
1114
+ }
1115
+ };
1116
+ function pe(e) {
1117
+ return e == null ? null : typeof e == "number" ? e : e.value;
1118
+ }
1119
+ var me = class {
1120
+ model;
1121
+ constructor(e = "NoName", t = X) {
1122
+ this.model = new Y({
1123
+ name: e,
1124
+ sense: t
1125
+ });
1126
+ }
1127
+ get name() {
1128
+ return this.model.name;
1129
+ }
1130
+ get sense() {
1131
+ return this.model.sense;
1132
+ }
1133
+ set sense(e) {
1134
+ this.model.sense = e;
1135
+ }
1136
+ get objective() {
1137
+ return this.model.objective;
1138
+ }
1139
+ get variables() {
1140
+ return this.model.variables;
1141
+ }
1142
+ get constraints() {
1143
+ return this.model.constraints;
1144
+ }
1145
+ get status() {
1146
+ return this.model.status;
1147
+ }
1148
+ get objectiveValue() {
1149
+ return this.model.objectiveValue;
1150
+ }
1151
+ addVariable(e) {
1152
+ return this.model.getVarByName(e.name) || (this.model.variables.push(e), this.model.varMapByName.set(e.name, e)), e;
1153
+ }
1154
+ setObjective(e) {
1155
+ if (typeof e == "object" && e) {
1156
+ if ("terms" in e) for (let [t] of e.terms) this.addVariable(t);
1157
+ else e instanceof E && this.addVariable(e);
1158
+ }
1159
+ this.model.setObjective(e);
1160
+ }
1161
+ addConstraint(e, t) {
1162
+ if (typeof e == "object" && e && "lhs" in e) for (let [t] of e.lhs.terms) this.addVariable(t);
1163
+ return this.model.addConstraint(e, t);
1164
+ }
1165
+ add(e, t) {
1166
+ typeof e == "string" ? /(<=|>=|==|=<|=>|=)/.test(e) ? this.addConstraint(e, t) : this.setObjective(e) : e instanceof v ? this.addConstraint(e, t) : this.setObjective(e);
1167
+ }
1168
+ async solve(e, t) {
1169
+ return this.model.optimize(e, t);
1170
+ }
1171
+ toLpString() {
1172
+ return this.model.toLpString();
1173
+ }
1174
+ }, Q = "Minimize", $ = "Maximize", he = "Binary", ge = "Integer", _e = "Continuous";
1175
+ function ve(e) {
1176
+ return {
1177
+ expr: e,
1178
+ sense: $
1179
+ };
1180
+ }
1181
+ function ye(e) {
1182
+ return {
1183
+ expr: e,
1184
+ sense: Q
1185
+ };
1186
+ }
1187
+ var be = class extends Y {
1188
+ constructor(e = "MipModel", t = Q) {
1189
+ super({
1190
+ name: e,
1191
+ sense: t
1192
+ });
1193
+ }
1194
+ add_var(e = {}) {
1195
+ return this.addVar({
1196
+ name: e.name,
1197
+ type: e.var_type,
1198
+ lb: e.lb,
1199
+ ub: e.ub
1200
+ });
1201
+ }
1202
+ set objective_spec(e) {
1203
+ this.setObjective(e.expr, e.sense);
1204
+ }
1205
+ get objective_value() {
1206
+ return this.objectiveValue;
1207
+ }
1208
+ add_constr(e, t) {
1209
+ return this.addConstraint(e, t);
1210
+ }
1211
+ };
1212
+ //#endregion
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 };