/
stdp_nn_restr_symm_synapse.nestml
100 lines (78 loc) · 4.27 KB
/
stdp_nn_restr_symm_synapse.nestml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
Synapse type for spike-timing dependent plasticity with restricted symmetric nearest-neighbour spike pairing scheme
###################################################################################################################
Description
+++++++++++
stdp_nn_restr_synapse is a connector to create synapses with spike time
dependent plasticity with the restricted symmetric nearest-neighbour spike
pairing scheme (fig. 7C in [1]_).
When a presynaptic spike occurs, it is taken into account in the depression
part of the STDP weight change rule with the nearest preceding postsynaptic
one, but only if the latter occured not earlier than the previous presynaptic
one. When a postsynaptic spike occurs, it is accounted in the facilitation
rule with the nearest preceding presynaptic one, but only if the latter
occured not earlier than the previous postsynaptic one. So, a spike can
participate neither in two depression pairs nor in two potentiation pairs.
The pairs exactly coinciding (so that presynaptic_spike == postsynaptic_spike
+ dendritic_delay), leading to zero delta_t, are discarded. In this case the
concerned pre/postsynaptic spike is paired with the second latest preceding
post/presynaptic one (for example, pre=={10 ms; 20 ms} and post=={20 ms} will
result in a potentiation pair 20-to-10).
The implementation relies on an additional variable - the postsynaptic
eligibility trace [1]_ (implemented on the postsynaptic neuron side). It
decays exponentially with the time constant tau_minus and increases to 1 on
a post-spike occurrence (instead of increasing by 1 as in stdp_synapse).
.. figure:: https://raw.githubusercontent.com/nest/nestml/master/doc/fig/stdp-nearest-neighbour.png
Figure 7 from Morrison, Diesmann and Gerstner
Original caption:
Phenomenological models of synaptic plasticity based on spike timing", Biological Cybernetics 98 (2008). "Examples of nearest neighbor spike pairing schemes for a pre-synaptic neuron j and a postsynaptic neuron i. In each case, the dark gray indicate which pairings contribute toward depression of a synapse, and light gray indicate which pairings contribute toward potentiation. **(a)** Symmetric interpretation: each presynaptic spike is paired with the last postsynaptic spike, and each postsynaptic spike is paired with the last presynaptic spike (Morrison et al. 2007). **(b)** Presynaptic centered interpretation: each presynaptic spike is paired with the last postsynaptic spike and the next postsynaptic spike (Izhikevich and Desai 2003; Burkitt et al. 2004: Model II). **(c)** Reduced symmetric interpretation: as in **(b)** but only for immediate pairings (Burkitt et al. 2004: Model IV, also implemented in hardware by Schemmel et al. 2006)
References
++++++++++
.. [1] Morrison A., Diesmann M., and Gerstner W. (2008) Phenomenological
models of synaptic plasticity based on spike timing,
Biol. Cybern. 98, 459--478
"""
model stdp_nn_restr_symm_synapse:
state:
w real = 1. # Synaptic weight
pre_trace real = 0.
post_trace real = 0.
pre_handled boolean = True
parameters:
d ms = 1 ms @nest::delay # Synaptic transmission delay
lambda real = .01
tau_tr_pre ms = 20 ms
tau_tr_post ms = 20 ms
alpha real = 1.
mu_plus real = 1.
mu_minus real = 1.
Wmax real = 100.
Wmin real = 0.
equations:
# nearest-neighbour trace of presynaptic neuron
pre_trace' = -pre_trace / tau_tr_pre
# nearest-neighbour trace of postsynaptic neuron
post_trace' = -post_trace / tau_tr_post
input:
pre_spikes <- spike
post_spikes <- spike
output:
spike
onReceive(post_spikes):
post_trace = 1
# potentiate synapse
if not pre_handled:
w_ real = Wmax * ( w / Wmax + (lambda * ( 1. - ( w / Wmax ) )**mu_plus * pre_trace ))
w = min(Wmax, w_)
pre_handled = True
onReceive(pre_spikes):
pre_trace = 1
# depress synapse
if pre_handled:
w_ real = Wmax * ( w / Wmax - ( alpha * lambda * ( w / Wmax )**mu_minus * post_trace ))
w = max(Wmin, w_)
pre_handled = False
# deliver spike to postsynaptic partner
emit_spike(w, d)
update:
integrate_odes()