@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.
Files changed (48) hide show
  1. package/License.md +8 -0
  2. package/README.md +95 -0
  3. package/dist/src/adapter.d.ts +77 -0
  4. package/dist/src/adapter.d.ts.map +1 -0
  5. package/dist/src/adapter.js +24 -0
  6. package/dist/src/adapter.js.map +1 -0
  7. package/dist/src/canonical.d.ts +5 -0
  8. package/dist/src/canonical.d.ts.map +1 -0
  9. package/dist/src/canonical.js +88 -0
  10. package/dist/src/canonical.js.map +1 -0
  11. package/dist/src/capability.d.ts +10 -0
  12. package/dist/src/capability.d.ts.map +1 -0
  13. package/dist/src/capability.js +92 -0
  14. package/dist/src/capability.js.map +1 -0
  15. package/dist/src/exact.d.ts +10 -0
  16. package/dist/src/exact.d.ts.map +1 -0
  17. package/dist/src/exact.js +75 -0
  18. package/dist/src/exact.js.map +1 -0
  19. package/dist/src/index.d.ts +15 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +15 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/linear.d.ts +8 -0
  24. package/dist/src/linear.d.ts.map +1 -0
  25. package/dist/src/linear.js +52 -0
  26. package/dist/src/linear.js.map +1 -0
  27. package/dist/src/model.d.ts +130 -0
  28. package/dist/src/model.d.ts.map +1 -0
  29. package/dist/src/model.js +3 -0
  30. package/dist/src/model.js.map +1 -0
  31. package/dist/src/solve.d.ts +5 -0
  32. package/dist/src/solve.d.ts.map +1 -0
  33. package/dist/src/solve.js +12 -0
  34. package/dist/src/solve.js.map +1 -0
  35. package/dist/src/validate.d.ts +24 -0
  36. package/dist/src/validate.d.ts.map +1 -0
  37. package/dist/src/validate.js +283 -0
  38. package/dist/src/validate.js.map +1 -0
  39. package/package.json +39 -0
  40. package/src/adapter.ts +110 -0
  41. package/src/canonical.ts +94 -0
  42. package/src/capability.ts +82 -0
  43. package/src/exact.ts +85 -0
  44. package/src/index.ts +15 -0
  45. package/src/linear.ts +58 -0
  46. package/src/model.ts +80 -0
  47. package/src/solve.ts +13 -0
  48. package/src/validate.ts +302 -0
