23#ifndef RATE_NEURON_OPN_IMPL_H
24#define RATE_NEURON_OPN_IMPL_H
52template <
class TNonlinearities >
60template <
class TNonlinearities >
65 , linear_summation_( true )
66 , mult_coupling_( false )
71template <
class TNonlinearities >
83template <
class TNonlinearities >
98template <
class TNonlinearities >
112 "rate_neuron_opn< TNonlinearities >::Parameters_::set",
113 "The parameter mean has been renamed to mu. Please use the new "
114 "name from now on." );
120 "rate_neuron_opn< TNonlinearities >::Parameters_::set",
121 "The parameter std has been renamed to sigma. Please use the new "
122 "name from now on." );
132 throw BadProperty(
"Noise parameter must not be negative." );
136template <
class TNonlinearities >
145template <
class TNonlinearities >
152template <
class TNonlinearities >
158template <
class TNonlinearities >
168template <
class TNonlinearities >
179template <
class TNonlinearities >
193template <
class TNonlinearities >
197 B_.delayed_rates_ex_.clear();
198 B_.delayed_rates_in_.clear();
202 B_.instant_rates_ex_.resize( buffer_size, 0.0 );
203 B_.instant_rates_in_.resize( buffer_size, 0.0 );
204 B_.last_y_values.resize( buffer_size, 0.0 );
208 for (
unsigned int i = 0; i < buffer_size; i++ )
217template <
class TNonlinearities >
226 V_.P1_ = std::exp( -h / P_.tau_ );
230 V_.output_noise_factor_ = std::sqrt( P_.tau_ / h );
237template <
class TNonlinearities >
242 const bool called_from_wfr_update )
246 bool wfr_tol_exceeded =
false;
249 std::vector< double > new_rates( buffer_size, 0.0 );
251 for (
long lag = from; lag < to; ++lag )
254 S_.noise_ = P_.sigma_ * B_.random_numbers[ lag ];
256 S_.noisy_rate_ = S_.rate_ + V_.output_noise_factor_ * S_.noise_;
258 new_rates[ lag ] = S_.noisy_rate_;
260 S_.rate_ = V_.P1_ * S_.rate_ + V_.P2_ * P_.mu_;
262 double delayed_rates_in = 0;
263 double delayed_rates_ex = 0;
264 if ( called_from_wfr_update )
267 delayed_rates_in = B_.delayed_rates_in_.get_value_wfr_update( lag );
268 delayed_rates_ex = B_.delayed_rates_ex_.get_value_wfr_update( lag );
273 delayed_rates_in = B_.delayed_rates_in_.get_value( lag );
274 delayed_rates_ex = B_.delayed_rates_ex_.get_value( lag );
276 double instant_rates_in = B_.instant_rates_in_[ lag ];
277 double instant_rates_ex = B_.instant_rates_ex_[ lag ];
280 if ( P_.mult_coupling_ )
282 H_ex = nonlinearities_.mult_coupling_ex( new_rates[ lag ] );
283 H_in = nonlinearities_.mult_coupling_in( new_rates[ lag ] );
286 if ( P_.linear_summation_ )
292 if ( P_.mult_coupling_ )
294 S_.rate_ += V_.P2_ * H_ex * nonlinearities_.input( delayed_rates_ex + instant_rates_ex );
295 S_.rate_ += V_.P2_ * H_in * nonlinearities_.input( delayed_rates_in + instant_rates_in );
300 V_.P2_ * nonlinearities_.input( delayed_rates_ex + instant_rates_ex + delayed_rates_in + instant_rates_in );
307 S_.rate_ += V_.P2_ * H_ex * ( delayed_rates_ex + instant_rates_ex );
308 S_.rate_ += V_.P2_ * H_in * ( delayed_rates_in + instant_rates_in );
311 if ( called_from_wfr_update )
314 wfr_tol_exceeded = wfr_tol_exceeded or fabs( S_.rate_ - B_.last_y_values[ lag ] ) > wfr_tol;
316 B_.last_y_values[ lag ] = S_.rate_;
321 B_.logger_.record_data( origin.get_steps() + lag );
325 if ( not called_from_wfr_update )
334 std::vector< double >( buffer_size, 0.0 ).swap( B_.last_y_values );
337 for (
long temp = from; temp < to; ++temp )
339 new_rates[ temp ] = S_.noisy_rate_;
344 for (
unsigned int i = 0; i < buffer_size; i++ )
356 std::vector< double >( buffer_size, 0.0 ).swap( B_.instant_rates_ex_ );
357 std::vector< double >( buffer_size, 0.0 ).swap( B_.instant_rates_in_ );
359 return wfr_tol_exceeded;
363template <
class TNonlinearities >
367 const double weight = e.get_weight();
370 std::vector< unsigned int >::iterator it = e.begin();
372 while ( it != e.end() )
374 if ( P_.linear_summation_ )
378 B_.instant_rates_ex_[ i ] += weight * e.get_coeffvalue( it );
382 B_.instant_rates_in_[ i ] += weight * e.get_coeffvalue( it );
389 B_.instant_rates_ex_[ i ] += weight * nonlinearities_.input( e.get_coeffvalue( it ) );
393 B_.instant_rates_in_[ i ] += weight * nonlinearities_.input( e.get_coeffvalue( it ) );
400template <
class TNonlinearities >
404 const double weight = e.get_weight();
408 std::vector< unsigned int >::iterator it = e.begin();
410 while ( it != e.end() )
412 if ( P_.linear_summation_ )
416 B_.delayed_rates_ex_.add_value( delay + i, weight * e.get_coeffvalue( it ) );
420 B_.delayed_rates_in_.add_value( delay + i, weight * e.get_coeffvalue( it ) );
427 B_.delayed_rates_ex_.add_value( delay + i, weight * nonlinearities_.input( e.get_coeffvalue( it ) ) );
431 B_.delayed_rates_in_.add_value( delay + i, weight * nonlinearities_.input( e.get_coeffvalue( it ) ) );
438template <
class TNonlinearities >
442 B_.logger_.handle( e );
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 clear_history()
Clear spike history.
Definition archiving_node.cpp:269
Exception to be thrown if a status parameter is incomplete or inconsistent.
Definition exceptions.h:680
long get_min_delay() const
Return minimal connection delay, which is precomputed by update_delay_extrema_().
Definition connection_manager.h:728
Request data to be logged/logged data to be sent.
Definition event.h:636
void set_coeffarray(std::vector< DataType > &ca)
Definition secondary_event.h:224
Event for rate model connections with delay.
Definition secondary_event.h:331
void send_secondary(Node &source, SecondaryEvent &e)
Send a secondary event remote.
Definition event_delivery_manager_impl.h:138
Event for rate model connections without delay.
Definition secondary_event.h:315
Base class for all NEST network objects.
Definition node.h:99
void set_node_uses_wfr(const bool)
Sets node_uses_wfr_ member variable (to be able to set it to "true" for any class derived from Node)
Definition node.h:1158
double get_wfr_tol() const
Get the convergence tolerance of the waveform relaxation method.
Definition simulation_manager.h:331
Definition nest_time.h:135
static Time get_resolution()
Definition nest_time.h:325
double get_ms() const
Definition nest_time.h:490
Definition rate_neuron_opn.h:113
State_ S_
Definition rate_neuron_opn.h:289
Parameters_ P_
Definition rate_neuron_opn.h:288
Buffers_ B_
Definition rate_neuron_opn.h:291
rate_neuron_opn()
Definition rate_neuron_opn_impl.h:169
void handle(InstantaneousRateConnectionEvent &) override
Handler for rate neuron events.
Definition rate_neuron_opn_impl.h:365
bool update_(Time const &, const long, const long, const bool)
This is the actual update function.
Definition rate_neuron_opn_impl.h:239
void pre_run_hook() override
Re-calculate dependent parameters of the node.
Definition rate_neuron_opn_impl.h:219
static RecordablesMap< rate_neuron_opn< TNonlinearities > > recordablesMap_
Mapping of recordables names to access functions.
Definition rate_neuron_opn.h:294
void init_buffers_() override
Configure persistent internal data structures.
Definition rate_neuron_opn_impl.h:195
ConnectionManager connection_manager
Definition kernel_manager.h:239
EventDeliveryManager event_delivery_manager
Definition kernel_manager.h:241
SimulationManager simulation_manager
Definition kernel_manager.h:237
#define LOG(s, fctn, msg)
Definition logging.h:29
const std::string std("std")
const std::string tau("tau")
const std::string mult_coupling("mult_coupling")
const std::string noisy_rate("noisy_rate")
const std::string linear_summation("linear_summation")
const std::string rate("rate")
const std::string mean("mean")
const std::string noise("noise")
const std::string sigma("sigma")
const std::string mu("mu")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
RngPtr get_vp_specific_rng(size_t tid)
Definition kernel_manager.h:298
KernelManager & kernel()
Definition kernel_manager.h:311
bool update_value_param(Dictionary const &d, const std::string &key, T &value, nest::Node *node)
Obtain value from parameter dictionary including evaluation of random or spatial parameters.
Definition dict_util.h:42
const double nan
Definition numerics.cpp:36
double expm1(double x)
Definition numerics.h:44
Buffers of the model.
Definition rate_neuron_opn.h:229
Buffers_(rate_neuron_opn &)
Definition rate_neuron_opn_impl.h:153
void get(Dictionary &) const
Store current values in dictionary.
Definition rate_neuron_opn_impl.h:85
Parameters_()
Sets default parameter values.
Definition rate_neuron_opn_impl.h:61
void set(const Dictionary &, Node *node)
Definition rate_neuron_opn_impl.h:100
void get(Dictionary &) const
Definition rate_neuron_opn_impl.h:138
State_()
Default initialization.
Definition rate_neuron_opn_impl.h:72
void set(const Dictionary &, Node *node)
Set values from dictionary.
Definition rate_neuron_opn_impl.h:147