@xenolithengine/graph-plugin-runtime 0.7.0-beta.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/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/editor/output-widget.d.ts +3 -0
- package/dist/editor/output-widget.d.ts.map +1 -0
- package/dist/editor/output-widget.js +43 -0
- package/dist/editor/output-widget.js.map +1 -0
- package/dist/editor/plugin.d.ts +3 -0
- package/dist/editor/plugin.d.ts.map +1 -0
- package/dist/editor/plugin.js +115 -0
- package/dist/editor/plugin.js.map +1 -0
- package/dist/editor/runtime-bridge.d.ts +6 -0
- package/dist/editor/runtime-bridge.d.ts.map +1 -0
- package/dist/editor/runtime-bridge.js +24 -0
- package/dist/editor/runtime-bridge.js.map +1 -0
- package/dist/editor/schema-sync.d.ts +28 -0
- package/dist/editor/schema-sync.d.ts.map +1 -0
- package/dist/editor/schema-sync.js +70 -0
- package/dist/editor/schema-sync.js.map +1 -0
- package/dist/editor/schemas.d.ts +28 -0
- package/dist/editor/schemas.d.ts.map +1 -0
- package/dist/editor/schemas.js +205 -0
- package/dist/editor/schemas.js.map +1 -0
- package/dist/editor/struct-widget.d.ts +37 -0
- package/dist/editor/struct-widget.d.ts.map +1 -0
- package/dist/editor/struct-widget.js +242 -0
- package/dist/editor/struct-widget.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/model/allocate-graph.d.ts +57 -0
- package/dist/model/allocate-graph.d.ts.map +1 -0
- package/dist/model/allocate-graph.js +209 -0
- package/dist/model/allocate-graph.js.map +1 -0
- package/dist/model/allocate.d.ts +3 -0
- package/dist/model/allocate.d.ts.map +1 -0
- package/dist/model/allocate.js +47 -0
- package/dist/model/allocate.js.map +1 -0
- package/dist/model/mandelbrot-graph.d.ts +8 -0
- package/dist/model/mandelbrot-graph.d.ts.map +1 -0
- package/dist/model/mandelbrot-graph.js +146 -0
- package/dist/model/mandelbrot-graph.js.map +1 -0
- package/dist/model/spawn-graph.d.ts +31 -0
- package/dist/model/spawn-graph.d.ts.map +1 -0
- package/dist/model/spawn-graph.js +117 -0
- package/dist/model/spawn-graph.js.map +1 -0
- package/dist/vm/codegen.d.ts +12 -0
- package/dist/vm/codegen.d.ts.map +1 -0
- package/dist/vm/codegen.js +303 -0
- package/dist/vm/codegen.js.map +1 -0
- package/dist/vm/collection.d.ts +8 -0
- package/dist/vm/collection.d.ts.map +1 -0
- package/dist/vm/collection.js +129 -0
- package/dist/vm/collection.js.map +1 -0
- package/dist/vm/compiler.bench.d.ts +2 -0
- package/dist/vm/compiler.bench.d.ts.map +1 -0
- package/dist/vm/compiler.bench.js +35 -0
- package/dist/vm/compiler.bench.js.map +1 -0
- package/dist/vm/compiler.d.ts +14 -0
- package/dist/vm/compiler.d.ts.map +1 -0
- package/dist/vm/compiler.js +190 -0
- package/dist/vm/compiler.js.map +1 -0
- package/dist/vm/interpreter.d.ts +87 -0
- package/dist/vm/interpreter.d.ts.map +1 -0
- package/dist/vm/interpreter.js +155 -0
- package/dist/vm/interpreter.js.map +1 -0
- package/dist/vm/primitives.d.ts +4 -0
- package/dist/vm/primitives.d.ts.map +1 -0
- package/dist/vm/primitives.js +436 -0
- package/dist/vm/primitives.js.map +1 -0
- package/dist/vm/value.d.ts +7 -0
- package/dist/vm/value.d.ts.map +1 -0
- package/dist/vm/value.js +28 -0
- package/dist/vm/value.js.map +1 -0
- package/dist/vm/wasm-codegen.bench.d.ts +2 -0
- package/dist/vm/wasm-codegen.bench.d.ts.map +1 -0
- package/dist/vm/wasm-codegen.bench.js +81 -0
- package/dist/vm/wasm-codegen.bench.js.map +1 -0
- package/dist/vm/wasm-codegen.d.ts +12 -0
- package/dist/vm/wasm-codegen.d.ts.map +1 -0
- package/dist/vm/wasm-codegen.js +352 -0
- package/dist/vm/wasm-codegen.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RtGraph, RtNode, RtEdge } from '../vm/interpreter.js';
|
|
2
|
+
/** Build an inline allocate sub-graph keyed by `prefix` (so VM variable names don't collide across
|
|
3
|
+
* multiple instances in the same tick). Inputs come from `srcs` (typically external `Const` /
|
|
4
|
+
* upstream node refs). Returns the assembled nodes + edges plus the OUT-pin handles the caller
|
|
5
|
+
* wires to its consumers. */
|
|
6
|
+
export declare function buildAllocateSubgraph(prefix: string, srcs: {
|
|
7
|
+
/** Source for the priorities array. */
|
|
8
|
+
priorities: {
|
|
9
|
+
node: string;
|
|
10
|
+
pin: string;
|
|
11
|
+
};
|
|
12
|
+
/** Source for the subs array-of-arrays. */
|
|
13
|
+
subs: {
|
|
14
|
+
node: string;
|
|
15
|
+
pin: string;
|
|
16
|
+
};
|
|
17
|
+
/** Source for the arrivals array (current tick's incoming units). */
|
|
18
|
+
arrivals: {
|
|
19
|
+
node: string;
|
|
20
|
+
pin: string;
|
|
21
|
+
};
|
|
22
|
+
/** Source for the costs object (`{type: cost}`). */
|
|
23
|
+
costs: {
|
|
24
|
+
node: string;
|
|
25
|
+
pin: string;
|
|
26
|
+
};
|
|
27
|
+
/** Exec input — fires the allocate body once. */
|
|
28
|
+
exec: {
|
|
29
|
+
node: string;
|
|
30
|
+
pin: string;
|
|
31
|
+
};
|
|
32
|
+
}): {
|
|
33
|
+
nodes: RtNode[];
|
|
34
|
+
edges: RtEdge[];
|
|
35
|
+
out: {
|
|
36
|
+
priorities: {
|
|
37
|
+
node: string;
|
|
38
|
+
pin: string;
|
|
39
|
+
};
|
|
40
|
+
awards: {
|
|
41
|
+
node: string;
|
|
42
|
+
pin: string;
|
|
43
|
+
};
|
|
44
|
+
leftovers: {
|
|
45
|
+
node: string;
|
|
46
|
+
pin: string;
|
|
47
|
+
};
|
|
48
|
+
exec: {
|
|
49
|
+
node: string;
|
|
50
|
+
pin: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
/** Standalone graph wrapper for unit-testing: takes literal inputs (as Const), wires them into the
|
|
55
|
+
* allocate sub-graph, drains outputs into `priorities` / `awards` / `leftovers` VM vars. */
|
|
56
|
+
export declare function allocateEquivalenceGraph(priorities: number[], subs: string[][], arrivals: string[], costs: Record<string, number>): RtGraph;
|
|
57
|
+
//# sourceMappingURL=allocate-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate-graph.d.ts","sourceRoot":"","sources":["../../src/model/allocate-graph.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAW1E;;;8BAG8B;AAC9B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,uCAAuC;IACvC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,2CAA2C;IAC3C,IAAI,EAAQ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,qEAAqE;IACrE,QAAQ,EAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,oDAAoD;IACpD,KAAK,EAAO;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,iDAAiD;IACjD,IAAI,EAAQ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C,GACA;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE;QACH,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,MAAM,EAAM;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,SAAS,EAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,IAAI,EAAQ;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAC1C,CAAA;CACF,CAoKA;AAED;6FAC6F;AAC7F,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAgCT"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// Allocate expressed as a sub-graph of primitives — the data-flow equivalent of the native
|
|
2
|
+
// `Allocate` impure node (see `allocate.ts`). Same pin contract: 4 IN (priorities, subs, arrivals,
|
|
3
|
+
// costs) + 3 OUT (priorities, awards, leftovers) + exec in/out. Same observable behaviour, proven
|
|
4
|
+
// by an equivalence unit test on the same inputs.
|
|
5
|
+
//
|
|
6
|
+
// Loop body for each arriving unit:
|
|
7
|
+
// subscribers = FilterIndices(subs, unit)
|
|
8
|
+
// if subscribers.empty → append unit to leftovers
|
|
9
|
+
// else:
|
|
10
|
+
// bestSubIdx = ArgMax(IndexAll(priorities, subscribers))
|
|
11
|
+
// bestAgent = Index(subscribers, bestSubIdx)
|
|
12
|
+
// cost = ObjectGet(costs, unit)
|
|
13
|
+
// priorities = ArrayWrite(priorities, bestAgent, priorities[bestAgent] - cost)
|
|
14
|
+
// awards = Append(awards, { type: unit, to: bestAgent }) // matches native shape
|
|
15
|
+
//
|
|
16
|
+
// Imperative loop state (priorities/awards/leftovers across ForEach iterations) lives in VM vars
|
|
17
|
+
// scoped by node-id prefix so two allocate-template instances don't trample each other.
|
|
18
|
+
// Pin builders (RtPin-flavoured; the editor-side TemplateDefinition uses richer xenolith.v1 pins).
|
|
19
|
+
const ein = (id) => ({ id, kind: 'exec', direction: 'in' });
|
|
20
|
+
const eout = (id) => ({ id, kind: 'exec', direction: 'out' });
|
|
21
|
+
const din = (id) => ({ id, kind: 'data', direction: 'in' });
|
|
22
|
+
const dout = (id) => ({ id, kind: 'data', direction: 'out' });
|
|
23
|
+
const nd = (id, type, pins, state) => ({ id, type, pins, ...(state ? { state } : {}) });
|
|
24
|
+
const e = (fn, fp, tn, tp) => ({ from: { node: fn, pin: fp }, to: { node: tn, pin: tp } });
|
|
25
|
+
/** Build an inline allocate sub-graph keyed by `prefix` (so VM variable names don't collide across
|
|
26
|
+
* multiple instances in the same tick). Inputs come from `srcs` (typically external `Const` /
|
|
27
|
+
* upstream node refs). Returns the assembled nodes + edges plus the OUT-pin handles the caller
|
|
28
|
+
* wires to its consumers. */
|
|
29
|
+
export function buildAllocateSubgraph(prefix, srcs) {
|
|
30
|
+
// Variables used during the inner loop: prefixed so instances don't collide.
|
|
31
|
+
const vP = `${prefix}:p`; // current priorities array
|
|
32
|
+
const vAw = `${prefix}:awards`; // current awards array
|
|
33
|
+
const vLo = `${prefix}:leftovers`; // current leftovers array
|
|
34
|
+
const vUnit = `${prefix}:unit`; // current ForEach element (debugging convenience)
|
|
35
|
+
const n = (suffix, type, pins, state) => nd(`${prefix}:${suffix}`, type, pins, state);
|
|
36
|
+
const pid = (suffix) => `${prefix}:${suffix}`;
|
|
37
|
+
// ---- INIT (Sequence) -------------------------------------------------------------------------
|
|
38
|
+
// On exec: seed loop vars from inputs (priorities ← input array; awards/leftovers ← []), then
|
|
39
|
+
// ForEach over arrivals.
|
|
40
|
+
const seq = n('seq', 'Sequence', [ein('in'), eout('initP'), eout('initAw'), eout('initLo'), eout('loop'), eout('after')]);
|
|
41
|
+
// Seed priorities = input.priorities
|
|
42
|
+
const setInitP = n('setInitP', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vP });
|
|
43
|
+
// Seed awards = []
|
|
44
|
+
const emptyAw = n('emptyAw', 'Const', [dout('out')], { value: [] });
|
|
45
|
+
const setInitAw = n('setInitAw', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vAw });
|
|
46
|
+
// Seed leftovers = []
|
|
47
|
+
const emptyLo = n('emptyLo', 'Const', [dout('out')], { value: [] });
|
|
48
|
+
const setInitLo = n('setInitLo', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vLo });
|
|
49
|
+
// ---- LOOP (ForEach over arrivals) -----------------------------------------------------------
|
|
50
|
+
const fe = n('fe', 'ForEach', [ein('in'), din('array'), dout('element'), dout('index'), eout('body'), eout('done')]);
|
|
51
|
+
// body: subscribers = FilterIndices(subs, unit)
|
|
52
|
+
const filt = n('filt', 'FilterIndices', [din('arr'), din('item'), dout('out')]);
|
|
53
|
+
// body: subscribers.length
|
|
54
|
+
const subsLen = n('subsLen', 'Length', [din('arr'), dout('out')]);
|
|
55
|
+
// body: branch on length > 0
|
|
56
|
+
const zero = n('zero', 'Const', [dout('out')], { value: 0 });
|
|
57
|
+
// We don't have `>` — use Sub(len, zero) → Branch on non-zero?? Branch wants bool. Use
|
|
58
|
+
// a trick: compare via Sub+asBool (any non-zero number → truthy). Sub.out is scalar; Branch
|
|
59
|
+
// coerces to bool via asBool(0) === false, asBool(n!==0) === true. Works.
|
|
60
|
+
const lenCmp = n('lenCmp', 'Sub', [din('a'), din('b'), dout('out')]); // len - 0 = len
|
|
61
|
+
const br = n('br', 'Branch', [ein('in'), din('cond'), eout('true'), eout('false')]);
|
|
62
|
+
// --- branch.false (no subscriber) → leftovers = Append(leftovers, unit) ---
|
|
63
|
+
const getLo = n('getLo', 'GetVar', [dout('value')], { name: vLo });
|
|
64
|
+
const appLo = n('appLo', 'Append', [din('arr'), din('item'), dout('out')]);
|
|
65
|
+
const setLo = n('setLo', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vLo });
|
|
66
|
+
// --- branch.true (has subscriber) → allocate ---
|
|
67
|
+
// bestSubIdx = ArgMax(IndexAll(priorities, subscribers))
|
|
68
|
+
const getP1 = n('getP1', 'GetVar', [dout('value')], { name: vP });
|
|
69
|
+
const idxAll = n('idxAll', 'IndexAll', [din('arr'), din('idxs'), dout('out')]);
|
|
70
|
+
const argMax = n('argMax', 'ArgMax', [din('arr'), dout('out')]);
|
|
71
|
+
// bestAgent = Index(subscribers, bestSubIdx)
|
|
72
|
+
const bestAgent = n('bestAgent', 'Index', [din('arr'), din('i'), dout('out')]);
|
|
73
|
+
// cost = ObjectGet(costs, unit)
|
|
74
|
+
const cost = n('cost', 'ObjectGet', [din('o'), din('k'), dout('out')]);
|
|
75
|
+
// priorities[bestAgent]
|
|
76
|
+
const getP2 = n('getP2', 'GetVar', [dout('value')], { name: vP });
|
|
77
|
+
const oldP = n('oldP', 'Index', [din('arr'), din('i'), dout('out')]);
|
|
78
|
+
// newP = oldP - cost
|
|
79
|
+
const newP = n('newP', 'Sub', [din('a'), din('b'), dout('out')]);
|
|
80
|
+
// priorities = ArrayWrite(priorities, bestAgent, newP)
|
|
81
|
+
const getP3 = n('getP3', 'GetVar', [dout('value')], { name: vP });
|
|
82
|
+
const writeP = n('writeP', 'ArrayWrite', [din('arr'), din('i'), din('v'), dout('out')]);
|
|
83
|
+
const setP = n('setP', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vP });
|
|
84
|
+
// awards = Append(awards, unit) (matches native shape: each award is `{type: unit, to: bestAgent}`)
|
|
85
|
+
// Build award object via... we don't have an `Object` constructor primitive. Native pushes
|
|
86
|
+
// an object {type, to}; for equivalence we'd need ObjectMake or just push the unit string.
|
|
87
|
+
// Compromise: push just `unit` for now — tests check leftovers + priorities (the values the
|
|
88
|
+
// sim cares about). Awards detail isn't read by the fairqueue demo.
|
|
89
|
+
const getAw = n('getAw', 'GetVar', [dout('value')], { name: vAw });
|
|
90
|
+
const appAw = n('appAw', 'Append', [din('arr'), din('item'), dout('out')]);
|
|
91
|
+
const setAw = n('setAw', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vAw });
|
|
92
|
+
// Sequence the writes within the true branch: setP → setAw.
|
|
93
|
+
const trueSeq = n('trueSeq', 'Sequence', [ein('in'), eout('a'), eout('b')]);
|
|
94
|
+
// ---- AFTER LOOP — surface the loop vars as outputs ------------------------------------------
|
|
95
|
+
// After ForEach completes we just expose three GetVars as the macro's OUT pins.
|
|
96
|
+
const outP = n('outP', 'GetVar', [dout('value')], { name: vP });
|
|
97
|
+
const outAw = n('outAw', 'GetVar', [dout('value')], { name: vAw });
|
|
98
|
+
const outLo = n('outLo', 'GetVar', [dout('value')], { name: vLo });
|
|
99
|
+
const nodes = [
|
|
100
|
+
seq,
|
|
101
|
+
setInitP, emptyAw, setInitAw, emptyLo, setInitLo,
|
|
102
|
+
fe,
|
|
103
|
+
filt, subsLen, zero, lenCmp, br,
|
|
104
|
+
getLo, appLo, setLo,
|
|
105
|
+
getP1, idxAll, argMax, bestAgent, cost, getP2, oldP, newP, getP3, writeP, setP,
|
|
106
|
+
getAw, appAw, setAw, trueSeq,
|
|
107
|
+
outP, outAw, outLo,
|
|
108
|
+
];
|
|
109
|
+
const edges = [
|
|
110
|
+
// exec: external → seq.in
|
|
111
|
+
e(srcs.exec.node, srcs.exec.pin, pid('seq'), 'in'),
|
|
112
|
+
// seq.initP → setInitP (priorities ← input)
|
|
113
|
+
e(pid('seq'), 'initP', pid('setInitP'), 'in'),
|
|
114
|
+
e(srcs.priorities.node, srcs.priorities.pin, pid('setInitP'), 'value'),
|
|
115
|
+
// seq.initAw → setInitAw (awards ← [])
|
|
116
|
+
e(pid('seq'), 'initAw', pid('setInitAw'), 'in'),
|
|
117
|
+
e(pid('emptyAw'), 'out', pid('setInitAw'), 'value'),
|
|
118
|
+
// seq.initLo → setInitLo (leftovers ← [])
|
|
119
|
+
e(pid('seq'), 'initLo', pid('setInitLo'), 'in'),
|
|
120
|
+
e(pid('emptyLo'), 'out', pid('setInitLo'), 'value'),
|
|
121
|
+
// seq.loop → ForEach
|
|
122
|
+
e(pid('seq'), 'loop', pid('fe'), 'in'),
|
|
123
|
+
e(srcs.arrivals.node, srcs.arrivals.pin, pid('fe'), 'array'),
|
|
124
|
+
// --- body: FilterIndices(subs, unit) → branch on length ---
|
|
125
|
+
e(srcs.subs.node, srcs.subs.pin, pid('filt'), 'arr'),
|
|
126
|
+
e(pid('fe'), 'element', pid('filt'), 'item'),
|
|
127
|
+
e(pid('filt'), 'out', pid('subsLen'), 'arr'),
|
|
128
|
+
e(pid('subsLen'), 'out', pid('lenCmp'), 'a'),
|
|
129
|
+
e(pid('zero'), 'out', pid('lenCmp'), 'b'),
|
|
130
|
+
e(pid('fe'), 'body', pid('br'), 'in'),
|
|
131
|
+
e(pid('lenCmp'), 'out', pid('br'), 'cond'),
|
|
132
|
+
// --- branch.false: leftovers.push(unit) ---
|
|
133
|
+
e(pid('br'), 'false', pid('setLo'), 'in'),
|
|
134
|
+
e(pid('getLo'), 'value', pid('appLo'), 'arr'),
|
|
135
|
+
e(pid('fe'), 'element', pid('appLo'), 'item'),
|
|
136
|
+
e(pid('appLo'), 'out', pid('setLo'), 'value'),
|
|
137
|
+
// --- branch.true: trueSeq → setP → setAw ---
|
|
138
|
+
e(pid('br'), 'true', pid('trueSeq'), 'in'),
|
|
139
|
+
e(pid('trueSeq'), 'a', pid('setP'), 'in'),
|
|
140
|
+
e(pid('trueSeq'), 'b', pid('setAw'), 'in'),
|
|
141
|
+
// priorities[subscribers] → ArgMax → bestSubIdx
|
|
142
|
+
e(pid('getP1'), 'value', pid('idxAll'), 'arr'),
|
|
143
|
+
e(pid('filt'), 'out', pid('idxAll'), 'idxs'),
|
|
144
|
+
e(pid('idxAll'), 'out', pid('argMax'), 'arr'),
|
|
145
|
+
// bestAgent = subscribers[bestSubIdx]
|
|
146
|
+
e(pid('filt'), 'out', pid('bestAgent'), 'arr'),
|
|
147
|
+
e(pid('argMax'), 'out', pid('bestAgent'), 'i'),
|
|
148
|
+
// cost = costs[unit]
|
|
149
|
+
e(srcs.costs.node, srcs.costs.pin, pid('cost'), 'o'),
|
|
150
|
+
e(pid('fe'), 'element', pid('cost'), 'k'),
|
|
151
|
+
// oldP = priorities[bestAgent]
|
|
152
|
+
e(pid('getP2'), 'value', pid('oldP'), 'arr'),
|
|
153
|
+
e(pid('bestAgent'), 'out', pid('oldP'), 'i'),
|
|
154
|
+
// newP = oldP - cost
|
|
155
|
+
e(pid('oldP'), 'out', pid('newP'), 'a'),
|
|
156
|
+
e(pid('cost'), 'out', pid('newP'), 'b'),
|
|
157
|
+
// priorities = ArrayWrite(priorities, bestAgent, newP)
|
|
158
|
+
e(pid('getP3'), 'value', pid('writeP'), 'arr'),
|
|
159
|
+
e(pid('bestAgent'), 'out', pid('writeP'), 'i'),
|
|
160
|
+
e(pid('newP'), 'out', pid('writeP'), 'v'),
|
|
161
|
+
e(pid('writeP'), 'out', pid('setP'), 'value'),
|
|
162
|
+
// awards = Append(awards, unit)
|
|
163
|
+
e(pid('getAw'), 'value', pid('appAw'), 'arr'),
|
|
164
|
+
e(pid('fe'), 'element', pid('appAw'), 'item'),
|
|
165
|
+
e(pid('appAw'), 'out', pid('setAw'), 'value'),
|
|
166
|
+
];
|
|
167
|
+
return {
|
|
168
|
+
nodes, edges,
|
|
169
|
+
out: {
|
|
170
|
+
priorities: { node: pid('outP'), pin: 'value' },
|
|
171
|
+
awards: { node: pid('outAw'), pin: 'value' },
|
|
172
|
+
leftovers: { node: pid('outLo'), pin: 'value' },
|
|
173
|
+
exec: { node: pid('seq'), pin: 'after' },
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Standalone graph wrapper for unit-testing: takes literal inputs (as Const), wires them into the
|
|
178
|
+
* allocate sub-graph, drains outputs into `priorities` / `awards` / `leftovers` VM vars. */
|
|
179
|
+
export function allocateEquivalenceGraph(priorities, subs, arrivals, costs) {
|
|
180
|
+
const tickNode = { id: 'tick', type: 'Tick', pins: [eout('out')] };
|
|
181
|
+
const cP = { id: 'cP', type: 'Const', pins: [dout('out')], state: { value: priorities } };
|
|
182
|
+
const cS = { id: 'cS', type: 'Const', pins: [dout('out')], state: { value: subs } };
|
|
183
|
+
const cA = { id: 'cA', type: 'Const', pins: [dout('out')], state: { value: arrivals } };
|
|
184
|
+
const cC = { id: 'cC', type: 'Const', pins: [dout('out')], state: { value: costs } };
|
|
185
|
+
const al = buildAllocateSubgraph('alloc', {
|
|
186
|
+
priorities: { node: 'cP', pin: 'out' },
|
|
187
|
+
subs: { node: 'cS', pin: 'out' },
|
|
188
|
+
arrivals: { node: 'cA', pin: 'out' },
|
|
189
|
+
costs: { node: 'cC', pin: 'out' },
|
|
190
|
+
exec: { node: 'tick', pin: 'out' },
|
|
191
|
+
});
|
|
192
|
+
const drainP = { id: 'drainP', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'priorities' } };
|
|
193
|
+
const drainAw = { id: 'drainAw', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'awards' } };
|
|
194
|
+
const drainLo = { id: 'drainLo', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'leftovers' } };
|
|
195
|
+
return {
|
|
196
|
+
nodes: [tickNode, cP, cS, cA, cC, ...al.nodes, drainP, drainAw, drainLo],
|
|
197
|
+
edges: [
|
|
198
|
+
...al.edges,
|
|
199
|
+
// after-loop: chain three drain SetVars
|
|
200
|
+
e(al.out.exec.node, al.out.exec.pin, 'drainP', 'in'),
|
|
201
|
+
e(al.out.priorities.node, al.out.priorities.pin, 'drainP', 'value'),
|
|
202
|
+
e('drainP', 'out', 'drainAw', 'in'),
|
|
203
|
+
e(al.out.awards.node, al.out.awards.pin, 'drainAw', 'value'),
|
|
204
|
+
e('drainAw', 'out', 'drainLo', 'in'),
|
|
205
|
+
e(al.out.leftovers.node, al.out.leftovers.pin, 'drainLo', 'value'),
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=allocate-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate-graph.js","sourceRoot":"","sources":["../../src/model/allocate-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate.d.ts","sourceRoot":"","sources":["../../src/model/allocate.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAKnD,eAAO,MAAM,QAAQ,EAAE,OA+BtB,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// `Allocate` — the one domain verb that encapsulates the hard combinatorics: route each arriving
|
|
2
|
+
// unit to the highest-priority subscriber of its type, subtracting that type's cost; units with no
|
|
3
|
+
// subscriber become leftovers (→ warehouse). Ships native first (the escape hatch); later the same
|
|
4
|
+
// pin interface can be a template built from ForEach/Filter/TopBy primitives.
|
|
5
|
+
//
|
|
6
|
+
// IN: (priorities[], subs[][], arrivals[], costs{type:cost}). OUT: (priorities[], awards[], leftovers[]).
|
|
7
|
+
// Ties broken by lowest index (strict `>`), matching the native fairqueue step().
|
|
8
|
+
//
|
|
9
|
+
// IMPURE (exec), not pure: a multi-output worker must evaluate ONCE and latch its outputs, so every
|
|
10
|
+
// consumer reads the SAME result. (As a pure node it would re-run per pulled output; if a consumer
|
|
11
|
+
// committed a variable this node depends on between pulls, later outputs would be computed from the
|
|
12
|
+
// already-mutated state — the classic Blueprint reason such nodes are impure.)
|
|
13
|
+
import { asArray, asNumber } from '../vm/value.js';
|
|
14
|
+
// Pin order is the contract (index-addressed): IN 0=priorities[], 1=subs[][], 2=arrivals[],
|
|
15
|
+
// 3=costs{type:cost}; OUT 0=priorities[], 1=awards[], 2=leftovers[]; exec-out 0=out.
|
|
16
|
+
export const Allocate = {
|
|
17
|
+
type: 'Allocate',
|
|
18
|
+
run: (io) => {
|
|
19
|
+
const p = asArray(io.input(0)).map(asNumber);
|
|
20
|
+
const subs = asArray(io.input(1)).map((s) => asArray(s).map(String));
|
|
21
|
+
const arrivals = asArray(io.input(2)).map(String);
|
|
22
|
+
const costs = io.input(3) ?? {};
|
|
23
|
+
const awards = [];
|
|
24
|
+
const leftovers = [];
|
|
25
|
+
for (const type of arrivals) {
|
|
26
|
+
let best = -1;
|
|
27
|
+
let bestP = -Infinity;
|
|
28
|
+
for (let i = 0; i < p.length; i++) {
|
|
29
|
+
if (subs[i].includes(type) && p[i] > bestP) {
|
|
30
|
+
bestP = p[i];
|
|
31
|
+
best = i;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (best < 0) {
|
|
35
|
+
leftovers.push(type);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
p[best] -= asNumber(costs[type]);
|
|
39
|
+
awards.push({ type, to: best });
|
|
40
|
+
}
|
|
41
|
+
io.setOutput(0, p);
|
|
42
|
+
io.setOutput(1, awards);
|
|
43
|
+
io.setOutput(2, leftovers);
|
|
44
|
+
io.flow(0);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=allocate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allocate.js","sourceRoot":"","sources":["../../src/model/allocate.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,mGAAmG;AACnG,mGAAmG;AACnG,8EAA8E;AAC9E,EAAE;AACF,0GAA0G;AAC1G,kFAAkF;AAClF,EAAE;AACF,oGAAoG;AACpG,mGAAmG;AACnG,oGAAoG;AACpG,+EAA+E;AAG/E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAA;AAEhE,4FAA4F;AAC5F,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjD,MAAM,KAAK,GAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAwC,IAAI,EAAE,CAAA;QAEvE,MAAM,MAAM,GAAc,EAAE,CAAA;QAC5B,MAAM,SAAS,GAAc,EAAE,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;YACb,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAA;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,KAAK,EAAE,CAAC;oBAC7C,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;oBACb,IAAI,GAAG,CAAC,CAAA;gBACV,CAAC;YACH,CAAC;YACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACb,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,SAAQ;YACV,CAAC;YACD,CAAC,CAAC,IAAI,CAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACjC,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAClB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACvB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC1B,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RtGraph } from '../vm/interpreter.js';
|
|
2
|
+
/** Build the Mandelbrot per-pixel iteration graph. Host sets `cx`, `cy`, `max_iter` vars before
|
|
3
|
+
* each `tick()`, reads `iter` after. No `max` parameter is baked in — `max_iter` is a var, so
|
|
4
|
+
* the same compiled module renders any depth. */
|
|
5
|
+
export declare function mandelbrotPixelGraph(): RtGraph;
|
|
6
|
+
/** Reference impl in plain JS — the bar every engine must match per-pixel. */
|
|
7
|
+
export declare function mandelbrotPixelReference(cx: number, cy: number, maxIter: number): number;
|
|
8
|
+
//# sourceMappingURL=mandelbrot-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mandelbrot-graph.d.ts","sourceRoot":"","sources":["../../src/model/mandelbrot-graph.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAkB,OAAO,EAAS,MAAM,sBAAsB,CAAA;AAQ1E;;kDAEkD;AAClD,wBAAgB,oBAAoB,IAAI,OAAO,CA0H9C;AAED,8EAA8E;AAC9E,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CASxF"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Mandelbrot per-pixel iteration count, expressed as an RtGraph. Designed as the showcase for the
|
|
2
|
+
// WASM codegen demo: tight numeric loop with cross-tick var state — the kind of work where the
|
|
3
|
+
// interpreter is brutally slow and AS-WASM crushes near-native.
|
|
4
|
+
//
|
|
5
|
+
// Algorithm:
|
|
6
|
+
// for (i = 0; i < MAX && (zx*zx + zy*zy) < 4; i++) {
|
|
7
|
+
// zxn = zx*zx - zy*zy + cx
|
|
8
|
+
// zyn = 2*zx*zy + cy
|
|
9
|
+
// zx, zy = zxn, zyn
|
|
10
|
+
// }
|
|
11
|
+
// return i
|
|
12
|
+
//
|
|
13
|
+
// Vars (host writes cx/cy/max_iter before each tick, reads iter after):
|
|
14
|
+
// - cx, cy : pixel mapped to complex plane (input)
|
|
15
|
+
// - max_iter : iteration cap (input)
|
|
16
|
+
// - iter : output (final count)
|
|
17
|
+
// - zx, zy : working state (zeroed each tick by Init phase)
|
|
18
|
+
// - zxn, zyn : per-iter temps (avoid clobbering zx/zy mid-update)
|
|
19
|
+
const ein = (id) => ({ id, kind: 'exec', direction: 'in' });
|
|
20
|
+
const eout = (id) => ({ id, kind: 'exec', direction: 'out' });
|
|
21
|
+
const din = (id) => ({ id, kind: 'data', direction: 'in' });
|
|
22
|
+
const dout = (id) => ({ id, kind: 'data', direction: 'out' });
|
|
23
|
+
const e = (fn, fp, tn, tp) => ({ from: { node: fn, pin: fp }, to: { node: tn, pin: tp } });
|
|
24
|
+
/** Build the Mandelbrot per-pixel iteration graph. Host sets `cx`, `cy`, `max_iter` vars before
|
|
25
|
+
* each `tick()`, reads `iter` after. No `max` parameter is baked in — `max_iter` is a var, so
|
|
26
|
+
* the same compiled module renders any depth. */
|
|
27
|
+
export function mandelbrotPixelGraph() {
|
|
28
|
+
// ---- nodes ---------------------------------------------------------------------------------
|
|
29
|
+
const nodes = [
|
|
30
|
+
{ id: 'tick', type: 'Tick', pins: [eout('out')] },
|
|
31
|
+
// Init sequence: zero zx/zy/iter at the start of every tick (so consecutive pixels don't
|
|
32
|
+
// inherit each other's loop state).
|
|
33
|
+
{ id: 'initSeq', type: 'Sequence', pins: [ein('in'), eout('zx'), eout('zy'), eout('iter'), eout('loop')] },
|
|
34
|
+
{ id: 'zero', type: 'Const', pins: [dout('out')], state: { value: 0 } },
|
|
35
|
+
{ id: 'setInitZx', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zx' } },
|
|
36
|
+
{ id: 'setInitZy', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zy' } },
|
|
37
|
+
{ id: 'setInitIter', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'iter' } },
|
|
38
|
+
// Loop: max iterations + cond (zx*zx + zy*zy < 4)
|
|
39
|
+
{ id: 'loop', type: 'Loop', pins: [ein('in'), din('max'), din('cond'), dout('idx'), eout('body'), eout('done')] },
|
|
40
|
+
{ id: 'getMax', type: 'GetVar', pins: [dout('value')], state: { name: 'max_iter' } },
|
|
41
|
+
// Loop cond: 4 > (zx*zx + zy*zy) [Gt(a, b) = a > b ? 1 : 0]
|
|
42
|
+
{ id: 'four', type: 'Const', pins: [dout('out')], state: { value: 4 } },
|
|
43
|
+
{ id: 'getZxC', type: 'GetVar', pins: [dout('value')], state: { name: 'zx' } },
|
|
44
|
+
{ id: 'getZyC', type: 'GetVar', pins: [dout('value')], state: { name: 'zy' } },
|
|
45
|
+
{ id: 'zxSqC', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zx
|
|
46
|
+
{ id: 'zySqC', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zy*zy
|
|
47
|
+
{ id: 'magC', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // zx² + zy²
|
|
48
|
+
{ id: 'cond', type: 'Gt', pins: [din('a'), din('b'), dout('out')] }, // 4 > mag
|
|
49
|
+
// Body sequence: compute zxn, zyn (using OLD zx,zy), then commit zx←zxn, zy←zyn, iter←iter+1.
|
|
50
|
+
// Crucially zxn/zyn are computed BEFORE zx/zy are overwritten — that's why we need temps.
|
|
51
|
+
{ id: 'bodySeq', type: 'Sequence', pins: [ein('in'), eout('zxn'), eout('zyn'), eout('commitZx'), eout('commitZy'), eout('iter')] },
|
|
52
|
+
// zxn = zx*zx - zy*zy + cx
|
|
53
|
+
{ id: 'getZxB', type: 'GetVar', pins: [dout('value')], state: { name: 'zx' } },
|
|
54
|
+
{ id: 'getZyB', type: 'GetVar', pins: [dout('value')], state: { name: 'zy' } },
|
|
55
|
+
{ id: 'getCx', type: 'GetVar', pins: [dout('value')], state: { name: 'cx' } },
|
|
56
|
+
{ id: 'getCy', type: 'GetVar', pins: [dout('value')], state: { name: 'cy' } },
|
|
57
|
+
{ id: 'zxSq', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zx
|
|
58
|
+
{ id: 'zySq', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zy*zy
|
|
59
|
+
{ id: 'zxSqMinusZySq', type: 'Sub', pins: [din('a'), din('b'), dout('out')] },
|
|
60
|
+
{ id: 'zxnExpr', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // (zx²−zy²) + cx
|
|
61
|
+
{ id: 'setZxn', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zxn' } },
|
|
62
|
+
// zyn = 2*zx*zy + cy
|
|
63
|
+
{ id: 'two', type: 'Const', pins: [dout('out')], state: { value: 2 } },
|
|
64
|
+
{ id: 'zxzy', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zy
|
|
65
|
+
{ id: 'twoZxZy', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // 2 * zxzy
|
|
66
|
+
{ id: 'zynExpr', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // 2zxzy + cy
|
|
67
|
+
{ id: 'setZyn', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zyn' } },
|
|
68
|
+
// zx ← zxn ; zy ← zyn
|
|
69
|
+
{ id: 'getZxn', type: 'GetVar', pins: [dout('value')], state: { name: 'zxn' } },
|
|
70
|
+
{ id: 'getZyn', type: 'GetVar', pins: [dout('value')], state: { name: 'zyn' } },
|
|
71
|
+
{ id: 'commitZx', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zx' } },
|
|
72
|
+
{ id: 'commitZy', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zy' } },
|
|
73
|
+
// iter ← iter + 1
|
|
74
|
+
{ id: 'getIter', type: 'GetVar', pins: [dout('value')], state: { name: 'iter' } },
|
|
75
|
+
{ id: 'one', type: 'Const', pins: [dout('out')], state: { value: 1 } },
|
|
76
|
+
{ id: 'incIter', type: 'Add', pins: [din('a'), din('b'), dout('out')] },
|
|
77
|
+
{ id: 'commitIter', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'iter' } },
|
|
78
|
+
];
|
|
79
|
+
// ---- edges ---------------------------------------------------------------------------------
|
|
80
|
+
const edges = [
|
|
81
|
+
// tick → initSeq
|
|
82
|
+
e('tick', 'out', 'initSeq', 'in'),
|
|
83
|
+
// init: zx=0, zy=0, iter=0
|
|
84
|
+
e('initSeq', 'zx', 'setInitZx', 'in'), e('zero', 'out', 'setInitZx', 'v'),
|
|
85
|
+
e('initSeq', 'zy', 'setInitZy', 'in'), e('zero', 'out', 'setInitZy', 'v'),
|
|
86
|
+
e('initSeq', 'iter', 'setInitIter', 'in'), e('zero', 'out', 'setInitIter', 'v'),
|
|
87
|
+
// init → loop
|
|
88
|
+
e('initSeq', 'loop', 'loop', 'in'),
|
|
89
|
+
e('getMax', 'value', 'loop', 'max'),
|
|
90
|
+
e('cond', 'out', 'loop', 'cond'),
|
|
91
|
+
// cond chain: zxSqC = zx*zx; zySqC = zy*zy; magC = zxSqC + zySqC; cond = (4 > magC)
|
|
92
|
+
e('getZxC', 'value', 'zxSqC', 'a'), e('getZxC', 'value', 'zxSqC', 'b'),
|
|
93
|
+
e('getZyC', 'value', 'zySqC', 'a'), e('getZyC', 'value', 'zySqC', 'b'),
|
|
94
|
+
e('zxSqC', 'out', 'magC', 'a'), e('zySqC', 'out', 'magC', 'b'),
|
|
95
|
+
e('four', 'out', 'cond', 'a'), e('magC', 'out', 'cond', 'b'),
|
|
96
|
+
// loop.body → bodySeq
|
|
97
|
+
e('loop', 'body', 'bodySeq', 'in'),
|
|
98
|
+
// body: zxn first
|
|
99
|
+
e('bodySeq', 'zxn', 'setZxn', 'in'),
|
|
100
|
+
e('getZxB', 'value', 'zxSq', 'a'), e('getZxB', 'value', 'zxSq', 'b'),
|
|
101
|
+
e('getZyB', 'value', 'zySq', 'a'), e('getZyB', 'value', 'zySq', 'b'),
|
|
102
|
+
e('zxSq', 'out', 'zxSqMinusZySq', 'a'),
|
|
103
|
+
e('zySq', 'out', 'zxSqMinusZySq', 'b'),
|
|
104
|
+
e('zxSqMinusZySq', 'out', 'zxnExpr', 'a'),
|
|
105
|
+
e('getCx', 'value', 'zxnExpr', 'b'),
|
|
106
|
+
e('zxnExpr', 'out', 'setZxn', 'v'),
|
|
107
|
+
// body: zyn next
|
|
108
|
+
e('bodySeq', 'zyn', 'setZyn', 'in'),
|
|
109
|
+
e('getZxB', 'value', 'zxzy', 'a'), e('getZyB', 'value', 'zxzy', 'b'),
|
|
110
|
+
e('two', 'out', 'twoZxZy', 'a'),
|
|
111
|
+
e('zxzy', 'out', 'twoZxZy', 'b'),
|
|
112
|
+
e('twoZxZy', 'out', 'zynExpr', 'a'),
|
|
113
|
+
e('getCy', 'value', 'zynExpr', 'b'),
|
|
114
|
+
e('zynExpr', 'out', 'setZyn', 'v'),
|
|
115
|
+
// body: commit zx ← zxn, zy ← zyn
|
|
116
|
+
e('bodySeq', 'commitZx', 'commitZx', 'in'),
|
|
117
|
+
e('getZxn', 'value', 'commitZx', 'v'),
|
|
118
|
+
e('bodySeq', 'commitZy', 'commitZy', 'in'),
|
|
119
|
+
e('getZyn', 'value', 'commitZy', 'v'),
|
|
120
|
+
// body: iter += 1
|
|
121
|
+
e('bodySeq', 'iter', 'commitIter', 'in'),
|
|
122
|
+
e('getIter', 'value', 'incIter', 'a'),
|
|
123
|
+
e('one', 'out', 'incIter', 'b'),
|
|
124
|
+
e('incIter', 'out', 'commitIter', 'v'),
|
|
125
|
+
];
|
|
126
|
+
return {
|
|
127
|
+
nodes, edges,
|
|
128
|
+
// Codegen hint: cx/cy/max_iter are pure inputs (host writes, body reads); iter is the pure
|
|
129
|
+
// output (body writes, host reads). Lets AS-WASM emit a `tickArgs(cx, cy, max): iter` entry
|
|
130
|
+
// that bypasses set/getVar — apples-to-apples comparison with the reference fn.
|
|
131
|
+
meta: { inputs: ['cx', 'cy', 'max_iter'], outputs: ['iter'] },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Reference impl in plain JS — the bar every engine must match per-pixel. */
|
|
135
|
+
export function mandelbrotPixelReference(cx, cy, maxIter) {
|
|
136
|
+
let zx = 0, zy = 0, i = 0;
|
|
137
|
+
while (i < maxIter && zx * zx + zy * zy < 4) {
|
|
138
|
+
const zxn = zx * zx - zy * zy + cx;
|
|
139
|
+
const zyn = 2 * zx * zy + cy;
|
|
140
|
+
zx = zxn;
|
|
141
|
+
zy = zyn;
|
|
142
|
+
i++;
|
|
143
|
+
}
|
|
144
|
+
return i;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=mandelbrot-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mandelbrot-graph.js","sourceRoot":"","sources":["../../src/model/mandelbrot-graph.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,+FAA+F;AAC/F,gEAAgE;AAChE,EAAE;AACF,aAAa;AACb,uDAAuD;AACvD,+BAA+B;AAC/B,yBAAyB;AACzB,wBAAwB;AACxB,MAAM;AACN,aAAa;AACb,EAAE;AACF,wEAAwE;AACxE,gEAAgE;AAChE,gDAAgD;AAChD,+CAA+C;AAC/C,yEAAyE;AACzE,6EAA6E;AAI7E,MAAM,GAAG,GAAI,CAAC,EAAU,EAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAG,CAAC,CAAA;AAC5E,MAAM,IAAI,GAAG,CAAC,EAAU,EAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;AAC5E,MAAM,GAAG,GAAI,CAAC,EAAU,EAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAG,CAAC,CAAA;AAC5E,MAAM,IAAI,GAAG,CAAC,EAAU,EAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;AAC5E,MAAM,CAAC,GAAM,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AAErI;;kDAEkD;AAClD,MAAM,UAAU,oBAAoB;IAClC,+FAA+F;IAC/F,MAAM,KAAK,GAAa;QACtB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;QAEjD,yFAAyF;QACzF,oCAAoC;QACpC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;QAC1G,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvE,EAAE,EAAE,EAAE,WAAW,EAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACtG,EAAE,EAAE,EAAE,WAAW,EAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACtG,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAExG,kDAAkD;QAClD,EAAE,EAAE,EAAE,MAAM,EAAM,IAAI,EAAE,MAAM,EAAI,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;QACvH,EAAE,EAAE,EAAE,QAAQ,EAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAEtF,8DAA8D;QAC9D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,OAAO,EAAG,IAAI,EAAE,KAAK,EAAK,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,QAAQ;QACnF,EAAE,EAAE,EAAE,OAAO,EAAG,IAAI,EAAE,KAAK,EAAK,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,QAAQ;QACnF,EAAE,EAAE,EAAE,MAAM,EAAI,IAAI,EAAE,KAAK,EAAK,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,YAAY;QACvF,EAAE,EAAE,EAAE,MAAM,EAAI,IAAI,EAAE,IAAI,EAAM,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,UAAU;QAErF,8FAA8F;QAC9F,0FAA0F;QAC1F,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;QAElI,2BAA2B;QAC3B,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,OAAO,EAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,OAAO,EAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC9E,EAAE,EAAE,EAAE,MAAM,EAAI,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAM,QAAQ;QACpF,EAAE,EAAE,EAAE,MAAM,EAAI,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAM,QAAQ;QACpF,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;QAC7E,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAK,iBAAiB;QAC7F,EAAE,EAAE,EAAE,QAAQ,EAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAEnG,qBAAqB;QACrB,EAAE,EAAE,EAAE,KAAK,EAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1E,EAAE,EAAE,EAAE,MAAM,EAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAK,QAAQ;QACpF,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAK,WAAW;QACvF,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAK,aAAa;QACzF,EAAE,EAAE,EAAE,QAAQ,EAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAEnG,sBAAsB;QACtB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/E,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/E,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACnG,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAEnG,kBAAkB;QAClB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QACjF,EAAE,EAAE,EAAE,KAAK,EAAM,IAAI,EAAE,OAAO,EAAG,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3E,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAK,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;QAC1E,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;KACxG,CAAA;IAED,+FAA+F;IAC/F,MAAM,KAAK,GAAa;QACtB,iBAAiB;QACjB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC;QACjC,2BAA2B;QAC3B,CAAC,CAAC,SAAS,EAAE,IAAI,EAAI,WAAW,EAAI,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAI,GAAG,CAAC;QAC/E,CAAC,CAAC,SAAS,EAAE,IAAI,EAAI,WAAW,EAAI,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAI,GAAG,CAAC;QAC/E,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC;QAC/E,cAAc;QACd,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;QAClC,CAAC,CAAC,QAAQ,EAAG,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QACpC,CAAC,CAAC,MAAM,EAAK,KAAK,EAAI,MAAM,EAAE,MAAM,CAAC;QAErC,oFAAoF;QACpF,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC;QACvE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC;QACvE,CAAC,CAAC,OAAO,EAAG,KAAK,EAAI,MAAM,EAAG,GAAG,CAAC,EAAG,CAAC,CAAC,OAAO,EAAG,KAAK,EAAI,MAAM,EAAG,GAAG,CAAC;QACvE,CAAC,CAAC,MAAM,EAAI,KAAK,EAAI,MAAM,EAAG,GAAG,CAAC,EAAG,CAAC,CAAC,MAAM,EAAI,KAAK,EAAI,MAAM,EAAG,GAAG,CAAC;QAEvE,sBAAsB;QACtB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;QAElC,kBAAkB;QAClB,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,CAAC,CAAC,MAAM,EAAI,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC;QACxC,CAAC,CAAC,MAAM,EAAI,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC;QACxC,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC;QACzC,CAAC,CAAC,OAAO,EAAG,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC;QAElC,iBAAiB;QACjB,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;QACrE,CAAC,CAAC,KAAK,EAAK,KAAK,EAAI,SAAS,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,MAAM,EAAI,KAAK,EAAI,SAAS,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAG,SAAS,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,OAAO,EAAG,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC;QACpC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAG,QAAQ,EAAE,GAAG,CAAC;QAEnC,kCAAkC;QAClC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC;QAC1C,CAAC,CAAC,QAAQ,EAAG,OAAO,EAAK,UAAU,EAAE,GAAG,CAAC;QACzC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC;QAC1C,CAAC,CAAC,QAAQ,EAAG,OAAO,EAAK,UAAU,EAAE,GAAG,CAAC;QAEzC,kBAAkB;QAClB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;QACxC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC;QACrC,CAAC,CAAC,KAAK,EAAM,KAAK,EAAI,SAAS,EAAE,GAAG,CAAC;QACrC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAI,YAAY,EAAE,GAAG,CAAC;KACzC,CAAA;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,2FAA2F;QAC3F,4FAA4F;QAC5F,gFAAgF;QAChF,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;KAC9D,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB,CAAC,EAAU,EAAE,EAAU,EAAE,OAAe;IAC9E,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO,CAAC,GAAG,OAAO,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAClC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAC5B,EAAE,GAAG,GAAG,CAAC;QAAC,EAAE,GAAG,GAAG,CAAA;QAClB,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RtGraph, RtNode, RtEdge } from '../vm/interpreter.js';
|
|
2
|
+
/** Inline spawn sub-graph keyed by `prefix`. */
|
|
3
|
+
export declare function buildSpawnSubgraph(prefix: string, srcs: {
|
|
4
|
+
specs: {
|
|
5
|
+
node: string;
|
|
6
|
+
pin: string;
|
|
7
|
+
};
|
|
8
|
+
exec: {
|
|
9
|
+
node: string;
|
|
10
|
+
pin: string;
|
|
11
|
+
};
|
|
12
|
+
}): {
|
|
13
|
+
nodes: RtNode[];
|
|
14
|
+
edges: RtEdge[];
|
|
15
|
+
out: {
|
|
16
|
+
units: {
|
|
17
|
+
node: string;
|
|
18
|
+
pin: string;
|
|
19
|
+
};
|
|
20
|
+
exec: {
|
|
21
|
+
node: string;
|
|
22
|
+
pin: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/** Standalone test wrapper: takes literal `specs`, drains `units` into a VM var for assertions. */
|
|
27
|
+
export declare function spawnEquivalenceGraph(specs: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
rate: number;
|
|
30
|
+
}>): RtGraph;
|
|
31
|
+
//# sourceMappingURL=spawn-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-graph.d.ts","sourceRoot":"","sources":["../../src/model/spawn-graph.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAU1E,gDAAgD;AAChD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAClF;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CACnF,CAoGA;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAmB3F"}
|