package/License.md ADDED
@@ -0,0 +1,8 @@
1
+ # CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
2
+
3
+ To the extent possible under law, the authors listed in the repository's
4
+ `Authors.md` have waived all copyright and related or neighboring rights to
5
+ this software and associated documentation files (the "Software").
6
+
7
+ For more information, see:
8
+ https://creativecommons.org/publicdomain/zero/1.0/
package/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # @cavelang/solver
2
+
3
+ Solver-neutral TypeScript contracts for CAVE formal reasoning. The package
4
+ defines exact, serializable models; validation; capability negotiation;
5
+ resource limits; canonical model digests; result states; and linear-subset
6
+ recognition. It does not depend on Z3, HiGHS, SQLite, or another CAVE package.
7
+
8
+ ```ts
9
+ import { Adapter, Model, Solve } from '@cavelang/solver'
10
+
11
+ const model: Model.t = {
12
+ schema: Model.schema,
13
+ variables: [{ id: 'replicas', sort: 'int', min: 1, max: 20 }],
14
+ constraints: [{
15
+ id: 'capacity',
16
+ expression: {
17
+ kind: 'gte',
18
+ left: { kind: 'variable', id: 'replicas' },
19
+ right: { kind: 'literal', sort: 'int', value: 3 }
20
+ }
21
+ }],
22
+ objectives: [{
23
+ id: 'fewest-replicas',
24
+ direction: 'minimize',
25
+ expression: { kind: 'variable', id: 'replicas' }
26
+ }]
27
+ }
28
+
29
+ declare const adapter: Adapter.t
30
+ const result = await Solve.run(adapter, model, {
31
+ limits: { timeoutMs: 2_000 }
32
+ })
33
+ ```
34
+
35
+ Exact real literals are decimal strings or numerator/denominator pairs. They
36
+ are normalized with `bigint`; no decimal is routed through JavaScript floating
37
+ point. Objective array order is lexicographic priority. CAVE confidence is not
38
+ part of this model and is never interpreted as a soft-constraint weight.
39
+
40
+ ## Portable semantics
41
+
42
+ - Integer variables always have inclusive finite bounds. Real variables may
43
+ have either, both, or neither bound because SMT backends support exact
44
+ unbounded rational domains.
45
+ - Mixed integer/real arithmetic promotes the integer operand to an exact real.
46
+ Division always returns an exact real; it never uses JavaScript or
47
+ backend-specific integer-division behavior.
48
+ - `add`, `subtract`, `multiply`, and `negate` are exact. Multiplication of two
49
+ variable-bearing expressions is portable but requires the
50
+ `nonlinear-arithmetic` capability.
51
+ - Hard constraints must be Boolean. Soft constraints are Boolean plus an
52
+ explicit positive rational weight. Confidence, probability, uncertainty,
53
+ cost, and preference weight remain different concepts.
54
+ - Objectives are evaluated lexicographically in declaration order. A backend
55
+ must advertise `lexicographic-objectives` when a model contains more than
56
+ one objective.
57
+ - Enum domains are named finite sets. Enum literals carry the domain ID, so
58
+ values from unrelated domains can never compare accidentally.
59
+
60
+ Quantifiers, arrays, bit-vectors, recursive definitions, transcendental
61
+ functions, raw SMT-LIB, and solver tactics are deliberately absent. A new
62
+ portable operation requires a schema version and adapter capability rather
63
+ than falling through to backend-specific behavior.
64
+
65
+ ## Validation and identity
66
+
67
+ `Validate.model` checks schema version, identifiers, duplicate declarations,
68
+ exact numerals, bounds, enum membership, references, expression sorts,
69
+ constraint/objective types, and preflight model-size limits. Invalid or
70
+ unsupported models fail before an adapter runs. Operational limits cover time,
71
+ working memory, declarations, enum values, expression nodes/depth, and output
72
+ size; every limit is passed to the selected adapter.
73
+
74
+ `Canonical.serialize` produces stable semantic JSON. Declaration order is
75
+ ignored except for objectives, and exact values are reduced to normalized
76
+ fractions. Descriptions and evidence row IDs do not affect identity.
77
+ `Canonical.digest` returns the full `sha256:<hex>` digest.
78
+
79
+ ## Adapter results
80
+
81
+ An adapter advertises a backend name/version and a capability set. `Solve.run`
82
+ validates the model, merges limits, checks capabilities deterministically, and
83
+ only then invokes it. Results are disjoint:
84
+
85
+ - `satisfied` includes a concrete assignment;
86
+ - `optimal` includes assignments, objective values, available bounds, and an
87
+ explicit proof marker;
88
+ - `unsatisfied` is allowed only for proved infeasibility and may include a
89
+ stable constraint-ID core; and
90
+ - `unknown` carries a structured timeout, resource, cancellation, backend, or
91
+ indeterminate reason.
92
+
93
+ A feasible assignment returned after an optimization timeout is `unknown`,
94
+ not `optimal`. A timeout or unsupported capability is never rendered as proof
95
+ that the model is infeasible.
@@ -0,0 +1,77 @@
1
+ import type { Assignment, Model, Rational, Value } from './model.ts';
2
+ export declare const capabilities: readonly ["booleans", "integers", "rationals", "finite-enums", "conditionals", "nonlinear-arithmetic", "optimization", "lexicographic-objectives", "soft-constraints", "unsat-cores"];
3
+ export type Capability = typeof capabilities[number];
4
+ export type Limits = {
5
+ readonly timeoutMs: number;
6
+ /** Backend working-memory ceiling. Adapters must reject or isolate when they cannot enforce it. */
7
+ readonly maxMemoryBytes: number;
8
+ readonly maxVariables: number;
9
+ readonly maxConstraints: number;
10
+ readonly maxObjectives: number;
11
+ readonly maxEnumValues: number;
12
+ readonly maxExpressionNodes: number;
13
+ readonly maxExpressionDepth: number;
14
+ readonly maxOutputBytes: number;
15
+ };
16
+ export declare const defaultLimits: Limits;
17
+ export type Backend = {
18
+ readonly name: string;
19
+ readonly version: string;
20
+ };
21
+ export type Diagnostic = {
22
+ readonly level: 'info' | 'warning' | 'error';
23
+ readonly code: string;
24
+ readonly message: string;
25
+ };
26
+ type CommonResult = {
27
+ readonly backend: Backend;
28
+ readonly diagnostics: readonly Diagnostic[];
29
+ readonly elapsedMs: number;
30
+ };
31
+ export type ObjectiveValue = {
32
+ readonly objectiveId: string;
33
+ readonly value: Value;
34
+ readonly bound?: Value;
35
+ };
36
+ export type UnknownReason = {
37
+ readonly kind: 'timeout' | 'resource-limit' | 'cancelled' | 'backend-error' | 'indeterminate';
38
+ readonly message: string;
39
+ readonly limit?: keyof Limits;
40
+ };
41
+ export type Result = CommonResult & ({
42
+ readonly status: 'satisfied';
43
+ readonly assignment: Assignment;
44
+ } | {
45
+ readonly status: 'optimal';
46
+ readonly assignment: Assignment;
47
+ readonly objectives: readonly ObjectiveValue[];
48
+ readonly optimalityProved: true;
49
+ } | {
50
+ readonly status: 'unsatisfied';
51
+ readonly core?: readonly string[];
52
+ readonly infeasibilityProved: true;
53
+ } | {
54
+ readonly status: 'unknown';
55
+ readonly reason: UnknownReason;
56
+ });
57
+ export type Options = {
58
+ readonly limits?: Partial<Limits>;
59
+ readonly unsatCore?: boolean;
60
+ };
61
+ export type Request = {
62
+ readonly limits: Limits;
63
+ readonly unsatCore: boolean;
64
+ };
65
+ export type SolverAdapter = {
66
+ readonly backend: Backend;
67
+ readonly capabilities: ReadonlySet<Capability>;
68
+ readonly solve: (model: Model, request: Request) => Promise<Result>;
69
+ };
70
+ export type t = SolverAdapter;
71
+ /** Utility type for adapters that report exact objective bounds. */
72
+ export type ExactBound = {
73
+ readonly value: Rational;
74
+ readonly bound?: Rational;
75
+ };
76
+ export {};
77
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export const capabilities = [
2
+ 'booleans',
3
+ 'integers',
4
+ 'rationals',
5
+ 'finite-enums',
6
+ 'conditionals',
7
+ 'nonlinear-arithmetic',
8
+ 'optimization',
9
+ 'lexicographic-objectives',
10
+ 'soft-constraints',
11
+ 'unsat-cores'
12
+ ];
13
+ export const defaultLimits = Object.freeze({
14
+ timeoutMs: 10_000,
15
+ maxMemoryBytes: 512 * 1024 * 1024,
16
+ maxVariables: 1_000,
17
+ maxConstraints: 5_000,
18
+ maxObjectives: 16,
19
+ maxEnumValues: 1_000,
20
+ maxExpressionNodes: 100_000,
21
+ maxExpressionDepth: 128,
22
+ maxOutputBytes: 1_000_000
23
+ });
24
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU;IACV,UAAU;IACV,WAAW;IACX,cAAc;IACd,cAAc;IACd,sBAAsB;IACtB,cAAc;IACd,0BAA0B;IAC1B,kBAAkB;IAClB,aAAa;CACL,CAAA;AAiBV,MAAM,CAAC,MAAM,aAAa,GAAW,MAAM,CAAC,MAAM,CAAC;IACjD,SAAS,EAAE,MAAM;IACjB,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IACjC,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,KAAK;IACpB,kBAAkB,EAAE,OAAO;IAC3B,kBAAkB,EAAE,GAAG;IACvB,cAAc,EAAE,SAAS;CAC1B,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { Model } from './model.ts';
2
+ /** Canonical semantic JSON. Descriptions and evidence links are deliberately not identity. */
3
+ export declare const serialize: (input: Model) => string;
4
+ export declare const digest: (input: Model) => string;
5
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,KAAK,EAAY,MAAM,YAAY,CAAA;AAwD7D,8FAA8F;AAC9F,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,MA+BxC,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,KAAG,MACmC,CAAA"}
@@ -0,0 +1,88 @@
1
+ import { createHash } from 'node:crypto';
2
+ import * as Exact from "./exact.js";
3
+ import { model as validate } from "./validate.js";
4
+ const compareText = (left, right) => left < right ? -1 : left > right ? 1 : 0;
5
+ const exact = (value) => Exact.rational(value);
6
+ const expression = (input) => {
7
+ switch (input.kind) {
8
+ case 'literal':
9
+ if (input.sort === 'int')
10
+ return { kind: input.kind, sort: input.sort, value: String(Exact.integer(input.value)) };
11
+ if (input.sort === 'real')
12
+ return { kind: input.kind, sort: input.sort, value: exact(input.value) };
13
+ if (input.sort === 'enum')
14
+ return { kind: input.kind, sort: input.sort, domain: input.domain, value: input.value };
15
+ return { kind: input.kind, sort: input.sort, value: input.value };
16
+ case 'variable': return { kind: input.kind, id: input.id };
17
+ case 'not':
18
+ case 'negate': return { kind: input.kind, value: expression(input.value) };
19
+ case 'and':
20
+ case 'or':
21
+ case 'add':
22
+ case 'multiply': {
23
+ const operands = input.operands.map(expression)
24
+ .sort((left, right) => compareText(stableStringify(left), stableStringify(right)));
25
+ return { kind: input.kind, operands };
26
+ }
27
+ case 'implies':
28
+ case 'subtract':
29
+ case 'divide':
30
+ case 'lt':
31
+ case 'lte':
32
+ case 'gt':
33
+ case 'gte':
34
+ return { kind: input.kind, left: expression(input.left), right: expression(input.right) };
35
+ case 'eq':
36
+ case 'neq': {
37
+ const operands = [expression(input.left), expression(input.right)]
38
+ .sort((left, right) => compareText(stableStringify(left), stableStringify(right)));
39
+ return { kind: input.kind, left: operands[0], right: operands[1] };
40
+ }
41
+ case 'if':
42
+ return { kind: input.kind, condition: expression(input.condition), then: expression(input.then), else: expression(input.else) };
43
+ }
44
+ };
45
+ const stableStringify = (value) => {
46
+ if (value === null || typeof value !== 'object')
47
+ return JSON.stringify(value);
48
+ if (Array.isArray(value))
49
+ return `[${value.map(stableStringify).join(',')}]`;
50
+ const record = value;
51
+ return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(',')}}`;
52
+ };
53
+ const byId = (values) => [...values].sort((left, right) => compareText(left.id, right.id));
54
+ /** Canonical semantic JSON. Descriptions and evidence links are deliberately not identity. */
55
+ export const serialize = (input) => {
56
+ validate(input);
57
+ const canonical = {
58
+ schema: input.schema,
59
+ enums: byId(input.enums ?? []).map(domain => ({ id: domain.id, values: [...domain.values].sort() })),
60
+ variables: byId(input.variables).map((variable) => {
61
+ switch (variable.sort) {
62
+ case 'bool': return { id: variable.id, sort: variable.sort };
63
+ case 'int': return { id: variable.id, sort: variable.sort, min: String(Exact.integer(variable.min)), max: String(Exact.integer(variable.max)) };
64
+ case 'real': return {
65
+ id: variable.id,
66
+ sort: variable.sort,
67
+ ...(variable.min === undefined ? {} : { min: exact(variable.min) }),
68
+ ...(variable.max === undefined ? {} : { max: exact(variable.max) })
69
+ };
70
+ case 'enum': return { id: variable.id, sort: variable.sort, domain: variable.domain };
71
+ }
72
+ }),
73
+ constraints: byId(input.constraints).map(constraint => ({ id: constraint.id, expression: expression(constraint.expression) })),
74
+ softConstraints: byId(input.softConstraints ?? []).map(constraint => ({
75
+ id: constraint.id,
76
+ expression: expression(constraint.expression),
77
+ weight: exact(constraint.weight)
78
+ })),
79
+ objectives: (input.objectives ?? []).map(objective => ({
80
+ id: objective.id,
81
+ direction: objective.direction,
82
+ expression: expression(objective.expression)
83
+ }))
84
+ };
85
+ return stableStringify(canonical);
86
+ };
87
+ export const digest = (input) => `sha256:${createHash('sha256').update(serialize(input)).digest('hex')}`;
88
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/canonical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Capability, SolverAdapter } from './adapter.ts';
2
+ import type { Model } from './model.ts';
3
+ export declare class UnsupportedModelError extends Error {
4
+ readonly backend: string;
5
+ readonly missing: readonly Capability[];
6
+ constructor(backend: string, missing: readonly Capability[]);
7
+ }
8
+ export declare const required: (model: Model, unsatCore?: boolean) => ReadonlySet<Capability>;
9
+ export declare const missing: (adapter: SolverAdapter, model: Model, unsatCore?: boolean) => readonly Capability[];
10
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,YAAY,CAAA;AAEnD,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAA;gBAE3B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE;CAM5D;AAsCD,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,EAAE,mBAAiB,KAAG,WAAW,CAAC,UAAU,CA2BhF,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,SAAS,aAAa,EAAE,OAAO,KAAK,EAAE,mBAAiB,KAAG,SAAS,UAAU,EACD,CAAA"}
@@ -0,0 +1,92 @@
1
+ export class UnsupportedModelError extends Error {
2
+ backend;
3
+ missing;
4
+ constructor(backend, missing) {
5
+ super(`solver backend ${JSON.stringify(backend)} lacks capabilities: ${missing.join(', ')}`);
6
+ this.name = 'UnsupportedModelError';
7
+ this.backend = backend;
8
+ this.missing = missing;
9
+ }
10
+ }
11
+ const walk = (expression, visit) => {
12
+ visit(expression);
13
+ switch (expression.kind) {
14
+ case 'literal':
15
+ case 'variable': return;
16
+ case 'not':
17
+ case 'negate':
18
+ walk(expression.value, visit);
19
+ return;
20
+ case 'and':
21
+ case 'or':
22
+ case 'add':
23
+ case 'multiply':
24
+ expression.operands.forEach(operand => walk(operand, visit));
25
+ return;
26
+ case 'if':
27
+ walk(expression.condition, visit);
28
+ walk(expression.then, visit);
29
+ walk(expression.else, visit);
30
+ return;
31
+ default:
32
+ walk(expression.left, visit);
33
+ walk(expression.right, visit);
34
+ }
35
+ };
36
+ const hasNonlinearArithmetic = (expression) => {
37
+ let nonlinear = false;
38
+ const containsVariable = (candidate) => {
39
+ let found = false;
40
+ walk(candidate, node => { if (node.kind === 'variable')
41
+ found = true; });
42
+ return found;
43
+ };
44
+ walk(expression, node => {
45
+ if (node.kind === 'multiply' && node.operands.filter(containsVariable).length > 1)
46
+ nonlinear = true;
47
+ if (node.kind === 'divide' && containsVariable(node.right))
48
+ nonlinear = true;
49
+ });
50
+ return nonlinear;
51
+ };
52
+ export const required = (model, unsatCore = false) => {
53
+ const result = new Set(['booleans']);
54
+ if (model.variables.some(variable => variable.sort === 'int'))
55
+ result.add('integers');
56
+ if (model.variables.some(variable => variable.sort === 'real'))
57
+ result.add('rationals');
58
+ if ((model.enums?.length ?? 0) > 0 || model.variables.some(variable => variable.sort === 'enum'))
59
+ result.add('finite-enums');
60
+ if ((model.softConstraints?.length ?? 0) > 0) {
61
+ result.add('soft-constraints');
62
+ result.add('rationals');
63
+ }
64
+ if ((model.objectives?.length ?? 0) > 0)
65
+ result.add('optimization');
66
+ if ((model.objectives?.length ?? 0) > 1)
67
+ result.add('lexicographic-objectives');
68
+ if (unsatCore)
69
+ result.add('unsat-cores');
70
+ const expressions = [
71
+ ...model.constraints.map(constraint => constraint.expression),
72
+ ...(model.softConstraints ?? []).map(constraint => constraint.expression),
73
+ ...(model.objectives ?? []).map(objective => objective.expression)
74
+ ];
75
+ for (const expression of expressions) {
76
+ walk(expression, node => {
77
+ if (node.kind === 'literal' && node.sort === 'int')
78
+ result.add('integers');
79
+ if (node.kind === 'literal' && node.sort === 'real')
80
+ result.add('rationals');
81
+ if (node.kind === 'literal' && node.sort === 'enum')
82
+ result.add('finite-enums');
83
+ if (node.kind === 'if')
84
+ result.add('conditionals');
85
+ });
86
+ if (hasNonlinearArithmetic(expression))
87
+ result.add('nonlinear-arithmetic');
88
+ }
89
+ return result;
90
+ };
91
+ export const missing = (adapter, model, unsatCore = false) => [...required(model, unsatCore)].filter(capability => !adapter.capabilities.has(capability)).sort();
92
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Integer, Rational } from './model.ts';
2
+ export type Normalized = {
3
+ readonly numerator: string;
4
+ readonly denominator: string;
5
+ };
6
+ export declare const integer: (input: Integer) => bigint;
7
+ export declare const rational: (input: Rational) => Normalized;
8
+ export declare const compare: (left: Rational, right: Rational) => -1 | 0 | 1;
9
+ export declare const isZero: (input: Rational) => boolean;
10
+ //# sourceMappingURL=exact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact.d.ts","sourceRoot":"","sources":["../../src/exact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,CAAA;AAgBD,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,MAWxC,CAAA;AAsBD,eAAO,MAAM,QAAQ,GAAI,OAAO,QAAQ,KAAG,UAqB1C,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,MAAM,QAAQ,EAAE,OAAO,QAAQ,KAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAKlE,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,QAAQ,KAAG,OAA4C,CAAA"}
@@ -0,0 +1,75 @@
1
+ const integerPattern = /^[+-]?\d+$/;
2
+ const decimalPattern = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/;
3
+ const gcd = (left, right) => {
4
+ let a = left < 0n ? -left : left;
5
+ let b = right < 0n ? -right : right;
6
+ while (b !== 0n) {
7
+ const remainder = a % b;
8
+ a = b;
9
+ b = remainder;
10
+ }
11
+ return a;
12
+ };
13
+ export const integer = (input) => {
14
+ if (typeof input === 'number') {
15
+ if (!Number.isSafeInteger(input)) {
16
+ throw new TypeError(`expected a safe integer, received ${String(input)}`);
17
+ }
18
+ return BigInt(input);
19
+ }
20
+ if (!integerPattern.test(input)) {
21
+ throw new TypeError(`expected an integer string, received ${JSON.stringify(input)}`);
22
+ }
23
+ return BigInt(input);
24
+ };
25
+ const decimal = (input) => {
26
+ if (!decimalPattern.test(input)) {
27
+ throw new TypeError(`expected an exact decimal string, received ${JSON.stringify(input)}`);
28
+ }
29
+ const [coefficient = '', exponentText] = input.toLowerCase().split('e');
30
+ const exponent = exponentText === undefined ? 0 : Number(exponentText);
31
+ if (!Number.isSafeInteger(exponent)) {
32
+ throw new TypeError(`decimal exponent is outside the supported range: ${JSON.stringify(input)}`);
33
+ }
34
+ const negative = coefficient.startsWith('-');
35
+ const unsigned = coefficient.replace(/^[+-]/, '');
36
+ const [whole = '', fraction = ''] = unsigned.split('.');
37
+ const digits = `${whole === '' ? '0' : whole}${fraction}`;
38
+ const scale = fraction.length - exponent;
39
+ const signed = BigInt(digits === '' ? '0' : digits) * (negative ? -1n : 1n);
40
+ return scale <= 0
41
+ ? [signed * (10n ** BigInt(-scale)), 1n]
42
+ : [signed, 10n ** BigInt(scale)];
43
+ };
44
+ export const rational = (input) => {
45
+ let numerator;
46
+ let denominator;
47
+ if (typeof input === 'string') {
48
+ ;
49
+ [numerator, denominator] = decimal(input);
50
+ }
51
+ else {
52
+ numerator = integer(input.numerator);
53
+ denominator = integer(input.denominator);
54
+ }
55
+ if (denominator === 0n) {
56
+ throw new TypeError('rational denominator must not be zero');
57
+ }
58
+ if (denominator < 0n) {
59
+ numerator = -numerator;
60
+ denominator = -denominator;
61
+ }
62
+ const divisor = gcd(numerator, denominator);
63
+ return {
64
+ numerator: String(numerator / divisor),
65
+ denominator: String(denominator / divisor)
66
+ };
67
+ };
68
+ export const compare = (left, right) => {
69
+ const a = rational(left);
70
+ const b = rational(right);
71
+ const difference = BigInt(a.numerator) * BigInt(b.denominator) - BigInt(b.numerator) * BigInt(a.denominator);
72
+ return difference < 0n ? -1 : difference > 0n ? 1 : 0;
73
+ };
74
+ export const isZero = (input) => rational(input).numerator === '0';
75
+ //# sourceMappingURL=exact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact.js","sourceRoot":"","sources":["../../src/exact.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG,YAAY,CAAA;AACnC,MAAM,cAAc,GAAG,iDAAiD,CAAA;AAExE,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE;IAClD,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAChC,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IACnC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,SAAS,CAAA;IACf,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAU,EAAE;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,SAAS,CAAC,qCAAqC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACtF,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,KAAa,EAA6B,EAAE;IAC3D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC5F,CAAC;IACD,MAAM,CAAC,WAAW,GAAG,EAAE,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACtE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,oDAAoD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACjD,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAA;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC3E,OAAO,KAAK,IAAI,CAAC;QACf,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAc,EAAE;IACtD,IAAI,SAAiB,CAAA;IACrB,IAAI,WAAmB,CAAA;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,CAAC;QAAA,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,SAAS,GAAG,CAAC,SAAS,CAAA;QACtB,WAAW,GAAG,CAAC,WAAW,CAAA;IAC5B,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC3C,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;KAC3C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,KAAe,EAAc,EAAE;IACrE,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAC5G,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAe,EAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,GAAG,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Solver-neutral formal reasoning contracts for CAVE.
3
+ *
4
+ * This package contains no solver implementation and never imports Z3 or
5
+ * another backend. Adapters receive only validated portable model data.
6
+ */
7
+ export * as Adapter from './adapter.ts';
8
+ export * as Canonical from './canonical.ts';
9
+ export * as Capability from './capability.ts';
10
+ export * as Exact from './exact.ts';
11
+ export * as Linear from './linear.ts';
12
+ export * as Model from './model.ts';
13
+ export * as Solve from './solve.ts';
14
+ export * as Validate from './validate.ts';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Solver-neutral formal reasoning contracts for CAVE.
3
+ *
4
+ * This package contains no solver implementation and never imports Z3 or
5
+ * another backend. Adapters receive only validated portable model data.
6
+ */
7
+ export * as Adapter from "./adapter.js";
8
+ export * as Canonical from "./canonical.js";
9
+ export * as Capability from "./capability.js";
10
+ export * as Exact from "./exact.js";
11
+ export * as Linear from "./linear.js";
12
+ export * as Model from "./model.js";
13
+ export * as Solve from "./solve.js";
14
+ export * as Validate from "./validate.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { Model } from './model.ts';
2
+ export type Analysis = {
3
+ readonly linear: boolean;
4
+ readonly problems: readonly string[];
5
+ };
6
+ /** Recognizes the portable LP/MIP subset without consulting a backend AST. */
7
+ export declare const model: (input: Model) => Analysis;
8
+ //# sourceMappingURL=linear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,KAAK,EAAE,MAAM,YAAY,CAAA;AAGnD,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAoCD,8EAA8E;AAC9E,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,KAAG,QAcpC,CAAA"}