NEST main@caf0ae8
 
Loading...
Searching...
No Matches
amat2_psc_exp.h
Go to the documentation of this file.
1/*
2 * amat2_psc_exp.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
24#ifndef AMAT2_PSC_EXP_H
25#define AMAT2_PSC_EXP_H
26
27// Includes from nestkernel:
28#include "archiving_node.h"
29#include "connection.h"
30#include "event.h"
31#include "nest_types.h"
32#include "recordables_map.h"
33#include "ring_buffer.h"
35
36namespace nest
37{
38
39/* BeginUserDocs: neuron, integrate-and-fire, current-based, adaptation, hard threshold
40
41Short description
42+++++++++++++++++
43
44Non-resetting leaky integrate-and-fire neuron model with exponential
45PSCs and adaptive threshold
46
47Description
48+++++++++++
49
50``amat2_psc_exp`` is an implementation of a leaky integrate-and-fire model
51with exponential shaped postsynaptic currents (PSCs). Thus, postsynaptic
52currents have an infinitely short rise time.
53
54The threshold is lifted when the neuron is fired and then decreases in a
55fixed time scale toward a fixed level :footcite:p:`Kobayashi2009`.
56
57The threshold crossing is followed by a total refractory period
58during which the neuron is not allowed to fire, even if the membrane
59potential exceeds the threshold. The membrane potential is NOT reset,
60but continuously integrated.
61
62The linear subthreshold dynamics is integrated by the Exact
63Integration scheme :footcite:p:`Rotter1999`. The neuron dynamics is solved on the time
64grid given by the computation step size. Incoming as well as emitted
65spikes are forced to that grid.
66
67An additional state variable and the corresponding differential
68equation represents a piecewise constant external current.
69
70The general framework for the consistent formulation of systems with
71neuron like dynamics interacting by point events is described in
72:footcite:p:`Rotter1999`. A flow chart can be found in :footcite:p:`Diesmann2001`.
73
74The default parameter values for this model are different from the
75corresponding parameter values for ``mat2_psc_exp``. If identical
76parameters are used, and beta is 0, then this model shall behave
77exactly as mat2_psc_exp.
78
79The following state variables can be read out using a multimeter:
80
81=========== ==== ==================================
82 V_m mV Non-resetting membrane potential
83 V_th mV Two-timescale adaptive threshold
84=========== ==== ==================================
85
86See also :footcite:p:`Yamauchi2011`.
87
88Parameters
89++++++++++
90
91The following parameters can be set in the status dictionary:
92
93=========== ======= ===========================================================
94 C_m pF Capacity of the membrane
95 E_L mV Resting potential
96 tau_m ms Membrane time constant
97 tau_syn_ex ms Time constant of postsynaptic excitatory currents
98 tau_syn_in ms Time constant of postsynaptic inhibitory currents
99 t_ref ms Duration of absolute refractory period (no spiking)
100 V_m mV Membrane potential
101 I_e pA Constant input current
102 t_spike ms Point in time of last spike
103 tau_1 ms Short time constant of adaptive threshold [3, eqs 2-3]
104 tau_2 ms Long time constant of adaptive threshold [3, eqs 2-3]
105 alpha_1 mV Amplitude of short time threshold adaption [3, eqs 2-3]
106 alpha_2 mV Amplitude of long time threshold adaption [3, eqs 2-3]
107 tau_v ms Time constant of kernel for voltage-dependent threshold
108 component [3, eqs 16-17]
109 beta 1/ms Scaling coefficient for voltage-dependent threshold
110 component [3, eqs 16-17]
111 omega mV Resting spike threshold (absolute value, not
112 relative to E_L as in :footcite:p:`Kobayashi2009`)
113=========== ======= ===========================================================
114
115.. note::
116
117 - The time constants in the model must fulfill the following conditions:
118 - :math:`\tau_m != {\tau_{syn_{ex}}, \tau_{syn_{in}}}`
119 - :math:`\tau_v != {\tau_{syn_{ex}}, \tau_{syn_{in}}}`
120 - :math:`\tau_m != \tau_v`
121 This is required to avoid singularities in the numerics. This is a
122 problem of implementation only, not a principal problem of the model.
123
124 - Expect unstable numerics if time constants that are required to be
125 different are very close.
126
127 - :math:`\tau_m != \tau_{syn_{ex,in}}` is required by the current
128 implementation to avoid a degenerate case of the ODE describing the
129 model :footcite:p:`Rotter1999`. For very similar values, numerics will be unstable.
130
131 - Some parameter values given in Table 1 of :footcite:p:`Yamauchi2011` are incorrect. For
132 correct values, see Table 4 of :footcite:p:`Heiberg2018`.
133
134References
135++++++++++
136
137.. footbibliography::
138
139Sends
140+++++
141
142SpikeEvent
143
144Receives
145++++++++
146
147SpikeEvent, CurrentEvent, DataLoggingRequest
148
149Examples using this model
150+++++++++++++++++++++++++
151
152.. listexamples:: amat2_psc_exp
153
154EndUserDocs */
155
156void register_amat2_psc_exp( const std::string& name );
157
159{
160
161public:
164
170 using Node::handle;
172
173 size_t send_test_event( Node&, size_t, synindex, bool ) override;
174
175 size_t handles_test_event( SpikeEvent&, size_t ) override;
176 size_t handles_test_event( CurrentEvent&, size_t ) override;
177 size_t handles_test_event( DataLoggingRequest&, size_t ) override;
178
179 void handle( SpikeEvent& ) override;
180 void handle( CurrentEvent& ) override;
181 void handle( DataLoggingRequest& ) override;
182
183 void get_status( Dictionary& ) const override;
184 void set_status( const Dictionary& ) override;
185
186private:
187 void init_buffers_() override;
188 void pre_run_hook() override;
189 void update( Time const&, const long, const long ) override;
190
191 // The next two classes need to be friends to access private members
192 friend class RecordablesMap< amat2_psc_exp >;
193 friend class UniversalDataLogger< amat2_psc_exp >;
194
195 // ----------------------------------------------------------------
196
201 {
203 double Tau_;
204
206 double C_;
207
209 double tau_ref_;
210
212 double E_L_;
213
215 double I_e_;
216
218 double tau_ex_;
219
221 double tau_in_;
222
224 double tau_1_;
225 double tau_2_;
226
228 double alpha_1_;
229 double alpha_2_;
230
232 double beta_;
233
235 double tau_v_;
236
241 double omega_;
242
243 Parameters_();
244
245 void get( Dictionary& ) const;
246
250 double set( const Dictionary&, Node* node );
251 };
252
253 // ----------------------------------------------------------------
254
258 struct State_
259 {
260 // state variables
261 double i_0_;
262 double I_syn_ex_;
263 double I_syn_in_;
264 double V_m_;
265 double V_th_1_;
267 double V_th_2_;
269 double V_th_dv_;
271 double V_th_v_;
272
273 int r_;
274
275 State_();
276
277 void get( Dictionary&, const Parameters_& ) const;
278
284 void set( const Dictionary&, const Parameters_&, double, Node* );
285 };
286
287 // ----------------------------------------------------------------
288
305
306 // ----------------------------------------------------------------
307
312 {
313
319 // double PSCInitialValue_;
320
321 double P00_; // constant currents
322 double P11_;
323 double P22_;
324 double P30_;
325 double P31_;
326 double P32_;
327 double P33_;
328 double P44_;
329 double P55_;
330 double P60_;
331 double P61_;
332 double P62_;
333 double P63_;
334 double P66_;
335 double P70_;
336 double P71_;
337 double P72_;
338 double P73_;
339 double P76_;
340 double P77_;
341
343 };
344 // ----------------------------------------------------------------
345
347 inline double
348 get_V_m_() const
349 {
350 return S_.V_m_ + P_.E_L_;
351 }
352
353 inline double
354 get_V_th_() const
355 {
356 return P_.E_L_ + P_.omega_ + S_.V_th_1_ + S_.V_th_2_ + S_.V_th_v_;
357 }
358
359 inline double
361 {
362 return S_.V_th_v_;
363 }
364
365 inline double
367 {
368 return S_.I_syn_ex_;
369 }
370
371 inline double
373 {
374 return S_.I_syn_in_;
375 }
376
377 // ----------------------------------------------------------------
378
393};
394
395
396inline size_t
397amat2_psc_exp::send_test_event( Node& target, size_t receptor_type, synindex, bool )
398{
399 SpikeEvent e;
400 e.set_sender( *this );
401
402 return target.handles_test_event( e, receptor_type );
403}
404
405inline size_t
407{
408 if ( receptor_type != 0 )
409 {
410 throw UnknownReceptorType( receptor_type, get_name() );
411 }
412 return 0;
413}
414
415inline size_t
417{
418 if ( receptor_type != 0 )
419 {
420 throw UnknownReceptorType( receptor_type, get_name() );
421 }
422 return 0;
423}
424
425inline size_t
427{
428 if ( receptor_type != 0 )
429 {
430 throw UnknownReceptorType( receptor_type, get_name() );
431 }
432 return B_.logger_.connect_logging_device( dlr, recordablesMap_ );
433}
434
435inline void
437{
438 P_.get( d );
439 S_.get( d, P_ );
441
442 d[ names::recordables ] = recordablesMap_.get_list();
443}
444
445inline void
447{
448 Parameters_ ptmp = P_; // temporary copy in case of errors
449 const double delta_EL = ptmp.set( d, this ); // throws if BadProperty
450 State_ stmp = S_; // temporary copy in case of errors
451 stmp.set( d, ptmp, delta_EL, this ); // throws if BadProperty
452
453 // We now know that (ptmp, stmp) are consistent. We do not
454 // write them back to (P_, S_) before we are also sure that
455 // the properties to be set in the parent class are internally
456 // consistent.
458
459 // if we get here, temporaries contain consistent set of properties
460 P_ = ptmp;
461 S_ = stmp;
462}
463
464} // namespace
465
466#endif // AMAT2_PSC_EXP_H
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
A node which archives spike history for the purposes of spike-timing dependent plasticity (STDP)
Definition archiving_node.h:49
void get_status(Dictionary &d) const override
Export properties of the node by setting entries in the status dictionary.
Definition archiving_node.cpp:220
void set_status(const Dictionary &d) override
Change properties of the node according to the entries in the dictionary.
Definition archiving_node.cpp:236
Event for electrical currents.
Definition event.h:569
Request data to be logged/logged data to be sent.
Definition event.h:636
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
Definition amat2_psc_exp.h:159
double get_V_th_() const
Definition amat2_psc_exp.h:354
State_ S_
Definition amat2_psc_exp.h:386
void handle(SpikeEvent &) override
Handle incoming spike events.
Definition amat2_psc_exp.cpp:427
double get_I_syn_ex_() const
Definition amat2_psc_exp.h:366
size_t handles_test_event(SpikeEvent &, size_t) override
Check if the node can handle a particular event and receptor type.
Definition amat2_psc_exp.h:406
size_t send_test_event(Node &, size_t, synindex, bool) override
Send an event to the receiving_node passed as an argument.
Definition amat2_psc_exp.h:397
Parameters_ P_
Instances of private data structures for the different types of data pertaining to the model.
Definition amat2_psc_exp.h:385
static RecordablesMap< amat2_psc_exp > recordablesMap_
Mapping of recordables names to access functions.
Definition amat2_psc_exp.h:392
double get_V_m_() const
Read out state variables, used by UniversalDataLogger.
Definition amat2_psc_exp.h:348
Buffers_ B_
Definition amat2_psc_exp.h:388
amat2_psc_exp()
Definition amat2_psc_exp.cpp:228
double get_I_syn_in_() const
Definition amat2_psc_exp.h:372
double get_V_th_v_() const
Definition amat2_psc_exp.h:360
void get_status(Dictionary &) const override
Export properties of the node by setting entries in the status dictionary.
Definition amat2_psc_exp.h:436
void set_status(const Dictionary &) override
Change properties of the node according to the entries in the dictionary.
Definition amat2_psc_exp.h:446
Variables_ V_
Definition amat2_psc_exp.h:387
void pre_run_hook() override
Re-calculate dependent parameters of the node.
Definition amat2_psc_exp.cpp:262
void update(Time const &, const long, const long) override
Advance the state of the node in time through the given interval.
Definition amat2_psc_exp.cpp:366
friend class UniversalDataLogger< amat2_psc_exp >
Definition amat2_psc_exp.h:193
void init_buffers_() override
Configure persistent internal data structures.
Definition amat2_psc_exp.cpp:250
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
size_t synindex
For enumerations of synapse types.
Definition nest_types.h:115
void register_amat2_psc_exp(const std::string &name)
Definition amat2_psc_exp.cpp:46
Buffers of the model.
Definition amat2_psc_exp.h:293
RingBuffer currents_
Definition amat2_psc_exp.h:300
RingBuffer spikes_in_
Definition amat2_psc_exp.h:299
UniversalDataLogger< amat2_psc_exp > logger_
Logger for all analog data.
Definition amat2_psc_exp.h:303
RingBuffer spikes_ex_
buffers and sums up incoming spikes/currents
Definition amat2_psc_exp.h:298
Independent parameters of the model.
Definition amat2_psc_exp.h:201
double tau_ex_
Time constant of excitatory synaptic current in ms.
Definition amat2_psc_exp.h:218
double C_
Membrane capacitance in pF.
Definition amat2_psc_exp.h:206
double E_L_
Resting potential in mV.
Definition amat2_psc_exp.h:212
double tau_1_
Short and long time constant of adaptive threshold in ms.
Definition amat2_psc_exp.h:224
double tau_in_
Time constant of inhibitory synaptic current in ms.
Definition amat2_psc_exp.h:221
double omega_
Resting threshold in mV (relative to resting potential).
Definition amat2_psc_exp.h:241
void get(Dictionary &) const
Store current values in dictionary.
Definition amat2_psc_exp.cpp:109
double set(const Dictionary &, Node *node)
Set values from dictionary.
Definition amat2_psc_exp.cpp:128
double I_e_
External current in pA.
Definition amat2_psc_exp.h:215
double alpha_2_
Definition amat2_psc_exp.h:229
double alpha_1_
Amplitudes of threshold adaption in mV.
Definition amat2_psc_exp.h:228
Parameters_()
Sets default parameter values.
Definition amat2_psc_exp.cpp:71
double Tau_
Membrane time constant in ms.
Definition amat2_psc_exp.h:203
double tau_v_
Time-constant for voltage-dependent threshold component in ms.
Definition amat2_psc_exp.h:235
double tau_ref_
Refractory period in ms.
Definition amat2_psc_exp.h:209
double tau_2_
Definition amat2_psc_exp.h:225
double beta_
Scaling coefficient for voltage-dependent threshold component in 1/ms.
Definition amat2_psc_exp.h:232
State variables of the model.
Definition amat2_psc_exp.h:259
double V_th_2_
long time adaptive threshold (related to tau_2_), variable 5
Definition amat2_psc_exp.h:267
void get(Dictionary &, const Parameters_ &) const
Definition amat2_psc_exp.cpp:183
double V_th_1_
short time adaptive threshold (related to tau_1_), variable 4
Definition amat2_psc_exp.h:265
double V_th_v_
voltage dependent threshold, variable 7
Definition amat2_psc_exp.h:271
void set(const Dictionary &, const Parameters_ &, double, Node *)
Set values from dictionary.
Definition amat2_psc_exp.cpp:194
double V_th_dv_
derivative of voltage dependent threshold, variable 6
Definition amat2_psc_exp.h:269
double I_syn_ex_
postsynaptic current for exc. inputs, variable 1
Definition amat2_psc_exp.h:262
double I_syn_in_
postsynaptic current for inh. inputs, variable 2
Definition amat2_psc_exp.h:263
double V_m_
membrane potential, variable 3
Definition amat2_psc_exp.h:264
double i_0_
synaptic dc input current, variable 0
Definition amat2_psc_exp.h:261
State_()
Default initialization.
Definition amat2_psc_exp.cpp:91
int r_
total refractory counter (no spikes can be generated)
Definition amat2_psc_exp.h:273
Internal variables of the model.
Definition amat2_psc_exp.h:312
double P73_
Definition amat2_psc_exp.h:338
double P55_
Definition amat2_psc_exp.h:329
double P33_
Definition amat2_psc_exp.h:327
double P66_
Definition amat2_psc_exp.h:334
double P22_
Definition amat2_psc_exp.h:323
double P72_
Definition amat2_psc_exp.h:337
double P76_
Definition amat2_psc_exp.h:339
double P71_
Definition amat2_psc_exp.h:336
double P00_
Amplitude of the synaptic current.
Definition amat2_psc_exp.h:321
double P32_
Definition amat2_psc_exp.h:326
double P44_
Definition amat2_psc_exp.h:328
double P60_
Definition amat2_psc_exp.h:330
double P62_
Definition amat2_psc_exp.h:332
double P30_
Definition amat2_psc_exp.h:324
double P31_
Definition amat2_psc_exp.h:325
double P11_
Definition amat2_psc_exp.h:322
double P63_
Definition amat2_psc_exp.h:333
int RefractoryCountsTot_
Definition amat2_psc_exp.h:342
double P70_
Definition amat2_psc_exp.h:335
double P61_
Definition amat2_psc_exp.h:331
double P77_
Definition amat2_psc_exp.h:340