32#include <gsl/gsl_errno.h>
33#include <gsl/gsl_matrix.h>
34#include <gsl/gsl_odeiv.h>
202extern "C" int glif_cond_dynamics(
double,
const double*,
double*,
void* );
204void register_glif_cond(
const std::string& name );
206class glif_cond :
public ArchivingNode
211 glif_cond(
const glif_cond& );
213 ~glif_cond()
override;
216 using Node::handles_test_event;
218 size_t send_test_event( Node&,
size_t, synindex,
bool )
override;
220 void handle( SpikeEvent& )
override;
221 void handle( CurrentEvent& )
override;
222 void handle( DataLoggingRequest& )
override;
224 size_t handles_test_event( SpikeEvent&,
size_t )
override;
225 size_t handles_test_event( CurrentEvent&,
size_t )
override;
226 size_t handles_test_event( DataLoggingRequest&,
size_t )
override;
228 void get_status(
Dictionary& )
const override;
229 void set_status(
const Dictionary& )
override;
233 void init_buffers_()
override;
236 void pre_run_hook()
override;
239 void update( Time
const&,
const long,
const long )
override;
242 friend int glif_cond_dynamics(
double,
const double*,
double*,
void* );
245 friend class DynamicRecordablesMap< glif_cond >;
246 friend class DynamicUniversalDataLogger< glif_cond >;
247 friend class DataAccessFunctor< glif_cond >;
257 double th_spike_add_;
258 double th_spike_decay_;
259 double voltage_reset_fraction_;
260 double voltage_reset_add_;
261 double th_voltage_index_;
263 double th_voltage_decay_;
265 std::vector< double > asc_init_;
266 std::vector< double > asc_decay_;
267 std::vector< double > asc_amps_;
268 std::vector< double > asc_r_;
269 std::vector< double > tau_syn_;
270 std::vector< double > E_rev_;
273 bool has_connections_;
276 bool has_theta_spike_;
282 bool has_theta_voltage_;
284 size_t n_receptors_()
const;
297 double threshold_spike_;
298 double threshold_voltage_;
299 std::vector< double > ASCurrents_;
300 double ASCurrents_sum_;
301 int refractory_steps_;
319 STATE_VECTOR_MIN_SIZE
322 static const size_t NUMBER_OF_FIXED_STATES_ELEMENTS = 1;
323 static const size_t NUMBER_OF_RECORDABLES_ELEMENTS = DG_SYN - 1;
324 static const size_t NUMBER_OF_STATES_ELEMENTS_PER_RECEPTOR = 2;
326 std::vector< double > y_;
328 State_(
const Parameters_& );
330 void get(
Dictionary&,
const Parameters_& )
const;
331 void set(
const Dictionary&,
const Parameters_&,
double, Node* );
337 Buffers_( glif_cond& );
338 Buffers_(
const Buffers_&, glif_cond& );
340 std::vector< RingBuffer > spikes_;
341 RingBuffer currents_;
344 DynamicUniversalDataLogger< glif_cond > logger_;
348 gsl_odeiv_control* c_;
349 gsl_odeiv_evolve* e_;
350 gsl_odeiv_system sys_;
357 double IntegrationStep_;
371 int RefractoryCounts_;
372 double theta_spike_decay_rate_;
373 double theta_spike_refractory_decay_rate_;
374 double theta_voltage_decay_rate_inverse_;
375 double potential_decay_rate_;
376 double abpara_ratio_voltage_;
377 std::vector< double > asc_decay_rates_;
378 std::vector< double > asc_stable_coeff_;
379 std::vector< double > asc_refractory_decay_rates_;
386 std::vector< double > CondInitialValues_;
395 DynamicRecordablesMap< glif_cond > recordablesMap_;
398 DataAccessFunctor< glif_cond > get_data_access_functor(
size_t elem );
400 get_state_element(
size_t elem )
402 if ( elem == glif_cond::State_::V_M )
404 return S_.y_[ elem ] + P_.E_L_;
406 else if ( elem == glif_cond::State_::I )
410 else if ( elem == glif_cond::State_::ASC_SUM )
412 return S_.ASCurrents_sum_;
414 else if ( elem == glif_cond::State_::TH )
416 return S_.threshold_ + P_.E_L_;
418 else if ( elem == glif_cond::State_::TH_SPK )
420 return S_.threshold_spike_;
422 else if ( elem == glif_cond::State_::TH_VLT )
424 return S_.threshold_voltage_;
428 return S_.y_[ elem - glif_cond::State_::NUMBER_OF_RECORDABLES_ELEMENTS ];
435 std::string get_g_receptor_name(
size_t receptor );
436 void insert_conductance_recordables(
size_t first = 0 );
441glif_cond::Parameters_::n_receptors_()
const
443 return tau_syn_.size();
448glif_cond::send_test_event( Node& target,
size_t receptor_type,
synindex,
bool )
451 e.set_sender( *
this );
452 return target.handles_test_event( e, receptor_type );
456glif_cond::handles_test_event( CurrentEvent&,
size_t receptor_type )
458 if ( receptor_type != 0 )
460 throw UnknownReceptorType( receptor_type, get_name() );
466glif_cond::handles_test_event( DataLoggingRequest& dlr,
size_t receptor_type )
468 if ( receptor_type != 0 )
470 throw UnknownReceptorType( receptor_type, get_name() );
473 return B_.logger_.connect_logging_device( dlr, recordablesMap_ );
492 Parameters_ ptmp = P_;
493 const double delta_EL = ptmp.set( d,
this );
495 stmp.set( d, ptmp, delta_EL,
this );
503 if ( ptmp.n_receptors_() > P_.n_receptors_() )
505 for (
size_t receptor = P_.n_receptors_(); receptor < ptmp.n_receptors_(); ++receptor )
507 size_t elem = glif_cond::State_::G_SYN + receptor * glif_cond::State_::NUMBER_OF_STATES_ELEMENTS_PER_RECEPTOR;
508 recordablesMap_.insert( get_g_receptor_name( receptor ), get_data_access_functor( elem ) );
511 else if ( ptmp.n_receptors_() < P_.n_receptors_() )
513 for (
size_t receptor = ptmp.n_receptors_(); receptor < P_.n_receptors_(); ++receptor )
515 recordablesMap_.erase( get_g_receptor_name( receptor ) );
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
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
const std::string recordables("recordables")
const std::string target("target")
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
const double e
Definition numerics.cpp:32