{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "94bc142d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:56:25.395621Z",
     "iopub.status.busy": "2026-06-19T07:56:25.395370Z",
     "iopub.status.idle": "2026-06-19T07:56:30.848312Z",
     "shell.execute_reply": "2026-06-19T07:56:30.847199Z"
    },
    "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 brainmass\n",
    "import brainstate\n",
    "import brainunit as u\n",
    "import jax.numpy as jnp\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "brainstate.random.seed(0)\n",
    "brainstate.environ.set(dt=0.1 * u.ms)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12406d65",
   "metadata": {},
   "source": [
    "# Why Differentiable?\n",
    "\n",
    "This is the page that explains what makes ``brainmass`` different. Other\n",
    "whole-brain toolkits run forward simulations and fit parameters with **grid** or\n",
    "**evolutionary** search. ``brainmass`` is built on JAX, so its entire pipeline —\n",
    "parameters → ODE solve → coupling → forward model → signal — is **differentiable**.\n",
    "You can backpropagate *through the ODE solve* and obtain the exact gradient of a\n",
    "loss with respect to every parameter at once.\n",
    "\n",
    "That single capability changes how you fit, scale, and even *train* neural mass\n",
    "models. This page builds the intuition, walks through the new application\n",
    "scenarios it unlocks, and places ``brainmass`` next to The Virtual Brain and\n",
    "neurolib with a conservative comparison."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7576dbcb",
   "metadata": {},
   "source": [
    "## The core idea: backprop through the solve\n",
    "\n",
    "A whole-brain simulation is a long composition of differentiable operations. A\n",
    "fixed-step solver advances the state $s$ by repeatedly applying an update map,\n",
    "\n",
    "$$\n",
    "s_{t+1} = \\Phi(s_t, \\theta), \\qquad t = 0, 1, \\dots, T-1,\n",
    "$$\n",
    "\n",
    "where $\\theta$ collects all parameters (local model parameters, coupling strength,\n",
    "forward-model constants). A scalar loss $\\mathcal{L}$ compares the resulting\n",
    "signal to data. Because every step $\\Phi$ is differentiable, the whole rollout is\n",
    "differentiable, and the chain rule gives\n",
    "\n",
    "$$\n",
    "\\frac{\\partial \\mathcal{L}}{\\partial \\theta}\n",
    "= \\sum_{t} \\frac{\\partial \\mathcal{L}}{\\partial s_T}\n",
    "  \\left(\\prod_{k>t} \\frac{\\partial \\Phi}{\\partial s_k}\\right)\n",
    "  \\frac{\\partial \\Phi}{\\partial \\theta}.\n",
    "$$\n",
    "\n",
    "**Reverse-mode automatic differentiation** (backpropagation through time) computes\n",
    "this entire sum in *one backward pass* whose cost is a small constant multiple of\n",
    "the forward simulation — **independent of the number of parameters**. JAX builds\n",
    "the backward pass automatically; you never write it.\n",
    "\n",
    "Contrast this with the standard alternatives:\n",
    "\n",
    "- **Grid search** evaluates the loss on a lattice of parameter values. The number\n",
    "  of points grows as $(\\text{resolution})^{\\,d}$ in the parameter dimension $d$ —\n",
    "  the curse of dimensionality. Feasible for 1–2 parameters, hopeless for many.\n",
    "- **Evolutionary / derivative-free search** (CMA-ES, differential evolution,\n",
    "  Nevergrad) needs *many* forward evaluations to estimate a good direction, and\n",
    "  the count climbs steeply with $d$. Robust and gradient-free, but sample-hungry.\n",
    "\n",
    "A gradient points *directly downhill*. Instead of probing the loss landscape with\n",
    "hundreds of blind forward runs, you get the steepest-descent direction from a\n",
    "single forward+backward pass and step along it."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd33a95e",
   "metadata": {},
   "source": [
    "## A picture: gradient vs blind search\n",
    "\n",
    "Consider fitting a single parameter (a region's Hopf bifurcation parameter $a$) so\n",
    "that the model's settled oscillation amplitude matches a target. The loss is a\n",
    "smooth bowl in $a$. A gradient tells us the slope at our current guess for *free*\n",
    "(one backward pass); grid/evolutionary methods would instead sample the bowl at\n",
    "many points to infer the same direction. Let's visualise that loss surface and the\n",
    "exact gradient at one point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1d9adb16",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:56:30.852068Z",
     "iopub.status.busy": "2026-06-19T07:56:30.851508Z",
     "iopub.status.idle": "2026-06-19T07:56:31.859120Z",
     "shell.execute_reply": "2026-06-19T07:56:31.858397Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss(0.4) = 0.1332\n",
      "exact d(loss)/da at a=0.4: -0.5733   (one backward pass through the solve)\n"
     ]
    }
   ],
   "source": [
    "import brainmass\n",
    "import brainstate\n",
    "import braintools\n",
    "import brainunit as u\n",
    "import jax\n",
    "import jax.numpy as jnp\n",
    "\n",
    "brainstate.random.seed(0)\n",
    "brainstate.environ.set(dt=0.1 * u.ms)\n",
    "\n",
    "\n",
    "def settled_amplitude(a_value):\n",
    "    # Build the model INSIDE the loss so the swept scalar is differentiated.\n",
    "    node = brainmass.HopfStep(in_size=1, a=a_value, w=0.3,\n",
    "                              init_x=braintools.init.Constant(0.5))\n",
    "    res = brainmass.Simulator(node, dt=0.1 * u.ms).run(\n",
    "        400 * u.ms, monitors=['x'], transient=200 * u.ms)\n",
    "    x = u.get_magnitude(res['x'])           # strip units before the reduction\n",
    "    return jnp.sqrt(jnp.mean(x ** 2)) * jnp.sqrt(2.0)   # RMS -> amplitude\n",
    "\n",
    "\n",
    "target = 1.0  # amplitude we want to match\n",
    "\n",
    "def loss(a_value):\n",
    "    return (settled_amplitude(a_value) - target) ** 2\n",
    "\n",
    "# The exact gradient of the loss wrt `a`, by backprop THROUGH the 2000-step solve.\n",
    "a0 = 0.4\n",
    "g = jax.grad(loss)(a0)\n",
    "print(f'loss({a0}) = {loss(a0):.4f}')\n",
    "print(f'exact d(loss)/da at a={a0}: {g:.4f}   (one backward pass through the solve)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "abd769f3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-06-19T07:56:31.862084Z",
     "iopub.status.busy": "2026-06-19T07:56:31.861792Z",
     "iopub.status.idle": "2026-06-19T07:56:31.402661Z",
     "shell.execute_reply": "2026-06-19T07:56:31.401649Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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eSxdupSvnvi7sHXrVnr06EGnTp04ceIEu3fvpnHjxur977zzDocOHWLt2rWcOnWKl156iYCAgCyn1O3bt4+GDRvqbRswYACVK1fmyJEjHDt2jPHjx2NqagpAQkICvr6+bN26lb///ps33niDV155Jd1UwBUrVuDo6Mjhw4cZMWIEw4YN46WXXqJZs2YcP36cDh068Morr/DgwQO9/caOHcsXX3zBkSNHcHJyokuXLpmWcNq3bx8DBw5k5MiRnD17lv/9738sX76cTz75BEgZxOnZsydarZbg4GAWL17MBx98kOXPat68eTRt2pShQ4cSERFBREQEbm5uXL9+nU6dOtGoUSNOnjzJokWL+O6775gxY0amxwoODua1117jnXfeISQkhDZt2mTY/9KlS/z8889s3LiRkJAQAOLj4xk9ejRHjx5l9+7dGBkZ0aNHD3XAqVWrVnofUvbu3Yujo6O67ciRIzx69IhmzZqpfRo3bszhw4dJLEEXlJeYBRFu375NcnIyLi4uettdXFzUTxcZiYmJoVKlSiQmJmJsbMw333xD+/btgZQVbFKP8fQxU+/LyMyZM5k2bVpeH0r+tG8PnTvDli0p7V27YOvWlG35EBcXV6D9hBClw6NHj5g5c2aBHS8uLo7Zs2fnqO+ECRPQarW5PsfFixf59ddfOXDggPpHevXq1bi5ubF582ZeeuklwsPDefHFF/H29gagatWq6v7h4eE0aNBATd48PT0zPVdERASPHz+mZ8+eeHh4AKjHzI22bdsyZswYvW0mJiZYW1tToUIFddtHH32k/t/T05P333+ftWvXMm7cOAA++eQT+vbtq/c3qn79+urjWrZsGeHh4bi6ugLw/vvvExgYyLJly/j0008zjO3q1atq/1Th4eGMHTuW2rVrA1CjRg31vkqVKqmJN8CIESPYvn0769ev10uq69evrz6eCRMmMGvWLBwdHRk6dCgAkydPZtGiRZw6dYomTZqo+02ZMkX9O75ixQoqV67Mpk2b6N27d7rYp02bxvjx4xk0aBCQ8nOePn0648aNY8qUKezatYtz586xfft29TF++umndOzYMcPnAlIGvLRaLZaWlno/m2+++QY3NzcWLFiARqOhdu3a3Lhxgw8++IDJkydjZJR+7HDevHkEBASoP7+aNWty8ODBdN+QJiUlsXLlSpycnNRtT0/1+P77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BwdEREQAAFQqFVJTU+Hr6wulUglPT0989NFHAB7e/R0+fDhsbGxgb2+P8ePHo6ysTH3MadOmIT8/H6tXr4ZMJoNMJsPly5ebPVpQV1eHhIQEODk5wdzcHMOHD8eJEyc0cktISMDChQthZ2cHFxcXjdx1eTQmXXPXWv4tzUtrseHh4ZgzZw4SExNha2sLZ2dnbNiwATU1NZg+fTq6desGX19f/PrrrxrnU6lUSElJQY8ePWBhYYHAwED88MMPLc5na3EtjUOb5ORk9OvXD5aWlnB2dkZsbCwaGhpanW8i6hgsZIlIUjZv3gxTU1McP34cq1evRlpaGr7++utm/VavXo3ly5fD3d0dFRUVGsWgvudRKBQoKCjAunXrAABLlizBypUrsXTpUpw7dw7btm2Ds7MzAKCmpgZJSUn4448/kJubC7lcjtdeew0qlUqdT0hICGbOnImKigpUVFTAw8Oj2XkXLlyIrKwsbN68GUVFRfD19UVERARu3bqlkZulpSWOHTuG1NRULF++HDk5Oe2au9byb2le9IndvHkzHBwccPz4ccyZMwexsbF44403EBoaiqKiIowZMwZRUVGora1Vx6SkpGDLli1Yt24diouLMW/ePEydOlVdwOqaz5biWhpHU0IICCGwfv16nDt3DpmZmcjKytK63oiokwgiIokICwsTfn5+QqVSqdsWLVok/Pz81Pvnzp2r3peeni68vLw0juHl5SXS09M12gIDA0VycrLGefr376/Rp7q6WiiVSrFhwwa9cr1586YAIM6cOaNx3Mfza9p27949YWZmJrZu3areX19fL9zc3ERqaqq6//DhwzWOMXjwYLFo0aIW82lt7vTNv+m86BPbNOcHDx4IS0tLERUVpW6rqKgQAERhYaEQQoj//vtPdOnSRRw5ckTj2DExMSIyMlJ93KbzqW+cPuPQJjIystk5iajz8I4sEUnK0KFDIZPJ1NshISE4f/48GhsbDXqegQMHamyXlJSgrq4OI0eO1Nr//PnziIyMhI+PD6ysrNSPMpSXl+t9zrKyMjQ0NGDYsGHqNjMzMwQHB6OkpETd9uKLL2rEubq64saNG60ev6W50zf/pvMC6Df2x3M2MTGBvb09+vXrp257dGf70TguXLiA2tpajB49Gl27dlV/tmzZ0uyRh8fpG6dtHE1duXIFcXFxCAgIgK2tLbp27YodO3bA3d291Vgi6hj8shcRPVfkcrn6udBHtD3zaGlpqbFtYWHR4nEnTJgALy8vbNiwAW5ublCpVAgICEB9fX37k26i6VsOZDJZs0cA2krf/JvOi76x2nJ+vO1Rgf1oHPfu3QMA7N27F927d9eIVSqVOsehb5y2cTzu5s2bGDx4MEaMGIG0tDR0794djY2NGDRoEAIDA1uMJaKOw0KWiCTl2LFjGttHjx5Fr169YGJiole8o6MjKioq1NvV1dW4dOlSq3G9evWChYUFcnNzMWPGDI19//zzD0pLS7Fhwwa89NJLAIDDhw83O4ZCoWjxznHPnj3Vz216eXkBeFhknzhxwiDvmtU1d7dv39Yrf230HXtb+fv7Q6lUory8HGFhYVr7aJtPfeL0kZ2djcbGRnz33XfqIvuLL75AQ0MDgoKCnvi4RGRYLGSJSFLKy8uRlJSE2bNno6ioCGvXrsVnn32md/yIESOQmZmJCRMmwMbGBsuWLdOrCDY3N8eiRYuwcOFCKBQKDBs2DDdv3kRxcTGmT58Oe3t7fPXVV3B1dUV5eTkWL17c7Bje3t44duwYLl++jK5duzZ79ZalpSViY2OxYMEC2NnZwdPTE6mpqaitrUVMTIzeY9RF19zZ2trqlb827YltSbdu3TB//nzMmzcPKpUKw4cPx507d1BQUAArKytER0drnU994vRhb2+P6upq/Pzzz/D390d2djZSUlLQvXt3ODo6tnt8RGQYLGSJSFLefvtt3L9/H8HBwTAxMcHcuXMxa9YsveOXLFmCS5cuYfz48bC2tsaKFSv0uiMLAEuXLoWpqSmWLVuG69evw9XVFe+88w7kcjm2b9+OhIQEBAQEoHfv3lizZg3Cw8M14ufPn4/o6Gj4+/vj/v37Ws+7cuVKqFQqREVF4e7duxg0aBD2798PW1tbvceoi665k8lkeuWvjb5jfxIrVqyAo6MjUlJScPHiRdjY2GDAgAF4//33AWifT29v71bj9DFhwgTExMQgKioKFhYWmDp1KiZPnowrV660e1xEZDgy0fRhMSIieubwV7CI6FnEtxYQERERkSSxkCUiIiIiSeKjBUREREQkSbwjS0RERESSxEKWiIiIiCSJhSwRERERSRILWSIiIiKSJBayRERERCRJLGSJiIiISJJYyBIRERGRJLGQJSIiIiJJYiFLRERERJLEQpaIiIiIJImFLBERERFJ0v8DuNS+7y8Haq4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 700x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Sample the loss bowl just to DRAW it; the optimiser never needs this many runs.\n",
    "a_grid = np.linspace(0.2, 2.2, 21)\n",
    "losses = [float(loss(float(a))) for a in a_grid]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 4))\n",
    "ax.plot(a_grid, losses, 'o-', color='0.5', label='loss surface (sampled to draw)')\n",
    "\n",
    "# Draw the exact gradient at a0 as a tangent line.\n",
    "l0 = float(loss(a0))\n",
    "ax.plot([a0 - 0.3, a0 + 0.3], [l0 - 0.3 * float(g), l0 + 0.3 * float(g)],\n",
    "        'r-', lw=2.5, label='exact gradient (1 backward pass)')\n",
    "ax.plot([a0], [l0], 'r^', ms=11)\n",
    "ax.set_xlabel('bifurcation parameter $a$')\n",
    "ax.set_ylabel('loss')\n",
    "ax.set_title('A gradient gives the descent direction for free')\n",
    "ax.legend()\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ab07d7a",
   "metadata": {},
   "source": [
    "The red tangent is the exact slope at our current guess, computed from a single\n",
    "forward+backward pass. Grid search would need the whole grey curve; evolutionary\n",
    "search would need many scattered samples to *estimate* that slope. With the\n",
    "gradient in hand, an optimiser steps straight toward the minimum — and the same\n",
    "mechanism scales to thousands of parameters with no extra cost per parameter.\n",
    "\n",
    "The hands-on version of this fit (with a real optimiser loop) is\n",
    "{doc}`/tutorials/06_fitting_with_gradients`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f308a334",
   "metadata": {},
   "source": [
    "## New application scenarios\n",
    "\n",
    "Differentiability is not just \"faster fitting of one knob.\" It opens qualitatively\n",
    "new ways of working that grid/evolutionary search cannot reach.\n",
    "\n",
    "### 1. Efficient subject-specific fitting\n",
    "\n",
    "Personalising a whole-brain model to one subject means fitting many local and\n",
    "coupling parameters to that subject's data. With gradients, a quasi-Newton or Adam\n",
    "optimiser converges in tens of iterations regardless of the parameter count,\n",
    "turning an overnight evolutionary search into minutes. Per-subject fits become\n",
    "routine rather than a compute project.\n",
    "\n",
    "### 2. High-dimensional parameter *fields*\n",
    "\n",
    "You are no longer restricted to a few global knobs. You can give **every region**\n",
    "(or every edge) its own parameter — a spatial *field* of excitability, gain, or\n",
    "coupling — and fit all of them jointly, because the gradient w.r.t. a\n",
    "thousand-dimensional field costs the same backward pass as the gradient w.r.t. one\n",
    "scalar. This is simply infeasible with grid search and painfully sample-hungry for\n",
    "evolutionary methods.\n",
    "\n",
    "### 3. Gradient- and Hessian-based identifiability\n",
    "\n",
    "The gradient (and, via JAX, the **Hessian** or Fisher information) tells you about\n",
    "the *geometry* of the loss around an optimum: which parameter combinations are\n",
    "well-constrained by the data and which are sloppy. This is the basis of\n",
    "identifiability and sensitivity analysis — and it falls out of the same autodiff\n",
    "machinery, with no finite-difference noise.\n",
    "\n",
    "### 4. Training NMM networks on tasks\n",
    "\n",
    "Because the rollout is differentiable end-to-end, a network of neural masses can be\n",
    "**trained** the way a recurrent neural network is — minimise a task loss\n",
    "(classification, working memory, prediction) by gradient descent on the model's\n",
    "parameters. The model becomes a trainable, biologically-structured RNN. See\n",
    "{doc}`/tutorials/08_training_on_tasks` for a worked delayed-match-to-sample task.\n",
    "\n",
    "### 5. End-to-end differentiable parameters → signal\n",
    "\n",
    "The forward models (BOLD hemodynamics, EEG/MEG lead fields) are themselves\n",
    "differentiable, so the gradient flows *all the way* from a neuroimaging-space loss\n",
    "back to the underlying neural parameters. You can fit directly in BOLD or sensor\n",
    "space — parameters → activity → signal → loss — without hand-deriving any\n",
    "sensitivities."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "259109ec",
   "metadata": {},
   "source": [
    "## When *not* to use gradients\n",
    "\n",
    "Gradients are powerful but not universal, and ``brainmass`` is honest about this —\n",
    "the same ``Fitter`` exposes gradient-free backends for good reason:\n",
    "\n",
    "- **Non-smooth or phase-degenerate objectives.** Matching an oscillatory time\n",
    "  series point-by-point has a flat / degenerate gradient (a phase mismatch kills\n",
    "  it). Fit a **scalar summary** — amplitude, functional connectivity, a spectral\n",
    "  peak — instead, or fall back to a derivative-free backend.\n",
    "- **Rugged, multi-modal landscapes** where you need global exploration: a\n",
    "  population-based method (Nevergrad's differential evolution) may find the basin\n",
    "  that gradient descent then refines.\n",
    "- **Discrete or non-differentiable parameters.**\n",
    "\n",
    "``brainmass.Fitter`` lets you write the objective **once** and switch between\n",
    "``backend='grad'``, ``'nevergrad'``, and ``'scipy'`` — see\n",
    "{doc}`/tutorials/07_gradient_free_fitting`. Differentiability is the *default\n",
    "advantage*, not a straitjacket."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24d44fbf",
   "metadata": {},
   "source": [
    "## How brainmass compares\n",
    "\n",
    "``brainmass`` shares the neural-mass / whole-brain modelling space with\n",
    "[The Virtual Brain](https://www.thevirtualbrain.org/) (TVB) and\n",
    "[neurolib](https://github.com/neurolib-dev/neurolib). Both are mature, widely-used,\n",
    "and excellent — but both are built on **NumPy/Numba**, run forward simulations, and\n",
    "fit parameters with grid or evolutionary search. Neither has an automatic-\n",
    "differentiation / JAX core, so neither can backpropagate through the solve or run\n",
    "natively on GPU/TPU.\n",
    "\n",
    "The table below mirrors the landing-page summary. It is deliberately\n",
    "**conservative**: \"Partial\" means a capability exists in some form but is narrower\n",
    "than ``brainmass``'s, and the picture reflects the state of these projects at the\n",
    "time of writing — consult each project for its current status.\n",
    "\n",
    "| Capability | brainmass | The Virtual Brain | neurolib |\n",
    "|---|---|---|---|\n",
    "| Differentiable / gradient-based fitting (backprop through the solve) | Yes | No | No |\n",
    "| JAX backend with GPU / TPU acceleration | Yes | No | No |\n",
    "| In-package orchestration & fitting (``Simulator`` / ``Network`` / ``Fitter``) | Yes | Partial | Partial |\n",
    "| Unit-safe quantities (dimensional analysis) | Yes | No | No |\n",
    "| Next-generation / exact mean-field models (e.g. Montbrió-Pazó-Roxin, Coombes-Byrne) | Yes | Partial | Partial |\n",
    "| In-package BOLD + EEG/MEG forward models | Yes | Yes | Partial |\n",
    "\n",
    "A few notes to keep the claims fair:\n",
    "\n",
    "- **TVB and neurolib are not autodiff/JAX frameworks.** They are numpy/numba-based.\n",
    "  This is a factual statement about backend, not a judgement of quality — TVB in\n",
    "  particular has the richest connectome tooling, GUI, and community in the field.\n",
    "- **\"In-package forward models.\"** TVB ships BOLD and EEG/MEG forward models, so it\n",
    "  earns a \"Yes.\" neurolib focuses on BOLD, hence \"Partial.\"\n",
    "- **\"Next-generation mean fields.\"** All three offer some next-generation models;\n",
    "  ``brainmass`` derives several (Montbrió-Pazó-Roxin, Coombes-Byrne) *exactly* from\n",
    "  spiking networks, which is the differentiator behind the \"Yes.\"\n",
    "\n",
    "The deeper rationale for the JAX-native choice is the whole of this page; the\n",
    "landing page links back here for exactly that reason."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e54fca95",
   "metadata": {},
   "source": [
    "## Where to go next\n",
    "\n",
    "This page is the conceptual hub for the differentiable workflow. The hands-on path\n",
    "through it is:\n",
    "\n",
    "- {doc}`/tutorials/06_fitting_with_gradients` — fit a parameter by backprop through\n",
    "  the ``Simulator`` (the worked version of the example above).\n",
    "- {doc}`/tutorials/07_gradient_free_fitting` — the same objective with Nevergrad and\n",
    "  SciPy backends, head-to-head with gradients.\n",
    "- {doc}`/tutorials/08_training_on_tasks` — *train* a neural-mass network on a task.\n",
    "- {doc}`/data_driven/index` — the data-driven modelling hub that curates the full\n",
    "  differentiable workflow and its roadmap.\n",
    "\n",
    "And for the conceptual neighbours:\n",
    "\n",
    "- {doc}`/concepts/what_is_a_neural_mass_model` — what these models are.\n",
    "- {doc}`/concepts/architecture_overview` — how the differentiable pipeline is built.\n",
    "\n",
    "## References\n",
    "\n",
    "- Baydin, A. G., Pearlmutter, B. A., Radul, A. A., & Siskind, J. M. (2018).\n",
    "  Automatic differentiation in machine learning: a survey. *Journal of Machine\n",
    "  Learning Research*, 18(153), 1–43.\n",
    "- Bradbury, J., et al. (2018). *JAX: composable transformations of Python+NumPy\n",
    "  programs*. http://github.com/google/jax\n",
    "- Sanz Leon, P., et al. (2013). The Virtual Brain: a simulator of primate brain\n",
    "  network dynamics. *Frontiers in Neuroinformatics*, 7, 10.\n",
    "- Cakan, C., Jajcay, N., & Obermayer, K. (2023). neurolib: a simulation framework\n",
    "  for whole-brain neural mass modeling. *Cognitive Computation*, 15, 1132–1152.\n",
    "- Montbrió, E., Pazó, D., & Roxin, A. (2015). Macroscopic description for networks\n",
    "  of spiking neurons. *Physical Review X*, 5(2), 021028."
   ]
  }
 ],
 "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
}
