I am trying to use the new Synapses class with clock-driven update. During my trials, I often find that the error 'The static variables are referring to each other', while my dependency graph does not seem to have cycles.
The simplest example I could find is when intermediary variables are added (computing independently two variables a and b, and writing c=a+b, instead of building directly c). Such intermediary variables are not problematic at all in equations that are fed into the NeuronGroup class, which should have the same requirements as the Synapses class for the equations definition if I understood well.
Here is the example code. To get the mistake, the indicated lines should be commented:
from brian import *
# ######################################################################################
# Defining neuron/synapse model parameters
# ######################################################################################
V_t = -50 * mV
V_r = -55 * mV
V_L = -70 * mV
C_m = 0.5 * nF
g_m = 25 * nS
V_E= 0 * mV
w = 2.1
inc = 1
tau_AMPA = 2 * ms
g_AMPA = 0.104 * nS
g_NMDA = 0.327 * nS
tau_NMDA_rise = 2 * ms
tau_NMDA_decay = 100 * ms
inv_alpha = 2 * ms
C_Mg2_times_constant = (1/3.57)
factor_in_exp_NMDA=0.062 * (mvolt**(-1))
# ######################################################################################
# Defining neuron model equation
# ######################################################################################
eqs = '''
dV/dt = (-1/C_m)*((g_m)*(V-V_L) + I_tot) : volt
I_tot : amp
'''
# ######################################################################################
# Defining synapse model equation
# ######################################################################################
# the following code, with intermediary variables, does not work: Gives the error raise ReferenceError, "The static variables are referring to each other"
eqs_syn = '''
I_T=I_AMPA+I_NMDA : amp
I_NMDA=(g_NMDA*(V_post-V_E)*w*s_NMDA)/(1+C_Mg2_times_constant*(exp(-V_post*factor_in_exp_NMDA))) : amp
ds_NMDA/dt=-(1/tau_NMDA_decay)*s_NMDA+(1/inv_alpha)*x*(1-s_NMDA) : 1
dx/dt=-(1/tau_NMDA_rise)*x : 1
I_AMPA=s_AMPA*w*g_AMPA*(V_post-V_E) : amp
ds_AMPA/dt=(-1/tau_AMPA)*s_AMPA : 1
'''
# the following code, without intermediary variables, works ; the 8 following lines should be commented to get the error message
eqs_syn = '''
I_T=s_AMPA*w*g_AMPA*(V_post-V_E)+(g_NMDA*w*(V_post-V_E)*w*s_NMDA)/(1+C_Mg2_times_constant*(exp(-V_post*factor_in_exp_NMDA))) : amp
ds_NMDA/dt=-(1/tau_NMDA_decay)*s_NMDA+(1/inv_alpha)*x*(1-s_NMDA) : 1
dx/dt=-(1/tau_NMDA_rise)*x : 1
ds_AMPA/dt=(-1/tau_AMPA)*s_AMPA : 1
'''
# ######################################################################################
# Creating the post-synaptic neuron
# ######################################################################################
neuron_post = NeuronGroup(1,model=eqs, threshold=V_t, reset=V_r)
# ######################################################################################
# Creating the pre-synaptic stimulation
# ######################################################################################
spiketimes=[(0,15*ms)]
inputs=SpikeGeneratorGroup(1,spiketimes)
# ######################################################################################
# Creating the synaptic connection between presynaptic input and post-synaptic neurons
# ######################################################################################
mix_Syn=Synapses(inputs, neuron_post, model = eqs_syn, pre='''x+=inc
s_AMPA+=inc''')
neuron_post.I_tot=mix_Syn.I_T
mix_Syn[0,0]=True
mix_Syn.delay= 0.5 * ms
# ######################################################################################
# Setting the initial values
# ######################################################################################
neuron_post.V = V_L
mix_Syn.I_T[0,0]=0
mix_Syn.s_NMDA[0,0]=0
mix_Syn.x[0,0]=0
mix_Syn.s_AMPA[0,0]=0
#with the code that does not work, we would also have:
#mix_Syn.I_NMDA[0,0]=0
#mix_Syn.I_AMPA[0,0]=0
# ######################################################################################
# Running
# ######################################################################################
run(1500 * ms)
Thanks for any help, I am currently stuck with this...