{ "cells": [ { "cell_type": "markdown", "id": "04339318", "metadata": {}, "source": [ "# `aon` — All-or-nothing assignment on the Braess network\n", "\n", "**What.** All-or-nothing (AON) loads every OD pair entirely onto its free-flow\n", "shortest path, ignoring how that flow raises congestion. It has no single\n", "originating paper — it is the capacity-blind pre-equilibrium practice that\n", "Beckmann's convex equilibrium program (`[beckmann1956studies]`) and its Frank–Wolfe\n", "solution (`[leblanc1975efficient]`,\n", "[docs/REFERENCES.md](../../docs/REFERENCES.md)) were created to replace. In this\n", "benchmark it is the deliberate weak baseline, and — as the linearized subproblem of\n", "Frank–Wolfe — the atom every equilibrium solver here is built from.\n", "\n", "**Why it is in the benchmark.** It anchors the low end of the convergence ladder and\n", "makes P5 concrete: a baseline is *scored honestly by the same certificate*, never\n", "excluded. See the [model compendium](../../docs/MODELS.md) and\n", "[docs/ARCHITECTURE.md](../../docs/ARCHITECTURE.md) (P1).\n", "\n", "**Scope.** One AON pass on the built-in Braess scenario (5 links, one OD pair, no\n", "download). It does not converge to equilibrium — that is the point. For the solvers\n", "that do, see the `fw` / `cfw` / `bfw` tutorials." ] }, { "cell_type": "markdown", "id": "c3b6c749", "metadata": {}, "source": [ "## How this notebook is graded\n", "\n", "**A notebook never claims a number it does not compute in that cell.** Every scored\n", "quantity below is recomputed live by the P1 `Evaluator` from the flows the model\n", "emitted, in the cell where it is claimed. Model self-reports are shown only as\n", "provenance and diffed against the certificate as an honesty check, exactly as the\n", "harness treats them ([README](../../README.md), *Certified, not self-reported*)." ] }, { "cell_type": "code", "execution_count": 1, "id": "09e817e3", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:44:37.928291Z", "iopub.status.busy": "2026-07-21T13:44:37.927571Z", "iopub.status.idle": "2026-07-21T13:44:39.853316Z", "shell.execute_reply": "2026-07-21T13:44:39.852720Z" } }, "outputs": [], "source": [ "# Setup. `aon` 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 CI\n", "# renders into the notebook); NEVER matplotlib.use(\"Agg\") in-kernel — it silently\n", "# suppresses inline figure capture.\n", "%matplotlib inline\n", "import numpy as np\n", "\n", "from tabench import (\n", " AllOrNothingModel,\n", " Budget,\n", " Evaluator,\n", " RngBundle,\n", " Trace,\n", " braess_scenario,\n", " viz,\n", ")" ] }, { "cell_type": "markdown", "id": "3bf8bdba", "metadata": {}, "source": [ "## The scenario\n", "\n", "The built-in Braess network: 4 nodes, 5 links, a single OD pair (1 → 2) with demand\n", "6. Scenarios are frozen and content-hashed (P2) — the hash printed below is the\n", "identity of the benchmark instance, so a silently edited network cannot masquerade\n", "as it." ] }, { "cell_type": "code", "execution_count": 2, "id": "29bce614", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:44:39.856096Z", "iopub.status.busy": "2026-07-21T13:44:39.855844Z", "iopub.status.idle": "2026-07-21T13:44:39.859990Z", "shell.execute_reply": "2026-07-21T13:44:39.859472Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scenario : braess\n", "content hash : cf00f411cdccec88…\n", "links : 5 (tail→head: 1->3, 1->4, 3->4, 3->2, 4->2)\n", "total demand : 6.0\n" ] } ], "source": [ "scenario = braess_scenario()\n", "net = scenario.network\n", "\n", "print(f\"scenario : {scenario.name}\")\n", "print(f\"content hash : {scenario.content_hash()[:16]}…\")\n", "print(f\"links : {net.n_links} (tail→head: \"\n", " + \", \".join(f\"{i}->{j}\" for i, j in zip(net.init_node, net.term_node)) + \")\")\n", "print(f\"total demand : {scenario.demand.total}\")" ] }, { "cell_type": "markdown", "id": "8ce6fdfb", "metadata": {}, "source": [ "## Solve\n", "\n", "The model contract ([CONTRIBUTING.md](../../CONTRIBUTING.md)): a model receives\n", "`(scenario, budget, rng, trace)`, records checkpoints, and respects the budget.\n", "Budgets are hardware-free (iterations / shortest-path calls; wall-clock is recorded\n", "but never the ranking axis, P7). Whatever the model writes into `self_report` is\n", "provenance, not a score." ] }, { "cell_type": "code", "execution_count": 3, "id": "439ef6ec", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:44:39.862178Z", "iopub.status.busy": "2026-07-21T13:44:39.861927Z", "iopub.status.idle": "2026-07-21T13:44:39.866377Z", "shell.execute_reply": "2026-07-21T13:44:39.865953Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model : aon\n", "budget spent : 1 iterations, 1 shortest-path calls\n", "checkpoints : 1\n", "emitted flows : [6. 0. 6. 0. 6.]\n" ] } ], "source": [ "model = AllOrNothingModel()\n", "bundle = model.solve(scenario, Budget(iterations=1), RngBundle(0), Trace())\n", "\n", "final = bundle.final\n", "print(f\"model : {model.name}\")\n", "print(f\"budget spent : {final.coords.iterations} iterations, \"\n", " f\"{final.coords.sp_calls} shortest-path calls\")\n", "print(f\"checkpoints : {len(bundle.trace.checkpoints)}\")\n", "print(f\"emitted flows : {np.round(final.link_flows, 6)}\")" ] }, { "cell_type": "markdown", "id": "13359634", "metadata": {}, "source": [ "## Certify (P1)\n", "\n", "The harness scores AON with the *identical* certificate it applies to Frank–Wolfe:\n", "the relative gap is a property of `(link_flows, scenario)`. AON is a heuristic —\n", "`provides_gap=False`, so it self-reports no gap; the certificate is the only number,\n", "and it is honestly large. We recompute the analytic UE anchor in-cell to show that\n", "AON's loading is *not* the equilibrium (flows (4, 2, 2, 2, 4), route time 92)." ] }, { "cell_type": "code", "execution_count": 4, "id": "8b26d885", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:44:39.868733Z", "iopub.status.busy": "2026-07-21T13:44:39.868549Z", "iopub.status.idle": "2026-07-21T13:44:39.875073Z", "shell.execute_reply": "2026-07-21T13:44:39.874663Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "certified relative gap : 1.912e-01\n", "feasible : 1\n", "AON loaded route links : ['1->3', '3->4', '4->2']\n", "analytic UE flows : [4. 2. 2. 2. 4.] (gap 3.6e-09)\n", "analytic UE route time : 92.000001 (TSTT/D at ref_flows)\n" ] } ], "source": [ "evaluator = Evaluator(scenario)\n", "metrics = evaluator.evaluate(final.link_flows)\n", "\n", "certified_gap = metrics[\"relative_gap\"]\n", "print(f\"certified relative gap : {certified_gap:.3e}\")\n", "print(f\"feasible : {metrics['feasible']:.0f}\")\n", "\n", "# AON loads all demand on the free-flow shortest path: demand-feasible (audit\n", "# passes) but far from equilibrium, so the certified gap is large — and honest.\n", "assert metrics[\"feasible\"] == 1.0\n", "assert certified_gap > 0.1\n", "\n", "# `aon` self-reports no gap (provides_gap=False), so there is nothing to diff —\n", "# the certificate stands alone.\n", "assert \"relative_gap\" not in final.self_report\n", "\n", "# Analytic anchor, recomputed in-cell: the TRUE UE flows (4,2,2,2,4) carry a\n", "# ~machine-zero gap, and AON's loading differs from them — the gap is real.\n", "ref_flows = np.array([4.0, 2.0, 2.0, 2.0, 4.0])\n", "assert evaluator.evaluate(ref_flows)[\"relative_gap\"] < 1e-6\n", "assert not np.allclose(final.link_flows, ref_flows, atol=1e-1)\n", "loaded = [f\"{i}->{j}\" for i, j, v in zip(net.init_node, net.term_node, final.link_flows) if v > 0]\n", "print(f\"AON loaded route links : {loaded}\")\n", "print(f\"analytic UE flows : {ref_flows} (gap {evaluator.evaluate(ref_flows)['relative_gap']:.1e})\")\n", "\n", "# The UE route time quoted above (92), recomputed from ref_flows -- NOT final.link_flows,\n", "# since AON is off-equilibrium and its own TSTT/D is not the analytic anchor.\n", "route_time = evaluator.evaluate(ref_flows)[\"tstt\"] / scenario.demand.total\n", "print(f\"analytic UE route time : {route_time:.6f} (TSTT/D at ref_flows)\")\n", "assert abs(route_time - 92.0) < 1e-3" ] }, { "cell_type": "markdown", "id": "e585e5fb", "metadata": {}, "source": [ "## Visualize\n", "\n", "Both figures come from `tabench.viz`. Left/top: AON's link loading on the Braess\n", "diamond — all six units pile onto one path. Right/bottom: AON's flows against the\n", "analytic UE recomputed above; the points sit *off* the `y = x` guide, which is the\n", "certified gap made visual — a baseline scored honestly, not hidden." ] }, { "cell_type": "code", "execution_count": 5, "id": "e9b898a8", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:44:39.877068Z", "iopub.status.busy": "2026-07-21T13:44:39.876813Z", "iopub.status.idle": "2026-07-21T13:44:40.147810Z", "shell.execute_reply": "2026-07-21T13:44:40.147344Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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5s2FwWBAt27dWtQOIgYhaYrT6YSiKMjKyoQoitiwYQM+/viTkJ9fXV2DpCQTUlNTUVtbiyeeePK02ycnJ2PUqJG45ZZbUFDQHj169Ag+lpWVjZ9++umUITp+/Djs2LEDr7++CB6PBy6XC59//nmT2+bm5qJfv0vw4IMPoqKiEn6/Hxs2bMD69esxduyYkNsXaVdccQVee+013HDD7/Hpp5818zUGo6ysDK+9thB+vx+ff/45VqxYgUmTJgIAdDod+vbti3nz5qN///4AgAEDLsW8efPRr18/CIIQsfZQYmIQkqacffbZ+POf/4SRI0ehQ4dCrF69GldeGdo5OwD44x/vgCjq0KVLV/Tp0wc9e158xudcf/312LPnG1x3XeP5ejfccAOOHDmK9u07NHnuLzc3F+vWrcXKlSvQpUsXdO9+bvB8Y1MWLVoEQRDQp08fdOzYEU899TQWLXod5513XqPtBg8e0mge4WWX/S60xjfToEGXY9GiRbjxxhvx0Ucfh/38tLRUrFq1EsuXL0dhYUfceeddeOGFWejT59erkvfv3x/V1dXBw6ADBgxodJuoJXiFeqIWKi4uxgUXXIh9+/YiPT1d7XKIKEzsERK1QCAQwEsv/R2jR1/NECSKU1xZhqiZfvrpJ/Tp0xft27fHihXL1S6HiJqJh0aJiCih8dAoERElNAYhERElNAYhERElNAYhERElNAYhERElNAYhERElNAYhERElNAYhEREltP8PlQ1IQuH08lcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Certified equilibrium flows on the network (house style via tabench.viz).\n", "display(viz.plot_network_flows(net, final.link_flows))\n", "\n", "# Emitted flows vs the analytic UE recomputed above (off-diagonal == disagreement).\n", "display(viz.plot_flow_scatter((\"analytic UE\", ref_flows), {\"aon\": final.link_flows}))" ] }, { "cell_type": "markdown", "id": "f48c0525", "metadata": {}, "source": [ "## Takeaways & pointers\n", "\n", "- **Scored, not excluded (P5).** AON's gap above came from the same `Evaluator` that\n", " scores every model here; it is large because AON ignores congestion, and that is\n", " reported honestly rather than hidden.\n", "- **The atom of the solvers.** One AON pass is exactly Frank–Wolfe's linearized\n", " subproblem — iterate it with a line search and you get [`fw`](03-fw.ipynb).\n", "- **Where next.** The solvers that converge: [`msa`](02-msa.ipynb) ·\n", " [`fw`](03-fw.ipynb) · [`cfw`](04-cfw.ipynb) · [`bfw`](05-bfw.ipynb); the lineage in the\n", " [model compendium](../../docs/MODELS.md); the full matrix via\n", " `run_experiment(...)` as in `demos/demo_quickstart.py`." ] } ], "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": "static", "unit": "aon" } }, "nbformat": 4, "nbformat_minor": 5 }