@bubblyworld/scip-ts 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +131 -0
  2. package/build/scip.js +2 -0
  3. package/build/scip.wasm +0 -0
  4. package/dist/index.browser.d.ts +5 -0
  5. package/dist/index.browser.d.ts.map +1 -0
  6. package/dist/index.browser.js +443 -0
  7. package/dist/index.browser.js.map +1 -0
  8. package/dist/index.d.ts +5 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +3 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/index.node.d.ts +12 -0
  13. package/dist/index.node.d.ts.map +1 -0
  14. package/dist/index.node.js +459 -0
  15. package/dist/index.node.js.map +1 -0
  16. package/dist/model/constraint.d.ts +12 -0
  17. package/dist/model/constraint.d.ts.map +1 -0
  18. package/dist/model/constraint.js +11 -0
  19. package/dist/model/constraint.js.map +1 -0
  20. package/dist/model/expr.d.ts +25 -0
  21. package/dist/model/expr.d.ts.map +1 -0
  22. package/dist/model/expr.js +51 -0
  23. package/dist/model/expr.js.map +1 -0
  24. package/dist/model/helpers.d.ts +5 -0
  25. package/dist/model/helpers.d.ts.map +1 -0
  26. package/dist/model/helpers.js +10 -0
  27. package/dist/model/helpers.js.map +1 -0
  28. package/dist/model/index.d.ts +8 -0
  29. package/dist/model/index.d.ts.map +1 -0
  30. package/dist/model/index.js +7 -0
  31. package/dist/model/index.js.map +1 -0
  32. package/dist/model/lp-format.d.ts +11 -0
  33. package/dist/model/lp-format.d.ts.map +1 -0
  34. package/dist/model/lp-format.js +122 -0
  35. package/dist/model/lp-format.js.map +1 -0
  36. package/dist/model/model.d.ts +30 -0
  37. package/dist/model/model.d.ts.map +1 -0
  38. package/dist/model/model.js +75 -0
  39. package/dist/model/model.js.map +1 -0
  40. package/dist/model/solution.d.ts +13 -0
  41. package/dist/model/solution.d.ts.map +1 -0
  42. package/dist/model/solution.js +14 -0
  43. package/dist/model/solution.js.map +1 -0
  44. package/dist/model/types.d.ts +11 -0
  45. package/dist/model/types.d.ts.map +1 -0
  46. package/dist/model/types.js +2 -0
  47. package/dist/model/types.js.map +1 -0
  48. package/dist/model/var.d.ts +28 -0
  49. package/dist/model/var.d.ts.map +1 -0
  50. package/dist/model/var.js +43 -0
  51. package/dist/model/var.js.map +1 -0
  52. package/dist/module.d.ts +4 -0
  53. package/dist/module.d.ts.map +1 -0
  54. package/dist/module.js +15 -0
  55. package/dist/module.js.map +1 -0
  56. package/dist/solver.d.ts +19 -0
  57. package/dist/solver.d.ts.map +1 -0
  58. package/dist/solver.js +108 -0
  59. package/dist/solver.js.map +1 -0
  60. package/dist/types.d.ts +42 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +2 -0
  63. package/dist/types.js.map +1 -0
  64. package/package.json +55 -0
