@pilates/core 1.0.0 → 1.1.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/dist/algorithm/index.d.ts +31 -0
- package/dist/algorithm/index.d.ts.map +1 -1
- package/dist/algorithm/index.js +85 -1
- package/dist/algorithm/index.js.map +1 -1
- package/dist/algorithm/round.d.ts +13 -0
- package/dist/algorithm/round.d.ts.map +1 -1
- package/dist/algorithm/round.js +17 -0
- package/dist/algorithm/round.js.map +1 -1
- package/dist/algorithm/spineless/flex-grammar.d.ts +394 -0
- package/dist/algorithm/spineless/flex-grammar.d.ts.map +1 -0
- package/dist/algorithm/spineless/flex-grammar.js +2373 -0
- package/dist/algorithm/spineless/flex-grammar.js.map +1 -0
- package/dist/algorithm/spineless/grammar.d.ts +150 -0
- package/dist/algorithm/spineless/grammar.d.ts.map +1 -0
- package/dist/algorithm/spineless/grammar.js +144 -0
- package/dist/algorithm/spineless/grammar.js.map +1 -0
- package/dist/algorithm/spineless/layout.d.ts +130 -0
- package/dist/algorithm/spineless/layout.d.ts.map +1 -0
- package/dist/algorithm/spineless/layout.js +755 -0
- package/dist/algorithm/spineless/layout.js.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.bench.d.ts +25 -0
- package/dist/algorithm/spineless/order-maintenance.bench.d.ts.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.bench.js +78 -0
- package/dist/algorithm/spineless/order-maintenance.bench.js.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.d.ts +192 -0
- package/dist/algorithm/spineless/order-maintenance.d.ts.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.js +294 -0
- package/dist/algorithm/spineless/order-maintenance.js.map +1 -0
- package/dist/algorithm/spineless/priority-queue.bench.d.ts +17 -0
- package/dist/algorithm/spineless/priority-queue.bench.d.ts.map +1 -0
- package/dist/algorithm/spineless/priority-queue.bench.js +57 -0
- package/dist/algorithm/spineless/priority-queue.bench.js.map +1 -0
- package/dist/algorithm/spineless/priority-queue.d.ts +73 -0
- package/dist/algorithm/spineless/priority-queue.d.ts.map +1 -0
- package/dist/algorithm/spineless/priority-queue.js +149 -0
- package/dist/algorithm/spineless/priority-queue.js.map +1 -0
- package/dist/algorithm/spineless/runtime.d.ts +239 -0
- package/dist/algorithm/spineless/runtime.d.ts.map +1 -0
- package/dist/algorithm/spineless/runtime.js +458 -0
- package/dist/algorithm/spineless/runtime.js.map +1 -0
- package/dist/algorithm/spineless/style-dirty.d.ts +65 -0
- package/dist/algorithm/spineless/style-dirty.d.ts.map +1 -0
- package/dist/algorithm/spineless/style-dirty.js +75 -0
- package/dist/algorithm/spineless/style-dirty.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +27 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +61 -0
- package/dist/inspect.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/algorithm/spineless/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Microbenchmark for the Order Maintenance data structure.
|
|
3
|
+
*
|
|
4
|
+
* This is the **kill switch** for Phase 5 (Spineless Traversal): if OM
|
|
5
|
+
* operations cost more than a small constant per op at 1k-10k node scale,
|
|
6
|
+
* the algorithmic novelty of Spineless Traversal won't pay off in pure JS.
|
|
7
|
+
*
|
|
8
|
+
* Targets (Phase 5 viability criteria):
|
|
9
|
+
* - `compare`: < 200ns per op at 10k nodes (it's the hot path; the
|
|
10
|
+
* Spineless priority queue calls it on every insert/extract).
|
|
11
|
+
* - `insertAfter`: < 5µs amortized at 10k nodes (rarer, called when
|
|
12
|
+
* the dependency graph adds nodes — typically only during tree
|
|
13
|
+
* construction or large mutations).
|
|
14
|
+
*
|
|
15
|
+
* The naive impl is O(N) per insert, so it will exceed the insertAfter
|
|
16
|
+
* target at scale. That's expected — the Bender et al. amortized O(1)
|
|
17
|
+
* impl is what hits the target. We measure naive here as a baseline so
|
|
18
|
+
* we can show the speedup when Bender lands.
|
|
19
|
+
*
|
|
20
|
+
* Run with: `tsx packages/core/src/algorithm/spineless/order-maintenance.bench.ts`
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=order-maintenance.bench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-maintenance.bench.d.ts","sourceRoot":"","sources":["../../../src/algorithm/spineless/order-maintenance.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Microbenchmark for the Order Maintenance data structure.
|
|
3
|
+
*
|
|
4
|
+
* This is the **kill switch** for Phase 5 (Spineless Traversal): if OM
|
|
5
|
+
* operations cost more than a small constant per op at 1k-10k node scale,
|
|
6
|
+
* the algorithmic novelty of Spineless Traversal won't pay off in pure JS.
|
|
7
|
+
*
|
|
8
|
+
* Targets (Phase 5 viability criteria):
|
|
9
|
+
* - `compare`: < 200ns per op at 10k nodes (it's the hot path; the
|
|
10
|
+
* Spineless priority queue calls it on every insert/extract).
|
|
11
|
+
* - `insertAfter`: < 5µs amortized at 10k nodes (rarer, called when
|
|
12
|
+
* the dependency graph adds nodes — typically only during tree
|
|
13
|
+
* construction or large mutations).
|
|
14
|
+
*
|
|
15
|
+
* The naive impl is O(N) per insert, so it will exceed the insertAfter
|
|
16
|
+
* target at scale. That's expected — the Bender et al. amortized O(1)
|
|
17
|
+
* impl is what hits the target. We measure naive here as a baseline so
|
|
18
|
+
* we can show the speedup when Bender lands.
|
|
19
|
+
*
|
|
20
|
+
* Run with: `tsx packages/core/src/algorithm/spineless/order-maintenance.bench.ts`
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
import { BenderOrderMaintenance, NaiveOrderMaintenance, } from './order-maintenance.js';
|
|
25
|
+
function median(xs) {
|
|
26
|
+
const sorted = [...xs].sort((a, b) => a - b);
|
|
27
|
+
return sorted[Math.floor(sorted.length / 2)];
|
|
28
|
+
}
|
|
29
|
+
function bench(label, make, sizes, opsPerTrial, trials, op) {
|
|
30
|
+
console.log(`\n## ${label} — ${op}`);
|
|
31
|
+
for (const N of sizes) {
|
|
32
|
+
const trialMs = [];
|
|
33
|
+
for (let t = 0; t < trials; t++) {
|
|
34
|
+
const om = make();
|
|
35
|
+
const nodes = [om.init()];
|
|
36
|
+
// Pre-build N-1 more nodes
|
|
37
|
+
for (let i = 1; i < N; i++)
|
|
38
|
+
nodes.push(om.insertAfter(nodes[i - 1]));
|
|
39
|
+
const start = performance.now();
|
|
40
|
+
if (op === 'compare') {
|
|
41
|
+
// Fixed-pattern compares to avoid letting V8 optimize away
|
|
42
|
+
let acc = 0;
|
|
43
|
+
for (let k = 0; k < opsPerTrial; k++) {
|
|
44
|
+
// Pick two pseudo-random nodes (deterministic, no Math.random cost)
|
|
45
|
+
const i = (k * 2654435761) % N;
|
|
46
|
+
const j = (k * 1597334677) % N;
|
|
47
|
+
acc += om.compare(nodes[i], nodes[j]);
|
|
48
|
+
}
|
|
49
|
+
if (acc === 12345.6789)
|
|
50
|
+
console.log('!!!');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Insert opsPerTrial new nodes; insert position cycles through
|
|
54
|
+
// existing nodes so we hit middle-of-list (worst case for naive
|
|
55
|
+
// renumber).
|
|
56
|
+
for (let k = 0; k < opsPerTrial; k++) {
|
|
57
|
+
const after = nodes[(k * 2654435761) % nodes.length];
|
|
58
|
+
nodes.push(om.insertAfter(after));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const end = performance.now();
|
|
62
|
+
trialMs.push(end - start);
|
|
63
|
+
}
|
|
64
|
+
const ms = median(trialMs);
|
|
65
|
+
const usPerOp = (ms * 1000) / opsPerTrial;
|
|
66
|
+
const opsPerSec = (opsPerTrial / ms) * 1000;
|
|
67
|
+
console.log(` N=${N.toString().padStart(6)} ${usPerOp.toFixed(3).padStart(8)} µs/op ${(opsPerSec / 1000).toFixed(1).padStart(8)} kops/s`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
console.log('Order Maintenance microbench (single-threaded JS, Node.js)');
|
|
71
|
+
console.log('Targets: compare < 0.2µs, insertAfter amortized < 5µs at N=10k');
|
|
72
|
+
const naive = () => new NaiveOrderMaintenance();
|
|
73
|
+
const bender = () => new BenderOrderMaintenance();
|
|
74
|
+
bench('Naive compare', naive, [100, 1000, 10000], 100_000, 5, 'compare');
|
|
75
|
+
bench('Bender compare', bender, [100, 1000, 10000], 100_000, 5, 'compare');
|
|
76
|
+
bench('Naive insertAfter (O(N) renumber)', naive, [100, 1000, 10000], 1_000, 5, 'insertAfter');
|
|
77
|
+
bench('Bender insertAfter (amortized O(log N))', bender, [100, 1000, 10000], 1_000, 5, 'insertAfter');
|
|
78
|
+
//# sourceMappingURL=order-maintenance.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-maintenance.bench.js","sourceRoot":"","sources":["../../../src/algorithm/spineless/order-maintenance.bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order Maintenance (OM) data structure.
|
|
3
|
+
*
|
|
4
|
+
* Maintains a totally-ordered set of items under insertions, deletions,
|
|
5
|
+
* and `compare(a, b)` queries that return the relative order in O(1) (or
|
|
6
|
+
* O(1) amortized). Foundational primitive for Spineless Traversal
|
|
7
|
+
* (Kirisame, Wang, Panchekha — PLDI 2025): the priority queue that
|
|
8
|
+
* drives incremental layout invalidation is keyed on OM timestamps,
|
|
9
|
+
* so a fast OM comparator dominates per-operation cost.
|
|
10
|
+
*
|
|
11
|
+
* Reference: Bender, Cole, Demaine, Farach-Colton, Zito. "Two
|
|
12
|
+
* simplified algorithms for maintaining order in a list." ESA 2002.
|
|
13
|
+
*
|
|
14
|
+
* ## What this file ships
|
|
15
|
+
*
|
|
16
|
+
* **The interface** — `OMNode`, `OrderMaintenance` — is the surface the
|
|
17
|
+
* Spineless runtime will consume. We design it so the implementation
|
|
18
|
+
* can be swapped (naive ↔ Bender amortized O(1)) without ripple.
|
|
19
|
+
*
|
|
20
|
+
* **The naive implementation** — `NaiveOrderMaintenance` — uses a single
|
|
21
|
+
* doubly-linked list with sequential integer tags assigned on insert.
|
|
22
|
+
* Inserts trigger O(N) renumbering of trailing nodes. Compare is O(1).
|
|
23
|
+
*
|
|
24
|
+
* This is the **scaffolding implementation**: correct, simple, lets us
|
|
25
|
+
* write all the consumer code (priority queue, runtime, attribute grammar
|
|
26
|
+
* interpreter) without waiting for the optimized impl. The Bender et al.
|
|
27
|
+
* amortized-O(1) implementation lands as a drop-in replacement once the
|
|
28
|
+
* Spineless runtime is wired and we can benchmark end-to-end. The naive
|
|
29
|
+
* impl stays in tree forever as a reference oracle: every Bender op is
|
|
30
|
+
* differentially compared against naive in the property-based test.
|
|
31
|
+
*
|
|
32
|
+
* ## Why JS and not WASM
|
|
33
|
+
*
|
|
34
|
+
* The paper's reference (Megatron) emits C++ and uses inline `cmov` for
|
|
35
|
+
* branchless compare. We can't use inline assembly in JS, but we don't
|
|
36
|
+
* have to: V8 already lowers `a < b` on 32-bit-integer hidden classes
|
|
37
|
+
* to a branchless `cmp` + `setb` sequence on x86-64. The TS-side cost is
|
|
38
|
+
* predominantly in the `lookup` (Map.get) and the unboxed compare itself.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* A node in the order. The user holds these directly; comparisons happen
|
|
44
|
+
* via {@link OrderMaintenance.compare}. Implementations are free to use
|
|
45
|
+
* different node-internal representations; the interface only commits to
|
|
46
|
+
* identity (`===`) being the way to look a node up.
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
export interface OMNode {
|
|
51
|
+
/**
|
|
52
|
+
* Implementation-defined opaque tag. Consumers must NOT read this
|
|
53
|
+
* directly. Treated as an internal invariant that survives compares
|
|
54
|
+
* but may shift after inserts/deletes (renumbering, rebalance).
|
|
55
|
+
*
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
readonly _omTag: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export interface OrderMaintenance {
|
|
64
|
+
/**
|
|
65
|
+
* The current count of live nodes in the order. Exposed for tests
|
|
66
|
+
* and microbenchmarks; consumers should not depend on the value.
|
|
67
|
+
*/
|
|
68
|
+
readonly size: number;
|
|
69
|
+
/**
|
|
70
|
+
* Create the very first node in an empty order, or assert that an
|
|
71
|
+
* order is non-empty by looking up an existing first/last anchor.
|
|
72
|
+
* Returns a node identity that can be used as the `after` argument
|
|
73
|
+
* to subsequent `insertAfter` calls.
|
|
74
|
+
*
|
|
75
|
+
* Calling `init` on an already-initialised order replaces all
|
|
76
|
+
* existing nodes; this is provided for `reset()` semantics.
|
|
77
|
+
*/
|
|
78
|
+
init(): OMNode;
|
|
79
|
+
/**
|
|
80
|
+
* Insert a fresh node immediately after `after` in the order.
|
|
81
|
+
* Returns the new node identity. The returned node compares >
|
|
82
|
+
* `after` and < whatever was at `after.next` previously.
|
|
83
|
+
*
|
|
84
|
+
* Amortized O(1) in the Bender impl; O(N) worst case here in the
|
|
85
|
+
* naive impl due to trailing-node renumbering.
|
|
86
|
+
*/
|
|
87
|
+
insertAfter(after: OMNode): OMNode;
|
|
88
|
+
/**
|
|
89
|
+
* Remove `node` from the order. Subsequent compares involving
|
|
90
|
+
* `node` are undefined behaviour. Other nodes' relative order is
|
|
91
|
+
* preserved.
|
|
92
|
+
*/
|
|
93
|
+
delete(node: OMNode): void;
|
|
94
|
+
/**
|
|
95
|
+
* Compare the relative order of `a` and `b`. Returns:
|
|
96
|
+
* - a negative integer if `a` precedes `b` (was inserted earlier
|
|
97
|
+
* or recipient-of-`insertAfter` chain),
|
|
98
|
+
* - zero if `a === b`,
|
|
99
|
+
* - a positive integer if `a` follows `b`.
|
|
100
|
+
*
|
|
101
|
+
* O(1) amortized in both naive and Bender impls. This is the
|
|
102
|
+
* hot path — the Spineless priority queue calls compare per
|
|
103
|
+
* insert/extract.
|
|
104
|
+
*/
|
|
105
|
+
compare(a: OMNode, b: OMNode): number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Naive O(N)-per-insert Order Maintenance. Correctness-only impl
|
|
109
|
+
* for scaffolding and as a fuzzer oracle for the future Bender impl.
|
|
110
|
+
*
|
|
111
|
+
* Invariants:
|
|
112
|
+
* - `_omTag` is strictly increasing along the `next` chain.
|
|
113
|
+
* - `_omTag` values are arbitrary integers but always orderable.
|
|
114
|
+
* - Insert renumbers all trailing nodes to maintain monotonicity.
|
|
115
|
+
*
|
|
116
|
+
* @internal
|
|
117
|
+
*/
|
|
118
|
+
export declare class NaiveOrderMaintenance implements OrderMaintenance {
|
|
119
|
+
private firstNode;
|
|
120
|
+
private nodeCount;
|
|
121
|
+
get size(): number;
|
|
122
|
+
/**
|
|
123
|
+
* Returns the first node in the order, or `null` if empty. Exposed
|
|
124
|
+
* for tests and for the priority queue's extract-min operation.
|
|
125
|
+
*
|
|
126
|
+
* @internal
|
|
127
|
+
*/
|
|
128
|
+
first(): OMNode | null;
|
|
129
|
+
init(): OMNode;
|
|
130
|
+
insertAfter(after: OMNode): OMNode;
|
|
131
|
+
delete(node: OMNode): void;
|
|
132
|
+
compare(a: OMNode, b: OMNode): number;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Bender, Cole, Demaine, Farach-Colton, Zito (2002): "Two simplified
|
|
136
|
+
* algorithms for maintaining order in a list." Algorithm 1 — list-
|
|
137
|
+
* labeling with exponentially-growing window relabel.
|
|
138
|
+
*
|
|
139
|
+
* Operations:
|
|
140
|
+
* - `compare`: O(1) integer subtract.
|
|
141
|
+
* - `insertAfter`: amortized O(log N) per operation (looser than the
|
|
142
|
+
* paper's O(1) amortized when using density bound (3/2)^d at depth d;
|
|
143
|
+
* we trade a log factor for simpler integer arithmetic and avoid
|
|
144
|
+
* BigInt).
|
|
145
|
+
* - `delete`: O(1).
|
|
146
|
+
*
|
|
147
|
+
* Cross-validated against `NaiveOrderMaintenance` via property fuzzer.
|
|
148
|
+
*
|
|
149
|
+
* @internal
|
|
150
|
+
*/
|
|
151
|
+
export declare class BenderOrderMaintenance implements OrderMaintenance {
|
|
152
|
+
private firstNode;
|
|
153
|
+
private nodeCount;
|
|
154
|
+
get size(): number;
|
|
155
|
+
first(): OMNode | null;
|
|
156
|
+
init(): OMNode;
|
|
157
|
+
insertAfter(after: OMNode): OMNode;
|
|
158
|
+
delete(node: OMNode): void;
|
|
159
|
+
compare(a: OMNode, b: OMNode): number;
|
|
160
|
+
/**
|
|
161
|
+
* Walk exponentially-growing windows around `pivot` until a window
|
|
162
|
+
* with low enough density to redistribute is found. Redistribute
|
|
163
|
+
* labels uniformly across that window.
|
|
164
|
+
*
|
|
165
|
+
* Density bound: `count * 2 ≤ span`. This guarantees:
|
|
166
|
+
* - Every node gets a distinct integer label (count ≤ span).
|
|
167
|
+
* - Each interval between consecutive labels has at least 2 units
|
|
168
|
+
* of room, so subsequent midpoint inserts succeed without
|
|
169
|
+
* triggering relabel again at the same depth.
|
|
170
|
+
*
|
|
171
|
+
* Window definition at depth d:
|
|
172
|
+
* span = 2^d
|
|
173
|
+
* tagLow = pivot._omTag aligned down to multiple of span
|
|
174
|
+
* tagHigh = tagLow + span
|
|
175
|
+
*
|
|
176
|
+
* Amortized cost: O(log N) per insert. (Tighter than the paper's
|
|
177
|
+
* O(1) amortized with density bound (3/2)^d, but the bound here uses
|
|
178
|
+
* pure integer arithmetic for V8-friendly speed.)
|
|
179
|
+
*
|
|
180
|
+
* @internal
|
|
181
|
+
*/
|
|
182
|
+
private relabel;
|
|
183
|
+
/**
|
|
184
|
+
* Fallback when the windowed relabel walks all the way up to the
|
|
185
|
+
* full label space without finding a sparse-enough window. Spreads
|
|
186
|
+
* every node uniformly across [0, LABEL_MAX).
|
|
187
|
+
*
|
|
188
|
+
* @internal
|
|
189
|
+
*/
|
|
190
|
+
private globalRelabel;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=order-maintenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-maintenance.d.ts","sourceRoot":"","sources":["../../../src/algorithm/spineless/order-maintenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;OAQG;IACH,IAAI,IAAI,MAAM,CAAC;IAEf;;;;;;;OAOG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAEnC;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAkBD;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,SAAS,CAAK;IAEtB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;OAKG;IACH,KAAK,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,MAAM;IAOd,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAyBlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkB1B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;CAKtC;AA0BD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,SAAS,CAAK;IAEtB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,MAAM;IASd,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAwBlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc1B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,OAAO;IAqDf;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CActB"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Order Maintenance (OM) data structure.
|
|
3
|
+
*
|
|
4
|
+
* Maintains a totally-ordered set of items under insertions, deletions,
|
|
5
|
+
* and `compare(a, b)` queries that return the relative order in O(1) (or
|
|
6
|
+
* O(1) amortized). Foundational primitive for Spineless Traversal
|
|
7
|
+
* (Kirisame, Wang, Panchekha — PLDI 2025): the priority queue that
|
|
8
|
+
* drives incremental layout invalidation is keyed on OM timestamps,
|
|
9
|
+
* so a fast OM comparator dominates per-operation cost.
|
|
10
|
+
*
|
|
11
|
+
* Reference: Bender, Cole, Demaine, Farach-Colton, Zito. "Two
|
|
12
|
+
* simplified algorithms for maintaining order in a list." ESA 2002.
|
|
13
|
+
*
|
|
14
|
+
* ## What this file ships
|
|
15
|
+
*
|
|
16
|
+
* **The interface** — `OMNode`, `OrderMaintenance` — is the surface the
|
|
17
|
+
* Spineless runtime will consume. We design it so the implementation
|
|
18
|
+
* can be swapped (naive ↔ Bender amortized O(1)) without ripple.
|
|
19
|
+
*
|
|
20
|
+
* **The naive implementation** — `NaiveOrderMaintenance` — uses a single
|
|
21
|
+
* doubly-linked list with sequential integer tags assigned on insert.
|
|
22
|
+
* Inserts trigger O(N) renumbering of trailing nodes. Compare is O(1).
|
|
23
|
+
*
|
|
24
|
+
* This is the **scaffolding implementation**: correct, simple, lets us
|
|
25
|
+
* write all the consumer code (priority queue, runtime, attribute grammar
|
|
26
|
+
* interpreter) without waiting for the optimized impl. The Bender et al.
|
|
27
|
+
* amortized-O(1) implementation lands as a drop-in replacement once the
|
|
28
|
+
* Spineless runtime is wired and we can benchmark end-to-end. The naive
|
|
29
|
+
* impl stays in tree forever as a reference oracle: every Bender op is
|
|
30
|
+
* differentially compared against naive in the property-based test.
|
|
31
|
+
*
|
|
32
|
+
* ## Why JS and not WASM
|
|
33
|
+
*
|
|
34
|
+
* The paper's reference (Megatron) emits C++ and uses inline `cmov` for
|
|
35
|
+
* branchless compare. We can't use inline assembly in JS, but we don't
|
|
36
|
+
* have to: V8 already lowers `a < b` on 32-bit-integer hidden classes
|
|
37
|
+
* to a branchless `cmp` + `setb` sequence on x86-64. The TS-side cost is
|
|
38
|
+
* predominantly in the `lookup` (Map.get) and the unboxed compare itself.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Naive O(N)-per-insert Order Maintenance. Correctness-only impl
|
|
44
|
+
* for scaffolding and as a fuzzer oracle for the future Bender impl.
|
|
45
|
+
*
|
|
46
|
+
* Invariants:
|
|
47
|
+
* - `_omTag` is strictly increasing along the `next` chain.
|
|
48
|
+
* - `_omTag` values are arbitrary integers but always orderable.
|
|
49
|
+
* - Insert renumbers all trailing nodes to maintain monotonicity.
|
|
50
|
+
*
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export class NaiveOrderMaintenance {
|
|
54
|
+
firstNode = null;
|
|
55
|
+
nodeCount = 0;
|
|
56
|
+
get size() {
|
|
57
|
+
return this.nodeCount;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the first node in the order, or `null` if empty. Exposed
|
|
61
|
+
* for tests and for the priority queue's extract-min operation.
|
|
62
|
+
*
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
first() {
|
|
66
|
+
return this.firstNode;
|
|
67
|
+
}
|
|
68
|
+
init() {
|
|
69
|
+
const first = { _omTag: 0, prev: null, next: null };
|
|
70
|
+
this.firstNode = first;
|
|
71
|
+
this.nodeCount = 1;
|
|
72
|
+
return first;
|
|
73
|
+
}
|
|
74
|
+
insertAfter(after) {
|
|
75
|
+
const afterNode = after;
|
|
76
|
+
const newNode = {
|
|
77
|
+
_omTag: afterNode._omTag + 1,
|
|
78
|
+
prev: afterNode,
|
|
79
|
+
next: afterNode.next,
|
|
80
|
+
};
|
|
81
|
+
if (afterNode.next !== null) {
|
|
82
|
+
afterNode.next.prev = newNode;
|
|
83
|
+
}
|
|
84
|
+
afterNode.next = newNode;
|
|
85
|
+
// Renumber trailing nodes to maintain strict monotonicity.
|
|
86
|
+
// O(N) worst case; this is the scaffolding-only cost the Bender
|
|
87
|
+
// impl removes.
|
|
88
|
+
let cursor = newNode.next;
|
|
89
|
+
let nextTag = newNode._omTag + 1;
|
|
90
|
+
while (cursor !== null) {
|
|
91
|
+
cursor._omTag = nextTag;
|
|
92
|
+
nextTag++;
|
|
93
|
+
cursor = cursor.next;
|
|
94
|
+
}
|
|
95
|
+
this.nodeCount++;
|
|
96
|
+
return newNode;
|
|
97
|
+
}
|
|
98
|
+
delete(node) {
|
|
99
|
+
const n = node;
|
|
100
|
+
if (n.prev !== null) {
|
|
101
|
+
n.prev.next = n.next;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.firstNode = n.next;
|
|
105
|
+
}
|
|
106
|
+
if (n.next !== null) {
|
|
107
|
+
n.next.prev = n.prev;
|
|
108
|
+
}
|
|
109
|
+
// Renumbering is not strictly required after delete (gaps in tags
|
|
110
|
+
// are harmless), but consistency with insertAfter's invariant
|
|
111
|
+
// (consecutive tags) simplifies reasoning. Skipped for now to
|
|
112
|
+
// avoid an extra O(N) walk; tests should not rely on consecutive
|
|
113
|
+
// tags after deletes.
|
|
114
|
+
this.nodeCount--;
|
|
115
|
+
}
|
|
116
|
+
compare(a, b) {
|
|
117
|
+
const ta = a._omTag;
|
|
118
|
+
const tb = b._omTag;
|
|
119
|
+
return ta - tb;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// --- Bender et al. 2002 Algorithm 1 (list-labeling with windowed relabel) ---
|
|
123
|
+
/**
|
|
124
|
+
* Label space. Labels live in `[0, LABEL_MAX)`. Using 2^30 keeps every
|
|
125
|
+
* arithmetic op (midpoint, double, mask) in V8's 31-bit SMI range, so
|
|
126
|
+
* the JIT lowers everything to native int instructions. At 2^30 we can
|
|
127
|
+
* host ~50M items before any global rebalance is forced — far above
|
|
128
|
+
* typical TUI scale.
|
|
129
|
+
*
|
|
130
|
+
* @internal
|
|
131
|
+
*/
|
|
132
|
+
const LABEL_MAX = 1 << 30;
|
|
133
|
+
/**
|
|
134
|
+
* Bender, Cole, Demaine, Farach-Colton, Zito (2002): "Two simplified
|
|
135
|
+
* algorithms for maintaining order in a list." Algorithm 1 — list-
|
|
136
|
+
* labeling with exponentially-growing window relabel.
|
|
137
|
+
*
|
|
138
|
+
* Operations:
|
|
139
|
+
* - `compare`: O(1) integer subtract.
|
|
140
|
+
* - `insertAfter`: amortized O(log N) per operation (looser than the
|
|
141
|
+
* paper's O(1) amortized when using density bound (3/2)^d at depth d;
|
|
142
|
+
* we trade a log factor for simpler integer arithmetic and avoid
|
|
143
|
+
* BigInt).
|
|
144
|
+
* - `delete`: O(1).
|
|
145
|
+
*
|
|
146
|
+
* Cross-validated against `NaiveOrderMaintenance` via property fuzzer.
|
|
147
|
+
*
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
export class BenderOrderMaintenance {
|
|
151
|
+
firstNode = null;
|
|
152
|
+
nodeCount = 0;
|
|
153
|
+
get size() {
|
|
154
|
+
return this.nodeCount;
|
|
155
|
+
}
|
|
156
|
+
first() {
|
|
157
|
+
return this.firstNode;
|
|
158
|
+
}
|
|
159
|
+
init() {
|
|
160
|
+
// Start label at the middle of the space so first inserts have room
|
|
161
|
+
// both before (via the global rebalance path) and after.
|
|
162
|
+
const first = { _omTag: LABEL_MAX >> 1, prev: null, next: null };
|
|
163
|
+
this.firstNode = first;
|
|
164
|
+
this.nodeCount = 1;
|
|
165
|
+
return first;
|
|
166
|
+
}
|
|
167
|
+
insertAfter(after) {
|
|
168
|
+
const pred = after;
|
|
169
|
+
const succ = pred.next;
|
|
170
|
+
const succLabel = succ === null ? LABEL_MAX : succ._omTag;
|
|
171
|
+
const predLabel = pred._omTag;
|
|
172
|
+
// Midpoint between predecessor and successor labels. Integer-only.
|
|
173
|
+
const newLabel = (predLabel + succLabel) >> 1;
|
|
174
|
+
const newNode = { _omTag: newLabel, prev: pred, next: succ };
|
|
175
|
+
pred.next = newNode;
|
|
176
|
+
if (succ !== null)
|
|
177
|
+
succ.prev = newNode;
|
|
178
|
+
this.nodeCount++;
|
|
179
|
+
if (newLabel === predLabel) {
|
|
180
|
+
// No room between pred and succ — trigger a windowed relabel.
|
|
181
|
+
// Relabel updates newNode._omTag (and others in the window) to
|
|
182
|
+
// spread out across available label space.
|
|
183
|
+
this.relabel(newNode);
|
|
184
|
+
}
|
|
185
|
+
return newNode;
|
|
186
|
+
}
|
|
187
|
+
delete(node) {
|
|
188
|
+
const n = node;
|
|
189
|
+
if (n.prev !== null) {
|
|
190
|
+
n.prev.next = n.next;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.firstNode = n.next;
|
|
194
|
+
}
|
|
195
|
+
if (n.next !== null) {
|
|
196
|
+
n.next.prev = n.prev;
|
|
197
|
+
}
|
|
198
|
+
this.nodeCount--;
|
|
199
|
+
// Delete only creates extra label room; no rebalance needed.
|
|
200
|
+
}
|
|
201
|
+
compare(a, b) {
|
|
202
|
+
return a._omTag - b._omTag;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Walk exponentially-growing windows around `pivot` until a window
|
|
206
|
+
* with low enough density to redistribute is found. Redistribute
|
|
207
|
+
* labels uniformly across that window.
|
|
208
|
+
*
|
|
209
|
+
* Density bound: `count * 2 ≤ span`. This guarantees:
|
|
210
|
+
* - Every node gets a distinct integer label (count ≤ span).
|
|
211
|
+
* - Each interval between consecutive labels has at least 2 units
|
|
212
|
+
* of room, so subsequent midpoint inserts succeed without
|
|
213
|
+
* triggering relabel again at the same depth.
|
|
214
|
+
*
|
|
215
|
+
* Window definition at depth d:
|
|
216
|
+
* span = 2^d
|
|
217
|
+
* tagLow = pivot._omTag aligned down to multiple of span
|
|
218
|
+
* tagHigh = tagLow + span
|
|
219
|
+
*
|
|
220
|
+
* Amortized cost: O(log N) per insert. (Tighter than the paper's
|
|
221
|
+
* O(1) amortized with density bound (3/2)^d, but the bound here uses
|
|
222
|
+
* pure integer arithmetic for V8-friendly speed.)
|
|
223
|
+
*
|
|
224
|
+
* @internal
|
|
225
|
+
*/
|
|
226
|
+
relabel(pivot) {
|
|
227
|
+
let depth = 1;
|
|
228
|
+
let span = 2;
|
|
229
|
+
while (true) {
|
|
230
|
+
// Find aligned window boundaries around the pivot's current label.
|
|
231
|
+
const mask = (LABEL_MAX - 1) ^ (span - 1);
|
|
232
|
+
const tagLow = pivot._omTag & mask;
|
|
233
|
+
const tagHigh = tagLow + span;
|
|
234
|
+
// Find leftmost node in the window by walking back from pivot.
|
|
235
|
+
let firstInWindow = pivot;
|
|
236
|
+
while (firstInWindow.prev !== null && firstInWindow.prev._omTag >= tagLow) {
|
|
237
|
+
firstInWindow = firstInWindow.prev;
|
|
238
|
+
}
|
|
239
|
+
// Count nodes in the window and collect them in-order.
|
|
240
|
+
const inWindow = [];
|
|
241
|
+
let cursor = firstInWindow;
|
|
242
|
+
while (cursor !== null && cursor._omTag < tagHigh) {
|
|
243
|
+
inWindow.push(cursor);
|
|
244
|
+
cursor = cursor.next;
|
|
245
|
+
}
|
|
246
|
+
const count = inWindow.length;
|
|
247
|
+
// Density bound: redistribute only when there's at least 2x
|
|
248
|
+
// headroom in the window. This guarantees distinct labels +
|
|
249
|
+
// future-insert room without immediate re-relabel.
|
|
250
|
+
if (count * 2 <= span) {
|
|
251
|
+
const step = Math.max(1, (span / count) | 0);
|
|
252
|
+
// Center the assigned range: leave equal padding at both ends.
|
|
253
|
+
const used = (count - 1) * step + 1;
|
|
254
|
+
const startPad = Math.max(0, (span - used) >> 1);
|
|
255
|
+
let label = tagLow + startPad;
|
|
256
|
+
for (const node of inWindow) {
|
|
257
|
+
node._omTag = label;
|
|
258
|
+
label += step;
|
|
259
|
+
}
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// Window overcrowded — expand. Doubling depth doubles span.
|
|
263
|
+
// If span exceeds the label space, fall back to a global relabel.
|
|
264
|
+
depth++;
|
|
265
|
+
span <<= 1;
|
|
266
|
+
if (span >= LABEL_MAX) {
|
|
267
|
+
this.globalRelabel();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Fallback when the windowed relabel walks all the way up to the
|
|
274
|
+
* full label space without finding a sparse-enough window. Spreads
|
|
275
|
+
* every node uniformly across [0, LABEL_MAX).
|
|
276
|
+
*
|
|
277
|
+
* @internal
|
|
278
|
+
*/
|
|
279
|
+
globalRelabel() {
|
|
280
|
+
const all = [];
|
|
281
|
+
let cursor = this.firstNode;
|
|
282
|
+
while (cursor !== null) {
|
|
283
|
+
all.push(cursor);
|
|
284
|
+
cursor = cursor.next;
|
|
285
|
+
}
|
|
286
|
+
const stride = Math.max(1, (LABEL_MAX / (all.length + 1)) | 0);
|
|
287
|
+
let label = stride;
|
|
288
|
+
for (const node of all) {
|
|
289
|
+
node._omTag = label;
|
|
290
|
+
label += stride;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=order-maintenance.js.map
|