"""
Name: elif_psc_alpha_fast - Energy-based leaky integrate-and-fire neuron.
Description:
The dynamics are given by:
C_m dV_m/dt = g_L*(V-E_L) + I + I_syn_ex + I_syn_in
tau_e depsilon/dt = (1-epsilon/(alpha*epsilon_0))**3 + (V-E_f)/(E_d-E_f)
E_L = E_0 + (E_u - E_0)(1-epsilon/epsilon_0)
if v >= V_th:
V_m is set to V_reset
On each spike arrival, the membrane potential feels an alpha-shaped
current of the form:
I_syn = I_0 * t * exp(-t/tau_syn) / tau_syn.
Sends: SpikeEvent
Receives: SpikeEvent, CurrentEvent, DataLoggingRequest
FirstVersion: 2019
Author: Tanguy Fardet
"""
neuron elif_psc_alpha_fast:
state:
r integer = 0 # number of steps for refractory phase
V_m mV = E_0 # Membrane potential
epsilon real = alpha*epsilon_0 # Energy
end
parameters:
C_m pF = 100. pF # Membrane capacitance
g_L nS = 9. nS # leak conductance
E_0 mV = -65. mV # resting potential
E_u mV = -58. mV # upper potential
E_d mV = -50. mV # energy depletion potential
E_f mV = -60. mV # energy inflexion potential
epsilon_0 real = 0.5 # standard resting energy level
epsilon_c real = 0.2 # standard resting energy level
alpha real = 1. # energetic health
delta real = 0.1 # energy consumption per spike
tau_e ms = 1000. ms # time constant for energy production
I_e pA = 0. pA # Constant input current
V_th mV = -55. mV # Spike detection threshold (reset condition)
V_reset mV = -62. mV # Reset potential
tau_syn_ex ms = 0.2 ms # Synaptic Time Constant Excitatory Synapse
tau_syn_in ms = 2.0 ms # Synaptic Time Constant for Inhibitory Synapse
t_ref ms = 2.0 ms # Refractory period
end
internals:
RefractoryCounts integer = steps(t_ref) # refractory time in steps
invae real = 1./(alpha*epsilon_0)
inveps real = 1./epsilon_0
invEdEf 1/mV = 1./(E_d-E_f)
invte 1/ms = 1./tau_e
invCm 1/pF = 1./C_m
end
equations:
inline eps_bound real = max(epsilon, 0.) # non-negative energy
# synapses: alpha functions
kernel I_syn_in = (e/tau_syn_in) * t * exp(-t/tau_syn_in)
kernel I_syn_ex = (e/tau_syn_ex) * t * exp(-t/tau_syn_ex)
inline E_L mV = E_0 + (E_u - E_0)*(1 - eps_bound*inveps)
inline I_in pA = convolve(I_syn_in, spikesInh)
inline I_ex pA = convolve(I_syn_ex, spikesExc)
V_m' = (g_L*(E_L - V_m) + I_e + I_in + I_ex + currents) * invCm
epsilon' = ((1 - eps_bound*invae)*(1 - eps_bound*invae)*(1 - eps_bound*invae) - (V_m-E_f)*invEdEf) * invte
end
input:
spikesInh pA <- inhibitory spike
spikesExc pA <- excitatory spike
currents pA <- continuous
end
output: spike
update:
integrate_odes()
if epsilon < 0.:
epsilon = 0.
end
# refractoriness and threshold crossing
if r > 0: # is refractory?
r -= 1
V_m = V_reset
elif V_m >= V_th and epsilon > epsilon_c:
V_m = V_reset
epsilon -= delta
emit_spike()
r = RefractoryCounts
end
end
end