@@ -0,0 +1,10 @@
1
+ import { LinExpr } from './expr.js';
2
+ /** Returns the sum of the given variables, expressions, and constants. */
3
+ export function sum(...items) {
4
+ let result = new LinExpr([], 0);
5
+ for (const item of items) {
6
+ result = result.plus(item);
7
+ }
8
+ return result;
9
+ }
10
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/model/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,UAAU,GAAG,CAAC,GAAG,KAAiC;IACtD,IAAI,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { Model } from './model.js';
2
+ export { Var } from './var.js';
3
+ export { LinExpr } from './expr.js';
4
+ export { Constraint } from './constraint.js';
5
+ export { Solution } from './solution.js';
6
+ export { sum } from './helpers.js';
7
+ export type { VarType, Sense, Term } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { Model } from './model.js';
2
+ export { Var } from './var.js';
3
+ export { LinExpr } from './expr.js';
4
+ export { Constraint } from './constraint.js';
5
+ export { Solution } from './solution.js';
6
+ export { sum } from './helpers.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Var } from './var.js';
2
+ import type { LinExpr } from './expr.js';
3
+ import type { Constraint } from './constraint.js';
4
+ export interface LPFormatInput {
5
+ objective: LinExpr | null;
6
+ sense: 'minimize' | 'maximize';
7
+ constraints: Constraint[];
8
+ variables: Var[];
9
+ }
10
+ export declare function toLPFormat(input: LPFormatInput): string;
11
+ //# sourceMappingURL=lp-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lp-format.d.ts","sourceRoot":"","sources":["../../src/model/lp-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAC/B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,GAAG,EAAE,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAgEvD"}
@@ -0,0 +1,122 @@
1
+ export function toLPFormat(input) {
2
+ const lines = [];
3
+ if (input.sense === 'maximize') {
4
+ lines.push('Maximize');
5
+ }
6
+ else {
7
+ lines.push('Minimize');
8
+ }
9
+ if (input.objective) {
10
+ lines.push(` obj: ${formatExpr(input.objective)}`);
11
+ }
12
+ else {
13
+ lines.push(' obj: 0');
14
+ }
15
+ lines.push('Subject To');
16
+ let constraintIndex = 0;
17
+ for (const constraint of input.constraints) {
18
+ const name = constraint.name ?? `c${constraintIndex++}`;
19
+ const exprStr = formatExpr(constraint.expr);
20
+ const senseStr = constraint.sense === '=' ? '=' : constraint.sense;
21
+ const rhs = constraint.rhs - constraint.expr.constant;
22
+ lines.push(` ${name}: ${exprStr} ${senseStr} ${formatNumber(rhs)}`);
23
+ }
24
+ const boundsLines = [];
25
+ const generalVars = [];
26
+ const binaryVars = [];
27
+ for (const v of input.variables) {
28
+ if (v.type === 'binary') {
29
+ binaryVars.push(v.name);
30
+ }
31
+ else {
32
+ if (v.type === 'integer') {
33
+ generalVars.push(v.name);
34
+ }
35
+ const hasNonDefaultBounds = v.lb !== 0 || v.ub !== Infinity;
36
+ if (hasNonDefaultBounds) {
37
+ if (v.ub === Infinity) {
38
+ boundsLines.push(` ${formatNumber(v.lb)} <= ${v.name}`);
39
+ }
40
+ else {
41
+ boundsLines.push(` ${formatNumber(v.lb)} <= ${v.name} <= ${formatNumber(v.ub)}`);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ if (boundsLines.length > 0) {
47
+ lines.push('Bounds');
48
+ lines.push(...boundsLines);
49
+ }
50
+ if (generalVars.length > 0) {
51
+ lines.push('General');
52
+ lines.push(` ${generalVars.join(' ')}`);
53
+ }
54
+ if (binaryVars.length > 0) {
55
+ lines.push('Binary');
56
+ lines.push(` ${binaryVars.join(' ')}`);
57
+ }
58
+ lines.push('End');
59
+ return lines.join('\n') + '\n';
60
+ }
61
+ function formatExpr(expr) {
62
+ const consolidated = consolidateTerms(expr);
63
+ if (consolidated.length === 0) {
64
+ return '0';
65
+ }
66
+ const parts = [];
67
+ for (let i = 0; i < consolidated.length; i++) {
68
+ const { coeff, varName } = consolidated[i];
69
+ if (coeff === 0)
70
+ continue;
71
+ if (i === 0) {
72
+ if (coeff === 1) {
73
+ parts.push(varName);
74
+ }
75
+ else if (coeff === -1) {
76
+ parts.push(`- ${varName}`);
77
+ }
78
+ else if (coeff < 0) {
79
+ parts.push(`- ${formatNumber(-coeff)} ${varName}`);
80
+ }
81
+ else {
82
+ parts.push(`${formatNumber(coeff)} ${varName}`);
83
+ }
84
+ }
85
+ else {
86
+ if (coeff === 1) {
87
+ parts.push(`+ ${varName}`);
88
+ }
89
+ else if (coeff === -1) {
90
+ parts.push(`- ${varName}`);
91
+ }
92
+ else if (coeff < 0) {
93
+ parts.push(`- ${formatNumber(-coeff)} ${varName}`);
94
+ }
95
+ else {
96
+ parts.push(`+ ${formatNumber(coeff)} ${varName}`);
97
+ }
98
+ }
99
+ }
100
+ return parts.join(' ') || '0';
101
+ }
102
+ function consolidateTerms(expr) {
103
+ const coeffMap = new Map();
104
+ for (const term of expr.terms) {
105
+ const current = coeffMap.get(term.var.name) ?? 0;
106
+ coeffMap.set(term.var.name, current + term.coeff);
107
+ }
108
+ const result = [];
109
+ for (const [varName, coeff] of coeffMap) {
110
+ if (coeff !== 0) {
111
+ result.push({ coeff, varName });
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+ function formatNumber(n) {
117
+ if (Number.isInteger(n)) {
118
+ return n.toString();
119
+ }
120
+ return n.toString();
121
+ }
122
+ //# sourceMappingURL=lp-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lp-format.js","sourceRoot":"","sources":["../../src/model/lp-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SCIPOptions } from '../types.js';
2
+ import { Var } from './var.js';
3
+ import { LinExpr } from './expr.js';
4
+ import { Constraint } from './constraint.js';
5
+ import { Solution } from './solution.js';
6
+ /** High-level model builder for optimization problems. */
7
+ export declare class Model {
8
+ private variables;
9
+ private constraints;
10
+ private objective;
11
+ private sense;
12
+ private varCounter;
13
+ /** Creates a continuous variable with the given bounds and optional name. */
14
+ numVar(lb?: number, ub?: number, name?: string): Var;
15
+ /** Creates an integer variable with the given bounds and optional name. */
16
+ intVar(lb?: number, ub?: number, name?: string): Var;
17
+ /** Creates a binary (0-1) variable with an optional name. */
18
+ boolVar(name?: string): Var;
19
+ /** Adds a constraint to the model with an optional name. */
20
+ addConstraint(constraint: Constraint, name?: string): void;
21
+ /** Sets the objective to minimize the given expression. */
22
+ minimize(expr: LinExpr | Var): void;
23
+ /** Sets the objective to maximize the given expression. */
24
+ maximize(expr: LinExpr | Var): void;
25
+ /** Converts the model to CPLEX LP format. */
26
+ toLPFormat(): string;
27
+ /** Solves the model and returns the solution. */
28
+ solve(options?: SCIPOptions): Promise<Solution>;
29
+ }
30
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,0DAA0D;AAC1D,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,UAAU,CAAK;IAEvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,SAAI,EAAE,EAAE,SAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAOjD,2EAA2E;IAC3E,MAAM,CAAC,EAAE,SAAI,EAAE,EAAE,SAAW,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAOjD,6DAA6D;IAC7D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAO3B,4DAA4D;IAC5D,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAO1D,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI;IAKnC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI;IAKnC,6CAA6C;IAC7C,UAAU,IAAI,MAAM;IASpB,iDAAiD;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAWtD"}
@@ -0,0 +1,75 @@
1
+ import { SCIP as BaseSCIP } from '../solver.js';
2
+ import { Var } from './var.js';
3
+ import { Solution } from './solution.js';
4
+ import { toLPFormat } from './lp-format.js';
5
+ /** High-level model builder for optimization problems. */
6
+ export class Model {
7
+ constructor() {
8
+ this.variables = [];
9
+ this.constraints = [];
10
+ this.objective = null;
11
+ this.sense = 'minimize';
12
+ this.varCounter = 0;
13
+ }
14
+ /** Creates a continuous variable with the given bounds and optional name. */
15
+ numVar(lb = 0, ub = Infinity, name) {
16
+ const varName = name ?? `x${this.varCounter++}`;
17
+ const v = new Var(varName, 'continuous', lb, ub);
18
+ this.variables.push(v);
19
+ return v;
20
+ }
21
+ /** Creates an integer variable with the given bounds and optional name. */
22
+ intVar(lb = 0, ub = Infinity, name) {
23
+ const varName = name ?? `x${this.varCounter++}`;
24
+ const v = new Var(varName, 'integer', lb, ub);
25
+ this.variables.push(v);
26
+ return v;
27
+ }
28
+ /** Creates a binary (0-1) variable with an optional name. */
29
+ boolVar(name) {
30
+ const varName = name ?? `x${this.varCounter++}`;
31
+ const v = new Var(varName, 'binary', 0, 1);
32
+ this.variables.push(v);
33
+ return v;
34
+ }
35
+ /** Adds a constraint to the model with an optional name. */
36
+ addConstraint(constraint, name) {
37
+ if (name !== undefined) {
38
+ constraint.name = name;
39
+ }
40
+ this.constraints.push(constraint);
41
+ }
42
+ /** Sets the objective to minimize the given expression. */
43
+ minimize(expr) {
44
+ this.objective = expr instanceof Var ? expr.times(1) : expr;
45
+ this.sense = 'minimize';
46
+ }
47
+ /** Sets the objective to maximize the given expression. */
48
+ maximize(expr) {
49
+ this.objective = expr instanceof Var ? expr.times(1) : expr;
50
+ this.sense = 'maximize';
51
+ }
52
+ /** Converts the model to CPLEX LP format. */
53
+ toLPFormat() {
54
+ return toLPFormat({
55
+ objective: this.objective,
56
+ sense: this.sense,
57
+ constraints: this.constraints,
58
+ variables: this.variables,
59
+ });
60
+ }
61
+ /** Solves the model and returns the solution. */
62
+ async solve(options) {
63
+ const lpString = this.toLPFormat();
64
+ const scip = await BaseSCIP.create(options);
65
+ try {
66
+ await scip.readProblemFromString(lpString, 'lp');
67
+ const result = await scip.solve();
68
+ return new Solution(result);
69
+ }
70
+ finally {
71
+ scip.free();
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { SolveStatus, SolveResult } from '../types.js';
2
+ import type { Var } from './var.js';
3
+ /** The result of solving a Model. */
4
+ export declare class Solution {
5
+ readonly status: SolveStatus;
6
+ readonly objective?: number;
7
+ private readonly values;
8
+ /** @internal Use Model.solve() to obtain a Solution. */
9
+ constructor(result: SolveResult);
10
+ /** Returns the value of a variable in the solution, or undefined if not found. */
11
+ getValue(variable: Var): number | undefined;
12
+ }
13
+ //# sourceMappingURL=solution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solution.d.ts","sourceRoot":"","sources":["../../src/model/solution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,qCAAqC;AACrC,qBAAa,QAAQ;IACnB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAE7C,wDAAwD;gBAC5C,MAAM,EAAE,WAAW;IAM/B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS;CAG5C"}
@@ -0,0 +1,14 @@
1
+ /** The result of solving a Model. */
2
+ export class Solution {
3
+ /** @internal Use Model.solve() to obtain a Solution. */
4
+ constructor(result) {
5
+ this.status = result.status;
6
+ this.objective = result.objective;
7
+ this.values = result.solution ?? new Map();
8
+ }
9
+ /** Returns the value of a variable in the solution, or undefined if not found. */
10
+ getValue(variable) {
11
+ return this.values.get(variable.name);
12
+ }
13
+ }
14
+ //# sourceMappingURL=solution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solution.js","sourceRoot":"","sources":["../../src/model/solution.ts"],"names":[],"mappings":"AAGA,qCAAqC;AACrC,MAAM,OAAO,QAAQ;IAKnB,wDAAwD;IACxD,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,CAAC;IAC7C,CAAC;IAED,kFAAkF;IAClF,QAAQ,CAAC,QAAa;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /** The type of a decision variable. */
2
+ export type VarType = 'continuous' | 'integer' | 'binary';
3
+ /** The sense of a constraint: <=, >=, or =. */
4
+ export type Sense = '<=' | '>=' | '=';
5
+ /** A term in a linear expression: coefficient * variable. */
6
+ export interface Term {
7
+ coeff: number;
8
+ var: Var;
9
+ }
10
+ import type { Var } from './var.js';
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D,+CAA+C;AAC/C,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAEtC,6DAA6D;AAC7D,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,GAAG,CAAC;CACV;AAED,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { VarType } from './types.js';
2
+ import { LinExpr } from './expr.js';
3
+ import { Constraint } from './constraint.js';
4
+ /** A decision variable in an optimization model. */
5
+ export declare class Var {
6
+ readonly name: string;
7
+ readonly type: VarType;
8
+ readonly lb: number;
9
+ readonly ub: number;
10
+ /** @internal Use Model.numVar(), Model.intVar(), or Model.boolVar() instead. */
11
+ constructor(name: string, type: VarType, lb: number, ub: number);
12
+ private toExpr;
13
+ /** Returns this + other. */
14
+ plus(other: Var | LinExpr | number): LinExpr;
15
+ /** Returns this - other. */
16
+ minus(other: Var | LinExpr | number): LinExpr;
17
+ /** Returns coeff * this. */
18
+ times(coeff: number): LinExpr;
19
+ /** Returns -this. */
20
+ neg(): LinExpr;
21
+ /** Returns a constraint: this <= rhs. */
22
+ leq(rhs: number): Constraint;
23
+ /** Returns a constraint: this >= rhs. */
24
+ geq(rhs: number): Constraint;
25
+ /** Returns a constraint: this == rhs. */
26
+ eq(rhs: number): Constraint;
27
+ }
28
+ //# sourceMappingURL=var.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"var.d.ts","sourceRoot":"","sources":["../../src/model/var.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,oDAAoD;AACpD,qBAAa,GAAG;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,gFAAgF;gBACpE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAO/D,OAAO,CAAC,MAAM;IAId,4BAA4B;IAC5B,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;IAI5C,4BAA4B;IAC5B,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;IAI7C,4BAA4B;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI7B,qBAAqB;IACrB,GAAG,IAAI,OAAO;IAId,yCAAyC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAI5B,yCAAyC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAI5B,yCAAyC;IACzC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAG5B"}
@@ -0,0 +1,43 @@
1
+ import { LinExpr } from './expr.js';
2
+ /** A decision variable in an optimization model. */
3
+ export class Var {
4
+ /** @internal Use Model.numVar(), Model.intVar(), or Model.boolVar() instead. */
5
+ constructor(name, type, lb, ub) {
6
+ this.name = name;
7
+ this.type = type;
8
+ this.lb = lb;
9
+ this.ub = ub;
10
+ }
11
+ toExpr() {
12
+ return new LinExpr([{ coeff: 1, var: this }], 0);
13
+ }
14
+ /** Returns this + other. */
15
+ plus(other) {
16
+ return this.toExpr().plus(other);
17
+ }
18
+ /** Returns this - other. */
19
+ minus(other) {
20
+ return this.toExpr().minus(other);
21
+ }
22
+ /** Returns coeff * this. */
23
+ times(coeff) {
24
+ return new LinExpr([{ coeff, var: this }], 0);
25
+ }
26
+ /** Returns -this. */
27
+ neg() {
28
+ return this.times(-1);
29
+ }
30
+ /** Returns a constraint: this <= rhs. */
31
+ leq(rhs) {
32
+ return this.toExpr().leq(rhs);
33
+ }
34
+ /** Returns a constraint: this >= rhs. */
35
+ geq(rhs) {
36
+ return this.toExpr().geq(rhs);
37
+ }
38
+ /** Returns a constraint: this == rhs. */
39
+ eq(rhs) {
40
+ return this.toExpr().eq(rhs);
41
+ }
42
+ }
43
+ //# sourceMappingURL=var.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"var.js","sourceRoot":"","sources":["../../src/model/var.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,oDAAoD;AACpD,MAAM,OAAO,GAAG;IAMd,gFAAgF;IAChF,YAAY,IAAY,EAAE,IAAa,EAAE,EAAU,EAAE,EAAU;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,KAA6B;QAChC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,KAA6B;QACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,KAAa;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,qBAAqB;IACrB,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,yCAAyC;IACzC,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,yCAAyC;IACzC,EAAE,CAAC,GAAW;QACZ,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { EmscriptenModule, SCIPOptions } from './types.js';
2
+ /** Loads a fresh SCIP WebAssembly module with the given options. */
3
+ export declare function loadSCIPModule(options?: SCIPOptions): Promise<EmscriptenModule>;
4
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnF,oEAAoE;AACpE,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAU3B"}
package/dist/module.js ADDED
@@ -0,0 +1,15 @@
1
+ /** Loads a fresh SCIP WebAssembly module with the given options. */
2
+ export async function loadSCIPModule(options) {
3
+ const createModule = await loadSCIPFactory();
4
+ const consoleConfig = options?.console ?? { log: null, error: null };
5
+ const moduleOptions = {
6
+ print: consoleConfig.log ?? (() => { }),
7
+ printErr: consoleConfig.error ?? (() => { }),
8
+ };
9
+ return createModule(moduleOptions);
10
+ }
11
+ async function loadSCIPFactory() {
12
+ const { default: SCIPModuleFactory } = await import(new URL('../build/scip.js', import.meta.url).href);
13
+ return SCIPModuleFactory;
14
+ }
15
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAqB;IAErB,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IAE7C,MAAM,aAAa,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACrE,MAAM,aAAa,GAA4B;QAC7C,KAAK,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QACtC,QAAQ,EAAE,aAAa,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;KAC5C,CAAC;IAEF,OAAO,YAAY,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CACjD,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAClD,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { EmscriptenModule, SCIPOptions, SolveResult } from './types.js';
2
+ /** Low-level wrapper around the SCIP optimization solver. */
3
+ export declare class SCIP {
4
+ private module;
5
+ private scipPtr;
6
+ private freed;
7
+ protected constructor(module: EmscriptenModule, scipPtr: number);
8
+ /** Creates a new SCIP solver instance. */
9
+ static create(options?: SCIPOptions): Promise<SCIP>;
10
+ /** Reads a problem from a string in the given format (e.g., 'lp', 'mps'). */
11
+ readProblemFromString(content: string, format: string): Promise<void>;
12
+ /** Solves the loaded problem and returns the result. */
13
+ solve(): Promise<SolveResult>;
14
+ private extractSolution;
15
+ /** Frees the SCIP instance. Safe to call multiple times. */
16
+ free(): void;
17
+ private ensureNotFreed;
18
+ }
19
+ //# sourceMappingURL=solver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAiB1F,6DAA6D;AAC7D,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IAEtB,SAAS,aAAa,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;IAK/D,0CAA0C;WAC7B,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBzD,6EAA6E;IACvE,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB3E,wDAAwD;IAClD,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAuCnC,OAAO,CAAC,eAAe;IAyCvB,4DAA4D;IAC5D,IAAI,IAAI,IAAI;IAgBZ,OAAO,CAAC,cAAc;CAKvB"}
package/dist/solver.js ADDED
@@ -0,0 +1,108 @@
1
+ import { loadSCIPModule } from './module.js';
2
+ const SCIP_STATUS_MAP = {
3
+ 0: 'unknown',
4
+ 1: 'optimal',
5
+ 2: 'infeasible',
6
+ 3: 'unbounded',
7
+ 4: 'inforunbd',
8
+ 5: 'timelimit',
9
+ 6: 'nodelimit',
10
+ 7: 'stallnodelimit',
11
+ 8: 'gaplimit',
12
+ 9: 'sollimit',
13
+ 10: 'bestsollimit',
14
+ 11: 'restartlimit',
15
+ };
16
+ /** Low-level wrapper around the SCIP optimization solver. */
17
+ export class SCIP {
18
+ constructor(module, scipPtr) {
19
+ this.freed = false;
20
+ this.module = module;
21
+ this.scipPtr = scipPtr;
22
+ }
23
+ /** Creates a new SCIP solver instance. */
24
+ static async create(options) {
25
+ const module = await loadSCIPModule(options);
26
+ const scipPtrPtr = module._malloc(4);
27
+ try {
28
+ module.ccall('SCIPcreate', 'number', ['number'], [scipPtrPtr]);
29
+ const scipPtr = module.getValue(scipPtrPtr, 'i32');
30
+ if (scipPtr === 0) {
31
+ throw new Error('SCIPcreate failed to create instance');
32
+ }
33
+ module.ccall('SCIPincludeDefaultPlugins', 'number', ['number'], [scipPtr]);
34
+ return new SCIP(module, scipPtr);
35
+ }
36
+ finally {
37
+ module._free(scipPtrPtr);
38
+ }
39
+ }
40
+ /** Reads a problem from a string in the given format (e.g., 'lp', 'mps'). */
41
+ async readProblemFromString(content, format) {
42
+ this.ensureNotFreed();
43
+ const filename = `/tmp/problem.${format}`;
44
+ this.module.FS.writeFile(filename, content);
45
+ try {
46
+ this.module.ccall('SCIPreadProb', 'number', ['number', 'string', 'string'], [this.scipPtr, filename, format]);
47
+ }
48
+ finally {
49
+ try {
50
+ this.module.FS.unlink(filename);
51
+ }
52
+ catch {
53
+ // Ignore cleanup errors
54
+ }
55
+ }
56
+ }
57
+ /** Solves the loaded problem and returns the result. */
58
+ async solve() {
59
+ this.ensureNotFreed();
60
+ this.module.ccall('SCIPsolve', 'number', ['number'], [this.scipPtr]);
61
+ const statusCode = this.module.ccall('SCIPgetStatus', 'number', ['number'], [this.scipPtr]);
62
+ const status = SCIP_STATUS_MAP[statusCode] ?? 'unknown';
63
+ const result = { status };
64
+ if (status === 'optimal' || status === 'timelimit' || status === 'gaplimit' ||
65
+ status === 'sollimit' || status === 'bestsollimit') {
66
+ const solPtr = this.module.ccall('SCIPgetBestSol', 'number', ['number'], [this.scipPtr]);
67
+ if (solPtr !== 0) {
68
+ result.objective = this.module.ccall('SCIPgetSolOrigObj', 'number', ['number', 'number'], [this.scipPtr, solPtr]);
69
+ result.solution = this.extractSolution(solPtr);
70
+ }
71
+ }
72
+ return result;
73
+ }
74
+ extractSolution(solPtr) {
75
+ const solution = new Map();
76
+ const nVars = this.module.ccall('SCIPgetNOrigVars', 'number', ['number'], [this.scipPtr]);
77
+ const varsPtr = this.module.ccall('SCIPgetOrigVars', 'number', ['number'], [this.scipPtr]);
78
+ for (let i = 0; i < nVars; i++) {
79
+ const varPtr = this.module.getValue(varsPtr + i * 4, 'i32');
80
+ const namePtr = this.module.ccall('SCIPvarGetName', 'number', ['number'], [varPtr]);
81
+ const name = this.module.UTF8ToString(namePtr);
82
+ const value = this.module.ccall('SCIPgetSolVal', 'number', ['number', 'number', 'number'], [this.scipPtr, solPtr, varPtr]);
83
+ solution.set(name, value);
84
+ }
85
+ return solution;
86
+ }
87
+ /** Frees the SCIP instance. Safe to call multiple times. */
88
+ free() {
89
+ if (this.freed) {
90
+ return;
91
+ }
92
+ const scipPtrPtr = this.module._malloc(4);
93
+ try {
94
+ this.module.setValue(scipPtrPtr, this.scipPtr, 'i32');
95
+ this.module.ccall('SCIPfree', 'number', ['number'], [scipPtrPtr]);
96
+ }
97
+ finally {
98
+ this.module._free(scipPtrPtr);
99
+ }
100
+ this.freed = true;
101
+ }
102
+ ensureNotFreed() {
103
+ if (this.freed) {
104
+ throw new Error('SCIP instance has been freed');
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=solver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver.js","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"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"}