@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,129 @@
|
|
|
1
|
+
// Collection bridge primitives — the link between DOMAIN nodes (Agent/Goodie, editable, addable) and
|
|
2
|
+
// the algorithm. They are the only primitives that read/affect nodes ACROSS the graph (via io.nodes),
|
|
3
|
+
// so adding/removing a domain node automatically changes what the simulation sees.
|
|
4
|
+
//
|
|
5
|
+
// Gather (pure): read `field` from every node of `nodeType` → array, ordered by node id.
|
|
6
|
+
// Scatter (impure): take an array → publish it as a var `scatter:<nodeType>:<field>` for the host
|
|
7
|
+
// to write back onto each node's widget (element i → i-th node, same id order).
|
|
8
|
+
import { asArray } from './value.js';
|
|
9
|
+
/** Nodes of a type in a stable order (by id) — both Gather and the host's write-back use this so
|
|
10
|
+
* element i always refers to the same node. */
|
|
11
|
+
export function domainNodes(nodes, nodeType) {
|
|
12
|
+
return nodes.filter((n) => n.type === nodeType).sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
13
|
+
}
|
|
14
|
+
export const SCATTER_VAR_PREFIX = 'scatter:';
|
|
15
|
+
const Gather = {
|
|
16
|
+
type: 'Gather',
|
|
17
|
+
pure: true,
|
|
18
|
+
evalPure: (io) => {
|
|
19
|
+
const nodeType = String(io.state('nodeType') ?? '');
|
|
20
|
+
const field = String(io.state('field') ?? '');
|
|
21
|
+
const out = domainNodes(io.nodes(), nodeType).map((n) => (n.state?.[field] ?? 0));
|
|
22
|
+
return [out];
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const Scatter = {
|
|
26
|
+
type: 'Scatter',
|
|
27
|
+
run: (io) => {
|
|
28
|
+
const nodeType = String(io.state('nodeType') ?? '');
|
|
29
|
+
const field = String(io.state('field') ?? '');
|
|
30
|
+
io.setVar(`${SCATTER_VAR_PREFIX}${nodeType}:${field}`, asArray(io.input(0)));
|
|
31
|
+
io.flow(0);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/** Read several fields from every node of a type → array of objects (id order). `fields` is a
|
|
35
|
+
* comma-separated list. Feeds Spawn (`{type,rate}`) and ToMap straight from domain nodes. */
|
|
36
|
+
const GatherRecords = {
|
|
37
|
+
type: 'GatherRecords',
|
|
38
|
+
pure: true,
|
|
39
|
+
evalPure: (io) => {
|
|
40
|
+
const nodeType = String(io.state('nodeType') ?? '');
|
|
41
|
+
const fields = String(io.state('fields') ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
42
|
+
const out = domainNodes(io.nodes(), nodeType).map((n) => {
|
|
43
|
+
const rec = {};
|
|
44
|
+
for (const f of fields)
|
|
45
|
+
rec[f] = (n.state?.[f] ?? 0);
|
|
46
|
+
return rec;
|
|
47
|
+
});
|
|
48
|
+
return [out];
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/** records[] → object keyed by each record's `key` field, valued by its `value` field. Builds the
|
|
52
|
+
* `{ type: cost }` map Allocate needs from gathered Goodie records. */
|
|
53
|
+
const ToMap = {
|
|
54
|
+
type: 'ToMap',
|
|
55
|
+
pure: true,
|
|
56
|
+
evalPure: (io) => {
|
|
57
|
+
const keyField = String(io.state('key') ?? 'type');
|
|
58
|
+
const valField = String(io.state('value') ?? 'value');
|
|
59
|
+
const obj = {};
|
|
60
|
+
for (const r of asArray(io.input(0))) {
|
|
61
|
+
if (r && typeof r === 'object' && !Array.isArray(r)) {
|
|
62
|
+
const rec = r;
|
|
63
|
+
const v = rec[valField];
|
|
64
|
+
if (v !== undefined)
|
|
65
|
+
obj[String(rec[keyField])] = v;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return [obj];
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
/** Pure picker: object + field name → value. Pairs with MapField for distilling a record array. */
|
|
72
|
+
const GetField = {
|
|
73
|
+
type: 'GetField',
|
|
74
|
+
pure: true,
|
|
75
|
+
evalPure: (io) => {
|
|
76
|
+
const obj = io.input(0);
|
|
77
|
+
const field = String(io.state('field') ?? '');
|
|
78
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj))
|
|
79
|
+
return [undefined];
|
|
80
|
+
return [obj[field]];
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
/** Pure map: array of records + field name → array of that field's values. Lets a wire of agent
|
|
84
|
+
* records become a wire of salaries/priorities/subs without writing a ForEach by hand. */
|
|
85
|
+
const MapField = {
|
|
86
|
+
type: 'MapField',
|
|
87
|
+
pure: true,
|
|
88
|
+
evalPure: (io) => {
|
|
89
|
+
const arr = asArray(io.input(0));
|
|
90
|
+
const field = String(io.state('field') ?? '');
|
|
91
|
+
return [arr.map((r) => (r && typeof r === 'object' && !Array.isArray(r) ? r[field] : undefined))];
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
/** Wire-driven gather (replaces "scan by type" for visible plumbing): the values feeding the single
|
|
95
|
+
* multi-input pin become an output array, in edge order. So 6 agents wired in → 6-element array. */
|
|
96
|
+
const GatherFromInputs = {
|
|
97
|
+
type: 'GatherFromInputs',
|
|
98
|
+
pure: true,
|
|
99
|
+
evalPure: (io) => [io.inputAll(0)],
|
|
100
|
+
};
|
|
101
|
+
/** Wire-driven scatter (the inverse of GatherFromInputs): takes an array and publishes element i
|
|
102
|
+
* on the i-th data-out pin, in declared-pin order. Also stashes the array in `scatter-out:<nodeId>`
|
|
103
|
+
* so a host can harvest it after the tick (per-pin overrides don't survive the tick). Pins are
|
|
104
|
+
* added per consumer (by the host's auto-connect on node:added). */
|
|
105
|
+
const ScatterToOutputs = {
|
|
106
|
+
type: 'ScatterToOutputs',
|
|
107
|
+
run: (io) => {
|
|
108
|
+
const arr = asArray(io.input(0));
|
|
109
|
+
const outs = io.node.pins.filter((p) => p.kind === 'data' && p.direction === 'out').length;
|
|
110
|
+
for (let i = 0; i < outs; i++)
|
|
111
|
+
io.setOutput(i, arr[i]);
|
|
112
|
+
io.setVar(`scatter-out:${io.node.id}`, arr);
|
|
113
|
+
io.flow(0);
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
export const OUTPUT_VAR_PREFIX = 'output:';
|
|
117
|
+
/** Display the wired value IN-NODE. Publishes the value into VM var `output:<nodeId>` each tick.
|
|
118
|
+
* Hosts running `Runtime` should mirror those vars onto each Output node's `value` widget via
|
|
119
|
+
* `editor.setWidgetValue(id, 'value', v, { ephemeral: true })` — one small loop after rt.tick.
|
|
120
|
+
* The plugin can't do it itself (it has no Runtime reference); the wiring stays one line on the host. */
|
|
121
|
+
const Output = {
|
|
122
|
+
type: 'Output',
|
|
123
|
+
run: (io) => {
|
|
124
|
+
io.setVar(`${OUTPUT_VAR_PREFIX}${io.node.id}`, io.input(0));
|
|
125
|
+
io.flow(0);
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
export const COLLECTION_PRIMITIVES = [Gather, Scatter, GatherRecords, ToMap, GatherFromInputs, ScatterToOutputs, GetField, MapField, Output];
|
|
129
|
+
//# sourceMappingURL=collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/vm/collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.bench.d.ts","sourceRoot":"","sources":["../../src/vm/compiler.bench.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Interpreter vs compiler perf — what's the prototype win? Run via:
|
|
2
|
+
// pnpm --filter @xenolithengine/graph-plugin-runtime vitest bench --run compiler
|
|
3
|
+
// Each scenario runs N ticks under both engines and prints relative throughput.
|
|
4
|
+
import { bench, describe } from 'vitest';
|
|
5
|
+
import { Runtime } from './interpreter.js';
|
|
6
|
+
import { BUILTIN_PRIMITIVES } from './primitives.js';
|
|
7
|
+
import { COLLECTION_PRIMITIVES } from './collection.js';
|
|
8
|
+
import { compile } from './compiler.js';
|
|
9
|
+
import { codegen } from './codegen.js';
|
|
10
|
+
import { spawnEquivalenceGraph } from '../model/spawn-graph.js';
|
|
11
|
+
import { allocateEquivalenceGraph } from '../model/allocate-graph.js';
|
|
12
|
+
const DEFS = [...BUILTIN_PRIMITIVES, ...COLLECTION_PRIMITIVES];
|
|
13
|
+
// Spawn — small graph (~20 nodes), per-type accumulator, 3 specs.
|
|
14
|
+
const SPAWN_GRAPH = spawnEquivalenceGraph([
|
|
15
|
+
{ type: 'gift', rate: 0.4 }, { type: 'coin', rate: 0.6 }, { type: 'star', rate: 0.2 },
|
|
16
|
+
]);
|
|
17
|
+
// Allocate — bigger graph (~40 nodes), 6 agents × 3 goodies, realistic merged-demo subset.
|
|
18
|
+
const ALLOC_GRAPH = allocateEquivalenceGraph([0.2, 0.9, 0.5, 0.4, 0.7, 0.3], [['gift', 'coin'], ['coin'], ['gift', 'star'], ['coin', 'star'], ['gift', 'coin', 'star'], ['star']], ['gift', 'coin', 'star'], { gift: 2, coin: 1.5, star: 4 });
|
|
19
|
+
describe('Spawn graph — interp vs baked vs codegen', () => {
|
|
20
|
+
const rt = new Runtime(DEFS);
|
|
21
|
+
const co = compile(SPAWN_GRAPH, DEFS);
|
|
22
|
+
const cg = codegen(SPAWN_GRAPH, DEFS);
|
|
23
|
+
bench('interp', () => { rt.tick(SPAWN_GRAPH); });
|
|
24
|
+
bench('baked', () => { co.tick(); });
|
|
25
|
+
bench('codegen', () => { cg.tick(); });
|
|
26
|
+
});
|
|
27
|
+
describe('Allocate graph — interp vs baked vs codegen', () => {
|
|
28
|
+
const rt = new Runtime(DEFS);
|
|
29
|
+
const co = compile(ALLOC_GRAPH, DEFS);
|
|
30
|
+
const cg = codegen(ALLOC_GRAPH, DEFS);
|
|
31
|
+
bench('interp', () => { rt.tick(ALLOC_GRAPH); });
|
|
32
|
+
bench('baked', () => { co.tick(); });
|
|
33
|
+
bench('codegen', () => { cg.tick(); });
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=compiler.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.bench.js","sourceRoot":"","sources":["../../src/vm/compiler.bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RtGraph, NodeDef } from './interpreter.js';
|
|
2
|
+
import type { VmValue } from './value.js';
|
|
3
|
+
export interface CompiledGraph {
|
|
4
|
+
/** Run one tick (fires every node of `entryType`, default `Tick`). */
|
|
5
|
+
tick(entryType?: string): void;
|
|
6
|
+
/** Listeners fired after every `tick()` returns. */
|
|
7
|
+
onAfterTick(cb: () => void): () => void;
|
|
8
|
+
getVar(name: string): VmValue | undefined;
|
|
9
|
+
setVar(name: string, value: VmValue): void;
|
|
10
|
+
/** Wipe vars + latched outputs (lets a bench restart cleanly without re-compiling). */
|
|
11
|
+
reset(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function compile(graph: RtGraph, defs: ReadonlyArray<NodeDef>): CompiledGraph;
|
|
14
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/vm/compiler.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAyB,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAMzC,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,oDAAoD;IACpD,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC1C,uFAAuF;IACvF,KAAK,IAAI,IAAI,CAAA;CACd;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAwJnF"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// Graph compiler — Runtime v2 prototype. Bakes a `RtGraph + NodeDef[]` into a `CompiledGraph`
|
|
2
|
+
// whose `tick()` is a single pre-resolved function chain. Same execution model as `Runtime`
|
|
3
|
+
// (entry nodes by type, exec push, data pull, vars + cross-tick latching), but ALL per-tick
|
|
4
|
+
// lookups are pre-computed at compile time:
|
|
5
|
+
// - `nodeById`, `defByType`, `incoming{,All}`, `execTarget` indices built ONCE.
|
|
6
|
+
// - Per-node `ExecIO` context allocated ONCE (interpreter rebuilds it per call via spread).
|
|
7
|
+
// - Exec runners stored as direct function refs in a `Map<nodeId, ()=>void>` — Sequence/Branch
|
|
8
|
+
// `flow()` resolves to a single fn call (interp walks two maps + a filter to do the same).
|
|
9
|
+
// - Pure-pull memoisation IS NOT cached across exec nodes (overrides + vars change mid-tick),
|
|
10
|
+
// but within one exec invocation the same data-out is recomputed only if the caller re-pulls.
|
|
11
|
+
//
|
|
12
|
+
// Equivalence with the interpreter is proven by `compiler.test.ts` on the same scenarios used
|
|
13
|
+
// for spawn/allocate equivalence — every VM-var snapshot matches after N ticks.
|
|
14
|
+
const dataIns = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'in');
|
|
15
|
+
const dataOuts = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'out');
|
|
16
|
+
const execOuts = (n) => n.pins.filter((p) => p.kind === 'exec' && p.direction === 'out');
|
|
17
|
+
export function compile(graph, defs) {
|
|
18
|
+
const defMap = new Map();
|
|
19
|
+
for (const d of defs)
|
|
20
|
+
defMap.set(d.type, d);
|
|
21
|
+
const nodeById = new Map();
|
|
22
|
+
for (const n of graph.nodes)
|
|
23
|
+
nodeById.set(n.id, n);
|
|
24
|
+
// Per-node pin-index slices baked once.
|
|
25
|
+
const dataInsByNode = new Map();
|
|
26
|
+
const dataOutsByNode = new Map();
|
|
27
|
+
const execOutsByNode = new Map();
|
|
28
|
+
for (const n of graph.nodes) {
|
|
29
|
+
dataInsByNode.set(n.id, dataIns(n));
|
|
30
|
+
dataOutsByNode.set(n.id, dataOuts(n));
|
|
31
|
+
execOutsByNode.set(n.id, execOuts(n));
|
|
32
|
+
}
|
|
33
|
+
// Edge indices — same as interpreter, but built once at compile time.
|
|
34
|
+
const incoming = new Map();
|
|
35
|
+
const incomingAll = new Map();
|
|
36
|
+
const execTarget = new Map();
|
|
37
|
+
for (const e of graph.edges) {
|
|
38
|
+
const key = `${e.to.node}:${e.to.pin}`;
|
|
39
|
+
if (!incoming.has(key))
|
|
40
|
+
incoming.set(key, e.from);
|
|
41
|
+
const bucket = incomingAll.get(key);
|
|
42
|
+
if (bucket)
|
|
43
|
+
bucket.push(e.from);
|
|
44
|
+
else
|
|
45
|
+
incomingAll.set(key, [e.from]);
|
|
46
|
+
execTarget.set(`${e.from.node}:${e.from.pin}`, e.to.node);
|
|
47
|
+
}
|
|
48
|
+
// Per-edge data-source pre-resolved to (srcNodeId, dataOutIndex). Resolves "pin id → index"
|
|
49
|
+
// ONCE here so every pull is two map lookups, not three + a findIndex.
|
|
50
|
+
const incomingResolved = new Map();
|
|
51
|
+
const incomingAllResolved = new Map();
|
|
52
|
+
for (const [key, src] of incoming) {
|
|
53
|
+
const srcNode = nodeById.get(src.node);
|
|
54
|
+
if (!srcNode)
|
|
55
|
+
continue;
|
|
56
|
+
const outIndex = dataOutsByNode.get(src.node).findIndex((p) => p.id === src.pin);
|
|
57
|
+
if (outIndex >= 0)
|
|
58
|
+
incomingResolved.set(key, { nodeId: src.node, outIndex });
|
|
59
|
+
}
|
|
60
|
+
for (const [key, srcs] of incomingAll) {
|
|
61
|
+
const resolved = [];
|
|
62
|
+
for (const s of srcs) {
|
|
63
|
+
const srcNode = nodeById.get(s.node);
|
|
64
|
+
if (!srcNode)
|
|
65
|
+
continue;
|
|
66
|
+
const outIndex = dataOutsByNode.get(s.node).findIndex((p) => p.id === s.pin);
|
|
67
|
+
if (outIndex >= 0)
|
|
68
|
+
resolved.push({ nodeId: s.node, outIndex });
|
|
69
|
+
}
|
|
70
|
+
incomingAllResolved.set(key, resolved);
|
|
71
|
+
}
|
|
72
|
+
// Persistent state.
|
|
73
|
+
const vars = new Map();
|
|
74
|
+
const latched = new Map();
|
|
75
|
+
let overrides = new Map(); // recreated per tick
|
|
76
|
+
const afterTickListeners = new Set();
|
|
77
|
+
// Forward decl — execRunners populated AFTER ios are built (mutual recursion via flow()).
|
|
78
|
+
const execRunners = new Map();
|
|
79
|
+
// Build per-node `ExecIO` ONCE. Closures over baked indices — no per-call allocation.
|
|
80
|
+
// For Sequence/Branch this means flow(i) is a single Map lookup + fn call (interp does Map +
|
|
81
|
+
// findIndex over pin array + another Map lookup).
|
|
82
|
+
const ios = new Map();
|
|
83
|
+
for (const node of graph.nodes) {
|
|
84
|
+
const nid = node.id;
|
|
85
|
+
const myDataIns = dataInsByNode.get(nid);
|
|
86
|
+
const myExecOuts = execOutsByNode.get(nid);
|
|
87
|
+
const io = {
|
|
88
|
+
node,
|
|
89
|
+
input: (index) => {
|
|
90
|
+
const pin = myDataIns[index];
|
|
91
|
+
if (!pin)
|
|
92
|
+
return undefined;
|
|
93
|
+
const src = incomingResolved.get(`${nid}:${pin.id}`);
|
|
94
|
+
return src ? pullOut(src.nodeId, src.outIndex) : pin.default;
|
|
95
|
+
},
|
|
96
|
+
inputAll: (index) => {
|
|
97
|
+
const pin = myDataIns[index];
|
|
98
|
+
if (!pin)
|
|
99
|
+
return [];
|
|
100
|
+
const srcs = incomingAllResolved.get(`${nid}:${pin.id}`) ?? [];
|
|
101
|
+
const out = [];
|
|
102
|
+
for (const s of srcs) {
|
|
103
|
+
const v = pullOut(s.nodeId, s.outIndex);
|
|
104
|
+
if (v !== undefined)
|
|
105
|
+
out.push(v);
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
},
|
|
109
|
+
state: (key) => node.state?.[key],
|
|
110
|
+
getVar: (name) => vars.get(name),
|
|
111
|
+
setVar: (name, value) => { vars.set(name, value); },
|
|
112
|
+
setOutput: (index, value) => { overrides.set(`${nid}:${index}`, value); },
|
|
113
|
+
flow: (execOutIndex) => {
|
|
114
|
+
const pin = myExecOuts[execOutIndex];
|
|
115
|
+
if (!pin)
|
|
116
|
+
return;
|
|
117
|
+
const target = execTarget.get(`${nid}:${pin.id}`);
|
|
118
|
+
if (!target)
|
|
119
|
+
return;
|
|
120
|
+
const runner = execRunners.get(target);
|
|
121
|
+
if (runner)
|
|
122
|
+
runner();
|
|
123
|
+
},
|
|
124
|
+
nodes: () => graph.nodes,
|
|
125
|
+
};
|
|
126
|
+
ios.set(nid, io);
|
|
127
|
+
}
|
|
128
|
+
// Pull a value off a node's data-out: per-tick override → pure eval → cross-tick latched value.
|
|
129
|
+
function pullOut(nodeId, outIndex) {
|
|
130
|
+
const key = `${nodeId}:${outIndex}`;
|
|
131
|
+
if (overrides.has(key))
|
|
132
|
+
return overrides.get(key);
|
|
133
|
+
const node = nodeById.get(nodeId);
|
|
134
|
+
if (!node)
|
|
135
|
+
return undefined;
|
|
136
|
+
const def = defMap.get(node.type);
|
|
137
|
+
if (def?.evalPure)
|
|
138
|
+
return def.evalPure(ios.get(nodeId))[outIndex];
|
|
139
|
+
// Source nodes without an evaluator expose their `state` on every data-out (Agent/Goodie pattern).
|
|
140
|
+
if (!def && node.state)
|
|
141
|
+
return node.state;
|
|
142
|
+
return latched.get(key);
|
|
143
|
+
}
|
|
144
|
+
// Pre-resolve per-node runners (direct fn refs, no Map lookup in the hot path).
|
|
145
|
+
for (const node of graph.nodes) {
|
|
146
|
+
const def = defMap.get(node.type);
|
|
147
|
+
if (def?.run) {
|
|
148
|
+
const run = def.run;
|
|
149
|
+
const io = ios.get(node.id);
|
|
150
|
+
execRunners.set(node.id, () => run(io));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Pre-group entry runners by node.type so `tick(entryType)` is a single array walk, no filter.
|
|
154
|
+
const entriesByType = new Map();
|
|
155
|
+
for (const node of graph.nodes) {
|
|
156
|
+
const runner = execRunners.get(node.id);
|
|
157
|
+
if (!runner)
|
|
158
|
+
continue;
|
|
159
|
+
const bucket = entriesByType.get(node.type);
|
|
160
|
+
if (bucket)
|
|
161
|
+
bucket.push(runner);
|
|
162
|
+
else
|
|
163
|
+
entriesByType.set(node.type, [runner]);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
tick(entryType = 'Tick') {
|
|
167
|
+
overrides = new Map();
|
|
168
|
+
const runners = entriesByType.get(entryType);
|
|
169
|
+
if (runners)
|
|
170
|
+
for (const r of runners)
|
|
171
|
+
r();
|
|
172
|
+
for (const [k, v] of overrides)
|
|
173
|
+
latched.set(k, v);
|
|
174
|
+
for (const cb of afterTickListeners)
|
|
175
|
+
cb();
|
|
176
|
+
},
|
|
177
|
+
onAfterTick(cb) {
|
|
178
|
+
afterTickListeners.add(cb);
|
|
179
|
+
return () => afterTickListeners.delete(cb);
|
|
180
|
+
},
|
|
181
|
+
getVar: (name) => vars.get(name),
|
|
182
|
+
setVar: (name, value) => { vars.set(name, value); },
|
|
183
|
+
reset() {
|
|
184
|
+
vars.clear();
|
|
185
|
+
latched.clear();
|
|
186
|
+
overrides = new Map();
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/vm/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { VmValue } from './value.js';
|
|
2
|
+
export interface RtPin {
|
|
3
|
+
id: string;
|
|
4
|
+
kind: 'exec' | 'data';
|
|
5
|
+
direction: 'in' | 'out';
|
|
6
|
+
type?: string;
|
|
7
|
+
default?: unknown;
|
|
8
|
+
/** Marks a pin that accepts multiple incoming edges (collection-style, read via inputAll).
|
|
9
|
+
* Generic primitives may treat single vs multi pins differently — e.g. Struct's per-field
|
|
10
|
+
* override only applies to non-multi data-in pins. */
|
|
11
|
+
multiple?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface RtNode {
|
|
14
|
+
id: string;
|
|
15
|
+
type: string;
|
|
16
|
+
state?: Record<string, unknown>;
|
|
17
|
+
pins: ReadonlyArray<RtPin>;
|
|
18
|
+
}
|
|
19
|
+
export interface RtEdge {
|
|
20
|
+
from: {
|
|
21
|
+
node: string;
|
|
22
|
+
pin: string;
|
|
23
|
+
};
|
|
24
|
+
to: {
|
|
25
|
+
node: string;
|
|
26
|
+
pin: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface RtGraph {
|
|
30
|
+
nodes: ReadonlyArray<RtNode>;
|
|
31
|
+
edges: ReadonlyArray<RtEdge>;
|
|
32
|
+
/** Optional codegen hint: which vars are inputs (passed as fn args), which are outputs (returned).
|
|
33
|
+
* Enables the AS-WASM emitter to expose an extra `tickArgs(...inputs): firstOutput` entry point
|
|
34
|
+
* that bypasses set/getVar — measurable win when host calls tick per-pixel in a hot loop. */
|
|
35
|
+
meta?: {
|
|
36
|
+
inputs?: ReadonlyArray<string>;
|
|
37
|
+
outputs?: ReadonlyArray<string>;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Context for a pure node: read the i-th data input (pulled), widget literals, and variables.
|
|
41
|
+
* `nodes()` exposes the whole tick's node set so collection primitives (Gather/Scatter) can scan
|
|
42
|
+
* domain nodes by type — the one capability that reads across the graph, not just wired inputs. */
|
|
43
|
+
export interface PureIO {
|
|
44
|
+
node: RtNode;
|
|
45
|
+
input(index: number): VmValue | undefined;
|
|
46
|
+
/** All values feeding a `multiple` data-in pin, one per connected edge (edge order). Empty if
|
|
47
|
+
* nothing is wired. This is what makes "subscriptions are wires" / a multi-input Gather work. */
|
|
48
|
+
inputAll(index: number): VmValue[];
|
|
49
|
+
state(key: string): unknown;
|
|
50
|
+
getVar(name: string): VmValue | undefined;
|
|
51
|
+
nodes(): readonly RtNode[];
|
|
52
|
+
}
|
|
53
|
+
/** Context for an impure (exec) node: pure's reads plus write state, publish the i-th data output,
|
|
54
|
+
* and continue control flow along the i-th exec out-pin. */
|
|
55
|
+
export interface ExecIO extends PureIO {
|
|
56
|
+
setVar(name: string, value: VmValue): void;
|
|
57
|
+
setOutput(index: number, value: VmValue): void;
|
|
58
|
+
flow(execOutIndex: number): void;
|
|
59
|
+
}
|
|
60
|
+
export interface NodeDef {
|
|
61
|
+
type: string;
|
|
62
|
+
pure?: boolean;
|
|
63
|
+
/** Pure node: return a value per data-out index. */
|
|
64
|
+
evalPure?(io: PureIO): Array<VmValue | undefined>;
|
|
65
|
+
/** Impure node: perform effects and drive exec flow via `io.flow(...)`. */
|
|
66
|
+
run?(io: ExecIO): void;
|
|
67
|
+
/** Optional pre-tick hook — invoked once per node BEFORE any exec entries fire this tick. Used by
|
|
68
|
+
* `Local` to reset its var slot to `state.initial` (tick-scoped state semantics). Receives an
|
|
69
|
+
* ExecIO restricted to var writes (input/output/flow are no-ops at this stage). */
|
|
70
|
+
onTickBegin?(io: ExecIO): void;
|
|
71
|
+
}
|
|
72
|
+
export declare class Runtime {
|
|
73
|
+
#private;
|
|
74
|
+
constructor(defs: ReadonlyArray<NodeDef>);
|
|
75
|
+
getVar(name: string): VmValue | undefined;
|
|
76
|
+
setVar(name: string, value: VmValue): void;
|
|
77
|
+
get variables(): ReadonlyMap<string, VmValue>;
|
|
78
|
+
/** Subscribe to a "tick just finished" callback. Receives the same graph the tick ran on, so
|
|
79
|
+
* bridges (e.g. the editor's Output-widget mirror) can iterate nodes and read fresh VM vars
|
|
80
|
+
* without each host writing the same loop themselves. Returns an unsubscribe. */
|
|
81
|
+
onAfterTick(cb: (graph: RtGraph) => void): () => void;
|
|
82
|
+
/** Run one step: fire every entry node of `entryType` (default `Tick`) and walk the exec graph.
|
|
83
|
+
* Variables persist; per-tick output overrides are fresh. Use `entryType: 'Init'` once at start
|
|
84
|
+
* to run a construction flow that seeds variables. */
|
|
85
|
+
tick(graph: RtGraph, entryType?: string): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=interpreter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../src/vm/interpreter.ts"],"names":[],"mappings":"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"}
|