{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "49b3ae6d6957",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:42.019636Z",
     "iopub.status.busy": "2026-06-19T07:41:42.019266Z",
     "iopub.status.idle": "2026-06-19T07:41:47.257617Z",
     "shell.execute_reply": "2026-06-19T07:41:47.256653Z"
    },
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import warnings\n",
    "import time\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import jax\n",
    "import jax.numpy as jnp\n",
    "import brainstate\n",
    "import braintools\n",
    "import brainunit as u\n",
    "import brainmass\n",
    "from brainmass import objectives\n",
    "from brainstate.nn import Param\n",
    "brainstate.environ.set(dt=0.1 * u.ms)\n",
    "brainstate.random.seed(0)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "680901ab72b0",
   "metadata": {},
   "source": [
    "# Run Parameter Sweeps\n",
    "\n",
    "**Goal:** evaluate a model over a grid of parameter values, collect the results\n",
    "into a tidy table, and visualize them as a heatmap.\n",
    "\n",
    "The idiom is a single `brainstate.transform.vmap` over a function that builds the\n",
    "model *inside* itself — one simulation per grid point, all fused into one\n",
    "compiled program. No Python loop over parameters, no manual batching.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5797f5cfd597",
   "metadata": {},
   "source": [
    "## 1-D sweep\n",
    "\n",
    "Start with one parameter. We sweep the Hopf bifurcation parameter `a` and measure\n",
    "the **settled limit-cycle amplitude** (a scalar summary — see\n",
    "{doc}`/tutorials/06_fitting_with_gradients` for why scalar summaries beat raw\n",
    "time series for oscillators).\n",
    "\n",
    "The pattern: write `run_one(a)` that constructs the model with that `a`, runs a\n",
    "`Simulator`, and returns a scalar; then `vmap` it over the value array.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "73a76f7d4bb7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:47.260469Z",
     "iopub.status.busy": "2026-06-19T07:41:47.260007Z",
     "iopub.status.idle": "2026-06-19T07:41:48.051809Z",
     "shell.execute_reply": "2026-06-19T07:41:48.050738Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "swept 16 values in one vmap call\n"
     ]
    }
   ],
   "source": [
    "def amplitude_for(a):\n",
    "    node = brainmass.HopfStep(in_size=1, a=a, w=0.3,\n",
    "                              init_x=braintools.init.Constant(0.5))\n",
    "    res = brainmass.Simulator(node, dt=0.1 * u.ms).run(\n",
    "        150 * u.ms, monitors=['x'], transient=50 * u.ms)\n",
    "    x = u.get_magnitude(res['x'])[:, 0]\n",
    "    return jnp.sqrt(jnp.mean(x ** 2)) * jnp.sqrt(2.0)  # RMS limit-cycle amplitude\n",
    "\n",
    "a_values = jnp.linspace(0.0, 1.5, 16)\n",
    "amps = brainstate.transform.vmap(amplitude_for)(a_values)\n",
    "print(\"swept\", len(a_values), \"values in one vmap call\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cbe41f397571",
   "metadata": {},
   "source": [
    "Plot the sweep. The amplitude grows like `√a` past the bifurcation at `a = 0`,\n",
    "the signature of a supercritical Hopf.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "24863f3d11ee",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:48.054573Z",
     "iopub.status.busy": "2026-06-19T07:41:48.054112Z",
     "iopub.status.idle": "2026-06-19T07:41:48.152301Z",
     "shell.execute_reply": "2026-06-19T07:41:48.150965Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(5, 3))\n",
    "ax.plot(np.asarray(a_values), np.asarray(amps), 'o-')\n",
    "ax.set_xlabel('bifurcation parameter a')\n",
    "ax.set_ylabel('settled amplitude')\n",
    "ax.set_title('1-D sweep: Hopf amplitude vs a')\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b7d6e1439df",
   "metadata": {},
   "source": [
    "## 2-D sweep → tidy table\n",
    "\n",
    "For two parameters, build a mesh, flatten it, `vmap` over the flattened pairs,\n",
    "then reshape the result back to the grid. Here we sweep `a` (bifurcation) against\n",
    "`w` (intrinsic frequency).\n",
    "\n",
    "`brainstate.transform.vmap` maps over the leading axis of each argument, so we\n",
    "pass the two flattened coordinate arrays.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f384e153cc55",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:48.154614Z",
     "iopub.status.busy": "2026-06-19T07:41:48.154322Z",
     "iopub.status.idle": "2026-06-19T07:41:48.874973Z",
     "shell.execute_reply": "2026-06-19T07:41:48.874037Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "grid shape: (6, 5) (len(a), len(w))\n"
     ]
    }
   ],
   "source": [
    "a_grid = jnp.linspace(0.1, 1.5, 6)\n",
    "w_grid = jnp.linspace(0.1, 0.6, 5)\n",
    "AA, WW = jnp.meshgrid(a_grid, w_grid, indexing='ij')\n",
    "\n",
    "def amplitude_aw(a, w):\n",
    "    node = brainmass.HopfStep(in_size=1, a=a, w=w,\n",
    "                              init_x=braintools.init.Constant(0.5))\n",
    "    res = brainmass.Simulator(node, dt=0.1 * u.ms).run(\n",
    "        150 * u.ms, monitors=['x'], transient=50 * u.ms)\n",
    "    x = u.get_magnitude(res['x'])[:, 0]\n",
    "    return jnp.sqrt(jnp.mean(x ** 2)) * jnp.sqrt(2.0)\n",
    "\n",
    "amp_flat = brainstate.transform.vmap(amplitude_aw)(AA.reshape(-1), WW.reshape(-1))\n",
    "amp_grid = np.asarray(amp_flat).reshape(AA.shape)\n",
    "print(\"grid shape:\", amp_grid.shape, \"(len(a), len(w))\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f5b05bca377",
   "metadata": {},
   "source": [
    "Collect the results into a tidy, long-format table. We use a plain dict of\n",
    "columns (numpy) so there is no hard pandas dependency; convert to a\n",
    "`pandas.DataFrame` in one line if you have it installed.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f5c125f7c523",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:48.877658Z",
     "iopub.status.busy": "2026-06-19T07:41:48.877348Z",
     "iopub.status.idle": "2026-06-19T07:41:48.884231Z",
     "shell.execute_reply": "2026-06-19T07:41:48.882585Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     a      w  amplitude\n",
      "  0.10   0.10      0.313\n",
      "  0.10   0.23      0.318\n",
      "  0.10   0.35      0.325\n",
      "  0.10   0.48      0.333\n",
      "  0.10   0.60      0.343\n",
      "  0.38   0.10      0.609\n",
      "  0.38   0.23      0.615\n",
      "  0.38   0.35      0.621\n",
      "... (30 rows total)\n"
     ]
    }
   ],
   "source": [
    "table = {\n",
    "    'a': np.asarray(AA).reshape(-1),\n",
    "    'w': np.asarray(WW).reshape(-1),\n",
    "    'amplitude': np.asarray(amp_flat),\n",
    "}\n",
    "\n",
    "# Pretty-print the first few rows (pandas optional: pd.DataFrame(table)).\n",
    "print(f\"{'a':>6} {'w':>6} {'amplitude':>10}\")\n",
    "for i in range(8):\n",
    "    print(f\"{table['a'][i]:6.2f} {table['w'][i]:6.2f} {table['amplitude'][i]:10.3f}\")\n",
    "print(f\"... ({len(table['a'])} rows total)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9789ded745ed",
   "metadata": {},
   "source": [
    "## Heatmap\n",
    "\n",
    "Visualize the 2-D grid with `brainmass.viz.plot_connectivity` (it draws any\n",
    "matrix as a labelled heatmap with a colorbar — not just connectomes). The\n",
    "amplitude depends almost entirely on `a` (the bifurcation parameter), so the\n",
    "heatmap shows horizontal bands.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "142a24f722b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:48.887753Z",
     "iopub.status.busy": "2026-06-19T07:41:48.887296Z",
     "iopub.status.idle": "2026-06-19T07:41:49.061047Z",
     "shell.execute_reply": "2026-06-19T07:41:49.060263Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(5, 4))\n",
    "brainmass.viz.plot_connectivity(\n",
    "    amp_grid, ax=ax, cmap='magma',\n",
    "    labels=None,\n",
    ")\n",
    "ax.set_xlabel('w index')\n",
    "ax.set_ylabel('a index')\n",
    "ax.set_title('Amplitude over the (a, w) grid')\n",
    "# annotate the real axis values\n",
    "ax.set_xticks(range(len(w_grid)))\n",
    "ax.set_xticklabels([f'{float(w):.2f}' for w in w_grid], rotation=90)\n",
    "ax.set_yticks(range(len(a_grid)))\n",
    "ax.set_yticklabels([f'{float(a):.2f}' for a in a_grid])\n",
    "ax.set_xlabel('w')\n",
    "ax.set_ylabel('a')\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef664ef2d040",
   "metadata": {},
   "source": [
    "## Sweeping a network coupling\n",
    "\n",
    "The same pattern sweeps a *network* parameter. Here we vary the global coupling\n",
    "strength `k` of a diffusive `Network` and measure the mean functional-connectivity\n",
    "strength — a standard way to find the coupling regime that best matches data.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "88e681d122d3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:41:49.063043Z",
     "iopub.status.busy": "2026-06-19T07:41:49.062813Z",
     "iopub.status.idle": "2026-06-19T07:41:51.892790Z",
     "shell.execute_reply": "2026-06-19T07:41:51.891922Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "conn = brainmass.datasets.load_dataset('example_connectome')\n",
    "W, D, N = conn.weights, conn.distances, conn.weights.shape[0]\n",
    "\n",
    "def mean_fc_for(k):\n",
    "    node = brainmass.HopfStep(in_size=N, a=0.2, w=0.3,\n",
    "                              init_x=braintools.init.Constant(0.3))\n",
    "    net = brainmass.Network(node, conn=W, distance=D, speed=10 * u.mm / u.ms,\n",
    "                            coupling='diffusive', coupled_var='x', k=k)\n",
    "    res = brainmass.Simulator(net, dt=0.1 * u.ms).run(\n",
    "        600 * u.ms, monitors=lambda m: m.node.x.value, transient=100 * u.ms)\n",
    "    sig = u.get_magnitude(res['output'])\n",
    "    fc = braintools.metric.functional_connectivity(sig)\n",
    "    iu = np.triu_indices(N, 1)\n",
    "    return jnp.mean(fc[iu])\n",
    "\n",
    "k_values = jnp.linspace(0.0, 1.5, 8)\n",
    "# A delay-coupled Network reads dt from the global environment at construction,\n",
    "# so set it once before vmap builds the networks.\n",
    "brainstate.environ.set(dt=0.1 * u.ms)\n",
    "mean_fc = brainstate.transform.vmap(mean_fc_for)(k_values)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(5, 3))\n",
    "ax.plot(np.asarray(k_values), np.asarray(mean_fc), 'o-')\n",
    "ax.set_xlabel('global coupling k')\n",
    "ax.set_ylabel('mean functional connectivity')\n",
    "ax.set_title('Coupling sweep: FC vs k')\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4551ba9c84b",
   "metadata": {},
   "source": [
    "## Tips\n",
    "\n",
    "- **Build the model inside the swept function.** `vmap` traces the body once with\n",
    "  abstract values; constructing the model outside and mutating it does not batch\n",
    "  correctly.\n",
    "- **Return a scalar (or fixed-shape) summary.** `vmap` stacks the per-point\n",
    "  results, so every call must return the same shape.\n",
    "- **Delay-coupled networks need a global `dt`.** `Network(..., distance=, speed=)`\n",
    "  sizes its delay buffers from `brainstate.environ.get_dt()` at construction —\n",
    "  set `dt` once before the sweep (a known ergonomic wrinkle).\n",
    "- **Fill the device.** A sweep is the natural way to keep a GPU busy; see\n",
    "  {doc}`/howto/batch_and_accelerate`.\n",
    "\n",
    "## Next steps\n",
    "\n",
    "- {doc}`/howto/batch_and_accelerate` — the `vmap` / `jit` mechanics in depth.\n",
    "- {doc}`/howto/analyze_results` — turn swept trajectories into FC / FCD / spectra.\n",
    "- {doc}`/tutorials/06_fitting_with_gradients` — let an optimizer *find* the best\n",
    "  parameters instead of gridding them.\n"
   ]
  }
 ],
 "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.13.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
