The Simulation object

Let’s familiarize ourselves with the Simulation object.

In this tutorial we:

  1. Initialize an empty ``Simulation`` object
  2. Initialize the NEST kernel (Simulation.init__kernel)
  3. Create a network (Simulation.create__network)
  4. Create sessions:
    1. Build session models (Simulation.build__session__models)
    2. Build the list of sessions from session models (Simulation.build__sessions)
  5. Run the simulation
  6. Replicate the simulation

NB: Usually we’d perform all the steps at once by providing the full simulation tree to the Simulation object during initialization

[1]:
import nest
import yaml
from pathlib import Path
from pprint import pprint

from denest import *
import denest
[2]:
PARAMS_DIR = Path('./data/params')
DATA_DIR = Path('./data/outputs')
OUTPUT_DIR = DATA_DIR/'output'

Initialize an empty Simulation object

Empty network, no kernel initialization, etc…

[3]:
sim = Simulation(output_dir=OUTPUT_DIR)
2020-06-30 13:52:43,106 [denest.utils.validation] INFO: 'None' tree: adding empty child kernel
2020-06-30 13:52:43,107 [denest.utils.validation] INFO: 'None' tree: adding empty child simulation
2020-06-30 13:52:43,108 [denest.utils.validation] INFO: 'None' tree: adding empty child session_models
2020-06-30 13:52:43,109 [denest.utils.validation] INFO: 'None' tree: adding empty child network
2020-06-30 13:52:43,111 [denest.utils.validation] INFO: Object `simulation`: params: using default value for optional parameters:
{'input_dir': 'input', 'output_dir': 'output', 'sessions': []}
2020-06-30 13:52:43,116 [denest.utils.validation] INFO: Object `kernel`: params: using default value for optional parameters:
{'extension_modules': [], 'nest_seed': 1}
2020-06-30 13:52:43,118 [denest.simulation] INFO: Initializing NEST kernel and seeds...
2020-06-30 13:52:43,119 [denest.simulation] INFO:   Resetting NEST kernel...
2020-06-30 13:52:43,142 [denest.simulation] INFO:   Setting NEST kernel status...
2020-06-30 13:52:43,146 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({})`
2020-06-30 13:52:43,153 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({'data_path': 'data/outputs/output/data', 'grng_seed': 2, 'rng_seeds': range(3, 4)})
2020-06-30 13:52:43,168 [denest.simulation] INFO:   Finished setting NEST kernel status
2020-06-30 13:52:43,173 [denest.simulation] INFO:   Installing external modules...
2020-06-30 13:52:43,179 [denest.simulation] INFO:   Finished installing external modules
2020-06-30 13:52:43,189 [denest.simulation] INFO: Finished initializing kernel
2020-06-30 13:52:43,193 [denest.simulation] INFO: Build N=0 session models
2020-06-30 13:52:43,197 [denest.simulation] INFO: Build N=0 sessions
2020-06-30 13:52:43,210 [denest.simulation] INFO: Sessions: []
2020-06-30 13:52:43,212 [denest.simulation] INFO: Building network.
2020-06-30 13:52:43,219 [denest.utils.validation] INFO: 'None' tree: adding empty child neuron_models
2020-06-30 13:52:43,233 [denest.utils.validation] INFO: 'None' tree: adding empty child synapse_models
2020-06-30 13:52:43,254 [denest.utils.validation] INFO: 'None' tree: adding empty child layers
2020-06-30 13:52:43,272 [denest.utils.validation] INFO: 'None' tree: adding empty child projection_models
2020-06-30 13:52:43,285 [denest.utils.validation] INFO: 'None' tree: adding empty child topology
2020-06-30 13:52:43,297 [denest.utils.validation] INFO: 'None' tree: adding empty child recorder_models
2020-06-30 13:52:43,302 [denest.utils.validation] INFO: 'None' tree: adding empty child recorders
2020-06-30 13:52:43,305 [denest.network] INFO: Build N=0 ``Model`` objects
2020-06-30 13:52:43,308 [denest.network] INFO: Build N=0 ``SynapseModel`` objects
2020-06-30 13:52:43,310 [denest.network] INFO: Build N=0 ``Model`` objects
2020-06-30 13:52:43,315 [denest.network] INFO: Build N=0 ``Layer`` or ``InputLayer`` objects.
2020-06-30 13:52:43,318 [denest.network] INFO: Build N=0 ``ProjectionModel`` objects
2020-06-30 13:52:43,322 [denest.utils.validation] INFO: Object `topology`: params: using default value for optional parameters:
{'projections': []}
2020-06-30 13:52:43,326 [denest.network] INFO: Build N=0 ``TopoProjection`` objects
2020-06-30 13:52:43,329 [denest.utils.validation] INFO: Object `recorders`: params: using default value for optional parameters:
{'population_recorders': [], 'projection_recorders': []}
2020-06-30 13:52:43,335 [denest.network] INFO: Build N=0 population recorders.
2020-06-30 13:52:43,337 [denest.network] INFO: Build N=0 projection recorders.
2020-06-30 13:52:43,338 [denest.simulation] INFO: Creating network.
2020-06-30 13:52:43,341 [denest.network] INFO: Creating neuron models...
0it [00:00, ?it/s]
2020-06-30 13:52:43,365 [denest.network] INFO: Creating synapse models...
0it [00:00, ?it/s]
2020-06-30 13:52:43,378 [denest.network] INFO: Creating recorder models...
0it [00:00, ?it/s]
2020-06-30 13:52:43,396 [denest.network] INFO: Creating layers...
0it [00:00, ?it/s]
2020-06-30 13:52:43,404 [denest.network] INFO: Creating population recorders...
0it [00:00, ?it/s]
2020-06-30 13:52:43,419 [denest.network] INFO: Creating projection recorders...
0it [00:00, ?it/s]
2020-06-30 13:52:43,426 [denest.network] INFO: Connecting layers...
0it [00:00, ?it/s]
2020-06-30 13:52:43,442 [denest.network] INFO: Network size (including recorders and parrot neurons):
Number of nodes: 1
Number of projections: 0
2020-06-30 13:52:43,446 [denest.simulation] INFO: Finished creating network
2020-06-30 13:52:43,449 [denest.simulation] INFO: Saving simulation metadata...
2020-06-30 13:52:43,455 [denest.simulation] INFO: Creating output directory: data/outputs/output
2020-06-30 13:52:43,459 [denest.io.save] INFO: Clearing directory: data/outputs/output
2020-06-30 13:52:43,475 [denest.io.save] INFO: Clearing directory: data/outputs/output
2020-06-30 13:52:43,486 [denest.io.save] INFO: Clearing directory: data/outputs/output/data
2020-06-30 13:52:43,494 [denest.io.save] INFO: Clearing directory: data/outputs/output/data
2020-06-30 13:52:43,500 [denest.io.save] INFO: Clearing directory: data/outputs/output/data
2020-06-30 13:52:43,503 [denest.io.save] INFO: Clearing directory: data/outputs/output
2020-06-30 13:52:43,532 [denest.simulation] INFO: Finished saving simulation metadata

Initialize the NEST kernel

Simulation.init_kernel?? for doc

[4]:
kernel_tree = {
    'params':
        {
            'nest_seed': 10,
            'extension_modules': [],
        },
    'nest_params':
        {
            'resolution': 0.5,
            'overwrite_files': True
        },
}
[5]:
sim.init_kernel(kernel_tree)
2020-06-30 13:52:43,715 [denest.simulation] INFO: Initializing NEST kernel and seeds...
2020-06-30 13:52:43,720 [denest.simulation] INFO:   Resetting NEST kernel...
2020-06-30 13:52:43,740 [denest.simulation] INFO:   Setting NEST kernel status...
2020-06-30 13:52:43,743 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({'resolution': 0.5, 'overwrite_files': True})`
2020-06-30 13:52:43,746 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({'data_path': 'data/outputs/output/data', 'grng_seed': 11, 'rng_seeds': range(12, 13)})
2020-06-30 13:52:43,750 [denest.simulation] INFO:   Finished setting NEST kernel status
2020-06-30 13:52:43,756 [denest.simulation] INFO:   Installing external modules...
2020-06-30 13:52:43,784 [denest.simulation] INFO:   Finished installing external modules
2020-06-30 13:52:43,785 [denest.simulation] INFO: Finished initializing kernel
[6]:
# nest_params have been passed to nest.SetKernelStatus
print(nest.GetKernelStatus('resolution'))
print(nest.GetKernelStatus('time'))
0.5
0.0
[7]:
# The raw data will be saved in the output directory
nest.GetKernelStatus('data_path')
[7]:
'data/outputs/output/data'
[8]:
# The kernel params are saved in the simulation's tree
sim.tree
[8]:
ParamsTree(name='None', parent=None)
  params: {}
  nest_params: {}
  kernel:
    params:
      nest_seed: 10
      extension_modules: []
    nest_params:
      resolution: 0.5
      overwrite_files: true
  simulation:
    params:
      output_dir: data/outputs/output
      sessions: []
    nest_params: {}
  session_models:
    params: {}
    nest_params: {}
  network:
    params: {}
    nest_params: {}

