From 65fa0b197785f9d7f1df9740837e2727c61873a1 Mon Sep 17 00:00:00 2001 From: Didi Hou <d.hou@outlook.com> Date: Fri, 18 Aug 2023 16:28:08 +0200 Subject: [PATCH] update multi-area-model.ipynb --- multi-area-model.ipynb | 669 +++++++++-------------------------------- 1 file changed, 145 insertions(+), 524 deletions(-) diff --git a/multi-area-model.ipynb b/multi-area-model.ipynb index d57f18d..b40d3f3 100644 --- a/multi-area-model.ipynb +++ b/multi-area-model.ipynb @@ -13,89 +13,46 @@ "id": "b952d0ea", "metadata": {}, "source": [ - "### Notebook structure <a class=\"anchor\" id=\"toc\"></a>\n", - "* [Create config file](#section_1)\n", - "* [Import dependencies](#section_2)\n", - "* [Jupyter notebook display format setting](#section_3)\n", - "* [Specify paramters of model](#section_4)\n", - " * [1. Scaling factor (scale_down_to)](#section_4.1)\n", - " * [2. Model parameters](#section_4.2)\n", - " * [3. Simulation parameters](#section_4.3)\n", - " * [4. Theory parameters](#section_4.4)\n", - "* [Instantiate a multi-area model and analyse](#section_5)\n", - " * [1. Insantiate a multi-area model](#section_5.1)\n", - " * [2. Predict firing rates from theory](#section_5.2)\n", - " * [3. Extract connectivity](#section_5.3)\n", - "* [Run the simulation](#section_6)\n", - "* [Simulation results analysis](#section_7)\n", - "* [Load and process data of simulation results](#section_8)\n", - "* [Simulation results visualization](#section_9) " + "#### Notebook structure <a class=\"anchor\" id=\"toc\"></a>\n", + "* [S0. Configuration](#section_0)\n", + "* [S1. Paramters specification](#section_1)\n", + " * [1.1. Parameters to tune](#section_1_1)\n", + " * [1.2. Default parameters](#section_1_2)\n", + "* [S2. Multi-area model instantiation and simulation](#section_2)\n", + " * [2.1. Insantiate a multi-area model](#section_2_1)\n", + " * [2.2. Predict firing rates from theory](#section_2_2)\n", + " * [2.3. Extract connectivity](#section_2_3)\n", + " * [2.4. Run the simulation](#section_2_4)\n", + "* [S3. Data processing and simulation results analysis](#section_3)\n", + "* [S4. Simulation results visualization](#section_4) " ] }, { "cell_type": "markdown", - "id": "d782e527", - "metadata": { - "tags": [] - }, - "source": [ - "### Create config file <a class=\"anchor\" id=\"section_1\"></a>" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "9b985084", + "id": "bd3d4b0e", "metadata": {}, - "outputs": [], "source": [ - "with open('config.py', 'w') as fp:\n", - " fp.write(\n", - "'''import os\n", - "base_path = os.path.abspath(\".\")\n", - "data_path = os.path.abspath(\"simulations\")\n", - "jobscript_template = \"python {base_path}/run_simulation.py {label}\"\n", - "submit_cmd = \"bash -c\"\n", - "''')" + "<br>" ] }, { "cell_type": "markdown", - "id": "4a853b97", - "metadata": {}, + "id": "d782e527", + "metadata": { + "tags": [] + }, "source": [ - "### Import dependencies <a class=\"anchor\" id=\"section_2\"></a>" + "## S0. Configuration <a class=\"anchor\" id=\"section_0\"></a>" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "96517739", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " -- N E S T --\n", - " Copyright (C) 2004 The NEST Initiative\n", - "\n", - " Version: 3.4\n", - " Built: May 17 2023 20:48:31\n", - "\n", - " This program is provided AS IS and comes with\n", - " NO WARRANTY. See the file LICENSE for details.\n", - "\n", - " Problems or suggestions?\n", - " Visit https://www.nest-simulator.org\n", - "\n", - " Type 'nest.help()' to find out more about NEST.\n", - "\n" - ] - } - ], + "outputs": [], "source": [ + "# Import dependencies\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", @@ -103,66 +60,49 @@ "import nest\n", "from IPython.display import display, HTML\n", "\n", + "# Import the MultiAreaModel class\n", "from multiarea_model import MultiAreaModel\n", "from config import base_path" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "7e07b0d0", + "execution_count": null, + "id": "2dd47c64", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: nested_dict in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (1.61)\n", - "Requirement already satisfied: dicthash in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (0.0.2)\n", - "Requirement already satisfied: future in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (from dicthash) (0.18.2)\n" - ] - } - ], + "outputs": [], "source": [ - "!pip install nested_dict dicthash" + "# Create config file\n", + "with open('config.py', 'w') as fp:\n", + " fp.write(\n", + "'''import os\n", + "base_path = os.path.abspath(\".\")\n", + "data_path = os.path.abspath(\"simulations\")\n", + "jobscript_template = \"python {base_path}/run_simulation.py {label}\"\n", + "submit_cmd = \"bash -c\"\n", + "''')" ] }, { - "cell_type": "markdown", - "id": "2f429063", - "metadata": { - "tags": [] - }, + "cell_type": "code", + "execution_count": null, + "id": "7e07b0d0", + "metadata": {}, + "outputs": [], "source": [ - "### Jupyter notebook display format setting <a class=\"anchor\" id=\"section_3\"></a>" + "!pip install nested_dict dicthash" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "1d440c07-9b69-4e52-8573-26b13493bc5a", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "<style>\n", - "table {float:left}\n", - "</style>\n" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# specify the format the table in output\n", + "outputs": [], + "source": [ + "# Jupyter notebook display format setting\n", "style = \"\"\"\n", "<style>\n", "table {float:left}\n", @@ -173,276 +113,130 @@ }, { "cell_type": "markdown", - "id": "5ed5f5d0-f88d-4bc0-9739-da926fabcfe5", + "id": "27160ba8", "metadata": {}, "source": [ - "<br>" + "Go back to [Notebook structure](#toc)" ] }, { "cell_type": "markdown", - "id": "df83f5ea-1c4b-44d3-9926-01786aa46e14", - "metadata": { - "tags": [] - }, + "id": "565be233", + "metadata": {}, "source": [ - "## Specify paramters of model <a class=\"anchor\" id=\"section_4\"></a>" + "<br>" ] }, { "cell_type": "markdown", - "id": "2cedd26b", + "id": "df83f5ea-1c4b-44d3-9926-01786aa46e14", "metadata": { "tags": [] }, "source": [ - "### 1. Scaling factor (scale_down_to) <a class=\"anchor\" id=\"section_4.1\"></a>\n", - "**Scaling factor** (scale_down_to) is the parameter which defines the the ratio of the full scale multi-area model being down-scaled to a model with fewer neurons and indegrees so as to be simulated on machines with lower computational ability and the simulation results can be obtained within relative shorter period of time.<br> <br> \n", - "Neurons and indegrees are both scaled down to 0.5%, where the model can usually be simulated on a local machine.<br> **Warning**: This will not yield reasonable dynamical results from the network and is only meant to demonstrate the simulation workflow.**" - ] - }, - { - "cell_type": "markdown", - "id": "f66dbf02", - "metadata": {}, - "source": [ - "|Parameter |Parameter description |Variable |Value |Value description |\n", - "|:-------------:|:----------------------|:---------------------------:|:------------------:|:------------------|\n", - "|Scaling factor | | scale_down_to |0.005 | |" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "e940bb6b", - "metadata": {}, - "outputs": [], - "source": [ - "scale_down_to = 0.005 # Change it to 1. for running the fullscale network" + "## S1. Paramters specification <a class=\"anchor\" id=\"section_1\"></a>" ] }, { "cell_type": "markdown", - "id": "14bac1ce-4ba0-47ec-84b2-9d3c72bc96ec", + "id": "30655817", "metadata": {}, "source": [ - "### 2. Model parameters <a class=\"anchor\" id=\"section_4.2\"></a>\n", - "Model paramters are most important among all the paramters, it directly affect the model itself and thus have a great impact on the simulation results. Model paramters define the connection, input, neuron, and network charateristics of the model, and therefore fall into four categories: **Connection paramters**, **Input paramters**, **Neuron paramters**, and **Network paramters**." + "### 1.1. Parameters to tune <a class=\"anchor\" id=\"section_1_1\"></a>" ] }, { "cell_type": "markdown", - "id": "106a6a5e", + "id": "4f67c1ba", "metadata": {}, "source": [ - "* Connection parameters (conn_params)" + "|Parameter |Variable |Value |Value description |\n", + "|:--------------------------------:|:--------------------------:|:------------------:|:------------------|\n", + "|Scaling factor |scale_down_to |0.005 |$^1$ |\n", + "|Ground state to metastable state |cc_weights_factor | |$^2$ |\n", + "|Replace non-simulated areas |replace_non_simulated_areas |'het_poisson_stat' |$^3$ |\n", + "|Simulation areas |sim_areas | |$^4$ |" ] }, { "cell_type": "markdown", - "id": "41d80271-f60e-49f4-9759-f8ad26097b2d", + "id": "a2161477", "metadata": {}, "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------:|:----------------------|:---------------------------:|:------------------:|:------------------|\n", - "| |It defines how non-simulated areas will be replaced | replace_non_simulated_areas | 'het_poisson_stat' |$^1$|\n", - "| |It sets the relative inhibitory synaptic strength | g | -11. |$^2$|\n", - "| |Stabilization method of Schuecker, Schmidt et al. (2017) | K_stable | 'K_stable.npy' |$^3$|\n", - "| |Increase the external input to 2/3E and 5E in area TH | fac_nu_ext_TH | 1. | |\n", - "| |Increase the external Poisson indegree onto 5E | fac_nu_ext_5E | 1.125 | |\n", - "| |Increase the external Poisson indegree onto 6E | fac_nu_ext_6E | 1.41666667 | |\n", - "| |Adjust the average indegree in V1 based on monkey data | av_indegree_V1 | 3950. | |\n", - "| |Scaling factor for cortico-cortical connections (chi) |cc_weights_factor | 1. |$^4$|\n", - "<br>" + "1. Scaling factor (`scale_down_to`) <br>\n", + "Scaling factor (scale_down_to) is the parameter which defines the the ratio of the full scale multi-area model being down-scaled to a model with fewer neurons and indegrees so as to be simulated on machines with lower computational ability and the simulation results can be obtained within relative shorter period of time.\n", + "Neurons and indegrees are both scaled down to 0.5%, where the model can usually be simulated on a local machine.<br> \n", + "**Warning**: This will not yield reasonable dynamical results from the network and is only meant to demonstrate the simulation workflow <br> \n", + "2. Ground state to metastable state (`cc_weights_factor`) <br>\n", + "Ground state to metastable state (cc_weights_factor) decides the switch of the model from ground state to metastable state. <br>\n", + "3. Replace non-simulated areas (`replace_non_simulated_areas`) <br>\n", + "Replace non-simulated areas (replace_non_simulated_areas) defines how non-simulated areas will be replaced. <br>\n", + "4. Simulation areas (`simulation_areas`) <br>\n", + "Simulation areas (simulation_areas) specifies the cortical areas included in the simulation process." ] }, { - "cell_type": "markdown", - "id": "6ab18b3e-4f0a-4dc2-b87a-b5397cd1b8fe", - "metadata": {}, - "source": [ - "Notes: \n", - "1. Whether to replace non-simulated areas by Poisson sources with the same global rate rate_ext ('hom_poisson_stat') or by specific rates ('het_poisson_stat') or by time-varying specific current ('het_current_nonstat'). In the two latter cases, the data to replace the cortico-cortical input is loaded from `replace_cc_input_source`\n", - "2. `g` controls the excitation to inhibition balance in network's activity.\n", - "3. Whether to apply the stabilization method of Schuecker, Schmidt et al. (2017). Default is None. Options are True to perform the stabilization or a string that specifies the name of a binary numpy file containing the connectivity matrix.\n", - "4. This scaling factor controls the cortico-cortical synaptic strength. If it is 1.0 then the inter-area synaptic strength is the same as the intra-areal. This factor changes the network activity from ground to metastable." - ] - }, - { - "cell_type": "markdown", - "id": "1688ef55-2fdb-4800-97af-7ea62442c684", - "metadata": {}, - "source": [ - "* Input parameters (input_params)" - ] - }, - { - "cell_type": "markdown", - "id": "5127920c-2a89-42d0-9d87-889f7b7474d9", - "metadata": {}, - "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------:|:----------------------|:-----------------------------:|:--------------------:|:------------------|\n", - "| |It defines the rate of the Poissonian spike generator (in spikes/s)| rate_ext | 10. | |" - ] - }, - { - "cell_type": "markdown", - "id": "aefa84c8-baaa-4afa-96c6-5d57d174b286", - "metadata": {}, - "source": [ - "* Neuron parameters (neuron_params)" - ] - }, - { - "cell_type": "markdown", - "id": "ab5eb287-e638-401f-9e2c-892f88c3ee90", - "metadata": {}, - "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------:|:----------------------|:---------------------------:|:------------------:|:------------------|\n", - "| |Mean for the distribution of initial membrane potentials| V0_mean | -150. | |\n", - "| |Standard deviation for the distribution of initial membrane potentials| V0_sd | 50. | |" - ] - }, - { - "cell_type": "markdown", - "id": "ea4e01aa", + "cell_type": "code", + "execution_count": null, + "id": "60265d52", "metadata": {}, + "outputs": [], "source": [ - "* Network parameters (network_params)" + "scale_down_to = 0.005 # Change it to 1. for running the fullscale network\n", + "cc_weights_factor = \n", + "replace_non_simulated_areas = 'het_poisson_stat'\n", + "sim_areas = " ] }, { "cell_type": "markdown", - "id": "dc4ce111", + "id": "de11b07f", "metadata": {}, "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------------------------------------:|:----------------------|:---------------------:|:-----------------------------:|:------------------|\n", - "| Scaling factor of the number of neurons | | N_scaling | scale_down_to | |\n", - "| Scaling factor of the number of synapses| | K_scaling | scale_down_to | |\n", - "| Fullscale rates | | fullscale_rates | 'tests/fullscale_rates.json' | |\n", - "| Input parameters | | input_params | input_params | |\n", - "| Connections parameters | | connection_params | conn_params | |\n", - "| Neuron parameters | | neuron_params | neuron_params | |" + "### 1.2. Default parameters <a class=\"anchor\" id=\"section_1_2\"></a>\n", + "Default parameters ...<br>\n", + "We try out best not to confuse users with too many parameters. However, if you want to change the default parameters, you can do so by passing a dictionary to the `default_params` argument of the `MultiAreaModel` class." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "6e4bed8d", "metadata": {}, "outputs": [], "source": [ + "# Connection parameters (conn_params)\n", "conn_params = {'replace_non_simulated_areas': 'het_poisson_stat',\n", " 'g': -11.,\n", " 'K_stable': 'K_stable.npy',\n", " 'fac_nu_ext_TH': 1.2,\n", " 'fac_nu_ext_5E': 1.125,\n", " 'fac_nu_ext_6E': 1.41666667,\n", - " 'av_indegree_V1': 3950.}" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "7e4ede2c", - "metadata": {}, - "outputs": [], - "source": [ - "input_params = {'rate_ext': 10.}" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "f69ad836-70b8-4ebe-b46a-25f48dc3ca7c", - "metadata": {}, - "outputs": [], - "source": [ + " 'av_indegree_V1': 3950.}\n", + "\n", + "# Input parameters (input_params)\n", + "input_params = {'rate_ext': 10.}\n", + "\n", + "# Neuron parameters (neuron_params)\n", "neuron_params = {'V0_mean': -150.,\n", - " 'V0_sd': 50.}" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "0aa9a9bf-b95d-4643-82a0-e29a49bb58df", - "metadata": {}, - "outputs": [], - "source": [ + " 'V0_sd': 50.}\n", + "\n", + "# Network parameters (network_params)\n", "network_params = {'N_scaling': scale_down_to,\n", " 'K_scaling': scale_down_to,\n", " 'fullscale_rates': 'tests/fullscale_rates.json',\n", " 'input_params': input_params,\n", " 'connection_params': conn_params,\n", - " 'neuron_params': neuron_params}" - ] - }, - { - "cell_type": "markdown", - "id": "a0730f70-ed9b-4664-b677-3dda965a01ef", - "metadata": {}, - "source": [ - "### 3. Simulation parameters (sim_params) <a class=\"anchor\" id=\"section_4.3\"></a>\n", - "Simulation parameters define the paramters that influence the process of simulation, inlcuding the simulation time, the number of processes and theads used to run the simulation.<br>" - ] - }, - { - "cell_type": "markdown", - "id": "c989ee79-fa3d-405c-a1bf-da8ec884d878", - "metadata": {}, - "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------------------:|:----------------------|:--------------------:|:------------------:|:------------------|\n", - "|Simulation time | |t_sim |2000. | |\n", - "|Number of processes | |num_processes |1 | |\n", - "|Number of local threads| |local_num_threads |1 | |\n", - "| | |recording_dict |input_params | |\n", - "| | |record_vm |False | |" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "21484ed3-295f-4d06-b757-2969aac429a4", - "metadata": {}, - "outputs": [], - "source": [ + " 'neuron_params': neuron_params}\n", + "\n", + "# Simulation parameters (sim_params)\n", "sim_params = {'t_sim': 2000.,\n", " 'num_processes': 1,\n", " 'local_num_threads': 1,\n", " 'recording_dict': {'record_vm': False},\n", - " 'rng_seed': 1} # global random seed" - ] - }, - { - "cell_type": "markdown", - "id": "79596d77-c105-45d0-9a57-2d15e31f1189", - "metadata": {}, - "source": [ - "### 4. Theory paramters (theory_params) <a class=\"anchor\" id=\"section_4.4\"></a>\n", - "Theory parameters defines ..." - ] - }, - { - "cell_type": "markdown", - "id": "18e0deda-1dec-4df8-b994-ef641b3c5aac", - "metadata": {}, - "source": [ - "| Parameter | Parameter description | Variable | Value | Value description |\n", - "|:---------:|:----------------------|:---------------------:|:-----------------------------:|:------------------|\n", - "| | | dt | 0.1 | |" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "41edb350-36c3-4e19-829e-40d6ca9633a0", - "metadata": {}, - "outputs": [], - "source": [ + " 'rng_seed': 1} # global random seed\n", + "\n", + "# Theory paramters (theory_params)\n", "theory_params = {'dt': 0.1}" ] }, @@ -467,7 +261,7 @@ "id": "de4a6703", "metadata": {}, "source": [ - "## Instantiate a multi-area model and analyse <a class=\"anchor\" id=\"section_5\"></a>" + "## S2. Multi-area model instantiation and simulation <a class=\"anchor\" id=\"section_2\"></a>" ] }, { @@ -475,75 +269,15 @@ "id": "1fd58841", "metadata": {}, "source": [ - "### 1. Insantiate a multi-area model <a class=\"anchor\" id=\"section_5.1\"></a>" + "### 2.1. Insantiate a multi-area model <a class=\"anchor\" id=\"section_2_1\"></a>" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "ab25f9f8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initializing network from dictionary.\n", - "RAND_DATA_LABEL 216\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/srv/main-spack-instance-2302/spack/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0/py-numpy-1.21.6-6fewtq7oarp3vtwlxrrcofz5sxwt55s7/lib/python3.8/site-packages/numpy/core/fromnumeric.py:3440: RuntimeWarning:Mean of empty slice.\n", - "/srv/main-spack-instance-2302/spack/opt/spack/linux-ubuntu20.04-x86_64/gcc-10.3.0/py-numpy-1.21.6-6fewtq7oarp3vtwlxrrcofz5sxwt55s7/lib/python3.8/site-packages/numpy/core/_methods.py:189: RuntimeWarning:invalid value encountered in double_scalars\n", - "Error in library(\"aod\") : there is no package called ‘aod’\n", - "Execution halted\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No R installation or IndexError, taking hard-coded SLN fit parameters.\n", - "\n", - "\n", - "========================================\n", - "Customized parameters\n", - "--------------------\n", - "{'K_scaling': 0.005,\n", - " 'N_scaling': 0.005,\n", - " 'connection_params': {'K_stable': 'K_stable.npy',\n", - " 'av_indegree_V1': 3950.0,\n", - " 'fac_nu_ext_5E': 1.125,\n", - " 'fac_nu_ext_6E': 1.41666667,\n", - " 'fac_nu_ext_TH': 1.2,\n", - " 'g': -11.0,\n", - " 'replace_non_simulated_areas': 'het_poisson_stat'},\n", - " 'fullscale_rates': 'tests/fullscale_rates.json',\n", - " 'input_params': {'rate_ext': 10.0},\n", - " 'neuron_params': {'V0_mean': -150.0, 'V0_sd': 50.0}}\n", - "========================================\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/view/lib/python3.8/site-packages/dicthash/dicthash.py:47: UserWarning:Float too small for safe conversion tointeger. Rounding down to zero.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Simulation label: 27d81076e6d6e9e591684be053078477\n", - "Copied files.\n", - "Initialized simulation class.\n" - ] - } - ], + "outputs": [], "source": [ "M = MultiAreaModel(network_params, simulation=True,\n", " sim_spec=sim_params,\n", @@ -556,24 +290,15 @@ "id": "91649c30", "metadata": {}, "source": [ - "### 2. Predict firing rates from theory <a class=\"anchor\" id=\"section_5.2\"></a>" + "### 2.2. Predict firing rates from theory <a class=\"anchor\" id=\"section_2_2\"></a>" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "6a7ddf0e", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration: 0\n", - "Mean-field theory predicts an average rate of 29.588 spikes/s across all populations.\n" - ] - } - ], + "outputs": [], "source": [ "p, r = M.theory.integrate_siegert()\n", "print(\"Mean-field theory predicts an average \"\n", @@ -585,7 +310,7 @@ "id": "2062ddf3", "metadata": {}, "source": [ - "### 3. Extract connectivity <a class=\"anchor\" id=\"section_5.3\"></a>" + "### 2.3. Extract connectivity <a class=\"anchor\" id=\"section_2_3\"></a>" ] }, { @@ -593,7 +318,9 @@ "id": "8a7c09e0", "metadata": {}, "source": [ - "The connectivity and neuron numbers are stored in the attributes of the model class. Neuron numbers are stored in `M.N` as a dictionary (and in `M.N_vec` as an array), indegrees in `M.K` as a dictionary (and in `M.K_matrix` as an array). Number of synapses can also be access via `M.synapses` (and in `M.syn_matrix` as an array)." + "The connectivity and neuron numbers are stored in the attributes of the model class. Neuron numbers are stored in `M.N` as a dictionary (and in `M.N_vec` as an array), indegrees in `M.K` as a dictionary (and in `M.K_matrix` as an array). Number of synapses can also be access via `M.synapses` (and in `M.syn_matrix` as an array). <br>\n", + "\n", + "**Warning**: memory explosion" ] }, { @@ -601,12 +328,12 @@ "id": "b7396606", "metadata": {}, "source": [ - "#### 3.1 Node indegrees" + "#### 2.3.1 Node indegrees" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "6316ac24", "metadata": {}, "outputs": [], @@ -621,12 +348,12 @@ "id": "253a2aba", "metadata": {}, "source": [ - "#### 3.2 Synapses" + "#### 2.3.2 Synapses" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "445a722a", "metadata": {}, "outputs": [], @@ -657,90 +384,15 @@ "id": "0c1cad59-81d0-4e24-ac33-13c4ca8c6dec", "metadata": {}, "source": [ - "## Run the simulation <a class=\"anchor\" id=\"section_6\"></a>" + "### 2.4. Run the simulation <a class=\"anchor\" id=\"section_2_4\"></a>" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "15778e9c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Prepared simulation in 0.00 seconds.\n", - "Rank 0: created area V1 with 0 local nodes\n", - "Memory after V1 : 1912.68 MB\n", - "Rank 0: created area V2 with 0 local nodes\n", - "Memory after V2 : 1939.39 MB\n", - "Rank 0: created area VP with 0 local nodes\n", - "Memory after VP : 1968.57 MB\n", - "Rank 0: created area V3 with 0 local nodes\n", - "Memory after V3 : 1996.86 MB\n", - "Rank 0: created area V3A with 0 local nodes\n", - "Memory after V3A : 2016.65 MB\n", - "Rank 0: created area MT with 0 local nodes\n", - "Memory after MT : 2042.32 MB\n", - "Rank 0: created area V4t with 0 local nodes\n", - "Memory after V4t : 2067.26 MB\n", - "Rank 0: created area V4 with 0 local nodes\n", - "Memory after V4 : 2094.32 MB\n", - "Rank 0: created area VOT with 0 local nodes\n", - "Memory after VOT : 2119.51 MB\n", - "Rank 0: created area MSTd with 0 local nodes\n", - "Memory after MSTd : 2141.02 MB\n", - "Rank 0: created area PIP with 0 local nodes\n", - "Memory after PIP : 2162.38 MB\n", - "Rank 0: created area PO with 0 local nodes\n", - "Memory after PO : 2183.84 MB\n", - "Rank 0: created area DP with 0 local nodes\n", - "Memory after DP : 2204.07 MB\n", - "Rank 0: created area MIP with 0 local nodes\n", - "Memory after MIP : 2225.65 MB\n", - "Rank 0: created area MDP with 0 local nodes\n", - "Memory after MDP : 2247.12 MB\n", - "Rank 0: created area VIP with 0 local nodes\n", - "Memory after VIP : 2269.10 MB\n", - "Rank 0: created area LIP with 0 local nodes\n", - "Memory after LIP : 2293.04 MB\n", - "Rank 0: created area PITv with 0 local nodes\n", - "Memory after PITv : 2318.38 MB\n", - "Rank 0: created area PITd with 0 local nodes\n", - "Memory after PITd : 2343.60 MB\n", - "Rank 0: created area MSTl with 0 local nodes\n", - "Memory after MSTl : 2365.06 MB\n", - "Rank 0: created area CITv with 0 local nodes\n", - "Memory after CITv : 2384.12 MB\n", - "Rank 0: created area CITd with 0 local nodes\n", - "Memory after CITd : 2403.45 MB\n", - "Rank 0: created area FEF with 0 local nodes\n", - "Memory after FEF : 2424.92 MB\n", - "Rank 0: created area TF with 0 local nodes\n", - "Memory after TF : 2440.57 MB\n", - "Rank 0: created area AITv with 0 local nodes\n", - "Memory after AITv : 2463.29 MB\n", - "Rank 0: created area FST with 0 local nodes\n", - "Memory after FST : 2480.05 MB\n", - "Rank 0: created area 7a with 0 local nodes\n", - "Memory after 7a : 2501.22 MB\n", - "Rank 0: created area STPp with 0 local nodes\n", - "Memory after STPp : 2519.98 MB\n", - "Rank 0: created area STPa with 0 local nodes\n", - "Memory after STPa : 2539.04 MB\n", - "Rank 0: created area 46 with 0 local nodes\n", - "Memory after 46 : 2554.37 MB\n", - "Rank 0: created area AITd with 0 local nodes\n", - "Memory after AITd : 2577.05 MB\n", - "Rank 0: created area TH with 0 local nodes\n", - "Memory after TH : 2589.76 MB\n", - "Created areas and internal connections in 2.13 seconds.\n", - "Created cortico-cortical connections in 20.67 seconds.\n", - "Simulated network in 57.88 seconds.\n" - ] - } - ], + "outputs": [], "source": [ "# run the simulation, depending on the model parameter and downscale ratio, the running time varies largely.\n", "M.simulation.simulate()" @@ -767,7 +419,7 @@ "id": "28e071f8", "metadata": {}, "source": [ - "## Simulation results analysis <a class=\"anchor\" id=\"section_7\"></a>" + "## S3. Data processing and simulation results analysis <a class=\"anchor\" id=\"section_3\"></a>" ] }, { @@ -780,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "dc3b1820", "metadata": {}, "outputs": [], @@ -815,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "e7eb052e", "metadata": {}, "outputs": [], @@ -838,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "902f2800", "metadata": {}, "outputs": [], @@ -852,30 +504,6 @@ "# print(gids)" ] }, - { - "cell_type": "markdown", - "id": "875263c1", - "metadata": {}, - "source": [ - "Go back to [Notebook structure](#toc)" - ] - }, - { - "cell_type": "markdown", - "id": "e96a754e-7e51-4892-966b-d9bd03d63e91", - "metadata": {}, - "source": [ - "<br>" - ] - }, - { - "cell_type": "markdown", - "id": "9be9287d-4891-4b4b-bd19-cfc2ebed02ac", - "metadata": {}, - "source": [ - "## Load and process data of simulation results" - ] - }, { "cell_type": "markdown", "id": "8726a93d", @@ -886,7 +514,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "cb8e3edd", "metadata": {}, "outputs": [], @@ -904,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "9590223b", "metadata": {}, "outputs": [], @@ -921,12 +549,28 @@ "Go back to [Notebook structure](#toc)" ] }, + { + "cell_type": "markdown", + "id": "b1320ab1", + "metadata": {}, + "source": [ + "Go back to [Notebook structure](#toc)" + ] + }, + { + "cell_type": "markdown", + "id": "529b1ade", + "metadata": {}, + "source": [ + "<br>" + ] + }, { "cell_type": "markdown", "id": "57ff902c-d6ce-4f96-9e4f-8e3e7166ab66", "metadata": {}, "source": [ - "## Simulation results visualization" + "## S4. Simulation results visualization <a class=\"anchor\" id=\"section_4\"></a>" ] }, { @@ -934,38 +578,15 @@ "id": "38ddd973", "metadata": {}, "source": [ - "### 1. Instantaneous and mean rate" + "### 4.1. Instantaneous and mean rate" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "bea30fc8", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<matplotlib.legend.Legend at 0x7f8d4ea70af0>" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 432x288 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "ax.plot(tsteps, rate)\n", -- GitLab