perf: make provenance/alias walks and multi-sort index-driven
Merged
LZ
5mo ago+1581+1581+0123456789012345678901234567890123456789-46-46-01234567890123456789
Measured impact (python benchmarks/perf.py)
Naive time ~quadruples per doubling (quadratic); optimized ~doubles (linear):
| op (n=1600) | naive | optimized | speedup |
|---|---|---|---|
cascade_retract (chain) | 123 ms | 2.4 ms | 51× |
get_alias_group (chain) | 176 ms | 0.5 ms | 355× |
get_dependents(transitive) | 106 ms | 0.85 ms | 125× |
| multi-sort (n=8000) | 26 ms | 5.2 ms | 5× |
The multi-sort win applies to every sorted query (it also dropped the test-suite runtime from ~1.6s to ~0.45s).
Summary by cubic
Made provenance and alias traversals and multi-sort index-driven to remove repeated full scans and per-node re-clones. This turns several quadratic paths into ~linear with up to 355× speedups while preserving behavior and event ordering. Added a full API.md reference and linked it from README.md.
-
Refactors
- Added
build_children_indexand used it incascade_retract,get_dependents(transitive), andexport_sliceto traverse once instead of rescanning. - Rewrote
cascade_retractto retract in a single pass (clone items once, lazy reverse-edge index) using post-order DFS; emits identical events and removes incident edges once. - Replaced
cmp_to_keycomparator with a tuple-key multi-sort for numeric fields; keeps stable ordering and speeds up all sorted queries. - Built one-shot ALIAS adjacency for
get_alias_groupandexport_slice(both directions) to avoid per-node edge scans while keeping traversal order.
- Added
-
New Features
- Added
API.mdfull API reference and linked it fromREADME.md. - Added micro-benchmarks and equivalence tests to validate behavior and measure speedups.
- Added