Create a network

We build and create the same network by passing the network tree, using the Simulation.create_network method

[9]:
net_tree = ParamsTree.read(PARAMS_DIR/'network/network_tree.yml')
[10]:
sim.create_network(net_tree)
2020-06-30 13:52:44,151 [denest.simulation] INFO: Building network.
2020-06-30 13:52:44,167 [denest.network] INFO: Build N=2 ``Model`` objects
2020-06-30 13:52:44,169 [denest.network] INFO: Build N=2 ``SynapseModel`` objects
2020-06-30 13:52:44,174 [denest.network] INFO: Build N=3 ``Model`` objects
2020-06-30 13:52:44,180 [denest.network] INFO: Build N=2 ``Layer`` or ``InputLayer`` objects.
2020-06-30 13:52:44,183 [denest.utils.validation] INFO: Object `proj_1_AMPA`: params: using default value for optional parameters:
{'type': 'topological'}
2020-06-30 13:52:44,192 [denest.utils.validation] INFO: Object `proj_2_GABAA`: params: using default value for optional parameters:
{'type': 'topological'}
2020-06-30 13:52:44,198 [denest.network] INFO: Build N=2 ``ProjectionModel`` objects
2020-06-30 13:52:44,214 [denest.network] INFO: Build N=3 ``TopoProjection`` objects
2020-06-30 13:52:44,232 [denest.network] INFO: Build N=2 population recorders.
2020-06-30 13:52:44,239 [denest.network] INFO: Build N=1 projection recorders.
2020-06-30 13:52:44,254 [denest.simulation] INFO: Creating network.
2020-06-30 13:52:44,272 [denest.network] INFO: Creating neuron models...
100%|██████████| 2/2 [00:00<00:00, 299.85it/s]
2020-06-30 13:52:44,291 [denest.network] INFO: Creating synapse models...
100%|██████████| 2/2 [00:00<00:00, 702.21it/s]
2020-06-30 13:52:44,310 [denest.network] INFO: Creating recorder models...
100%|██████████| 3/3 [00:00<00:00, 811.28it/s]
2020-06-30 13:52:44,322 [denest.network] INFO: Creating layers...
  0%|          | 0/2 [00:00<?, ?it/s]/Users/tom/nest/nest-simulator-2.20.0/lib/python3.7/site-packages/nest/lib/hl_api_helper.py:127: UserWarning:
