diff --git a/docs/benchmarks/benchmarks.rst b/docs/benchmarks/benchmarks.rst index 4e30c1931..fd10c6f9b 100644 --- a/docs/benchmarks/benchmarks.rst +++ b/docs/benchmarks/benchmarks.rst @@ -19,7 +19,7 @@ One exception is the :class:`BernoulliGLM`, which also includes a refractory per an additional :math:`N_{neurons}` synapses. We also need to store the number of spikes of each neuron per time step, which by default consumes 32 bytes. -In most cases, however, we don't expect the number of spikes per time step for any neuron to exceed 127, which means we can safely reduce the memory conumption to +In most cases, however, we don't expect the number of spikes per time step for any neuron to exceed 127, which means we can safely reduce the memory consumption to 8 bytes by passing :code:`torch.int8` as the :code:`store_as_dtype` argument of the :meth:`simulate` method if we need additional memory. Concretely, the total memory usage (in bytes) of GLM models can be estimated as diff --git a/docs/introduction/introduction.rst b/docs/introduction/introduction.rst index 9d38a67a8..fee24f662 100644 --- a/docs/introduction/introduction.rst +++ b/docs/introduction/introduction.rst @@ -88,14 +88,15 @@ in the :class:`BernoulliGLM` class, using the same parameters as in the original .. code-block:: python model = BernoulliGLM( - alpha= 0.2, # Decay rate of the coupling strength between neurons (1/ms) - beta= 0.5, # Decay rate of the self-inhibition during the relative refractory period (1/ms) + alpha=0.2, # Decay rate of the coupling strength between neurons (1/ms) + beta=0.5, # Decay rate of the self-inhibition during the relative refractory period (1/ms) abs_ref_scale=3, # Absolute refractory period in time steps rel_ref_scale=7, # Relative refractory period in time steps abs_ref_strength=-100, # Strength of the self-inhibition during the absolute refractory period rel_ref_strength=-30, # Initial strength of the self-inhibition during the relative refractory period coupling_window=5, # Length of coupling window in time steps theta=5, # Threshold for firing + r=1, # Parameter controlling the recurrence strength dt=1, # Length of time step (ms) ) diff --git a/docs/tutorials/stimuli.rst b/docs/tutorials/stimuli.rst index e7ab102f6..c19037ace 100644 --- a/docs/tutorials/stimuli.rst +++ b/docs/tutorials/stimuli.rst @@ -38,6 +38,7 @@ After we've defined the model and the stimulus, we can simulate the network and rel_ref_strength=-30, alpha=0.2, beta=0.5, + r=1 ) # Define stimulus and add it to the model @@ -92,6 +93,7 @@ Before we add the stimulus to the model, we'll run a simulation without it to se rel_ref_strength=-30, alpha=0.2, beta=0.5, + r=1 ) spikes = model.simulate(network, n_steps=n_steps) @@ -156,6 +158,7 @@ that is close to the frequency of the stimulus. rel_ref_strength=-30, alpha=0.2, beta=0.5, + r=1 ) stimulus = SinStimulus( diff --git a/examples/large_scale_example.ipynb b/examples/large_scale_example.ipynb index 6fe19a78d..d94639d91 100644 --- a/examples/large_scale_example.ipynb +++ b/examples/large_scale_example.ipynb @@ -550,6 +550,7 @@ " rel_ref_scale=5,\n", " rel_ref_strength=-30,\n", " beta=0.1,\n", + " r=1\n", ")" ] }, @@ -842,7 +843,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.11" }, "orig_nbformat": 4 }, diff --git a/examples/simulate_with_stimulus.ipynb b/examples/simulate_with_stimulus.ipynb index 75ee3d52b..753541761 100644 --- a/examples/simulate_with_stimulus.ipynb +++ b/examples/simulate_with_stimulus.ipynb @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -159,6 +159,7 @@ " rel_ref_strength=-30, # Initial strength of the self-inhibition during the relative refractory period\n", " coupling_window=5, # Length of coupling window (ms)\n", " theta=5, # Threshold for firing\n", + " r=1, # Recurrent coupling strength\n", " dt=1, # Length of time step (ms)\n", ")" ] @@ -175,12 +176,12 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "stim_mask = torch.arange(1000) % 100 < 10\n", - "stimulus = RegularStimulus(strength=1, period=100, tau=10, stop=10000, stimulus_masks=stim_mask)\n", + "stim_masks = [torch.arange(100) < 10 for _ in range(10)]\n", + "stimulus = RegularStimulus(strength=1, period=100, tau=10, stop=10000, stimulus_masks=stim_masks, batch_size=10)\n", "model.add_stimulus(stimulus)" ] }, @@ -195,14 +196,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "100%|\u001b[38;2;62;86;65m██████████\u001b[0m| 10000/10000 [00:07<00:00, 1362.14it/s]\n" + "100%|\u001b[38;2;62;86;65m██████████\u001b[0m| 10000/10000 [00:08<00:00, 1230.16it/s]\n" ] } ], @@ -216,12 +217,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { - "image/png": "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LaBr1x5F6uOfv5QNBoN9D864cRNIS0tzaNemze188MHH7Nz5//j++/8xatTj9OzZh5EjRxd7u1cuywkgOectGgyGXFfWZmZmXnMbL7wwhaSk84waFUPVqtXx9PRk2LCBZGZmXHO95OQUoqOH0L59x1yveXp6XnPd/OQ175x5paQkExAQyPz5uffCVqzok6t9jrzq4O1dzunjq1q1Gu+88yHff/8du3b9j9mzZ/LOO2tYsGBxiYU7BTsRESlThg17goEDHyY4uLbD8tq1b+bHH/c6LPvxx70EB9ey763LT1BQlTyX+/v707XrPXTteg/NmoXzxhvzGDlytP3Ky6wsa57rFUelSv4kJyeTkpJCuXLZoeX333+95jo//riXmJhnadMmEsg+lHju3DmHNmazGas1y2FZSEgIR478Rc2awXn2W6fOzZw5c4qEhAQCAwMBOHDgx6JM6x/bDeXsWQsmk4nq1Wvk2aZSJX8OHz7osOyPP37FZLp2BKpduw5bt36FzWazh+Yff9xL+fIVqFIl7//PefHy8iYy8g4iI++gZ88+PPxwbw4e/MN+QYqz6Rw7EREpU+rVq0+nTl344IP3HJb/3//144cfvmflyqUcOfIXmzd/zIcfrsvzsG1hLF36b7Zt+4Zjx45y6NBBtm//ltq16wDZocPLy4v//W87FouFixcvFmtbV2rSpCne3t4sWrSQ48eP8fnnn7J588fXXCc4OJjPPovlzz8Pc+DAfqZNm4iXl5dDm2rVarBr1/dYLAkkJSUBEBX1GJ9++gnLly/m0KGD/PnnYbZs+YzFi98Asq9KDg6uzYsvTub3339j7944+2vFccstrWnSJIzx48fw3Xc7OXnyBD/+uJdFixbyyy8/AdnnDf7yy89s3vwxR48eYdmyRRw6dDCfnqFnzz6cOXOa119/hb/++pNt275h+fJFPPjgwxiNBYtPsbGb+PjjjRw69AfHjx/js8824+XlZT+MWxK0x05ERIotwMe70OsU9T52zjB48DC++uoLh2UhIaFMmzaDpUsXsXLlUgICAomOHka3bkU7ZJvDbDazaNFCTp48gZeXN82bhzN16kv210aPfoYVK5awbNkimjULt9+Co7h8ff2YOHE6b7wxl02bNtCy5a0MGjSEV1558arrjBs3kVdeeYlBg/pRpUpVhg59nIUL5zq0GTlyNAsWvM6m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gp2IiIiIm1CwExEREXETCnYiIiIibkLBTkRERMRNKNiJiIiIuAkFOxERERE3oWAnIiIi4iYU7ERERETchIKdiIiIiJtQsBMRERFxEwp2IiIiIm5CwU5ERETETSjYiYiIiLgJBTsRERERN6FgJyIiIuImFOxERERE3ISCnYiIiIibULATERERcRMKdiIiIiJuQsFORERExE0o2ImIiIi4CQU7ERERETehYCciIiLiJhTsRERERNyEgp2IiIiIm1CwExEREXETCnYiIiIibkLBTkRERMRNKNiJiIiIuAkFOxERERE3oWAnIiIi4iYU7ERERETchIKdiIiIiJtQsBMRERFxEwp2IiIiIm5CwU5ERETETZSKYLd27Vo6duxIWFgYffr0Yd++fddsv3nzZrp06UJYWBg9evRg69at9tcyMjJ49dVX6dGjB+Hh4URGRjJ27FhOnz7t0EfHjh0JCQlx+Fq8eHGJzE9ERETkenB5sIuNjWXGjBmMGDGCDRs2EBoaSnR0NBaLJc/2u3fvJiYmht69e7Nx40buvPNORowYwW+//QZAamoqP/30E8OHD2f9+vUsWLCAw4cPM3z48Fx9Pfnkk3z77bf2r379+pXoXEVERERKksuD3YoVK+jbty+9evWifv36TJ06FW9vbz788MM8269evZp27doxePBg6tWrx+jRo2ncuDFvvfUWAD4+PqxYsYJu3bpRt25dwsPDmThxIgcOHODEiRMOfVWoUIGgoCD7V/ny5Ut8viIiIiIlxaXBLj09nQMHDtC2bVv7MqPRSNu2bYmLi8tznT179tCmTRuHZZGRkezZs+eq27l48SIGgwFfX1+H5UuWLKF169bcf//9LF26lMzMzKJPRkRERMTFzK7ceGJiIllZWQQEBDgsDwgI4NChQ3muk5CQQGBgYK72CQkJebZPS0tj1qxZdO/enYoVK9qX9+/fn8aNG+Pn50dcXByzZ88mPj6e8ePHF2oOBkOhmruNnHmXtvm7ejilrR6uUlrfH66kmjhSPRypHrmpJpcVpgYuDXYlLSMjg1GjRmGz2Zg6darDawMHDrT/OzQ0FA8PDyZPnkxMTAyenp4F3kZAgI/TxnsjKk3zL+ftAZle13/D3h72f5amepQGqkduqokj1cOR6pGbalI4Lg12/v7+mEymXBdKWCyWXHvlcgQGBubaO5dX+4yMDEaP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OxGRPJQvX57y5cuzZcsW0tPTi9zPDz/8QJ06dahYsWKu1+bPn8/w4cPZsGEDZrOZmJgYXn31VZ5//nnWrl3LkSNHmDt3LgCZmZmMGDGCVq1a8dFHH/Hee+/x4IMPYjAY7P01bdqUrKws9u7dW+TxisiNTYdiRUTyYDabmTlzJhMnTuTdd9+lcePG3HrrrXTr1o3Q0NAC93P8+HGqVKmS52uDBg2iXbt2AAwYMICnn36alStX0rJlSwB69+7N+vXrAbh48SIXLlygQ4cO1KpVC4B69eo59FeuXDl8fHw4ceJEoecrIu5Be+xERK7i7rvvZtu2bbz55pu0a9eO7777jp49e9rDVkGkpaXh5eWV52shISH2fwcEBOS5LOdQbKVKlejZsyfR0dEMGzaMVatWcebMmVx9enl5kZKSUuDxiYh7UbATEbkGLy8vbr/9dkaMGMG7777LAw88wPz58wu8vr+/P0lJSXm+5uHhYf93ziFVs9nssMxqtdq/nzFjBu+99x4RERFs3ryZu+++mz179jj0ef78eSpXrlzg8YmIe1GwExEphPr165OcnFzg9o0aNeLQoUPYbDanbL9x48YMHTqUd999l4YNG/Lxxx/bXzty5AhpaWk0btzYKdsSkRuPgp2ISB4SExMZMGAA//nPf/jll184evQomzdvZunSpYW6KrZ169YkJyfz+++/F2s8R48e5bXXXiMuLo7jx4/z7bff8ueff1K3bl17m127dhEcHGw/B09Eyh5dPCEikocKFSrQvHlzVq1axZEjR8jMzKRatWr06dOnUE948Pf356677mLTpk3ExMQUeTzlypXj0KFDbNiwgXPnzlGlShUeeeQR/u///s/e5pNPPqFv375F3oaI3PgMNmcdHxARkTz98ssvDBo0iC+++IIKFSqUyDZ+//13Hn30UT777DN8fHxKZBsiUvop2ImIXAfr16+nSZMmDle9OtP27dvJysqy3z5FRMomBTsRERERN6GLJ0RERETchIKdiIiIiJtQsBMRERFxEwp2IiIiIm5CwU5ERETETSjYiYiIiLgJBTsRERERN6FgJyIiIuImFOxERERE3ISCnYiIiIib+P80tS8anblRZQAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABkdUlEQVR4nO3deVhU9eIG8PecWRh2YcAtUFMTXBDQzCXMNDXXcu9WaipuqKmFueWGmliRudbPfcsyb2o3C62sNL3qLRXX1EzNfYEBRWSZYeb8/kAmRwaYGYbt8H6ex0c4893OlzPMy1kFSZIkEBEREVG5J5b2AIiIiIjIORjsiIiIiGSCwY6IiIhIJhjsiIiIiGSCwY6IiIhIJhjsiIiIiGSCwY6IiIhIJhjsiIiIiGSCwY6IiIhIJhjsiKjCCwoKwpIlS8zfb9u2DUFBQbh27Vqx9z158mS0a9fO/P21a9cQFBSE1atXF3vfALBkyRIEBQWVSF9EVPwY7Iio1OUGqZMnT1osP3z4MIYOHYrWrVsjJCQEzz//PEaOHIkdO3ZYlAsKCsLs2bNLcsh5ZGRkYMmSJfjf//5XquOwpiyPjYici8GOiMqknTt3on///tDpdBg4cCCmT5+Ol156Cffu3cOWLVuKte+XX34ZJ06cwBNPPGFznYyMDCxduhS//fabXX3NmTMHu3btsneIdilobFFRUThx4kSx9k9EJUdZ2gMgIrJm6dKlqFu3Lr788kuo1WqL13Q6XbH2rVAooFAoirWP9PR0uLm5QaVSFWs/hVEqlVAq+VFAJBfcY0dEZdKVK1cQEhKSJ9QBgFardahNvV6PefPmoUWLFggPD8fIkSNx69atPOWsnWN38uRJREZGonnz5mjcuDHatWuHKVOmAMg5L65ly5YAcgJpUFCQxXl7kydPRnh4OK5cuYJhw4YhPDwcEyZMML/26Dl2j1q3bh3atm2Lxo0bo3///vjzzz8tXh8wYAAGDBiQp96jbRY2Nmvn2GVnZ2PZsmVo3749GjVqhHbt2mHBggXQ6/UW5dq1a4cRI0bg8OHD6NOnD0JCQvDCCy/g66+/tro+RFT8+GcaEZVJ1atXx8GDB3Hr1i1UrVrVKW2+++67+Oabb9CtWzc0adIEhw4dwvDhwwutp9PpEBkZCR8fHwwfPhxeXl64du0afvzxRwCAr68vZs2ahVmzZqFDhw7o0KEDAFgEpuzsbERGRqJp06aYNGkSNBpNgX1+/fXXePDgAV577TVkZWVh48aNeOONN7Bjxw74+fnZvM62jO1x06ZNw/bt2/Hiiy9i8ODBOHHiBJYvX44LFy5g2bJlFmUvX76McePGoU+fPujZsye2bt2KyZMno2HDhnjqqadsHicROQeDHRGVScOGDcO7776L9u3bo0mTJmjatCmeffZZNGnSBKJo/8GGs2fP4ptvvsFrr72GmTNnAgBef/11REdH49y5cwXWTUhIwL1797B69WqEhISYl7/11lsAADc3N7z44ouYNWsWgoKC8PLLL+dpQ6/Xo1OnToiOjrZpvFeuXMEPP/yAKlWqAACee+459O3bFytXrjTvKbSFLWN71NmzZ7F9+3b07dsXc+fOBZAzT76+vlizZg0OHTqEFi1amMtfunQJmzZtwtNPPw0A6Ny5M9q0aYNt27Zh0qRJNo+TiJyDh2KJqEzq06cPVq1ahebNm+Po0aP45JNP8Prrr6Njx444evSo3e3t3bsXAPIcunzjjTcKrevp6QkA2LNnDwwGg91953r11VdtLtu+fXtzqAOAxo0bIzQ01LwexSW3/cGDB1ssHzJkiMXruerWrWsOdUDOHsInn3wSV69eLdZxEpF1DHZEVGa1bt0aq1evxu+//45Nmzbh9ddfx40bNzBy5Ei7L6C4fv06RFFEjRo1LJbXrl270LrPPPMMXnzxRSxduhQtWrRAVFQUtm7dmuecs4IolUq7DinXrFkzz7JatWrh+vXrNrfhiPzmyd/fH15eXnn6r1atWp42vL29ce/evWIdJxFZx2BHRGWeq6srnn76acyYMQNRUVG4d+8efv311xLrXxAELF68GF9++SX69++P27dvY+rUqejVqxcePHhgUxtqtdqhQ8iOMBqNRW5DEASbyhX31cNEZB8GOyIqVxo1agQASExMtKveE088AZPJhCtXrlgsv3jxos1thIWF4a233sK2bdsQFxeH8+fPIz4+HoDtQchWly9fzrPs77//tri3nre3N1JTU/OUu3HjhsX39owtd54e7z8pKQmpqal23duPiEoegx0RlUkHDx60ujz3HK8nn3zSrvaee+45AMDGjRstlq9fv77Quvfu3YMkSRbL6tevDwDmw7Gurq4AYDVoOWL37t24ffu2+fsTJ07g+PHj5vUAgMDAQFy8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o0nC3ZQHDHdEROUMgx2RzGhUCoiCgG+OXkViaqbd9bWeGvRoGgiVSgGj0eTQGIq6x08UBYii4HB97nEkooqKwY5IppLSsnDrnv3BrrT3+ImigEo+7lAUIdhxjyMRVVQMdkRkwVl7/ERRcDjYKUQBXx+5Ct39ku+fiKg8Y7AjIqsc3ePnLLr7maXaPxFRecTbnRARERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJBIMdERERkUww2BERERHJhEPB7urVq84eBxEREREVkUPBrkOHDhgwYAD+85//ICsry9ljIiIiIiIHOBTstm/fjqCgIMyfPx/PPvssZsyYgRMnTjh7bERERERkB4eCXf369TFt2jTs27cP8+bNw507d/Daa6+hW7duWLt2LZKTk509TiIiIiIqRJEunlAqlejYsSMWL16MCRMm4PLly3j//ffRpk0bTJw4EXfu3HHWOImIiIioEMqiVD558iS2bt2K+Ph4uLq6YsiQIejTpw9u376NpUuXYtSoUfjqq6+cNVYiIiIiKoBDwW7t2rXYtm0bLl26hOeee868l04Uc3YABgYGYv78+WjXrp1TB0tERERE+XMo2H3xxRfo3bs3evbsicqVK1st4+vri/fee69IgyMiIiIi2zkU7NasWYPq1aub99DlkiQJN2/eRPXq1aFWq9GzZ0+nDJKIiIiICufwfexSUlLyLL979y5eeOGFIg+KiIiIiOzn0B47SZKsLk9PT4eLi0uRBkQVjygKEEWhWNpWKOTz1DxBECDasDrCw7kUYN+8SlL+720iIiof7Ap2sbGxAHI+YBYtWgRXV1fza0ajESdOnEBwcLBzR0iyJooCfH3cINiSWIqieHJjyVCoAUhwcVHZVFylzHlbq9VKaDRq2/uRJGRkGhwYIBERlRV2Bbs//vgDQM5f9X/++SdUqn8+aNRqNYKDgzFkyBDnjpBkTRQFCKKIzISt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", "text/plain": [ "
" ] @@ -234,9 +235,10 @@ "# Compare the firing rates of the stimulated neurons to the firing rates of the non-stimulated neurons\n", "sns.set_style(\"darkgrid\")\n", "\n", + "all_stim_masks = torch.concat(stim_masks)\n", "isi = 1 / (results.mean(dim=1))\n", - "isi_stimulated = isi[stim_mask]\n", - "isi_non_stimulated = isi[~stim_mask]\n", + "isi_stimulated = isi[all_stim_masks]\n", + "isi_non_stimulated = isi[~all_stim_masks]\n", "\n", "sns.histplot(isi_stimulated, label=\"Stimulated neurons\", stat=\"density\", color=\"C1\", alpha=0.5) \n", "sns.histplot(isi_non_stimulated, label=\"Non-stimulated neurons\", stat=\"density\", color=\"C0\", alpha=0.5)\n", @@ -356,6 +358,7 @@ " rel_ref_strength=-30, # Initial strength of the self-inhibition during the relative refractory period\n", " coupling_window=5, # Length of coupling window (ms)\n", " theta=5, # Threshold for firing\n", + " r=1, # Strength of the recurrent connections\n", " dt=1, # Length of time step (ms)\n", ")\n", "model.add_stimulus(stimulus)" diff --git a/examples/working_with_stimulus.ipynb b/examples/working_with_stimulus.ipynb index 7eda72185..1f3fa63a3 100644 --- a/examples/working_with_stimulus.ipynb +++ b/examples/working_with_stimulus.ipynb @@ -84,6 +84,7 @@ " rel_ref_strength=-30, \n", " alpha=0.2,\n", " beta=0.5,\n", + " r=1,\n", ")\n", "model.add_stimulus(stim)\n", "\n", @@ -233,6 +234,7 @@ " rel_ref_strength=-30, \n", " alpha=0.2,\n", " beta=0.5,\n", + " r=1,\n", ")" ] }, @@ -428,6 +430,7 @@ " rel_ref_strength=-30, \n", " alpha=0.2,\n", " beta=0.5,\n", + " r=1,\n", ")\n", "\n", "\n", diff --git a/spikeometric/models/bernoulli_glm_model.py b/spikeometric/models/bernoulli_glm_model.py index caa178d8d..217695347 100644 --- a/spikeometric/models/bernoulli_glm_model.py +++ b/spikeometric/models/bernoulli_glm_model.py @@ -13,12 +13,12 @@ class BernoulliGLM(BaseModel): More formally, the model can be broken into three steps, each of which is implemented as a separate method in this class: - #. .. math:: g_i(t+1) = \sum_{\tau=0}^{T-1} \left(X_i(t-\tau)r(\tau) + \sum_{j \in \mathcal{N}(i)} (W_0)_{j, i} X_j(t-\tau) c(\tau)\right) + \mathcal{E}_i(t+1) + #. .. math:: g_i(t+1) = \sum_{\tau=0}^{T-1} \left(X_i(t-\tau)ref(\tau) + r\sum_{j \in \mathcal{N}(i)} (W_0)_{j, i} X_j(t-\tau) c(\tau)\right) + \mathcal{E}_i(t+1) #. .. math:: p_i(t+1) = \sigma(g_i(t+1) - \theta) \Delta t #. .. math:: X_i(t+1) \sim \text{Bernoulli}(p_i(t+1)) The first equation is implemented in the :meth:`input` method and gives us the input to the neuron :math:`i` at time :math:`t+1` as a sum of the refractory, synaptic and external inputs. - The refractory input is calculated by convolving the spike history of the neuron itself with a refractory filter :math:`r`, the synaptic input is obtained by convolving the spike history + The refractory input is calculated by convolving the spike history of the neuron itself with a refractory filter :math:`ref`, the synaptic input is obtained by convolving the spike history of the neuron's neighbors with the coupling filter :math:`c`, weighted by the synaptic weights :math:`W_0`, and the exteral input is given by evaluating an external input function :math:`\mathcal{E}` at time :math:`t+1`. The second equation is implemented in :meth:`non_linearity` which computes the probability that the neuron :math:`i` spikes at time :math:`t+1` by passing @@ -40,13 +40,15 @@ class BernoulliGLM(BaseModel): abs_ref_scale : int The absolute refractory period of the neurons :math:`A_{ref}` in time steps abs_ref_strength : float - The large negative activation :math:`a` added to the neurons during the absolute refractory period + The large negative activation :math:`abs` added to the neurons during the absolute refractory period rel_ref_scale : int The relative refractory period of the neurons :math:`R_{ref}` in time steps rel_ref_strength : float - The negative activation :math:`r` added to the neurons during the relative refractory period (tunable) + The negative activation :math:`rel` added to the neurons during the relative refractory period (tunable) beta : float The decay rate :math:`\beta` of the weights. (tunable) + r : float + The scaling of the recurrent connections. (tunable) rng : torch.Generator The random number generator for sampling from the Bernoulli distribution. """ @@ -61,6 +63,7 @@ def __init__(self, rel_ref_scale: int, rel_ref_strength: int, beta: float, + r: float, rng=None ): super().__init__() @@ -76,6 +79,7 @@ def __init__(self, # Parameters are used to store tensors that will be tunable self.register_parameter("theta", nn.Parameter(torch.tensor(theta, dtype=torch.float))) + self.register_parameter("r", torch.nn.Parameter(torch.tensor(r, dtype=torch.float))) self.register_parameter("beta", nn.Parameter(torch.tensor(beta, dtype=torch.float))) self.register_parameter("alpha", nn.Parameter(torch.tensor(alpha, dtype=torch.float))) self.register_parameter("rel_ref_strength", nn.Parameter(torch.tensor(rel_ref_strength, dtype=torch.float))) @@ -88,7 +92,7 @@ def input(self, edge_index: torch.Tensor, W: torch.Tensor, state: torch.Tensor, Computes the input at time step :obj:`t+1` by adding together the synaptic input from neighboring neurons and the stimulus input. .. math:: - g_i(t+1) = \sum_{\tau=0}^{T-1} \left(X_i(t-\tau)r(\tau) + \sum_{j \in \mathcal{N}(i)} (W_0)_{j, i} X_j(t-\tau) c(\tau)\right) + \mathcal{E}_i(t+1) + g_i(t+1) = \sum_{\tau=0}^{T-1} \left(X_i(t-\tau)ref(\tau) + \sum_{j \in \mathcal{N}(i)} (W_0)_{j, i} X_j(t-\tau) c(\tau)\right) + \mathcal{E}_i(t+1) Parameters ---------- @@ -106,7 +110,7 @@ def input(self, edge_index: torch.Tensor, W: torch.Tensor, state: torch.Tensor, synaptic_input : torch.Tensor [n_neurons, 1] """ - return self.synaptic_input(edge_index, W, state=state) + self.stimulus_input(t) + return self.r * self.synaptic_input(edge_index, W, state=state) + self.stimulus_input(t) def non_linearity(self, input: torch.Tensor) -> torch.Tensor: r""" @@ -150,7 +154,7 @@ def connectivity_filter(self, W0: torch.Tensor, edge_index: torch.Tensor) -> tor r""" The connectivity filter constructs a tensor holding the weights of the edges in the network. This is done by filtering the initial coupling weights :math:`W_0` with the coupling filter :math:`c` - and using a refractory filter :math:`r` as self-edge weights to emulate the refractory period. + and using a refractory filter :math:`ref` as self-edge weights to emulate the refractory period. For the coupling edges, we are given an initial weight :math:`(W_0)_{i,j}` for each edge. This tells us how strong the connection between neurons :math:`i` and :math:`j` is immediately after a spike event. @@ -172,16 +176,16 @@ def connectivity_filter(self, W0: torch.Tensor, edge_index: torch.Tensor) -> tor This is modeled by weighting spike events by to :math:`r e^{-\alpha t \Delta t}` for the next :math:`R_{ref}` time steps. - That is, the refractory filter :math:`r` is given by + That is, the refractory filter :math:`ref` is given by .. math:: - r(t) = \begin{cases} - a & \text{if } t < A_{ref} \\ - r e^{-\alpha t \Delta t} & \text{if } A_{ref} \leq t < A_{ref} + R_{ref} \\ + ref(t) = \begin{cases} + abs & \text{if } t < A_{ref} \\ + rel e^{-\alpha t \Delta t} & \text{if } A_{ref} \leq t < A_{ref} + R_{ref} \\ 0 & \text{if } A_{ref} + R_{ref} \leq t \end{cases} - And we set `W_{i, i}(t) = r(t)` for all neurons :math:`i`. + And we set `W_{i, i}(t) = ref(t)` for all neurons :math:`i`. All of this information can be represented by a tensor :math:`W` of shape :math:`N\times N\times T`, where :code:`W[i, j, t]` is the weight of the edge from neuron :math:`i` to neuron :math:`j` at time step :math:`t` after a spike event. diff --git a/spikeometric/models/sa_model.py b/spikeometric/models/sa_model.py index fe66cb7a4..0af80b378 100644 --- a/spikeometric/models/sa_model.py +++ b/spikeometric/models/sa_model.py @@ -51,11 +51,11 @@ def simulate(self, data: Data, n_steps: int, verbose: bool =True, equilibration_ device = edge_index.device # If verbose is True, a progress bar is shown - pbar = tqdm(range(n_steps + equilibration_steps), colour="#3E5641") if verbose else range(n_steps + equilibration_steps) + pbar = tqdm(range(n_steps), colour="#3E5641") if verbose else range(n_steps) # Initialize the state of the network - x = torch.zeros(n_neurons, n_steps + equilibration_steps, device=device, dtype=store_as_dtype) - initial_activation = torch.rand((n_neurons,1), device=device) + x = torch.zeros(n_neurons, n_steps, device=device, dtype=store_as_dtype) + initial_activation = torch.rand((n_neurons, T), device=device) activation = self.equilibrate(edge_index, W, initial_activation, equilibration_steps, store_as_dtype=store_as_dtype) # Simulate the network @@ -176,7 +176,7 @@ def tune( self.requires_grad_(False) # Freeze the parameters - def equilibrate(self, edge_index: torch.Tensor, W: torch.Tensor, inital_state: torch.Tensor, n_steps=100, store_as_dtype: torch.dtype = torch.int) -> torch.Tensor: + def equilibrate(self, edge_index: torch.Tensor, W: torch.Tensor, initial_state: torch.Tensor, n_steps=100, store_as_dtype: torch.dtype = torch.int) -> torch.Tensor: """ Equilibrate the network to a given connectivity matrix. @@ -186,7 +186,7 @@ def equilibrate(self, edge_index: torch.Tensor, W: torch.Tensor, inital_state: t The connectivity of the network W: torch.Tensor The connectivity filter - inital_state: torch.Tensor + initial_state: torch.Tensor The initial state of the network n_steps: int The number of time steps to equilibrate for @@ -198,13 +198,14 @@ def equilibrate(self, edge_index: torch.Tensor, W: torch.Tensor, inital_state: t x: torch.Tensor The state of the network at each time step """ - n_neurons = inital_state.shape[0] - device = inital_state.device + n_neurons = initial_state.shape[0] + device = initial_state.device x_equi = torch.zeros((n_neurons, self.T + n_steps), device=device, dtype=store_as_dtype) - x_equi[:, self.T-1] = inital_state.squeeze() + activation_equi = initial_state # Equilibrate the network for t in range(self.T, self.T + n_steps): - x_equi[:, t] = self(edge_index=edge_index, W=W, state=x_equi[:, t-self.T:t]) + x_equi[:, t] = self(edge_index=edge_index, W=W, state=activation_equi) + activation_equi = self.update_activation(spikes=x_equi[:, t:t+self.T], activation=activation_equi) - return x_equi[:, -self.T:] \ No newline at end of file + return activation_equi \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index c4d7e2d0e..554648c97 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -96,6 +96,7 @@ def bernoulli_glm(): rel_ref_scale=7, rel_ref_strength=-30., alpha=0.2, + r=1, rng=rng, ) return model diff --git a/tests/test_data/stim_plan.pt b/tests/test_data/stim_plan.pt index ebaf491b9..d35cc38ae 100644 Binary files a/tests/test_data/stim_plan.pt and b/tests/test_data/stim_plan.pt differ diff --git a/tests/test_models.py b/tests/test_models.py index e92a2d79a..1fc11d4e9 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -87,7 +87,7 @@ def test_save_load(bernoulli_glm): from spikeometric.models import BernoulliGLM with NamedTemporaryFile() as f: bernoulli_glm.save(f.name) - loaded_model = BernoulliGLM(1, 1, 1, 1, 1, 1, 1, 1, 1) + loaded_model = BernoulliGLM(1, 1, 1, 1, 1, 1, 1, 1, 1, 1) loaded_model.load(f.name) for param, loaded_param in zip(bernoulli_glm.parameters(), loaded_model.parameters()): assert_close(param, loaded_param) diff --git a/tests/test_simulation.py b/tests/test_simulation.py index a3b2835d4..4aafd2c17 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -28,4 +28,18 @@ def test_storing_different_dtypes(bernoulli_glm, example_data): import torch for dtype in [torch.uint8, torch.int, torch.float, torch.double, torch.bool]: X = bernoulli_glm.simulate(example_data, n_steps=1, verbose=False, store_as_dtype=dtype) - assert X.dtype == dtype \ No newline at end of file + assert X.dtype == dtype + +@pytest.mark.parametrize( + "model,example_data", + [ + (pytest.lazy_fixture('bernoulli_glm'), pytest.lazy_fixture('bernoulli_glm_network')), + (pytest.lazy_fixture('poisson_glm'), pytest.lazy_fixture('poisson_glm_network')), + (pytest.lazy_fixture('rectified_lnp'), pytest.lazy_fixture('rectified_lnp_network')), + (pytest.lazy_fixture('threshold_sam'), pytest.lazy_fixture('threshold_sam_network')), + (pytest.lazy_fixture('rectified_sam'), pytest.lazy_fixture('rectified_sam_network')), + ], +) +def test_does_not_store_equilibration_steps(model, example_data): + X = model.simulate(example_data, n_steps=100, verbose=False, equilibration_steps=10) + assert X.shape[1] == 100 \ No newline at end of file