Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode Skip to content
TABenchmark
TABenchmark

Overview

  • TABenchmark
  • TABenchmark Architecture
  • The TABenchmark Model Compendium
  • Numerical Validation
  • Implementation Roadmap
  • The TABenchmark Reference Canon
  • Contributing to TABenchmark

Tutorials

  • TABenchmark tutorials
  • aon — All-or-nothing assignment on the Braess network
  • msa — Method of successive averages (MSA) on the Braess network
  • fw — Frank–Wolfe (LeBlanc et al. 1975) on the Braess network
  • cfw — Conjugate Frank–Wolfe (Mitradjieva & Lindberg 2013) on the Braess network
  • bfw — Bi-conjugate Frank–Wolfe on the Braess network
  • gp — Gradient projection (Jayakrishnan et al. 1994) on the Braess network
  • oba — Origin-based assignment (Bar-Gera 2002) on the Braess network
  • algb — Algorithm B (Dial 2006) on the Braess network
  • tapas — TAPAS — traffic assignment by paired alternative segments (Bar-Gera 2010) on the Braess network
  • sue-msa — Logit stochastic user equilibrium by MSA on the two-route network
  • sue-probit-msa — Probit SUE by MSA, certified by pinned Monte Carlo
  • so-bfw — System optimum by bi-conjugate Frank–Wolfe on the Braess network
  • fw-elastic — Elastic-demand user equilibrium (Florian & Nguyen 1974)
  • evans — Combined trip distribution + assignment (Evans 1976)
  • br-ue — Boundedly-rational user equilibrium (Mahmassani & Chang 1987)
  • sc-tap — Side-constrained (capacitated) user equilibrium (Larsson & Patriksson 1995)
  • vi-asym — Asymmetric variational-inequality UE (Dafermos 1980 / Smith 1979)
  • multiclass — Multiclass-user equilibrium (Dafermos 1972)
  • learned-surrogate — A learned UE surrogate, and how the harness CENSORS it
  • dtd-swap — Smith’s (1984) route-swap day-to-day dynamics
  • dtd-swap-sue — Smith & Watling’s (2016) route-swap SUE dynamics
  • dtd-link — He, Guo & Liu’s (2010) link-based day-to-day dynamics
  • dtd-friesz — Friesz et al.’s (1994) route-based projected dynamical system
  • dtd-horowitz — Horowitz’s (1984) cost-smoothing SUE dynamics
  • dtd-stochastic — Cascetta’s (1989) stochastic-process day-to-day model
  • dtd-unifying — Cantarella & Cascetta’s (1995) unifying day-to-day process
  • dtd-cumlog — Li, Wang & Nie’s (2024) cumulative-logit day-to-day dynamics
  • gls — Generalized Least Squares OD estimation (covers prior)
  • spiess — Spiess’s (1990) count-misfit-only OD estimation
  • vzw-entropy — Van Zuylen & Willumsen’s (1980) entropy-balancing OD estimation
  • od-congested — Yang, Sasaki, Iida & Asakura’s (1992) bilevel OD estimation
  • spsa — Spall’s (1992) simultaneous perturbation stochastic approximation
  • od-kalman — Davis & Nihan’s (1993) linear-Gaussian OD estimation
  • od-dynamic — Cascetta, Inaudi & Marquis’s (1993) within-day dynamic OD estimation
  • bo4mob-estimation — BO4Mob held-out-count OD estimation (D2 observational)
  • odme-dtalite — DTALite’s static ODME as one more guarded T2 estimator (Zhou & Taylor 2014)
  • transit-strategy — Spiess & Florian’s (1989) optimal strategies
  • ctm — Daganzo’s (1994, 1995) Cell Transmission Model
  • ltm — Yperman’s (2007) Link Transmission Model
  • godunov — Lebacque’s (1996) Godunov scheme + the Greenshields FD
  • node-model — Tampere et al.’s (2011) generic first-order node model
  • vickrey — Vickrey’s (1969) single-bottleneck departure-time equilibrium
  • vi-due — Friesz et al.’s (1993) variational-inequality dynamic user equilibrium
  • merchant-nemhauser — Merchant & Nemhauser’s (1978) exit-function SO-DTA
  • lp-so-dta — Ziliaskopoulos’s (2000) LP single-destination SO-DTA on CTM cells
  • pm-td — Peeta & Mahmassani’s (1995) time-dependent UE and SO
  • newell-3det — Newell’s (1993) interior kinematic-wave reconstruction
  • implicit-ue-nn — user equilibrium as an implicit layer (act two)
  • het-gnn — heterogeneous-GNN traffic assignment (act three)
  • sumo-marouter — SUMO’s macroscopic assignment as an external-simulator adapter
  • sumo-duaiterate — the first external-dynamic (EDOC-1) row
  • dtalite-tap — DTALite’s static Frank-Wolfe, an IDENTITY compile map
  • spsa-sumo — SPSA calibration against a production simulator (Balakrishna 2007)
  • matsim — the first agent-based, stochastic-track EDOC row
  • dtalite-simulation — the third EDOC row, the first DETERMINISTIC-track external engine
  • xu2024 — the 20-US-city cross-domain axis (Honolulu / San Francisco)
  • bo4mob — the BO4Mob San Jose freeway instances (stage 1: data + liveness)
  • profiles — SimOpt-style progress curves and solvability profiles