GetNodes is deprecated and will be removed in NEST 3.0. Use             GIDCollection instead.
100%|██████████| 2/2 [00:00<00:00,  8.14it/s]
2020-06-30 13:52:44,577 [denest.network] INFO: Creating population recorders...
100%|██████████| 2/2 [00:00<00:00, 42.15it/s]
2020-06-30 13:52:44,631 [denest.network] INFO: Creating projection recorders...
100%|██████████| 1/1 [00:00<00:00, 74.23it/s]
2020-06-30 13:52:44,679 [denest.network] INFO: Connecting layers...
100%|██████████| 3/3 [00:00<00:00, 145.55it/s]
2020-06-30 13:52:44,736 [denest.network] INFO: Network size (including recorders and parrot neurons):
Number of nodes: 206
Number of projections: 6650
2020-06-30 13:52:44,739 [denest.simulation] INFO: Finished creating network
[11]:
# Network object was created and can be accessed as we learnt
sim.network.layers['l1'].gid
[11]:
(52,)
[12]:
# network tree was saved and can be re-used
sim.tree
[12]:
ParamsTree(name='None', parent=None)
  params: {}
  nest_params: {}
  kernel:
    params:
      nest_seed: 10
      extension_modules: []
    nest_params:
      resolution: 0.5
      overwrite_files: true
  simulation:
    params:
      output_dir: data/outputs/output
      sessions: []
    nest_params: {}
  session_models:

  ... [135 lines] ...

        - layers:
          - input_layer
          populations: null
          model: my_spike_detector
        projection_recorders:
        - source_layers:
          - l1
          source_population: l1_exc
          target_layers:
          - l1
          target_population: l1_inh
          projection_model: proj_1_AMPA
          model: weight_recorder
      nest_params: {}

Create some sessions

Sessions allow us to run the network in specific conditions.

