@cavelang/solver-z3 0.29.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.
- package/Authors.md +5 -0
- package/BENCHMARK.md +44 -0
- package/License.md +6 -0
- package/README.md +105 -0
- package/dist/scripts/benchmark.d.ts +2 -0
- package/dist/scripts/benchmark.d.ts.map +1 -0
- package/dist/scripts/benchmark.js +96 -0
- package/dist/scripts/benchmark.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/runtime.d.ts +10 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +399 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/workflow-fixture.d.ts +20 -0
- package/dist/src/workflow-fixture.d.ts.map +1 -0
- package/dist/src/workflow-fixture.js +185 -0
- package/dist/src/workflow-fixture.js.map +1 -0
- package/dist/src/workflow-main.d.ts +3 -0
- package/dist/src/workflow-main.d.ts.map +1 -0
- package/dist/src/workflow-main.js +9 -0
- package/dist/src/workflow-main.js.map +1 -0
- package/package.json +67 -0
- package/scripts/benchmark.ts +101 -0
- package/src/index.ts +10 -0
- package/src/runtime.ts +479 -0
- package/src/workflow-fixture.ts +227 -0
- package/src/workflow-main.ts +8 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { performance } from 'node:perf_hooks';
|
|
2
|
+
import { Adapter, Exact, Model } from '@cavelang/solver';
|
|
3
|
+
const backendError = (backend, started, error) => ({
|
|
4
|
+
status: 'unknown',
|
|
5
|
+
reason: {
|
|
6
|
+
kind: 'backend-error',
|
|
7
|
+
message: error instanceof Error ? error.message : String(error)
|
|
8
|
+
},
|
|
9
|
+
backend,
|
|
10
|
+
diagnostics: [],
|
|
11
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
12
|
+
});
|
|
13
|
+
const exact = (value) => {
|
|
14
|
+
const normalized = Exact.rational(value);
|
|
15
|
+
return {
|
|
16
|
+
numerator: BigInt(normalized.numerator),
|
|
17
|
+
denominator: BigInt(normalized.denominator)
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const rationalText = (value) => {
|
|
21
|
+
const normalized = Exact.rational(value);
|
|
22
|
+
return `${normalized.numerator}/${normalized.denominator}`;
|
|
23
|
+
};
|
|
24
|
+
const asBool = (value) => value;
|
|
25
|
+
const asArith = (value) => value;
|
|
26
|
+
const compiler = (context, model) => {
|
|
27
|
+
const compareText = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
28
|
+
const enums = new Map((model.enums ?? []).map(domain => [
|
|
29
|
+
domain.id,
|
|
30
|
+
[...domain.values].sort(compareText)
|
|
31
|
+
]));
|
|
32
|
+
const variables = new Map();
|
|
33
|
+
const bounds = [];
|
|
34
|
+
for (const variable of model.variables) {
|
|
35
|
+
switch (variable.sort) {
|
|
36
|
+
case 'bool':
|
|
37
|
+
variables.set(variable.id, context.Bool.const(variable.id));
|
|
38
|
+
break;
|
|
39
|
+
case 'int': {
|
|
40
|
+
const expression = context.Int.const(variable.id);
|
|
41
|
+
variables.set(variable.id, expression);
|
|
42
|
+
bounds.push(expression.ge(Exact.integer(variable.min)), expression.le(Exact.integer(variable.max)));
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'real': {
|
|
46
|
+
const expression = context.Real.const(variable.id);
|
|
47
|
+
variables.set(variable.id, expression);
|
|
48
|
+
if (variable.min !== undefined)
|
|
49
|
+
bounds.push(expression.ge(exact(variable.min)));
|
|
50
|
+
if (variable.max !== undefined)
|
|
51
|
+
bounds.push(expression.le(exact(variable.max)));
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'enum': {
|
|
55
|
+
// A finite enum is encoded as a bounded integer. The mapping is stable
|
|
56
|
+
// across semantically irrelevant declaration reordering.
|
|
57
|
+
const values = enums.get(variable.domain);
|
|
58
|
+
const expression = context.Int.const(variable.id);
|
|
59
|
+
variables.set(variable.id, expression);
|
|
60
|
+
bounds.push(expression.ge(0), expression.lt(values.length));
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const compile = (expression) => {
|
|
66
|
+
switch (expression.kind) {
|
|
67
|
+
case 'literal':
|
|
68
|
+
switch (expression.sort) {
|
|
69
|
+
case 'bool': return context.Bool.val(expression.value);
|
|
70
|
+
case 'int': return context.Int.val(Exact.integer(expression.value));
|
|
71
|
+
case 'real': return context.Real.val(exact(expression.value));
|
|
72
|
+
case 'enum': return context.Int.val(enums.get(expression.domain).indexOf(expression.value));
|
|
73
|
+
}
|
|
74
|
+
case 'variable': return variables.get(expression.id);
|
|
75
|
+
case 'not': return asBool(compile(expression.value)).not();
|
|
76
|
+
case 'and': return context.And(...expression.operands.map(value => asBool(compile(value))));
|
|
77
|
+
case 'or': return context.Or(...expression.operands.map(value => asBool(compile(value))));
|
|
78
|
+
case 'implies': return context.Implies(asBool(compile(expression.left)), asBool(compile(expression.right)));
|
|
79
|
+
case 'eq': return compile(expression.left).eq(compile(expression.right));
|
|
80
|
+
case 'neq': return compile(expression.left).neq(compile(expression.right));
|
|
81
|
+
case 'lt': return asArith(compile(expression.left)).lt(asArith(compile(expression.right)));
|
|
82
|
+
case 'lte': return asArith(compile(expression.left)).le(asArith(compile(expression.right)));
|
|
83
|
+
case 'gt': return asArith(compile(expression.left)).gt(asArith(compile(expression.right)));
|
|
84
|
+
case 'gte': return asArith(compile(expression.left)).ge(asArith(compile(expression.right)));
|
|
85
|
+
case 'add': {
|
|
86
|
+
const [first, ...rest] = expression.operands.map(value => asArith(compile(value)));
|
|
87
|
+
return rest.reduce((left, right) => left.add(right), first);
|
|
88
|
+
}
|
|
89
|
+
case 'multiply': {
|
|
90
|
+
const [first, ...rest] = expression.operands.map(value => asArith(compile(value)));
|
|
91
|
+
return rest.reduce((left, right) => left.mul(right), first);
|
|
92
|
+
}
|
|
93
|
+
case 'subtract': return asArith(compile(expression.left)).sub(asArith(compile(expression.right)));
|
|
94
|
+
case 'divide': {
|
|
95
|
+
const left = asArith(compile(expression.left));
|
|
96
|
+
const right = asArith(compile(expression.right));
|
|
97
|
+
// Portable division is exact-real division even when both operands are
|
|
98
|
+
// integers; Z3's native Int / Int operation would truncate instead.
|
|
99
|
+
const real = (value) => context.isInt(value) ? context.ToReal(value) : value;
|
|
100
|
+
return real(left).div(real(right));
|
|
101
|
+
}
|
|
102
|
+
case 'negate': return asArith(compile(expression.value)).neg();
|
|
103
|
+
case 'if': return context.If(asBool(compile(expression.condition)), compile(expression.then), compile(expression.else));
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
variables,
|
|
108
|
+
enums,
|
|
109
|
+
bounds,
|
|
110
|
+
constraints: new Map(model.constraints.map(constraint => [constraint.id, asBool(compile(constraint.expression))])),
|
|
111
|
+
softConstraints: (model.softConstraints ?? []).map(constraint => ({
|
|
112
|
+
expression: asBool(compile(constraint.expression)),
|
|
113
|
+
weight: rationalText(constraint.weight)
|
|
114
|
+
})),
|
|
115
|
+
objectives: (model.objectives ?? []).map(objective => ({
|
|
116
|
+
id: objective.id,
|
|
117
|
+
direction: objective.direction,
|
|
118
|
+
expression: asArith(compile(objective.expression))
|
|
119
|
+
}))
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
const assignment = (context, compiled, model, z3Model) => Object.fromEntries([...model.variables]
|
|
123
|
+
.sort((left, right) => left.id < right.id ? -1 : left.id > right.id ? 1 : 0)
|
|
124
|
+
.map(variable => {
|
|
125
|
+
const value = z3Model.eval(compiled.variables.get(variable.id), true);
|
|
126
|
+
switch (variable.sort) {
|
|
127
|
+
case 'bool':
|
|
128
|
+
if (context.isTrue(value))
|
|
129
|
+
return [variable.id, { sort: 'bool', value: true }];
|
|
130
|
+
if (context.isFalse(value))
|
|
131
|
+
return [variable.id, { sort: 'bool', value: false }];
|
|
132
|
+
throw new TypeError(`Z3 returned a non-Boolean value for ${JSON.stringify(variable.id)}`);
|
|
133
|
+
case 'int':
|
|
134
|
+
if (!context.isIntVal(value))
|
|
135
|
+
throw new TypeError(`Z3 returned a non-integer value for ${JSON.stringify(variable.id)}`);
|
|
136
|
+
return [variable.id, { sort: 'int', value: value.value().toString() }];
|
|
137
|
+
case 'real':
|
|
138
|
+
if (!context.isRealVal(value))
|
|
139
|
+
throw new TypeError(`Z3 returned a non-rational value for ${JSON.stringify(variable.id)}`);
|
|
140
|
+
return [variable.id, {
|
|
141
|
+
sort: 'real',
|
|
142
|
+
numerator: value.value().numerator.toString(),
|
|
143
|
+
denominator: value.value().denominator.toString()
|
|
144
|
+
}];
|
|
145
|
+
case 'enum': {
|
|
146
|
+
if (!context.isIntVal(value))
|
|
147
|
+
throw new TypeError(`Z3 returned a non-enum value for ${JSON.stringify(variable.id)}`);
|
|
148
|
+
const index = Number(value.value());
|
|
149
|
+
const member = compiled.enums.get(variable.domain)?.[index];
|
|
150
|
+
if (member === undefined)
|
|
151
|
+
throw new TypeError(`Z3 returned an out-of-domain enum value for ${JSON.stringify(variable.id)}`);
|
|
152
|
+
return [variable.id, { sort: 'enum', domain: variable.domain, value: member }];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}));
|
|
156
|
+
const numericValue = (context, value) => {
|
|
157
|
+
if (context.isIntVal(value))
|
|
158
|
+
return { sort: 'int', value: value.value().toString() };
|
|
159
|
+
if (context.isRealVal(value))
|
|
160
|
+
return {
|
|
161
|
+
sort: 'real',
|
|
162
|
+
numerator: value.value().numerator.toString(),
|
|
163
|
+
denominator: value.value().denominator.toString()
|
|
164
|
+
};
|
|
165
|
+
throw new TypeError(`Z3 returned a non-rational objective value: ${value.sexpr()}`);
|
|
166
|
+
};
|
|
167
|
+
const withDeadline = async (context, timeoutMs, check) => {
|
|
168
|
+
let interrupted = false;
|
|
169
|
+
const timer = setTimeout(() => {
|
|
170
|
+
interrupted = true;
|
|
171
|
+
context.interrupt();
|
|
172
|
+
}, timeoutMs);
|
|
173
|
+
timer.unref();
|
|
174
|
+
try {
|
|
175
|
+
return { status: await check(), interrupted };
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const unknown = (backend, started, reason, interrupted) => {
|
|
182
|
+
const timeout = interrupted || /timeout|canceled|cancelled/i.test(reason);
|
|
183
|
+
const memory = /memory|memout/i.test(reason);
|
|
184
|
+
return {
|
|
185
|
+
status: 'unknown',
|
|
186
|
+
reason: timeout
|
|
187
|
+
? { kind: 'timeout', message: reason || 'Z3 deadline reached', limit: 'timeoutMs' }
|
|
188
|
+
: memory
|
|
189
|
+
? { kind: 'resource-limit', message: reason, limit: 'maxMemoryBytes' }
|
|
190
|
+
: { kind: 'indeterminate', message: reason || 'Z3 returned unknown' },
|
|
191
|
+
backend,
|
|
192
|
+
diagnostics: [],
|
|
193
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
const addHard = (solver, compiled, track) => {
|
|
197
|
+
solver.add(...compiled.bounds);
|
|
198
|
+
const trackers = new Map();
|
|
199
|
+
for (const [id, expression] of compiled.constraints) {
|
|
200
|
+
if (track) {
|
|
201
|
+
const symbol = `cave.constraint.${id}`;
|
|
202
|
+
const tracker = solver.ctx.Bool.const(symbol);
|
|
203
|
+
solver.addAndTrack(expression, tracker);
|
|
204
|
+
trackers.set(tracker.id(), id);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
solver.add(expression);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return trackers;
|
|
211
|
+
};
|
|
212
|
+
const coreFor = async (context, compiled, limits) => {
|
|
213
|
+
const solver = new context.Solver();
|
|
214
|
+
try {
|
|
215
|
+
solver.set('timeout', limits.timeoutMs);
|
|
216
|
+
const trackers = addHard(solver, compiled, true);
|
|
217
|
+
if ((await withDeadline(context, limits.timeoutMs, () => solver.check())).status !== 'unsat')
|
|
218
|
+
return undefined;
|
|
219
|
+
return [...solver.unsatCore()]
|
|
220
|
+
.map(value => trackers.get(value.id()))
|
|
221
|
+
.filter((value) => value !== undefined)
|
|
222
|
+
.sort();
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
solver.release();
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
const limitOutput = (result, limits) => Buffer.byteLength(JSON.stringify(result)) <= limits.maxOutputBytes
|
|
229
|
+
? result
|
|
230
|
+
: {
|
|
231
|
+
status: 'unknown',
|
|
232
|
+
reason: {
|
|
233
|
+
kind: 'resource-limit',
|
|
234
|
+
message: 'solver result exceeds maxOutputBytes',
|
|
235
|
+
limit: 'maxOutputBytes'
|
|
236
|
+
},
|
|
237
|
+
backend: result.backend,
|
|
238
|
+
diagnostics: result.diagnostics,
|
|
239
|
+
elapsedMs: result.elapsedMs
|
|
240
|
+
};
|
|
241
|
+
const solveModel = async (api, context, backend, model, request) => {
|
|
242
|
+
const started = performance.now();
|
|
243
|
+
try {
|
|
244
|
+
api.setParam('memory_max_size', Math.max(1, Math.floor(request.limits.maxMemoryBytes / 1024 / 1024)));
|
|
245
|
+
const compiled = compiler(context, model);
|
|
246
|
+
const optimize = compiled.objectives.length > 0 || compiled.softConstraints.length > 0;
|
|
247
|
+
if (!optimize) {
|
|
248
|
+
const solver = new context.Solver();
|
|
249
|
+
try {
|
|
250
|
+
solver.set('timeout', request.limits.timeoutMs);
|
|
251
|
+
const trackers = addHard(solver, compiled, request.unsatCore);
|
|
252
|
+
const checked = await withDeadline(context, request.limits.timeoutMs, () => solver.check());
|
|
253
|
+
if (checked.status === 'unknown') {
|
|
254
|
+
return unknown(backend, started, solver.reasonUnknown(), checked.interrupted);
|
|
255
|
+
}
|
|
256
|
+
if (checked.status === 'unsat') {
|
|
257
|
+
const core = request.unsatCore
|
|
258
|
+
? [...solver.unsatCore()]
|
|
259
|
+
.map(value => trackers.get(value.id()))
|
|
260
|
+
.filter((value) => value !== undefined)
|
|
261
|
+
.sort()
|
|
262
|
+
: undefined;
|
|
263
|
+
return limitOutput({
|
|
264
|
+
status: 'unsatisfied',
|
|
265
|
+
...(core === undefined ? {} : { core }),
|
|
266
|
+
infeasibilityProved: true,
|
|
267
|
+
backend,
|
|
268
|
+
diagnostics: [],
|
|
269
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
270
|
+
}, request.limits);
|
|
271
|
+
}
|
|
272
|
+
return limitOutput({
|
|
273
|
+
status: 'satisfied',
|
|
274
|
+
assignment: assignment(context, compiled, model, solver.model()),
|
|
275
|
+
backend,
|
|
276
|
+
diagnostics: [],
|
|
277
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
278
|
+
}, request.limits);
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
solver.release();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const optimizer = new context.Optimize();
|
|
285
|
+
try {
|
|
286
|
+
optimizer.set('timeout', request.limits.timeoutMs);
|
|
287
|
+
optimizer.set('priority', 'lex');
|
|
288
|
+
addHard(optimizer, compiled, false);
|
|
289
|
+
for (const objective of compiled.objectives) {
|
|
290
|
+
if (objective.direction === 'minimize')
|
|
291
|
+
optimizer.minimize(objective.expression);
|
|
292
|
+
else
|
|
293
|
+
optimizer.maximize(objective.expression);
|
|
294
|
+
}
|
|
295
|
+
// Soft preferences are deliberately the lowest-priority objective. Their
|
|
296
|
+
// weights are explicit model data and never derived from CAVE confidence.
|
|
297
|
+
for (const constraint of compiled.softConstraints) {
|
|
298
|
+
optimizer.addSoft(constraint.expression, constraint.weight);
|
|
299
|
+
}
|
|
300
|
+
const checked = await withDeadline(context, request.limits.timeoutMs, () => optimizer.check());
|
|
301
|
+
if (checked.status === 'unknown') {
|
|
302
|
+
const reason = api.Z3.optimize_get_reason_unknown(context.ptr, optimizer.ptr);
|
|
303
|
+
return unknown(backend, started, reason, checked.interrupted);
|
|
304
|
+
}
|
|
305
|
+
if (checked.status === 'unsat') {
|
|
306
|
+
return limitOutput({
|
|
307
|
+
status: 'unsatisfied',
|
|
308
|
+
...(request.unsatCore ? { core: await coreFor(context, compiled, request.limits) } : {}),
|
|
309
|
+
infeasibilityProved: true,
|
|
310
|
+
backend,
|
|
311
|
+
diagnostics: [],
|
|
312
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
313
|
+
}, request.limits);
|
|
314
|
+
}
|
|
315
|
+
const z3Model = optimizer.model();
|
|
316
|
+
return limitOutput({
|
|
317
|
+
status: 'optimal',
|
|
318
|
+
assignment: assignment(context, compiled, model, z3Model),
|
|
319
|
+
objectives: compiled.objectives.map(objective => ({
|
|
320
|
+
objectiveId: objective.id,
|
|
321
|
+
value: numericValue(context, z3Model.eval(objective.expression, true))
|
|
322
|
+
})),
|
|
323
|
+
optimalityProved: true,
|
|
324
|
+
backend,
|
|
325
|
+
diagnostics: [],
|
|
326
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
327
|
+
}, request.limits);
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
optimizer.release();
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
if (api.Z3.get_estimated_alloc_size() > BigInt(request.limits.maxMemoryBytes)) {
|
|
335
|
+
return {
|
|
336
|
+
status: 'unknown',
|
|
337
|
+
reason: {
|
|
338
|
+
kind: 'resource-limit',
|
|
339
|
+
message: 'Z3 exceeded maxMemoryBytes',
|
|
340
|
+
limit: 'maxMemoryBytes'
|
|
341
|
+
},
|
|
342
|
+
backend,
|
|
343
|
+
diagnostics: [],
|
|
344
|
+
elapsedMs: Math.round(performance.now() - started)
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
return backendError(backend, started, error);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
let singleton;
|
|
351
|
+
const initialize = async () => {
|
|
352
|
+
const started = performance.now();
|
|
353
|
+
// Keep this as the only runtime import: importing @cavelang/solver-z3 itself
|
|
354
|
+
// must not load the 34 MB Wasm artifact or start worker threads.
|
|
355
|
+
const api = await import('z3-solver').then(module => module.init());
|
|
356
|
+
const context = api.Context('cave');
|
|
357
|
+
const backend = Object.freeze({ name: 'z3-wasm', version: api.Z3.get_full_version() });
|
|
358
|
+
let tail = Promise.resolve();
|
|
359
|
+
let closing = false;
|
|
360
|
+
let closed = false;
|
|
361
|
+
const enqueue = (work) => {
|
|
362
|
+
const result = tail.then(work, work);
|
|
363
|
+
tail = result.then(() => undefined, () => undefined);
|
|
364
|
+
return result;
|
|
365
|
+
};
|
|
366
|
+
const runtime = {
|
|
367
|
+
backend,
|
|
368
|
+
capabilities: new Set(Adapter.capabilities),
|
|
369
|
+
initializationMs: Math.round(performance.now() - started),
|
|
370
|
+
solve: (model, request) => {
|
|
371
|
+
if (closing)
|
|
372
|
+
return Promise.resolve(backendError(backend, performance.now(), new Error('Z3 runtime is closed')));
|
|
373
|
+
return enqueue(() => solveModel(api, context, backend, model, request));
|
|
374
|
+
},
|
|
375
|
+
close: async () => {
|
|
376
|
+
if (closed)
|
|
377
|
+
return;
|
|
378
|
+
closing = true;
|
|
379
|
+
await enqueue(async () => {
|
|
380
|
+
if (closed)
|
|
381
|
+
return;
|
|
382
|
+
// Let the completed pthread post its cleanup message before forcibly
|
|
383
|
+
// terminating the pool. Without this turn, Emscripten can report a
|
|
384
|
+
// late `cleanupThread` command from a worker we just terminated.
|
|
385
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
386
|
+
api.em?.PThread?.terminateAllThreads?.();
|
|
387
|
+
closed = true;
|
|
388
|
+
singleton = undefined;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
return runtime;
|
|
393
|
+
};
|
|
394
|
+
/** Lazily initialize and reuse one process-wide Z3 runtime. */
|
|
395
|
+
export const create = () => singleton ??= initialize().catch(error => {
|
|
396
|
+
singleton = undefined;
|
|
397
|
+
throw error;
|
|
398
|
+
});
|
|
399
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Named CLI fixture for the solver workflow API. No raw model input is accepted. */
|
|
2
|
+
import { Adapter, Model } from '@cavelang/solver';
|
|
3
|
+
export type Output = {
|
|
4
|
+
readonly code: number;
|
|
5
|
+
readonly out: string;
|
|
6
|
+
readonly err: string;
|
|
7
|
+
};
|
|
8
|
+
export type ArchitectureInputs = {
|
|
9
|
+
readonly teamSize?: number;
|
|
10
|
+
readonly deploymentFrequency?: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Small but non-trivial architecture decision model used by the CLI fixture.
|
|
14
|
+
* The invariant is intentionally stronger than the feasibility constraint so
|
|
15
|
+
* the counterexample workflow has a concrete bounded witness.
|
|
16
|
+
*/
|
|
17
|
+
export declare const architectureModel: (inputs?: ArchitectureInputs) => Model.t;
|
|
18
|
+
/** Runs the allowlisted fixture. Supplying an adapter is intended for tests. */
|
|
19
|
+
export declare const runWorkflowFixture: (argv: readonly string[], supplied?: Adapter.t) => Promise<Output>;
|
|
20
|
+
//# sourceMappingURL=workflow-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-fixture.d.ts","sourceRoot":"","sources":["../../src/workflow-fixture.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAY,MAAM,kBAAkB,CAAA;AAG3D,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAmC1F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CACtC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAQ,kBAAuB,KAAG,KAAK,CAAC,CAgEzE,CAAA;AAyDD,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,SAAS,MAAM,EAAE,EACvB,WAAW,OAAO,CAAC,CAAC,KACnB,OAAO,CAAC,MAAM,CAmDhB,CAAA"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/** Named CLI fixture for the solver workflow API. No raw model input is accepted. */
|
|
2
|
+
import { Adapter, Model, Workflow } from '@cavelang/solver';
|
|
3
|
+
import { create } from "./runtime.js";
|
|
4
|
+
const usage = `Usage: cave-solver-workflow architecture <operation> [options]
|
|
5
|
+
|
|
6
|
+
Operations:
|
|
7
|
+
feasibility Find a deterministic feasible architecture.
|
|
8
|
+
optimization Minimize the declared architecture cost model.
|
|
9
|
+
counterexample Test the declared small-team-monolith invariant.
|
|
10
|
+
sensitivity Vary deployment frequency and report architecture changes.
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--team-size <2..20> Default: 10
|
|
14
|
+
--deployment-frequency <1..12> Default: 6
|
|
15
|
+
--from <1..12> Sensitivity start; default: 1
|
|
16
|
+
--to <1..12> Sensitivity end; default: 12
|
|
17
|
+
--timeout-ms <positive integer> Per solver run; default: 10000
|
|
18
|
+
|
|
19
|
+
The fixture is the only selectable model. Inputs are bounded and typed before
|
|
20
|
+
the optional Z3 adapter runs; arbitrary expressions and SMT-LIB are rejected.
|
|
21
|
+
`;
|
|
22
|
+
const fail = (message, code = 2) => ({ code, out: '', err: `${message}\n\n${usage}` });
|
|
23
|
+
const ok = (value) => ({ code: 0, out: `${JSON.stringify(value, null, 2)}\n`, err: '' });
|
|
24
|
+
const integer = (value) => ({ kind: 'literal', sort: 'int', value });
|
|
25
|
+
const ref = (id) => ({ kind: 'variable', id });
|
|
26
|
+
const architecture = (value) => ({
|
|
27
|
+
kind: 'literal', sort: 'enum', domain: 'architecture', value
|
|
28
|
+
});
|
|
29
|
+
const equal = (id, value) => ({ kind: 'eq', left: ref(id), right: value });
|
|
30
|
+
const add = (...operands) => ({ kind: 'add', operands });
|
|
31
|
+
const multiply = (left, right) => ({
|
|
32
|
+
kind: 'multiply', operands: [left, right]
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Small but non-trivial architecture decision model used by the CLI fixture.
|
|
36
|
+
* The invariant is intentionally stronger than the feasibility constraint so
|
|
37
|
+
* the counterexample workflow has a concrete bounded witness.
|
|
38
|
+
*/
|
|
39
|
+
export const architectureModel = (inputs = {}) => {
|
|
40
|
+
const constraints = [
|
|
41
|
+
{
|
|
42
|
+
id: 'microservices-team-capacity',
|
|
43
|
+
description: 'Microservices need at least six people in this fixture.',
|
|
44
|
+
declaration: { uri: 'packages/solver-z3/src/workflow-fixture.ts' },
|
|
45
|
+
expression: {
|
|
46
|
+
kind: 'implies',
|
|
47
|
+
left: equal('architecture', architecture('microservices')),
|
|
48
|
+
right: { kind: 'gte', left: ref('team-size'), right: integer(6) }
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'small-team-monolith',
|
|
53
|
+
description: 'Teams below eight people should choose a monolith.',
|
|
54
|
+
declaration: { uri: 'packages/solver-z3/src/workflow-fixture.ts' },
|
|
55
|
+
expression: {
|
|
56
|
+
kind: 'implies',
|
|
57
|
+
left: { kind: 'lt', left: ref('team-size'), right: integer(8) },
|
|
58
|
+
right: equal('architecture', architecture('monolith'))
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
if (inputs.teamSize !== undefined) {
|
|
63
|
+
constraints.push({
|
|
64
|
+
id: 'input/team-size',
|
|
65
|
+
expression: equal('team-size', integer(inputs.teamSize)),
|
|
66
|
+
scenarioInputIds: ['team-size']
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (inputs.deploymentFrequency !== undefined) {
|
|
70
|
+
constraints.push({
|
|
71
|
+
id: 'input/deployment-frequency',
|
|
72
|
+
expression: equal('deployment-frequency', integer(inputs.deploymentFrequency)),
|
|
73
|
+
scenarioInputIds: ['deployment-frequency']
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const monolithCost = add(integer(20), ref('team-size'), multiply(integer(3), ref('deployment-frequency')));
|
|
77
|
+
const microservicesCost = add(integer(45), multiply(integer(2), ref('team-size')), { kind: 'negate', value: multiply(integer(4), ref('deployment-frequency')) });
|
|
78
|
+
return {
|
|
79
|
+
schema: Model.schema,
|
|
80
|
+
enums: [{ id: 'architecture', values: ['monolith', 'microservices'] }],
|
|
81
|
+
variables: [
|
|
82
|
+
{ id: 'architecture', sort: 'enum', domain: 'architecture' },
|
|
83
|
+
{ id: 'deployment-frequency', sort: 'int', min: 1, max: 12, scenarioInputIds: ['deployment-frequency'] },
|
|
84
|
+
{ id: 'team-size', sort: 'int', min: 2, max: 20, scenarioInputIds: ['team-size'] }
|
|
85
|
+
],
|
|
86
|
+
constraints,
|
|
87
|
+
objectives: [{
|
|
88
|
+
id: 'operational-cost',
|
|
89
|
+
direction: 'minimize',
|
|
90
|
+
description: 'Illustrative relative operating cost, not epistemic confidence.',
|
|
91
|
+
expression: {
|
|
92
|
+
kind: 'if',
|
|
93
|
+
condition: equal('architecture', architecture('monolith')),
|
|
94
|
+
then: monolithCost,
|
|
95
|
+
else: microservicesCost
|
|
96
|
+
}
|
|
97
|
+
}]
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
const parseInteger = (name, value, min, max) => {
|
|
101
|
+
const parsed = Number(value);
|
|
102
|
+
if (!Number.isSafeInteger(parsed) || parsed < min || (max !== undefined && parsed > max)) {
|
|
103
|
+
throw new TypeError(`${name} must be an integer from ${min}${max === undefined ? '' : ` to ${max}`}`);
|
|
104
|
+
}
|
|
105
|
+
return parsed;
|
|
106
|
+
};
|
|
107
|
+
const parse = (argv) => {
|
|
108
|
+
if (argv.includes('--help') || argv.includes('-h'))
|
|
109
|
+
return { code: 0, out: usage, err: '' };
|
|
110
|
+
if (argv[0] !== 'architecture')
|
|
111
|
+
return fail(`unknown workflow model ${JSON.stringify(argv[0] ?? '')}`);
|
|
112
|
+
const operation = argv[1];
|
|
113
|
+
if (operation !== 'feasibility' && operation !== 'optimization' &&
|
|
114
|
+
operation !== 'counterexample' && operation !== 'sensitivity') {
|
|
115
|
+
return fail(`unknown workflow operation ${JSON.stringify(operation ?? '')}`);
|
|
116
|
+
}
|
|
117
|
+
const values = new Map();
|
|
118
|
+
for (let index = 2; index < argv.length; index += 2) {
|
|
119
|
+
const flag = argv[index];
|
|
120
|
+
const value = argv[index + 1];
|
|
121
|
+
if (flag === undefined || !['--team-size', '--deployment-frequency', '--from', '--to', '--timeout-ms'].includes(flag)) {
|
|
122
|
+
return fail(`unknown workflow option ${JSON.stringify(flag ?? '')}`);
|
|
123
|
+
}
|
|
124
|
+
if (value === undefined || value.startsWith('--'))
|
|
125
|
+
return fail(`${flag} needs a value`);
|
|
126
|
+
if (values.has(flag))
|
|
127
|
+
return fail(`${flag} was provided more than once`);
|
|
128
|
+
values.set(flag, value);
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const from = parseInteger('--from', values.get('--from') ?? '1', 1, 12);
|
|
132
|
+
const to = parseInteger('--to', values.get('--to') ?? '12', 1, 12);
|
|
133
|
+
if (from > to)
|
|
134
|
+
return fail('--from must be less than or equal to --to');
|
|
135
|
+
return {
|
|
136
|
+
operation,
|
|
137
|
+
teamSize: parseInteger('--team-size', values.get('--team-size') ?? '10', 2, 20),
|
|
138
|
+
deploymentFrequency: parseInteger('--deployment-frequency', values.get('--deployment-frequency') ?? '6', 1, 12),
|
|
139
|
+
from,
|
|
140
|
+
to,
|
|
141
|
+
timeoutMs: parseInteger('--timeout-ms', values.get('--timeout-ms') ?? '10000', 1)
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return fail(error instanceof Error ? error.message : String(error));
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/** Runs the allowlisted fixture. Supplying an adapter is intended for tests. */
|
|
149
|
+
export const runWorkflowFixture = async (argv, supplied) => {
|
|
150
|
+
const parsed = parse(argv);
|
|
151
|
+
if ('code' in parsed)
|
|
152
|
+
return parsed;
|
|
153
|
+
const runtime = supplied === undefined ? await create() : undefined;
|
|
154
|
+
const adapter = supplied ?? runtime;
|
|
155
|
+
const options = { limits: { timeoutMs: parsed.timeoutMs } };
|
|
156
|
+
const context = { snapshot: { transactionTime: null } };
|
|
157
|
+
try {
|
|
158
|
+
switch (parsed.operation) {
|
|
159
|
+
case 'feasibility':
|
|
160
|
+
return ok(await Workflow.feasibility(adapter, architectureModel({ teamSize: parsed.teamSize, deploymentFrequency: parsed.deploymentFrequency }), options, context));
|
|
161
|
+
case 'optimization':
|
|
162
|
+
return ok(await Workflow.optimization(adapter, architectureModel({ teamSize: parsed.teamSize, deploymentFrequency: parsed.deploymentFrequency }), options, context));
|
|
163
|
+
case 'counterexample':
|
|
164
|
+
return ok(await Workflow.counterexample(adapter, architectureModel(), 'small-team-monolith', options, context));
|
|
165
|
+
case 'sensitivity': {
|
|
166
|
+
const samples = Array.from({ length: parsed.to - parsed.from + 1 }, (_, index) => ({ sort: 'int', value: String(parsed.from + index) }));
|
|
167
|
+
return ok(await Workflow.sensitivity(adapter, architectureModel(), {
|
|
168
|
+
variableId: 'deployment-frequency',
|
|
169
|
+
samples,
|
|
170
|
+
fixed: [{ variableId: 'team-size', value: { sort: 'int', value: String(parsed.teamSize) } }],
|
|
171
|
+
observe: ['architecture'],
|
|
172
|
+
operation: 'optimization',
|
|
173
|
+
maxRuns: 12
|
|
174
|
+
}, options, context));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return { code: 1, out: '', err: `${error instanceof Error ? error.message : String(error)}\n` };
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
await runtime?.close();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=workflow-fixture.js.map
|