API reference

  • API reference
    • tabench.core
    • tabench.models
    • tabench.metrics
    • tabench.estimation
    • tabench.edoc

Design records (ADRs)

  • ADR-001 — Logit SUE: Dial’s STOCH loading, MSA-SUE, and the fixed-point certificate
  • ADR-002 — T2 estimation track: OD demand from link counts, and the pinned-assignment certificate
  • ADR-003 — Probit SUE: Monte Carlo fixed-point certificate with a pinned evaluation stream
  • ADR-004 — Route-flow proportionality: a diagnostic now, a scored certificate proposed
  • ADR-005 — Elastic (variable) demand: a new problem class with a P1-pure certificate
  • ADR-006 — Learned (black-box) models: certified by P1, gated by lineage
  • ADR-007 — Combined trip distribution + assignment (Evans 1976): a P1-pure certificate
  • ADR-008 — Boundedly-rational user equilibrium: a band-relaxed UE with a necessary link-flow certificate
  • ADR-009 — Side-constrained UE: hard link capacities with a link-visible feasibility certificate
  • ADR-010: dnl-core — generic supply/demand dynamic-network-loading foundation
  • ADR-011: vi-asym — asymmetric variational-inequality UE (non-separable costs)
  • ADR-012: od-kalman — Davis & Nihan (1993) linear-Gaussian OD estimation from a time series of link counts
  • ADR-013: multiclass — Dafermos (1972) multiclass-user equilibrium
  • ADR-014: transit-strategy — Spiess & Florian (1989) optimal-strategy transit assignment
  • ADR-015: ctm — Daganzo (1994/1995) cell transmission model link
  • ADR-016: ltm — Yperman (2007) link transmission model
  • ADR-017: node-model — Tampère et al. (2011) generic first-order node model
  • ADR-018: godunov — Lebacque (1996) Godunov scheme + the first non-triangular FD
  • ADR-019: vickrey — Vickrey (1969) single-bottleneck departure-time equilibrium
  • ADR-020: merchant-nemhauser — Merchant & Nemhauser (1978) exit-function SO-DTA
  • ADR-021: lp-so-dta — Ziliaskopoulos (2000) LP single-destination SO-DTA on CTM cells
  • ADR-022: vi-due — Friesz et al. (1993) VI dynamic user equilibrium
  • ADR-023: od-dynamic — Cascetta, Inaudi & Marquis (1993) within-day dynamic OD estimation
  • ADR-024: newell-3det — Newell (1993) three-detector interior reconstruction
  • ADR-025 — Implicit-NN user equilibrium: the first torch model, feasibility as architecture
  • ADR-026 — Heterogeneous-GNN traffic assignment: the third learned model, feasibility as a decode
  • ADR-027 — SUMO marouter: the first external-simulator adapter, and the simulator-to-benchmark model gap
  • ADR-028 — spsa-sumo: SPSA calibration against a production simulator, as one more estimator row
  • ADR-029 — DTALite assignment(): the second external engine, and the identity-map static-UE row
  • ADR-030 — MATSim / DynaMIT / DYNASMART adapters: measured deferral, and the ADR that unblocks them
  • ADR-031: pm-td-ue / pm-td-so — Peeta & Mahmassani (1995) time-dependent SO/UE
  • ADR-032: simopt-profiles — SimOpt-style progress curves and solvability profiles
  • ADR-033: xu2024-dataset — the Xu et al. (2024) 20-US-city cross-domain axis
  • ADR-034: bo4mob-scenarios — the BO4Mob San Jose freeway OD-estimation instances (stage 1)
  • ADR-035: tutorials-visualizer — the house visualizer and the per-unit tutorial notebooks
  • ADR-036: edoc-1 — the external-dynamic-engine observational certificate
  • ADR-037 — sumo-duaiterate: the first EDOC-1 row, and the shipped external-dynamic substrate
  • ADR-038 — Cumulative-logit day-to-day dynamics: boundedly-rational logit choice with an exact-Wardrop-UE limit
  • ADR-039 — matsim: the second EDOC-1 row, the first agent-based / first stochastic-track external engine
  • ADR-040 — dtalite-simulation: the third EDOC-1 row, the first deterministic-track external engine, closing the adr-029 honest-sourcing loop
  • ADR-041 — bo4mob-estimation: the BO4Mob held-out-count OD-estimation family (stage 2), a D2 observational T2 certificate
  • ADR-042 — odme-dtalite: DTALite’s static ODME as one more guarded T2 estimator row
  • ADR-043 — bo4mob-joint-estimation: the joint (demand, supply) estimand is under-identified from counts+speeds — a measured deferral
  • TABenchmark Angle A: A Scenario × Model Cross-Evaluation Matrix with SimOpt-Style Experiment Machinery
  • TABenchmark — Angle A: The Scenario × Model Matrix
  • TABenchmark: An Observability-First Benchmark for 50 Years of Traffic Assignment Models
  • TABenchmark — Angle B: Observability-First Design
  • TABenchmark Design Proposal — Contract/Plugin-First Extensibility (Angle C)
  • TABenchmark: Contract-First Design Proposal (Angle C)