Session parameters:

  • simulation_time (float): Duration of the session in ms. (mandatory)
  • reset_network (bool): If true, nest.ResetNetwork() is called during session initialization (default False)
  • record (bool): If false, the start_time field of recorder nodes in NEST is set to the end time of the session, so that no data is recorded during the session (default True)
  • shift_origin (bool): If True, the origin flag of the stimulation devices of all the network’s InputLayer layers is set to the start of the session during initialization. Useful to repeat sessions when the stimulators are eg spike generators.
  • unit_changes (list): List describing the changes applied to certain units before the start of the session. Passed to Network.set_state.
  • synapse_changes (list): List describing the changes applied to certain synapses before the start of the session. Passed to Network.set_state. Refer to that method for a description of how synapse_changes is formatted and interpreted. No changes happen if empty. (default [])

Build session models from a tree

[13]:
# Notice the hierarchical inheritance as before
session_models_tree = ParamsTree.read(PARAMS_DIR/'session_models.yml').children['session_models']
print(session_models_tree)
params:
  record: true
  shift_origin: true
  simulation_time: 100.0
nest_params: {}
warmup:
  params:
    record: false
  nest_params: {}
2_spikes:
  params:
    unit_changes:
    - layers:
      - input_layer
      population_name: spike_generator
      nest_params:
        spike_times:
        - 1.0
        - 10.0
  nest_params: {}
3_spikes:
  params:
    unit_changes:
    - layers:
      - input_layer
      population_name: spike_generator
      nest_params:
        spike_times:
        - 1.0
        - 10.0
        - 20.0
  nest_params: {}

[14]:
sim.build_session_models(session_models_tree)
2020-06-30 13:52:44,980 [denest.simulation] INFO: Build N=3 session models
[15]:
sim.tree.children['session_models']
[15]:
ParamsTree(name='session_models', parent='None')
  params:
    record: true
    shift_origin: true
    simulation_time: 100.0
  nest_params: {}
  warmup:
    params:
      record: false
    nest_params: {}
  2_spikes:
    params:
      unit_changes:
      - layers:
        - input_layer
        population_name: spike_generator

  ... [3 lines] ...

          - 10.0
    nest_params: {}
  3_spikes:
    params:
      unit_changes:
      - layers:
        - input_layer
        population_name: spike_generator
        nest_params:
          spike_times:
          - 1.0
          - 10.0
          - 20.0
    nest_params: {}

Build a list of sessions from the session_models templates

[16]:
sessions_order =  ['warmup', '3_spikes', '2_spikes', '3_spikes']

