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-009 — Side-constrained UE: hard link capacities with a link-visible feasibility certificate¶

Status: accepted (shipped in v1) File: docs/design/adr-009-side-constrained-ue.md

Context¶

Ordinary UE lets a link’s flow grow without bound (the BPR cost just rises). Side-constrained traffic assignment (Larsson & Patriksson 1995) adds hard link-capacity constraints v_a <= u_a — physical throughput limits — to the Beckmann program:

min_x  sum_a integral_0^{v_a} t_a(w) dw   s.t.  demand feasibility,  v_a <= u_a  for all a.

Its KKT conditions are a Wardrop equilibrium on the capacity-augmented cost

c_a(v) = t_a(v_a) + beta_a,   beta_a >= 0,   beta_a (u_a - v_a) = 0,

where beta_a is a multiplier that is zero off the binding set and, where a capacity binds, is the queueing delay / congestion toll that stops travelers piling onto the physically-cheap but full link (Larsson & Patriksson 1999: “the Lagrange multipliers … are the link tolls the travellers are willing to pay … the delays in steady-state link queues”). When no capacity binds, SC-TAP is literally the unconstrained program, so it reduces exactly to plain UE.

Sourcing¶

Larsson & Patriksson (1995, TR-B 29(6):433-455) is paywalled and attributed unread; the augmented-cost equilibrium, the multiplier-as-toll reading, and the augmented-Lagrangian form are cross-verified from the 1999 companion, Nie-Zhang-Lee (2004), and standard augmented-Lagrangian theory (Bertsekas 1982). The analytic anchor numbers are derived here, hand-checked, and not quoted from the primary.

Decision 1 — Per-link capacities as content-hashed scenario data¶

Scenario.side_capacities: np.ndarray | None (core/scenario.py) carries the hard caps u_a (length n_links). Validated finite and > 0; content-hashed only when set (appended last, golden Braess hash preserved); mutually exclusive with sue_theta / elastic_demand / combined_demand / br_epsilon. A change in any u_a is a different benchmark instance.

Decision 2 — Method of multipliers wrapping Frank-Wolfe¶

sc-tap (SideConstrainedModel, paradigm static_sc_ue) solves it by the augmented-Lagrangian method of multipliers. The inner problem, for fixed (beta, rho), is an ordinary UE with the modified — still non-decreasing — link cost t~_a(v) = t_a(v_a) + max{0, beta_a + rho(v_a-u_a)}, solved by Frank-Wolfe with an exact Brent line search on the augmented objective. The outer loop updates beta_a <- max{0, beta_a + rho(v_a - u_a)} and grows rho when the worst violation stops shrinking. At the fixed point the constraints hold exactly and the recovered beta_a is the true multiplier (unlike a fixed large-penalty solve, which is only feasible as rho -> infinity).

Robustness (pre-emptive fuzz). An infeasible instance — a capacity below a cut link’s forced flow, where no SC solution exists — would otherwise drive beta/rho to overflow (a crash). We cap rho <= 1e10 and beta <= 1e8 (both far above any real queueing toll for the benchmark’s cost scales) and break on any non-finite cost or shortest-path failure, so an infeasible instance stops gracefully with the constraint reported violated rather than crashing.

Decision 3 — A link-visible capacity-feasibility certificate¶

The SC-specific scored quantity is capacity feasibility, link-visible and checked per link to a tight relative tolerance (unlike the multipliers, which are duals). A hard cap is a per-link quantity, so the tolerance is relative to each link’s own capacity — scaling it by total demand (as the demand-feasibility audit does) would let a fixed absolute overload certify on a high-demand network (an adversarial-review finding, corrected before this commit):

max_capacity_violation = max_a (v_a - u_a)+                # absolute, for diagnosis
rel_overload           = max_a (v_a - u_a)+ / u_a          # per-link relative
sc_capacity_feasible   = 1.0  iff  rel_overload <= feasibility_tol

The raw-cost relative gap stays positive at a correct SC equilibrium (binding links carry flow that would prefer to grow), so it is reported for provenance but is not the acceptance criterion — the acceptance criterion is capacity feasibility. The recovered beta_a and the augmented-cost gap are model self-reports; a fully harness-recomputed augmented-cost equilibrium gap (recovering beta as shadow prices on the binding set by a small convex program) is a documented enhancement. This is honest: the scored certificate certifies feasibility, not the full equilibrium; equilibrium is validated by the analytic anchor and the no-binding UE reduction.

Consequences¶

  • New: Scenario.side_capacities; paradigm static_sc_ue; the sc-tap model; sc_capacity_feasible + max_capacity_violation scored metrics; sc_two_route_scenario anchor (no-binding → exact UE (5.5,5.5,4.5,4.5); cap 4 → (4,4,6,6), recovered beta = 3 = 1 + D - 2*cap); tabench run --scenario sc-tworoute.

  • Validation: the anchor + monotone-tightening sweep; the exact no-binding UE reduction (matches the shipped FW solver); a fuzz confirming zero crashes on solvable instances and, by a min-cut classification, that sc-tap converges to capacity-feasibility on 100% of feasible instances and only reports infeasibility on genuinely-infeasible ones.

  • Unchanged: every prior scenario hash (golden Braess preserved); all other certificate paths; all prior models and tests.

  • Deferred: the harness-recomputed augmented-cost equilibrium gap (shadow-price recovery); per-class capacities; explicit infeasibility reporting (beyond sc_capacity_feasible = 0).

Next
ADR-010: dnl-core — generic supply/demand dynamic-network-loading foundation
Previous
ADR-008 — Boundedly-rational user equilibrium: a band-relaxed UE with a necessary link-flow certificate
Copyright © 2026, UMN Choi Lab
Made with Sphinx and @pradyunsg's Furo
On this page
  • ADR-009 — Side-constrained UE: hard link capacities with a link-visible feasibility certificate
    • Context
    • Sourcing
    • Decision 1 — Per-link capacities as content-hashed scenario data
    • Decision 2 — Method of multipliers wrapping Frank-Wolfe
    • Decision 3 — A link-visible capacity-feasibility certificate
    • Consequences