Beep Beep!
RoadRunner dense-S MTP β a negative result, published as one
12,986-parameter learned A* heuristic + multi-token (multi-hop) draft heads for Western Australia road routing β with the full measured frontier, including everything that didn't work. If you came for "NN beats A*": it doesn't, and this card shows exactly where and why.
Bottom line
| setup | gap mean/p90 | exp vs vanilla | end-to-end ms |
|---|---|---|---|
| vanilla euc A* | 0 / 0 | 1.0Γ | ~21.5 |
| dense-S fwd (crown) | 1.5% / 4.5% | 0.66Γ | ~19β25 |
| dense-S guided-bidir | 2.5% / 7.6% | 0.31Γ | ~14.5 (best small-gap point) |
| regime-S fwd (accuracy crown) | 0.78% / 1.8% | 0.97Γ | ~25 |
| greedy MTP rollout | 10.4% / 25% | β | 22.4, 0/195 pure (parked) |
| XS 4k-param probe | 4.2% / 11.9% | 3.17Γ | 42 (rejected) |
| learned MoE routing | 5.8% / 17% | 1.06Γ | β (collapsed, parked) |
Locked objective was path β€ 1.01Γ optimal and faster than vanilla single-query. That cell is still empty after dense/regime Γ fwd/bidir Γ w-sweep Γ admissibility-tune. Banked wins: 1.5Γ amortized throughput (many queries/target), 2.1Γ fewer expansions via guided-bidir.
Files
roadrunner-dense-s-mtp.onnx(52KB, FP32, opset 18, dynamic batch) β inputs(xc[B,17] float32, cls[B] int64)β(r[B], mtp[B,3,3], q[B,16]).h = euc + r*(euc+300),euc_s = hav_km/110*3600. FP32, not BF16: trained BF16-autocast, but ORT CPU BF16 is spotty and at 13KB precision is not the bottleneck. ORTβtorch parity ~5e-5.samples.npz(256 val positions: feats, torch refs, truth next/hops, 1-hop + capped-8 2-hop neighbourhood, projection weights) +meta.json.demo_mtp.pyβ numpy+ORT only. Replays pointer + MTP drafts on the bundle.
Quickstart
pip install onnxruntime numpy
python demo_mtp.py # needs only the .onnx + samples.npz in this folder
How MTP works here (and its honest limits)
Heads k=2,3,4 predict polar (sin,cos,logdist) of nodes 2β4 ahead, trained
discriminatively (CE over the base node's real neighbours by polar
distance β not global regression). Measured on the bundle: pointer acc
0.80, k2 snap-accept 137/256 forced vs 114/206 chained, mean accept 1.44
teacher-forced (repo sim_mtp.py).
Two findings worth knowing before you build on this:
- The heads are distance-uncalibrated by design. CE only needs ranking,
so
logdistparks at ~11 (β90,000 km vs ~0.5 km truth). All signal is in the angle (30Β° mean err vs 90Β° chance); the snap decode ranks by angular alignment. Do not read the vectors as displacements. - Teacher-forced accept β rollout stability. 0.75 pointer acc compounds
(0.75^174 β 0): greedy rollout reached the target on 0/195 val ODs
(repo
rollout.py). MTP's remaining form is subgoal jumps with exact fill, not free rollout.
Reproduce everything
Code + docs repo runs the full chain (parse β simplify β engine checks β
100k-OD teacher β train β val): see ARCHITECTURE.md there. Key scripts:
data/export_onnx.py (this bundle), data/rollout.py, data/bench_bidir.py,
src/train.py --freeze-base (MTP-head-only training that kept the crown).
Provenance / license note
Weights + demo + card in this repo: MIT. Road topology: Geofabrik WA OSM extract (ODbL β attribution retained above; derived graph/teacher data inherits share-alike, see source repo). Attribute side-data: Main Roads WA (CC-BY-4.0). Model code: see repo license.