NEST main@caf0ae8
 
Loading...
Searching...
No Matches
eprop_iaf.h
Go to the documentation of this file.
1/*
2 * eprop_iaf.h
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#ifndef EPROP_IAF_H
24#define EPROP_IAF_H
25
26// nestkernel
27#include "connection.h"
30#include "eprop_synapse.h"
31#include "event.h"
32#include "nest_types.h"
33#include "ring_buffer.h"
35
36namespace nest
37{
38
39/* BeginUserDocs: neuron, e-prop plasticity, current-based, integrate-and-fire, Bellec
40
41Short description
42+++++++++++++++++
43
44Current-based leaky integrate-and-fire neuron model with delta-shaped
45postsynaptic currents for e-prop plasticity
46
47Description
48+++++++++++
49
50``eprop_iaf`` is an implementation of a leaky integrate-and-fire
51neuron model with delta-shaped postsynaptic currents used for eligibility
52propagation (e-prop) plasticity.
53
54E-prop plasticity was originally introduced and implemented in TensorFlow in :footcite:p:`Bellec2020`.
55
56.. note::
57 The neuron dynamics of the ``eprop_iaf`` model (excluding e-prop
58 plasticity) are similar to the neuron dynamics of the ``iaf_psc_delta`` model,
59 with minor differences, such as the propagator of the post-synaptic current
60 and the voltage reset upon a spike.
61
62The membrane voltage time course :math:`v_j^t` of the neuron :math:`j` is given by:
63
64.. math::
65 v_j^t &= \alpha v_j^{t-1} + \zeta \sum_{i \neq j} W_{ji}^\text{rec} z_i^{t-1}
66 + \zeta \sum_i W_{ji}^\text{in} x_i^t - z_j^{t-1} v_\text{th} \,, \\
67 \alpha &= e^{ -\frac{ \Delta t }{ \tau_\text{m} } } \,, \\
68 \zeta &=
69 \begin{cases}
70 1 \\
71 1 - \alpha
72 \end{cases} \,, \\
73
74where :math:`W_{ji}^\text{rec}` and :math:`W_{ji}^\text{in}` are the recurrent and
75input synaptic weight matrices, and :math:`z_i^{t-1}` is the recurrent presynaptic
76state variable, while :math:`x_i^t` represents the input at time :math:`t`.
77
78Descriptions of further parameters and variables can be found in the table below.
79
80The spike state variable is expressed by a Heaviside function:
81
82.. math::
83 z_j^t = H \left( v_j^t - v_\text{th} \right) \,. \\
84
85If the membrane voltage crosses the threshold voltage :math:`v_\text{th}`, a spike is
86emitted and the membrane voltage is reduced by :math:`v_\text{th}` in the next
87time step. After the time step of the spike emission, the neuron is not
88able to spike for an absolute refractory period :math:`t_\text{ref}`.
89
90An additional state variable and the corresponding differential equation
91represents a piecewise constant external current.
92
93See the documentation on the :doc:`iaf_psc_delta<../models/iaf_psc_delta/>` neuron model
94for more information on the integration of the subthreshold dynamics.
95
96The change of the synaptic weight is calculated from the gradient :math:`g^t` of
97the loss :math:`E^t` with respect to the synaptic weight :math:`W_{ji}`:
98:math:`\frac{ \text{d} E^t }{ \text{d} W_{ij} }`
99which depends on the presynaptic
100spikes :math:`z_i^{t-2}`, the surrogate gradient or pseudo-derivative
101of the spike state variable with respect to the postsynaptic membrane
102voltage :math:`\psi_j^{t-1}` (the product of which forms the eligibility
103trace :math:`e_{ji}^{t-1}`), and the learning signal :math:`L_j^t` emitted
104by the readout neurons.
105
106.. start_surrogate-gradient-functions
107
108Surrogate gradients help overcome the challenge of the spiking function's
109non-differentiability, facilitating the use of gradient-based learning
110techniques such as e-prop. The non-existent derivative of the spiking
111variable with respect to the membrane voltage,
112:math:`\frac{\partial z^t_j}{ \partial v^t_j}`, can be effectively
113replaced with a variety of surrogate gradient functions, as detailed in
114various studies (see, e.g., :footcite:p:`Neftci2019`). NEST currently provides four
115different surrogate gradient functions:
116
1171. A piecewise linear function used among others in :footcite:p:`Bellec2020`:
118
119.. math::
120 \psi_j^t = \frac{ \gamma }{ v_\text{th} } \text{max}
121 \left( 0, 1-\beta \left| \frac{ v_j^t - v_\text{th} }{ v_\text{th} }\right| \right) \,. \\
122
1232. An exponential function used in :footcite:p:`Shrestha2018`:
124
125.. math::
126 \psi_j^t = \gamma \exp \left( -\beta \left| v_j^t - v_\text{th} \right| \right) \,. \\
127
1283. The derivative of a fast sigmoid function used in :footcite:p:`Zenke2018`:
129
130.. math::
131 \psi_j^t = \gamma \left( 1 + \beta \left| v_j^t - v_\text{th} \right| \right)^2 \,. \\
132
1334. The derivative of an arctan function used in :footcite:p:`Fang2021`:
134
135.. math::
136 \psi_j^t = \frac{\gamma}{\pi} \frac{1}{ 1 + \left( \beta \pi \left( v_j^t - v_\text{th} \right) \right)^2 } \,. \\
137
138.. end_surrogate-gradient-functions
139
140In the interval between two presynaptic spikes, the gradient is calculated
141at each time step until the cutoff time point. This computation occurs over
142the time range:
143
144:math:`t \in \left[ t_\text{spk,prev}, \min \left( t_\text{spk,prev} + \Delta t_\text{c}, t_\text{spk,curr} \right)
145\right]`.
146
147Here, :math:`t_\text{spk,prev}` represents the time of the previous spike that
148passed the synapse, while :math:`t_\text{spk,curr}` is the time of the
149current spike, which triggers the application of the learning rule and the
150subsequent synaptic weight update. The cutoff :math:`\Delta t_\text{c}`
151defines the maximum allowable interval for integration between spikes.
152The expression for the gradient is given by:
153
154.. math::
155 \frac{ \text{d} E^t }{ \text{d} W_{ji} } &= L_j^t \bar{e}_{ji}^{t-1} \,, \\
156 e_{ji}^{t-1} &= \psi_j^{t-1} \bar{z}_i^{t-2} \,, \\
157
158The eligibility trace and the presynaptic spike trains are low-pass filtered
159with the following exponential kernels:
160
161.. math::
162 \bar{e}_{ji}^t &= \mathcal{F}_\kappa \left( e_{ji}^t \right)
163 = \kappa \bar{e}_{ji}^{t-1} + \left( 1 - \kappa \right) e_{ji}^t \,, \\
164 \bar{z}_i^t &= \mathcal{F}_\alpha \left( z_{i}^t \right)= \alpha \bar{z}_i^{t-1} + \zeta z_i^t \,. \\
165
166Furthermore, a firing rate regularization mechanism keeps the exponential moving average of the postsynaptic
167neuron's firing rate :math:`f_j^{\text{ema},t}` close to a target firing rate
168:math:`f^\text{target}`. The gradient :math:`g_\text{reg}^t` of the regularization loss :math:`E_\text{reg}^t`
169with respect to the synaptic weight :math:`W_{ji}` is given by:
170
171.. math::
172 \frac{ \text{d} E_\text{reg}^t }{ \text{d} W_{ji}}
173 &\approx c_\text{reg} \left( f^{\text{ema},t}_j - f^\text{target} \right) \bar{e}_{ji}^t \,, \\
174 f^{\text{ema},t}_j &= \mathcal{F}_{\kappa_\text{reg}} \left( \frac{z_j^t}{\Delta t} \right)
175 = \kappa_\text{reg} f^{\text{ema},t-1}_j + \left( 1 - \kappa_\text{reg} \right) \frac{z_j^t}{\Delta t} \,, \\
176
177where :math:`c_\text{reg}` is a constant scaling factor.
178
179The overall gradient is given by the addition of the two gradients.
180
181As a last step for every round in the loop over the time steps :math:`t`, the new weight is retrieved by feeding the
182current gradient :math:`g^t` to the optimizer (see :doc:`weight_optimizer<../models/weight_optimizer/>`
183for more information on the available optimizers):
184
185.. math::
186 w^t = \text{optimizer} \left( t, g^t, w^{t-1} \right) \,. \\
187
188After the loop has terminated, the filtered dynamic variables of e-prop are propagated from the end of the cutoff until
189the next spike:
190
191.. math::
192 p &= \text{max} \left( 0, t_\text{s}^{t} - \left( t_\text{s}^{t-1} + {\Delta t}_\text{c} \right) \right) \,, \\
193 \bar{e}_{ji}^{t+p} &= \bar{e}_{ji}^t \kappa^p \,, \\
194 \bar{z}_i^{t+p} &= \bar{z}_i^t \alpha^p \,. \\
195
196For more information on e-prop plasticity, see the documentation on the other e-prop models:
197
198 * :doc:`eprop_iaf_adapt<../models/eprop_iaf_adapt/>`
199 * :doc:`eprop_readout<../models/eprop_readout/>`
200 * :doc:`eprop_synapse<../models/eprop_synapse/>`
201 * :doc:`eprop_learning_signal_connection<../models/eprop_learning_signal_connection/>`
202
203Details on the event-based NEST implementation of e-prop can be found in :footcite:p:`KorcsakGorzo2025`.
204
205Parameters
206++++++++++
207
208The following parameters can be set in the status dictionary.
209
210=========================== ======= ======================= ================ ===================================
211**Neuron parameters**
212----------------------------------------------------------------------------------------------------------------
213Parameter Unit Math equivalent Default Description
214=========================== ======= ======================= ================ ===================================
215``C_m`` pF :math:`C_\text{m}` 250.0 Capacitance of the membrane
216``E_L`` mV :math:`E_\text{L}` -70.0 Leak / resting membrane potential
217``I_e`` pA :math:`I_\text{e}` 0.0 Constant external input current
218``t_ref`` ms :math:`t_\text{ref}` 2.0 Duration of the refractory period
219``tau_m`` ms :math:`\tau_\text{m}` 10.0 Time constant of the membrane
220``V_min`` mV :math:`v_\text{min}` negative maximum Absolute lower bound of the
221 value membrane voltage
222 representable by
223 ``double``
224 type in C++
225``V_th`` mV :math:`v_\text{th}` -55.0 Spike threshold voltage
226=========================== ======= ======================= ================ ===================================
227
228=============================== ======= =========================== ================== =========================
229**E-prop parameters**
230----------------------------------------------------------------------------------------------------------------
231Parameter Unit Math equivalent Default Description
232=============================== ======= =========================== ================== =========================
233``flush_event_send_interval`` ms maximum value Interval since previous
234 representable by event after which a flush
235 ``double`` type in event is sent
236 C++
237``c_reg`` :math:`c_\text{reg}` 0.0 Coefficient of firing
238 rate regularization
239``eprop_isi_trace_cutoff`` ms :math:`{\Delta t}_\text{c}` maximum value Cutoff for integration of
240 representable e-prop update between two
241 by ``double`` spikes
242 type in C++
243``f_target`` Hz :math:`f^\text{target}` 10.0 Target firing rate of
244 rate regularization
245``kappa`` :math:`\kappa` 0.97 Low-pass filter of the
246 eligibility trace
247``kappa_reg`` :math:`\kappa_\text{reg}` 0.97 Low-pass filter of the
248 firing rate for
249 regularization
250``surrogate_gradient_function`` :math:`\psi` "piecewise_linear" Surrogate gradient /
251 pseudo-derivative
252 function
253 ["piecewise_linear",
254 "exponential",
255 "fast_sigmoid_derivative"
256 , "arctan_derivative"]
257``surrogate_gradient_height`` :math:`\gamma` 0.3 Height scaling of
258 surrogate gradient /
259 pseudo-derivative of
260 membrane voltage
261``surrogate_gradient_width`` :math:`1/\beta` 1.0 Width scaling of
262 surrogate gradient /
263 pseudo-derivative of
264 membrane voltage
265=============================== ======= =========================== ================== =========================
266
267Recordables
268+++++++++++
269
270The following state variables evolve during simulation and can be recorded.
271
272================== ==== =============== ============= ========================
273**Neuron state variables and recordables**
274------------------------------------------------------------------------------
275State variable Unit Math equivalent Initial value Description
276================== ==== =============== ============= ========================
277``V_m`` mV :math:`v_j` -70.0 Membrane voltage
278================== ==== =============== ============= ========================
279
280====================== ==== =============== ============= =========================================
281**E-prop state variables and recordables**
282---------------------------------------------------------------------------------------------------
283State variable Unit Math equivalent Initial value Description
284====================== ==== =============== ============= =========================================
285``learning_signal`` pA :math:`L_j` 0.0 Learning signal
286``surrogate_gradient`` :math:`\psi_j` 0.0 Surrogate gradient / pseudo-derivative of
287 membrane voltage
288====================== ==== =============== ============= =========================================
289
290Usage
291+++++
292
293This model can only be used in combination with the other e-prop models
294and the network architecture requires specific wiring, input, and output.
295The usage is demonstrated in several
296:doc:`supervised regression and classification tasks <../auto_examples/eprop_plasticity/index>`
297reproducing among others the original proof-of-concept tasks in :footcite:p:`Bellec2020`.
298
299References
300++++++++++
301
302.. footbibliography::
303
304Sends
305+++++
306
307SpikeEvent
308
309Receives
310++++++++
311
312SpikeEvent, CurrentEvent, LearningSignalConnectionEvent, DataLoggingRequest
313
314See also
315++++++++
316
317Examples using this model
318+++++++++++++++++++++++++
319
320.. listexamples:: eprop_iaf
321
322EndUserDocs */
323
324void register_eprop_iaf( const std::string& name );
325
334{
335
336public:
338 eprop_iaf();
339
341 eprop_iaf( const eprop_iaf& );
342
343 using Node::handle;
345
346 size_t send_test_event( Node&, size_t, synindex, bool ) override;
347
348 void handle( SpikeEvent& ) override;
349 void handle( CurrentEvent& ) override;
350 void handle( LearningSignalConnectionEvent& ) override;
351 void handle( DataLoggingRequest& ) override;
352
353 size_t handles_test_event( SpikeEvent&, size_t ) override;
354 size_t handles_test_event( CurrentEvent&, size_t ) override;
355 size_t handles_test_event( LearningSignalConnectionEvent&, size_t ) override;
356 size_t handles_test_event( DataLoggingRequest&, size_t ) override;
357
358 void get_status( Dictionary& ) const override;
359 void set_status( const Dictionary& ) override;
360
361private:
362 void init_buffers_() override;
363 void pre_run_hook() override;
364
365 void update( Time const&, const long, const long ) override;
366
367 void compute_gradient( const long,
368 const long,
369 double&,
370 double&,
371 double&,
372 double&,
373 double&,
374 double&,
377 const bool,
378 const bool,
379 double&,
380 long&,
381 long& ) override;
382
383 long get_shift() const override;
384 bool is_eprop_recurrent_node() const override;
385
387 friend class RecordablesMap< eprop_iaf >;
388
390 friend class UniversalDataLogger< eprop_iaf >;
391
394 {
396 double C_m_;
397
399 double c_reg_;
400
402 double E_L_;
403
405 double f_target_;
406
408 double I_e_;
409
413
416
419
421 double t_ref_;
422
424 double tau_m_;
425
427 double V_min_;
428
430 double V_th_;
431
433 double kappa_;
434
437
439 Parameters_();
440
442 void get( Dictionary& ) const;
443
445 double set( const Dictionary&, Node* );
446 };
447
449 struct State_
450 {
453
455 long r_;
456
459
461 double i_in_;
462
464 double v_m_;
465
467 double z_;
468
470 double z_in_;
471
473 State_();
474
476 void get( Dictionary&, const Parameters_& ) const;
477
479 void set( const Dictionary&, const Parameters_&, double, Node* );
480 };
481
500
503 {
505 double P_v_m_;
506
508 double P_i_in_;
509
512 };
513
515 double
516 get_v_m_() const
517 {
518 return S_.v_m_ + P_.E_L_;
519 }
520
522 double
524 {
525 return S_.surrogate_gradient_;
526 }
527
529 double
531 {
532 return S_.learning_signal_;
533 }
534
535 // the order in which the structure instances are defined is important for speed
536
539
542
545
548
551};
552
553inline long
555{
556 return offset_gen_ + delay_in_rec_;
557}
558
559inline bool
561{
562 return true;
563}
564
565inline size_t
566eprop_iaf::send_test_event( Node& target, size_t receptor_type, synindex, bool )
567{
568 SpikeEvent e;
569 e.set_sender( *this );
570 return target.handles_test_event( e, receptor_type );
571}
572
573inline size_t
575{
576 if ( receptor_type != 0 )
577 {
578 throw UnknownReceptorType( receptor_type, get_name() );
579 }
580
581 return 0;
582}
583
584inline size_t
586{
587 if ( receptor_type != 0 )
588 {
589 throw UnknownReceptorType( receptor_type, get_name() );
590 }
591
592 return 0;
593}
594
595inline size_t
597{
598 if ( receptor_type != 0 )
599 {
600 throw UnknownReceptorType( receptor_type, get_name() );
601 }
602
603 return 0;
604}
605
606inline size_t
608{
609 if ( receptor_type != 0 )
610 {
611 throw UnknownReceptorType( receptor_type, get_name() );
612 }
613
614 return B_.logger_.connect_logging_device( dlr, recordablesMap_ );
615}
616
617inline void
619{
621 P_.get( d );
622 S_.get( d, P_ );
623 d[ names::recordables ] = recordablesMap_.get_list();
624}
625
626inline void
628{
630 // temporary copies in case of errors
631 Parameters_ ptmp = P_;
632 State_ stmp = S_;
633
634 // make sure that ptmp and stmp consistent - throw BadProperty if not
635 const double delta_EL = ptmp.set( d, this );
636 stmp.set( d, ptmp, delta_EL, this );
637
638 P_ = ptmp;
639 S_ = stmp;
640}
641
642} // namespace nest
643
644#endif // EPROP_IAF_H
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
Class containing the common properties for all connections of a certain type.
Definition common_synapse_properties.h:50
Event for electrical currents.
Definition event.h:569
Request data to be logged/logged data to be sent.
Definition event.h:636
Class implementing an intermediate archiving node model for recurrent node models supporting e-prop p...
Definition eprop_archiving_node_recurrent.h:43
void set_status(const Dictionary &d) override
Change properties of the node according to the entries in the dictionary.
Definition eprop_archiving_node_recurrent.h:286
void get_status(Dictionary &d) const override
Export properties of the node by setting entries in the status dictionary.
Definition eprop_archiving_node_recurrent.h:273
const long delay_in_rec_
Transmission delay from input to recurrent neurons.
Definition eprop_archiving_node.h:171
const long offset_gen_
Offset since generator signals start from time step 1.
Definition eprop_archiving_node.h:168
Event for learning signal connections.
Definition secondary_event.h:384
Base class for all NEST network objects.
Definition node.h:99
std::string get_name() const
Return class name.
Definition node.cpp:105
Map names of recordables to data access functions.
Definition recordables_map.h:61
Buffer Layout.
Definition ring_buffer.h:83
Event for spike information.
Definition event.h:418
Definition nest_time.h:135
Exception to be thrown if the specified receptor type does not exist in the node.
Definition exceptions.h:417
Base class implementing a weight optimizer model.
Definition weight_optimizer.h:238
Class implementing a LIF neuron model for e-prop plasticity with additional biological features.
Definition eprop_iaf.h:334
friend class UniversalDataLogger< eprop_iaf >
Logger for universal data supporting the data logging request / reply mechanism. Populated with a rec...
Definition eprop_iaf.h:390
size_t handles_test_event(SpikeEvent &, size_t) override
Check if the node can handle a particular event and receptor type.
Definition eprop_iaf.h:574
static RecordablesMap< eprop_iaf > recordablesMap_
Map storing a static set of recordables.
Definition eprop_iaf.h:550
void handle(SpikeEvent &) override
Handle incoming spike events.
Definition eprop_iaf.cpp:342
double get_surrogate_gradient_() const
Get the current value of the surrogate gradient.
Definition eprop_iaf.h:523
State_ S_
Structure of state variables.
Definition eprop_iaf.h:541
Variables_ V_
Structure of internal variables.
Definition eprop_iaf.h:544
void pre_run_hook() override
Re-calculate dependent parameters of the node.
Definition eprop_iaf.cpp:265
void init_buffers_() override
Configure persistent internal data structures.
Definition eprop_iaf.cpp:257
void set_status(const Dictionary &) override
Change properties of the node according to the entries in the dictionary.
Definition eprop_iaf.h:627
double get_learning_signal_() const
Get the current value of the learning signal.
Definition eprop_iaf.h:530
bool is_eprop_recurrent_node() const override
Checks if the node is part of the recurrent network and thus not a readout neuron.
Definition eprop_iaf.h:560
void compute_gradient(const long, const long, double &, double &, double &, double &, double &, double &, const CommonSynapseProperties &, WeightOptimizer *, const bool, const bool, double &, long &, long &) override
Compute gradient change for eprop synapses.
Definition eprop_iaf.cpp:380
double get_v_m_() const
Get the current value of the membrane voltage.
Definition eprop_iaf.h:516
size_t send_test_event(Node &, size_t, synindex, bool) override
Send an event to the receiving_node passed as an argument.
Definition eprop_iaf.h:566
void update(Time const &, const long, const long) override
Advance the state of the node in time through the given interval.
Definition eprop_iaf.cpp:286
Parameters_ P_
Structure of parameters.
Definition eprop_iaf.h:538
long get_shift() const override
Retrieves the temporal shift of the signal.
Definition eprop_iaf.h:554
Buffers_ B_
Structure of buffers.
Definition eprop_iaf.h:547
void get_status(Dictionary &) const override
Export properties of the node by setting entries in the status dictionary.
Definition eprop_iaf.h:618
eprop_iaf()
Default constructor.
Definition eprop_iaf.cpp:235
virtual size_t handles_test_event(SpikeEvent &, size_t receptor_type)
Check if the node can handle a particular event and receptor type.
Definition node.cpp:271
virtual void handle(SpikeEvent &e)
Handle incoming spike events.
Definition node.cpp:265
const std::string recordables("recordables")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
void register_eprop_iaf(const std::string &name)
Definition eprop_iaf.cpp:44
size_t synindex
For enumerations of synapse types.
Definition nest_types.h:115
Structure of buffers.
Definition eprop_iaf.h:484
RingBuffer currents_
Buffer for incoming currents.
Definition eprop_iaf.h:495
UniversalDataLogger< eprop_iaf > logger_
Logger for universal data.
Definition eprop_iaf.h:498
RingBuffer spikes_
Buffer for incoming spikes.
Definition eprop_iaf.h:492
Structure of parameters.
Definition eprop_iaf.h:394
double surrogate_gradient_width_
Width scaling of surrogate gradient / pseudo-derivative of membrane voltage.
Definition eprop_iaf.h:418
double c_reg_
Coefficient of firing rate regularization.
Definition eprop_iaf.h:399
double kappa_reg_
Low-pass filter of the firing rate for regularization.
Definition eprop_iaf.h:436
double V_th_
Spike threshold voltage relative to the leak membrane potential (mV).
Definition eprop_iaf.h:430
double I_e_
Constant external input current (pA).
Definition eprop_iaf.h:408
double C_m_
Capacitance of the membrane (pF).
Definition eprop_iaf.h:396
std::string surrogate_gradient_function_
Surrogate gradient / pseudo-derivative function of the membrane voltage ["piecewise_linear",...
Definition eprop_iaf.h:412
double set(const Dictionary &, Node *)
Set the parameters and throw errors in case of invalid values.
Definition eprop_iaf.cpp:132
void get(Dictionary &) const
Get the parameters and their values.
Definition eprop_iaf.cpp:113
double f_target_
Target firing rate of rate regularization (spikes/s).
Definition eprop_iaf.h:405
double tau_m_
Time constant of the membrane (ms).
Definition eprop_iaf.h:424
Parameters_()
Default constructor.
Definition eprop_iaf.cpp:69
double kappa_
Low-pass filter of the eligibility trace.
Definition eprop_iaf.h:433
double E_L_
Leak / resting membrane potential (mV).
Definition eprop_iaf.h:402
double t_ref_
Duration of the refractory period (ms).
Definition eprop_iaf.h:421
double surrogate_gradient_height_
Height scaling of surrogate gradient / pseudo-derivative of membrane voltage.
Definition eprop_iaf.h:415
double V_min_
Absolute lower bound of the membrane voltage relative to the leak membrane potential (mV).
Definition eprop_iaf.h:427
Structure of state variables.
Definition eprop_iaf.h:450
double z_
Binary spike state variable - 1.0 if the neuron has spiked in the previous time step and 0....
Definition eprop_iaf.h:467
double i_in_
Input current (pA).
Definition eprop_iaf.h:461
void set(const Dictionary &, const Parameters_ &, double, Node *)
Set the state variables.
Definition eprop_iaf.cpp:226
double z_in_
Binary input spike state variable - 1.0 if the neuron has spiked in the previous time step and 0....
Definition eprop_iaf.h:470
State_()
Default constructor.
Definition eprop_iaf.cpp:87
double surrogate_gradient_
Surrogate gradient / pseudo-derivative of the membrane voltage.
Definition eprop_iaf.h:458
void get(Dictionary &, const Parameters_ &) const
Get the state variables and their values.
Definition eprop_iaf.cpp:218
double v_m_
Membrane voltage relative to the leak membrane potential (mV).
Definition eprop_iaf.h:464
long r_
Number of remaining refractory steps.
Definition eprop_iaf.h:455
double learning_signal_
Learning signal. Sum of weighted error signals coming from the readout neurons.
Definition eprop_iaf.h:452
Structure of internal variables.
Definition eprop_iaf.h:503
long RefractoryCounts_
Total refractory steps.
Definition eprop_iaf.h:511
double P_i_in_
Propagator matrix entry for evolving the incoming currents.
Definition eprop_iaf.h:508
double P_v_m_
Propagator matrix entry for evolving the membrane voltage (mathematical symbol "alpha" in user docume...
Definition eprop_iaf.h:505