{"title":"Hengye_Blog","link":[{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/","rel":"alternate"}},{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/feeds\/all.atom.xml","rel":"self"}}],"id":"https:\/\/hengyezhu.github.io\/","updated":"2026-06-09T00:00:00+08:00","entry":[{"title":"MIND Simulator Demo","link":{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/mind-simulator-demo.html","rel":"alternate"}},"published":"2026-06-09T00:00:00+08:00","updated":"2026-06-09T00:00:00+08:00","author":{"name":"Hengye Zhu"},"id":"tag:hengyezhu.github.io,2026-06-09:\/mind-simulator-demo.html","summary":"<p>This post presents a <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\"><strong>MIND_Sim<\/strong><\/a> demo. The demo couples a detailed hippocampal CA3 microcircuit to a whole-brain neural mass model and illustrates the basic workflow of MIND_Sim.<\/p>\n<p>The demo uses a synthetic connectivity matrix. Users who want to reproduce the subject-specific workflow can download the HCP <code>100206<\/code> data and run \u2026<\/p>","content":"<p>This post presents a <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\"><strong>MIND_Sim<\/strong><\/a> demo. The demo couples a detailed hippocampal CA3 microcircuit to a whole-brain neural mass model and illustrates the basic workflow of MIND_Sim.<\/p>\n<p>The demo uses a synthetic connectivity matrix. Users who want to reproduce the subject-specific workflow can download the HCP <code>100206<\/code> data and run the preprocessing script provided by MIND_Sim <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\/blob\/main\/examples\/ca3_epilepsy_cosim\/mind_sim\/prepare_hcp100206_ca3.py\">here<\/a>.<\/p>\n<p>The complete workflow is implemented <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\/blob\/main\/examples\/ca3_epilepsy_cosim\/mind_sim\/run_vep_ca3_cosim.py\">here<\/a>.<\/p>\n<h2>Data Overview<\/h2>\n<p>The micro model is based on the CA3 epilepsy network from <a href=\"https:\/\/modeldb.science\/showmodel?model=186768\">ModelDB 186768<\/a>. The CA3 microcircuit is represented by pyramidal cells, basket cells, and OLM interneurons with simplified morphologies.<\/p>\n<p>The macro model is based on the <a href=\"https:\/\/docs.thevirtualbrain.org\/api\/tvb.simulator.models.html#tvb.simulator.models.epileptor.Epileptor2D\">TVB <code>Epileptor2D<\/code> neural mass model<\/a>. It represents whole-brain regional dynamics on top of the connectivity matrix, while the CA3 region can be replaced by the detailed microcircuit.<\/p>\n<p>The model mechanisms are organized under one directory:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>ca3_epilepsy_cosim\/mind_sim\/mod\/\n<\/code><\/pre><\/div>\n\n<p>The <code>mod\/<\/code> directory contains both the standard NEURON\/CoreNEURON mechanisms for the CA3 microcircuit and the MIND_Sim extended MOD modules for macro dynamics, <code>macro2macro coupling<\/code>, <code>micro2macro transforms<\/code>, and <code>macro2micro transforms<\/code>.<\/p>\n<p>Since the main goal of this demo is to demonstrate the MIND_Sim workflow, the model parameters were not specifically optimized; instead, they largely follow the original model settings.<\/p>\n<h2>Simulation Setup<\/h2>\n<p>Before running the script, install MIND_Sim and compile the MOD mechanisms from the repository root:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>conda<span class=\"w\"> <\/span>activate<span class=\"w\"> <\/span>mind_sim\npip<span class=\"w\"> <\/span>install<span class=\"w\"> <\/span>mind-simulator\n<span class=\"nb\">cd<\/span><span class=\"w\"> <\/span>MIND_Sim\nmind-nrnivmodl<span class=\"w\"> <\/span>examples\/ca3_epilepsy_cosim\/mind_sim\/mod\n<\/code><\/pre><\/div>\n\n<p>After compilation, the setup step loads the compiled mechanism directory once and sets the basic simulation resolution.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">mind_sim<\/span><span class=\"w\"> <\/span><span class=\"k\">as<\/span><span class=\"w\"> <\/span><span class=\"nn\">ms<\/span>\n\n<span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">load_mech<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">mod_dir<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">macro<\/span><span class=\"o\">.<\/span><span class=\"n\">dt<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.1<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">macro<\/span><span class=\"o\">.<\/span><span class=\"n\">exchange_window<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">micro<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">sim<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">set_device<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">device<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">set_num_threads<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">micro_threads<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">set_dt<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.025<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>Here, <code>ms.load_mech(...)<\/code> loads both the micro mechanisms and the MIND_Sim extended MOD mechanisms from the compiled <code>mod\/<\/code> directory. <code>micro.set_device(...)<\/code> selects CPU or GPU execution for the micro simulator, and <code>micro.set_num_threads(...)<\/code> configures CPU threads. The macro part of MIND_Sim is single-threaded and forms a pipeline with the micro simulation, while the micro part is backed by CoreNEURON and supports CPU multithreading and GPU execution.<\/p>\n<h2>Load ROIs<\/h2>\n<p>The first step in MIND_Sim is to create ROIs from a connectivity matrix like <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\/blob\/main\/examples\/ca3_epilepsy_cosim\/data\/synthetic_hybrid_ca3_connectivity.csv\">this<\/a>.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">mind_sim<\/span><span class=\"w\"> <\/span><span class=\"k\">as<\/span><span class=\"w\"> <\/span><span class=\"nn\">ms<\/span>\n\n<span class=\"n\">rois<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">macro<\/span><span class=\"o\">.<\/span><span class=\"n\">load_rois<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">connectivity_csv<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">roi_list<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">rois<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">roi_labels<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">labels<\/span>\n<span class=\"n\">roi_weights<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">weights<\/span>\n<span class=\"n\">roi_delays<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">delays<\/span>\n<span class=\"n\">left_ca3_roi<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">roi<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Left-CA3&quot;<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>Here, <code>load_rois<\/code> reads the connectivity matrix and creates one ROI object for each region label. The returned ROI collection is iterable, stores the region labels, connection weights, and delays, and individual ROIs can be accessed by name.<\/p>\n<h2>Micro Modeling<\/h2>\n<p>MIND_Sim is inspired by <a href=\"https:\/\/neuroml.org\/\">NeuroML<\/a>: neurons with the same morphology are treated as instances of one template. This is one source of frontend construction speedup, and it is also a modeling semantic that users should follow when defining populations.<\/p>\n<p>To use a morphology template, users can load an SWC file and modify the generated sections, or build sections from scratch as shown below. The API is <code>ms.section(name, label)<\/code>, where <code>label<\/code> is the section group name. Users then call <code>micro.build_morphology(...)<\/code> explicitly and pass the sections used by each population. This differs from standard NEURON scripting: MIND_Sim does not instantiate every cell immediately when Python statements are executed. Instead, the Python frontend records model-building operations, and the corresponding C++ structures are constructed in batch. Later, <code>micro.build_microcircuit()<\/code> builds the biophysical properties and network connectivity after mechanisms, synapses, and connections have been specified.<\/p>\n<p>MIND_Sim allows mechanisms to be inserted at several granularities, including the whole cell, a section group, a single section, or a specific section location.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">pyr_soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">pyr_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">20.0<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">20.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">20.0<\/span><span class=\"p\">)]<\/span>\n<span class=\"n\">pyr_bdend<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_bdend<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">pyr_bdend<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mf\">200.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)]<\/span>\n<span class=\"n\">pyr_adend1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend1<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">pyr_adend1<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">20.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">170.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)]<\/span>\n<span class=\"n\">pyr_adend2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend2<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">pyr_adend2<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">170.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">320.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)]<\/span>\n<span class=\"n\">pyr_adend3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend3<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">pyr_adend3<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">320.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">470.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)]<\/span>\n<span class=\"n\">pyr_bdend<\/span><span class=\"o\">.<\/span><span class=\"n\">connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_soma<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend1<\/span><span class=\"o\">.<\/span><span class=\"n\">connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_soma<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend2<\/span><span class=\"o\">.<\/span><span class=\"n\">connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_adend1<\/span><span class=\"p\">,<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_adend3<\/span><span class=\"o\">.<\/span><span class=\"n\">connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_adend2<\/span><span class=\"p\">,<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_sections<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">pyr_soma<\/span><span class=\"p\">,<\/span> <span class=\"n\">pyr_bdend<\/span><span class=\"p\">,<\/span> <span class=\"n\">pyr_adend1<\/span><span class=\"p\">,<\/span> <span class=\"n\">pyr_adend2<\/span><span class=\"p\">,<\/span> <span class=\"n\">pyr_adend3<\/span><span class=\"p\">]<\/span>\n\n<span class=\"n\">interneuron_area_um2<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">10000.0<\/span>\n<span class=\"n\">interneuron_diam<\/span> <span class=\"o\">=<\/span> <span class=\"n\">math<\/span><span class=\"o\">.<\/span><span class=\"n\">sqrt<\/span><span class=\"p\">(<\/span><span class=\"n\">interneuron_area_um2<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">interneuron_length<\/span> <span class=\"o\">=<\/span> <span class=\"n\">interneuron_diam<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">math<\/span><span class=\"o\">.<\/span><span class=\"n\">pi<\/span>\n<span class=\"n\">bas_soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">bas_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">bas_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_diam<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_length<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_diam<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">]<\/span>\n<span class=\"n\">olm_soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">section<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">olm_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">nseg<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">olm_soma<\/span><span class=\"o\">.<\/span><span class=\"n\">pt3d<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_diam<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_length<\/span><span class=\"p\">,<\/span> <span class=\"n\">interneuron_diam<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">]<\/span>\n<span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">build_morphology<\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">[<\/span>\n        <span class=\"p\">{<\/span><span class=\"s2\">&quot;name&quot;<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&quot;PYR&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;num_cells&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">PYR_COUNT<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;sections&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">pyr_sections<\/span><span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span><span class=\"s2\">&quot;name&quot;<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&quot;BAS&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;num_cells&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">BAS_COUNT<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;sections&quot;<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">bas_soma<\/span><span class=\"p\">]},<\/span>\n        <span class=\"p\">{<\/span><span class=\"s2\">&quot;name&quot;<\/span><span class=\"p\">:<\/span> <span class=\"s2\">&quot;OLM&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;num_cells&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">OLM_COUNT<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;sections&quot;<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">olm_soma<\/span><span class=\"p\">]},<\/span>\n    <span class=\"p\">]<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"n\">pyr_population<\/span> <span class=\"o\">=<\/span> <span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">population<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;PYR&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">bas_population<\/span> <span class=\"o\">=<\/span> <span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">population<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;BAS&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">olm_population<\/span> <span class=\"o\">=<\/span> <span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">population<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;OLM&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">network<\/span> <span class=\"o\">=<\/span> <span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">network<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_population<\/span><span class=\"o\">.<\/span><span class=\"n\">gid_begin<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">bas_gid_begin<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_population<\/span><span class=\"o\">.<\/span><span class=\"n\">gid_begin<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">olm_gid_begin<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">olm_population<\/span><span class=\"o\">.<\/span><span class=\"n\">gid_begin<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">pyr_indices<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">PYR_COUNT<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">bas_indices<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">BAS_COUNT<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">olm_indices<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"n\">OLM_COUNT<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">v_init<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">65.0<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">label<\/span> <span class=\"ow\">in<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">group<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"n\">label<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">group<\/span><span class=\"o\">.<\/span><span class=\"n\">Ra<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">150.0<\/span>\n        <span class=\"n\">group<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span>\n        <span class=\"n\">group<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kdrcurrent&quot;<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">70.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0000357<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;nacurrent&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kacurrent&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;hcurrent&quot;<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">70.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0000357<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;nacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ki<\/span><span class=\"o\">=<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kacurrent&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;hcurrent&quot;<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">70.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0000357<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;nacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ki<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.072<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend1&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;hcurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v50<\/span><span class=\"o\">=-<\/span><span class=\"mf\">82.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0002<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">70.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0000357<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;nacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ki<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">gd<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.120<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;hcurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v50<\/span><span class=\"o\">=-<\/span><span class=\"mf\">90.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0004<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">2.0<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">70.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0000714<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;nacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">ki<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;kacurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">gd<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.200<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;hcurrent&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v50<\/span><span class=\"o\">=-<\/span><span class=\"mf\">90.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0007<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;IClamp&quot;<\/span><span class=\"p\">,<\/span> <span class=\"o\">**<\/span><span class=\"p\">{<\/span><span class=\"s2\">&quot;del&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.2<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;dur&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0e9<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;amp&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.1<\/span><span class=\"p\">})<\/span>\n    <span class=\"n\">soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">sid<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">register_spike_source<\/span><span class=\"p\">(<\/span><span class=\"n\">sid<\/span><span class=\"p\">,<\/span> <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">,<\/span> <span class=\"n\">SPIKE_THRESHOLD_MV<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">bas_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">v_init<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">65.0<\/span>\n    <span class=\"n\">soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">Ra<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">35.4<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">65.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.1e-3<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Nafbwb&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Kdrbwb&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">sid<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">register_spike_source<\/span><span class=\"p\">(<\/span><span class=\"n\">sid<\/span><span class=\"p\">,<\/span> <span class=\"n\">soma<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">,<\/span> <span class=\"n\">SPIKE_THRESHOLD_MV<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">olm_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">v_init<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">65.0<\/span>\n    <span class=\"n\">soma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">Ra<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">35.4<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">cm<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;pas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">65.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">g<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.1e-3<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Nafbwb&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Kdrbwb&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Iholmw&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Caolmw&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;ICaolmw&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;KCaolmw&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">soma<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;IClamp&quot;<\/span><span class=\"p\">,<\/span> <span class=\"o\">**<\/span><span class=\"p\">{<\/span><span class=\"s2\">&quot;del&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.2<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;dur&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0e9<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;amp&quot;<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mf\">25e-3<\/span><span class=\"p\">})<\/span>\n    <span class=\"n\">sid<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">register_spike_source<\/span><span class=\"p\">(<\/span><span class=\"n\">sid<\/span><span class=\"p\">,<\/span> <span class=\"n\">soma<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">,<\/span> <span class=\"n\">SPIKE_THRESHOLD_MV<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>Voltage locations that can emit spikes are registered as spike sources while each population is configured. Although this example uses <code>sid = int(cell.gid)<\/code> in <code>register_spike_source(sid, ref, threshold)<\/code>, the two are different concepts: <code>cell.gid<\/code> identifies a cell, while <code>sid<\/code> identifies a registered spike source. This example uses the same value only because each cell contributes one spike source.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"c1\"># Micro recurrent connections<\/span>\n<span class=\"n\">conn_rng<\/span> <span class=\"o\">=<\/span> <span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">Random<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">ca3_connectivity_seed<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">bas_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;MyExp2SynNMDABB&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">15.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">150.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">r<\/span><span class=\"o\">=<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">100<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">1.15<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">1.2e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">olm_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;MyExp2SynNMDABB&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">15.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">150.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">r<\/span><span class=\"o\">=<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.7e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">pyr_local_post<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"n\">pyr_gid_begin<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;MyExp2SynNMDABB&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau1NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">15.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">tau2NMDA<\/span><span class=\"o\">=<\/span><span class=\"mf\">150.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">r<\/span><span class=\"o\">=<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local_pre<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">25<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">pyr_local_pre<\/span> <span class=\"o\">==<\/span> <span class=\"n\">pyr_local_post<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">continue<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local_pre<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.004e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">bas_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">100<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.3<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">1.2e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">olm_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.3<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">1.2e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">pyr_local_post<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"n\">pyr_gid_begin<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Bdend&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">pyr_local_pre<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">25<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">pyr_local_pre<\/span> <span class=\"o\">==<\/span> <span class=\"n\">pyr_local_post<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">continue<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_local_pre<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.5<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">0.04e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">bas_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">bas_local_post<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"n\">bas_gid_begin<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.07<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">9.1<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">80.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">bas_local_pre<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">60<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">bas_local_pre<\/span> <span class=\"o\">==<\/span> <span class=\"n\">bas_local_post<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">continue<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_local_pre<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">3.0<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">1.5e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.07<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">9.1<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">80.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">bas_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">50<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">0.18e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">olm_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.07<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">9.1<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">80.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">bas_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">17<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.05<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">0.18e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend2&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.2<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">20.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=-<\/span><span class=\"mf\">80.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">olm_local<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">conn_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">sample<\/span><span class=\"p\">(<\/span><span class=\"n\">olm_indices<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">network<\/span><span class=\"o\">.<\/span><span class=\"n\">sid_connect<\/span><span class=\"p\">(<\/span><span class=\"n\">olm_gid_begin<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">olm_local<\/span><span class=\"p\">),<\/span> <span class=\"n\">target<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.08<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">3.0<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">6.0e-3<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<h2>Macro Modeling<\/h2>\n<p>MIND_Sim is designed as an extension of the <a href=\"https:\/\/neuron.yale.edu\/neuron\/\">NEURON Simulator<\/a>. Therefore, the <a href=\"https:\/\/nrn.readthedocs.io\/en\/latest\/nmodl\/language\/nmodl.html\">MOD\/NMODL<\/a> language is used not only for ion channels and synapses, but also for macro-scale neural population dynamics, <code>macro2macro coupling<\/code>, <code>macro2micro transforms<\/code>, and <code>micro2macro transforms<\/code>.<\/p>\n<p>The cross-scale transform design follows the event-based view used in recent multiscale co-simulation studies, including <a href=\"https:\/\/doi.org\/10.3389\/fncom.2025.1731161\">Hater, Courson, Lu, Diaz-Pier, and Manos (2026), Arbor-TVB: a novel multi-scale co-simulation framework with a case study on neural-level seizure generation and whole-brain propagation<\/a>, and <a href=\"https:\/\/doi.org\/10.3389\/fninf.2024.1156683\">Kusch, Diaz-Pier, Klijn, Sontheimer, Bernard, Morrison, and Jirsa (2024), Multiscale co-simulation design pattern for neuroscience applications<\/a>. From a NEURON perspective, <code>micro2macro transforms<\/code> are analogous to handling spike events emitted by individual cells, while <code>macro2micro transforms<\/code> are analogous to external NetStim-like event injection into selected micro-scale synapses. <code>macro2macro coupling<\/code> is also expressed as a connection rule: a source ROI exposes a variable, an edge-level rule transforms it through weight and delay, and the result contributes to a named exposure of the target ROI. Unlike synaptic events, this macro2macro path is continuous rather than spike-discrete.<\/p>\n<p>At the macro level, the model remains connectome-based. ROI-to-ROI coupling does not need to know whether an ROI is implemented by a macro equation or by a microcircuit. In this demo, macro mechanisms declare ROI variables with <code>EXPOSURE<\/code>, while edge-level transforms use <code>READ_SOURCE<\/code> and <code>WRITE_TARGET<\/code> to move values between ROIs. This means that one microcircuit can cover multiple ROIs, and different ROIs can still expose different variables for neural mass models, coupling rules, or cross-scale transforms.<\/p>\n<p>This role split also determines where coupling nonlinearities should be written. If a model first sums incoming edge contributions and then applies a nonlinear operation, that nonlinear operation belongs in the <code>ROLE REGION<\/code> mechanism, because the region mechanism receives the accumulated exposure. If a model applies a nonlinear operation to each edge before summation, that operation belongs in the <code>ROLE MACRO2MACRO<\/code> mechanism, because <code>MACRO2MACRO<\/code> is evaluated at the edge level before contributing to the target exposure.<\/p>\n<p>The benefit of this design is that every ROI and every micro-scale neuron remains explicitly addressable. Different ROIs can use different macro equations and coupling rules, while individual neurons can still receive heterogeneous macro2micro inputs or contribute to different micro2macro outputs. Runtime efficiency is preserved by grouping mechanisms and variables by name in structure-of-arrays layouts, so heterogeneous model components can still be executed in batched form.<\/p>\n<p>The transform mechanisms used in this demo are listed below. The ordinary <code>NEURON<\/code> blocks still describe MOD mechanisms, while the additional <code>MIND<\/code> blocks declare how each mechanism participates in the macro and cross-scale graph.<\/p>\n<p><code>tvb_epileptor2d.mod<\/code> defines the ROI-level Epileptor2D macro model.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS tvb_epileptor2d\n    RANGE coupled_x, x, z\n    RANGE x0, a, b, c, d, r, slope, kvf, ks, tt, i_ext, modification\n}\n\nMIND {\n    ROLE REGION\n    EXPOSURE x, z, coupled_x\n}\n\nPARAMETER {\n    x0 = -2.4\n    a = 1.0\n    b = 3.0\n    c = 1.0\n    d = 5.0\n    r = 0.00035\n    slope = 0.0\n    kvf = 0.35\n    ks = 0.0\n    tt = 1.0\n    i_ext = 3.1\n    modification = 0.0\n}\n\nASSIGNED {\n    coupled_x\n}\n\nSTATE {\n    x\n    z\n}\n\nINITIAL {\n    x = 0.0\n    z = 0.0\n}\n\nBREAKPOINT {\n    SOLVE states METHOD euler\n}\n\nDERIVATIVE states {\n    LOCAL fast_term, z_minus, slow_term, h_term\n\n    fast_term = a * x * x + (d - b) * x\n    if (x &gt;= 0.0) {\n        z_minus = z - 4.0\n        fast_term = -slope - 0.6 * z_minus * z_minus + d * x\n    }\n\n    slow_term = 0.0\n    if (z &lt; 0.0) {\n        slow_term = -0.1 * z ^ 7\n    }\n\n    h_term = 4.0 * (x - x0) + slow_term\n    if (modification &gt; 0.5) {\n        h_term = x0 + 3.0 \/ (1.0 + exp(-(x + 0.5) \/ 0.1))\n    }\n\n    x&#39; = tt * (c - z + i_ext + kvf * coupled_x - fast_term * x)\n    z&#39; = tt * r * (h_term - z + ks * coupled_x)\n}\n<\/code><\/pre><\/div>\n\n<p><code>vep_x_macro2macro.mod<\/code> maps a source ROI's <code>x<\/code> exposure into the <code>coupled_x<\/code> exposure of another macro ROI.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS vep_x_macro2macro\n    RANGE x_source, coupled_x, weight, delay, a\n}\n\nMIND {\n    ROLE MACRO2MACRO\n    READ_SOURCE x AS x_source\n    WRITE_TARGET coupled_x\n}\n\nPARAMETER {\n    a = 1.0\n}\n\nASSIGNED {\n    x_source\n    coupled_x\n    weight\n    delay\n}\n\nBREAKPOINT {\n    coupled_x = a * weight * x_source\n}\n<\/code><\/pre><\/div>\n\n<p><code>ca3_input_macro2macro.mod<\/code> maps macro exposures into the <code>ca3_input<\/code> variable used by the CA3 macro2micro transform.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS ca3_input_macro2macro\n    RANGE x_source, ca3_input, weight, delay, a\n}\n\nMIND {\n    ROLE MACRO2MACRO\n    READ_SOURCE x AS x_source\n    WRITE_TARGET ca3_input\n}\n\nPARAMETER {\n    a = 1.0\n}\n\nASSIGNED {\n    x_source\n    ca3_input\n    weight\n    delay\n}\n\nBREAKPOINT {\n    ca3_input = a * weight * x_source\n}\n<\/code><\/pre><\/div>\n\n<p><code>ca3_input_to_spikes.mod<\/code> converts the macro <code>ca3_input<\/code> variable into generated spike events.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    ARTIFICIAL_CELL ca3_input_to_spikes\n    THREADSAFE\n    RANGE ca3_input, rate, start_time, stop_time\n    RANGE base_hz, gain_hz, max_rate_hz, threshold, slope\n    RANDOM rng\n}\n\nMIND {\n    ROLE MACRO2MICRO\n    READ_SOURCE ca3_input\n}\n\nPARAMETER {\n    base_hz = 1.0\n    gain_hz = 45.0\n    max_rate_hz = 120.0\n    threshold = -0.35\n    slope = 4.0\n}\n\nASSIGNED {\n    ca3_input\n    rate\n    start_time\n    stop_time\n    window_ms\n    lambda\n    spike_count\n    count\n    event_time\n}\n\nPROCEDURE update_rate() {\n    rate = base_hz + gain_hz \/ (1.0 + exp(-slope * (ca3_input - threshold)))\n    if (rate &gt; max_rate_hz) {\n        rate = max_rate_hz\n    }\n    if (rate &lt; 0.0) {\n        rate = 0.0\n    }\n}\n\nFUNCTION poisson_count(mean) {\n    LOCAL limit, product\n    poisson_count = 0.0\n    if (mean &gt; 0.0) {\n        limit = exp(-mean)\n        product = 1.0\n        poisson_count = -1.0\n        while (product &gt; limit) {\n            poisson_count = poisson_count + 1.0\n            product = product * random_uniform(rng)\n        }\n    }\n}\n\nNET_RECEIVE(weight) {\n    if (flag == 0.0) {\n        update_rate()\n        if (rate &gt; 0.0) {\n            window_ms = stop_time - t\n            lambda = rate * window_ms \/ 1000.0\n            spike_count = poisson_count(lambda)\n            count = 0.0\n            while (count &lt; spike_count) {\n                event_time = t + window_ms * random_uniform(rng)\n                net_send(event_time - t, 1.0)\n                count = count + 1.0\n            }\n        }\n    }\n    if (flag == 1.0) {\n        net_event(t)\n    }\n}\n<\/code><\/pre><\/div>\n\n<p>The micro2macro path is split into one transform per source population. <code>ca3_pyr_spikes_to_vep.mod<\/code> converts pyramidal cell spikes into a positive contribution to the macro <code>x<\/code> exposure.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS ca3_pyr_spikes_to_vep\n    RANGE x\n    RANGE activity\n    RANGE tau_ms, x_baseline, gain, population_size\n}\n\nMIND {\n    ROLE MICRO2MACRO\n    WRITE_TARGET x\n}\n\nPARAMETER {\n    tau_ms = 50.0\n    x_baseline = -1.8\n    gain = 2.0\n    population_size = 800.0\n}\n\nASSIGNED {\n    x\n}\n\nSTATE {\n    activity\n}\n\nINITIAL {\n    activity = 0.0\n}\n\nBREAKPOINT {\n    SOLVE states METHOD cnexp\n    x = x_baseline + gain * activity\n}\n\nDERIVATIVE states {\n    activity&#39; = -activity \/ tau_ms\n}\n\nNET_RECEIVE(weight) {\n    activity = activity + weight \/ population_size\n}\n<\/code><\/pre><\/div>\n\n<p><code>ca3_bas_spikes_to_vep.mod<\/code> converts basket cell spikes into an inhibitory contribution.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS ca3_bas_spikes_to_vep\n    RANGE x\n    RANGE activity\n    RANGE tau_ms, gain, population_size\n}\n\nMIND {\n    ROLE MICRO2MACRO\n    WRITE_TARGET x\n}\n\nPARAMETER {\n    tau_ms = 20.0\n    gain = -0.7\n    population_size = 200.0\n}\n\nASSIGNED {\n    x\n}\n\nSTATE {\n    activity\n}\n\nINITIAL {\n    activity = 0.0\n}\n\nBREAKPOINT {\n    SOLVE states METHOD cnexp\n    x = gain * activity\n}\n\nDERIVATIVE states {\n    activity&#39; = -activity \/ tau_ms\n}\n\nNET_RECEIVE(weight) {\n    activity = activity + weight \/ population_size\n}\n<\/code><\/pre><\/div>\n\n<p><code>ca3_olm_spikes_to_vep.mod<\/code> converts OLM cell spikes into a second inhibitory contribution.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code>NEURON {\n    POINT_PROCESS ca3_olm_spikes_to_vep\n    RANGE x\n    RANGE activity\n    RANGE tau_ms, gain, population_size\n}\n\nMIND {\n    ROLE MICRO2MACRO\n    WRITE_TARGET x\n}\n\nPARAMETER {\n    tau_ms = 80.0\n    gain = -0.4\n    population_size = 200.0\n}\n\nASSIGNED {\n    x\n}\n\nSTATE {\n    activity\n}\n\nINITIAL {\n    activity = 0.0\n}\n\nBREAKPOINT {\n    SOLVE states METHOD cnexp\n    x = gain * activity\n}\n\nDERIVATIVE states {\n    activity&#39; = -activity \/ tau_ms\n}\n\nNET_RECEIVE(weight) {\n    activity = activity + weight \/ population_size\n}\n<\/code><\/pre><\/div>\n\n<p>At the macro scale, macro ROIs use the <code>tvb_epileptor2d<\/code> mechanism to declare and initialize ROI exposures. <code>Left-CA3<\/code> is a micro ROI, so it declares its ROI exposure interface with <code>use_micro(exposures=[...])<\/code>; its <code>x<\/code> exposure is supplied by the CA3 microcircuit through micro2macro transform modules, and its <code>ca3_input<\/code> exposure receives incoming macro coupling for the macro2micro transform.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">macro_rng<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">random<\/span><span class=\"o\">.<\/span><span class=\"n\">default_rng<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">macro_init_seed<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">propagation_labels<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"s2\">&quot;Left-CA1&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Right-CA1&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Left-CA3&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Right-CA3&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Left-subiculum&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Right-subiculum&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Left-entorhinal&quot;<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;Right-entorhinal&quot;<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"n\">initial_x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">zeros<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">labels<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">initial_z<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">zeros<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">rois<\/span><span class=\"o\">.<\/span><span class=\"n\">labels<\/span><span class=\"p\">))<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">roi_index<\/span><span class=\"p\">,<\/span> <span class=\"n\">roi<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">rois<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"o\">==<\/span> <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">x0<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">1.6<\/span>\n    <span class=\"k\">elif<\/span> <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">propagation_labels<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">x0<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">1.9<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">x0<\/span> <span class=\"o\">=<\/span> <span class=\"o\">-<\/span><span class=\"mf\">2.4<\/span>\n    <span class=\"n\">x_initial<\/span> <span class=\"o\">=<\/span> <span class=\"n\">x0<\/span> <span class=\"o\">+<\/span> <span class=\"mf\">0.02<\/span> <span class=\"o\">*<\/span> <span class=\"n\">macro_rng<\/span><span class=\"o\">.<\/span><span class=\"n\">standard_normal<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">initial_x<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.0<\/span> <span class=\"k\">if<\/span> <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"o\">==<\/span> <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"k\">else<\/span> <span class=\"n\">x_initial<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"o\">==<\/span> <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">continue<\/span>\n    <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">use_macro<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;tvb_epileptor2d&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">initial_state<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"s2\">&quot;x&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">initial_x<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">],<\/span> <span class=\"s2\">&quot;z&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">initial_z<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]},<\/span>\n        <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span>\n            <span class=\"s2\">&quot;x0&quot;<\/span><span class=\"p\">:<\/span> <span class=\"n\">x0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;a&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;b&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">3.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;c&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;d&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">5.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;r&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.00035<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;slope&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;kvf&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.35<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;ks&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;tt&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;i_ext&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">3.1<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;modification&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n    <span class=\"p\">)<\/span>\n<span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">use_micro<\/span><span class=\"p\">(<\/span><span class=\"n\">exposures<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s2\">&quot;x&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;ca3_input&quot;<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre><\/div>\n\n<p>The <code>macro2micro transform<\/code> converts the <code>ca3_input<\/code> signal into spike events delivered to synapses on CA3 pyramidal cells.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">ca3_input_to_spikes_params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"s2\">&quot;base_hz&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;gain_hz&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">45.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;max_rate_hz&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">120.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;threshold&quot;<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mf\">0.35<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;slope&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">4.0<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">target<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;MyExp2SynBB&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau1<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.05<\/span><span class=\"p\">,<\/span> <span class=\"n\">tau2<\/span><span class=\"o\">=<\/span><span class=\"mf\">5.3<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">macro2micro<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;ca3_input_to_spikes&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">target<\/span><span class=\"o\">=<\/span><span class=\"n\">target<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">weight<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.02e-3<\/span> <span class=\"o\">*<\/span> <span class=\"mf\">1.0e-2<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">delay<\/span><span class=\"o\">=<\/span><span class=\"mf\">0.2<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"n\">ca3_input_to_spikes_params<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>The same <code>mod\/<\/code> directory contains the extended MOD mechanisms used by the macro layer and by the cross-scale transforms. <code>tvb_epileptor2d<\/code> defines the ROI-level neural mass. <code>vep_x_macro2macro<\/code> propagates the <code>x<\/code> exposure between macro ROIs. For the micro ROI, <code>ca3_input_macro2macro<\/code> collects incoming macro activity into the <code>ca3_input<\/code> variable.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"k\">for<\/span> <span class=\"n\">target_index<\/span><span class=\"p\">,<\/span> <span class=\"n\">target<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_list<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">source_index<\/span><span class=\"p\">,<\/span> <span class=\"n\">source_label<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_labels<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">roi_weights<\/span><span class=\"p\">[<\/span><span class=\"n\">target_index<\/span><span class=\"p\">][<\/span><span class=\"n\">source_index<\/span><span class=\"p\">]<\/span> <span class=\"o\">==<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">continue<\/span>\n        <span class=\"n\">target<\/span><span class=\"o\">.<\/span><span class=\"n\">insert<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">source_label<\/span><span class=\"p\">,<\/span>\n            <span class=\"s2\">&quot;ca3_input_macro2macro&quot;<\/span> <span class=\"k\">if<\/span> <span class=\"n\">target<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"o\">==<\/span> <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">label<\/span> <span class=\"k\">else<\/span> <span class=\"s2\">&quot;vep_x_macro2macro&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>The <code>micro2macro transform<\/code> maps spikes from pyramidal, basket, and OLM cells into the <code>x<\/code> exposure of the <code>Left-CA3<\/code> ROI. Source selection is defined by explicit <code>sid<\/code> values. Multiple <code>micro2macro transforms<\/code> can target the same ROI and exposure.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">ca3_pyr_spikes_to_vep_params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"s2\">&quot;tau_ms&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">50.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;x_baseline&quot;<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mf\">1.8<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;gain&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">2.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;population_size&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">800.0<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"n\">ca3_bas_spikes_to_vep_params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"s2\">&quot;tau_ms&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">20.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;gain&quot;<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mf\">0.7<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;population_size&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">200.0<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"n\">ca3_olm_spikes_to_vep_params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"s2\">&quot;tau_ms&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">80.0<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;gain&quot;<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mf\">0.4<\/span><span class=\"p\">,<\/span>\n    <span class=\"s2\">&quot;population_size&quot;<\/span><span class=\"p\">:<\/span> <span class=\"mf\">200.0<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pyr_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">micro2macro<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;ca3_pyr_spikes_to_vep&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">sid<\/span><span class=\"o\">=<\/span><span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">),<\/span>\n        <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"n\">ca3_pyr_spikes_to_vep_params<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">bas_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">micro2macro<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;ca3_bas_spikes_to_vep&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">sid<\/span><span class=\"o\">=<\/span><span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">),<\/span>\n        <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"n\">ca3_bas_spikes_to_vep_params<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">cell<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">olm_population<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">left_ca3_roi<\/span><span class=\"o\">.<\/span><span class=\"n\">micro2macro<\/span><span class=\"p\">(<\/span>\n        <span class=\"s2\">&quot;ca3_olm_spikes_to_vep&quot;<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">sid<\/span><span class=\"o\">=<\/span><span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">cell<\/span><span class=\"o\">.<\/span><span class=\"n\">gid<\/span><span class=\"p\">),<\/span>\n        <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"n\">ca3_olm_spikes_to_vep_params<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>The macro initial history can be provided explicitly with TVB-style chronological ordering. The first axis is time, and <code>history[-1]<\/code> is the current <code>t = 0<\/code> state.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">history_steps<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">round<\/span><span class=\"p\">(<\/span><span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">max<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_delays<\/span><span class=\"p\">)<\/span> <span class=\"o\">\/<\/span> <span class=\"mf\">0.1<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\n<span class=\"n\">history_alpha<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">linspace<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mf\">1.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"n\">history_steps<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">roi_phase<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">linspace<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"mf\">2.0<\/span> <span class=\"o\">*<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">pi<\/span><span class=\"p\">,<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_labels<\/span><span class=\"p\">),<\/span> <span class=\"n\">endpoint<\/span><span class=\"o\">=<\/span><span class=\"kc\">False<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">roi_index<\/span><span class=\"p\">,<\/span> <span class=\"n\">roi<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">enumerate<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_list<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">roi_initial_history<\/span> <span class=\"o\">=<\/span> <span class=\"n\">np<\/span><span class=\"o\">.<\/span><span class=\"n\">empty<\/span><span class=\"p\">((<\/span><span class=\"n\">history_steps<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">roi_initial_history<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\n        <span class=\"n\">initial_x<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]<\/span> <span class=\"o\">+<\/span> <span class=\"mf\">0.01<\/span> <span class=\"o\">*<\/span> <span class=\"n\">history_alpha<\/span> <span class=\"o\">*<\/span> <span class=\"n\">math<\/span><span class=\"o\">.<\/span><span class=\"n\">sin<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_phase<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">])<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"n\">roi_initial_history<\/span><span class=\"p\">[:,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\n        <span class=\"n\">initial_z<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]<\/span> <span class=\"o\">+<\/span> <span class=\"mf\">0.002<\/span> <span class=\"o\">*<\/span> <span class=\"n\">history_alpha<\/span> <span class=\"o\">*<\/span> <span class=\"n\">math<\/span><span class=\"o\">.<\/span><span class=\"n\">cos<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_phase<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">])<\/span>\n    <span class=\"p\">)<\/span>\n    <span class=\"n\">roi_initial_history<\/span><span class=\"p\">[<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">initial_x<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]<\/span>\n    <span class=\"n\">roi_initial_history<\/span><span class=\"p\">[<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">initial_z<\/span><span class=\"p\">[<\/span><span class=\"n\">roi_index<\/span><span class=\"p\">]<\/span>\n    <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">initial_history<\/span><span class=\"p\">(<\/span><span class=\"n\">roi_initial_history<\/span><span class=\"p\">,<\/span> <span class=\"n\">outputs<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s2\">&quot;x&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;z&quot;<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre><\/div>\n\n<p>After the cross-scale transforms and macro history are configured, the microcircuit can be built.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">build_microcircuit<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div>\n\n<h2>Recording<\/h2>\n<p>At the macro level, recording is matched exactly by exposure name.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"k\">for<\/span> <span class=\"n\">roi<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">rois<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;x&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">roi<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;z&quot;<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>At the micro level, recording follows the familiar NEURON Simulator-like style.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">pyr_voltage_trace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Vector<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_population<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">bas_voltage_trace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Vector<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"n\">bas_population<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">olm_voltage_trace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Vector<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"n\">olm_population<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;soma&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">adend3_voltage_trace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Vector<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"n\">pyr_population<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;Adend3&quot;<\/span><span class=\"p\">)[<\/span><span class=\"mi\">0<\/span><span class=\"p\">](<\/span><span class=\"mf\">0.5<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_v<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">voltage_time_trace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Vector<\/span><span class=\"p\">()<\/span><span class=\"o\">.<\/span><span class=\"n\">record<\/span><span class=\"p\">(<\/span><span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">_ref_t<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>After recording is configured, the model can be executed.<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">micro<\/span><span class=\"o\">.<\/span><span class=\"n\">finitialize<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mf\">65.0<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">simulator<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ms<\/span><span class=\"o\">.<\/span><span class=\"n\">Simulator<\/span><span class=\"p\">(<\/span><span class=\"n\">rois<\/span><span class=\"p\">,<\/span> <span class=\"n\">macro2micro_seed<\/span><span class=\"o\">=<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">macro2micro_seed<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">simulator<\/span><span class=\"o\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">.<\/span><span class=\"n\">duration_ms<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n<p>The <code>macro2micro_seed<\/code> argument makes the stochastic macro2micro event generation reproducible.<\/p>\n<h2>Performance<\/h2>\n<p>In this example, MIND_Sim is compared with a TVB+NEURON reference using the current 1 s CA3 epilepsy co-simulation runs.<\/p>\n<table>\n<thead>\n<tr>\n<th>Workflow<\/th>\n<th style=\"text-align: right;\">Threads<\/th>\n<th style=\"text-align: right;\">Pre-run<\/th>\n<th style=\"text-align: right;\">Run<\/th>\n<th style=\"text-align: right;\">Speedup<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MIND_Sim async<\/td>\n<td style=\"text-align: right;\">1<\/td>\n<td style=\"text-align: right;\">0.187s<\/td>\n<td style=\"text-align: right;\">16.702s<\/td>\n<td style=\"text-align: right;\">3.97x<\/td>\n<\/tr>\n<tr>\n<td>TVB+NEURON<\/td>\n<td style=\"text-align: right;\">1<\/td>\n<td style=\"text-align: right;\">0.591s<\/td>\n<td style=\"text-align: right;\">66.327s<\/td>\n<td style=\"text-align: right;\">1.00x<\/td>\n<\/tr>\n<tr>\n<td>MIND_Sim async<\/td>\n<td style=\"text-align: right;\">4<\/td>\n<td style=\"text-align: right;\">0.169s<\/td>\n<td style=\"text-align: right;\">6.672s<\/td>\n<td style=\"text-align: right;\">4.88x<\/td>\n<\/tr>\n<tr>\n<td>TVB+NEURON<\/td>\n<td style=\"text-align: right;\">4<\/td>\n<td style=\"text-align: right;\">0.558s<\/td>\n<td style=\"text-align: right;\">32.531s<\/td>\n<td style=\"text-align: right;\">1.00x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For the same 1 s runs, using the TVB+NEURON reference with TVB's official macro APIs, the maximum absolute differences between MIND_Sim and the reference are <code>1.28464e-06<\/code> for macro <code>x<\/code>, <code>1.4922e-09<\/code> for macro <code>z<\/code>, and <code>8.98019e-11 mV<\/code> for representative PYR, BAS, OLM, and PYR Adend3 voltage traces. The macro comparison includes the precision boundary between TVB's single-precision (<code>float32<\/code>) state\/history storage and MIND_Sim's double-precision macro state. Spike sample indices are exactly equal for the representative PYR, BAS, and OLM cells. This result should be read as an example-level performance comparison, not as a standardized benchmark. The reference TVB+NEURON implementation is available <a href=\"https:\/\/github.com\/HengyeZhu\/MIND_Sim\/blob\/main\/examples\/ca3_epilepsy_cosim\/neuron_tvb\/run_tvb_neuron_ca3_cosim.py\">here<\/a>.<\/p>","category":{"@attributes":{"term":"MIND"}}},{"title":"Differences between rocRand and cuRand when using HIP","link":{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/differences-between-rocrand-and-curand-when-using-hip.html","rel":"alternate"}},"published":"2025-09-12T00:00:00+08:00","updated":"2025-09-12T00:00:00+08:00","author":{"name":"Hengye Zhu"},"id":"tag:hengyezhu.github.io,2025-09-12:\/differences-between-rocrand-and-curand-when-using-hip.html","summary":"<p>In cuRand, the state of an RNG is a plain struct e.g. for XORWOW:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"k\">struct<\/span><span class=\"w\"> <\/span><span class=\"nc\">curandStateXORWOW<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">d<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">v<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">];<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_flag<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_flag_double<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">float<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_extra<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">double<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_extra_double<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre><\/div>\n\n<p>whereas, in <a href=\"https:\/\/github.com\/ROCm\/rocm-libraries\/blob\/develop\/projects\/rocrand\/library\/include\/rocrand\/rocrand_xorwow.h\">rocRand<\/a>, the implementation is a lot more C++:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">class<\/span><span class=\"w\"> <\/span><span class=\"n\">xorwow_engine<\/span>\n<span class=\"p\">{<\/span>\n<span class=\"n\">public<\/span><span class=\"o\">:<\/span>\n<span class=\"w\">    <\/span><span class=\"k\">struct<\/span><span class=\"w\"> <\/span><span class=\"nc\">xorwow_state<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">d<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">    <\/span><span class=\"cp\">#ifndef ROCRAND_DETAIL_BM_NOT_IN_STATE \u2026<\/span><\/code><\/pre><\/div>","content":"<p>In cuRand, the state of an RNG is a plain struct e.g. for XORWOW:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"k\">struct<\/span><span class=\"w\"> <\/span><span class=\"nc\">curandStateXORWOW<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">d<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">v<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">];<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_flag<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_flag_double<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">float<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_extra<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"kt\">double<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_extra_double<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre><\/div>\n\n<p>whereas, in <a href=\"https:\/\/github.com\/ROCm\/rocm-libraries\/blob\/develop\/projects\/rocrand\/library\/include\/rocrand\/rocrand_xorwow.h\">rocRand<\/a>, the implementation is a lot more C++:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"n\">class<\/span><span class=\"w\"> <\/span><span class=\"n\">xorwow_engine<\/span>\n<span class=\"p\">{<\/span>\n<span class=\"n\">public<\/span><span class=\"o\">:<\/span>\n<span class=\"w\">    <\/span><span class=\"k\">struct<\/span><span class=\"w\"> <\/span><span class=\"nc\">xorwow_state<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">d<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">    <\/span><span class=\"cp\">#ifndef ROCRAND_DETAIL_BM_NOT_IN_STATE<\/span>\n\n<span class=\"w\">        <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_float_state<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_double_state<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">float<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_float<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">double<\/span><span class=\"w\"> <\/span><span class=\"n\">boxmuller_double<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span>\n<span class=\"w\">    <\/span><span class=\"cp\">#endif<\/span>\n<span class=\"w\">        <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">5<\/span><span class=\"p\">];<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">};<\/span>\n\n<span class=\"w\">    <\/span><span class=\"n\">__forceinline__<\/span><span class=\"w\"> <\/span><span class=\"n\">__device__<\/span><span class=\"w\"> <\/span><span class=\"n\">__host__<\/span><span class=\"w\"> <\/span><span class=\"n\">xorwow_engine<\/span><span class=\"p\">(<\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"n\">seed<\/span><span class=\"p\">,<\/span>\n<span class=\"w\">                                                      <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"n\">subsequence<\/span><span class=\"p\">,<\/span>\n<span class=\"w\">                                                      <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"kt\">long<\/span><span class=\"w\"> <\/span><span class=\"n\">offset<\/span><span class=\"p\">)<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">123456789U<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">362436069U<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">521288629U<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">88675123U<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">5783321U<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">d<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">6615241U<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">        <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">s0<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">static_cast<\/span><span class=\"o\">&lt;<\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">seed<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">^<\/span><span class=\"w\"> <\/span><span class=\"mh\">0x2c7f967fU<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">s1<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">static_cast<\/span><span class=\"o\">&lt;<\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">seed<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"w\"> <\/span><span class=\"mi\">32<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"o\">^<\/span><span class=\"w\"> <\/span><span class=\"mh\">0xa03697cbU<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">t0<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">1228688033U<\/span><span class=\"w\"> <\/span><span class=\"o\">*<\/span><span class=\"w\"> <\/span><span class=\"n\">s0<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"kt\">unsigned<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"n\">t1<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"mi\">2073658381U<\/span><span class=\"w\"> <\/span><span class=\"o\">*<\/span><span class=\"w\"> <\/span><span class=\"n\">s1<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">+=<\/span><span class=\"w\"> <\/span><span class=\"n\">t0<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">^=<\/span><span class=\"w\"> <\/span><span class=\"n\">t0<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">+=<\/span><span class=\"w\"> <\/span><span class=\"n\">t1<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">^=<\/span><span class=\"w\"> <\/span><span class=\"n\">t1<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span><span class=\"w\"> <\/span><span class=\"o\">+=<\/span><span class=\"w\"> <\/span><span class=\"n\">t0<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">m_state<\/span><span class=\"p\">.<\/span><span class=\"n\">d<\/span><span class=\"w\"> <\/span><span class=\"o\">+=<\/span><span class=\"w\"> <\/span><span class=\"n\">t1<\/span><span class=\"w\"> <\/span><span class=\"o\">+<\/span><span class=\"w\"> <\/span><span class=\"n\">t0<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">        <\/span><span class=\"n\">discard_subsequence<\/span><span class=\"p\">(<\/span><span class=\"n\">subsequence<\/span><span class=\"p\">);<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">discard<\/span><span class=\"p\">(<\/span><span class=\"n\">offset<\/span><span class=\"p\">);<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">}<\/span>\n\n<span class=\"n\">protected<\/span><span class=\"o\">:<\/span>\n<span class=\"w\">    <\/span><span class=\"n\">xorwow_state<\/span><span class=\"w\"> <\/span><span class=\"n\">m_state<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span><span class=\"w\"> <\/span>\n<\/code><\/pre><\/div>\n\n<p>1.When using AMD GPUs, you can't create classes with <strong>device<\/strong> hiprandState d_rng; as that would mean the constructor needs to be run on device when the kernel is loaded which is understandably not possible.<\/p>\n<p>2.You can't freely hack with the internals of the RNG state as they don't even provide a getter for the state struct which, irritatingly, is sitting there in m_state protected member.<\/p>\n<p>To solve the first problem, we can switch global variable to pointer and allocate manually. For example:<\/p>\n<div class=\"highlight\"><pre><span><\/span><code><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">Backend::genAllocateMemPreamble<\/span><span class=\"p\">(<\/span><span class=\"n\">CodeStream<\/span><span class=\"w\"> <\/span><span class=\"o\">&amp;<\/span><span class=\"n\">os<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"k\">const<\/span><span class=\"w\"> <\/span><span class=\"n\">ModelSpecMerged<\/span><span class=\"w\"> <\/span><span class=\"o\">&amp;<\/span><span class=\"n\">modelMerged<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"k\">const<\/span>\n<span class=\"p\">{<\/span>\n<span class=\"w\">    <\/span><span class=\"c1\">\/\/ If global RNG is required<\/span>\n<span class=\"w\">    <\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">isGlobalDeviceRNGRequired<\/span><span class=\"p\">(<\/span><span class=\"n\">modelMerged<\/span><span class=\"p\">.<\/span><span class=\"n\">getModel<\/span><span class=\"p\">()))<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">CodeStream<\/span><span class=\"o\">::<\/span><span class=\"n\">Scope<\/span><span class=\"w\"> <\/span><span class=\"n\">b<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">);<\/span>\n\n<span class=\"w\">        <\/span><span class=\"c1\">\/\/ Allocate memory<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">os<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"s\">&quot;hiprandStatePhilox4_32_10_t *hostPtr;&quot;<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">endl<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">os<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"s\">&quot;CHECK_RUNTIME_ERRORS(hipMalloc(&amp;hostPtr, sizeof(hiprandStatePhilox4_32_10_t)));&quot;<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">endl<\/span><span class=\"p\">;<\/span>\n\n<span class=\"w\">        <\/span><span class=\"c1\">\/\/ Copy to device symbol<\/span>\n<span class=\"w\">        <\/span><span class=\"n\">os<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"s\">&quot;CHECK_RUNTIME_ERRORS(hipMemcpyToSymbol(HIP_SYMBOL(d_rng), &amp;hostPtr, sizeof(void*)));&quot;<\/span><span class=\"w\"> <\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"w\"> <\/span><span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">endl<\/span><span class=\"p\">;<\/span>\n<span class=\"w\">    <\/span><span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>\n\n<p>Finally, I would like to thank Dr. James Knight for his tremendous help throughout this process!<\/p>","category":{"@attributes":{"term":"GeNN"}}},{"title":"GSoC_summary","link":{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/gsoc_summary.html","rel":"alternate"}},"published":"2025-09-09T00:00:00+08:00","updated":"2025-09-09T00:00:00+08:00","author":{"name":"Hengye Zhu"},"id":"tag:hengyezhu.github.io,2025-09-09:\/gsoc_summary.html","summary":"<p><a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/tree\/feat-neuroml-gsoc\/NeuroML2\">This project<\/a> will convert Macaque auditory thalamocortical circuits model based on NetPyNE implementation into NeuroML standard formats and testing it across multiple simulation engines to ensure that it produce the same results.<\/p>\n<p>First, I converted the morphology and ion channels for almost all neurons in the Macaque_auditory_thalamocortical_model. The conversions for \u2026<\/p>","content":"<p><a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/tree\/feat-neuroml-gsoc\/NeuroML2\">This project<\/a> will convert Macaque auditory thalamocortical circuits model based on NetPyNE implementation into NeuroML standard formats and testing it across multiple simulation engines to ensure that it produce the same results.<\/p>\n<p>First, I converted the morphology and ion channels for almost all neurons in the Macaque_auditory_thalamocortical_model. The conversions for IT2 and RE neurons have been confirmed to be correct, but there are unknown <a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/issues\/14\">errors<\/a> when integrating them.<\/p>\n<p>Then, I also added functionality to directly import nml files to the existing script, and introduced some new features for recording simulation variables, which can be used for subsequent validation. <a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/blob\/feat-neuroml-gsoc\/NeuroML2\/compare_MC\/RE\/omv_test.py\">My script<\/a> might not be written in the elegant way, but it may help beginners understand NeuroML better.<\/p>\n<p>Finally, this GSoC project is still ongoing, and I look forward to the journey ahead! Here, I would like to express my gratitude to my mentors: Ankur Sinha and Padraig Gleeson.<\/p>","category":{"@attributes":{"term":"GSoC"}}},{"title":"Learning_HPC","link":{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/learning_hpc.html","rel":"alternate"}},"published":"2025-08-27T00:00:00+08:00","updated":"2025-08-27T00:00:00+08:00","author":{"name":"Hengye Zhu"},"id":"tag:hengyezhu.github.io,2025-08-27:\/learning_hpc.html","content":"<p>This article is used to record the resources and projects for my HPC learning.<\/p>\n<p><a href=\"https:\/\/hpc.llnl.gov\/documentation\/tutorials\/introduction-parallel-computing-tutorial\">Parallel_Computing<\/a><\/p>\n<p><a href=\"https:\/\/docs.nvidia.com\/cuda\/cuda-c-programming-guide\/contents.html\">CUDA<\/a><\/p>\n<p><a href=\"https:\/\/face2ai.com\/CUDA-F-1-1-\u5f02\u6784\u8ba1\u7b97-CUDA\/\">CUDA_Chinese<\/a><\/p>\n<p><a href=\"https:\/\/rocm.docs.amd.com\/projects\/HIP\/en\/latest\/understand\/programming_model.html\">HIP<\/a><\/p>\n<p><a href=\"https:\/\/pharr.org\/matt\/blog\/2018\/04\/18\/ispc-origins\">ISPC<\/a><\/p>\n<p><a href=\"https:\/\/mpitutorial.com\">MPI<\/a><\/p>\n<p><a href=\"https:\/\/www.youtube.com\/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG\">OpenMP<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/neuronsimulator\/nrn\">NEURON<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/genn-team\/genn\">GeNN<\/a><\/p>\n<p><a href=\"https:\/\/gitlab.com\/c7859\/neurocomputing-lab\/Inferior_OliveEMC\/eden\">EDEN<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/arbor-sim\/arbor\">Arbor<\/a><\/p>","category":{"@attributes":{"term":"HPC"}}},{"title":"Hello World!","link":{"@attributes":{"href":"https:\/\/hengyezhu.github.io\/hello-world.html","rel":"alternate"}},"published":"2025-05-23T00:00:00+08:00","updated":"2025-05-23T00:00:00+08:00","author":{"name":"Hengye Zhu"},"id":"tag:hengyezhu.github.io,2025-05-23:\/hello-world.html","summary":"<p>I am Hengye Zhu, a contributor of Google Summer of Code Program.<\/p>\n<p>It is a great honor to be selected for the 2025 GSoC_INCF Project 12: Developing Standardised Biophysically Detailed Neuronal Circuit Models Using NeuroML. As I dive into <a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/tree\/feat-neuroml-gsoc\/NeuroML2\">this project<\/a>, I'll be documenting my experiences, challenges, and learnings here \u2026<\/p>","content":"<p>I am Hengye Zhu, a contributor of Google Summer of Code Program.<\/p>\n<p>It is a great honor to be selected for the 2025 GSoC_INCF Project 12: Developing Standardised Biophysically Detailed Neuronal Circuit Models Using NeuroML. As I dive into <a href=\"https:\/\/github.com\/OpenSourceBrain\/Macaque_auditory_thalamocortical_model_data\/tree\/feat-neuroml-gsoc\/NeuroML2\">this project<\/a>, I'll be documenting my experiences, challenges, and learnings here.<\/p>\n<p>Looking forward to an unforgettable summer experience!<\/p>","category":{"@attributes":{"term":"GSoC"}}}]}