@ohtaman/washi 0.1.2 → 0.3.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 (104) hide show
  1. package/README.ja.md +195 -105
  2. package/README.md +195 -105
  3. package/README.zh-CN.md +197 -107
  4. package/dist/browser/highs-worker.js +2 -2
  5. package/dist/browser/{highs-loader-T47YOyos.js → loader-CVt4CloI.js} +2 -2
  6. package/dist/browser/solvers/glpk.js +1065 -0
  7. package/dist/browser/solvers/glpk.min.js +1 -0
  8. package/dist/browser/solvers/z3-built.js +8245 -0
  9. package/dist/browser/solvers/z3-built.wasm +4 -0
  10. package/dist/browser/solvers/z3.js +7550 -0
  11. package/dist/browser/solvers/z3.min.js +5 -0
  12. package/dist/browser/washi.js +370 -642
  13. package/dist/browser/washi.min.js +4 -4
  14. package/dist/lib/async-mutex-Duo4jwzn.js +195 -0
  15. package/dist/lib/constraint-BRuB3ooC.js +90 -0
  16. package/dist/lib/highs-worker.js +2 -2
  17. package/dist/lib/{highs-loader-Blb99785.js → loader-Dti0v9yC.js} +1 -1
  18. package/dist/lib/registry-DksqCSjI.js +32 -0
  19. package/dist/lib/solvers/glpk.js +161 -2
  20. package/dist/lib/solvers/z3-assets.js +1 -0
  21. package/dist/lib/solvers/z3-built.js +8245 -0
  22. package/dist/lib/solvers/z3-built.wasm +4 -0
  23. package/dist/lib/solvers/z3.js +476 -2
  24. package/dist/lib/washi.js +604 -248
  25. package/dist/types/index.d.ts +7 -10
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/modeler/constraint.d.ts +0 -3
  28. package/dist/types/modeler/constraint.d.ts.map +1 -1
  29. package/dist/types/modeler/expression.d.ts +16 -10
  30. package/dist/types/modeler/expression.d.ts.map +1 -1
  31. package/dist/types/modeler/index.d.ts +3 -5
  32. package/dist/types/modeler/index.d.ts.map +1 -1
  33. package/dist/types/modeler/model.d.ts +91 -12
  34. package/dist/types/modeler/model.d.ts.map +1 -1
  35. package/dist/types/modeler/solvers/glpk/index.d.ts +3 -0
  36. package/dist/types/modeler/solvers/glpk/index.d.ts.map +1 -0
  37. package/dist/types/modeler/solvers/glpk/loader.d.ts +16 -0
  38. package/dist/types/modeler/solvers/glpk/loader.d.ts.map +1 -0
  39. package/dist/types/modeler/solvers/glpk/solver.d.ts +26 -0
  40. package/dist/types/modeler/solvers/glpk/solver.d.ts.map +1 -0
  41. package/dist/types/modeler/solvers/glpk.d.ts +1 -21
  42. package/dist/types/modeler/solvers/glpk.d.ts.map +1 -1
  43. package/dist/types/{highs-assets.d.ts → modeler/solvers/highs/assets.d.ts} +1 -1
  44. package/dist/types/modeler/solvers/highs/assets.d.ts.map +1 -0
  45. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts +2 -0
  46. package/dist/types/modeler/solvers/highs/browser-runtime.d.ts.map +1 -0
  47. package/dist/types/modeler/solvers/highs/index.d.ts +6 -0
  48. package/dist/types/modeler/solvers/highs/index.d.ts.map +1 -0
  49. package/dist/types/{highs-loader.d.ts → modeler/solvers/highs/loader.d.ts} +2 -2
  50. package/dist/types/modeler/solvers/highs/loader.d.ts.map +1 -0
  51. package/dist/types/{highs-node-runtime.d.ts → modeler/solvers/highs/node-runtime.d.ts} +1 -1
  52. package/dist/types/modeler/solvers/highs/node-runtime.d.ts.map +1 -0
  53. package/dist/types/modeler/solvers/highs/solver.d.ts +33 -0
  54. package/dist/types/modeler/solvers/highs/solver.d.ts.map +1 -0
  55. package/dist/types/modeler/solvers/highs/worker-client.d.ts +13 -0
  56. package/dist/types/modeler/solvers/highs/worker-client.d.ts.map +1 -0
  57. package/dist/types/{highs-worker-factory.d.ts → modeler/solvers/highs/worker-factory.d.ts} +1 -1
  58. package/dist/types/modeler/solvers/highs/worker-factory.d.ts.map +1 -0
  59. package/dist/types/modeler/solvers/highs/worker.d.ts +2 -0
  60. package/dist/types/modeler/solvers/highs/worker.d.ts.map +1 -0
  61. package/dist/types/modeler/solvers/highs.d.ts +1 -31
  62. package/dist/types/modeler/solvers/highs.d.ts.map +1 -1
  63. package/dist/types/modeler/solvers/index.d.ts +0 -2
  64. package/dist/types/modeler/solvers/index.d.ts.map +1 -1
  65. package/dist/types/modeler/solvers/mock.d.ts +1 -0
  66. package/dist/types/modeler/solvers/mock.d.ts.map +1 -1
  67. package/dist/types/modeler/solvers/registry.d.ts +1 -2
  68. package/dist/types/modeler/solvers/registry.d.ts.map +1 -1
  69. package/dist/types/modeler/solvers/types.d.ts +1 -1
  70. package/dist/types/modeler/solvers/z3/assets.d.ts +11 -0
  71. package/dist/types/modeler/solvers/z3/assets.d.ts.map +1 -0
  72. package/dist/types/modeler/solvers/z3/index.d.ts +3 -0
  73. package/dist/types/modeler/solvers/z3/index.d.ts.map +1 -0
  74. package/dist/types/modeler/solvers/z3/loader.d.ts +56 -0
  75. package/dist/types/modeler/solvers/z3/loader.d.ts.map +1 -0
  76. package/dist/types/modeler/solvers/z3/solver.d.ts +34 -0
  77. package/dist/types/modeler/solvers/z3/solver.d.ts.map +1 -0
  78. package/dist/types/modeler/solvers/z3.d.ts +1 -35
  79. package/dist/types/modeler/solvers/z3.d.ts.map +1 -1
  80. package/dist/types/modeler/types.d.ts +8 -3
  81. package/dist/types/modeler/types.d.ts.map +1 -1
  82. package/dist/types/modeler/variable.d.ts +1 -6
  83. package/dist/types/modeler/variable.d.ts.map +1 -1
  84. package/package.json +28 -6
  85. package/dist/browser/_washi-optional-engine-282Ug7Gw.js +0 -7
  86. package/dist/lib/glpk-5cUpjyb9.js +0 -135
  87. package/dist/lib/z3-C6GeIicJ.js +0 -509
  88. package/dist/types/glpk-loader.d.ts +0 -8
  89. package/dist/types/glpk-loader.d.ts.map +0 -1
  90. package/dist/types/highs-assets.d.ts.map +0 -1
  91. package/dist/types/highs-browser-runtime.d.ts +0 -2
  92. package/dist/types/highs-browser-runtime.d.ts.map +0 -1
  93. package/dist/types/highs-loader.d.ts.map +0 -1
  94. package/dist/types/highs-node-runtime.d.ts.map +0 -1
  95. package/dist/types/highs-worker-client.d.ts +0 -12
  96. package/dist/types/highs-worker-client.d.ts.map +0 -1
  97. package/dist/types/highs-worker-factory.d.ts.map +0 -1
  98. package/dist/types/highs-worker.d.ts +0 -2
  99. package/dist/types/highs-worker.d.ts.map +0 -1
  100. package/dist/types/modeler/mip-compat.d.ts +0 -43
  101. package/dist/types/modeler/mip-compat.d.ts.map +0 -1
  102. package/dist/types/modeler/pulp-compat.d.ts +0 -67
  103. package/dist/types/modeler/pulp-compat.d.ts.map +0 -1
  104. /package/dist/browser/{highs-browser-runtime-D13gHOT5.js → browser-runtime-D13gHOT5.js} +0 -0
