Implementation Roadmap¶
The tier-1 canon (64 must-implement references from REFERENCES.md), staged by version. Checked items ship in the current release (v0 also ships MSA and all-or-nothing as baselines).
Version staging: v0 core harness + link-based solvers -> v0.x accelerated FW, logit SUE, Anaheim/Barcelona/Winnipeg rungs (this release; plugin registry and profiles still open) -> v1 bush-based solvers, SUE variants, static extensions, T2 estimation track -> v2 DTA, network loading, engine adapters, day-to-day, T3 interventions.
Foundations — v0-v1 (formulations underpin metrics)¶
[x] Wardrop (1952) — Some Theoretical Aspects of Road Traffic Research (metric/protocol) — shipped in v0 (equilibrium conditions in the certified gap)
[x] Beckmann et al. (1956) — Studies in the Economics of Transportation (white-box solver) — shipped in v0 (Beckmann objective in metrics)
[x] Bureau of Public Roads (1964) — Traffic Assignment Manual (network-loading component) — shipped in v0 (BPR link performance function (Network.link_cost))
[x] Dafermos (1972) — The Traffic Assignment Problem for Multiclass-User Transportation Networks (white-box solver) — shipped as
multiclass(adr-013)[ ] Smith (1979) — The Existence, Uniqueness and Stability of Traffic Equilibria (metric/protocol)
[x] Dafermos (1980) — Traffic Equilibrium and Variational Inequalities (white-box solver) — shipped as
vi-asym
Link-based UE algorithms — v0 (FW, MSA) / v0.x (CFW, BFW)¶
[x] Frank & Wolfe (1956) — An Algorithm for Quadratic Programming (white-box solver) — shipped in v0 (Frank-Wolfe solver)
[x] LeBlanc et al. (1975) — An Efficient Approach to Solving the Road Network Equilibrium Traffic Assignment Problem (white-box solver) — shipped in v0 (Frank-Wolfe solver)
[x] Boyce et al. (2004) — Convergence of Traffic Assignments: How Much Is Enough? (metric/protocol) — shipped in v0.x (convergence target protocol (Budget.target_relative_gap))
[x] Mitradjieva & Lindberg (2013) — The Stiff Is Moving—Conjugate Direction Frank-Wolfe Methods with Applications to Traffic Assignment (white-box solver) — shipped in v0.x (conjugate and bi-conjugate FW solvers)
Path/bush-based UE algorithms — v1¶
[x] Jayakrishnan et al. (1994) — A faster path-based algorithm for traffic assignment (white-box solver) — shipped in v1 (path-based gradient projection solver (gp))
[x] Bar-Gera (2002) — Origin-based algorithm for the traffic assignment problem (white-box solver) — shipped as
oba(origin-based M/D-label proportion solver)[x] Dial (2006) — A path-based user-equilibrium traffic assignment algorithm that obviates path storage and enumeration (white-box solver) — shipped in v1 (Algorithm B bush-based solver (algb))
[x] Bar-Gera (2010) — Traffic assignment by paired alternative segments (white-box solver) — shipped in v1 (TAPAS paired-alternative-segment solver (tapas) + proportionality diagnostic (ADR-004))
Stochastic UE & route choice — v0.x (Dial, logit-SUE MSA) / v1 (probit)¶
[x] Dial (1971) — A probabilistic multipath traffic assignment model which obviates path enumeration (network-loading component) — shipped in v0.x (STOCH loading map (models/_stoch.py))
[x] Daganzo & Sheffi (1977) — On stochastic models of traffic assignment (white-box solver) — shipped in v1 (SUE definition underlying the probit task)
[x] Fisk (1980) — Some developments in equilibrium traffic assignment (white-box solver) — shipped in v0.x (logit SUE task (fixed-point certificate, ADR-001))
[x] Powell & Sheffi (1982) — The convergence of equilibrium algorithms with predetermined step sizes (white-box solver) — shipped in v0.x (MSA-SUE solver step sizes)
[x] Sheffi & Powell (1982) — An algorithm for the equilibrium assignment problem with random link times (white-box solver) — shipped in v1 (probit SUE solver (sue-probit-msa) + MC certificate (ADR-003))
System optimum & pricing — v1¶
[x] Yang & Huang (1998) — Principle of Marginal-Cost Pricing: How Does It Work in a General Road Network? (white-box solver) — shipped in v1 (first-best marginal-cost tolls (metrics.so))
[x] Roughgarden & Tardos (2002) — How Bad Is Selfish Routing? (metric/protocol) — shipped in v1 (price-of-anarchy protocol + certified SO gap)
Static extensions — v1¶
[x] Florian & Nguyen (1974) — A Method for Computing Network Equilibrium with Elastic Demands (white-box solver) — shipped in v1 (elastic (variable) demand UE task/problem (ADR-005))
[x] Evans (1976) — Derivation and analysis of some models for combining trip distribution and assignment (white-box solver) — shipped as
evans(ADR-007)[x] Mahmassani & Chang (1987) — On Boundedly Rational User Equilibrium in Transportation Systems (route-choice component) — shipped as
br-ue(indifference-band relaxation, ADR-008)[x] Spiess & Florian (1989) — Optimal strategies: A new assignment model for transit networks (white-box solver) — shipped as
transit-strategy(adr-014, paralleltransit/module)[x] Larsson & Patriksson (1995) — An augmented Lagrangean dual algorithm for link capacity side constrained traffic assignment problems (white-box solver) — shipped as
sc-tap(ADR-009)
Analytical DTA — v2¶
[x] Vickrey (1969) — Congestion Theory and Transport Investment (white-box solver) — shipped as
vickrey(adr-019, the first departure-time equilibrium — a parallelbottleneck/module with a closed-form UE/SO and a P1 certifier that recomputes the point queue + generalized costs from the emitted departure curve;equilibrium_gap=0for the UE, PoA=2)[x] Merchant & Nemhauser (1978) — A Model and an Algorithm for the Dynamic Traffic Assignment Problems (white-box solver) — shipped as
merchant-nemhauser(adr-020, the first network DTA model — a paralleldta/module: exit-function scenario, Carey(1987)-relaxed canonical LP with terminal clearance, and a P1 certifier that recomputes conservation/node-balance/exit-bounds/cost, resolves the LP optimum harness-side, and arithmetically verifies emitted LP-duality certificates; two hand-derived anchors incl. one where holding back is strictly optimal)[x] Friesz et al. (1993) — A Variational Inequality Formulation of the Dynamic Network User Equilibrium Problem (white-box solver) — shipped as
vi-due(adr-022, the simultaneous route-and-departure-time DUE closing the analytical-DTA track — the Friesz VI instantiated with generalized-Vickrey point-queue loading on parallel routes: exact closed form C=(δN+αΣs·f)/Σs with greedy used-set, single-route f=0 reduction certified by the adr-019 BottleneckEvaluator at 1e-13, and a P1DUEEvaluatorwhose marginal-insertion reference scan catches the all-on-one-route false equilibrium the single-route certifier cannot see)[x] Ziliaskopoulos (2000) — A Linear Programming Model for the Single Destination System Optimum Dynamic Traffic Assignment Problem (white-box solver) — shipped as
lp-so-dta(adr-021, cell-level SO-DTA with finite storage/spillback — the CTM min-flux relaxed to four linear families overCellSODTAScenario; hand-derived diverge/spillback anchor J*=26 via the storage pair lemma, holding-on-the-optimal-face demonstrated, and the corridor LP == the repo’s ownCTMLinkloading exactly; P1CellSODTAEvaluatorwith the adr-020 hardening + LP-duality certificates)
Dynamic network loading — v2¶
[x] Newell (1993) — A simplified theory of kinematic waves in highway traffic, part I: General theory (network-loading component) — shipped as
newell-3det(adr-024, the interior minimum-principle three-detector reconstruction — the benchmark’s FIRST traffic-state-estimation task: given noisy/partial boundary detector curves, reconstruct the interior cumulative fieldN(x,t) = min(N_up(t−x/vf), N_dn(t−(L−x)/w) + κ(L−x))at a fixed hashed query grid, scored against the harness-regenerated closed-form min. Newell’s LOADING content — the minimum principle at the link ENDS — already shipped asltm(adr-016), so this ships the unshipped INTERIOR content, NOT a thirdLinkModel; the oracle and certifier are the paper’s minimum principle, the observation dials are the repo’s own P3 conventions (the paper contains no estimation numerics), and the clean level is an oracle row (ranking lives on the noisy levels where the naive/isotonic pair discriminates))[x] Daganzo (1994) — The cell transmission model: A dynamic representation of highway traffic consistent with the hydrodynamic theory (network-loading component) — shipped as
ctm(adr-015, the first DNLLinkModelon the dnl-core; Godunov cell dynamics at CFL=1, free-flow translation bit-exact + RH shock/spillback anchors)[ ] Daganzo (1995) — The cell transmission model, part II: Network traffic (network-loading component)
[x] Lebacque (1996) — The Godunov scheme and what it means for first order traffic flow models (network-loading component) — shipped as
godunov(adr-018,GodunovLink+GreenshieldsFD; the general-FD Godunov scheme on the first non-triangular FD — the first rarefaction physics in the benchmark, CTM being its triangular special case)[x] Yperman (2007) — The Link Transmission Model for dynamic network loading (network-loading component) — shipped as
ltm(adr-016, the second DNLLinkModel; stateless Newell-Daganzo cumulative-curve method, matches CTM byte-for-byte on aligned grids + runs on non-cell-aligned grids CTM rejects)[x] Tampère et al. (2011) — A generic class of first order node models for dynamic macroscopic simulation of traffic flows (network-loading component) — shipped as
node-model(adr-017,TampereNode; the general merge/diverge solver — oriented-capacity-proportional with FIFO, satisfies node axioms N1–N6 — that unlocks network loading forctm/ltm)
Simulation-based DTA & software — v2 (adapters)¶
[ ] Jayakrishnan et al. (1994) — An evaluation tool for advanced traffic information and management systems in urban networks (black-box wrapper) — adapter path deferred (adr-030): FHWA DYNASMART-P is McTrans/FHWA-licensed with no public artifact, which bars a public CI row; the Peeta & Mahmassani (1995) white-box SO/UE time-dependent row below needs no binary and stays live
[x] Peeta & Mahmassani (1995) — System optimal and user equilibrium time-dependent traffic assignment in congested networks (white-box solver) — shipped as
pm-td-ue/pm-td-so(paralleltdta/module, adr-031): the first iterative, simulation-based time-dependent route-choice equilibrium in the benchmark — fixed-departure TD-UE and its TD-SO twin, MSA over an enumerated per-OD path set, the repo’s own CTM/LTM loading substituted for the licensing-deferred DYNASMART (adr-030) as the constraint evaluator.TDPathFlowscarries only the decision variable (per-path, per-departure-interval flow); the harness reruns its own per-path loading (a private first link per path +TampereNodemerges, on an interior-diverge-free topology that keeps per-commodity experienced times exactly decidable) and scorestdue_gap(the experienced-time route-swap residual, 0 iff the discrete Wardrop conditions hold) andso_bound_gap((TSTT − Z*)/Z*against thelp-so-dtaLP optimum on the CTM-cell instance derived from the same grid). Anchors derived from scratch (the paper’s 50-node DYNASMART numerics are engine-bound/irreproducible): a single-path corridor whose loaded TSTT equals the ADR-021zil_corridoroptimum 33 exactly through the new code path, a symmetric diamond whose exact TD-UE certifiestdue_gap=0(all-on-one control 0.75), an SO≠UE wedge where the SO split attains the LP bound and beats UE TSTT (23 < 24 — the paper’s headline made executable), a merge for attribution,ltm==ctm, and the aggregate loader passingdnl_gapsC0–C8. Primary READ IN FULL (a first for a DTA row); the MSA solvers are non-certified (the certifier arbitrates). Single class, fixed departures, NOT rolling-horizon (reserved for the TR-C sibling)[ ] Ben-Akiva et al. (2001) — Network State Estimation and Prediction for Real-Time Traffic Management (black-box wrapper) — deferred (adr-030): no public DynaMIT artifact exists to adapt (historically distributed by the MIT ITS Lab on request; the successor SimMobility is public but SPDX
NOASSERTION) — artifact-blocked until upstream publishes one[x] Zhou & Taylor (2014) — DTALite: A queue-based mesoscopic traffic simulator for fast model evaluation and calibration (black-box wrapper) — shipped as
dtalite-tap(the second external engine; behind the optionalDTALiteextra, guarded-imported so the numpy/scipy core stays dependency-free, with a fifth CI job pinningDTALite==0.8.1): the PyPIDTALitewheel’s static Frank-Wolfeassignment()(a Bar-GeraFW.zip-derived TAPLite loop, NOT the 2014 paper’s mesoscopic queue DUE, which is the separatesimulation()entry — now shipped on the observational track asdtalite-simulation, adr-040), wrapped by compiling a fixed-demand scenario into GMNS CSVs (dtalite_tap.py) whose per-linkvdf_fftt/vdf_alpha/vdf_betamap the repo BPRt = fft·(1 + b·(v/cap)^power)EXACTLY — the compile map is the identity, so unlike marouter there is no mapping floor and BPRpower=4encodes directly. The emitted flows are certified under the declared BPR (P1): Braessrelative_gap ≈ 1.2e-2and Sioux Falls power-4≈ 5.0e-3, both frozen at the engine’s Armijo line-search stall (the honest ceiling — the wheel-engine-as-shipped, not the mapping; a convergedbfwbeats it by orders of magnitude), with a MANDATORY cost-matched anchor proving the engine’s owntravel_timeequals the repo BPR at the emitted flows on every link (max relative ~2e-5, the identity map’s payoff). The first external engine on the power-4 ladder (Sioux Falls, the marquee — marouter’s linear vdf refused it). The subprocess wrapper is mandatory (the engine’sExitMessagedoesgetchar()+exit()in-process — a bad input would hang or kill the host — and a second call in one process doubles the flows), the module neverimportsDTALiteat scope (banner + in-host OpenMP load), and a read-back verifies the engine parsed every VDF parameter as declared (returncode==0is never trusted — the engine exits 0 on missing/garbage input). Refused traps named by field: tolls (unvalidatedvotconversion),sue_theta/elastic/combined/br/side-cap/link-interaction/multiclass, and ansp_calls-only budget.zhou2014dtaliteanchors the software lineage (tool-paper discipline, the lopez2018 precedent) — the row validates ADAPTER + engine fidelity, never the paper’s numerics (ADR-029). A SECOND DTALite row now ships from the same wheel —dtalite-simulation, the third EDOC-1 external-dynamic observational row (ADR-036 certificate + ADR-040 row, closing thesimulation()honest-sourcing loop and the first deterministic-track external row): the 2014 paper’s actual mesoscopic queue-DNLsimulation()(Zhou & Taylor 2014), a sub-secondvehicle.csv → trajectory.csvmap where there is no declared cost law, so the engine IS the instance and the certifier re-derives the score by re-running the pinnedOMP_NUM_THREADS=1engine on the model’s emitted MSA plans (G1 replay fidelity, byte-exact ontrajectory.csv). It scores the frozen-field best-response gapRG_D1(shipped estimator, 2026-07-17: converged 0.05031 vs the step-0 Frank-Wolfe split 0.37224, 7.40× floor-displayed separation — declared ≥ 5×), which is NOT the Wardroprelative_gapofdtalite-tap(same wheel, different engine) nor ofsumo-marouter, and lives on the same separate EDOC leaderboard table as the other observational rows (R8 non-comparability). The engine re-seeds an LCG per time step so it consumes no seed (seedable=False,seed_list=(), no macroreps — the deterministic track, disclosed); byte-determinism pinned on linux-x86_64. Its tutorial notebook ships with the11-externaltutorials track (06-dtalite-simulation.ipynb). A THIRD DTALite row now ships from the same wheel —odme-dtalite, a guarded static T2 ESTIMATOR (ADR-042): the wheel hides an Origin-Destination Matrix Estimation routine (performODME) INSIDE the same staticassignment()entrydtalite-tapwraps (it fires whensettings.csvcarriesodme_mode=1), a gradient-descent OD calibrator that re-weights the base assignment’s route-flows to match sensorobs_volumecounts. It ships as a guarded estimator inESTIMATOR_REGISTRYriding the EXISTING pinned-bfwODCertifierUNCHANGED (the adr-028 zero-certifier-change ideal, thespsa-sumoprecedent — emit an OD, the model-blind certifier re-assigns it under the declared BPR; zero task/runner/certifier changes). Marquee (measured, siouxfalls power-4, sensors cov 0.5 / stale prior cv 0.3): the certifier reportsobs_count_rmse994.8→365.3 (0.37×) and the rankingheldout_count_rmse816.5→556.6 (0.68×) over the prior baseline, with the ODME descent running 69 gradient iterations (a real “estimator beats prior” row, not a no-op). The engine envelope is disclosed as a pinned-0.8.1 identity (the marouter-vdf precedent):route_output=1is REQUIRED (with the leanroute_output=0the ODME reconstruction collapses and inflates the OD +40 %, measured — the non-obvious pilot finding); a hardcoded[0.5,1.5]×-of-(seed,target) recovery box (demand_target_fracis a documented one-sided widening dial); hardcoded penalty weights + an ABSOLUTEtol=1convergence floor (so the marquee MUST be Sioux-Falls-scale, not Braess, to clear it); andlink_performance.csvis CORRUPTED underodme_mode=1, so the OD is sourced EXCLUSIVELY fromod_performance.csv(never the T1 adapter’sodme_mode=0cost-match/mass gates). Anti-laundering holds by construction (the certifier reads only the emitted OD, never DTALite’s rosy self-report — measured self 8 vs certified 365, the engine-in-the-loop bias). Single-mode demand-only (multiclass ODME viamode_type.csvdeferred); additive, golden Braess hashcf00f411…byte-identical; rides the existingdtaliteCI job. Its tutorial notebook ships with the03-estimationtrack (09-odme-dtalite.ipynb).[x] Horni et al. (2016) — The Multi-Agent Transport Simulation MATSim (black-box wrapper) — shipped as
matsim(the third external engine and the second EDOC-1 observational row — adr-036 certificate / adr-039 row, superseding the adr-030 deferral): the first agent-based, first stochastic-track external engine. The adr-030 blocker stands in its own terms — QSim has NO static latency function, so the A2 cost-matched anchor stays impossible in kind; A2’s role is instead played by the pinned engine itself under G1 replay fidelity (lastIteration = firstIterationon the emitted plans is a zero-replanning replay), and the certifier re-derives the frozen-field best-response gapRG_D1entirely from its own replay events (per-link flows from entered-link + vehicle-enters-traffic events;output_links.csvis never a flow source — it undercounts the arrival link to zero, measured). Java-only engine with no pip extra (PyPImatsimis an unrelated neuronal simulator, adr-030): pinnedmatsim-2025.0-release.zip(md5c65f35ea…) on Temurin 21.0.11+10, addressed only viaTABENCH_MATSIM_HOME/TABENCH_JAVA_HOME, with a dedicated CI job installing both against hard checksums (md5/sha256 verified before unzip). Scored on the R5 stochastic track — the P8 macrorep harness (tabench.edoc.macrorep) over the pinned 5-seed list, meanRG_D1+ bootstrap CI; measured reference (shipped estimator, 2026-07-17): converged mean 0.0861 (CI [0.071, 0.102]) vs the deterministic AON control 0.4591 → 5.33× displayed-value negative-control separation;numberOfThreads=1pinned in global/qsim/eventsManager — the same-timestamp event-tie permutation is a measured multithreading artifact (the corrected R10 record, adr-039), and the G1 hash is the tie-sorted canonical stream.RG_D1is a frozen-field BR gap w.r.t. the engine’s own frozen realized field, NOT the static Wardroprelative_gap— it lives on a separate leaderboard table (R8) and is never compared to the static rows. Tutorial:tutorials/11-external/05-matsim.ipynb[x] Lopez et al. (2018) — Microscopic Traffic Simulation using SUMO (black-box wrapper) — shipped as
sumo-marouter(the first Phase-4 external-simulator adapter; behind the optionaleclipse-sumoextra, guarded-imported so the numpy/scipy core stays dependency-free, with a fourth CI job pinningeclipse-sumo==1.27.1): SUMO’s macroscopicmarouterSUE assignment, wrapped by compiling a fixed-demandpower=1scenario into a SUMO network (_sumo_io.py) whose edges match the repo BPR to machine precision on representable links — marouter’s cost law is a hardcoded linear-in-flow class function (PTV-Validate / VISUM-Cologne, not the ITSC paper), so two representability floors are documented and measured (a forced intercepteps=B·(200/6)/son zero-intercept links, a parasitic slopeA·K·s/Con zero-slope links). The per-edge flows are certified under the declared BPR costs (P1): Braessrelative_gap ≈ 1.7e-4(the analytic mapping floor), with a MANDATORY cost-matched anchor separating that floor from solver error. The certified row is act four of the accuracy-vs-certificate story — an industrially converged assignment, perfectly demand-feasible, that certifies a real small gap: the first number for the simulator-to-benchmark model gap practitioners implicitly set to zero (ADR-027). The refused traps are documented: marouter’sUEsilently falls back to SUE, its DEFAULTincrementalis non-equilibrium, and BPRpower!=1(Sioux Falls) is UNREPRESENTABLE in its linear vdf. This overturns the earlier “cannot validate in CI” assumption — the eclipse-sumo wheel ships the binaries inside the package, so the row is fully CI-validated. A SECOND SUMO row now ships from the same wheel —sumo-duaiterate, the first EDOC-1 external-dynamic observational row (ADR-036 certificate + ADR-037 row, resolving the ADR-027duaIteratedeferral): SUMO’s dynamic mesoscopic user-assignment driverduaIterate.py, where there is no declared cost law, so the engine IS the instance and the certifier re-derives the score by re-running the pinned engine in zero-replanning replay (G1) on the model’s emitted plans. It scores the frozen-field best-response gapRG_D1(measured converged ≈ 0.02 vs an AON negative control ≈ 0.14, ~6.5× separation), which is NOT the Wardroprelative_gapofsumo-marouterand lives on a separate leaderboard table (R8 non-comparability). Its tutorial notebook ships with the11-externaltutorials track.
Day-to-day dynamics — v2¶
[x] Horowitz (1984) — The stability of stochastic equilibrium in a two-link transportation network (white-box solver) — shipped as
dtd-horowitz(the perceived-cost-state day-to-day model: travelers carry a perceived link-cost vector exponentially smoothed toward the experienced costsp ← (1−w)p + w·t(v)and logit-load at it via the pinned Dial-STOCH map, reaching the same logit-SUE fixed point assue-msa/dtd-swap-sue; certified by the existing logit-SUE fixed-point residual (ADR-001, no new scenario field); uniquely among the day-to-day models NO damping is added, so above the task-dependent stability thresholdw* ≈ 0.81the process settles into a period-2 limit cycle instead of converging — the very (in)stability Horowitz set out to study)[x] Smith (1984) — The stability of a dynamic model of traffic assignment — an application of a method of Lyapunov (white-box solver) — shipped as
dtd-swap(first day-to-day model)[x] Cascetta (1989) — A stochastic process approach to the analysis of temporal dynamics in transportation networks (white-box solver) — shipped as
dtd-stochastic(the benchmark’s first genuinely stochastic day-to-day model: a finite-population Markov chain — each dayN_od = max(1, round(population_scale·d_od))travelers per OD pair draw routes by multinomial sampling from the Dial-STOCH logit fractions at the exponentially smoothed perceived costsp ← (1−w)p + w·t(v), driven by the realized daily flow, so “equilibrium” is the chain’s stationary distribution, not a fixed point; daily flows keep a persistentO(1/√N)variability while the emitted burnt-in time average converges (ergodic theorem) to the stationary mean ≈ logit SUE (Davis & Nihan 1993 large-population limit); certified by the existing logit-SUE fixed-point residual (ADR-001, no new scenario field), which honestly floors at O(finite-population bias + sampling SE);deterministic=Falseroutes it onto the existing macrorep stochastic track; the exponential filter is the canonical Cantarella & Cascetta (1995) special case of Cascetta’s original m-day moving-average filter — a flagged, documented variant)[x] Friesz et al. (1994) — Day-to-day dynamic network disequilibria and idealized traveler information systems (white-box solver) — shipped as
dtd-friesz(route-flow-state day-to-day: the state is per-OD route flows evolved by the projected dynamical systemḣ = P_K(h, −c(h)), discretized by the Bertsekas & Gafni (1982) projection steph_{k+1} = P_K(h_k − α c(h_k)); because∂Z/∂h_p = c_pexactly for the Beckmann objectiveZ, this is projected gradient descent on Beckmann in route space, projecting the whole route-flow vector against today’s frozen costs at once (Jacobi) via an exact Euclidean simplex projection that conserves each OD’s demand every day; reaches the identical certified UE as the route-swapdtd-swapand the link-baseddtd-linkvia the same monotone Beckmann descent, certified by the standard UE relative gap — no new scenario field)[x] Cantarella & Cascetta (1995) — Dynamic processes and equilibrium in transportation networks: towards a unifying theory (white-box solver) — shipped as
dtd-unifying(the unifying-theory node realized as a per-scenario mode gate: one two-equation process — exponential cost-learning filterp ← (1−w)p + w·t(v)plus choice updatev ← v + αₙ(ChoiceLoad(p) − v)where a fractionαₙof travelers reconsiders at the forecast costs — whose choice map is the all-or-nothing best response on deterministic scenarios (fixed point = Wardrop UE, annealedα/nstep, standard relative-gap certificate) and the pinned Dial-STOCH logit load on SUE scenarios (fixed point = logit SUE, constantα, existing ADR-001 residual — no new scenario field); exact reductions regression-tested to float precision (stochasticα=1≡dtd-horowitz, deterministicw=1, α=1≡msa), and the re-derived joint(α, w)flip boundary(2−w)(2−α) = αw|φ′|confirms C&C’s headline on the anchor:(1,1)period-2 limit-cycles while either form of inertia — cost memory or choice inertia — restores convergence, reducing atα=1todtd-horowitz’s documentedw* ≈ 0.81)[x] He et al. (2010) — A link-based day-to-day traffic assignment model (white-box solver) — shipped as
dtd-link(link-flow-state day-to-day: the state is the aggregate link-flow vector, adjusted toward the frozen-cost proximal target projected onto the feasible link polytope; reaches the identical certified UE as the route-swapdtd-swapvia the same monotone Beckmann descent)[x] Smith & Watling (2016) — A route-swapping dynamical system and Lyapunov function for stochastic user equilibrium (white-box solver) — shipped as
dtd-swap-sue(logit-SUE sibling ofdtd-swap: the same proportional route-swap day-to-day dynamics driven by the Fisk-generalized costc_k + (1/θ) ln h_k, so the rest point is the logit stochastic user equilibrium (Fisk 1980), not deterministic UE; certified by the existing logit-SUE fixed-point residual (ADR-001, no new scenario field) with Fisk’s SUE convex objective as the monotone day-to-day Lyapunov function)[x] Li et al. (2024) — Wardrop Equilibrium Can Be Boundedly Rational: A New Behavioral Theory of Route Choice (white-box solver) — shipped as
dtd-cumlog(the cumulative-logit model — the first boundedly-rational logit day-to-day process whose limit is exact deterministic Wardrop UE at a finite exploitationr, filling the empty cell in the shipped matrix where every other logit-choice day-to-day row rests at SUE: travelers carry a per-OD route-valuation vectorsover column-generated working sets, choose by the logit mapp = softmax(−r s), and accumulate experienced route costss ← s + ηₜ c(p)(Eq. 6) — the one-line change from the classical successive-average schemes ← (1−ηₜ)s + ηₜ c(p)(Eq. 4, whose limit is the logit SUE) with a categorically different limit; theaccumulateflag makes that Remark 3 contrast executable on one instance and identical machinery — accumulation drives the UE gap to ~0 (f_A → 2.5) while averaging rests at the analytic binary-logit SUE to 6 digits (f_A → 2.3739 at r=1); certified by the standard UE relative gap (fixed point = Wardrop UE, no new scenario field, golden Braess hash byte-identical); the harmonic scheduleηₜ = 1/(t+1)converges for anyr(Theorem 1(i), asymptotically) while the constant schedule can diverge at a too-large step (preserved not damped) — Theorem 1(ii)’seta0 < 1/(2rL)is sufficient-only and the reportedeta_heuristic_scaleis a flow-independent step-scale reference, not that bound; the divergent cumulative valuations resolve Harsanyi’s instability — equal-cost WE routes carry unequal, finitely-differing valuations while dropped routes diverge — and its bounded rationality is process-level (the adjustment path is imperfect), disjoint frombr-ue’s concept-level indifference band (ADR-038 vs ADR-008); the primary was read in full, the strongest sourcing in the dtd family)
ML-based traffic assignment — v1 (baseline wrappers)¶
[x] Liu et al. (2023) — End-to-end learning of user equilibrium with implicit neural networks (black-box wrapper) — shipped as
implicit-ue-nn, the first torch model (optional[torch]extra, ADR-025). A lean variant (the TR-C primary is paywalled/unread; formulation cross-verified from the authors’ open hEART 2024 paper + two posters): a flow-monotone MLP cost head inside a differentiable logit route-choice fixed-point layer over PathEngine column-generated route sets, trained by an exact IMD/adjoint hypergradient on the synthetic-net family against bfw reference equilibria. Its emissionv = Δᵀhis demand-feasible by construction, so it clears the audit the ridge surrogate is censored by (act two of ADR-006: feasibility is architectural, equilibrium quality is not) — bfw still certifies a better gap at matched budget, and the held-out identifiability caveat is documented honestly. Anchors: A1 Braess identity(4,2,2,2,4)/route time 92, A2 IMD hypergradient vs central FD< 1e-5, A4 feasible=1 at random θ.[x] Rahman & Hasan (2023) — Data-Driven Traffic Assignment: A Novel Approach for Learning Traffic Flow Patterns Using Graph Convolutional Neural Network (black-box wrapper) — shipped in v1 (learned-model wrapper + a ridge reference surrogate (not the GCN itself) certified by P1 (learned-surrogate, ADR-006))
[x] Liu & Meidani (2024) — End-to-end heterogeneous graph neural networks for traffic assignment (black-box wrapper) — shipped as
het-gnn, the second torch model (same optional[torch]extra, ADR-026), closing Phase 3. A lean variant (the TR-C primary is paywalled/unread; formulation cross-verified with zero discrepancies from arXiv:2310.13193v3 + the NSF PAR accepted manuscript, both read in full): hand-rolled heterogeneous message passing (V/R-Encoder segment-softmax attention over real + virtual OD edges, plain-torch scatter — no torch-geometric) with size-agnostic node-kernel features[production, attraction, in/out-degree]replacing the paper’s non-permutation-equivariant|V|+2OD-row featurization (verified: 21.5 vs 1.1e-16 under relabeling — the property that lets one trained model transfer across graph sizes without the paper’s dummy-node homogenization), an edge-MLP flow/capacity-ratio head, and the paper’s composite loss(1.0, 0.005, 0.05)trained by plain backprop. Two harness-certified checkpoints: the paper-faithful raw emission (sp_calls=0) is censored — its conservation lossL_cis the L1 form of the harnessnode_balance_residual, 3–5 orders above tolerance (act three of ADR-006: soft conservation is not a constraint) — and a flagged repo-extension route-decode projects the raw flows onto the per-OD scaled-simplex product overimplicit-ue’s column-generated routes, earning a real certified gap. Honest held-out (scoped in-family):implicit-ue-nn’s learned-cost fixed point certifies a better gap than the GNN-regression+projection at matched route sets, and a converged solver beats both. Anchors: A2 raw-censored + decoded-feasible, A4 permutation equivariance1e-8, decode-as-projection + no-limit-cycle, in-family loss reduction + conservation ablation.[x] Xu et al. (2024) — A unified dataset for the city-scale traffic assignment model in 20 U.S. cities (data/scenario) — shipped as the cross-domain axis (ADR-033): 17 of 20 real US-city instances integrated download-on-demand (HTTP byte-range extraction of only the per-city AequilibraE trio from the CC-BY figshare zip; never vendored, per-file SHA-256), with Honolulu + San Francisco as CI-sized rungs. Shipped AS-PUBLISHED with the dataset’s wrong-centroid defect documented (demand injected at node ids
1..Z, not the tract centroids — the 3 excluded cities are named); the published AequilibraE flows are a loose reference (own gap ~1e-3), never a best-known oracle, and cross-solver TransCAD agreement is not claimed (the repo’s ownbfwgives cross-implementation agreement instead: Honolulu rgap 1.07e-4, correlation 0.99992).
Data, estimation & benchmarking — v1 (T2 estimation track)¶
[x] Van Zuylen & Willumsen (1980) — The most likely trip matrix estimated from traffic counts (white-box solver) — shipped in v1 (T2 entropy estimator (vzw-entropy, ADR-002))
[x] Cascetta (1984) — Estimation of trip matrices from traffic counts and survey data: A generalized least squares estimator (white-box solver) — shipped in v1 (T2 GLS estimator (gls, ADR-002))
[x] Spiess (1990) — A gradient approach for the O-D matrix adjustment problem (white-box solver) — shipped in v1 (T2 gradient OD adjustment (spiess, ADR-002))
[x] Spall (1992) — Multivariate stochastic approximation using a simultaneous perturbation gradient approximation (white-box solver) — shipped in v1 (T2 SPSA calibration baseline (spsa, ADR-002))
[x] Yang et al. (1992) — Estimation of origin-destination matrices from link traffic counts on congested networks (white-box solver) — shipped as
od-congested[x] Cascetta et al. (1993) — Dynamic Estimators of Origin-Destination Matrices Using Traffic Counts (white-box solver) — shipped as
od-dynamic-sim/od-dynamic-seq(adr-023, the within-day time-sliced OD estimator — the third leg of the T2 temporal triangle, distinct fromgls(time = replication) andod-kalman(time = day-to-day noise): the estimand is the(H, Z, Z)departure-slice profile, recovered from time-sliced link counts linked by a frozen exogenous free-flow two-interval-split lag mapM[l](congestion feedback out of scope,cascetta2001fixed), via the paper’s SIMULTANEOUS (all slices jointly, efficient) and SEQUENTIAL (slice-by-slice, earlier estimates frozen, online-capable but provably less efficient) GLS pair; a bfw-free EXACT linear certifier regenerates the full-network map from the hashed recipe and scores per-interval obs/held-out count RMSE (ranking =heldout_count_rmse) with descriptive OD/profile columns and an exact stacked-map identifiability report whose new edges are horizon truncation and cross-slice temporal confounding — the latter a genuinely new false-accept surface because held-out sensors share the lag structure; five hand-derived anchors including the fractional-lag instance where simultaneous strictly dominates sequential(128/35, 142/35)vs(16/5, 94/25)against truth(4,6)and a mean-collapse witness proving distinctness fromgls; additive, golden Braess hashcf00f411…byte-identical)[x] Balakrishna et al. (2007) — Offline calibration of dynamic traffic assignment: Simultaneous demand-and-supply estimation (black-box wrapper) — shipped as
spsa-sumo(adr-028, the first guarded T2 estimator: aSumoSPSAEstimator(SPSAEstimator)whose inner assignment oracle is the shippedsumo-marouteradapter (adr-027) — a subprocess production engine, not the repo’s own MSA — making the black-box simulator-in-the-loop calibration loop REAL and certified through the UNCHANGED pinned-bfw certifier (P1, zero task/runner/certifier changes; the certifier recomputes count-fit from the emitted OD regardless of which simulator produced it). Scope is demand-only on the unchangedEstimationTask: the paper’s JOINT demand+supply title contribution is honestly not shipped (it changes what truth is, needs a new emitted artifact + certificate surface — an entire task-family ADR of its own), and the “DTA” of the title is the paper’s setting (marouteris static, the within-dayduaIterateanalogue deferred; counts only, not speeds).marouterexposes no shortest-path count, sosp_callsis DISCLOSED as 0 via a_sp_cost_per_eval()hook (the fabricated-sp_callstrap) and ansp_calls-only budget is refused up front; one wall deadline threads all 2I+1 inner solves (a mid-loop engine RuntimeError aborts — crash discipline, neverfeasible=0); the P1 self-vs-certified honesty diff is reframed as the MEASURED simulator-in-the-loop bias (SPSA descendsmarouter’s mapped law, the certificate re-assigns under the declared BPR — the same ORDER as the ~1.7e-4/5.4e-4 mapping floor, not a hard bound), never estimator dishonesty. Demand is box-projected in BOTH the thesis’s evaluation step (parent-loop_project, so emitted==evaluated==in-box: the P1 fix a three-lens review confirmed) and the iterate step (_project_log, no frozen corner), via identity hooks that leave thespsarow byte-identical. 13 two-route-only tests (pinned-seed clean-count recovery with a loose improves-on-prior bound, a poisson negative-control disclosing that anchor’s noise fragility, delegated power/toll refusals, bit-reproducibility + macrorep divergence, wall-kill, the box-binding regression that fails under a clip-removal mutation, sparse checkpointing);spsa.pygains three behavior-identical hooks,cli.pypasses T2 iterations/wall_seconds through; additive, golden Braess hashcf00f411…byte-identical). The JOINT demand+supply title contribution is DEFERRED on a measured NEGATIVE — ADR-043, an ADR-only measured-deferral / under-identifiability record (the adr-030 precedent) on the BO4Mob D2 track: a sprint that set out to design+validate a separated-evidence joint certificate found, and independently reproduced, that the joint(demand, supply)estimand is UNDER-IDENTIFIED from counts+speeds. On congested3junctionthe naive “supply→speed, demand→counts” physical separation is REFUTED (every meso knob moves counts —tauffrel-L2 0.47; a demand error moves speeds ~2 mph mean / ~25 mph max), so BOTH observables are moved by BOTH estimands. The decisive reverse launder: a substantially wrong supply (tauff=0.90, ~20% off) with tuned demand (od=0.95) fits both channels tomax(count,speed)=0.0522(control at true OD/default supply reproducesmax=0.0000) — a third of the 0.155 an earlier draft mis-read as an “irreducible margin” over the supply axis alone (RETRACTED: that 0.155 was a single 1-D slice, not the estimator’s(OD,supply)move set). “Report both NRMSE channels, never combine” is thus necessary but NOT sufficient — a low pair does not imply correct demand OR correct supply, andheldout_speed_nrmseis a jointly-observed speed-fit column, not separated supply evidence. The scored row is DEFERRED (not authorized); the named unblocker is supply evidence taken where demand does not leak into speed — off-peak/uncongested-window speeds, a free-flow-speed measurement, or a supply-known controlled sub-instance — each UNMEASURED, requiring its own pilot. The design SUBSTRATE (composition/type-gate task, two-channel non-combining certifier, mandatorysupply_bounds, the dead-speed-path port, the swept-supply determinism result) is PRESERVED as what an unblocked row would build on, but is insufficient alone; sim→real is a hypothesis (engine drift + PeMS noise could make laundering EASIER). All numbers3junction/seed-0 only, not generalized; dual-benchmark R8/forbidden-clause carried)[x] Stabler et al. (2016) — Transportation Networks for Research (data/scenario) — shipped in v0.x (checksummed TNTP fetcher + 4 registered networks)
[x] Eckman et al. (2023) — SimOpt: A testbed for simulation-optimization experiments (metric/protocol) — shipped as
experiments.profiles(adr-032, the SimOpt diagnostics layer: progress curves, α-solve-time cdf/quantile solvability profiles, Moré-Wild data profiles, difference profiles, functional bootstrap bands, and a certifiedprofiles.jsonartifact — pure post-hoc arithmetic over already-certified rows, redeeming the P5/P6 progress-curve/solvability-profile promise with zero changes to any solver/certifier/runner. The machinery is defined in the companion Eckman et al. (2023) “Diagnostic Tools” (IJoC 35(2):350-367) and Moré & Wild (2009); strict-<crossing, censored-in-denominator cdfs, the SimOpt-exact exclusive β-quantile (checked againststatistics.quantiles, with a censoring-robust opt-in), inf-honest quantiles/bands/differences, the full-cross-design refusal for incongruent model sets, and the braess {msa:5, fw:24, bfw:4} α-solve anchor are pinned by ~48 closed-form tests; golden Braess hash byte-identical)[x] Ryu et al. (2025) — BO4Mob: Bayesian Optimization Benchmarks for High-Dimensional Urban Mobility Problem (data/scenario) — stage 1 shipped as the BO4Mob scenario family (ADR-034): the lab’s OWN NeurIPS-2025 D&B benchmark (
UMN-Choi-Lab/BO4Mob, MIT) — five San Jose freeway OD-estimation instances scored by NRMSE of mesoscopic-SUMO counts vs real Caltrans PeMS data, integrated as scenarios/data only under a central dual-benchmark honesty contract (never validation of TABench methods; the paper’s numbers never claimed reproduced — the shippedeclipse-sumo1.27.1 wheel drifts from the paper’s SUMO 1.12, a MEASUREDedgeDataschema change where meso dropsnVehContribbut BO4Mob’s ownarrived+leftconvention still holds, so the instances transfer and the values do not). Stage 1 = data availability + pipeline liveness only: a P9 commit-pinned per-file-SHA-256 fetcher for the four small instances (1ramp/2corridor/3junction/4smallRegion, < 1.2 MB of single-evaluation bundles) on a SEPARATE registry never in the CI-prefetchedREGISTRY, with5fullRegion(10,100 OD pairs, 74 MB, ~11 h/eval) registered metadata-only and refusing to fetch (a named HPC-only refusal); the pandas-free BO4Mob count/NRMSE transforms; and a guardedsumo-extra smoke test running od2trips + mesoscopic SUMO end-to-end on 1ramp (measured NRMSE 2.4325 with the load-bearingod_end_timeOD-window fill, byte-identical across seeds 0/1/2, ~0.41 s/run — pinned LOOSE, band 1.5–3.5, as engine-drift provenance, NOT a paper number). BO4Mob keys are NOTload_scenarioscenarios (a meso net with no BPR network and no true OD — data, never aScenario); NO task/certificate/estimator (thebo4mob_estimationT2 family with a pinned-engine held-out-date observational certificate is a NAMED stage-2 follow-up). Additive, no new dependency/CI job, golden Braess hashcf00f411…byte-identical. Stage 2 shipped as thebo4mob-estimationT2 family (ADR-041): a NEW T2 sibling family (the ADR-023 pattern, NOT a guarded estimator —EstimationTask/ODCertifier/run_estimation_experimentall hard-require a BPR network + true OD +bfwpin BO4Mob structurally lacks) scored by a D2 OBSERVATIONAL certificate — the harness re-runs the pinnedeclipse-sumo1.27.1 od2trips+meso pipeline ONCE on the EMITTED OD and scoresheldout_nrmse(the ranking column: the MEAN of BO4Mob’s count NRMSE over 13 same-hour-window06-07, different-DATE held-out real PeMS dates221009–221021; TRAIN = the anchor221008), equilibrium NEVER claimed (no true OD, no BPR, nobfw). Held-out is a SEPARATE checksummed on-demand panel (52 new SHA-256 pins) whose bytes/dates NEVER enter the task — only theirheldout_digestdoes (P7). Reusesassert_engine_pin(RAISES on engine drift) + the adr-027/029 subprocess discipline verbatim; deliberately does NOT reuse EDOC-1’sEdocEvaluator/G1 (no per-agent self-report — a category-error boundary). Demand-only; identifiability is provenance-only (no declared assignment for Hazelton’s rank test). Rides the EXISTINGsumoCI job (1ramp full certify + 2corridor/3junction liveness, ~24 s; 4smallRegion opt-in). Same dual-benchmark honesty contract on every surface (extended forbidden clause 3: does NOT reproduce BO4Mob’s own SPSA/BO leaderboard rankings)
The tier-1 rows are HAND-MAINTAINED: each is flipped to [x] with its
shipped annotation when its method ships. tools/generate_references.py
regenerates this skeleton from the verified canon references.json and carries
the SHIPPED dict forward — every shipped bibkey MUST stay in SHIPPED, or a
regen would uncheck its row. Use the generator to add NEW canon entries; do not
let it overwrite the hand-written shipped prose.