2021-11-18 • Prototype new sim
Contents
2021-11-18 • Prototype new sim¶
One numba-optimised function doing synaptic integration and izhikevich sim.
To allow simulations with many neurons / input spike trains to fit in memory, we do not save all signals, only “recorded” ones (as the simulators like Brian do).
Prelude¶
from voltage_to_wiring_sim.notebook_init import *
Preloading: numpy, numba, matplotlib.pyplot, seaborn.
Importing from submodules … ✔
Imported `np`, `mpl`, `plt`, `sns`, `pd`
Imported codebase (`voltage_to_wiring_sim`) as `v`
Imported `*` from `v.support.units`
Setup autoreload
v.print_reproducibility_info()
This cell was last run by tfiers
on yoga
on Mon 03 Jan 2022, at 16:18 (UTC+0100).
Last git commit (Thu 09 Dec 2021, 11:06).
Uncommited changes to 3 files.
Parameters¶
dt = 0.1 * ms
duration = 10 * second
N = 4 # number of neurons
τ_syn = 7 * ms
injected_noise_σ = 3 * mV
v_r = -60 * mV
v_t = -40 * mV
v_peak = 35 * mV
c = -50 * mV # aka v_reset
C = 100 * pF
k = 0.7 * (nS/mV)
b = -2 * nS
a = 0.03 / ms
d = 100 * pA;
v_syn = np.array([0*mV, 0*mV, 0*mV, -65*mV]);
# This is the postsynaptic reversal potential for all this neuron's output connections
ge = 4 * nS
gi = 16 * nS
Δg = np.array([
[0, ge, 0, 0],
[0, 0, 0, 0],
[0, ge, 0, 0],
[0, 0, 0, 0],
]); # [from, to]
recorded_neurons = [0, 2];
Sim¶
num_timesteps = v.sim.izhikevich_neuron.to_num_timesteps(duration, dt)
100000
from numpy import zeros, ones, newaxis
from numpy.random import randn
v_record = np.empty((num_timesteps, len(recorded_neurons)))
recorded_neurons = np.array(recorded_neurons)
# The type of this iterable may not be `tuple`. (Because we want to use it to select multiple elements.
# See the last example here: https://numpy.org/doc/stable/user/basics.indexing.html)
v_syn.shape = (N, 1)
# Transform into column vector, to make the subtraction (v_syn - v) below
# generate a matrix, via broadcasting.
v = ones(N) * v_r
u = zeros(N)
g = zeros((N, N))
spikes = tuple([[] * N])
for i in range(num_timesteps):
# Synaptic conductance & current
g -= g / τ_syn * dt
I_syn = g * (v_syn - v)
I_syn_total = np.sum(I_syn, axis=0)
# todo: make stochastic differential,
# https://brian2.readthedocs.io/en/stable/resources/tutorials/1-intro-to-brian-neurons.html#stochastic-neurons
I_noise = randn(N) * injected_noise_σ
# Izhikevich neuron
v += (k * (v - v_r) * (v - v_t) - u + I_syn_total + I_noise) / C * dt
u += a * (b * (v - v_r) - u) * dt
has_spiked = v >= v_peak
v[has_spiked] = c
u[has_spiked] += d
# Conductance bumps. The non-spiking rows are zeroed by the multiplication.
# (Hence the transformation of `has_spiked` into a column vector: for broadcasting).
g += Δg * has_spiked[:, newaxis]
# Record spike times
for j in v.indices_where(has_spiked):
spikes[j].append(i)
# Record selected signals
v_record[i, :] = v[recorded_neurons]
# For spikers, retroactively set previous timestep's v to v_peak.
# Goal: consistent spike height.
v_record[i-1, has_spiked[recorded_neurons]] = v_peak
Current direction is how positive charges move. Ergo positive current = \(v_m\) increase (depolarisation).
On discretizing the voltage reset¶
“We’re basically choosing between a slightly too sharp and early peak, and a slightly too late and flat-topped one.”
from voltage_to_wiring_sim.experiments.N_to_1_IE import Params, simulate_and_test_connections
from dataclasses import replace
base_params = Params()
sim_and_test = v.cache_to_disk(simulate_and_test_connections)
d, td, ts = sim_and_test(base_params)
________________________________________________________________________________
[Memory] Calling voltage_to_wiring_sim.experiments.N_to_1_IE.simulate_and_test_connections...
simulate_and_test_connections(Params(sim_duration=600, timestep=0.0001, τ_syn=0.007, neuron_params=IzhikevichParams(C=1e-10, k=7e-07, v_r=-0.06, v_t=-0.04, v_peak=0.035, a=30.0, b=-2e-09, c=-0.05, d=1e-10), imaging_spike_SNR=20, window_duration=0.1, num_spike_trains=30, p_inhibitory=0.2, p_connected=0.7, spike_rate=20.0, Δg_syn_exc=4.0000000000000007e-10, Δg_syn_inh=1.6000000000000003e-09, v_syn_exc=0.0, v_syn_inh=-0.065, rng_seed=0))
30/30
___________________________________simulate_and_test_connections - 26.4s, 0.4min
ax = v.plot_signal(d.izh_output.V_m.slice(4.75, 0.2) / mV, time_units=ms)
zoom_start = 4865 * ms
zoom_duration = 7 * ms
ax.axvspan(zoom_start / ms, (zoom_start + zoom_duration) / ms, alpha=0.3);
ax.set(xlabel="Time (ms)", ylabel="$V_m$ (mV)");
![../_images/2021-11-18__prototype_new_sim_18_0.png](../_images/2021-11-18__prototype_new_sim_18_0.png)
v.plot_signal(d.izh_output.V_m.slice(zoom_start, zoom_duration) / mV, time_units=ms, marker="o", ms=3);
![../_images/2021-11-18__prototype_new_sim_19_0.png](../_images/2021-11-18__prototype_new_sim_19_0.png)
Reproducibility¶
v.print_reproducibility_info(verbose=True)
This cell was last run by lpxtf3
on DUIP74576
on Thu 18 Nov 2021, at 23:21 (UTC+0000).
Last git commit (Thu 18 Nov 2021, 17:05).
Uncommited changes to:
M codebase/voltage_to_wiring_sim/experiments/N_to_1_IE.py
M notebooks/2021-11-11__vary_both_inh_strength_and_proportion.ipynb
?? notebooks/2021-11-18__constant_input_spikes-Copy1.ipynb
?? notebooks/2021-11-18__constant_input_spikes.ipynb
Platform:
Windows-10
CPython 3.9.6 (C:\miniforge3\python.exe)
Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
Dependencies of voltage_to_wiring_sim
and their installed versions:
numpy 1.21.1
matplotlib 3.4.2
numba 0.53.1
joblib 1.0.1
seaborn 0.11.1
scipy 1.7.0
preload 2.2
nptyping 1.4.2
Full conda list:
# packages in environment at C:\miniforge3:
#
# Name Version Build Channel
argon2-cffi 20.1.0 py39hb82d6ee_2 conda-forge
async_generator 1.10 py_0 conda-forge
attrs 21.2.0 pyhd8ed1ab_0 conda-forge
backcall 0.2.0 pyh9f0ad1d_0 conda-forge
backports 1.0 py_2 conda-forge
backports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge
black 21.9b0 pyhd8ed1ab_1 conda-forge
bleach 3.3.1 pyhd8ed1ab_0 conda-forge
brotlipy 0.7.0 py39hb82d6ee_1001 conda-forge
ca-certificates 2021.10.8 h5b45459_0 conda-forge
certifi 2021.10.8 py39hcbf5309_1 conda-forge
cffi 1.14.6 py39h0878f49_0 conda-forge
chardet 4.0.0 py39hcbf5309_1 conda-forge
charset-normalizer 2.0.0 pyhd8ed1ab_0 conda-forge
click 7.1.2 pypi_0 pypi
colorama 0.4.4 pyh9f0ad1d_0 conda-forge
colorful 0.5.4 pypi_0 pypi
conda 4.10.3 py39hcbf5309_2 conda-forge
conda-package-handling 1.7.3 py39hb3671d1_0 conda-forge
cryptography 3.4.7 py39hd8d06c1_0 conda-forge
cycler 0.10.0 pypi_0 pypi
dataclasses 0.8 pyhc8e2a94_3 conda-forge
debugpy 1.4.1 py39h415ef7b_0 conda-forge
decorator 5.0.9 pyhd8ed1ab_0 conda-forge
defusedxml 0.7.1 pyhd8ed1ab_0 conda-forge
entrypoints 0.3 pyhd8ed1ab_1003 conda-forge
icu 68.2 h0e60522_0 conda-forge
idna 3.1 pyhd3deb0d_0 conda-forge
importlib-metadata 4.6.1 py39hcbf5309_0 conda-forge
ipykernel 6.0.3 py39h832f523_0 conda-forge
ipython 7.25.0 py39h832f523_1 conda-forge
ipython_genutils 0.2.0 py_1 conda-forge
jedi 0.18.0 py39hcbf5309_2 conda-forge
jinja2 3.0.1 pyhd8ed1ab_0 conda-forge
joblib 1.0.1 pypi_0 pypi
jpeg 9d h8ffe710_0 conda-forge
jsonschema 3.2.0 pyhd8ed1ab_3 conda-forge
jupyter_client 6.1.12 pyhd8ed1ab_0 conda-forge
jupyter_contrib_core 0.3.3 py_2 conda-forge
jupyter_contrib_nbextensions 0.5.1 pyhd8ed1ab_2 conda-forge
jupyter_core 4.7.1 py39hcbf5309_0 conda-forge
jupyter_highlight_selected_word 0.2.0 py39hcbf5309_1002 conda-forge
jupyter_latex_envs 1.4.6 pyhd8ed1ab_1002 conda-forge
jupyter_nbextensions_configurator 0.4.1 py39hcbf5309_2 conda-forge
jupyterlab_pygments 0.1.2 pyh9f0ad1d_0 conda-forge
kiwisolver 1.3.1 pypi_0 pypi
libclang 11.1.0 default_h5c34c98_1 conda-forge
libiconv 1.16 he774522_0 conda-forge
libpng 1.6.37 h1d00b33_2 conda-forge
libsodium 1.0.18 h8d14728_1 conda-forge
libxml2 2.9.12 hf5bbc77_0 conda-forge
libxslt 1.1.33 h65864e5_2 conda-forge
libzlib 1.2.11 h8ffe710_1013 conda-forge
llvmlite 0.36.0 pypi_0 pypi
lxml 4.6.3 py39h4fd7cdf_0 conda-forge
markupsafe 2.0.1 py39hb82d6ee_0 conda-forge
matplotlib 3.4.2 pypi_0 pypi
matplotlib-inline 0.1.2 pyhd8ed1ab_2 conda-forge
menuinst 1.4.17 py39hcbf5309_1 conda-forge
miniforge_console_shortcut 2.0 h57928b3_0 conda-forge
mistune 0.8.4 py39hb82d6ee_1004 conda-forge
mypy_extensions 0.4.3 py39hcbf5309_4 conda-forge
nbclient 0.5.3 pyhd8ed1ab_0 conda-forge
nbconvert 6.1.0 py39hcbf5309_0 conda-forge
nbformat 5.1.3 pyhd8ed1ab_0 conda-forge
nest-asyncio 1.5.1 pyhd8ed1ab_0 conda-forge
notebook 6.4.0 pyha770c72_0 conda-forge
nptyping 1.4.2 pypi_0 pypi
numba 0.53.1 pypi_0 pypi
numpy 1.21.1 pypi_0 pypi
openssl 1.1.1l h8ffe710_0 conda-forge
packaging 21.0 pyhd8ed1ab_0 conda-forge
pandas 1.3.1 pypi_0 pypi
pandoc 2.14.1 h8ffe710_0 conda-forge
pandocfilters 1.4.2 py_1 conda-forge
parso 0.8.2 pyhd8ed1ab_0 conda-forge
pathspec 0.9.0 pyhd8ed1ab_0 conda-forge
pickleshare 0.7.5 py_1003 conda-forge
pillow 8.3.1 pypi_0 pypi
pip 21.2.1 pyhd8ed1ab_0 conda-forge
platformdirs 2.3.0 pyhd8ed1ab_0 conda-forge
preload 2.2 pypi_0 pypi
prettyprinter 0.18.0 pypi_0 pypi
prometheus_client 0.11.0 pyhd8ed1ab_0 conda-forge
prompt-toolkit 3.0.19 pyha770c72_0 conda-forge
pycosat 0.6.3 py39hb82d6ee_1006 conda-forge
pycparser 2.20 pyh9f0ad1d_2 conda-forge
pygments 2.9.0 pyhd8ed1ab_0 conda-forge
pympler 0.9 pypi_0 pypi
pyopenssl 20.0.1 pyhd8ed1ab_0 conda-forge
pyparsing 2.4.7 pyh9f0ad1d_0 conda-forge
pyqt 5.12.3 py39hcbf5309_7 conda-forge
pyqt-impl 5.12.3 py39h415ef7b_7 conda-forge
pyqt5-sip 4.19.18 py39h415ef7b_7 conda-forge
pyqtchart 5.12 py39h415ef7b_7 conda-forge
pyqtwebengine 5.12.1 py39h415ef7b_7 conda-forge
pyrsistent 0.17.3 py39hb82d6ee_2 conda-forge
pysocks 1.7.1 py39hcbf5309_3 conda-forge
python 3.9.6 h7840368_1_cpython conda-forge
python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge
python_abi 3.9 2_cp39 conda-forge
pytz 2021.1 pypi_0 pypi
pywin32 300 py39hb82d6ee_0 conda-forge
pywinpty 1.1.3 py39h99910a6_0 conda-forge
pyyaml 6.0 py39hb82d6ee_0 conda-forge
pyzmq 22.1.0 py39he46f08e_0 conda-forge
qt 5.12.9 h5909a2a_4 conda-forge
regex 2021.10.23 py39hb82d6ee_1 conda-forge
requests 2.26.0 pyhd8ed1ab_0 conda-forge
ruamel_yaml 0.15.80 py39hb82d6ee_1004 conda-forge
scipy 1.7.0 pypi_0 pypi
seaborn 0.11.1 pypi_0 pypi
send2trash 1.7.1 pyhd8ed1ab_0 conda-forge
setuptools 49.6.0 py39hcbf5309_3 conda-forge
six 1.16.0 pyh6c4a22f_0 conda-forge
sqlite 3.36.0 h8ffe710_0 conda-forge
terminado 0.10.1 py39hcbf5309_0 conda-forge
testpath 0.5.0 pyhd8ed1ab_0 conda-forge
tomli 1.2.2 pyhd8ed1ab_0 conda-forge
tornado 6.1 py39hb82d6ee_1 conda-forge
tqdm 4.61.2 pyhd8ed1ab_1 conda-forge
traitlets 5.0.5 py_0 conda-forge
typed-ast 1.4.3 py39hb82d6ee_1 conda-forge
typing_extensions 3.10.0.2 pyha770c72_0 conda-forge
typish 1.9.2 pypi_0 pypi
tzdata 2021a he74cb21_1 conda-forge
ucrt 10.0.20348.0 h57928b3_0 conda-forge
urllib3 1.26.6 pyhd8ed1ab_0 conda-forge
vc 14.2 hb210afc_5 conda-forge
voltage-to-wiring-sim 0.1 dev_0 <develop>
vs2015_runtime 14.29.30037 h902a5da_5 conda-forge
wcwidth 0.2.5 pyh9f0ad1d_2 conda-forge
webencodings 0.5.1 py_1 conda-forge
wheel 0.36.2 pyhd3deb0d_0 conda-forge
win_inet_pton 1.1.0 py39hcbf5309_2 conda-forge
wincertstore 0.2 py39hcbf5309_1006 conda-forge
winpty 0.4.3 4 conda-forge
winshell 0.6 pypi_0 pypi
yaml 0.2.5 he774522_0 conda-forge
zeromq 4.3.4 h0e60522_0 conda-forge
zipp 3.5.0 pyhd8ed1ab_0 conda-forge
zlib 1.2.11 h8ffe710_1013 conda-forge