Back to top
View this page

ADR-015: ctm — Daganzo (1994/1995) cell transmission model link¶

Status: accepted (implemented) Date: 2026-07-09 Deciders: DNL-models track — the first shipped DNL link model, on the adr-010 core File: docs/design/adr-015-ctm.md

Context¶

dnl-core (adr-010) built the generic sending/receiving foundation “five later sprints must share without rework” and named ctm (Daganzo 1994/1995) first. The Cell Transmission Model is a finite-cell Godunov discretisation of the LWR kinematic-wave PDE: the road is cut into equal cells, and the flux between adjacent cells is min(upstream sending, downstream receiving), which produces shocks, queues and spillback automatically. It is a link loading model, not an equilibrium principle — the inner map a DTA equilibrium (a later sprint) iterates.

Decision¶

  1. CTMLink(LinkModel) in src/tabench/dnl/ctm.py, a subclass on the frozen sending/receiving/_advance_state interface — no change to link.py, loader.py, node.py, or the certifier. At the sanctioned CFL = 1 operating point the cell length is dx = vf·dt, so a link of length L is n = L/dx equal cells (a free-flow vehicle crosses exactly one cell per step). Internal state is the per-cell occupancy occ[i] (vehicles), all zero at t = 0.

  2. Lebacque demand/supply flux the FD already exposes. fd.demand_at(k) = Δ and fd.supply_at(k) = Σ, so the CTM needs no new FD algebra:

    • sending(k) = last cell’s demand demand_at(k_last)·dt, capped by occ[-1];

    • receiving(k) = first cell’s supply supply_at(k_first)·dt;

    • interior Godunov flux y_i = min(demand_at(k_i), supply_at(k_{i+1}))·dt (i = 0..n-2), then the conservation update occ[:-1] -= y; occ[1:] += y; occ[0] += inflow; occ[-1] -= outflow, where inflow/outflow are the node-allocated boundary transfers. A single cell (L = vf·dt) reduces to occ[0] += inflow - outflow.

  3. No turning logic (division of responsibility). A LinkModel sees only two aggregate scalars (inflow into cell 0, outflow out of the last cell); the node models allocate transfers. So the CTM link is single-corridor cell dynamics only — Daganzo (1995) Part II’s network merge/diverge extension is the node-model sprint’s (daganzo1995cell stays unshipped until then), exactly the adr-010 division.

  4. Finite jam, cell alignment, and the backward-wave CFL enforced. CTM models bounded storage, so kappa = inf (point queue) raises — the unbounded point queue stays the test-only reference. A non-cell-aligned L (not an integer multiple of vf·dt) raises rather than silently loading off the certificates’ gating point. And at CFL = 1 the standard stability requirement dt <= dx/max(vf, w) reduces to w <= vf (the backward wave must be resolved per cell too); w > vf — a legal TriangularFD — would let the congested-branch flux supply_at(k)·dt = w·(kappa-k)·dt overfill a cell past kappa·dx, so it raises. This per-cell condition is invisible to the scenario-level assert_wave_resolved, which uses the whole-link length L (dt <= L/w), so the guard lives in CTMLink — a defect the adversarial review caught (66% of w > vf configs otherwise produced C3-censored, physically impossible output).