package/dist/lib/washi.js CHANGED
@@ -1,12 +1,34 @@
1
- import { _ as e, a as t, c as n, d as r, f as i, g as a, h as o, i as s, l as c, m as l, n as u, o as d, p as f, s as p, t as m, u as h, v as g, y as _ } from "./z3-C6GeIicJ.js";
2
- import { a as v, c as y, i as b, n as x, o as S, r as C, s as w, t as T } from "./highs-loader-Blb99785.js";
3
- import { n as E, t as ee } from "./glpk-5cUpjyb9.js";
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 "./constraint-BRuB3ooC.js";
2
+ import { i as l, n as u, r as d, t as f } from "./registry-DksqCSjI.js";
3
+ import { a as p, c as m, i as h, n as g, o as _, r as v, s as y, t as b } from "./loader-Dti0v9yC.js";
4
+ import { createHighsWorker as ee } from "./highs-worker-factory.js";
5
+ //#region \0rolldown/runtime.js
6
+ var x = Object.defineProperty, te = Object.getOwnPropertyDescriptor, ne = Object.getOwnPropertyNames, re = Object.prototype.hasOwnProperty, S = (e, t) => {
7
+ let n = {};
8
+ for (var r in e) x(n, r, {
9
+ get: e[r],
10
+ enumerable: !0
11
+ });
12
+ return t || x(n, Symbol.toStringTag, { value: "Module" }), n;
13
+ }, C = (e, t, n, r) => {
14
+ if (t && typeof t == "object" || typeof t == "function") for (var i = ne(t), a = 0, o = i.length, s; a < o; a++) s = i[a], !re.call(e, s) && s !== n && x(e, s, {
15
+ get: ((e) => t[e]).bind(null, s),
16
+ enumerable: !(r = te(t, s)) || r.enumerable
17
+ });
18
+ return e;
19
+ }, w = (e, t, n) => (C(e, t, "default"), n && C(n, t, "default"));
20
+ //#endregion
21
+ //#region src/modeler/types.ts
22
+ function T(e) {
23
+ return e && e.toLowerCase() === "maximize" ? "Maximize" : "Minimize";
24
+ }
25
+ //#endregion
4
26
  //#region src/modeler/quad-expr.ts
