Skip to content
Snippets Groups Projects
Commit e06ecfec authored by Didi Hou's avatar Didi Hou
Browse files

update multi-area-model.ipynb

parent ce7733de
No related branches found
No related tags found
1 merge request!35Pre-release MAM v1.1.0
%% Cell type:markdown id:b1331599 tags:
# Down-scaled multi-area model
%% Cell type:markdown id:d782e527 tags:
### Create config file
%% Cell type:code id:9b985084 tags:
``` python
with open('config.py', 'w') as fp:
fp.write(
'''import os
base_path = os.path.abspath(".")
data_path = os.path.abspath("simulations")
jobscript_template = "python {base_path}/run_simulation.py {label}"
submit_cmd = "bash -c"
''')
```
%% Cell type:markdown id:4a853b97 tags:
### Import dependencies
%% Cell type:code id:96517739 tags:
``` python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import os
import nest
from multiarea_model import MultiAreaModel
from config import base_path
```
%% Cell type:code id:7e07b0d0 tags:
``` python
!pip install nested_dict dicthash
```
%% Cell type:markdown id:2f429063 tags:
### Jupyter notebook display format setting
%% Cell type:code id:1d440c07-9b69-4e52-8573-26b13493bc5a tags:
``` python
# specify the format the table in output
%%html
<style>
table {float:left}
</style>
```
%% Cell type:markdown id:89d4866d tags:
<br>
%% Cell type:markdown id:df83f5ea-1c4b-44d3-9926-01786aa46e14 tags:
## Specify paramters of model
%% Cell type:markdown id:2cedd26b tags:
### 1. Scaling factor (scale_down_to)
**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>
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 tags:
|Parameter |Parameter description |Variable |Value |Value description |
|:-------------:|:----------------------|:---------------------------:|:------------------:|:------------------|
|Scaling factor | | scale_down_to |0.005 | |
%% Cell type:code id:e940bb6b tags:
``` python
scale_down_to = 0.005 # Change it to 1. for running the fullscale network
```
%% Cell type:markdown id:d53f1eab tags:
### 2. Model and simulation parameters
### 2. Model, simulation and theory parameters
%% Cell type:markdown id:e779c727 tags:
The parameters fall into 3 categories: Model parameters, Simulation parameters, Theory parameters.<br>
**Model parameters**<br>
Model paramters are the 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.
* Connection paramters
* Input parameters
* Neuron parameters
* Network parameters<br>
**Simualation parameters**<br>
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>
**Theory parameters**<br>
Theory parameters defines ...
%% Cell type:markdown id:14bac1ce-4ba0-47ec-84b2-9d3c72bc96ec tags:
#### 2.1 Connection parameters (conn_params)
#### 2.1 Model parameters
%% Cell type:markdown id:106a6a5e tags:
* Connection parameters (conn_params)
%% Cell type:markdown id:41d80271-f60e-49f4-9759-f8ad26097b2d tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------:|:----------------------|:---------------------------:|:------------------:|:------------------|
| | | replace_non_simulated_areas | 'het_poisson_stat' | |
| | | g | -11. | |
| | | K_stable | 'K_stable.npy' | |
| | | fac_nu_ext_TH | 1.2 | |
| | | fac_nu_ext_5E | 1.125 | |
| | | fac_nu_ext_6E | 1.41666667 | |
| | | av_indegree_V1 | 3950. | |
%% Cell type:code id:7af3a191 tags:
``` python
conn_params = {'replace_non_simulated_areas': 'het_poisson_stat',
'g': -11.,
'K_stable': 'K_stable.npy',
'fac_nu_ext_TH': 1.2,
'fac_nu_ext_5E': 1.125,
'fac_nu_ext_6E': 1.41666667,
'av_indegree_V1': 3950.}
```
%% Cell type:markdown id:1688ef55-2fdb-4800-97af-7ea62442c684 tags:
#### 2.2 Input parameters (input_params)
* Input parameters (input_params)
%% Cell type:markdown id:5127920c-2a89-42d0-9d87-889f7b7474d9 tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------:|:----------------------|:-----------------------------:|:--------------------:|:------------------|
| | | rate_ext | 10. | |
%% Cell type:code id:2195cddb-bd82-47a8-ba74-cf0169a6801d tags:
``` python
input_params = {'rate_ext': 10.}
```
%% Cell type:markdown id:aefa84c8-baaa-4afa-96c6-5d57d174b286 tags:
#### 2.3 Neuron parameters (neuron_params)
* Neuron parameters (neuron_params)
%% Cell type:markdown id:ab5eb287-e638-401f-9e2c-892f88c3ee90 tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------:|:----------------------|:---------------------------:|:------------------:|:------------------|
| | | V0_mean | -150. | |
| | | V0_sd | 50. | |
%% Cell type:code id:f69ad836-70b8-4ebe-b46a-25f48dc3ca7c tags:
%% Cell type:markdown id:ea4e01aa tags:
``` python
neuron_params = {'V0_mean': -150.,
'V0_sd': 50.}
```
%% Cell type:markdown id:cdb50fb3-4bb9-446a-ab1c-d008b7e5bfa4 tags:
* Network parameters (network_params)
#### 2.4 Network parameters (network_params)
%% Cell type:markdown id:3e437aca-1fd0-4296-a0f6-a346b1319903 tags:
%% Cell type:markdown id:dc4ce111 tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------------------------------------:|:----------------------|:---------------------:|:-----------------------------:|:------------------|
| Scaling factor of the number of neurons | | N_scaling | scale_down_to | |
| Scaling factor of the number of synapses| | K_scaling | scale_down_to | |
| Fullscale rates | | fullscale_rates | 'tests/fullscale_rates.json' | |
| Input parameters | | input_params | input_params | |
| Connections parameters | | connection_params | conn_params | |
| Neuron parameters | | neuron_params | neuron_params | |
%% Cell type:code id:6e4bed8d tags:
``` python
conn_params = {'replace_non_simulated_areas': 'het_poisson_stat',
'g': -11.,
'K_stable': 'K_stable.npy',
'fac_nu_ext_TH': 1.2,
'fac_nu_ext_5E': 1.125,
'fac_nu_ext_6E': 1.41666667,
'av_indegree_V1': 3950.}
```
%% Cell type:code id:7e4ede2c tags:
``` python
input_params = {'rate_ext': 10.}
```
%% Cell type:code id:f69ad836-70b8-4ebe-b46a-25f48dc3ca7c tags:
``` python
neuron_params = {'V0_mean': -150.,
'V0_sd': 50.}
```
%% Cell type:code id:0aa9a9bf-b95d-4643-82a0-e29a49bb58df tags:
``` python
network_params = {'N_scaling': scale_down_to,
'K_scaling': scale_down_to,
'fullscale_rates': 'tests/fullscale_rates.json',
'input_params': input_params,
'connection_params': conn_params,
'neuron_params': neuron_params}
```
%% Cell type:markdown id:a0730f70-ed9b-4664-b677-3dda965a01ef tags:
### 2.5 Simulation paramters (sim_params)
### 2.2 Simulation paramters (sim_params)
%% Cell type:markdown id:c989ee79-fa3d-405c-a1bf-da8ec884d878 tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------------------:|:----------------------|:--------------------:|:------------------:|:------------------|
|Simulation time | |t_sim |2000. | |
|Number of processes | |num_processes |1 | |
|Number of local threads| |local_num_threads |1 | |
| | |recording_dict |input_params | |
| | |record_vm |False | |
%% Cell type:code id:21484ed3-295f-4d06-b757-2969aac429a4 tags:
``` python
sim_params = {'t_sim': 2000.,
'num_processes': 1,
'local_num_threads': 1,
'recording_dict': {'record_vm': False},
'rng_seed': 1} # global random seed
```
%% Cell type:markdown id:79596d77-c105-45d0-9a57-2d15e31f1189 tags:
### 2.6. Theory paramters (theory_params)
### 2.3. Theory paramters (theory_params)
%% Cell type:markdown id:18e0deda-1dec-4df8-b994-ef641b3c5aac tags:
| Parameter | Parameter description | Variable | Value | Value description |
|:---------:|:----------------------|:---------------------:|:-----------------------------:|:------------------|
| | | dt | 0.1 | |
%% Cell type:code id:41edb350-36c3-4e19-829e-40d6ca9633a0 tags:
``` python
theory_params = {'dt': 0.1}
```
%% Cell type:markdown id:1472e9c5 tags:
<br>
%% Cell type:markdown id:de4a6703 tags:
## Instantiate a multi-area model and analyse
%% Cell type:markdown id:1fd58841 tags:
### 1. Insantiate a multi-area model
%% Cell type:code id:ab25f9f8 tags:
``` python
M = MultiAreaModel(network_params, simulation=True,
sim_spec=sim_params,
theory=True,
theory_spec=theory_params)
```
%% Cell type:markdown id:91649c30 tags:
### 2. Predict firing rates from theory
%% Cell type:code id:6a7ddf0e tags:
``` python
p, r = M.theory.integrate_siegert()
print("Mean-field theory predicts an average "
"rate of {0:.3f} spikes/s across all populations.".format(np.mean(r[:, -1])))
```
%% Cell type:markdown id:2062ddf3 tags:
### 3. Extract connectivity
%% Cell type:markdown id:8a7c09e0 tags:
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).
%% Cell type:markdown id:b7396606 tags:
#### 3.1 Node indegrees
%% Cell type:code id:6316ac24 tags:
``` python
# Dictionary of nodes indegrees organized as:
# {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: indegree_values}}}}
M.K
```
%% Cell type:markdown id:253a2aba tags:
#### 3.2 Synapses
%% Cell type:code id:445a722a tags:
``` python
# Dictionary of synapses that target neurons receive, it is organized as:
# {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: number_of_synapses}}}}
M.synapses
```
%% Cell type:markdown id:6c01820e tags:
<br>
%% Cell type:markdown id:0c1cad59-81d0-4e24-ac33-13c4ca8c6dec tags:
## Run the simulation
%% Cell type:code id:15778e9c tags:
``` python
# run the simulation, depending on the model parameter and downscale ratio, the running time varies largely.
M.simulation.simulate()
```
%% Cell type:markdown id:fd6e3232 tags:
<br>
%% Cell type:markdown id:28e071f8 tags:
## Simulation results analysis
%% Cell type:markdown id:89c7b7cf tags:
The following instructions will work when the `simulate` parameter is set to `True` during the creation of the MultiAreaModel object, and the `M.simulation.simulate()` method is executed.
%% Cell type:code id:dc3b1820 tags:
``` python
# Uncomment the lines in this code cell below to test if the number of synapses created by NEST matches the expected values
# """
# Test if the correct number of synapses has been created.
# """
# print("Testing synapse numbers")
# for target_area_name in M.area_list:
# target_area = M.simulation.areas[M.simulation.areas.index(target_area_name)]
# for source_area_name in M.area_list:
# source_area = M.simulation.areas[M.simulation.areas.index(source_area_name)]
# for target_pop in M.structure[target_area.name]:
# target_nodes = target_area.gids[target_pop]
# for source_pop in M.structure[source_area.name]:
# source_nodes = source_area.gids[source_pop]
# created_syn = nest.GetConnections(source=source_nodes,
# target=target_nodes)
# syn = M.synapses[target_area.name][target_pop][source_area.name][source_pop]
# assert(len(created_syn) == int(syn))
```
%% Cell type:markdown id:57401110 tags:
To obtain the connections information, you can extract the lists of connected sources and targets. Moreover, you can access additional synaptic details, such as synaptic weights and delays.
%% Cell type:code id:e7eb052e tags:
``` python
conns = nest.GetConnections()
conns_sparse_matrix = conns.get(['source', 'target', 'weight'])
srcs = conns_sparse_matrix['source']
tgts = conns_sparse_matrix['target']
weights = conns_sparse_matrix['weight']
```
%% Cell type:markdown id:ef4b2e4b tags:
You can determine the area and subpopulation to which the neuron ID ranges belong by referring to the file `network_gids.txt`, which is automatically generated during network creation.
%% Cell type:code id:902f2800 tags:
``` python
# Open the file using a with statement
with open(os.path.join(M.simulation.data_dir,"recordings/network_gids.txt"), "r") as file:
# Read the contents of the file
gids = file.read()
# Print the contents
print(gids)
```
%% Cell type:markdown id:875263c1 tags:
<br>
%% Cell type:markdown id:9be9287d-4891-4b4b-bd19-cfc2ebed02ac tags:
## Load and process data of simulation results
%% Cell type:markdown id:8726a93d tags:
### 1. Load spike data
%% Cell type:code id:cb8e3edd tags:
``` python
data = np.loadtxt(M.simulation.data_dir + '/recordings/' + M.simulation.label + "-spikes-1-0.dat", skiprows=3)
```
%% Cell type:markdown id:8793e033 tags:
### 2. Compute instantaneous rate per neuron across all populations
%% Cell type:code id:9590223b tags:
``` python
tsteps, spikecount = np.unique(data[:,1], return_counts=True)
rate = spikecount / M.simulation.params['dt'] * 1e3 / np.sum(M.N_vec)
```
%% Cell type:markdown id:ca603daf tags:
<br>
%% Cell type:markdown id:57ff902c-d6ce-4f96-9e4f-8e3e7166ab66 tags:
## Simulation results visualization
%% Cell type:markdown id:38ddd973 tags:
### 1. Instantaneous and mean rate
%% Cell type:code id:bea30fc8 tags:
``` python
fig, ax = plt.subplots()
ax.plot(tsteps, rate)
ax.plot(tsteps, np.average(rate)*np.ones(len(tsteps)), label='mean')
ax.set_title('instantaneous rate across all populations')
ax.set_xlabel('time (ms)')
ax.set_ylabel('rate (spikes / s)')
ax.set_xlim(0, sim_params['t_sim'])
ax.set_ylim(0, 50)
ax.legend()
```
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment