{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1537d3aa",
   "metadata": {},
   "source": [
    "# Spiking network modeling with ``brainspike``\n",
    "\n",
    "[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/chaobrain/brainx/blob/main/docs/tutorials/brainspike_NEST_compatible.ipynb)\n",
    "[![Open in Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/chaobrain/brainx/blob/main/docs/tutorials/brainspike_NEST_compatible.ipynb)\n",
    "\n",
    "``brainspike`` is the BrainX package for point-neuron spiking networks. This tutorial introduces its [**NEST-compatible models**](https://brainx.chaobrain.com/brainspike/nest-style/index.html) and the NEST-style ``Simulator``.\n",
    "\n",
    "NEST-compatible modeling is designed for users who know the NEST simulator, want to port NEST-style scripts, compare with NEST-style models, or prefer an explicit node/device/recorder workflow. It keeps familiar ideas such as creating model nodes, connecting populations, simulating a time window, and recording voltages or spikes. At the same time, the model stays inside the BrainX ecosystem: values use explicit physical units from ``brainunit``, simulation state is managed by ``brainspike`` and ``brainstate``, and computations use JAX-compatible arrays.\n",
    "\n",
    "For the complete model catalog, API reference, validation notes, and guides, read the full [brainspike documentation](https://brainx.chaobrain.com/brainspike/).\n",
    "\n",
    "You will learn how to:\n",
    "\n",
    "1. create NEST-compatible model nodes and recording devices with ``Simulator.create()``;\n",
    "2. connect populations, projections, and recorders with ``Simulator.connect()``;\n",
    "3. simulate a network for a unit-aware duration with ``Simulator.simulate()``;\n",
    "4. read membrane traces and spike events from the returned result object;\n",
    "5. extend the same workflow from one neuron to connection rules and a small excitatory/inhibitory network.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d6e5608",
   "metadata": {},
   "source": [
    "## Setup\n",
    "\n",
    "Enable JAX x64 before importing `brainspike`, then give each `Simulator` an explicit unit-aware time step. The examples below use milliseconds, picoamperes, and millivolts from `brainunit`.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "74031e1a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:32.238602Z",
     "iopub.status.busy": "2026-10-24T15:12:32.238446Z",
     "iopub.status.idle": "2026-10-24T15:12:34.203257Z",
     "shell.execute_reply": "2026-10-24T15:12:34.202193Z"
    }
   },
   "outputs": [],
   "source": [
    "import jax\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import brainunit as u\n",
    "import brainspike"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19cced9d",
   "metadata": {},
   "source": [
    "## 1. Create: model nodes\n",
    "\n",
    "`Simulator.create()` is the `brainspike` counterpart of NEST's `Create`. It returns a `NodeView`, which is a handle to the created population or device.\n",
    "\n",
    "The example below creates one `iaf_psc_alpha` neuron. Parameters use NEST-compatible names such as `I_e`, `V_th`, `V_reset`, and `E_L`, while values remain explicit `brainunit` quantities.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4ab7338b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:34.205791Z",
     "iopub.status.busy": "2026-10-24T15:12:34.205399Z",
     "iopub.status.idle": "2026-10-24T15:12:35.760708Z",
     "shell.execute_reply": "2026-10-24T15:12:35.759858Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<brainspike.NodeView object at 0x70285d1397f0>\n",
      "number of nodes = 1\n"
     ]
    }
   ],
   "source": [
    "sim = brainspike.Simulator(dt=0.1 * u.ms)\n",
    "\n",
    "neuron = sim.create(\n",
    "    brainspike.iaf_psc_alpha,\n",
    "    params={\n",
    "        \"I_e\": 376.0 * u.pA,\n",
    "        \"V_th\": -55.0 * u.mV,\n",
    "        \"V_reset\": -70.0 * u.mV,\n",
    "        \"E_L\": -70.0 * u.mV,\n",
    "    },\n",
    ")\n",
    "\n",
    "print(neuron)\n",
    "print(f\"number of nodes = {len(neuron)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1beaeafa",
   "metadata": {},
   "source": [
    "## 2. Connect: recording devices\n",
    "\n",
    "Recording devices follow NEST's connection direction:\n",
    "\n",
    "- a `voltmeter` observes a neuron, so connect `voltmeter -> neuron`;\n",
    "- a `spike_recorder` receives spike events, so connect `neuron -> spike_recorder`.\n",
    "\n",
    "The same `Simulator.connect()` method registers either a projection or a recorder tap depending on the source and target types.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "03ff21d6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:35.763289Z",
     "iopub.status.busy": "2026-10-24T15:12:35.762905Z",
     "iopub.status.idle": "2026-10-24T15:12:35.768097Z",
     "shell.execute_reply": "2026-10-24T15:12:35.767210Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "recorders are connected\n"
     ]
    }
   ],
   "source": [
    "vm = sim.create(brainspike.voltmeter, interval=0.1 * u.ms)\n",
    "sr = sim.create(brainspike.spike_recorder)\n",
    "\n",
    "sim.connect(vm, neuron)      # voltmeter observes the neuron\n",
    "sim.connect(neuron, sr)      # spike_recorder receives emitted spikes\n",
    "\n",
    "print(\"recorders are connected\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b42e4ca",
   "metadata": {},
   "source": [
    "## 3. Simulate: run the model\n",
    "\n",
    "`Simulator.simulate()` is the explicit runner. It returns a `SimulationResult` object with helper methods for recorded variables:\n",
    "\n",
    "- `trace(recorder, \"V_m\")` returns a membrane-potential trace from a voltmeter or multimeter;\n",
    "- `spikes(recorder)` returns a time-by-node spike matrix;\n",
    "- `n_events(recorder)` counts recorded spikes;\n",
    "- `rate(recorder)` reports the mean firing rate in spikes per second.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2c70142c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:35.770674Z",
     "iopub.status.busy": "2026-10-24T15:12:35.770401Z",
     "iopub.status.idle": "2026-10-24T15:12:36.406269Z",
     "shell.execute_reply": "2026-10-24T15:12:36.405460Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "V_m shape     = (800, 1)\n",
      "spikes shape  = (800, 1)\n",
      "spike count   = 1\n",
      "firing rate   = 12.50 Hz\n"
     ]
    }
   ],
   "source": [
    "result = sim.simulate(80.0 * u.ms)\n",
    "\n",
    "V_m = result.trace(vm, \"V_m\")\n",
    "spikes = result.spikes(sr)\n",
    "times = result.times\n",
    "\n",
    "print(f\"V_m shape     = {V_m.shape}\")\n",
    "print(f\"spikes shape  = {spikes.shape}\")\n",
    "print(f\"spike count   = {result.n_events(sr)}\")\n",
    "print(f\"firing rate   = {result.rate(sr):.2f} Hz\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ba48e34",
   "metadata": {},
   "source": [
    "## 4. Record: visualize traces and events\n",
    "\n",
    "The result object separates simulation from analysis. Once the run has finished, use recorder handles to extract arrays and plot them with ordinary Python tools. This mirrors the NEST habit of attaching devices first and reading them after `Simulate`.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6606f9c9",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:36.408889Z",
     "iopub.status.busy": "2026-10-24T15:12:36.408657Z",
     "iopub.status.idle": "2026-10-24T15:12:36.587315Z",
     "shell.execute_reply": "2026-10-24T15:12:36.586543Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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OyQiIiIqBhkaXY4/E1H+2BWqCJRKJZRKpdhhEBERERGVGWyxICIiIiIio7HFAkBycjLu3r2rfx4WFoYrV67A0dERVatWFTEyIiIiIiLTwMQCwIULF9CuXTv980mTJgEABg0ahI0bN4oUFRERERGR6WBiAaBt27YQBEHsMIiIiIiITBbHWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdGYWBARERERkdFMPrG4e/cuDh48iLS0NADgCtpERERERCIw2cTi2bNnCAwMRM2aNfHWW28hKioKADBs2DBMnjxZ5OiIiIiIiCoWk00sJk6cCLlcjoiICFhaWurL33vvPRw4cEDEyIiIiIiIKh652AEU1aFDh3Dw4EF4eHgYlNeoUQMPHjwQKSoiIiIioorJZFssUlJSDFoqssTFxUGpVIoQERERERFRxWWyiUXr1q2xadMm/XOJRAKdToelS5eiXbt2IkZGRERERFTxmGxXqKVLl6JDhw64cOECMjIy8Omnn+LGjRuIi4vDqVOnxA6PiIiIiKhCMdkWi/r16+P27dto1aoV3n33XaSkpKBnz564fPkyfH19xQ6PiIiIiKhCMdkWi+PHj6Ndu3b4/PPPs21bu3Ytxo0bJ0JUREREREQVk8m2WPTs2RMXL17MVr5q1SrMmDFDhIiIiIiIiCouk00sli1bhi5duiAkJERftmLFCsyaNQv79u0TMTIiIiIioorHZLtCDR8+HHFxcQgMDMQ///yDbdu2YeHChdi/fz9atmwpdnhERERERBWKySYWAPDpp5/i2bNnaNasGbRaLQ4ePIjXX39d7LCIiIiIiCock0osVq9ena2sSpUqsLS0xBtvvIFz587h3LlzAIAJEyaUdnhERERERBWWSSUWX375ZY7lMpkMp06d0q9fIZFImFgQEREREZUik0oswsLCxA6BiIiIiIhyYLKzQhERERERUdlhUi0WkyZNwvz582FlZYVJkyblue/KlStLKSoiIiIiIjKpxOLy5ctQq9X6n3MjkUhKKyQiIiIiIoKJJRbHjx/P8WciIiIiIhJXuRhjERkZicjISLHDICIiIiKqsEw2sdBoNPjiiy9gZ2cHb29veHt7w87ODjNnztR3lyIiIiIiotJhUl2hXvXR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",
      "text/plain": [
       "<Figure size 800x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(2, 1, figsize=(8, 4), sharex=True, height_ratios=[3, 1])\n",
    "\n",
    "axes[0].plot(times, V_m[:, 0])\n",
    "axes[0].axhline(-55.0 * u.mV, color=\"tab:red\", ls=\"--\", lw=0.9, label=\"threshold\")\n",
    "axes[0].set_ylabel(\"V_m\")\n",
    "axes[0].set_title(\"One iaf_psc_alpha neuron\")\n",
    "axes[0].legend(loc=\"best\")\n",
    "\n",
    "axes[1].plot(times, spikes[:, 0], drawstyle=\"steps-post\")\n",
    "axes[1].set_ylabel(\"spike\")\n",
    "axes[1].set_xlabel(\"time\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0757577",
   "metadata": {},
   "source": [
    "## 5. NodeView algebra: populations, slices, and groups\n",
    "\n",
    "A `NodeView` can refer to a full population, a slice of one population, or a concatenation of several views. This gives you a compact way to express NEST-like population algebra while keeping Python objects explicit.\n",
    "\n",
    "A practical constraint: a single `spike_recorder` records one population segment. If you concatenate two populations, use one recorder per population when you want spike recordings from both groups.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fa228460",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:36.589473Z",
     "iopub.status.busy": "2026-10-24T15:12:36.589321Z",
     "iopub.status.idle": "2026-10-24T15:12:36.647404Z",
     "shell.execute_reply": "2026-10-24T15:12:36.646565Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "exc size           = 6\n",
      "inh size           = 3\n",
      "first_two_exc size = 2\n",
      "combined size      = 9\n"
     ]
    }
   ],
   "source": [
    "pop_sim = brainspike.Simulator(dt=0.1 * u.ms)\n",
    "\n",
    "exc = pop_sim.create(brainspike.iaf_psc_alpha, 6, params={\"I_e\": 400.0 * u.pA})\n",
    "inh = pop_sim.create(brainspike.iaf_psc_alpha, 3, params={\"I_e\": 360.0 * u.pA})\n",
    "\n",
    "first_two_exc = exc[:2]\n",
    "all_neurons = exc + inh\n",
    "\n",
    "print(f\"exc size           = {len(exc)}\")\n",
    "print(f\"inh size           = {len(inh)}\")\n",
    "print(f\"first_two_exc size = {len(first_two_exc)}\")\n",
    "print(f\"combined size      = {len(all_neurons)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a6363f91",
   "metadata": {},
   "source": [
    "## 6. Connect: population projections\n",
    "\n",
    "Connection rules are passed to `sim.connect()` through the `rule` argument. The common pattern is:\n",
    "\n",
    "```python\n",
    "sim.connect(pre, post, rule=..., weight=..., delay=..., seed=...)\n",
    "```\n",
    "\n",
    "Positive weights drive excitatory current channels, while negative weights drive inhibitory current channels for current-based NEST-compatible neurons. Delays are unit-aware time quantities.\n",
    "\n",
    "For known dense examples, the default communication path is fine. For larger sparse networks, `comm=\"sparse\"` routes event delivery through sparse communication while preserving the same high-level `connect()` interface.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bd6c8905",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:36.649657Z",
     "iopub.status.busy": "2026-10-24T15:12:36.649431Z",
     "iopub.status.idle": "2026-10-24T15:12:37.824277Z",
     "shell.execute_reply": "2026-10-24T15:12:37.823288Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "E/I projections are connected\n"
     ]
    }
   ],
   "source": [
    "# E -> I: sparse random excitatory projection.\n",
    "pop_sim.connect(\n",
    "    exc,\n",
    "    inh,\n",
    "    rule=brainspike.pairwise_bernoulli(0.5),\n",
    "    weight=20.0 * u.pA,\n",
    "    delay=1.0 * u.ms,\n",
    "    seed=1,\n",
    ")\n",
    "\n",
    "# I -> E: sparse random inhibitory projection.\n",
    "pop_sim.connect(\n",
    "    inh,\n",
    "    exc,\n",
    "    rule=brainspike.pairwise_bernoulli(0.5),\n",
    "    weight=-45.0 * u.pA,\n",
    "    delay=1.0 * u.ms,\n",
    "    seed=2,\n",
    ")\n",
    "\n",
    "print(\"E/I projections are connected\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0517857a",
   "metadata": {},
   "source": [
    "### Deterministic connection rules\n",
    "\n",
    "The same interface also covers deterministic rules. This cell uses a separate simulator only to show the API shape without interfering with the E/I example above.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "17272358",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:37.827160Z",
     "iopub.status.busy": "2026-10-24T15:12:37.826934Z",
     "iopub.status.idle": "2026-10-24T15:12:37.939868Z",
     "shell.execute_reply": "2026-10-24T15:12:37.939123Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "EventProjection\n",
      "EventProjection\n"
     ]
    }
   ],
   "source": [
    "rule_sim = brainspike.Simulator(dt=0.1 * u.ms)\n",
    "pre = rule_sim.create(brainspike.iaf_psc_alpha, 3, params={\"I_e\": 380.0 * u.pA})\n",
    "post = rule_sim.create(brainspike.iaf_psc_alpha, 3)\n",
    "\n",
    "one_to_one_proj = rule_sim.connect(\n",
    "    pre,\n",
    "    post,\n",
    "    rule=brainspike.one_to_one,\n",
    "    weight=15.0 * u.pA,\n",
    "    delay=1.0 * u.ms,\n",
    ")\n",
    "\n",
    "all_to_all_proj = rule_sim.connect(\n",
    "    pre,\n",
    "    post,\n",
    "    rule=brainspike.all_to_all,\n",
    "    weight=5.0 * u.pA,\n",
    "    delay=1.0 * u.ms,\n",
    ")\n",
    "\n",
    "print(type(one_to_one_proj).__name__)\n",
    "print(type(all_to_all_proj).__name__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04dd8c34",
   "metadata": {},
   "source": [
    "## 7. Record: a small E/I network\n",
    "\n",
    "Now attach one spike recorder to the excitatory population and one to the inhibitory population. This keeps each recorder tied to a single population segment, which is the supported recording layout for spike recorders.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "f0c7641f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:37.942297Z",
     "iopub.status.busy": "2026-10-24T15:12:37.942019Z",
     "iopub.status.idle": "2026-10-24T15:12:38.836382Z",
     "shell.execute_reply": "2026-10-24T15:12:38.835615Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "exc_spikes shape = (800, 6)\n",
      "inh_spikes shape = (800, 3)\n",
      "exc events       = 12\n",
      "inh events       = 2\n",
      "exc rate         = 25.00 Hz\n",
      "inh rate         = 8.33 Hz\n"
     ]
    }
   ],
   "source": [
    "exc_rec = pop_sim.create(brainspike.spike_recorder)\n",
    "inh_rec = pop_sim.create(brainspike.spike_recorder)\n",
    "\n",
    "pop_sim.connect(exc, exc_rec)\n",
    "pop_sim.connect(inh, inh_rec)\n",
    "\n",
    "net_result = pop_sim.simulate(80.0 * u.ms)\n",
    "\n",
    "exc_spikes = net_result.spikes(exc_rec)\n",
    "inh_spikes = net_result.spikes(inh_rec)\n",
    "\n",
    "print(f\"exc_spikes shape = {exc_spikes.shape}\")\n",
    "print(f\"inh_spikes shape = {inh_spikes.shape}\")\n",
    "print(f\"exc events       = {net_result.n_events(exc_rec)}\")\n",
    "print(f\"inh events       = {net_result.n_events(inh_rec)}\")\n",
    "print(f\"exc rate         = {net_result.rate(exc_rec):.2f} Hz\")\n",
    "print(f\"inh rate         = {net_result.rate(inh_rec):.2f} Hz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "56a1d951",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-24T15:12:38.838725Z",
     "iopub.status.busy": "2026-10-24T15:12:38.838442Z",
     "iopub.status.idle": "2026-10-24T15:12:38.946219Z",
     "shell.execute_reply": "2026-10-24T15:12:38.945433Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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3XabQkJCNGDAgFyv/auvvlJQUJDuvfdeXb582aX7BlwLPRW4oVSvXl07duzQgQMH8jWBLSYmRu+//75Gjhwpi8WiN998Uz169NB3333n0gS4hQsX6tFHH9ULL7ygV155RZL0n//8Rz179lSLFi00duxY+fj4aMmSJbr11lu1detW3Xzzzdc87sSJE+Xv76/Ro0crLS1N/v7++vnnn/XJJ5/o7rvvVmRkpM6cOaMFCxaoY8eO+vnnn1WpUiVJ0ltvvaWRI0fqrrvu0pNPPqnU1FTt27dPO3fu1H333ae+ffvq0KFDeu+99zR79myVL19ekhQWFiYps9fnpZdeUr9+/fTQQw/p3Llzev3119WhQwft2bPHKXH7888/1bNnT91zzz0aOHCgKlSokOP1vPjii4qKitLChQs1YcIERUZGqlatWnkeJyUlRZ06ddKRI0f0+OOPKzIyUqtXr9bgwYOVkJCgJ5980ukcy5cvV3p6up544gmdP39e06dPV79+/XTrrbfq66+/1nPPPacjR47o9ddf1+jRo7V48eI834MNGzbo119/1ZAhQxQREaGffvpJCxcu1E8//aRvv/1WJpMp132v9R5cqX///qpfv76mTp2qL774Qq+88orKli2rBQsW6NZbb9W0adO0fPlyjR49Wq1atVKHDh0kSUlJSXr77bd177336uGHH9bFixe1aNEide/eXd99952aNm2a5/W5on379rr11ls1ffp0PfbYY9ds7KWmpuqPP/7IVh4aGip/f3+Fh4crMDBQn3/+uZ544gmVLVu2wGK90r59+9S+fXv5+flp2LBhqlGjho4eParPP/9ckyZNkiT99NNPat++vUJDQ/Xss8/Kz89PCxYsUKdOnRQTE6PWrVs7HfOJJ55QRESExo8fr2+//VYLFy5U6dKltX37dlWrVk2TJ0/W2rVrNWPGDDVq1CjbMLD/+7//08WLFzVixAilpqZq7ty5uvXWW7V//37H5yc/de9an+PcPP744ypdurTGjRun2NhYzZs3T7/99pvjDxo5sdvtuuOOO7Rt2zYNGzZM9evX1/79+zV79mwdOnRIn3zySb7ej5zqhL+/v0JDQx2vMzIytHHjRk2ePDlfx7yazWZT9+7d1bp1a7366qvauHGjZs6cqVq1aumxxx5zbPfII49o6dKlGjJkiEaOHKm4uDi98cYb2rNnj7755hv5+flpzpw5euKJJxQcHOxIRCtUqKDSpUurUaNG2rJli0aOHClJ2rZtm0wmk86fP6+ff/5ZDRs2lCRt3bpV7du3d5w365ytWrXSlClTdObMGc2dO1fffPNNtu/Xy5cvq3v37mrXrp1effXVXHtv16xZo7vuukv9+/fX4sWLi0QPO0oYA7iBfPXVV4bZbDbMZrPRpk0b49lnnzW+/PJLIz09Pdu2kgxJxu7dux1lv/32mxEQEGD06dPHUbZkyRJDkhEXF+coq169utGrVy/DMAxj7ty5hslkMiZOnOhYb7fbjTp16hjdu3c37Ha7ozw5OdmIjIw0oqOj87yOzZs3G5KMmjVrGsnJyU7rUlNTDZvN5lQWFxdnWCwWY8KECY6yO++802jYsGGe55kxY0a2azMMwzh27JhhNpuNSZMmOZXv37/f8PX1dSrv2LGjIcmYP39+nufKknU/d+3a5VSe23HmzJljSDLeffddR1l6errRpk0bIzg42EhKSjIMI/MeSDLCwsKMhIQEx7ZjxowxJBlNmjQxMjIyHOX33nuv4e/vb6SmpuYZ79X33zAM47333jMkGVu2bMlz3/y8B2PHjjUkGcOGDXOUXb582ahSpYphMpmMqVOnOsovXLhgBAYGGoMGDXLaNi0tzemYFy5cMCpUqGAMHTrUqVySMXbsWMfrnOp2XjGeO3fOiImJMSQZs2bNcqy/8vNw5blyW9577z3Hdi+//LIhyShVqpTRs2dPY9KkScb333+fZzyrV682JBmbN2/Oc7ssHTp0MEJCQozffvvNqfzKz2bv3r0Nf39/4+jRo46ykydPGiEhIUaHDh0cZVn37OrPdps2bQyTyWQ8+uijjrKs97Fjx46Osqx6GhgYaPz++++O8p07dxqSjFGjRjnK8lv3cvscG0bme3NlfcmKv0WLFk7fi9OnTzckGZ9++qmjrGPHjk6xv/POO4aPj4+xdetWp3PMnz/fkGR888032c5/pUGDBuVaJ7p37+607aZNm7Jd06BBg4xSpUrleY4rz3Pl96FhGEazZs2MFi1aOF5v3brVkGQsX77cabv169dnK2/YsKHTvcgyYsQIo0KFCo7XTz31lNGhQwcjPDzcmDdvnmEYhvHnn38aJpPJmDt3rmEYmd9f4eHhRqNGjYyUlBTHvmvWrDEkGS+//HK2a3n++eeznbtjx46O75cPP/zQ8PPzMx5++OFs/z4ABYXhT7ihREdHa8eOHbrjjjv0448/avr06erevbsqV66szz77LNv2bdq0UYsWLRyvq1WrpjvvvFNffvlltm7ynEyfPl1PPvmkpk2bpn/961+O8r179+rw4cO677779Oeff+qPP/7QH3/8ob/++ktdunTRli1bZLfbr3n8QYMGZftrsMViccyrsNls+vPPPxUcHKyoqCj98MMPju1Kly6t33//Xbt27brmea720UcfyW63q1+/fo7Y//jjD0VERKhOnTrZhtZYLBYNGTLE5fNcLafjrF27VhEREbr33nsdZX5+fho5cqQuXbqkmJgYp+3vvvtuWa1Wx+usvzAPHDhQvr6+TuXp6enZhhtc7cr7n/WX97/97W+S5HS/c+LKe3DlRGSz2ayWLVvKMAw9+OCDTseLiorSr7/+6rStv7+/pMy/JJ8/f16XL19Wy5Ytrxnf9ejQoYM6d+6s6dOnKyUlJc9t77zzTm3YsCHb0rlzZ8c248eP14oVK9SsWTN9+eWXevHFF9WiRQs1b95cv/zyi9vxnjt3Tlu2bNHQoUNVrVo1p3VZf5G32Wz66quv1Lt3b9WsWdOxvmLFirrvvvu0bds2JSUlOe374IMPOv1Fv3Xr1tner6z38cr3K0vv3r1VuXJlx+ubb75ZrVu31tq1ax1l7tS9axk2bJj8/Pwcrx977DH5+vo6nf9qq1evVv369VWvXj2n74WsOQ/5GXIXEBCQY52YOnWq03Zr165VgwYNVKNGjeu7QCnbU8bat2/v9F6sXr1aVqtV0dHRTtfTokULBQcH5+t62rdvrzNnzig2NlZSZo9Ehw4d1L59e23dulVSZu+FYRiOnordu3fr7NmzGj58uNNTr3r16qV69erpiy++yHaeK3tXrvbee++pf//+euSRR7RgwYJiMe8OxRPDn3DDadWqlT766COlp6frxx9/1Mcff6zZs2frrrvu0t69e9WgQQPHtnXq1Mm2f926dZWcnKxz585lGwN7pZiYGH3xxRd67rnnnOZRSNLhw4clyTF/ICeJiYkqU6ZMntcSGRmZrcxut2vu3Ll68803FRcX55T8lCtXzvH/zz33nDZu3Kibb75ZtWvXVrdu3XTfffflOn796vgNw8jx/khyaoxIUuXKlR0NW3fkdJzffvtNderUyfYPZdZTf3777Ten8qsbjlkJRtWqVXMsv9Y48vPnz2v8+PFauXJltsn+iYmJee7rynuQU9wBAQGO4SxXll89n2PZsmWaOXOmDh48qIyMDEd5TvWnIIwbN04dO3bU/PnzNWrUqFy3q1KlSr6e8HXvvffq3nvvVVJSknbu3KmlS5dqxYoVuv3223XgwIFcHzd6pfT09GxzZMLCwhyNyLyGM547d07JycmKiorKtq5+/fqy2+2Kj493DGWRXKtnOdWx3L57Vq1a5XjtTt27lqvPHxwcrIoVK+Y5d+zw4cP65Zdfch1alZ+HYZjN5nzViS+++EK33377NbfLTUBAQLY4y5Qp4/ReHD58WImJibnO3cnP9WQlClu3blWVKlW0Z88evfLKKwoLC9Orr77qWBcaGqomTZpI+t93Vk71rV69etq2bZtTma+vr6pUqZLj+ePi4jRw4EDdfffdPDYdHkdSgRuWv7+/WrVqpVatWqlu3boaMmSIVq9erbFjxxbI8Rs2bKiEhAS98847euSRR5wacFm9EDNmzMh1THt+nree05j1yZMn66WXXtLQoUM1ceJElS1bVj4+PvrnP//p1PtRv359xcbGas2aNVq/fr0+/PBDvfnmm3r55Zc1fvz4PM9rt9tlMpm0bt26HMflXh27qxMpc1MQx8ltHHFu5cYVkylz0q9fP23fvl3PPPOMmjZtquDgYNntdvXo0eOavU2uvAc5xZefmN99910NHjxYvXv31jPPPKPw8HCZzWZNmTJFR48ezTO+69WhQwd16tRJ06dPz/bXYHeEhoYqOjpa0dHR8vPz07Jly7Rz50517NjxmvtmPU76SnFxcQUW29VcqWfXqmO5cafueYLdbtdNN92kWbNm5bj+6oTqesXFxengwYNuPRAgP/MJ7Ha7wsPDtXz58hzXX2teiiRVqlRJkZGR2rJli2rUqCHDMNSmTRuFhYXpySef1G+//aatW7fqlltuue4ehCt7p69WsWJFVaxYUWvXrtXu3bvVsmXL6zoHkB8kFYDk+KI9deqUU3lWj8KVDh06pKCgoGv+g1K+fHl98MEHateunbp06aJt27Y5JklnTT4ODQ0t8N9i+OCDD9S5c2ctWrTIqTwhISHbX7VLlSql/v37q3///kpPT1ffvn01adIkjRkzxvFr1jmpVauWDMNQZGSk028KeEP16tW1b98+2e12p39YDx486Fjv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P/ywTp065VimT5/uxYhLnl27dmnBggVq3LixUzl13nNyu+cS9d1TGjZs6HRft23b5lhHXfecvO67RH33hAsXLqht27by8/PTunXr9PPPP2vmzJkqU6aMY5vp06frtdde0/z587Vz506VKlVK3bt3V2pqqhcjv0EZuCGUKVPGePvtt42EhATDz8/PWL16tWPdL7/8YkgyduzY4cUIS6as+24YhtGxY0fjySef9G5AJdjFixeNOnXqGBs2bHC619R5z8ntnhsG9d1Txo4dazRp0iTHddR1z8nrvhsG9d1TnnvuOaNdu3a5rrfb7UZERIQxY8YMR1lCQoJhsViM9957rzBCxBXoqSjhbDabVq5cqb/++ktt2rTR999/r4yMDHXt2tWxTb169VStWjXt2LHDi5GWLFff9yzLly9X+fLl1ahRI40ZM0bJyclejLJkGTFihHr16uVUtyVR5z0ot3uehfruGYcPH1alSpVUs2ZNDRgwQMePH5dEXfe03O57Fup7wfvss8/UsmVL3X333QoPD1ezZs301ltvOdbHxcXp9OnTTnXearWqdevW1Hkv8PV2APCM/fv3q02bNkpNTVVwcLA+/vhjNWjQQHv37pW/v79Kly7ttH2FChV0+vRp7wRbguR23yXpvvvuU/Xq1VWpUiXt27dPzz33nGJjY/XRRx95Oerib+XKlfrhhx+0a9eubOtOnz5NnfeAvO65RH33lNatW2vp0qWKiorSqVOnNH78eLVv314HDhygrntQXvc9JCSE+u4hv/76q+bNm6ennnpKL7zwgnbt2qWRI0fK399fgwYNctTrChUqOO1HnfcOkooSKioqSnv37lViYqI++OADDRo0SDExMd4Oq8TL7b43aNBAw4YNc2x30003qWLFiurSpYuOHj2qWrVqeTHq4i0+Pl5PPvmkNmzYoICAAG+Hc0PIzz2nvntGz549Hf/fuHFjtW7dWtWrV9eqVasUGBjoxchKtrzu+4MPPkh99xC73a6WLVtq8uTJkqRmzZrpwIEDmj9/vgYNGuTl6HA1hj+VUP7+/qpdu7ZatGihKVOmqEmTJpo7d64iIiKUnp6uhIQEp+3PnDmjiIgI7wRbguR233PSunVrSdKRI0cKM8QS5/vvv9fZs2fVvHlz+fr6ytfXVzExMXrttdfk6+urChUqUOcL2LXuuc1my7YP9d0zSpcu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",
      "text/plain": [
       "<Figure size 800x350 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def raster_points(spike_matrix, offset=0):\n",
    "    t_idx, neuron_idx = np.where(np.asarray(spike_matrix) > 0)\n",
    "    return t_idx, neuron_idx + offset\n",
    "\n",
    "exc_t, exc_id = raster_points(exc_spikes, offset=0)\n",
    "inh_t, inh_id = raster_points(inh_spikes, offset=len(exc))\n",
    "\n",
    "time_values = np.asarray(net_result.times.to_decimal(u.ms))\n",
    "\n",
    "plt.figure(figsize=(8, 3.5))\n",
    "if len(exc_t):\n",
    "    plt.scatter(time_values[exc_t], exc_id, s=18, label=\"E\", color=\"tab:blue\")\n",
    "if len(inh_t):\n",
    "    plt.scatter(time_values[inh_t], inh_id, s=18, label=\"I\", color=\"tab:orange\")\n",
    "\n",
    "plt.axhline(len(exc) - 0.5, color=\"0.5\", lw=0.8, ls=\"--\")\n",
    "plt.xlabel(\"time (ms)\")\n",
    "plt.ylabel(\"neuron index\")\n",
    "plt.title(\"Spike raster from a small NEST-compatible E/I network\")\n",
    "plt.legend(loc=\"upper right\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ef0e492",
   "metadata": {},
   "source": [
    "## 8. Translate NEST scripts carefully\n",
    "\n",
    "### Quick translation map\n",
    "\n",
    "| NEST concept | `brainspike` pattern | Notes |\n",
    "| --- | --- | --- |\n",
    "| `nest.Create(\"iaf_psc_alpha\", n, params=...)` | `sim.create(brainspike.iaf_psc_alpha, n, params=...)` | Model names are Python classes, not strings. |\n",
    "| `nest.Connect(pre, post, conn_spec, syn_spec)` | `sim.connect(pre, post, rule=..., weight=..., delay=...)` | Connection rule and synaptic parameters are explicit keyword arguments. |\n",
    "| `nest.Simulate(t)` | `sim.simulate(t * u.ms)` | Duration is a `brainunit` quantity. |\n",
    "| `voltmeter -> neuron` | `sim.connect(vm, neuron)` | Analog recorders observe the target population. |\n",
    "| `neuron -> spike_recorder` | `sim.connect(neuron, sr)` | Spike recorders receive events from one population segment. |\n",
    "| NodeCollection slicing | `node_view[:k]`, `view_a + view_b` | Concatenated views are useful for population algebra, but some devices require one segment. |\n",
    "\n",
    "### Porting cautions\n",
    "\n",
    "| Area | What changes in BrainX | Practical guidance |\n",
    "| --- | --- | --- |\n",
    "| Units | Physical quantities are explicit objects, not bare numbers. | Write `20.0 * u.pA`, `1.0 * u.ms`, and `-55.0 * u.mV`; convert deliberately when plotting or exporting. |\n",
    "| Model identifiers | Models are imported Python classes/functions. | Use `brainspike.iaf_psc_alpha`, `brainspike.voltmeter`, and `brainspike.spike_recorder` instead of string model names. |\n",
    "| Device direction | Recorder connections keep NEST-style direction. | Connect `voltmeter -> neuron` for analog traces and `neuron -> spike_recorder` for spikes. |\n",
    "| Recorder scope | Spike recorders are tied to a population segment. | Use separate recorders for excitatory and inhibitory groups when you need separate raster data. |\n",
    "| JAX execution | Arrays and simulations are JAX-compatible and may be compiled internally. | Keep model construction outside repeated simulation loops; pass changing inputs and parameters explicitly. |\n",
    "| Validation | Compatibility focuses on documented semantics, not byte-for-byte equality with every NEST run. | Check units, time step, delays, seeds, and documented model assumptions when comparing results. |\n",
    "\n",
    "For model physiology, use the upstream NEST model documentation. For `brainspike`, focus on the Python API, unit handling, simulator semantics, and documented validation status.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "144a2cc0",
   "metadata": {},
   "source": [
    "## 9. Summary\n",
    "\n",
    "The NEST-compatible layer in `brainspike` gives you a familiar workflow while staying inside the BrainX/JAX ecosystem:\n",
    "\n",
    "1. create model nodes and devices with `Simulator.create()`;\n",
    "2. wire populations, projections, and recorders with `Simulator.connect()`;\n",
    "3. run a simulation window with `Simulator.simulate()`;\n",
    "4. inspect traces and events with `SimulationResult.trace()`, `spikes()`, `n_events()`, and `rate()`.\n",
    "\n",
    "When porting NEST scripts, preserve the workflow but adopt BrainX idioms: explicit units, Python model objects, JAX-compatible arrays, and stateful simulation objects managed by `brainspike` and `brainstate`.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Ecosystem-py",
   "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
}