5
- function D(e, t) {
27
+ function E(e, t) {
6
28
  let n = e.id, r = t.id;
7
29
  return n <= r ? `${n}:${r}` : `${r}:${n}`;
8
30
  }
9
- var O = class e {
31
+ var D = class e {
10
32
  linearTerms;
11
33
  quadTerms;
12
34
  constant;
@@ -19,7 +41,7 @@ var O = class e {
19
41
  return new e(this.linearTerms, this.quadTerms, this.constant);
20
42
  }
21
43
  getQuadCoeff(e, t) {
22
- let n = D(e, t), r = this.quadTerms.get(n);
44
+ let n = E(e, t), r = this.quadTerms.get(n);
23
45
  return r ? r.coeff : 0;
24
46
  }
25
47
  add(t) {
@@ -92,14 +114,14 @@ var O = class e {
92
114
  return this.value;
93
115
  }
94
116
  static fromProduct(t, n, r = 1) {
95
- let i = new e(), a = D(t, n);
117
+ let i = new e(), a = E(t, n);
96
118
  return i.quadTerms.set(a, {
97
119
  var1: t.id <= n.id ? t : n,
98
120
  var2: t.id <= n.id ? n : t,
99
121
  coeff: r
100
122
  }), i;
101
123
  }
102
- }, k = class e {
124
+ }, O = class e {
103
125
  terms;
104
126
  constant;
105
127
  constructor(e = /* @__PURE__ */ new Map(), t = 0) {
@@ -109,7 +131,7 @@ var O = class e {
109
131
  return new e(this.terms, this.constant);
110
132
  }
111
133
  add(e) {
112
- if (e instanceof O) return e.add(this);
134
+ if (e instanceof D) return e.add(this);
113
135
  let t = this.clone();
114
136
  if (typeof e == "number") t.constant += e;
115
137
  else if ("terms" in e) {
@@ -125,7 +147,7 @@ var O = class e {
125
147
  return t;
126
148
  }
127
149
  sub(e) {
128
- return e instanceof O ? e.neg().add(this) : typeof e == "number" ? this.add(-e) : ("terms" in e, this.add(e.mul(-1)));
150
+ return e instanceof D ? e.neg().add(this) : typeof e == "number" ? this.add(-e) : ("terms" in e, this.add(e.mul(-1)));
129
151
  }
130
152
  mul(t) {
131
153
  if (typeof t == "number") {
@@ -136,9 +158,9 @@ var O = class e {
136
158
  }
137
159
  return n;
138
160
  }
139
- let n = new O();
161
+ let n = new D();
140
162
  Math.abs(this.constant) >= 1e-12 && n.linearTerms.set(t, this.constant);
141
- for (let [e, r] of this.terms) n = n.add(O.fromProduct(e, t, r));
163
+ for (let [e, r] of this.terms) n = n.add(D.fromProduct(e, t, r));
142
164
  return n;
143
165
  }
144
166
  div(e) {
@@ -177,11 +199,11 @@ var O = class e {
177
199
  equalTo(e, t) {
178
200
  return this.eq(e, t);
179
201
  }
180
- toConstraint(t, n, i) {
181
- let a = this.clone(), o = 0;
182
- typeof n == "number" ? o = n : "terms" in n ? (a = a.sub(new e(n.terms, 0)), o = n.constant) : a = a.sub(n);
183
- let s = o - a.constant;
184
- return a.constant = 0, new r(a, t, s, i);
202
+ toConstraint(t, n, r) {
203
+ let i = this.clone(), a = 0;
204
+ typeof n == "number" ? a = n : "terms" in n ? (i = i.sub(new e(n.terms, 0)), a = n.constant) : i = i.sub(n);
205
+ let o = a - i.constant;
206
+ return i.constant = 0, new c(i, t, o, r);
185
207
  }
186
208
  toString() {
187
209
  let e = [], t = !0;
@@ -196,27 +218,113 @@ var O = class e {
196
218
  return e.join(" ") || "0";
197
219
  }
198
220
  };
221
+ function k(e, t) {
222
+ let n = /* @__PURE__ */ new Map(), r = 0;
223
+ function i(e) {
224
+ if (e != null) {
225
+ if (typeof e == "number") r += e;
226
+ else if (typeof e == "object" && "terms" in e) {
227
+ let t = e;
228
+ for (let [e, r] of t.terms) {
229
+ let t = n.get(e) || 0;
230
+ n.set(e, t + r);
231
+ }
232
+ r += t.constant;
233
+ } else {
234
+ let t = e, r = n.get(t) || 0;
235
+ n.set(t, r + 1);
236
+ }
237
+ }
238
+ }
239
+ if (typeof e == "number") {
240
+ let n = e, r = t;
241
+ for (let e = 0; e < n; e++) i(r(e, e));
242
+ } else {
243
+ let n = 0;
244
+ for (let r of e) i(t ? t(r, n++) : r);
245
+ }
246
+ for (let [e, t] of n) Math.abs(t) < 1e-12 && n.delete(e);
247
+ return new O(n, r);
248
+ }
199
249
  function A(e, t) {
200
- let n = /* @__PURE__ */ new Map(), r = 0, i = 0;
201
- for (let a of e) {
202
- let e = t ? t(a, i++) : a;
203
- if (typeof e == "number") r += e;
204
- else if (e && typeof e == "object" && "terms" in e) {
205
- let t = e;
206
- for (let [e, r] of t.terms) {
207
- let t = n.get(e) || 0;
208
- n.set(e, t + r);
250
+ let n = /* @__PURE__ */ new Map(), r = 0;
251
+ function i(e) {
252
+ return typeof e == "object" && !!e && typeof e.id == "number" && typeof e.name == "string" && typeof e.mul == "function" && typeof e.le == "function";
253
+ }
254
+ function a(e) {
255
+ return i(e) || e instanceof O || e instanceof D;
256
+ }
257
+ function o(e, t) {
258
+ if (typeof t == "number") r += e * t;
259
+ else if (t instanceof O) {
260
+ for (let [r, i] of t.terms) {
261
+ let t = n.get(r) || 0;
262
+ n.set(r, t + e * i);
209
263
  }
210
- r += t.constant;
211
- } else if (e) {
212
- let t = e, r = n.get(t) || 0;
213
- n.set(t, r + 1);
264
+ r += e * t.constant;
265
+ } else if (i(t)) {
266
+ let r = t, i = n.get(r) || 0;
267
+ n.set(r, i + e);
268
+ } else throw Error("Cannot multiply number by non-variable/expression operand in dot().");
269
+ }
270
+ function s(e) {
271
+ return typeof e == "object" && !!e && !Array.isArray(e) && !a(e);
272
+ }
273
+ function c(e, t, n = "") {
274
+ if (e === void 0 || t === void 0 || e === null || t === null) throw Error(`Nullish or undefined operand encountered in dot() at '${n || "root"}'.`);
275
+ if (typeof e == "number") {
276
+ o(e, t);
277
+ return;
214
278
  }
279
+ if (typeof t == "number") {
280
+ o(t, e);
281
+ return;
282
+ }
283
+ if (Array.isArray(e) || Array.isArray(t)) {
284
+ if (Array.isArray(e) && Array.isArray(t)) {
285
+ if (e.length !== t.length) throw Error(`Array length mismatch in dot() at '${n || "root"}': received lengths ${e.length} and ${t.length}.`);
286
+ for (let r = 0; r < e.length; r++) c(e[r], t[r], n ? `${n}[${r}]` : `[${r}]`);
287
+ return;
288
+ }
289
+ let r = Array.isArray(e) ? e : t, i = Array.isArray(e) ? t : e;
290
+ if (s(i)) {
291
+ let a = Object.keys(i);
292
+ if (a.length > 0 && a.every((e) => /^\d+$/.test(e))) {
293
+ if (a.length !== r.length) throw Error(`Array length mismatch in dot() at '${n || "root"}': array has length ${r.length}, but object has ${a.length} indices.`);
294
+ let o = [];
295
+ for (let e = 0; e < r.length; e++) !(e in i) && !(String(e) in i) && o.push(e);
296
+ if (o.length > 0) throw Error(`Key mismatch in dot() at '${n || "root"}': missing indices [${o.join(", ")}] in numeric record.`);
297
+ for (let i = 0; i < r.length; i++) c(e[i], t[i], n ? `${n}[${i}]` : `[${i}]`);
298
+ return;
299
+ }
300
+ throw Error(`Type mismatch in dot() at '${n || "root"}': one operand is an Array while the other is an Object with keys [${a.slice(0, 5).join(", ")}].`);
301
+ }
302
+ throw Error(`Type mismatch in dot() at '${n || "root"}': one operand is an Array while the other is not.`);
303
+ }
304
+ if (s(e) && s(t)) {
305
+ let r = Object.keys(e), i = Object.keys(t), a = r.filter((e) => !(e in t)), o = i.filter((t) => !(t in e));
306
+ if (a.length > 0 || o.length > 0) {
307
+ let e = [];
308
+ throw a.length > 0 && e.push(`missing in second operand: [${a.join(", ")}]`), o.length > 0 && e.push(`missing in first operand: [${o.join(", ")}]`), Error(`Key mismatch in dot() at '${n || "root"}': ${e.join("; ")}.`);
309
+ }
310
+ for (let i of r) c(e[i], t[i], n ? `${n}.${i}` : i);
311
+ return;
312
+ }
313
+ throw Error(`Unsupported operand types in dot() at '${n || "root"}'.`);
215
314
  }
315
+ c(e, t);
216
316
  for (let [e, t] of n) Math.abs(t) < 1e-12 && n.delete(e);
217
- return new k(n, r);
317
+ return new O(n, r);
218
318
  }
219
- var te = A, j = A, M = 0, N = class e {
319
+ //#endregion
320
+ //#region src/modeler/variable.ts
321
+ var ie = 0;
322
+ function ae(e) {
323
+ if (!e) return "Continuous";
324
+ let t = e.toLowerCase();
325
+ return t === "binary" || t === "bin" ? "Binary" : t === "integer" || t === "int" ? "Integer" : "Continuous";
326
+ }
327
+ var j = class e {
220
328
  id;
221
329
  name;
222
330
  type;
@@ -225,48 +333,42 @@ var te = A, j = A, M = 0, N = class e {
225
333
  value = null;
226
334
  reducedCost = null;
227
335
  constructor(e = {}) {
228
- this.id = ++M, 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);
229
- }
230
- get x() {
231
- return this.value;
232
- }
233
- get varValue() {
234
- return this.value;
336
+ this.id = ++ie, this.name = e.name || `x_${this.id}`, this.type = ae(e.type), 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);
235
337
  }
236
338
  mul(t) {
237
- if (typeof t == "number") return new k(/* @__PURE__ */ new Map([[this, t]]), 0);
238
- if (t instanceof e) return O.fromProduct(this, t, 1);
239
- let n = new O();
339
+ if (typeof t == "number") return new O(/* @__PURE__ */ new Map([[this, t]]), 0);
340
+ if (t instanceof e) return D.fromProduct(this, t, 1);
341
+ let n = new D();
240
342
  Math.abs(t.constant) >= 1e-12 && n.linearTerms.set(this, t.constant);
241
343
  for (let [e, r] of t.terms) {
242
- let t = O.fromProduct(this, e, r);
344
+ let t = D.fromProduct(this, e, r);
243
345
  n = n.add(t);
244
346
  }
245
347
  return n;
246
348
  }
247
349
  add(e) {
248
- return e instanceof O ? e.add(this) : new k(/* @__PURE__ */ new Map([[this, 1]]), 0).add(e);
350
+ return e instanceof D ? e.add(this) : new O(/* @__PURE__ */ new Map([[this, 1]]), 0).add(e);
249
351
  }
250
352
  sub(e) {
251
- return e instanceof O ? e.neg().add(this) : new k(/* @__PURE__ */ new Map([[this, 1]]), 0).sub(e);
353
+ return e instanceof D ? e.neg().add(this) : new O(/* @__PURE__ */ new Map([[this, 1]]), 0).sub(e);
252
354
  }
253
355
  neg() {
254
356
  return this.mul(-1);
255
357
  }
256
358
  le(e, t) {
257
- return new k(/* @__PURE__ */ new Map([[this, 1]]), 0).le(e, t);
359
+ return new O(/* @__PURE__ */ new Map([[this, 1]]), 0).le(e, t);
258
360
  }
259
361
  lessThanOrEqual(e, t) {
260
362
  return this.le(e, t);
261
363
  }
262
364
  ge(e, t) {
263
- return new k(/* @__PURE__ */ new Map([[this, 1]]), 0).ge(e, t);
365
+ return new O(/* @__PURE__ */ new Map([[this, 1]]), 0).ge(e, t);
264
366
  }
265
367
  greaterThanOrEqual(e, t) {
266
368
  return this.ge(e, t);
267
369
  }
268
370
  eq(e, t) {
269
- return new k(/* @__PURE__ */ new Map([[this, 1]]), 0).eq(e, t);
371
+ return new O(/* @__PURE__ */ new Map([[this, 1]]), 0).eq(e, t);
270
372
  }
271
373
  equalTo(e, t) {
272
374
  return this.eq(e, t);
@@ -277,7 +379,7 @@ var te = A, j = A, M = 0, N = class e {
277
379
  };
278
380
  //#endregion
279
381
  //#region src/modeler/parser.ts
280
- function P(e) {
382
+ function M(e) {
281
383
  let t = [], n = 0, r = e.length;
282
384
  for (; n < r;) {
283
385
  let i = e[n];
@@ -333,7 +435,7 @@ function P(e) {
333
435
  }
334
436
  return t;
335
437
  }
336
- var F = class {
438
+ var N = class {
337
439
  tokens;
338
440
  pos = 0;
339
441
  resolver;
@@ -395,12 +497,12 @@ var F = class {
395
497
  let e = this.consume();
396
498
  return this.resolveVariable(e.value).mul(t);
397
499
  }
398
- return new k(/* @__PURE__ */ new Map(), t);
500
+ return new O(/* @__PURE__ */ new Map(), t);
399
501
  }
400
502
  if (e.type === "IDENT") {
401
503
  this.consume();
402
504
  let t = this.resolveVariable(e.value);
403
- return new k(/* @__PURE__ */ new Map([[t, 1]]), 0);
505
+ return new O(/* @__PURE__ */ new Map([[t, 1]]), 0);
404
506
  }
405
507
  if (e.type === "LPAREN") {
406
508
  this.consume("LPAREN");
@@ -415,10 +517,10 @@ var F = class {
415
517
  return t;
416
518
  }
417
519
  };
418
- function I(e, t) {
419
- return new F(P(e), t).parseExpression();
520
+ function P(e, t) {
521
+ return new N(M(e), t).parseExpression();
420
522
  }
421
- function L(e, t, n) {
523
+ function F(e, t, n) {
422
524
  let r = e.match(/(<=|>=|==|=<|=>|=)/);
423
525
  if (!r) throw Error(`Constraint must contain a comparison operator (<=, >=, ==, =): "${e}"`);
424
526
  let i = r[0], a = r.index, o = e.substring(0, a).trim(), s = e.substring(a + i.length).trim(), c;
@@ -426,18 +528,18 @@ function L(e, t, n) {
426
528
  else if (i === ">=" || i === "=>") c = ">=";
427
529
  else if (i === "==" || i === "=") c = "==";
428
530
  else throw Error(`Unsupported operator "${i}"`);
429
- let l = I(o, t), u = I(s, t);
531
+ let l = P(o, t), u = P(s, t);
430
532
  return c === "<=" ? l.le(u, n) : c === ">=" ? l.ge(u, n) : l.eq(u, n);
431
533
  }
432
- function R(e, t) {
534
+ function I(e, t) {
433
535
  let n = /* @__PURE__ */ new Map(), r = "";
434
536
  for (let i = 0; i < e.length; i++) if (r += e[i], i < t.length) {
435
537
  let e = t[i];
436
538
  if (typeof e == "number") r += `(${e})`;
437
- else if (e instanceof N) {
539
+ else if (e instanceof j) {
438
540
  let t = `__v_${i}__`;
439
541
  n.set(t, e), r += t;
440
- } else if (e instanceof k) {
542
+ } else if (e instanceof O) {
441
543
  `${i}`, r += `(${e.toString()})`;
442
544
  for (let [t] of e.terms) n.set(t.name, t);
443
545
  }
@@ -447,42 +549,42 @@ function R(e, t) {
447
549
  resolver: (e) => n.get(e)
448
550
  };
449
551
  }
450
- function z(e, ...t) {
451
- let { fullText: n, resolver: r } = R(e, t);
452
- return L(n, r);
552
+ function L(e, ...t) {
553
+ let { fullText: n, resolver: r } = I(e, t);
554
+ return F(n, r);
453
555
  }
454
- function B(e, ...t) {
455
- let { fullText: n, resolver: r } = R(e, t);
456
- return /(<=|>=|==|=<|=>|=)/.test(n) ? L(n, r) : I(n, r);
556
+ function R(e, ...t) {
557
+ let { fullText: n, resolver: r } = I(e, t);
558
+ return /(<=|>=|==|=<|=>|=)/.test(n) ? F(n, r) : P(n, r);
457
559
  }
458
560
  //#endregion
459
561
  //#region src/modeler/lp-writer.ts
460
- function V(e, t, n) {
562
+ function z(e, t, n) {
461
563
  let r = e.replace(/[^a-zA-Z0-9_]/g, "_");
462
564
  return /^[0-9]/.test(r) && (r = `${t}_${r}`), (!r || r.length === 0) && (r = `${t}_${n}`), r;
463
565
  }
464
- function H(e) {
566
+ function B(e) {
465
567
  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();
466
568
  for (let e of i) {
467
- let t = V(e.name, "x", e.id), n = t, r = 1;
569
+ let t = z(e.name, "x", e.id), n = t, r = 1;
468
570
  for (; c.has(n);) n = `${t}_${r++}`;
469
571
  c.add(n), o.set(e, n), a.set(n, e);
470
572
  }
471
573
  let l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Map();
472
574
  for (let e of r) {
473
- let t = V(e.name, "c", e.id), n = t, r = 1;
575
+ let t = z(e.name, "c", e.id), n = t, r = 1;
474
576
  for (; l.has(n);) n = `${t}_${r++}`;
475
577
  l.add(n), u.set(e, n), s.set(n, e);
476
578
  }
477
579
  let d = [];
478
- d.push(t === "Maximize" ? "Maximize" : "Minimize");
479
- let f = [], p = !0, m = n instanceof O ? n.linearTerms : n.terms;
580
+ d.push(t && t.toLowerCase() === "maximize" ? "Maximize" : "Minimize");
581
+ let f = [], p = !0, m = n instanceof D ? n.linearTerms : n.terms;
480
582
  if (m) for (let [e, t] of m) {
481
583
  if (Math.abs(t) < 1e-12) continue;
482
584
  let n = o.get(e), r = t >= 0 ? p ? "" : "+ " : "- ", i = Math.abs(t), a = i === 1 ? "" : `${i} `;
483
585
  f.push(`${r}${a}${n}`), p = !1;
484
586
  }
485
- if (n instanceof O && n.quadTerms.size > 0) {
587
+ if (n instanceof D && n.quadTerms.size > 0) {
486
588
  let e = [], t = !0;
487
589
  for (let r of n.quadTerms.values()) {
488
590
  if (Math.abs(r.coeff) < 1e-12) continue;
@@ -533,8 +635,248 @@ function H(e) {
533
635
  };
534
636
  }
535
637
  //#endregion
638
+ //#region src/modeler/solvers/highs/worker-client.ts
639
+ var V = null, oe = 0, H = /* @__PURE__ */ new Map();
640
+ function se() {
641
+ if (typeof window > "u" || typeof Worker > "u") return null;
642
+ if (!V) try {
643
+ V = ee();
644
+ let e = V;
645
+ V.onmessage = (e) => {
646
+ let { type: t, id: n, result: r, runTime: i, error: a } = e.data, o = H.get(n);
647
+ o && (H.delete(n), t === "SOLVE_SUCCESS" ? o.resolve({
648
+ result: r,
649
+ runTime: i
650
+ }) : o.reject(Error(a || "Worker solve failed")));
651
+ };
652
+ let t = (t) => {
653
+ if (V === e) {
654
+ V = null, e.terminate();
655
+ for (let e of H.values()) e.reject(t);
656
+ H.clear();
657
+ }
658
+ };
659
+ V.onerror = (e) => t(/* @__PURE__ */ Error(`[WaSHI] HiGHS Worker failed to load or execute. Check Worker assets, CORS and CSP. ${e?.message || ""}`)), V.onmessageerror = () => t(/* @__PURE__ */ Error("[WaSHI] Could not deserialize the HiGHS Worker response."));
660
+ } catch {
661
+ V = null;
662
+ }
663
+ return V;
664
+ }
665
+ async function U(e, t = {}) {
666
+ let n = await _(t.wasmUrl), r = t.useWorker ?? typeof window < "u" ? se() : null;
667
+ if (!r) return m(e, t);
668
+ let i = {
669
+ ...t,
670
+ wasmUrl: n
671
+ }, a = `req_${++oe}`;
672
+ return new Promise((t, n) => {
673
+ H.set(a, {
674
+ resolve: t,
675
+ reject: n
676
+ });
677
+ try {
678
+ r.postMessage({
679
+ type: "SOLVE",
680
+ id: a,
681
+ lpString: e,
682
+ options: i
683
+ });
684
+ } catch (e) {
685
+ H.delete(a), n(e);
686
+ }
687
+ });
688
+ }
689
+ //#endregion
690
+ //#region src/modeler/solvers/highs/solver.ts
691
+ function W(e) {
692
+ if (typeof e != "string") return "Unknown";
693
+ let t = e.trim();
694
+ if (!t) return "Unknown";
695
+ switch (t) {
696
+ case "Optimal": return "Optimal";
697
+ case "Infeasible": return "Infeasible";
698
+ case "Unbounded": return "Unbounded";
699
+ case "Primal infeasible or unbounded": return "Unknown";
700
+ case "Time limit reached":
701
+ case "TimeLimit": return "TimeLimit";
702
+ case "Iteration limit reached":
703
+ case "IterationLimit": return "IterationLimit";
704
+ case "Bound on objective reached":
705
+ case "Target for objective reached":
706
+ case "Feasible": return "Feasible";
707
+ case "Not Set": return "NotSolved";
708
+ case "Load error":
709
+ case "Model error":
710
+ case "Presolve error":
711
+ case "Solve error":
712
+ case "Postsolve error":
713
+ case "Error": return "Error";
714
+ case "Empty":
715
+ case "Unknown": return "Unknown";
716
+ }
717
+ let n = t.toLowerCase();
718
+ 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";
719
+ }
720
+ var G = class e {
721
+ static capabilities = {
722
+ supportsMIP: !0,
723
+ supportsQP: !0
724
+ };
725
+ name = "HiGHS";
726
+ version = "1.15.3";
727
+ capabilities = e.capabilities;
728
+ options;
729
+ constructor(e = {}) {
730
+ this.options = e;
731
+ }
732
+ async solve(e, t, n = {}) {
733
+ let r = {
734
+ ...this.options,
735
+ ...n
736
+ }, { lpString: i, nameToVar: a, nameToConstraint: o } = t, { result: s, runTime: c } = await U(i, r), l = W(s?.Status);
737
+ if (l === "Infeasible" || l === "Unbounded") return {
738
+ status: l,
739
+ objectiveValue: null,
740
+ values: {},
741
+ reducedCosts: {},
742
+ duals: {},
743
+ slacks: {},
744
+ runTime: c,
745
+ raw: s
746
+ };
747
+ let u = s.ObjectiveValue, d = typeof u == "number" ? u + e.objective.constant : null, f = {}, p = {}, m = {}, h = {};
748
+ if (s.Columns) for (let [e, t] of Object.entries(s.Columns)) {
749
+ let n = a.get(e);
750
+ if (n) {
751
+ let e = Math.abs(t.Primal) < 1e-9 ? 0 : t.Primal;
752
+ f[n.name] = e, t.Dual !== void 0 && (m[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual);
753
+ }
754
+ }
755
+ if (s.Rows) {
756
+ let e = Array.isArray(s.Rows) ? s.Rows : Object.values(s.Rows);
757
+ for (let t of e) {
758
+ let e = t.Name, n = o.get(e);
759
+ if (n && (t.Dual !== void 0 && (p[n.name] = Math.abs(t.Dual) < 1e-9 ? 0 : t.Dual), t.Primal !== void 0)) {
760
+ let e = n.rhs - t.Primal;
761
+ h[n.name] = Math.abs(e) < 1e-9 ? 0 : e;
762
+ }
763
+ }
764
+ }
765
+ return {
766
+ status: l,
767
+ objectiveValue: d,
768
+ values: f,
769
+ reducedCosts: m,
770
+ duals: p,
771
+ slacks: h,
772
+ runTime: c,
773
+ raw: s
774
+ };
775
+ }
776
+ }, K = G;
777
+ function q() {
778
+ d("highs", (e) => new G(e)), l((e) => new G(e));
779
+ }
780
+ q();
781
+ //#endregion
782
+ //#region src/modeler/solvers/highs/index.ts
783
+ var J = /* @__PURE__ */ S({
784
+ HiGHS: () => K,
785
+ HighsSolver: () => G,
786
+ OFFICIAL_HIGHS_CDN_WASM_URL: () => b,
787
+ getHighs: () => g,
788
+ getHighsWasmUrl: () => v,
789
+ isValidWasmHeader: () => h,
790
+ mapHighsStatus: () => W,
791
+ probeWasmUrl: () => p,
792
+ registerHighsSolver: () => q,
793
+ resolveBrowserWasmUrl: () => _,
794
+ setHighsWasmUrl: () => y,
795
+ solveLp: () => U,
796
+ solveLpWithHighs: () => m
797
+ });
798
+ import * as ce from "./highs-worker-factory.js";
799
+ w(J, ce);
800
+ import * as le from "./highs-assets.js";
801
+ w(J, le);
802
+ //#endregion
803
+ //#region src/modeler/solvers/highs.ts
804
+ var Y = /* @__PURE__ */ S({
805
+ HiGHS: () => K,
806
+ HighsSolver: () => G,
807
+ OFFICIAL_HIGHS_CDN_WASM_URL: () => b,
808
+ getHighs: () => g,
809
+ getHighsWasmUrl: () => v,
810
+ isValidWasmHeader: () => h,
811
+ mapHighsStatus: () => W,
812
+ probeWasmUrl: () => p,
813
+ registerHighsSolver: () => q,
814
+ resolveBrowserWasmUrl: () => _,
815
+ setHighsWasmUrl: () => y,
816
+ solveLp: () => U,
817
+ solveLpWithHighs: () => m
818
+ });
819
+ w(Y, J);
820
+ //#endregion
821
+ //#region src/modeler/solvers/mock.ts
822
+ var X = class {
823
+ name;
824
+ capabilities;
825
+ options;
826
+ constructor(e = {}) {
827
+ this.name = e.name || "MockSolver", this.capabilities = e.capabilities || {
828
+ supportsMIP: !0,
829
+ supportsQP: !0
830
+ }, this.options = e;
831
+ }
832
+ async solve(e, t, n = {}) {
833
+ let r = {
834
+ ...this.options,
835
+ ...n
836
+ };
837
+ return r.delayMs && r.delayMs > 0 && await new Promise((e) => setTimeout(e, r.delayMs)), {
838
+ status: r.status || "Optimal",
839
+ objectiveValue: r.objectiveValue ?? 0,
840
+ values: r.values || {},
841
+ reducedCosts: r.reducedCosts,
842
+ duals: r.duals,
843
+ slacks: r.slacks,
844
+ runTime: .001,
845
+ raw: { mock: !0 }
846
+ };
847
+ }
848
+ };
849
+ function Z() {
850
+ d("mock", (e) => new X(e));
851
+ }
852
+ Z();
853
+ //#endregion
854
+ //#region src/modeler/solvers/index.ts
855
+ var Q = /* @__PURE__ */ S({
856
+ HiGHS: () => K,
857
+ HighsSolver: () => G,
858
+ MockSolver: () => X,
859
+ OFFICIAL_HIGHS_CDN_WASM_URL: () => b,
860
+ getHighs: () => g,
861
+ getHighsWasmUrl: () => v,
862
+ getSolver: () => f,
863
+ isValidWasmHeader: () => h,
864
+ listAvailableSolvers: () => u,
865
+ mapHighsStatus: () => W,
866
+ probeWasmUrl: () => p,
867
+ registerHighsSolver: () => q,
868
+ registerMockSolver: () => Z,
869
+ registerSolver: () => d,
870
+ resolveBrowserWasmUrl: () => _,
871
+ setDefaultSolver: () => l,
872
+ setHighsWasmUrl: () => y,
873
+ solveLp: () => U,
874
+ solveLpWithHighs: () => m
875
+ });
876
+ w(Q, Y);
877
+ //#endregion
536
878
  //#region src/modeler/model.ts
537
- var U = class {
879
+ var $ = class {
538
880
  name;
539
881
  sense;
540
882
  objective;
@@ -551,8 +893,12 @@ var U = class {
551
893
  runTime = 0;
552
894
  solution = null;
553
895
  solver = null;
554
- constructor(e = {}) {
555
- this.name = e.name || "OptimizationModel", this.sense = e.sense || "Minimize", this.objective = new k(), e.solver && (this.solver = s(e.solver));
896
+ constructor(e = {}, t) {
897
+ let n;
898
+ n = typeof e == "string" ? {
899
+ ...t,
900
+ name: e
901
+ } : e, this.name = n.name || "OptimizationModel", this.sense = T(n.sense), this.objective = new O(), n.solver && (this.solver = f(n.solver));
556
902
  }
557
903
  get vars() {
558
904
  return this.variables;
@@ -566,6 +912,60 @@ var U = class {
566
912
  get numConstrs() {
567
913
  return this.constraints.length;
568
914
  }
915
+ createDomainVars(e, t, n, r) {
916
+ if (typeof n == "number" || Array.isArray(n)) {
917
+ let i = typeof t == "number" ? Array.from({ length: t }, (e, t) => t) : t, a = typeof n == "number" ? Array.from({ length: n }, (e, t) => t) : n, o = r || {}, s = o.prefix || o.name || "x", c = {};
918
+ for (let t of i) {
919
+ c[t] = {};
920
+ for (let n of a) c[t][n] = this.addVar({
921
+ ...o,
922
+ type: e,
923
+ name: `${s}_${t}_${n}`
924
+ });
925
+ }
926
+ return c;
927
+ }
928
+ if (typeof t == "string") {
929
+ let r = n || {};
930
+ return this.addVar({
931
+ ...r,
932
+ type: e,
933
+ name: t
934
+ });
935
+ }
936
+ let i = n || {}, a = i.prefix || i.name;
937
+ if (typeof t == "number") {
938
+ let n = [], r = a || "x";
939
+ for (let a = 0; a < t; a++) n.push(this.addVar({
940
+ ...i,
941
+ type: e,
942
+ name: `${r}_${a}`
943
+ }));
944
+ return n;
945
+ }
946
+ if (Array.isArray(t) || t && typeof t[Symbol.iterator] == "function") {
947
+ let n = {};
948
+ for (let r of t) {
949
+ let t = a ? `${a}_${r}` : `${r}`;
950
+ n[r] = this.addVar({
951
+ ...i,
952
+ type: e,
953
+ name: t
954
+ });
955
+ }
956
+ return n;
957
+ }
958
+ throw Error(`Invalid arguments provided for ${e.toLowerCase()} variable creation`);
959
+ }
960
+ binary(e, t, n) {
961
+ return this.createDomainVars("Binary", e, t, n);
962
+ }
963
+ integer(e, t, n) {
964
+ return this.createDomainVars("Integer", e, t, n);
965
+ }
966
+ continuous(e, t, n) {
967
+ return this.createDomainVars("Continuous", e, t, n);
968
+ }
569
969
  addVar(e, t, n, r) {
570
970
  let i;
571
971
  i = typeof e == "string" ? {
@@ -574,7 +974,7 @@ var U = class {
574
974
  lb: n,
575
975
  ub: r
576
976
  } : e || {};
577
- let a = new N(i);
977
+ let a = new j(i);
578
978
  if (this.varMapByName.has(a.name)) throw Error(`Variable with name '${a.name}' already exists in model`);
579
979
  return this.variables.push(a), this.varMapByName.set(a.name, a), a;
580
980
  }
@@ -629,7 +1029,8 @@ var U = class {
629
1029
  return this.constrMapByName.get(e);
630
1030
  }
631
1031
  setObjective(e, t) {
632
- t && (this.sense = t), this.objective = typeof e == "string" ? I(e, (e) => this.getVarByName(e)) : typeof e == "number" ? new k(/* @__PURE__ */ new Map(), e) : e instanceof O || "terms" in e ? e.clone() : new k(/* @__PURE__ */ new Map([[e, 1]]), 0);
1032
+ if (e instanceof c) throw Error("Cannot set objective to a constraint comparison (<=, >=, ==). Did you mean to use m.constrain(expr`... <= ...`)? For objectives, supply an unconstrained expression like expr`45 * ${x} + 80 * ${y}`.");
1033
+ t && (this.sense = T(t)), this.objective = typeof e == "string" ? P(e, (e) => this.getVarByName(e)) : typeof e == "number" ? new O(/* @__PURE__ */ new Map(), e) : e instanceof D || "terms" in e ? e.clone() : new O(/* @__PURE__ */ new Map([[e, 1]]), 0);
633
1034
  }
634
1035
  maximize(e) {
635
1036
  this.setObjective(e, "Maximize");
@@ -637,11 +1038,31 @@ var U = class {
637
1038
  minimize(e) {
638
1039
  this.setObjective(e, "Minimize");
639
1040
  }
1041
+ constrain(e, t) {
1042
+ if (Array.isArray(e)) {
1043
+ for (let t of e) this.constrain(t);
1044
+ return this;
1045
+ }
1046
+ if (e instanceof O) throw Error("Cannot add a linear expression without a comparison operator (<=, >=, ==) as a constraint. Use expr`... <= ...` or .le(), .ge(), .eq().");
1047
+ return this.addConstraint(e, t), this;
1048
+ }
1049
+ getValues(e) {
1050
+ if (e == null) return null;
1051
+ if (e instanceof j) return e.value;
1052
+ if (Array.isArray(e)) return e.map((e) => this.getValues(e));
1053
+ if (typeof e == "object") {
1054
+ let t = {};
1055
+ for (let [n, r] of Object.entries(e)) t[n] = this.getValues(r);
1056
+ return t;
1057
+ }
1058
+ return null;
1059
+ }
640
1060
  addBoolVar(e) {
641
- let t = new l(e);
1061
+ let t = new n(e);
642
1062
  return this.boolVars.push(t), t;
643
1063
  }
644
1064
  addConstraint(e, t) {
1065
+ if (e instanceof O) throw Error("Cannot add a linear expression without a comparison operator (<=, >=, ==) as a constraint. Use expr`... <= ...` or .le(), .ge(), .eq().");
645
1066
  if (e instanceof i) {
646
1067
  let n = t || `lc_${this.logicalConstraints.length + 1}`;
647
1068
  return this.logicalConstraints.push({
@@ -650,7 +1071,7 @@ var U = class {
650
1071
  }), e;
651
1072
  }
652
1073
  let n;
653
- if (typeof e == "string" ? n = L(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`);
1074
+ if (typeof e == "string" ? n = F(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`);
654
1075
  return this.constraints.push(n), this.constrMapByName.set(n.name, n), n;
655
1076
  }
656
1077
  addConstr(e, t) {
@@ -664,33 +1085,37 @@ var U = class {
664
1085
  for (let t of e) this.add(t);
665
1086
  return this;
666
1087
  }
667
- return e instanceof N ? (this.varMapByName.has(e.name) || (this.variables.push(e), this.varMapByName.set(e.name, e)), this) : (this.addConstraint(e, t), this);
668
- }
669
- addIndicator(e, t, n = {}) {
670
- 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;
671
- if (r === 1) {
672
- if (c === "<=" || c === "==") {
673
- let t = this.addConstraint(s.add(e.mul(i)).le(l + i), c === "==" ? `${a}_le` : a);
674
- o.push(t);
1088
+ return e instanceof j ? (this.varMapByName.has(e.name) || (this.variables.push(e), this.varMapByName.set(e.name, e)), this) : (this.addConstraint(e, t), this);
1089
+ }
1090
+ indicator(e, t, n = {}) {
1091
+ if (!("sense" in t) || !("lhs" in t)) throw Error("Invalid constraint expression passed to indicator(). Expression must include a comparison operator (<=, >=, ==).");
1092
+ let r = t, i = n.activeValue === void 0 ? 1 : n.activeValue, a = n.M === void 0 ? 1e5 : n.M, o = n.name || `ind_${e.name}_${r.name}`, s = [], { lhs: c, sense: l, rhs: u } = r;
1093
+ if (i === 1) {
1094
+ if (l === "<=" || l === "==") {
1095
+ let t = this.addConstraint(c.add(e.mul(a)).le(u + a), l === "==" ? `${o}_le` : o);
1096
+ s.push(t);
675
1097
  }
676
- if (c === ">=" || c === "==") {
677
- let t = this.addConstraint(s.sub(e.mul(i)).ge(l - i), c === "==" ? `${a}_ge` : a);
678
- o.push(t);
1098
+ if (l === ">=" || l === "==") {
1099
+ let t = this.addConstraint(c.sub(e.mul(a)).ge(u - a), l === "==" ? `${o}_ge` : o);
1100
+ s.push(t);
679
1101
  }
680
1102
  } else {
681
- if (c === "<=" || c === "==") {
682
- let t = this.addConstraint(s.sub(e.mul(i)).le(l), c === "==" ? `${a}_le` : a);
683
- o.push(t);
1103
+ if (l === "<=" || l === "==") {
1104
+ let t = this.addConstraint(c.sub(e.mul(a)).le(u), l === "==" ? `${o}_le` : o);
1105
+ s.push(t);
684
1106
  }
685
- if (c === ">=" || c === "==") {
686
- let t = this.addConstraint(s.add(e.mul(i)).ge(l), c === "==" ? `${a}_ge` : a);
687
- o.push(t);
1107
+ if (l === ">=" || l === "==") {
1108
+ let t = this.addConstraint(c.add(e.mul(a)).ge(u), l === "==" ? `${o}_ge` : o);
1109
+ s.push(t);
688
1110
  }
689
1111
  }
690
- return o;
1112
+ return s;
1113
+ }
1114
+ addIndicator(e, t, n = {}) {
1115
+ return this.indicator(e, t, n);
691
1116
  }
692
1117
  toLpString() {
693
- let { lpString: e } = H({
1118
+ let { lpString: e } = B({
694
1119
  name: this.name,
695
1120
  sense: this.sense,
696
1121
  objective: this.objective,
@@ -701,7 +1126,7 @@ var U = class {
701
1126
  }
702
1127
  async optimize(e, t) {
703
1128
  let n, r;
704
- 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 = s(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = s(r.solver, r), delete r.solver) : n = this.solver || s()), this.objective instanceof O && 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.`);
1129
+ 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 = f(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = f(r.solver, r), delete r.solver) : n = this.solver || f()), this.objective instanceof D && 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.`);
705
1130
  let i = {
706
1131
  name: this.name,
707
1132
  sense: this.sense,
@@ -710,33 +1135,43 @@ var U = class {
710
1135
  variables: this.variables,
711
1136
  logicalConstraints: this.logicalConstraints,
712
1137
  boolVars: this.boolVars
713
- }, a = H(i), o = await n.solve(i, a, r);
1138
+ }, a = B(i), o = await n.solve(i, a, r);
714
1139
  this.runTime = o.runTime ?? 0, this.status = o.status, this.objectiveValue = o.objectiveValue ?? null;
715
- let c = {}, l = {}, u = {}, d = {};
716
- if (this.values.clear(), o.values) for (let [e, t] of Object.entries(o.values)) {
717
- this.values.set(e, t);
718
- let n = this.getVarByName(e) || a.nameToVar.get(e);
719
- n && (n.value = t, c[n.name] = t);
1140
+ let s = {}, c = {}, l = {}, u = {};
1141
+ this.values.clear();
1142
+ for (let e of this.variables) e.value = null, e.reducedCost = null;
1143
+ for (let e of this.boolVars) e.value = null;
1144
+ for (let e of this.constraints) e.dual = null, e.slack = null;
1145
+ if (a?.nameToVar) for (let e of a.nameToVar.values()) e.value = null, e.reducedCost = null;
1146
+ if (a?.nameToConstraint) for (let e of a.nameToConstraint.values()) e.dual = null, e.slack = null;
1147
+ if (o.values && o.status !== "Infeasible" && o.status !== "Unbounded") {
1148
+ for (let [e, t] of Object.entries(o.values)) if (typeof t == "number" && !Number.isNaN(t)) {
1149
+ this.values.set(e, t);
1150
+ let n = this.getVarByName(e) || a.nameToVar.get(e);
1151
+ n && (n.value = t, s[n.name] = t);
1152
+ let r = this.boolVars.find((t) => t.name === e);
1153
+ r && (r.value = !!t);
1154
+ }
720
1155
  }
721
1156
  if (o.reducedCosts) for (let [e, t] of Object.entries(o.reducedCosts)) {
722
1157
  let n = this.getVarByName(e) || a.nameToVar.get(e);
723
- n && (n.reducedCost = t, u[n.name] = t);
1158
+ n && (n.reducedCost = t, l[n.name] = t);
724
1159
  }
725
1160
  if (o.duals) for (let [e, t] of Object.entries(o.duals)) {
726
1161
  let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
727
- n && (n.dual = t, l[n.name] = t);
1162
+ n && (n.dual = t, c[n.name] = t);
728
1163
  }
729
1164
  if (o.slacks) for (let [e, t] of Object.entries(o.slacks)) {
730
1165
  let n = this.getConstraintByName(e) || a.nameToConstraint.get(e);
731
- n && (n.slack = t, d[n.name] = t);
1166
+ n && (n.slack = t, u[n.name] = t);
732
1167
  }
733
1168
  return this.solution = {
734
1169
  status: this.status,
735
1170
  objectiveValue: this.objectiveValue,
736
- values: c,
737
- duals: l,
738
- reducedCosts: u,
739
- slacks: d,
1171
+ values: s,
1172
+ duals: c,
1173
+ reducedCosts: l,
1174
+ slacks: u,
740
1175
  runTime: this.runTime,
741
1176
  raw: o.raw
742
1177
  }, this.status;
@@ -746,7 +1181,7 @@ var U = class {
746
1181
  }
747
1182
  async check(e, t) {
748
1183
  let n, r;
749
- 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 = s(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = s(r.solver, r), delete r.solver) : n = this.solver || s()), 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.`);
1184
+ 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 = f(e, t), r = t || {}) : (r = { ...e }, r.solver ? (n = f(r.solver, r), delete r.solver) : n = this.solver || f()), 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.`);
750
1185
  if (typeof n.check == "function") {
751
1186
  let e = await n.check({
752
1187
  name: this.name,
@@ -755,21 +1190,26 @@ var U = class {
755
1190
  constraints: this.constraints,
756
1191
  logicalConstraints: this.logicalConstraints
757
1192
  }, r);
758
- if (this.status = e.status, this.runTime = e.runTime ?? 0, this.unsatCore = e.unsatCore || [], e.values) {
759
- this.values.clear();
760
- for (let [t, n] of Object.entries(e.values)) {
761
- this.values.set(t, n);
762
- let e = this.getVarByName(t);
763
- e && typeof n == "number" && (e.value = n);
764
- }
1193
+ this.status = e.status, this.runTime = e.runTime ?? 0, this.unsatCore = e.unsatCore || [], this.values.clear();
1194
+ for (let e of this.variables) e.value = null;
1195
+ for (let e of this.boolVars) e.value = null;
1196
+ if (e.values && e.status === "Sat") for (let [t, n] of Object.entries(e.values)) {
1197
+ this.values.set(t, n);
1198
+ let e = this.getVarByName(t);
1199
+ e && typeof n == "number" && (e.value = n);
1200
+ let r = this.boolVars.find((e) => e.name === t);
1201
+ r && (r.value = !!n);
765
1202
  }
766
1203
  return e;
767
1204
  }
768
1205
  let i = this.objective, a = this.sense;
769
1206
  try {
770
- this.objective = new k(), this.sense = "Minimize";
1207
+ this.objective = new O(), this.sense = "Minimize";
771
1208
  let e = await this.optimize(n, r), t = e === "Optimal" || e === "Feasible", i = e === "Infeasible", a = {};
772
- for (let e of this.variables) a[e.name] = e.value ?? 0;
1209
+ if (t) {
1210
+ for (let e of this.variables) e.value !== null && (a[e.name] = e.value);
1211
+ for (let e of this.boolVars) e.value !== null && (a[e.name] = e.value);
1212
+ }
773
1213
  return {
774
1214
  status: t ? "Sat" : i ? "Unsat" : "Unknown",
775
1215
  values: a,
@@ -779,131 +1219,47 @@ var U = class {
779
1219
  this.objective = i, this.sense = a;
780
1220
  }
781
1221
  }
782
- }, W = "Minimize", G = "Maximize", K = "Continuous", q = "Integer", J = "Binary", Y = {
783
- Optimal: "Optimal",
784
- Feasible: "Feasible",
785
- Infeasible: "Infeasible",
786
- Unbounded: "Unbounded",
787
- TimeLimit: "Not Solved (Time Limit)",
788
- IterationLimit: "Not Solved (Iteration Limit)",
789
- Error: "Error",
790
- NotSolved: "Not Solved",
791
- Sat: "Sat",
792
- Unsat: "Unsat",
793
- Unknown: "Unknown"
794
- }, X = class e extends N {
795
- constructor(e, t, n, r = "Continuous") {
796
- super({
797
- name: e,
798
- lb: t === void 0 ? 0 : t,
799
- ub: n === void 0 ? Infinity : n,
800
- type: r
801
- });
802
- }
803
- static dicts(t, n, r, i, a = "Continuous") {
804
- let o = {};
805
- for (let s of n) {
806
- let n = `${t}_${s}`;
807
- o[s] = new e(n, r, i, a);
808
- }
809
- return o;
810
- }
811
- };
812
- function Z(e) {
813
- return e == null ? null : typeof e == "number" ? e : e.value;
814
- }
815
- var ne = class {
816
- model;
817
- constructor(e = "NoName", t = W) {
818
- this.model = new U({
819
- name: e,
820
- sense: t
821
- });
822
- }
823
- get name() {
824
- return this.model.name;
825
- }
826
- get sense() {
827
- return this.model.sense;
828
- }
829
- set sense(e) {
830
- this.model.sense = e;
831
- }
832
- get objective() {
833
- return this.model.objective;
834
- }
835
- get variables() {
836
- return this.model.variables;
837
- }
838
- get constraints() {
839
- return this.model.constraints;
840
- }
841
- get status() {
842
- return this.model.status;
843
- }
844
- get objectiveValue() {
845
- return this.model.objectiveValue;
846
- }
847
- addVariable(e) {
848
- return this.model.getVarByName(e.name) || (this.model.variables.push(e), this.model.varMapByName.set(e.name, e)), e;
849
- }
850
- setObjective(e) {
851
- if (typeof e == "object" && e) {
852
- if ("terms" in e) for (let [t] of e.terms) this.addVariable(t);
853
- else e instanceof N && this.addVariable(e);
854
- }
855
- this.model.setObjective(e);
856
- }
857
- addConstraint(e, t) {
858
- if (typeof e == "object" && e && "lhs" in e) for (let [t] of e.lhs.terms) this.addVariable(t);
859
- return this.model.addConstraint(e, t);
860
- }
861
- add(e, t) {
862
- typeof e == "string" ? /(<=|>=|==|=<|=>|=)/.test(e) ? this.addConstraint(e, t) : this.setObjective(e) : e instanceof r ? this.addConstraint(e, t) : this.setObjective(e);
863
- }
864
- async solve(e, t) {
865
- return this.model.optimize(e, t);
866
- }
867
- toLpString() {
868
- return this.model.toLpString();
869
- }
870
- }, Q = "Minimize", $ = "Maximize", re = "Binary", ie = "Integer", ae = "Continuous";
871
- function oe(e) {
872
- return {
873
- expr: e,
874
- sense: $
875
- };
876
- }
877
- function se(e) {
878
- return {
879
- expr: e,
880
- sense: Q
881
- };
882
- }
883
- var ce = class extends U {
884
- constructor(e = "MipModel", t = Q) {
885
- super({
886
- name: e,
887
- sense: t
888
- });
889
- }
890
- add_var(e = {}) {
891
- return this.addVar({
892
- name: e.name,
893
- type: e.var_type,
894
- lb: e.lb,
895
- ub: e.ub
896
- });
897
- }
898
- set objective_spec(e) {
899
- this.setObjective(e.expr, e.sense);
900
- }
901
- get objective_value() {
902
- return this.objectiveValue;
903
- }
904
- add_constr(e, t) {
905
- return this.addConstraint(e, t);
906
- }
907
1222
  };
1223
+ w(/* @__PURE__ */ S({
1224
+ BoolExpr: () => i,
1225
+ BoolOp: () => o,
1226
+ BoolVar: () => n,
1227
+ Constraint: () => c,
1228
+ HiGHS: () => K,
1229
+ HighsSolver: () => G,
1230
+ LinExpr: () => O,
1231
+ MockSolver: () => X,
1232
+ Model: () => $,
1233
+ OFFICIAL_HIGHS_CDN_WASM_URL: () => b,
1234
+ QuadExpr: () => D,
1235
+ Var: () => j,
1236
+ and: () => e,
1237
+ c: () => L,
1238
+ dot: () => A,
1239
+ expr: () => R,
1240
+ generateLpString: () => B,
1241
+ getHighs: () => g,
1242
+ getHighsWasmUrl: () => v,
1243
+ getSolver: () => f,
1244
+ implies: () => a,
1245
+ isValidWasmHeader: () => h,
1246
+ listAvailableSolvers: () => u,
1247
+ mapHighsStatus: () => W,
1248
+ not: () => s,
1249
+ or: () => t,
1250
+ parseConstraint: () => F,
1251
+ parseExpr: () => P,
1252
+ probeWasmUrl: () => p,
1253
+ registerHighsSolver: () => q,
1254
+ registerMockSolver: () => Z,
1255
+ registerSolver: () => d,
1256
+ resolveBrowserWasmUrl: () => _,
1257
+ setDefaultSolver: () => l,
1258
+ setHighsWasmUrl: () => y,
1259
+ solveLp: () => U,
1260
+ solveLpWithHighs: () => m,
1261
+ sum: () => k,
1262
+ xor: () => r
1263
+ }), Q);
908
1264
  //#endregion
909
- export { re as BINARY, i as BoolExpr, f as BoolOp, l as BoolVar, ae as CONTINUOUS, r as Constraint, ee as GLPKSolver, c as HiGHS, h as HighsSolver, ie as INTEGER, k as LinExpr, J as LpBinary, K as LpContinuous, q as LpInteger, G as LpMaximize, W as LpMinimize, ne as LpProblem, Y as LpStatus, X as LpVariable, $ as MAXIMIZE, Q as MINIMIZE, ce as MipModel, n as MockSolver, U as Model, T as OFFICIAL_HIGHS_CDN_WASM_URL, O as QuadExpr, N as Var, m as Z3Solver, o as and, z as c, B as expr, H as generateLpString, E as getGlpk, x as getHighs, C as getHighsWasmUrl, s as getSolver, a as implies, b as isValidWasmHeader, t as listAvailableSolvers, j as lpSum, oe as maximize, se as minimize, e as not, g as or, L as parseConstraint, I as parseExpr, v as probeWasmUrl, d as registerSolver, u as registerZ3Solver, S as resolveBrowserWasmUrl, p as setDefaultSolver, w as setHighsWasmUrl, y as solveLpWithHighs, A as sum, Z as value, _ as xor, te as xsum };
1265
+ export { i as BoolExpr, o as BoolOp, n as BoolVar, c as Constraint, K as HiGHS, G as HighsSolver, O as LinExpr, X as MockSolver, $ as Model, b as OFFICIAL_HIGHS_CDN_WASM_URL, D as QuadExpr, j as Var, e as and, L as c, A as dot, R as expr, B as generateLpString, g as getHighs, v as getHighsWasmUrl, f as getSolver, a as implies, h as isValidWasmHeader, u as listAvailableSolvers, T as normalizeSense, s as not, t as or, F as parseConstraint, P as parseExpr, p as probeWasmUrl, d as registerSolver, _ as resolveBrowserWasmUrl, l as setDefaultSolver, y as setHighsWasmUrl, m as solveLpWithHighs, k as sum, r as xor };