Exactness and the Tier-B backward wave¶

At CFL = 1 the free-flow branch is linear advection at Courant number 1 — the classical zero-numerical-diffusion case — so n_out(t) = n_in(t - L/vf) is bit-exact (anchor a). The congested branch runs at Courant number w/vf < 1 (the grid is tuned to the faster forward speed), so a backward shock spreads by O(one cell): standard CTM is provably diffusive for backward waves whenever w < vf (Daganzo’s open 1999 ISTTT restatement; Boyles TNA §10.5). This is expected scheme physics, and is exactly why the harness demotes the backward-wave envelope (C5) to a non-gating Tier-B residual — a correct CTM shows a bounded, resolution-shrinking kw_backward_residual under spillback, not a censoring bug. The gating certificates (C1 conservation, C2 capacity, C3 storage, C4 causality, C6 FIFO) all hold.

Analytic anchors (hand-derived, machine-verified — test_dnl_ctm.py)¶

FD vf = w = 1, kappa = 4 ⇒ capacity = vf·w·kappa/(vf+w) = 2, k_c = 2; dt = 1.

  • (a) Free-flow translation: L = 4, inflow 1.0 < 2. n_out(t) = n_in(t-4) exactly, TSTT = (L/vf)·D = 4·4 = 16, zero delay.

  • (b) Queue spillback: the L = 4 link feeds a 0.5 bottleneck at inflow 1.5. Rankine–Hugoniot shock speed s = (q_A-q_B)/(k_A-k_B) = (1.5-0.5)/(1.5-3.5) = -0.5, starting at x = 4, t = 4 and reaching x = 0 (full spillback) at t = 12; exact bottleneck boundary curves n_in = 1.5t, n_out = max(0, 0.5(t-4)); storage at t = 12 = k_B·L = 3.5·4 = 14.

  • (c) Congested density: every fully-queued cell settles at k_B = kappa - q_B/w = 3.5, the root of supply_at(k) = q_B — the entropy state Lebacque’s supply selects by construction.

Alternatives considered¶

  • Density (not occupancy) state: equivalent; occupancy keeps the update pure counts (no dx bookkeeping in the conservation step), matching the node models’ vehicle-count convention.

  • Trapezoidal-FD rarefaction anchor: deferred — a strictly triangular FD discharges as two clean shocks, not a smooth fan, so the three anchors above already cover free-flow, shock, and steady-congested without it.

  • Registering CTM in a road model registry: rejected — a LinkModel is selected as the loader’s link_factory, exercised through NetworkLoader, not the road CLI/runner (same standalone treatment the DNL core set).

Consequences¶

The benchmark gains its first dynamic-loading model and the template the ltm / newell-kw / godunov sprints follow (LinkModel subclasses, same interface). All changes are additive (a new module + new tests + exports), so the 552-test suite, every road/DNL hash, and the golden Braess content hash are byte-untouched.

Sourcing¶

Daganzo (1994) TR-B 28(4):269-287 and (1995) Part II TR-B 29(2) are paywalled, attributed unread. The min(sending, receiving) recipe, the (vf, w, kappa) triangular FD, and all three anchors were cross-verified from open sources — Boyles Transportation Network Analysis §10.5 and Daganzo’s own open ISTTT (1999) restatement of the identical base scheme — and hand-derived here from LWR / Rankine–Hugoniot theory. No DOIs or page-precise quotes are reproduced from the paywalled primaries.

Next
ADR-016: ltm — Yperman (2007) link transmission model
Previous
ADR-014: transit-strategy — Spiess & Florian (1989) optimal-strategy transit assignment
Copyright © 2026, UMN Choi Lab
Made with Sphinx and @pradyunsg's Furo
On this page
  • ADR-015: ctm — Daganzo (1994/1995) cell transmission model link
    • Context
    • Decision
    • Exactness and the Tier-B backward wave
    • Analytic anchors (hand-derived, machine-verified — test_dnl_ctm.py)
    • Alternatives considered
    • Consequences
    • Sourcing