@cavelang/solver 0.27.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/License.md +8 -0
- package/README.md +95 -0
- package/dist/src/adapter.d.ts +77 -0
- package/dist/src/adapter.d.ts.map +1 -0
- package/dist/src/adapter.js +24 -0
- package/dist/src/adapter.js.map +1 -0
- package/dist/src/canonical.d.ts +5 -0
- package/dist/src/canonical.d.ts.map +1 -0
- package/dist/src/canonical.js +88 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/capability.d.ts +10 -0
- package/dist/src/capability.d.ts.map +1 -0
- package/dist/src/capability.js +92 -0
- package/dist/src/capability.js.map +1 -0
- package/dist/src/exact.d.ts +10 -0
- package/dist/src/exact.d.ts.map +1 -0
- package/dist/src/exact.js +75 -0
- package/dist/src/exact.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/linear.d.ts +8 -0
- package/dist/src/linear.d.ts.map +1 -0
- package/dist/src/linear.js +52 -0
- package/dist/src/linear.js.map +1 -0
- package/dist/src/model.d.ts +130 -0
- package/dist/src/model.d.ts.map +1 -0
- package/dist/src/model.js +3 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/solve.d.ts +5 -0
- package/dist/src/solve.d.ts.map +1 -0
- package/dist/src/solve.js +12 -0
- package/dist/src/solve.js.map +1 -0
- package/dist/src/validate.d.ts +24 -0
- package/dist/src/validate.d.ts.map +1 -0
- package/dist/src/validate.js +283 -0
- package/dist/src/validate.js.map +1 -0
- package/package.json +39 -0
- package/src/adapter.ts +110 -0
- package/src/canonical.ts +94 -0
- package/src/capability.ts +82 -0
- package/src/exact.ts +85 -0
- package/src/index.ts +15 -0
- package/src/linear.ts +58 -0
- package/src/model.ts +80 -0
- package/src/solve.ts +13 -0
- package/src/validate.ts +302 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { model as validate } from "./validate.js";
|
|
2
|
+
const affine = (expression) => {
|
|
3
|
+
switch (expression.kind) {
|
|
4
|
+
case 'literal': return { linear: expression.sort === 'int' || expression.sort === 'real', constant: true };
|
|
5
|
+
case 'variable': return { linear: true, constant: false };
|
|
6
|
+
case 'negate': return affine(expression.value);
|
|
7
|
+
case 'add': {
|
|
8
|
+
const parts = expression.operands.map(affine);
|
|
9
|
+
return { linear: parts.every(part => part.linear), constant: parts.every(part => part.constant) };
|
|
10
|
+
}
|
|
11
|
+
case 'subtract': {
|
|
12
|
+
const left = affine(expression.left);
|
|
13
|
+
const right = affine(expression.right);
|
|
14
|
+
return { linear: left.linear && right.linear, constant: left.constant && right.constant };
|
|
15
|
+
}
|
|
16
|
+
case 'multiply': {
|
|
17
|
+
const parts = expression.operands.map(affine);
|
|
18
|
+
return { linear: parts.every(part => part.linear) && parts.filter(part => !part.constant).length <= 1, constant: parts.every(part => part.constant) };
|
|
19
|
+
}
|
|
20
|
+
case 'divide': {
|
|
21
|
+
const left = affine(expression.left);
|
|
22
|
+
const right = affine(expression.right);
|
|
23
|
+
return { linear: left.linear && right.linear && right.constant, constant: left.constant && right.constant };
|
|
24
|
+
}
|
|
25
|
+
default: return { linear: false, constant: false };
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const constraintIsLinear = (expression) => {
|
|
29
|
+
if (expression.kind !== 'eq' && expression.kind !== 'lte' && expression.kind !== 'gte')
|
|
30
|
+
return false;
|
|
31
|
+
return affine(expression.left).linear && affine(expression.right).linear;
|
|
32
|
+
};
|
|
33
|
+
/** Recognizes the portable LP/MIP subset without consulting a backend AST. */
|
|
34
|
+
export const model = (input) => {
|
|
35
|
+
validate(input);
|
|
36
|
+
const problems = [];
|
|
37
|
+
if (input.variables.some(variable => variable.sort === 'bool' || variable.sort === 'enum')) {
|
|
38
|
+
problems.push('Boolean and enum variables are outside the linear subset');
|
|
39
|
+
}
|
|
40
|
+
if ((input.softConstraints?.length ?? 0) > 0)
|
|
41
|
+
problems.push('soft constraints are outside the linear subset');
|
|
42
|
+
input.constraints.forEach(constraint => {
|
|
43
|
+
if (!constraintIsLinear(constraint.expression))
|
|
44
|
+
problems.push(`constraint ${constraint.id} is not a non-strict linear comparison`);
|
|
45
|
+
});
|
|
46
|
+
(input.objectives ?? []).forEach(objective => {
|
|
47
|
+
if (!affine(objective.expression).linear)
|
|
48
|
+
problems.push(`objective ${objective.id} is not linear`);
|
|
49
|
+
});
|
|
50
|
+
return { linear: problems.length === 0, problems };
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/** Portable model schema understood by solver adapters. */
|
|
2
|
+
export declare const schema: "cave.solver/model@1";
|
|
3
|
+
export type Integer = string | number;
|
|
4
|
+
/** Exact rational input. Decimal strings are parsed without using `number`. */
|
|
5
|
+
export type Rational = string | {
|
|
6
|
+
readonly numerator: Integer;
|
|
7
|
+
readonly denominator: Integer;
|
|
8
|
+
};
|
|
9
|
+
export type EnumDomain = {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly values: readonly string[];
|
|
12
|
+
readonly description?: string;
|
|
13
|
+
};
|
|
14
|
+
export type Variable = {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly sort: 'bool';
|
|
17
|
+
readonly description?: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly sort: 'int';
|
|
21
|
+
readonly min: Integer;
|
|
22
|
+
readonly max: Integer;
|
|
23
|
+
readonly description?: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly sort: 'real';
|
|
27
|
+
readonly min?: Rational;
|
|
28
|
+
readonly max?: Rational;
|
|
29
|
+
readonly description?: string;
|
|
30
|
+
} | {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly sort: 'enum';
|
|
33
|
+
readonly domain: string;
|
|
34
|
+
readonly description?: string;
|
|
35
|
+
};
|
|
36
|
+
export type Literal = {
|
|
37
|
+
readonly kind: 'literal';
|
|
38
|
+
readonly sort: 'bool';
|
|
39
|
+
readonly value: boolean;
|
|
40
|
+
} | {
|
|
41
|
+
readonly kind: 'literal';
|
|
42
|
+
readonly sort: 'int';
|
|
43
|
+
readonly value: Integer;
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: 'literal';
|
|
46
|
+
readonly sort: 'real';
|
|
47
|
+
readonly value: Rational;
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: 'literal';
|
|
50
|
+
readonly sort: 'enum';
|
|
51
|
+
readonly domain: string;
|
|
52
|
+
readonly value: string;
|
|
53
|
+
};
|
|
54
|
+
export type Expression = Literal | {
|
|
55
|
+
readonly kind: 'variable';
|
|
56
|
+
readonly id: string;
|
|
57
|
+
} | {
|
|
58
|
+
readonly kind: 'not';
|
|
59
|
+
readonly value: Expression;
|
|
60
|
+
} | {
|
|
61
|
+
readonly kind: 'and' | 'or';
|
|
62
|
+
readonly operands: readonly Expression[];
|
|
63
|
+
} | {
|
|
64
|
+
readonly kind: 'implies';
|
|
65
|
+
readonly left: Expression;
|
|
66
|
+
readonly right: Expression;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: 'eq' | 'neq' | 'lt' | 'lte' | 'gt' | 'gte';
|
|
69
|
+
readonly left: Expression;
|
|
70
|
+
readonly right: Expression;
|
|
71
|
+
} | {
|
|
72
|
+
readonly kind: 'add' | 'multiply';
|
|
73
|
+
readonly operands: readonly Expression[];
|
|
74
|
+
} | {
|
|
75
|
+
readonly kind: 'subtract' | 'divide';
|
|
76
|
+
readonly left: Expression;
|
|
77
|
+
readonly right: Expression;
|
|
78
|
+
} | {
|
|
79
|
+
readonly kind: 'negate';
|
|
80
|
+
readonly value: Expression;
|
|
81
|
+
} | {
|
|
82
|
+
readonly kind: 'if';
|
|
83
|
+
readonly condition: Expression;
|
|
84
|
+
readonly then: Expression;
|
|
85
|
+
readonly else: Expression;
|
|
86
|
+
};
|
|
87
|
+
export type HardConstraint = {
|
|
88
|
+
readonly id: string;
|
|
89
|
+
readonly expression: Expression;
|
|
90
|
+
readonly description?: string;
|
|
91
|
+
readonly evidenceRowIds?: readonly string[];
|
|
92
|
+
};
|
|
93
|
+
export type SoftConstraint = HardConstraint & {
|
|
94
|
+
/** Deliberate preference weight; never inferred from CAVE confidence. */
|
|
95
|
+
readonly weight: Rational;
|
|
96
|
+
};
|
|
97
|
+
export type Objective = {
|
|
98
|
+
readonly id: string;
|
|
99
|
+
readonly direction: 'minimize' | 'maximize';
|
|
100
|
+
readonly expression: Expression;
|
|
101
|
+
readonly description?: string;
|
|
102
|
+
readonly evidenceRowIds?: readonly string[];
|
|
103
|
+
};
|
|
104
|
+
export type Model = {
|
|
105
|
+
readonly schema: typeof schema;
|
|
106
|
+
readonly enums?: readonly EnumDomain[];
|
|
107
|
+
readonly variables: readonly Variable[];
|
|
108
|
+
readonly constraints: readonly HardConstraint[];
|
|
109
|
+
readonly softConstraints?: readonly SoftConstraint[];
|
|
110
|
+
/** Objective order is semantic and means lexicographic priority. */
|
|
111
|
+
readonly objectives?: readonly Objective[];
|
|
112
|
+
};
|
|
113
|
+
export type t = Model;
|
|
114
|
+
export type Value = {
|
|
115
|
+
readonly sort: 'bool';
|
|
116
|
+
readonly value: boolean;
|
|
117
|
+
} | {
|
|
118
|
+
readonly sort: 'int';
|
|
119
|
+
readonly value: string;
|
|
120
|
+
} | {
|
|
121
|
+
readonly sort: 'real';
|
|
122
|
+
readonly numerator: string;
|
|
123
|
+
readonly denominator: string;
|
|
124
|
+
} | {
|
|
125
|
+
readonly sort: 'enum';
|
|
126
|
+
readonly domain: string;
|
|
127
|
+
readonly value: string;
|
|
128
|
+
};
|
|
129
|
+
export type Assignment = Readonly<Record<string, Value>>;
|
|
130
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,qBAA8B,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Options, Result, SolverAdapter } from './adapter.ts';
|
|
2
|
+
import type { Model } from './model.ts';
|
|
3
|
+
/** Validates and negotiates a model before crossing the adapter boundary. */
|
|
4
|
+
export declare const run: (adapter: SolverAdapter, model: Model, options?: Options) => Promise<Result>;
|
|
5
|
+
//# sourceMappingURL=solve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve.d.ts","sourceRoot":"","sources":["../../src/solve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAElE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,6EAA6E;AAC7E,eAAO,MAAM,GAAG,GAAU,SAAS,aAAa,EAAE,OAAO,KAAK,EAAE,UAAS,OAAY,KAAG,OAAO,CAAC,MAAM,CAMrG,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as Capability from "./capability.js";
|
|
2
|
+
import * as Validate from "./validate.js";
|
|
3
|
+
/** Validates and negotiates a model before crossing the adapter boundary. */
|
|
4
|
+
export const run = async (adapter, model, options = {}) => {
|
|
5
|
+
const limits = Validate.mergeLimits(options.limits);
|
|
6
|
+
Validate.model(model, limits);
|
|
7
|
+
const missing = Capability.missing(adapter, model, options.unsatCore ?? false);
|
|
8
|
+
if (missing.length > 0)
|
|
9
|
+
throw new Capability.UnsupportedModelError(adapter.backend.name, missing);
|
|
10
|
+
return adapter.solve(model, { limits, unsatCore: options.unsatCore ?? false });
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=solve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../src/solve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,OAAsB,EAAE,KAAY,EAAE,UAAmB,EAAE,EAAmB,EAAE;IACxG,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnD,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAA;IAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACjG,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAA;AAChF,CAAC,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Limits } from './adapter.ts';
|
|
2
|
+
import { type Model } from './model.ts';
|
|
3
|
+
export type Stats = {
|
|
4
|
+
readonly variables: number;
|
|
5
|
+
readonly constraints: number;
|
|
6
|
+
readonly objectives: number;
|
|
7
|
+
readonly enumValues: number;
|
|
8
|
+
readonly expressionNodes: number;
|
|
9
|
+
readonly expressionDepth: number;
|
|
10
|
+
};
|
|
11
|
+
export declare class ModelValidationError extends Error {
|
|
12
|
+
readonly problems: readonly string[];
|
|
13
|
+
constructor(problems: readonly string[]);
|
|
14
|
+
}
|
|
15
|
+
export declare class ModelLimitError extends Error {
|
|
16
|
+
readonly limit: keyof Limits;
|
|
17
|
+
readonly actual: number;
|
|
18
|
+
readonly maximum: number;
|
|
19
|
+
constructor(limit: keyof Limits, actual: number, maximum: number);
|
|
20
|
+
}
|
|
21
|
+
export declare const mergeLimits: (input?: Partial<Limits>) => Limits;
|
|
22
|
+
/** Validates sorts and exact values before any backend is invoked. */
|
|
23
|
+
export declare const model: (input: Model, limitInput?: Partial<Limits>) => Stats;
|
|
24
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,EAA2B,KAAK,KAAK,EAAgC,MAAM,YAAY,CAAA;AAE9F,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;gBAExB,QAAQ,EAAE,SAAS,MAAM,EAAE;CAKxC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,KAAK,EAAE,MAAM,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAOjE;AAiKD,eAAO,MAAM,WAAW,GAAI,QAAO,OAAO,CAAC,MAAM,CAAM,KAAG,MAQzD,CAAA;AAgBD,sEAAsE;AACtE,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,EAAE,aAAY,OAAO,CAAC,MAAM,CAAM,KAAG,KA+EtE,CAAA"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { defaultLimits } from "./adapter.js";
|
|
2
|
+
import * as Exact from "./exact.js";
|
|
3
|
+
import { schema } from "./model.js";
|
|
4
|
+
export class ModelValidationError extends Error {
|
|
5
|
+
problems;
|
|
6
|
+
constructor(problems) {
|
|
7
|
+
super(`invalid solver model:\n- ${problems.join('\n- ')}`);
|
|
8
|
+
this.name = 'ModelValidationError';
|
|
9
|
+
this.problems = problems;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class ModelLimitError extends Error {
|
|
13
|
+
limit;
|
|
14
|
+
actual;
|
|
15
|
+
maximum;
|
|
16
|
+
constructor(limit, actual, maximum) {
|
|
17
|
+
super(`solver model exceeds ${limit}: ${actual} > ${maximum}`);
|
|
18
|
+
this.name = 'ModelLimitError';
|
|
19
|
+
this.limit = limit;
|
|
20
|
+
this.actual = actual;
|
|
21
|
+
this.maximum = maximum;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const idPattern = /^[A-Za-z][A-Za-z0-9._:/-]*$/;
|
|
25
|
+
const numeric = (sort) => sort.kind === 'int' || sort.kind === 'real';
|
|
26
|
+
const same = (left, right) => left.kind === right.kind && (left.kind !== 'enum' || (right.kind === 'enum' && left.domain === right.domain));
|
|
27
|
+
const compatible = (left, right) => same(left, right) || (numeric(left) && numeric(right));
|
|
28
|
+
const rationalOfInteger = (value, side) => String(Exact.integer(value[side]));
|
|
29
|
+
const pushExactProblem = (problems, path, run) => {
|
|
30
|
+
try {
|
|
31
|
+
run();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
problems.push(`${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const requireId = (id, path, problems) => {
|
|
38
|
+
if (!idPattern.test(id)) {
|
|
39
|
+
problems.push(`${path} must match ${String(idPattern)}`);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const duplicates = (ids, path, problems) => {
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
for (const id of ids) {
|
|
45
|
+
if (seen.has(id)) {
|
|
46
|
+
problems.push(`${path} contains duplicate identifier ${JSON.stringify(id)}`);
|
|
47
|
+
}
|
|
48
|
+
seen.add(id);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const infer = (expression, path, variables, domains, problems, walk, depth) => {
|
|
52
|
+
walk.nodes += 1;
|
|
53
|
+
walk.depth = Math.max(walk.depth, depth);
|
|
54
|
+
const child = (value, suffix) => infer(value, `${path}.${suffix}`, variables, domains, problems, walk, depth + 1);
|
|
55
|
+
const expectBool = (sort, at) => {
|
|
56
|
+
if (sort.kind !== 'bool')
|
|
57
|
+
problems.push(`${at} must be boolean, received ${sort.kind}`);
|
|
58
|
+
};
|
|
59
|
+
const expectNumeric = (sort, at) => {
|
|
60
|
+
if (!numeric(sort))
|
|
61
|
+
problems.push(`${at} must be numeric, received ${sort.kind}`);
|
|
62
|
+
};
|
|
63
|
+
switch (expression.kind) {
|
|
64
|
+
case 'literal':
|
|
65
|
+
switch (expression.sort) {
|
|
66
|
+
case 'bool': return { kind: 'bool' };
|
|
67
|
+
case 'int':
|
|
68
|
+
pushExactProblem(problems, path, () => Exact.integer(expression.value));
|
|
69
|
+
return { kind: 'int' };
|
|
70
|
+
case 'real':
|
|
71
|
+
pushExactProblem(problems, path, () => Exact.rational(expression.value));
|
|
72
|
+
return { kind: 'real' };
|
|
73
|
+
case 'enum': {
|
|
74
|
+
const values = domains.get(expression.domain);
|
|
75
|
+
if (values === undefined)
|
|
76
|
+
problems.push(`${path} references unknown enum domain ${JSON.stringify(expression.domain)}`);
|
|
77
|
+
else if (!values.includes(expression.value))
|
|
78
|
+
problems.push(`${path} value ${JSON.stringify(expression.value)} is outside enum domain ${JSON.stringify(expression.domain)}`);
|
|
79
|
+
return { kind: 'enum', domain: expression.domain };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
case 'variable': {
|
|
83
|
+
const variable = variables.get(expression.id);
|
|
84
|
+
if (variable === undefined) {
|
|
85
|
+
problems.push(`${path} references unknown variable ${JSON.stringify(expression.id)}`);
|
|
86
|
+
return { kind: 'bool' };
|
|
87
|
+
}
|
|
88
|
+
return variable.sort === 'enum' ? { kind: 'enum', domain: variable.domain } : { kind: variable.sort };
|
|
89
|
+
}
|
|
90
|
+
case 'not': {
|
|
91
|
+
expectBool(child(expression.value, 'value'), `${path}.value`);
|
|
92
|
+
return { kind: 'bool' };
|
|
93
|
+
}
|
|
94
|
+
case 'and':
|
|
95
|
+
case 'or': {
|
|
96
|
+
if (expression.operands.length < 2)
|
|
97
|
+
problems.push(`${path}.${expression.kind} requires at least two operands`);
|
|
98
|
+
expression.operands.forEach((operand, index) => expectBool(child(operand, `operands[${index}]`), `${path}.operands[${index}]`));
|
|
99
|
+
return { kind: 'bool' };
|
|
100
|
+
}
|
|
101
|
+
case 'implies': {
|
|
102
|
+
expectBool(child(expression.left, 'left'), `${path}.left`);
|
|
103
|
+
expectBool(child(expression.right, 'right'), `${path}.right`);
|
|
104
|
+
return { kind: 'bool' };
|
|
105
|
+
}
|
|
106
|
+
case 'eq':
|
|
107
|
+
case 'neq': {
|
|
108
|
+
const left = child(expression.left, 'left');
|
|
109
|
+
const right = child(expression.right, 'right');
|
|
110
|
+
if (!compatible(left, right))
|
|
111
|
+
problems.push(`${path} compares incompatible ${left.kind} and ${right.kind} expressions`);
|
|
112
|
+
return { kind: 'bool' };
|
|
113
|
+
}
|
|
114
|
+
case 'lt':
|
|
115
|
+
case 'lte':
|
|
116
|
+
case 'gt':
|
|
117
|
+
case 'gte': {
|
|
118
|
+
expectNumeric(child(expression.left, 'left'), `${path}.left`);
|
|
119
|
+
expectNumeric(child(expression.right, 'right'), `${path}.right`);
|
|
120
|
+
return { kind: 'bool' };
|
|
121
|
+
}
|
|
122
|
+
case 'add':
|
|
123
|
+
case 'multiply': {
|
|
124
|
+
if (expression.operands.length < 2)
|
|
125
|
+
problems.push(`${path}.${expression.kind} requires at least two operands`);
|
|
126
|
+
const sorts = expression.operands.map((operand, index) => child(operand, `operands[${index}]`));
|
|
127
|
+
sorts.forEach((sort, index) => expectNumeric(sort, `${path}.operands[${index}]`));
|
|
128
|
+
return { kind: sorts.some(sort => sort.kind === 'real') ? 'real' : 'int' };
|
|
129
|
+
}
|
|
130
|
+
case 'subtract': {
|
|
131
|
+
const left = child(expression.left, 'left');
|
|
132
|
+
const right = child(expression.right, 'right');
|
|
133
|
+
expectNumeric(left, `${path}.left`);
|
|
134
|
+
expectNumeric(right, `${path}.right`);
|
|
135
|
+
return { kind: left.kind === 'real' || right.kind === 'real' ? 'real' : 'int' };
|
|
136
|
+
}
|
|
137
|
+
case 'divide': {
|
|
138
|
+
expectNumeric(child(expression.left, 'left'), `${path}.left`);
|
|
139
|
+
expectNumeric(child(expression.right, 'right'), `${path}.right`);
|
|
140
|
+
const divisor = expression.right;
|
|
141
|
+
if (divisor.kind === 'literal' && (divisor.sort === 'int' || divisor.sort === 'real')) {
|
|
142
|
+
pushExactProblem(problems, `${path}.right`, () => {
|
|
143
|
+
const zero = divisor.sort === 'int' ? Exact.integer(divisor.value) === 0n : Exact.isZero(divisor.value);
|
|
144
|
+
if (zero)
|
|
145
|
+
throw new TypeError('literal divisor must not be zero');
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return { kind: 'real' };
|
|
149
|
+
}
|
|
150
|
+
case 'negate': {
|
|
151
|
+
const sort = child(expression.value, 'value');
|
|
152
|
+
expectNumeric(sort, `${path}.value`);
|
|
153
|
+
return sort;
|
|
154
|
+
}
|
|
155
|
+
case 'if': {
|
|
156
|
+
expectBool(child(expression.condition, 'condition'), `${path}.condition`);
|
|
157
|
+
const thenSort = child(expression.then, 'then');
|
|
158
|
+
const elseSort = child(expression.else, 'else');
|
|
159
|
+
if (!compatible(thenSort, elseSort))
|
|
160
|
+
problems.push(`${path} branches have incompatible ${thenSort.kind} and ${elseSort.kind} sorts`);
|
|
161
|
+
return numeric(thenSort) && numeric(elseSort) && (thenSort.kind === 'real' || elseSort.kind === 'real')
|
|
162
|
+
? { kind: 'real' }
|
|
163
|
+
: thenSort;
|
|
164
|
+
}
|
|
165
|
+
default:
|
|
166
|
+
problems.push(`${path} uses unsupported expression kind ${JSON.stringify(expression.kind)}`);
|
|
167
|
+
return { kind: 'bool' };
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
export const mergeLimits = (input = {}) => {
|
|
171
|
+
const limits = { ...defaultLimits, ...input };
|
|
172
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
173
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
174
|
+
throw new TypeError(`solver limit ${name} must be a positive safe integer, received ${String(value)}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return limits;
|
|
178
|
+
};
|
|
179
|
+
const enforce = (stats, limits) => {
|
|
180
|
+
const checks = [
|
|
181
|
+
['maxVariables', stats.variables],
|
|
182
|
+
['maxConstraints', stats.constraints],
|
|
183
|
+
['maxObjectives', stats.objectives],
|
|
184
|
+
['maxEnumValues', stats.enumValues],
|
|
185
|
+
['maxExpressionNodes', stats.expressionNodes],
|
|
186
|
+
['maxExpressionDepth', stats.expressionDepth]
|
|
187
|
+
];
|
|
188
|
+
for (const [limit, actual] of checks) {
|
|
189
|
+
if (actual > limits[limit])
|
|
190
|
+
throw new ModelLimitError(limit, actual, limits[limit]);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
/** Validates sorts and exact values before any backend is invoked. */
|
|
194
|
+
export const model = (input, limitInput = {}) => {
|
|
195
|
+
const limits = mergeLimits(limitInput);
|
|
196
|
+
const problems = [];
|
|
197
|
+
if (input.schema !== schema)
|
|
198
|
+
problems.push(`schema must be ${JSON.stringify(schema)}`);
|
|
199
|
+
const domains = new Map();
|
|
200
|
+
const enumDeclarations = input.enums ?? [];
|
|
201
|
+
duplicates(enumDeclarations.map(domain => domain.id), 'enums', problems);
|
|
202
|
+
enumDeclarations.forEach((domain, index) => {
|
|
203
|
+
requireId(domain.id, `enums[${index}].id`, problems);
|
|
204
|
+
if (domain.values.length === 0)
|
|
205
|
+
problems.push(`enums[${index}] must contain at least one value`);
|
|
206
|
+
if (new Set(domain.values).size !== domain.values.length)
|
|
207
|
+
problems.push(`enums[${index}] contains duplicate values`);
|
|
208
|
+
domains.set(domain.id, domain.values);
|
|
209
|
+
});
|
|
210
|
+
const variables = new Map();
|
|
211
|
+
duplicates(input.variables.map(variable => variable.id), 'variables', problems);
|
|
212
|
+
input.variables.forEach((variable, index) => {
|
|
213
|
+
requireId(variable.id, `variables[${index}].id`, problems);
|
|
214
|
+
variables.set(variable.id, variable);
|
|
215
|
+
if (variable.sort === 'enum' && !domains.has(variable.domain)) {
|
|
216
|
+
problems.push(`variables[${index}] references unknown enum domain ${JSON.stringify(variable.domain)}`);
|
|
217
|
+
}
|
|
218
|
+
if (variable.sort === 'int') {
|
|
219
|
+
pushExactProblem(problems, `variables[${index}].min`, () => Exact.integer(variable.min));
|
|
220
|
+
pushExactProblem(problems, `variables[${index}].max`, () => Exact.integer(variable.max));
|
|
221
|
+
try {
|
|
222
|
+
if (Exact.compare(rationalOfInteger(variable, 'min'), rationalOfInteger(variable, 'max')) > 0) {
|
|
223
|
+
problems.push(`variables[${index}] has min greater than max`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch { /* exact-value problems are already reported above */ }
|
|
227
|
+
}
|
|
228
|
+
if (variable.sort === 'real') {
|
|
229
|
+
if (variable.min !== undefined)
|
|
230
|
+
pushExactProblem(problems, `variables[${index}].min`, () => Exact.rational(variable.min));
|
|
231
|
+
if (variable.max !== undefined)
|
|
232
|
+
pushExactProblem(problems, `variables[${index}].max`, () => Exact.rational(variable.max));
|
|
233
|
+
if (variable.min !== undefined && variable.max !== undefined) {
|
|
234
|
+
try {
|
|
235
|
+
if (Exact.compare(variable.min, variable.max) > 0)
|
|
236
|
+
problems.push(`variables[${index}] has min greater than max`);
|
|
237
|
+
}
|
|
238
|
+
catch { /* exact-value problems are already reported above */ }
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
duplicates([
|
|
243
|
+
...input.constraints.map(constraint => constraint.id),
|
|
244
|
+
...(input.softConstraints ?? []).map(constraint => constraint.id)
|
|
245
|
+
], 'constraints', problems);
|
|
246
|
+
duplicates((input.objectives ?? []).map(objective => objective.id), 'objectives', problems);
|
|
247
|
+
const walk = { nodes: 0, depth: 0 };
|
|
248
|
+
input.constraints.forEach((constraint, index) => {
|
|
249
|
+
requireId(constraint.id, `constraints[${index}].id`, problems);
|
|
250
|
+
const sort = infer(constraint.expression, `constraints[${index}].expression`, variables, domains, problems, walk, 1);
|
|
251
|
+
if (sort.kind !== 'bool')
|
|
252
|
+
problems.push(`constraints[${index}].expression must be boolean, received ${sort.kind}`);
|
|
253
|
+
});
|
|
254
|
+
(input.softConstraints ?? []).forEach((constraint, index) => {
|
|
255
|
+
requireId(constraint.id, `softConstraints[${index}].id`, problems);
|
|
256
|
+
const sort = infer(constraint.expression, `softConstraints[${index}].expression`, variables, domains, problems, walk, 1);
|
|
257
|
+
if (sort.kind !== 'bool')
|
|
258
|
+
problems.push(`softConstraints[${index}].expression must be boolean, received ${sort.kind}`);
|
|
259
|
+
pushExactProblem(problems, `softConstraints[${index}].weight`, () => {
|
|
260
|
+
if (Exact.compare(constraint.weight, '0') <= 0)
|
|
261
|
+
throw new TypeError('weight must be greater than zero');
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
(input.objectives ?? []).forEach((objective, index) => {
|
|
265
|
+
requireId(objective.id, `objectives[${index}].id`, problems);
|
|
266
|
+
const sort = infer(objective.expression, `objectives[${index}].expression`, variables, domains, problems, walk, 1);
|
|
267
|
+
if (!numeric(sort))
|
|
268
|
+
problems.push(`objectives[${index}].expression must be numeric, received ${sort.kind}`);
|
|
269
|
+
});
|
|
270
|
+
if (problems.length > 0)
|
|
271
|
+
throw new ModelValidationError(problems);
|
|
272
|
+
const stats = {
|
|
273
|
+
variables: input.variables.length,
|
|
274
|
+
constraints: input.constraints.length + (input.softConstraints?.length ?? 0),
|
|
275
|
+
objectives: input.objectives?.length ?? 0,
|
|
276
|
+
enumValues: enumDeclarations.reduce((sum, domain) => sum + domain.values.length, 0),
|
|
277
|
+
expressionNodes: walk.nodes,
|
|
278
|
+
expressionDepth: walk.depth
|
|
279
|
+
};
|
|
280
|
+
enforce(stats, limits);
|
|
281
|
+
return stats;
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cavelang/solver",
|
|
3
|
+
"version": "0.27.14",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Solver-neutral models, validation, capability negotiation, and result contracts for CAVE formal reasoning.",
|
|
6
|
+
"license": "CC0-1.0",
|
|
7
|
+
"author": "Mirek Rusin (https://github.com/mirek)",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/mirek/cave.git",
|
|
11
|
+
"directory": "packages/solver"
|
|
12
|
+
},
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=22.18"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/src/index.d.ts",
|
|
19
|
+
"default": "./dist/src/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"!dist/test",
|
|
25
|
+
"!dist/tsconfig.tsbuildinfo",
|
|
26
|
+
"src",
|
|
27
|
+
"!src/**/*.test.ts",
|
|
28
|
+
"README.md",
|
|
29
|
+
"License.md"
|
|
30
|
+
],
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -b",
|
|
36
|
+
"test": "node --disable-warning=ExperimentalWarning --test 'test/*.test.ts'",
|
|
37
|
+
"typecheck": "tsc -b"
|
|
38
|
+
}
|
|
39
|
+
}
|