[17]:
sim.build_sessions(sessions_order)
2020-06-30 13:52:45,205 [denest.simulation] INFO: Build N=4 sessions
2020-06-30 13:52:45,206 [denest.session] INFO: Creating session "00_warmup"
2020-06-30 13:52:45,208 [denest.utils.validation] INFO: Object `00_warmup`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': [], 'unit_changes': []}
2020-06-30 13:52:45,212 [denest.session] INFO: Creating session "01_3_spikes"
2020-06-30 13:52:45,219 [denest.utils.validation] INFO: Object `01_3_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:45,221 [denest.session] INFO: Creating session "02_2_spikes"
2020-06-30 13:52:45,223 [denest.utils.validation] INFO: Object `02_2_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:45,225 [denest.session] INFO: Creating session "03_3_spikes"
2020-06-30 13:52:45,234 [denest.utils.validation] INFO: Object `03_3_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:45,239 [denest.simulation] INFO: Sessions: ['00_warmup', '01_3_spikes', '02_2_spikes', '03_3_spikes']
[18]:
# Notice the session names
sim.sessions
[18]:
[Session(00_warmup, {'record': False,
  'reset_network': False,
  'shift_origin': True,
  'simulation_time': 100.0,
  'synapse_changes': [],
  'unit_changes': []}),
 Session(01_3_spikes, {'record': True,
  'reset_network': False,
  'shift_origin': True,
  'simulation_time': 100.0,
  'synapse_changes': [],
  'unit_changes': [{'layers': ['input_layer'],
                    'nest_params': {'spike_times': [1.0, 10.0, 20.0]},
                    'population_name': 'spike_generator'}]}),
 Session(02_2_spikes, {'record': True,
  'reset_network': False,
  'shift_origin': True,
  'simulation_time': 100.0,
  'synapse_changes': [],
  'unit_changes': [{'layers': ['input_layer'],
                    'nest_params': {'spike_times': [1.0, 10.0]},
                    'population_name': 'spike_generator'}]}),
 Session(03_3_spikes, {'record': True,
  'reset_network': False,
  'shift_origin': True,
  'simulation_time': 100.0,
  'synapse_changes': [],
  'unit_changes': [{'layers': ['input_layer'],
                    'nest_params': {'spike_times': [1.0, 10.0, 20.0]},
                    'population_name': 'spike_generator'}]})]
[19]:
# The session order is saved in the simulation parameters

sim.tree.children['simulation']
[19]:
ParamsTree(name='simulation', parent='None')
  params:
    output_dir: data/outputs/output
    sessions:
    - warmup
    - 3_spikes
    - 2_spikes
    - 3_spikes
  nest_params: {}

Run the simulation

[20]:
print('kernel time: ', nest.GetKernelStatus('time'))
kernel time:  0.0
[21]:
sim.run()
2020-06-30 13:52:45,497 [denest.simulation] INFO: Running 4 sessions...
2020-06-30 13:52:45,497 [denest.simulation] INFO: Running session: '00_warmup'...
2020-06-30 13:52:45,499 [denest.session] INFO: Initializing session...
2020-06-30 13:52:45,501 [denest.network.recorders] INFO:   Setting status for recorder my_multimeter_l1_l1_exc: {'start': 100.0}
2020-06-30 13:52:45,504 [denest.network.recorders] INFO:   Setting status for recorder my_spike_detector_input_layer_parrot_neuron: {'start': 100.0}
2020-06-30 13:52:45,505 [denest.network.recorders] INFO:   Setting status for recorder weight_recorder_proj_1_AMPA-l1-l1_exc-l1-l1_inh: {'start': 100.0}
2020-06-30 13:52:45,507 [denest.session] INFO: Setting `origin` flag to `0.0` for all stimulation devices in ``InputLayers`` for session `00_warmup`
2020-06-30 13:52:45,523 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:45,524 [denest.session] INFO: Running session '00_warmup' for 100 ms
2020-06-30 13:52:45,749 [denest.session] INFO: Finished running session
2020-06-30 13:52:45,750 [denest.session] INFO: Session '00_warmup' virtual running time: 100 ms
2020-06-30 13:52:45,751 [denest.session] INFO: Session '00_warmup' real running time: 0h:00m:00s
2020-06-30 13:52:45,806 [denest.simulation] INFO: Done running session '00_warmup'
2020-06-30 13:52:45,807 [denest.simulation] INFO: Running session: '01_3_spikes'...
2020-06-30 13:52:45,823 [denest.session] INFO: Initializing session...
2020-06-30 13:52:45,824 [denest.session] INFO: Setting `origin` flag to `100.0` for all stimulation devices in ``InputLayers`` for session `01_3_spikes`
2020-06-30 13:52:45,879 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:45,887 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:46,004 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:46,005 [denest.session] INFO: Running session '01_3_spikes' for 100 ms
2020-06-30 13:52:46,213 [denest.session] INFO: Finished running session
2020-06-30 13:52:46,215 [denest.session] INFO: Session '01_3_spikes' virtual running time: 100 ms
2020-06-30 13:52:46,216 [denest.session] INFO: Session '01_3_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:46,218 [denest.simulation] INFO: Done running session '01_3_spikes'
2020-06-30 13:52:46,219 [denest.simulation] INFO: Running session: '02_2_spikes'...
2020-06-30 13:52:46,221 [denest.session] INFO: Initializing session...
2020-06-30 13:52:46,222 [denest.session] INFO: Setting `origin` flag to `200.0` for all stimulation devices in ``InputLayers`` for session `02_2_spikes`
2020-06-30 13:52:46,226 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:46,246 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:46,371 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:46,371 [denest.session] INFO: Running session '02_2_spikes' for 100 ms
2020-06-30 13:52:46,653 [denest.session] INFO: Finished running session
2020-06-30 13:52:46,654 [denest.session] INFO: Session '02_2_spikes' virtual running time: 100 ms
2020-06-30 13:52:46,658 [denest.session] INFO: Session '02_2_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:46,660 [denest.simulation] INFO: Done running session '02_2_spikes'
2020-06-30 13:52:46,671 [denest.simulation] INFO: Running session: '03_3_spikes'...
2020-06-30 13:52:46,673 [denest.session] INFO: Initializing session...
2020-06-30 13:52:46,688 [denest.session] INFO: Setting `origin` flag to `300.0` for all stimulation devices in ``InputLayers`` for session `03_3_spikes`
2020-06-30 13:52:46,741 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:46,745 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:46,876 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:46,877 [denest.session] INFO: Running session '03_3_spikes' for 100 ms
2020-06-30 13:52:47,122 [denest.session] INFO: Finished running session
2020-06-30 13:52:47,193 [denest.session] INFO: Session '03_3_spikes' virtual running time: 100 ms
2020-06-30 13:52:47,227 [denest.session] INFO: Session '03_3_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:47,244 [denest.simulation] INFO: Done running session '03_3_spikes'
2020-06-30 13:52:47,253 [denest.simulation] INFO: Finished running simulation
[22]:
nest.GetKernelStatus('time')
[22]:
400.0

Since the initialized Simulation object was empty, we need to save the metadata

[23]:
sim.save_metadata()
2020-06-30 13:52:47,378 [denest.simulation] INFO: Saving simulation metadata...
2020-06-30 13:52:47,379 [denest.simulation] INFO: Creating output directory: data/outputs/output
2020-06-30 13:52:47,545 [denest.simulation] INFO: Finished saving simulation metadata
[24]:
!ls {OUTPUT_DIR}
data               parameter_tree.yml session_times.yml  versions.txt
[25]:
!cat {OUTPUT_DIR/'session_times.yml'}
00_warmup: !!python/tuple
- 0.0
- 100.0
01_3_spikes: !!python/tuple
- 100.0
- 200.0
02_2_spikes: !!python/tuple
- 200.0
- 300.0
03_3_spikes: !!python/tuple
- 300.0
- 400.0
[26]:
!ls {OUTPUT_DIR/'data'}
my_multimeter_l1_l1_exc-203-0.dat
my_multimeter_l1_l1_exc.yml
my_spike_detector_input_layer_parrot_neuron-204-0.gdf
my_spike_detector_input_layer_parrot_neuron.yml
weight_recorder_proj_1_AMPA-l1-l1_exc-l1-l1_inh-205-0.csv
weight_recorder_proj_1_AMPA-l1-l1_exc-l1-l1_inh.yml

Replicate the simulation

[27]:
params = ParamsTree.read(OUTPUT_DIR/'parameter_tree.yml')
params
[27]:
ParamsTree(name='None', parent=None)
  params: {}
  nest_params: {}
  kernel:
    params:
      nest_seed: 10
      extension_modules: []
    nest_params:
      resolution: 0.5
      overwrite_files: true
  simulation:
    params:
      output_dir: data/outputs/output
      sessions:
      - warmup
      - 3_spikes

  ... [169 lines] ...

        - layers:
          - input_layer
          populations: null
          model: my_spike_detector
        projection_recorders:
        - source_layers:
          - l1
          source_population: l1_exc
          target_layers:
          - l1
          target_population: l1_inh
          projection_model: proj_1_AMPA
          model: weight_recorder
      nest_params: {}

[28]:
sim = denest.Simulation(params, output_dir=DATA_DIR/'output_replicate')
sim.run()
2020-06-30 13:52:48,433 [denest.utils.validation] INFO: Object `simulation`: params: using default value for optional parameters:
{'input_dir': 'input'}
2020-06-30 13:52:48,435 [denest.simulation] INFO: Initializing NEST kernel and seeds...
2020-06-30 13:52:48,437 [denest.simulation] INFO:   Resetting NEST kernel...
2020-06-30 13:52:48,544 [denest.simulation] INFO:   Setting NEST kernel status...
2020-06-30 13:52:48,546 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({'resolution': 0.5, 'overwrite_files': True})`
2020-06-30 13:52:48,565 [denest.simulation] INFO:     Calling `nest.SetKernelStatus({'data_path': 'data/outputs/output_replicate/data', 'grng_seed': 11, 'rng_seeds': range(12, 13)})
2020-06-30 13:52:48,619 [denest.simulation] INFO:   Finished setting NEST kernel status
2020-06-30 13:52:48,630 [denest.simulation] INFO:   Installing external modules...
2020-06-30 13:52:48,647 [denest.simulation] INFO:   Finished installing external modules
2020-06-30 13:52:48,648 [denest.simulation] INFO: Finished initializing kernel
2020-06-30 13:52:48,651 [denest.simulation] INFO: Build N=3 session models
2020-06-30 13:52:48,653 [denest.simulation] INFO: Build N=4 sessions
2020-06-30 13:52:48,655 [denest.session] INFO: Creating session "00_warmup"
2020-06-30 13:52:48,656 [denest.utils.validation] INFO: Object `00_warmup`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': [], 'unit_changes': []}
2020-06-30 13:52:48,658 [denest.session] INFO: Creating session "01_3_spikes"
2020-06-30 13:52:48,660 [denest.utils.validation] INFO: Object `01_3_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:48,662 [denest.session] INFO: Creating session "02_2_spikes"
2020-06-30 13:52:48,665 [denest.utils.validation] INFO: Object `02_2_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:48,668 [denest.session] INFO: Creating session "03_3_spikes"
2020-06-30 13:52:48,671 [denest.utils.validation] INFO: Object `03_3_spikes`: params: using default value for optional parameters:
{'reset_network': False, 'synapse_changes': []}
2020-06-30 13:52:48,675 [denest.simulation] INFO: Sessions: ['00_warmup', '01_3_spikes', '02_2_spikes', '03_3_spikes']
2020-06-30 13:52:48,680 [denest.simulation] INFO: Building network.
2020-06-30 13:52:48,711 [denest.network] INFO: Build N=2 ``Model`` objects
2020-06-30 13:52:48,715 [denest.network] INFO: Build N=2 ``SynapseModel`` objects
2020-06-30 13:52:48,720 [denest.network] INFO: Build N=3 ``Model`` objects
2020-06-30 13:52:48,724 [denest.network] INFO: Build N=2 ``Layer`` or ``InputLayer`` objects.
2020-06-30 13:52:48,728 [denest.utils.validation] INFO: Object `proj_1_AMPA`: params: using default value for optional parameters:
{'type': 'topological'}
2020-06-30 13:52:48,730 [denest.utils.validation] INFO: Object `proj_2_GABAA`: params: using default value for optional parameters:
{'type': 'topological'}
2020-06-30 13:52:48,735 [denest.network] INFO: Build N=2 ``ProjectionModel`` objects
2020-06-30 13:52:48,742 [denest.network] INFO: Build N=3 ``TopoProjection`` objects
2020-06-30 13:52:48,751 [denest.network] INFO: Build N=2 population recorders.
2020-06-30 13:52:48,757 [denest.network] INFO: Build N=1 projection recorders.
2020-06-30 13:52:48,759 [denest.simulation] INFO: Creating network.
2020-06-30 13:52:48,763 [denest.network] INFO: Creating neuron models...
100%|██████████| 2/2 [00:00<00:00, 197.59it/s]
2020-06-30 13:52:48,784 [denest.network] INFO: Creating synapse models...
100%|██████████| 2/2 [00:00<00:00, 409.50it/s]
2020-06-30 13:52:48,802 [denest.network] INFO: Creating recorder models...
100%|██████████| 3/3 [00:00<00:00, 1972.24it/s]
2020-06-30 13:52:48,823 [denest.network] INFO: Creating layers...
100%|██████████| 2/2 [00:00<00:00,  9.01it/s]
2020-06-30 13:52:49,080 [denest.network] INFO: Creating population recorders...
100%|██████████| 2/2 [00:00<00:00, 63.84it/s]
2020-06-30 13:52:49,120 [denest.network] INFO: Creating projection recorders...
100%|██████████| 1/1 [00:00<00:00, 349.44it/s]
2020-06-30 13:52:49,130 [denest.network] INFO: Connecting layers...
100%|██████████| 3/3 [00:00<00:00, 130.74it/s]
2020-06-30 13:52:49,160 [denest.network] INFO: Network size (including recorders and parrot neurons):
Number of nodes: 206
Number of projections: 6650
2020-06-30 13:52:49,164 [denest.simulation] INFO: Finished creating network
2020-06-30 13:52:49,166 [denest.simulation] INFO: Saving simulation metadata...
2020-06-30 13:52:49,167 [denest.simulation] INFO: Creating output directory: data/outputs/output_replicate
2020-06-30 13:52:49,169 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate
2020-06-30 13:52:49,179 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate
2020-06-30 13:52:49,186 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate/data
2020-06-30 13:52:49,189 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate/data
2020-06-30 13:52:49,191 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate/data
2020-06-30 13:52:49,209 [denest.io.save] INFO: Clearing directory: data/outputs/output_replicate
2020-06-30 13:52:49,346 [denest.simulation] INFO: Finished saving simulation metadata
2020-06-30 13:52:49,347 [denest.simulation] INFO: Running 4 sessions...
2020-06-30 13:52:49,350 [denest.simulation] INFO: Running session: '00_warmup'...
2020-06-30 13:52:49,352 [denest.session] INFO: Initializing session...
2020-06-30 13:52:49,359 [denest.network.recorders] INFO:   Setting status for recorder my_multimeter_l1_l1_exc: {'start': 100.0}
2020-06-30 13:52:49,375 [denest.network.recorders] INFO:   Setting status for recorder my_spike_detector_input_layer_parrot_neuron: {'start': 100.0}
2020-06-30 13:52:49,379 [denest.network.recorders] INFO:   Setting status for recorder weight_recorder_proj_1_AMPA-l1-l1_exc-l1-l1_inh: {'start': 100.0}
2020-06-30 13:52:49,381 [denest.session] INFO: Setting `origin` flag to `0.0` for all stimulation devices in ``InputLayers`` for session `00_warmup`
2020-06-30 13:52:49,391 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:49,394 [denest.session] INFO: Running session '00_warmup' for 100 ms
2020-06-30 13:52:49,737 [denest.session] INFO: Finished running session
2020-06-30 13:52:49,738 [denest.session] INFO: Session '00_warmup' virtual running time: 100 ms
2020-06-30 13:52:49,739 [denest.session] INFO: Session '00_warmup' real running time: 0h:00m:00s
2020-06-30 13:52:49,757 [denest.simulation] INFO: Done running session '00_warmup'
2020-06-30 13:52:49,763 [denest.simulation] INFO: Running session: '01_3_spikes'...
2020-06-30 13:52:49,784 [denest.session] INFO: Initializing session...
2020-06-30 13:52:49,795 [denest.session] INFO: Setting `origin` flag to `100.0` for all stimulation devices in ``InputLayers`` for session `01_3_spikes`
2020-06-30 13:52:49,824 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:49,831 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:49,938 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:49,939 [denest.session] INFO: Running session '01_3_spikes' for 100 ms
2020-06-30 13:52:50,128 [denest.session] INFO: Finished running session
2020-06-30 13:52:50,129 [denest.session] INFO: Session '01_3_spikes' virtual running time: 100 ms
2020-06-30 13:52:50,130 [denest.session] INFO: Session '01_3_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:50,131 [denest.simulation] INFO: Done running session '01_3_spikes'
2020-06-30 13:52:50,159 [denest.simulation] INFO: Running session: '02_2_spikes'...
2020-06-30 13:52:50,179 [denest.session] INFO: Initializing session...
2020-06-30 13:52:50,202 [denest.session] INFO: Setting `origin` flag to `200.0` for all stimulation devices in ``InputLayers`` for session `02_2_spikes`
2020-06-30 13:52:50,230 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:50,231 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:50,321 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:50,321 [denest.session] INFO: Running session '02_2_spikes' for 100 ms
2020-06-30 13:52:50,620 [denest.session] INFO: Finished running session
2020-06-30 13:52:50,622 [denest.session] INFO: Session '02_2_spikes' virtual running time: 100 ms
2020-06-30 13:52:50,622 [denest.session] INFO: Session '02_2_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:50,623 [denest.simulation] INFO: Done running session '02_2_spikes'
2020-06-30 13:52:50,627 [denest.simulation] INFO: Running session: '03_3_spikes'...
2020-06-30 13:52:50,629 [denest.session] INFO: Initializing session...
2020-06-30 13:52:50,644 [denest.session] INFO: Setting `origin` flag to `300.0` for all stimulation devices in ``InputLayers`` for session `03_3_spikes`
2020-06-30 13:52:50,673 [denest.utils.validation] INFO: Object `Unit changes dictionary`: params: using default value for optional parameters:
{'change_type': 'constant', 'from_array': False}
2020-06-30 13:52:50,674 [denest.network.layers] INFO: Layer='input_layer', pop='spike_generator': Applying 'constant' change, param='spike_times', from single value')
2020-06-30 13:52:50,770 [denest.session] INFO: Finished initializing session

2020-06-30 13:52:50,771 [denest.session] INFO: Running session '03_3_spikes' for 100 ms
2020-06-30 13:52:50,940 [denest.session] INFO: Finished running session
2020-06-30 13:52:50,941 [denest.session] INFO: Session '03_3_spikes' virtual running time: 100 ms
2020-06-30 13:52:50,943 [denest.session] INFO: Session '03_3_spikes' real running time: 0h:00m:00s
2020-06-30 13:52:50,946 [denest.simulation] INFO: Done running session '03_3_spikes'
2020-06-30 13:52:50,989 [denest.simulation] INFO: Finished running simulation
[29]:
!ls {str(DATA_DIR/'output_replicate')}
data               parameter_tree.yml session_times.yml  versions.txt