{ "cells": [ { "cell_type": "markdown", "id": "9b74e044", "metadata": {}, "source": [ "# `vi-due` — Friesz et al.'s (1993) variational-inequality dynamic user equilibrium\n", "\n", "**What.** `vi-due` recasts dynamic user equilibrium as a variational inequality\n", "(VI) over path-departure flows: `N` travelers choose BOTH a route `r` (a\n", "free-flow time `f_r` followed by its own Vickrey point-queue bottleneck of\n", "capacity `s_r`) AND a departure time, trading queue delay against schedule\n", "delay around a common `t*`. This benchmark instantiates the VI with the\n", "generalized Vickrey point-queue loading, closed-form and FIFO by construction.\n", "\n", "**Why it is in the benchmark.** It is the simultaneous route-AND-departure-time\n", "DUE (SRDC-DUE) — the multi-route generalization of `vickrey`, and it reduces\n", "EXACTLY to `vickrey` when there is one route with `f = 0`, which this notebook\n", "verifies numerically rather than asserting. See the\n", "[model compendium](../../docs/MODELS.md) (Friesz et al. 1993) and\n", "[docs/design/adr-022-vi-due.md](../../docs/design/adr-022-vi-due.md) (P1).\n", "\n", "**Scope.** This notebook runs the closed-form SRDC-DUE on the built-in two-\n", "route worked instance, certifies it, and demonstrates the exact `vickrey`\n", "reduction and the analytic route-inclusion threshold.\n", "\n", "**Canon.** `[friesz1993variational]`, [docs/REFERENCES.md](../../docs/REFERENCES.md) / [docs/references.bib](../../docs/references.bib)." ] }, { "cell_type": "markdown", "id": "8eb2b41b", "metadata": {}, "source": [ "## How this notebook is graded\n", "\n", "**A notebook never claims a number it does not compute in that cell.** Every\n", "scored quantity below is recomputed live by the P1 `DUEEvaluator` from the\n", "emitted per-route cumulative departure curves alone — reconstructing the\n", "deterministic point queue on EACH route, scoring every used traveler's cost by\n", "level-inversion, AND checking that no traveler could improve by switching\n", "ROUTE (not just departure time) via a marginal-insertion sweep. The solver's\n", "own `C`/split/window provenance is never trusted\n", "([README](../../README.md), *Certified, not self-reported*)." ] }, { "cell_type": "code", "execution_count": 1, "id": "97c490b6", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:47.831546Z", "iopub.status.busy": "2026-07-21T13:48:47.831186Z", "iopub.status.idle": "2026-07-21T13:48:49.762195Z", "shell.execute_reply": "2026-07-21T13:48:49.761296Z" } }, "outputs": [], "source": [ "# Setup. `vi-due` is a core model: a plain `pip install -e .` suffices — no\n", "# optional extra, so no guard cell. The inline backend is Agg-based (headless\n", "# CI renders into the notebook); NEVER matplotlib.use(\"Agg\") in-kernel — it\n", "# silently suppresses inline figure capture.\n", "%matplotlib inline\n", "import numpy as np\n", "\n", "from tabench import (\n", " DUEEvaluator,\n", " DUEScenario,\n", " BottleneckEvaluator,\n", " due_closed_form,\n", " friesz_two_route_scenario,\n", " ue_closed_form,\n", " vickrey_worked_scenario,\n", ")" ] }, { "cell_type": "markdown", "id": "1573cc7f", "metadata": {}, "source": [ "## The scenario\n", "\n", "The built-in worked instance (adr-022): `N=6000`, two parallel routes — route 0\n", "(`f=0.2`, `s=3000`) and route 1 (`f=0.7`, `s=1500`) — same schedule-delay\n", "slopes as `vickrey` (`alpha=1, beta=0.5, gamma=2, t*=9`). `DUEScenario` is\n", "frozen and content-hashed (P2), domain-separated from the single-route\n", "`BottleneckScenario` hash space." ] }, { "cell_type": "code", "execution_count": 2, "id": "58961cdc", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.767044Z", "iopub.status.busy": "2026-07-21T13:48:49.766811Z", "iopub.status.idle": "2026-07-21T13:48:49.772659Z", "shell.execute_reply": "2026-07-21T13:48:49.771957Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scenario : friesz-two-route\n", "content hash : 74c911fe30d6f52b…\n", "N=6000.0, routes f=[np.float64(0.2), np.float64(0.7)], s=[np.float64(3000.0), np.float64(1500.0)]\n", "alpha=1.0, beta=0.5, gamma=2.0, t*=9.0\n", "common cost C (method) : 0.9\n", "used routes / split : [ True True] [5250. 750.]\n", "task : simultaneous route-and-departure-time user equilibrium\n" ] } ], "source": [ "scenario = friesz_two_route_scenario()\n", "print(f\"scenario : {scenario.name}\")\n", "print(f\"content hash : {scenario.content_hash()[:16]}…\")\n", "print(f\"N={scenario.n_travelers}, routes f={list(scenario.route_free_flow)}, \"\n", " f\"s={list(scenario.route_capacity)}\")\n", "print(f\"alpha={scenario.alpha}, beta={scenario.beta}, gamma={scenario.gamma}, \"\n", " f\"t*={scenario.t_star}\")\n", "c_star, used, n_r = scenario.equilibrium_structure()\n", "print(f\"common cost C (method) : {c_star}\")\n", "print(f\"used routes / split : {used} {n_r}\")\n", "print(\"task : simultaneous route-and-departure-time user equilibrium\")" ] }, { "cell_type": "markdown", "id": "3f689372", "metadata": {}, "source": [ "## Solve\n", "\n", "No `Budget`/`RngBundle`/`Trace` — the closed form is a pure function of the\n", "scenario, emitting a `DUEProfile` (per-route cumulative departure curves, the\n", "P1-certifiable artifact)." ] }, { "cell_type": "code", "execution_count": 3, "id": "820165c3", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.776824Z", "iopub.status.busy": "2026-07-21T13:48:49.776644Z", "iopub.status.idle": "2026-07-21T13:48:49.781046Z", "shell.execute_reply": "2026-07-21T13:48:49.780175Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "provenance : {'equilibrium_cost': 0.9, 'total_cost': 5400.0, 'n_route_0': 5250.0, 'n_route_1': 750.0000000000001}\n", "routes x grid : (2, 2006)\n" ] } ], "source": [ "profile = due_closed_form(scenario)\n", "print(f\"provenance : {profile.provenance}\")\n", "print(f\"routes x grid : {profile.cumulative.shape}\")" ] }, { "cell_type": "markdown", "id": "70ba24a6", "metadata": {}, "source": [ "## Certify (P1) — no traveler can improve by switching route OR time\n", "\n", "`DUEEvaluator` reconstructs each route's point queue from its emitted curve,\n", "scores every used traveler's cost by level-inversion, and additionally sweeps\n", "the MARGINAL-INSERTION cost of every route at a dense set of candidate times\n", "(an infinitesimal extra traveler does not move the curves) — `due_gap = (max\n", "cost over used travelers − min marginal cost anywhere) / C`, zero iff no\n", "traveler can improve by shifting time OR switching route." ] }, { "cell_type": "code", "execution_count": 4, "id": "5bb010be", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.784771Z", "iopub.status.busy": "2026-07-21T13:48:49.784556Z", "iopub.status.idle": "2026-07-21T13:48:49.798368Z", "shell.execute_reply": "2026-07-21T13:48:49.797701Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "feasible : 1\n", "due_gap : 7.303e-14\n", "total_cost : 5400.00\n", "expected_cost (C) : 0.9000\n", "emitted route volumes : [5250. 750.]\n" ] } ], "source": [ "evaluator = DUEEvaluator(scenario)\n", "metrics = evaluator.certify(profile)\n", "print(f\"feasible : {metrics['feasible']:.0f}\")\n", "print(f\"due_gap : {metrics['due_gap']:.3e}\")\n", "print(f\"total_cost : {metrics['total_cost']:.2f}\")\n", "print(f\"expected_cost (C) : {metrics['expected_cost']:.4f}\")\n", "assert metrics[\"feasible\"] == 1.0\n", "assert metrics[\"due_gap\"] < 1e-6\n", "assert np.isclose(metrics[\"expected_cost\"], 0.9, atol=1e-3)\n", "assert np.isclose(metrics[\"total_cost\"], 5400.0, atol=1e-1)\n", "\n", "# Recompute the split directly from the emitted curves (route volumes), not\n", "# quoting scenario.equilibrium_structure() a second time.\n", "n_emitted = profile.cumulative[:, -1]\n", "print(f\"emitted route volumes : {n_emitted}\")\n", "np.testing.assert_allclose(n_emitted, [5250.0, 750.0], atol=1e-2)" ] }, { "cell_type": "markdown", "id": "ba717264", "metadata": {}, "source": [ "## Distinctive result 1: the route-inclusion threshold\n", "\n", "A route joins the used set only while its free-flow cost `alpha*f_r` stays\n", "below the common cost level. Recomputed here directly from the scenario's\n", "parameters (not quoted): with `delta = beta*gamma/(beta+gamma)`, route 1 joins\n", "iff `N > alpha*s_0*(f_1 - f_0)/delta`." ] }, { "cell_type": "code", "execution_count": 5, "id": "c4701ba9", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.802226Z", "iopub.status.busy": "2026-07-21T13:48:49.801716Z", "iopub.status.idle": "2026-07-21T13:48:49.807300Z", "shell.execute_reply": "2026-07-21T13:48:49.806640Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "route-inclusion threshold N* : 3749.999999999999\n", "below threshold (N=3748.999999999999): used=[ True False], split=[3749. 0.]\n" ] } ], "source": [ "delta = scenario.beta * scenario.gamma / (scenario.beta + scenario.gamma)\n", "threshold = (\n", " scenario.alpha * scenario.route_capacity[0]\n", " * (scenario.route_free_flow[1] - scenario.route_free_flow[0]) / delta\n", ")\n", "print(f\"route-inclusion threshold N* : {threshold}\")\n", "assert np.isclose(threshold, 3750.0, atol=1e-6)\n", "assert scenario.n_travelers > threshold # both routes used on the worked instance, verified above\n", "\n", "below = DUEScenario(\n", " name=\"vi-due-below-threshold\", n_travelers=threshold - 1.0,\n", " alpha=scenario.alpha, beta=scenario.beta, gamma=scenario.gamma, t_star=scenario.t_star,\n", " route_free_flow=scenario.route_free_flow, route_capacity=scenario.route_capacity,\n", ")\n", "_, used_below, n_r_below = below.equilibrium_structure()\n", "print(f\"below threshold (N={below.n_travelers}): used={used_below}, split={n_r_below}\")\n", "assert not used_below[1] # route 1 excluded just below the threshold" ] }, { "cell_type": "markdown", "id": "03349527", "metadata": {}, "source": [ "## Distinctive result 2: the exact reduction to `vickrey`\n", "\n", "`vi-due` reduces exactly to `vickrey` when there is one route with `f = 0` —\n", "verified here by running `due_closed_form` on a single-route `DUEScenario` at\n", "`vickrey`'s own parameters and diffing the certified totals against the\n", "`vickrey` anchor, computed independently by `ue_closed_form` +\n", "`BottleneckEvaluator` (not the same code path)." ] }, { "cell_type": "code", "execution_count": 6, "id": "3153cce5", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.811570Z", "iopub.status.busy": "2026-07-21T13:48:49.811021Z", "iopub.status.idle": "2026-07-21T13:48:49.823401Z", "shell.execute_reply": "2026-07-21T13:48:49.822734Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "vi-due (1 route, f=0) : C=0.800000 total=4800.0000 max_queue=2400.0000\n", "vickrey UE : C=0.800000 total=4800.0000 max_queue=2400.0000\n", "vi-due (single route, f=0) reduces exactly to the vickrey anchor\n" ] } ], "source": [ "vk_scenario = vickrey_worked_scenario()\n", "single_route = DUEScenario(\n", " name=\"vi-due-single-route\", n_travelers=vk_scenario.n_travelers,\n", " alpha=vk_scenario.alpha, beta=vk_scenario.beta, gamma=vk_scenario.gamma,\n", " t_star=vk_scenario.t_star,\n", " route_free_flow=np.array([0.0]), route_capacity=np.array([vk_scenario.capacity]),\n", ")\n", "single_profile = due_closed_form(single_route)\n", "single_metrics = DUEEvaluator(single_route).certify(single_profile)\n", "\n", "vk_metrics = BottleneckEvaluator(vk_scenario).certify(ue_closed_form(vk_scenario))\n", "\n", "print(f\"vi-due (1 route, f=0) : C={single_metrics['expected_cost']:.6f} \"\n", " f\"total={single_metrics['total_cost']:.4f} max_queue={single_metrics['max_queue']:.4f}\")\n", "print(f\"vickrey UE : C={vk_scenario.equilibrium_cost:.6f} \"\n", " f\"total={vk_metrics['total_cost']:.4f} max_queue={vk_metrics['max_queue']:.4f}\")\n", "assert np.isclose(single_metrics[\"expected_cost\"], vk_scenario.equilibrium_cost, atol=1e-6)\n", "assert np.isclose(single_metrics[\"total_cost\"], vk_metrics[\"total_cost\"], atol=1e-2)\n", "assert np.isclose(single_metrics[\"max_queue\"], vk_metrics[\"max_queue\"], atol=1e-2)\n", "print(\"vi-due (single route, f=0) reduces exactly to the vickrey anchor\")" ] }, { "cell_type": "markdown", "id": "0792ea22", "metadata": {}, "source": [ "## Visualize\n", "\n", "As in `vickrey`, `tabench.viz` is a road-network visualizer and this is a\n", "scalar departure-time model with no network — the house departure-diagram\n", "plots the two certified per-route cumulative departure curves directly." ] }, { "cell_type": "code", "execution_count": 7, "id": "3b87aac7", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:48:49.827175Z", "iopub.status.busy": "2026-07-21T13:48:49.826796Z", "iopub.status.idle": "2026-07-21T13:48:49.954702Z", "shell.execute_reply": "2026-07-21T13:48:49.953863Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(5.5, 4.0))\n", "for r in range(scenario.n_routes):\n", " ax.plot(profile.times, profile.cumulative[r],\n", " label=f\"route {r} (f={scenario.route_free_flow[r]}, N_r={n_emitted[r]:.0f})\")\n", "ax.axvline(scenario.t_star, color=\"0.6\", linestyle=\":\", label=\"t*\")\n", "ax.set_xlabel(\"time\")\n", "ax.set_ylabel(\"cumulative departures\")\n", "ax.set_title(\"vi-due: per-route SRDC-DUE departure schedules\")\n", "ax.legend(fontsize=8)\n", "fig.tight_layout()\n", "display(fig)\n", "plt.close(fig)\n" ] }, { "cell_type": "markdown", "id": "eab0d37a", "metadata": {}, "source": [ "## Takeaways & pointers\n", "\n", "- **Certified, not self-reported.** The route split and total cost came from\n", " `DUEEvaluator`, which checks BOTH the departure-time margin and the route\n", " margin from the emitted curves alone.\n", "- **The reduction is exact**, not a limiting case with a fudge tolerance — a\n", " single `f=0` route certifies to the `vickrey` anchor within closed-form\n", " float precision.\n", "- **Where next.** the single-route special case\n", " [`vickrey`](01-vickrey.ipynb); the lineage in the\n", " [model compendium](../../docs/MODELS.md)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" }, "tabench": { "covers": [], "requires_extra": null, "track": "bottleneck", "unit": "vi-due" } }, "nbformat": 4, "nbformat_minor": 5 }