23#ifndef STDP_DOPAMINE_SYNAPSE_H
24#define STDP_DOPAMINE_SYNAPSE_H
190template <
typename target
identifierT >
250 const std::vector< spikecounter >& dopa_spikes,
287 throw BadProperty(
"No volume transmitter has been assigned to the dopamine synapse." );
334template <
typename target
identifierT >
341template <
typename target
identifierT >
348 , dopa_spikes_idx_( 0 )
349 , t_last_update_( 0.0 )
350 , t_lastspike_( 0.0 )
354template <
typename target
identifierT >
360 ConnectionBase::get_status( d );
369template <
typename target
identifierT >
374 ConnectionBase::set_status( d, cm );
383 throw BadProperty(
"Kplus must be non-negative." );
387template <
typename target
identifierT >
392 if (
kernel().vp_manager.get_num_threads() > 1 )
397 "For multi-threading Connect doesn't support the setting "
398 "of parameter c in stdp_dopamine_synapse. "
399 "Use SetDefaults() or CopyModel()." );
404 "For multi-threading Connect doesn't support the setting "
405 "of parameter n in stdp_dopamine_synapse. "
406 "Use SetDefaults() or CopyModel()." );
411template <
typename target
identifierT >
416 double minus_dt = dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - dopa_spikes[ dopa_spikes_idx_ + 1 ].spike_time_;
418 n_ = n_ * std::exp( minus_dt / cp.
tau_n_ ) + dopa_spikes[ dopa_spikes_idx_ ].multiplicity_ / cp.
tau_n_;
421template <
typename target
identifierT >
434 if ( weight_ < cp.
Wmin_ )
438 if ( weight_ > cp.
Wmax_ )
444template <
typename target
identifierT >
453 if ( ( dopa_spikes.size() > dopa_spikes_idx_ + 1 )
454 and ( t1 - dopa_spikes[ dopa_spikes_idx_ + 1 ].spike_time_ > -1.0 *
kernel().connection_manager.get_stdp_eps() ) )
461 n_ * std::exp( ( dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - t0 ) / cp.
tau_n_ );
462 update_weight_( c_, n0, t0 - dopa_spikes[ dopa_spikes_idx_ + 1 ].spike_time_, cp );
463 update_dopamine_( dopa_spikes, cp );
467 while ( ( dopa_spikes.size() > dopa_spikes_idx_ + 1 )
468 and ( t1 - dopa_spikes[ dopa_spikes_idx_ + 1 ].spike_time_ > -1.0 *
kernel().connection_manager.get_stdp_eps() ) )
475 * std::exp( ( t0 - dopa_spikes[ dopa_spikes_idx_ ].spike_time_ ) / cp.
tau_c_ );
477 cd, n_, dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - dopa_spikes[ dopa_spikes_idx_ + 1 ].spike_time_, cp );
478 update_dopamine_( dopa_spikes, cp );
484 cd = c_ * std::exp( ( t0 - dopa_spikes[ dopa_spikes_idx_ ].spike_time_ ) / cp.
tau_c_ );
485 update_weight_( cd, n_, dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - t1, cp );
493 n_ * std::exp( ( dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - t0 ) / cp.
tau_n_ );
494 update_weight_( c_, n0, t0 - t1, cp );
498 c_ = c_ * std::exp( ( t0 - t1 ) / cp.
tau_c_ );
501template <
typename target
identifierT >
508template <
typename target
identifierT >
520template <
typename target
identifierT >
524 Node* target = get_target( t );
527 double dendritic_delay = get_delay();
529 double t_spike = e.get_stamp().get_ms();
536 std::deque< histentry >::iterator start;
537 std::deque< histentry >::iterator finish;
538 target->get_history( t_last_update_ - dendritic_delay, t_spike - dendritic_delay, &start, &finish );
541 double t0 = t_last_update_;
543 while ( start != finish )
545 process_dopa_spikes_( dopa_spikes, t0, start->t_ + dendritic_delay, cp );
546 t0 = start->t_ + dendritic_delay;
547 minus_dt = t_last_update_ - t0;
550 if ( t_spike - start->t_ >
kernel().connection_manager.get_stdp_eps() )
552 facilitate_( Kplus_ * std::exp( minus_dt / cp.
tau_plus_ ), cp );
558 process_dopa_spikes_( dopa_spikes, t0, t_spike, cp );
559 depress_( target->get_K_value( t_spike - dendritic_delay ), cp );
561 e.set_receiver( *target );
562 e.set_weight( weight_ );
563 e.set_delay_steps( get_delay_steps() );
564 e.set_rport( get_rport() );
567 Kplus_ = Kplus_ * std::exp( ( t_last_update_ - t_spike ) / cp.
tau_plus_ ) + 1.0;
568 t_last_update_ = t_spike;
569 t_lastspike_ = t_spike;
574template <
typename target
identifierT >
577 const std::vector< spikecounter >& dopa_spikes,
586 double dendritic_delay = get_delay();
590 std::deque< histentry >::iterator start;
591 std::deque< histentry >::iterator finish;
592 get_target( t )->get_history( t_last_update_ - dendritic_delay, t_trig - dendritic_delay, &start, &finish );
595 double t0 = t_last_update_;
597 while ( start != finish )
599 process_dopa_spikes_( dopa_spikes, t0, start->t_ + dendritic_delay, cp );
600 t0 = start->t_ + dendritic_delay;
601 minus_dt = t_last_update_ - t0;
602 facilitate_( Kplus_ * std::exp( minus_dt / cp.
tau_plus_ ), cp );
609 process_dopa_spikes_( dopa_spikes, t0, t_trig, cp );
610 n_ = n_ * std::exp( ( dopa_spikes[ dopa_spikes_idx_ ].spike_time_ - t_trig ) / cp.
tau_n_ );
611 Kplus_ = Kplus_ * std::exp( ( t_last_update_ - t_trig ) / cp.
tau_plus_ );
613 t_last_update_ = t_trig;
614 dopa_spikes_idx_ = 0;
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
bool known(const std::string &key) const
Check whether there exists a value with specified key in the dictionary.
Definition dictionary.h:677
Exception to be thrown if a status parameter is incomplete or inconsistent.
Definition exceptions.h:680
Class containing the common properties for all connections of a certain type.
Definition common_synapse_properties.h:50
Base class for dummy nodes used in connection testing.
Definition connection.h:67
Base class for representing connections.
Definition connection.h:110
void check_connection_(Node &dummy_target, Node &source, Node &target, const size_t receptor_type)
This function calls check_connection() on the sender to check if the receiver accepts the event type ...
Definition connection.h:319
long get_delay_steps() const
Return the delay of the connection in steps.
Definition connection.h:181
Node * get_target(const size_t tid) const
Definition connection.h:239
size_t get_rport() const
Definition connection.h:244
double get_delay() const
Return the delay of the connection in ms.
Definition connection.h:172
Definition connector_model.h:69
Encapsulate information sent between nodes.
Definition event.h:103
Base class for all NEST network objects.
Definition node.h:99
virtual void register_stdp_connection(double, double)
Register a STDP connection.
Definition node.cpp:211
size_t get_node_id() const
Return global Network ID.
Definition node.h:1200
Exception to be thrown if a feature is unavailable.
Definition exceptions.h:108
Class containing the common properties for all synapses of type dopamine connection.
Definition stdp_dopamine_synapse.h:140
double tau_n_
Definition stdp_dopamine_synapse.h:165
double A_plus_
Definition stdp_dopamine_synapse.h:161
volume_transmitter * volume_transmitter_
Definition stdp_dopamine_synapse.h:160
double b_
Definition stdp_dopamine_synapse.h:166
void get_status(Dictionary &d) const
Get all properties and put them into a dictionary.
Definition stdp_dopamine_synapse.cpp:60
long get_vt_node_id() const
Definition stdp_dopamine_synapse.h:172
double Wmin_
Definition stdp_dopamine_synapse.h:167
double A_minus_
Definition stdp_dopamine_synapse.h:162
void set_status(const Dictionary &d, ConnectorModel &cm)
Set properties from the values given in dictionary.
Definition stdp_dopamine_synapse.cpp:76
double tau_plus_
Definition stdp_dopamine_synapse.h:163
double tau_c_
Definition stdp_dopamine_synapse.h:164
double Wmax_
Definition stdp_dopamine_synapse.h:168
STDPDopaCommonProperties()
Default constructor.
Definition stdp_dopamine_synapse.cpp:45
Event for spike information.
Definition event.h:418
Definition stdp_dopamine_synapse.h:255
size_t handles_test_event(SpikeEvent &, size_t) override
Check if the node can handle a particular event and receptor type.
Definition stdp_dopamine_synapse.h:261
Definition stdp_dopamine_synapse.h:192
stdp_dopamine_synapse(const stdp_dopamine_synapse &)=default
Copy constructor from a property object.
double n_
Definition stdp_dopamine_synapse.h:320
void facilitate_(double kplus, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:503
void update_weight_(double c0, double n0, double minus_dt, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:423
void process_dopa_spikes_(const std::vector< spikecounter > &dopa_spikes, double t0, double t1, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:446
void trigger_update_weight(size_t t, const std::vector< spikecounter > &dopa_spikes, double t_trig, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:576
Connection< targetidentifierT > ConnectionBase
Definition stdp_dopamine_synapse.h:196
stdp_dopamine_synapse()
Default Constructor.
Definition stdp_dopamine_synapse.h:342
double t_lastspike_
Definition stdp_dopamine_synapse.h:331
void update_dopamine_(const std::vector< spikecounter > &dopa_spikes, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:413
void depress_(double kminus, const STDPDopaCommonProperties &cp)
Definition stdp_dopamine_synapse.h:510
static constexpr ConnectionModelProperties properties
Definition stdp_dopamine_synapse.h:198
double get_delay() const
Return the delay of the connection in ms.
Definition connection.h:172
void get_status(Dictionary &d) const
Get all properties of this connection and put them into a dictionary.
Definition stdp_dopamine_synapse.h:356
void check_connection(Node &s, Node &t, size_t receptor_type, const CommonPropertiesType &cp)
Definition stdp_dopamine_synapse.h:283
void check_synapse_params(const Dictionary &d) const
Checks to see if illegal parameters are given in syn_spec.
Definition stdp_dopamine_synapse.h:389
size_t dopa_spikes_idx_
Definition stdp_dopamine_synapse.h:325
void set_weight(double w)
Definition stdp_dopamine_synapse.h:297
double t_last_update_
Definition stdp_dopamine_synapse.h:329
void set_status(const Dictionary &d, ConnectorModel &cm)
Set properties of this connection from the values given in dictionary.
Definition stdp_dopamine_synapse.h:371
double Kplus_
Definition stdp_dopamine_synapse.h:318
bool send(Event &e, size_t t, const STDPDopaCommonProperties &cp)
Send an event to the receiver of this connection.
Definition stdp_dopamine_synapse.h:522
double weight_
Definition stdp_dopamine_synapse.h:317
double c_
Definition stdp_dopamine_synapse.h:319
STDPDopaCommonProperties CommonPropertiesType
Definition stdp_dopamine_synapse.h:195
stdp_dopamine_synapse & operator=(const stdp_dopamine_synapse &)=default
Definition volume_transmitter.h:114
const std::vector< spikecounter > & deliver_spikes()
Definition volume_transmitter.h:224
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
const std::string Kplus("Kplus")
const std::string weight("weight")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
void register_stdp_dopamine_synapse(const std::string &name)
Class representing an stdp_dopamine_synapse with homogeneous parameters, i.e.
Definition stdp_dopamine_synapse.cpp:36
KernelManager & kernel()
Definition kernel_manager.h:311
ConnectionModelProperties
Definition connector_model.h:49
constexpr size_t invalid_port
Value for invalid connection port number.
Definition nest_types.h:141
double expm1(double x)
Definition numerics.h:44