/*
* tsodyks2_shortterm_bursts.sli
*
* This file is part of NEST.
*
* Copyright (C) 2004 The NEST Initiative
*
* NEST is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* NEST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NEST. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* BeginDocumentation
Name: test_tsodyks_shortterm - sli script for testing Tsodyks short term plastic synapses.
Synopsis: (test_tsodyks_shortterm) run
Description:
Script to test Tsodyks short term plasticity depressing/facilitating synapses according to
'Synchrony Generation in Recurrent Networks with Frequency-Dependent Synapses'
Tsodyks, Uziel, Markram
JNeuroSci, Vol. 20 RC50 p. 1--5, (2000)
author: Moritz Helias
date: March 2006
see also: brunel.sli
see also: http://ken.brainworks.uni-freiburg.de/nestwiki/index.php/Network_burst_generation_by_short-term_plasticity
*/
ResetKernel % clear all existing network elements
/createSynapseTypes
{
userdict begin
% set delay of static synapse to appropriate value
% (needed for spike detector)
/static_synapse
<<
/delay delay
/weight 1.0
>> SetDefaults
% use tsodyks type synapses
% configure all different synapses
% set all parameters here, which are
% not specifically set for each connection
/tsodyks2_synapse
<<
/delay delay
>> SetDefaults
end
} def
%%
%% I_mean delta_I N BackgroundInput
%%
/BackgroundInput
{
/N Set
/delta_I Set
/I_mean Set
[]
N
{
myrng drand 0.5 sub delta_I mul I_mean add
append
} repeat
Sort %% sort in ascending order
} def
% initialize an array of neurons
% calling sequence:
% [gids] params initNeurons
/initNeurons
{
/params Set
/neurons Set
%% random background current
I0_dc deltaI neurons length BackgroundInput /i0s Set
neurons
{
/i Set
/gid Set
params
<<
/V_m myrng drand Theta mul %% random initial membrane potential [0, Theta]
/I_e i0s i get %% i0 = i0s[i]
>>
join
gid params SetStatus
} forallindexed
} def
/createNeurons
{
userdict begin
[0] ChangeSubnet % return to full network
/E_net /subnet Create def % create subnet
E_net ChangeSubnet % enter subnet
/iaf_tum_2000 Ne Create % create neurons in subnet
pop % pop gids returned by Create
%% obtain array with GIDs of all excitatory neurons
/E_neurons E_net GetNodes def
/E_params <<
/tau_m Tau
/tau_syn_ex Tau_psc
/tau_syn_in Tau_psc
/E_L U0
/V_m U0
/V_reset Vreset
/V_th Theta
/C_m C
/t_ref_abs tau_ref_abs_e
/t_ref_tot tau_ref_abs_e
>> def
(Configuring excitatory neuron parameters.) =
E_neurons E_params initNeurons
[0] ChangeSubnet % return to full network
/I_net /subnet Create def % create subnet
I_net ChangeSubnet % enter subnet
/iaf_tum_2000 Ni Create % create neurons in subnet
pop % pop gids returned by Create
% obtain array with GIDs of all excitatory neurons
/I_neurons I_net GetNodes def
/I_params <<
/tau_m Tau
/tau_syn_ex Tau_psc
/tau_syn_in Tau_psc
/E_L U0
/V_m U0
/V_reset Vreset
/V_th Theta
/C_m C
/t_ref_abs tau_ref_abs_i
/t_ref_tot tau_ref_abs_i
>> def
(Configuring inhibitory neuron parameters.) =
I_neurons I_params initNeurons
end % userdict
} def
%%
%% connect randomly chosen neurons from population [sources] to target neuron
%%
%% N_conn sources target A_mean Tau_rec_mean Tau_fac_mean U_mean U_min U_max connectIncoming
%%
/connectIncoming
{
<< >> begin
/U_max Set
/U_min Set
/U_mean Set
/Tau_fac_mean Set
/Tau_rec_mean Set
/A_mean Set
/target Set
/sources Set
/N_conn Set
% draw weights from clipped Gaussian distribution
% with mean = A_mean, std = 0.5 A_mean
% clipping bounds: min = min(0.2 A_mean, 2.0 A_mean)
% max = max(0.2 A_mean, 2.0 A_mean)
normal_c
<<
/mu A_mean
/std A_mean 0.5 mul
/min A_mean dup 0.2 mul exch 2.0 mul min
/max A_mean dup 0.2 mul exch 2.0 mul max
>>
SetStatus
% draw weight for each connection
normal_c N_conn RandomArray /weights Set
% draw random values for tau_rec from left-clipped Gaussian distribution
normal_cl
<<
/mu Tau_rec_mean
/std Tau_rec_mean 0.5 mul
/min Tau_min
>>
SetStatus
% draw Tau_rec for each connection
normal_cl N_conn RandomArray /tau_recs Set
% draw random values for tau_fac from left-clipped Gaussian distribution
%% create a copy of normal_cl
Tau_fac_mean 0.0 gt
{
normal_cl
<<
/mu Tau_fac_mean
/std Tau_fac_mean 0.5 mul
/min Tau_min
>>
SetStatus
% draw Tau_fac for each connection
normal_cl N_conn RandomArray
}
{
[]
}
ifelse
/tau_facs Set
% draw random values for U from clipped Gaussian distribution
% create copy of normal_c
normal_c
<<
/mu U_mean
/std U_mean 0.5 mul
/min U_min
/max U_max
>>
SetStatus
% draw U for each connection
normal_c N_conn RandomArray /Us Set
%% create a dictionary containing the parameters for all synapses
%% and an initialization function InitSynapse, which will be called
%% by RandomConvergentConnect before each connection to be established.
/init_dict
<<
/weights weights
/tau_recs tau_recs
/tau_facs tau_facs
/Us Us
/facil Tau_fac_mean 0.0 gt
/InitSynapse
{ % call: i InitSynapse
/i Set
/tsodyks2_synapse
<<
/weight weights i get
/U Us i get
/tau_rec tau_recs i get
/tau_fac facil { tau_facs i get } { 0.0 } ifelse
>> SetDefaults
}
>> def
sources % source population [we pick from this]
target % target neuron
N_conn % number of source neurons to pick
init_dict % initialization dictionary
RandomConvergentConnect
end
} def
/connectNeurons
{
userdict begin
% Gaussian distribution, mean = 1, std = 1
myrng rdevdict /normal get CreateRDV /normal_tot Set
% Gaussian distribution left/right clipped
myrng rdevdict /normal_clipped get CreateRDV /normal_c Set
% Gaussian distribution, left clipped
myrng rdevdict /normal_clipped_left get CreateRDV /normal_cl Set
% set options of RandomConvergentConnect to forbid autapses/multapses
/RandomConvergentConnect
<<
/allow_multapses false
/allow_autapses false
>>
SetOptions
% use predefined tsodyks short term plasticity synapse for all
% subsequent connections
/Connect << /synapse_model /tsodyks2_synapse >> SetOptions
(Connecting inputs to excitatory neurons.) =
% loop through all exc neurons
E_neurons
{
/target Set
% number of source neurons from Gaussian distribution
normal_tot Random Indegree_std mul Indegree_mean add round int /Ctot Set
% 80 per cent excitatory incoming connections, 20 per cent inhibitory
Ctot 0.8 mul round int /CE Set
Ctot CE sub /CI Set
CE
E_neurons
target
A_ee
Tau_rec_ee
0.0 % =Tau_fac_ee
U_ee
U_ee_min
U_ee_max
connectIncoming
CI
I_neurons
target
A_ei
Tau_rec_ei
0.0 % =Tau_fac_ei
U_ee
U_ee_min
U_ee_max
connectIncoming
} bind % bind improves efficiency
forall
(Connecting inputs to inhibitory neurons.) =
% loop through all inh neurons
I_neurons
{
/target Set
% number of source neurons from Gaussian distribution
normal_tot Random 5.0 mul 50.0 add round int /Ctot Set
% 80 per cent exc. input, 20 per cent inh. input
Ctot 0.8 mul round int /CE Set
Ctot CE sub /CI Set
CI
I_neurons
target
A_ii
Tau_rec_ii
Tau_fac_ii
U_ii
U_ii_min
U_ii_max
connectIncoming
CE
E_neurons
target
A_ie
Tau_rec_ie
Tau_fac_ie
U_ii
U_ii_min
U_ii_max
connectIncoming
} bind % bind improves efficiency
forall
end
} def
/connectSpikeDetectors
{
userdict begin
[0] ChangeSubnet
% select standard synapse
% one detector would in principle be enough,
% but by recording the populations separately,
% we save us a lot of sorting work later
(Creating and connecting spike detector.) =
/spike_detector Create /sd Set
sd
<<
/withtime true % record time of spikes
/withgid true % record which neuron spiked
/to_file true % write results to a file
/to_memory false
>> SetStatus
% select the standard synapse model for subsequent connections
/Connect << /synapse_model /static_synapse >> SetOptions
% connect all exc neurons to it
E_neurons
{
% stack: neuronaddress
sd % stack: neuronaddress SDaddress
Connect % defaults
} bind forall
% connect all inh neurons to it
I_neurons
{
% stack: neuronaddress
sd % stack: neuronaddress SDaddress
Connect % defaults
} bind forall
end
} def
userdict begin
% global parameters
1 /local_num_threads Set
8 /total_num_virtual_procs Set
0.25 /h Set
/Ne 400 def % number of excitatory neurons
/Ni 100 def % number of inhibitory neurons
%/Pc 0.1 def % connection probability of 2 neurons
/Indegree_mean 50.0 def % mean number of incoming connections per neuron
/Indegree_std 5.0 def % std of incoming connections per neuron
% excitatory neurons
/Tau 30.0 def % membrane time constant of ex./inh. neurons in ms
/U0 0.0 def % resting potential of Vm for exc./inh.
/Theta 15.0 def % threshold for exc. neuron
/Vreset 13.5 def % reset potential of Vm after a spike
/R 1.0 def % membrane resistance 1 GOhm
/C Tau R div def % Tau [ms] / R [GOhm] = C [pF] in NEST units
/Tau_psc 3.0 def % time constant of PSC in ms (=Tau_inact=Tau_I)
% refractory times
/tau_ref_abs_e 3.0 def
/tau_ref_abs_i 2.0 def
% parameters of synapses
/Tau_rec_ee 800.0 def % recovery time e->e
/Tau_rec_ei Tau_rec_ee def % recovery time i->e
/Tau_rec_ii 100.0 def % recovery time i->i
/Tau_rec_ie Tau_rec_ii def % recovery time e->i
/Tau_fac_ee 0.0 def % facilitation time e->e
/Tau_fac_ei Tau_fac_ee def % facilitation time i->e
/Tau_fac_ii 1000.0 def % facilitation time i->i
/Tau_fac_ie Tau_fac_ii def % facilitation time e->i
/Tau_min 5.0 def % minimum value for Tau_rec/Tau_fac
/U_ee 0.5 def % facilitation parameter U e->e, i->e
/U_ee_min 0.1 def
/U_ee_max 0.9 def
/U_ii 0.04 def % facilitation parameter U i->i, e->i
/U_ii_min 0.001 def
/U_ii_max 0.07 def
/A 1.8 def
/A_ee A def % PSC weight e->e given in mV converted to pA
/A_ie A 4.0 mul def % PSC weight e->i given in mV converted to pA
/A_ii A neg 4 mul def % PSC weight i->i given in mV converted to pA
/A_ei A neg 3 mul def % PSC weight i->e given in mV converted to pA
/delay 0.25 def % synapse delay
/Tend 10000.0 def % simulation time
%% background dc input: mean = I0_dc, 2 std = deltaI
%% equally distributed around threshold Theta
/I0_dc Theta R div def
/deltaI 0.025 2 Theta mul mul R div def
% set resolution and limits on delays
% limits must be set BEFORE connecting any elements
[0]
<<
/resolution h
/local_num_threads local_num_threads
/overwrite_files true
% /total_num_virtual_procs total_num_virtual_procs
>> SetStatus
% all floeating numbers will be printed with 6 digits
cout 6 setprecision
% create one single random number generator
rngdict /knuthlfg get 238 CreateRNG /myrng Set
% normal distribution to draw several quantities from
myrng rdevdict /normal get CreateRDV /normal_dv Set
% create specific synapse types syn_ee, syn_ie, syn_ei, syn_ii
createSynapseTypes
% create exc/inh neuron populations
createNeurons
% connect the neurons among each other
connectNeurons
% create and connect spike detectors
connectSpikeDetectors
Tend Simulate
end