{ "cells": [ { "cell_type": "markdown", "id": "8d66b206", "metadata": {}, "source": [ "# `spsa` — Spall's (1992) simultaneous perturbation stochastic approximation\n", "\n", "**What.** `spsa` (T2, ADR-002) is a BLACK-BOX OD calibrator: it never\n", "builds a route-choice proportion matrix at all. Each iteration perturbs the\n", "current OD estimate along a single random (Rademacher) direction, queries\n", "the assignment ORACLE (an inner MSA/AON sweep) at `g+ck*Delta` and\n", "`g-ck*Delta`, and takes a two-point finite-difference gradient step — the\n", "whole method needs only forward simulation queries, exactly Spall's (1992)\n", "motivation (multivariate finite differencing would cost `2*dim` queries per\n", "step; SPSA costs 2 regardless of dimension).\n", "\n", "**Why it is in the benchmark.** Per its own module docstring, `spsa` is \"the\n", "only shipped estimator that never sees `P`\" — every other static-T2\n", "estimator (`gls`/`spiess`/`vzw-entropy`/`od-congested`) builds and consumes\n", "an explicit MSA route-choice proportion matrix; `spsa` treats the inner\n", "assignment purely as a black-box loss oracle, exactly how a microsimulator\n", "or a neural surrogate would be calibrated. It is also the methodological\n", "ancestor of `spsa-sumo` (batch-12), which swaps the inner oracle for a real\n", "microsimulator, and it is the ONLY static-T2 estimator registered as\n", "`deterministic=False` (seeded, not deterministic — macroreplicated like a\n", "stochastic model).\n", "\n", "**Scope.** Seeded byte-reproducibility on the convex two-route corridor, the\n", "macroreplication-draws-distinct-perturbations regression (needs >=2 OD pairs\n", "— SPSA is invariant to the Rademacher SIGN in 1-D), and a certified Braess\n", "recovery.\n", "\n", "**Canon.** `[spall1992multivariate]`, [docs/REFERENCES.md](../../docs/REFERENCES.md) / [docs/references.bib](../../docs/references.bib)." ] }, { "cell_type": "markdown", "id": "498c3990", "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 `ODCertifier` from the\n", "emitted OD matrix against the harness's own pinned BFW assignment of the\n", "truth — never from `spsa`'s self-report\n", "([README](../../README.md), *Certified, not self-reported*)." ] }, { "cell_type": "code", "execution_count": 1, "id": "f56fbefe", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:34.863419Z", "iopub.status.busy": "2026-07-21T13:47:34.863242Z", "iopub.status.idle": "2026-07-21T13:47:36.806703Z", "shell.execute_reply": "2026-07-21T13:47:36.805613Z" } }, "outputs": [], "source": [ "# Setup. `spsa` is a core estimator: a plain `pip install -e .` suffices —\n", "# no optional extra, so no guard cell. The inline backend is Agg-based\n", "# (headless CI renders into the notebook); NEVER matplotlib.use(\"Agg\")\n", "# in-kernel — it silently suppresses inline figure capture.\n", "%matplotlib inline\n", "import numpy as np\n", "\n", "from tabench import (\n", " Budget,\n", " Demand,\n", " Network,\n", " ODCertifier,\n", " RngBundle,\n", " SPSAEstimator,\n", " Trace,\n", " braess_scenario,\n", " two_route_scenario,\n", " viz,\n", ")\n", "from tabench.core.rng import SOURCE_OBSERVATION\n", "from tabench.estimation import ODTrace\n", "from tabench.estimation.base import EstimationTask\n", "from tabench.models.frank_wolfe import BiconjugateFrankWolfeModel\n", "from tabench.observe.levels import LinkCounts\n", "\n", "BRAESS_TRUTH = np.array([4.0, 2.0, 2.0, 2.0, 4.0]) # UE(D=6), recomputed below\n", "TWOROUTE_TRUTH = np.array([2.5, 2.5, 1.5, 1.5]) # UE(D=4), recomputed below\n", "\n", "# Analytic anchors recomputed, never quoted: pin both by an independent\n", "# high-precision BFW solve before EITHER constant is used as a data-generating\n", "# truth anywhere below.\n", "def _pinned_ue(scenario):\n", " trace = Trace()\n", " BiconjugateFrankWolfeModel().solve(\n", " scenario, Budget(iterations=5000, target_relative_gap=1e-10), RngBundle(0), trace\n", " )\n", " return trace.final.link_flows\n", "\n", "np.testing.assert_allclose(_pinned_ue(braess_scenario(6.0)), BRAESS_TRUTH, atol=1e-6)\n", "np.testing.assert_allclose(_pinned_ue(two_route_scenario(sue_theta=None)), TWOROUTE_TRUTH, atol=1e-6)\n", "\n", "\n", "def _single_pair_prior(d):\n", " m = np.zeros((2, 2))\n", " m[0, 1] = d\n", " return m\n", "\n", "\n", "def _task(scenario, truth, sensors, prior_matrix):\n", " ds = LinkCounts(np.asarray(sensors), 1, \"none\").observe(\n", " scenario, truth, RngBundle(0).generator(SOURCE_OBSERVATION)\n", " )\n", " return EstimationTask(\n", " name=\"t\", network=scenario.network, prior=Demand(np.asarray(prior_matrix, dtype=np.float64)),\n", " dataset=ds, identifiability={}, scenario_hash=scenario.content_hash(), seed=0,\n", " )" ] }, { "cell_type": "markdown", "id": "a61c0e92", "metadata": {}, "source": [ "`SPSAEstimator.capabilities` confirms the distinctive contract directly —\n", "compared against every other static-T2 estimator in this benchmark, `spsa`\n", "is the ONLY one registered as `deterministic=False`." ] }, { "cell_type": "code", "execution_count": 2, "id": "8a6b9259", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:36.810633Z", "iopub.status.busy": "2026-07-21T13:47:36.810269Z", "iopub.status.idle": "2026-07-21T13:47:36.815497Z", "shell.execute_reply": "2026-07-21T13:47:36.814823Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gls deterministic=True\n", "spiess deterministic=True\n", "vzw-entropy deterministic=True\n", "od-congested deterministic=True\n", "od-kalman deterministic=True\n", "spsa deterministic=False\n" ] } ], "source": [ "from tabench import GLSEstimator, SpiessEstimator, VZWEntropyEstimator\n", "from tabench.estimation import Yang1992Estimator, DavisNihanKalmanEstimator\n", "\n", "for cls in (GLSEstimator, SpiessEstimator, VZWEntropyEstimator, Yang1992Estimator,\n", " DavisNihanKalmanEstimator, SPSAEstimator):\n", " print(f\"{cls.name:12s} deterministic={cls().capabilities.deterministic}\")\n", "\n", "caps = SPSAEstimator().capabilities\n", "assert caps.deterministic is False # stochastic (Rademacher perturbations), but seedable\n", "assert caps.seedable is True\n", "for cls in (GLSEstimator, SpiessEstimator, VZWEntropyEstimator, Yang1992Estimator,\n", " DavisNihanKalmanEstimator):\n", " assert cls().capabilities.deterministic is True" ] }, { "cell_type": "markdown", "id": "62eccb45", "metadata": {}, "source": [ "## Seeded smoke: byte-reproducible under a fixed macroreplication\n", "\n", "Two-route, full sensors, a 200-sp-call budget: `spsa` recovers `D=4` to\n", "`|g-4|<0.2`, and re-running with the SAME `(seed, macrorep)` reproduces the\n", "OD matrix BYTE-IDENTICALLY (P8 determinism contract)." ] }, { "cell_type": "code", "execution_count": 3, "id": "31a73532", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:36.819092Z", "iopub.status.busy": "2026-07-21T13:47:36.818890Z", "iopub.status.idle": "2026-07-21T13:47:36.915015Z", "shell.execute_reply": "2026-07-21T13:47:36.914330Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "recovered D : 4.0923 (truth: 4.0)\n", "byte-identical rerun : True\n" ] } ], "source": [ "sc2 = two_route_scenario(sue_theta=None)\n", "task2 = _task(sc2, TWOROUTE_TRUTH, np.arange(4), _single_pair_prior(3.0))\n", "budget2 = Budget(sp_calls=200, iterations=10**6)\n", "t1 = ODTrace()\n", "SPSAEstimator().estimate(task2, budget2, RngBundle(0, macrorep=0), t1)\n", "print(f\"recovered D : {t1.final.od_matrix[0, 1]:.4f} (truth: 4.0)\")\n", "assert abs(t1.final.od_matrix[0, 1] - 4.0) < 0.2\n", "\n", "t2 = ODTrace()\n", "SPSAEstimator().estimate(task2, budget2, RngBundle(0, macrorep=0), t2)\n", "print(f\"byte-identical rerun : {np.array_equal(t1.final.od_matrix, t2.final.od_matrix)}\")\n", "assert np.array_equal(t1.final.od_matrix, t2.final.od_matrix)" ] }, { "cell_type": "markdown", "id": "4354cef7", "metadata": {}, "source": [ "## Macroreplications draw distinct perturbations\n", "\n", "SPSA's Rademacher direction is invariant to sign in 1-D, so this needs a\n", "network with >=2 OD pairs: a 3-zone hub (zones 1,2,3 route through node 4).\n", "Two runs at `macrorep=0` reproduce byte-identically; `macrorep=1` draws a\n", "genuinely different perturbation sequence." ] }, { "cell_type": "code", "execution_count": 4, "id": "8cc43199", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:36.918878Z", "iopub.status.busy": "2026-07-21T13:47:36.918590Z", "iopub.status.idle": "2026-07-21T13:47:37.179423Z", "shell.execute_reply": "2026-07-21T13:47:37.178637Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "macrorep=0 repeat byte-identical : True" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "macrorep=0 vs macrorep=1 differ : True\n" ] } ], "source": [ "net = Network(\n", " name=\"hub2\", n_nodes=4, n_zones=3, first_thru_node=4,\n", " init_node=np.array([1, 4, 4], dtype=np.int64),\n", " term_node=np.array([4, 2, 3], dtype=np.int64),\n", " capacity=np.array([4.0, 3.0, 3.0]), length=np.zeros(3),\n", " free_flow_time=np.array([1.0, 1.0, 1.0]), b=np.array([0.1, 0.1, 0.1]),\n", " power=np.ones(3), toll=np.zeros(3), link_type=np.ones(3, dtype=np.int64),\n", ")\n", "od = np.zeros((3, 3))\n", "od[0, 1], od[0, 2] = 3.0, 2.0\n", "from tabench import Scenario\n", "sc_hub = Scenario(\"hub2\", net, Demand(od), family=\"hub2\")\n", "truth_trace = Trace()\n", "BiconjugateFrankWolfeModel().solve(\n", " sc_hub, Budget(iterations=5000, target_relative_gap=1e-10), RngBundle(0), truth_trace\n", ")\n", "truth_hub = truth_trace.final.link_flows\n", "\n", "prior = np.zeros((3, 3))\n", "prior[0, 1], prior[0, 2] = 2.0, 3.0\n", "ds = LinkCounts(np.array([1, 2]), 1, \"none\").observe(\n", " sc_hub, truth_hub, RngBundle(0).generator(SOURCE_OBSERVATION)\n", ")\n", "task_hub = EstimationTask(\"t\", sc_hub.network, Demand(prior), ds, {}, sc_hub.content_hash(), seed=0)\n", "budget_hub = Budget(sp_calls=400, iterations=10**6)\n", "\n", "t0 = ODTrace()\n", "SPSAEstimator().estimate(task_hub, budget_hub, RngBundle(0, macrorep=0), t0)\n", "t0b = ODTrace()\n", "SPSAEstimator().estimate(task_hub, budget_hub, RngBundle(0, macrorep=0), t0b)\n", "t1_hub = ODTrace()\n", "SPSAEstimator().estimate(task_hub, budget_hub, RngBundle(0, macrorep=1), t1_hub)\n", "\n", "print(f\"macrorep=0 repeat byte-identical : {np.array_equal(t0.final.od_matrix, t0b.final.od_matrix)}\")\n", "print(f\"macrorep=0 vs macrorep=1 differ : {not np.array_equal(t0.final.od_matrix, t1_hub.final.od_matrix)}\")\n", "assert np.array_equal(t0.final.od_matrix, t0b.final.od_matrix)\n", "assert not np.array_equal(t0.final.od_matrix, t1_hub.final.od_matrix)" ] }, { "cell_type": "markdown", "id": "e2e4626e", "metadata": {}, "source": [ "## Certify: a Braess recovery, scored by the pinned harness\n", "\n", "`braess_scenario(6.0)` is frozen and content-hashed (P2). A larger sp-call\n", "budget lets `spsa` recover the full 5-link Braess network from an off prior." ] }, { "cell_type": "code", "execution_count": 5, "id": "a0cc23ef", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:37.182997Z", "iopub.status.busy": "2026-07-21T13:47:37.182825Z", "iopub.status.idle": "2026-07-21T13:47:43.637657Z", "shell.execute_reply": "2026-07-21T13:47:43.635922Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scenario : braess\n", "content hash : cf00f411cdccec88…\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "recovered D : 6.3901 (truth: 6.0)\n", "certified od_rmse : 0.2758\n" ] } ], "source": [ "sc = braess_scenario(6.0)\n", "print(f\"scenario : {sc.name}\")\n", "print(f\"content hash : {sc.content_hash()[:16]}…\")\n", "\n", "task_b = _task(sc, BRAESS_TRUTH, np.arange(5), _single_pair_prior(5.5))\n", "trace_b = ODTrace()\n", "SPSAEstimator(iters=200, k_inner=80).estimate(\n", " task_b, Budget(sp_calls=10**6, iterations=10**6), RngBundle(0, macrorep=0), trace_b\n", ")\n", "certifier = ODCertifier(\n", " sc, np.arange(5), np.array([], dtype=np.int64),\n", " BRAESS_TRUTH[None, :], BRAESS_TRUTH[[]][None, :], BRAESS_TRUTH,\n", " {\"linear_identifiable\": True},\n", ")\n", "metrics = certifier.certify(trace_b.final.od_matrix)\n", "print(f\"recovered D : {trace_b.final.od_matrix[0, 1]:.4f} (truth: 6.0)\")\n", "print(f\"certified od_rmse : {metrics['od_rmse']:.4f}\")\n", "assert metrics[\"od_feasible\"] == 1.0\n", "assert metrics[\"od_rmse\"] < 1.0 # SPSA is stochastic, not asserted to gls/spiess-level tightness" ] }, { "cell_type": "markdown", "id": "2632dd79", "metadata": {}, "source": [ "## Visualize\n", "\n", "`tabench.viz` draws the road `Network`'s link flows for the certified `spsa`\n", "Braess recovery vs the truth, re-assigned from the OD matrix above." ] }, { "cell_type": "code", "execution_count": 6, "id": "359335f4", "metadata": { "execution": { "iopub.execute_input": "2026-07-21T13:47:43.642875Z", "iopub.status.busy": "2026-07-21T13:47:43.642408Z", "iopub.status.idle": "2026-07-21T13:47:43.961769Z", "shell.execute_reply": "2026-07-21T13:47:43.960747Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAHXCAYAAADeCAHgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRt0lEQVR4nO3de3xT9f3H8VeSJm3SO70ABSoXwU1honK/CcptgIIoXjf3mwoDdN7v96GI4m1zFBGZmxfmBQQvqMBwKhcFBS+oQ6fCuAi0Te+XQHM5vz9qa0tbSNqmSdr38/Ho49EkJyefHkLf/X6/n5xj8njcBiIiInJM5lAXICIiEikUmiIiIn5SaIqIiPhJoSkiIuInhaaIiIifFJoiIiJ+UmiKiIj4SaEpIiLiJ4WmiIiInxSaIi3g1ltvZdasWX5tu3TpUoYNGxbkihrnH/94ll69TiAjoxNffPFFqMsRaXFRoS5ARCKD2+3mlltuYeXKFQwZMiTU5YiEhEaaIoLH48Ewjn4a6uzsbA4dOsSJJ57YqNdwu92Nep5IOFFoigB9+vTh0UcfY+TIUXTsmMG5555Hfn4B119/A5mZmZxyyqls2bKlevuSkhKuvvoaevU6gV69TuDaa6+jrKys+vFNmzYxePAQMjI6ccklv6GkpLTW6+3cuYsLLriA7t170Lt3bx5++GF8Pt8x68zKymLSpLNq3ffqqyvo168/AJ9//jlnnjmazp270K1bdy644IIG95WYmMTixYsZNGgwHTtmUFpa2mBdX3zxBf37DwDgxBNP4uST+wJQWlrKjTfexEkn9aZHj+P5wx/+QFFREQC7d+8mMTGJF154gb59T+GXvzyxusZJkyZx3HFd6dv3FP7xj2era5o3bx4XXHABN954E5mZmZx0Um9efXVF9eM+n49FixbRr19/OnXqzCmnnMq6desAMAyj+rHMzEwmTpzIt99+e8xjKhIIhabIT1auXMELLzzPN9/s4Mcff2T06NGMHHk6u3btYtq087juuuuqt7311lvZuXMnmzd/xEcffch33/2X2267HYCCgkIuuugipk+fzp49u/nNby7hlVdeqX5ueXk5kyefzemnn8433+zgnXfe4dVXV/DCCy8cs8Zp06axefNm9u3bV33fyy+/XB2ON910M+PHj2fPnt18880Orr766qPub9my5axcuYJ9+/ZisVgarOvkk09m8+aPAPjPf77miy8+B+DKK6+ioKCATZs2sn37F7jdHm666aZar/HOO+/w/vvvsX37F2RnZzNlyjlcdtnl7Nz5A//851LmzZvH++9/UL39u+/+myFDhrBr1y7uvPMOrr76akpKSgBYvHgxCxc+ydNPP82+fXt5443X6dKlCwBLlvyN559/npdffomdO3dy1llnccEFF1JRUXHM4yriL4WmyE8uu+xyOnfuTGJiImPGjKFdu3acffbZWCwWpk6dyn/+s4OKigp8Ph+vvLKMe++9h3bt2pGSksLdd9/NSy+9hM/nY82a1XTo0JHLLvs9UVFR/PrXv2bEiBHVr7NmzVoSE5OYPXs2NpuNLl26MHPmTJYtW37MGtPT0xk5ciSvvLIMgNzcXN577z0uvLAyNK3WKPbu3cuBAweIjo5m6NChR93fNddcTceOHYmOjg64LqfTyRtvvMEjjzxCUlISsbGx3HHH7axYsRKv11u93S233EJSUhIOh4OXXnqZoUOHMHXqOVgsFk488UQuueQSli1bVr39ySefXP34hRdWht733/8AwN/+9gy33XYrp5zSF5PJRJcuXTjhhBMAWLJkCbfffjs9evQgKiqKmTNncujQIbZu3XrM4yriLzUCifwkPT2t+nuHw17rtt1uxzAMysvLqaiooKKigszMzOrHu3btyuHDh8nLy+PAgYPVo58qXbp04fDhQwDs2bOHHTt21Hq+z2fQqVMnv+q88MILefjhh7n++utYvnw5AwcOqH69BQuyeOihBzn99JEkJSUxY8Z0ZsyY0eC+OnfuXP19oHXt3r0Hn8/HySf/qtb9ZrOZ7OzsGq/x87HYs2cPa9f+q9ZreL0+Bg8eXH27ffv06u9NJhN2ewylpZUjzb1799KjR49669mzZw8zZvwBi+XnsUBFhZv9+/fX/8OLNIJCUyRAqamp2Gw29uzZQ3p65S/4PXv2EB0dTUpKCh07dmDv3r21nrNv3z7S0lIB6NSpE3379uXdd9c16vUnTpzAddddx2effc5LL73MFVdcXv1Y9+7deOqppzAMg82bNzN58hT69x/AKaf0rXdfZvPPARNoXZ07d8JsNvPNN9/gcDjqPL579+6fXsNU6zUmTZrE3//+jF+vcaQuXbqwc+dOBgwYUOexTp068eCD8xg9enSj9i3iD03PigTIbDYzbdp5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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tabench import Scenario as _Scenario\n", "recovered_trace = Trace()\n", "BiconjugateFrankWolfeModel().solve(\n", " _Scenario(\"spsa-recovered\", sc.network, Demand(trace_b.final.od_matrix), family=sc.family),\n", " Budget(iterations=5000, target_relative_gap=1e-10), RngBundle(0), recovered_trace,\n", ")\n", "display(viz.plot_network_flows(sc.network, BRAESS_TRUTH))\n", "display(viz.plot_flow_scatter(\n", " (\"truth (D=6)\", BRAESS_TRUTH),\n", " {\"spsa recovered\": recovered_trace.final.link_flows},\n", "))" ] }, { "cell_type": "markdown", "id": "2004de6d", "metadata": {}, "source": [ "## Takeaways & pointers\n", "\n", "- **Certified, not self-reported.** The Braess `od_rmse` above came from\n", " `ODCertifier`'s own re-assignment of the emitted OD matrix, never from\n", " `spsa`'s self-report.\n", "- **The only proportion-free estimator on the benchmark.** Confirmed\n", " directly from `SPSAEstimator.capabilities.inputs_required` — SPSA works\n", " from assignment-oracle queries alone.\n", "- **Seeded, not deterministic.** `deterministic=False` but the RNG stream is\n", " pinned by `(seed, macrorep)` — verified as byte-identical reproducibility\n", " above, the P8 contract every stochastic estimator on this benchmark obeys.\n", "- **Where next.** the SUMO-in-the-loop extension `spsa-sumo` (batch-12,\n", " swaps the inner oracle for a real microsimulator); the proportion-based\n", " estimators [`gls`](01-gls.ipynb) / [`spiess`](02-spiess.ipynb); the\n", " lineage in the [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": "estimation", "unit": "spsa" } }, "nbformat": 4, "nbformat_minor": 5 }