{ "cells": [ { "cell_type": "markdown", "id": "8c3f3946", "metadata": {}, "source": [ "# `learned-surrogate` — A learned UE surrogate, and how the harness CENSORS it\n", "\n", "**What.** `learned-surrogate` is a numpy ridge regression trained to predict link\n", "volume/capacity ratios directly — no equilibrium is solved at inference. Because it\n", "regresses each link independently, its emitted flows need not conserve demand, and\n", "this notebook shows what the harness does about that (`[rahman2023data]`,\n", "[docs/REFERENCES.md](../../docs/REFERENCES.md)).\n", "\n", "**Why it is in the benchmark.** It is the honest-censoring case (ADR-026): a model that\n", "emits demand-infeasible flows is CENSORED — its gap is `nan`, not a score — so garbage\n", "can neither crash the experiment nor top the leaderboard (crash-vs-censor, P1). See the\n", "[model compendium](../../docs/MODELS.md) and\n", "[docs/ARCHITECTURE.md](../../docs/ARCHITECTURE.md).\n", "\n", "**Scope.** Runs on the built-in Braess scenario and certifies that the surrogate's raw\n", "output is censored. This is a NEGATIVE result on purpose — the censoring IS the lesson." ] }, { "cell_type": "markdown", "id": "f3c9c329", "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": "26e863f5", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:46:07.834398Z", "iopub.status.busy": "2026-07-21T13:46:07.834230Z", "iopub.status.idle": "2026-07-21T13:46:09.723023Z", "shell.execute_reply": "2026-07-21T13:46:09.722030Z" } }, "outputs": [], "source": [ "# Setup. `learned-surrogate` 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", " Budget,\n", " Evaluator,\n", " LearnedSurrogateModel,\n", " RngBundle,\n", " Trace,\n", " braess_scenario,\n", " viz,\n", ")" ] }, { "cell_type": "markdown", "id": "c39f54e9", "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": "2639ae1d", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:46:09.727561Z", "iopub.status.busy": "2026-07-21T13:46:09.727202Z", "iopub.status.idle": "2026-07-21T13:46:09.732476Z", "shell.execute_reply": "2026-07-21T13:46:09.731711Z" } }, "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": "81f555d1", "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": "eba17d03", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:46:09.736316Z", "iopub.status.busy": "2026-07-21T13:46:09.735866Z", "iopub.status.idle": "2026-07-21T13:46:09.768663Z", "shell.execute_reply": "2026-07-21T13:46:09.767975Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model : learned-surrogate\n", "emitted flows : [4.3202 0.0143 4.3202 0.0143 4.3202]\n", "self-report keys : ['predicted_mean_vc', 'training_sp_calls', 'training_wall_ms'] (no relative_gap)\n" ] } ], "source": [ "model = LearnedSurrogateModel()\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\"emitted flows : {np.round(final.link_flows, 4)}\")\n", "# The surrogate self-reports a predicted mean v/c ratio, but NO gap: it does not solve\n", "# an equilibrium, so `provides_gap=False` and there is no self-gap to trust or diff.\n", "print(f\"self-report keys : {sorted(final.self_report)} (no relative_gap)\")" ] }, { "cell_type": "markdown", "id": "3e261c3c", "metadata": {}, "source": [ "## Certify (P1) — the censoring\n", "\n", "The harness scores the surrogate with the *same* certificate as every solver. Its raw\n", "flows fail the demand-feasibility audit (node balance ≠ 0), so `feasible = 0` and the\n", "relative gap is **censored to `nan`** rather than scored. We recompute the true UE in-\n", "cell to show how far off the raw flows are — the censored gap is not hidden, it is\n", "reported as `nan`." ] }, { "cell_type": "code", "execution_count": 4, "id": "80155e34", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:46:09.772496Z", "iopub.status.busy": "2026-07-21T13:46:09.772077Z", "iopub.status.idle": "2026-07-21T13:46:09.778022Z", "shell.execute_reply": "2026-07-21T13:46:09.777347Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "feasible : 0 (0 = censored)\n", "certified relative gap : nan (nan = censored, not scored)\n", "node balance residual : 1.6655 (demand not conserved)\n", "true UE flows : [4. 2. 2. 2. 4.] (feasible, gap ~ 0)\n" ] } ], "source": [ "evaluator = Evaluator(scenario)\n", "metrics = evaluator.evaluate(final.link_flows)\n", "print(f\"feasible : {metrics['feasible']:.0f} (0 = censored)\")\n", "print(f\"certified relative gap : {metrics['relative_gap']} (nan = censored, not scored)\")\n", "print(f\"node balance residual : {metrics['node_balance_residual']:.4f} (demand not conserved)\")\n", "\n", "# The whole point: a demand-infeasible learned output is CENSORED, not scored.\n", "assert metrics[\"feasible\"] == 0.0\n", "assert np.isnan(metrics[\"relative_gap\"])\n", "assert metrics[\"node_balance_residual\"] > 1e-6\n", "\n", "# No honesty diff: the surrogate self-reports no gap (provides_gap=False).\n", "assert \"relative_gap\" not in final.self_report\n", "\n", "# Analytic anchor RECOMPUTED: the true Braess UE, which the raw surrogate is far from.\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", "print(f\"true UE flows : {ref_flows} (feasible, gap ~ 0)\")" ] }, { "cell_type": "markdown", "id": "6be262c4", "metadata": {}, "source": [ "## Visualize\n", "\n", "Both figures come from `tabench.viz`. Left/top: the surrogate's raw link flows on the\n", "Braess diamond — visibly not a conserved routing. Right/bottom: the raw flows against\n", "the true UE; the points sit far OFF the `y = x` guide, the censored gap made visual.\n", "(For a learned model that IS feasible by construction, see the torch `implicit-ue-nn`\n", "tutorial.)" ] }, { "cell_type": "code", "execution_count": 5, "id": "8dbcf143", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:46:09.781707Z", "iopub.status.busy": "2026-07-21T13:46:09.781269Z", "iopub.status.idle": "2026-07-21T13:46:10.050170Z", "shell.execute_reply": "2026-07-21T13:46:10.049331Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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02q1wGg0+r+v3E4AcObMaXz44YeYPn066tVLrNExyvdz9oKJQE2bNsXZs2cBlAfhjh07YLPZYLPlY+TIkcjKykJhYRF27tzFIKRaYxBSTMnOzsbkyVPw7LPP4vjxY8jKykLfvjdVe2qzOnPnzsX+/fvx2Wef4fTpbBw8eBAALvr6ESOG4/vv9+Pw4cNYu3ZNlRmaSuWlf70yMjJw4sSJgOrKyMiAw+FAXl5elcdPnjxZ7WzSupCZmYnly9/HhAkTqj1lGqj09EbIysqq8lhWVpa/h9mhQ3t4PG4sXLjQfxq0a9euePvtt6DRaNC2bdta/RxEDEKKKXa7HZIkITU1BUqlElu2bMGXX24N+PUlJaXQ63VITExEWVkZnn32uUtub7VaMWTIYEyYMAGZmU3QoUMH/3OpqWn49ddfLxqio0aNxL59+/DOO0vgcrngcDiwa9euardNT09Hz5498OSTT6KwsAherxdbtmzBpk2bMGLE8IB/vlC76aabsGjRItx119346quva7iPvsjLy8OiRYvh9Xqxa9curFq1CmPHjgEAqFQqdO/eHW+/PR+9evUCAFx//XV4++356NmzJxQKRch+HopPDEKKKVdccQUeeeRhDB48BE2bNsOaNWtw882BjdkBwF//ej+UShVatWqNbt26oXPnay/7mjvvvBM//PAj7rij6vV6d911F86ePYcmTZpWO/aXnp6O9evXYfXqVWjVqhXatWvvH2+szpIlS6BQKNCtWzc0b94cL7zwIpYseQcdO3assl3fvv2qXEd4ww1/DuyHr6E+fW7EkiVLcM899+CLL74M+vX16iXi449XY+XKlWjWrDmmTXsAr702B926dfNv06tXL5SUlPhPg15//fVVvieqDd6hnqiWsrOzcfXVf8KRI4eRlJQkdzlEFCT2CIlqwefz4Y033sStt97CECSKUlxZhqiGfv31V3Tr1h1NmjTBqlUr5S6HiGqIp0aJiCiu8dQoERHFNQYhERHFNQYhERHFNQYhERHFNQYhERHFNQYhERHFNQYhERHFNQYhERHFtf8H/9ANoZb12nwAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(viz.plot_network_flows(net, final.link_flows))\n", "display(viz.plot_flow_scatter((\"analytic UE\", ref_flows), {\"learned-surrogate\": final.link_flows}))" ] }, { "cell_type": "markdown", "id": "14b2ca76", "metadata": {}, "source": [ "## Takeaways & pointers\n", "\n", "- **Censored, not crashed, not scored.** Demand-infeasible flows get `feasible = 0` and\n", " a `nan` gap — garbage neither breaks the run nor tops the leaderboard (P1).\n", "- **No self-gap to trust.** The surrogate solves no equilibrium, so it reports none;\n", " the harness is the only authority.\n", "- **Where next.** A learned model feasible BY CONSTRUCTION: the torch\n", " `implicit-ue-nn` tutorial (planned, `10-learned/`, batch-11 — see\n", " [tutorials/README.md](../README.md)'s index; no link yet, it hasn't shipped); the\n", " certified solvers: [`bfw`](05-bfw.ipynb); ADR-026 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": "static", "unit": "learned-surrogate" } }, "nbformat": 4, "nbformat_minor": 5 }