NEST main@caf0ae8
 
Loading...
Searching...
No Matches
event.h
Go to the documentation of this file.
1/*
2 * event.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 EVENT_H
24#define EVENT_H
25
26// C++ includes:
27#include <algorithm>
28#include <cassert>
29#include <cstring>
30#include <memory>
31#include <vector>
32
33// Includes from nestkernel:
34#include "exceptions.h"
35#include "nest_time.h"
36#include "nest_types.h"
37#include "spike_data.h"
38#include "vp_manager.h"
39
40namespace nest
41{
42
43class Node;
44
102class Event
103{
104
105public:
106 Event();
107
108 virtual ~Event()
109 {
110 }
111
112 virtual Event* clone() const = 0;
113
120 virtual void operator()() = 0;
121
125 void set_receiver( Node& );
126
130 Node& get_receiver() const;
131
135 size_t get_receiver_node_id() const;
136
142 Node& get_sender() const;
143
147 void set_sender( Node& );
148
154 size_t get_sender_node_id() const;
155
160
164 void set_sender_node_id( const size_t );
165
170 void set_sender_node_id_info( const size_t tid, const synindex syn_id, const size_t lcid );
171
181 Time const& get_stamp() const;
182
191 void set_delay_steps( long );
192
199 long get_delay_steps() const;
200
213 long get_rel_delivery_steps( const Time& t ) const;
214
223 size_t get_port() const;
224
232 size_t get_rport() const;
233
243 void set_port( size_t p );
244
254 void set_rport( size_t p );
255
264 double get_offset() const;
265
275 void set_offset( double t );
276
280 double get_weight() const;
281
285 void set_weight( double t );
286
290 virtual void set_drift_factor( double ) {};
291
295 virtual void set_diffusion_factor( double ) {};
296
300 bool sender_is_valid() const;
301
305 bool receiver_is_valid() const;
306
313 bool is_valid() const;
314
321 void set_stamp( Time const& );
322
327
331 bool is_flush_event();
332
333protected:
336 // The original formulation used references to Nodes as
337 // members, however, in order to avoid the reference of reference
338 // problem, we store sender and receiver as pointers and use
339 // references in the interface.
340 // Thus, we can still ensure that the pointers are never nullptr.
343
344
354 size_t p_;
355
366 size_t rp_;
367
375 long d_;
376
384
392 mutable long stamp_steps_;
393
402 double offset_;
403
407 double w_;
408};
409
410
411// Built-in event types
417class SpikeEvent : public Event
418{
419public:
420 SpikeEvent();
421 void operator()() override;
422 SpikeEvent* clone() const override;
423
424 void set_multiplicity( size_t );
425 size_t get_multiplicity() const;
426
427protected:
429};
430
432 : multiplicity_( 1 )
433{
434}
435
436inline SpikeEvent*
438{
439 return new SpikeEvent( *this );
440}
441
442inline void
443SpikeEvent::set_multiplicity( size_t multiplicity )
444{
445 multiplicity_ = multiplicity;
446}
447
448inline size_t
450{
451 return multiplicity_;
452}
453
454
459{
460public:
462 WeightRecorderEvent* clone() const override;
463 void operator()() override;
464
468 size_t get_receiver_node_id() const;
469
474 void set_receiver_node_id( size_t );
475
476protected:
478};
479
481 : receiver_node_id_( 0 )
482{
483}
484
487{
488 return new WeightRecorderEvent( *this );
489}
490
491inline void
493{
494 receiver_node_id_ = node_id;
495}
496
497inline size_t
502
503
521{
522public:
523 void operator()() override;
524};
525
534class RateEvent : public Event
535{
536 double r_;
537
538public:
539 void operator()() override;
540 RateEvent* clone() const override;
541
542 void set_rate( double );
543 double get_rate() const;
544};
545
546inline RateEvent*
548{
549 return new RateEvent( *this );
550}
551
552inline void
554{
555 r_ = r;
556}
557
558inline double
560{
561 return r_;
562}
563
568class CurrentEvent : public Event
569{
570 double c_;
571
572public:
573 void operator()() override;
574 CurrentEvent* clone() const override;
575
576 void set_current( double );
577 double get_current() const;
578};
579
580inline CurrentEvent*
582{
583 return new CurrentEvent( *this );
584}
585
586inline void
588{
589 c_ = c;
590}
591
592inline double
594{
595 return c_;
596}
597
615{
616public:
617 void operator()() override;
618};
619
636{
637public:
640
641 DataLoggingRequest( const Time&, const std::vector< std::string >& );
642
645 DataLoggingRequest( const Time&, const Time&, const std::vector< std::string >& );
646
647 DataLoggingRequest* clone() const override;
648
649 void operator()() override;
650
652 const Time& get_recording_interval() const;
653
655 const Time& get_recording_offset() const;
656
658 const std::vector< std::string >& record_from() const;
659
660private:
663
671 std::vector< std::string > const* const record_from_;
672};
673
675 : Event()
676 , recording_interval_( Time::neg_inf() )
677 , recording_offset_( Time::ms( 0. ) )
678 , record_from_( 0 )
679{
680}
681
682inline DataLoggingRequest::DataLoggingRequest( const Time& rec_int, const std::vector< std::string >& recs )
683 : Event()
684 , recording_interval_( rec_int )
685 , record_from_( &recs )
686{
687}
688
690 const Time& rec_offset,
691 const std::vector< std::string >& recs )
692 : Event()
693 , recording_interval_( rec_int )
694 , recording_offset_( rec_offset )
695 , record_from_( &recs )
696{
697}
698
699
700inline DataLoggingRequest*
702{
703 return new DataLoggingRequest( *this );
704}
705
706inline const Time&
708{
709 // During simulation, events are created without recording interval
710 // information. On these, get_recording_interval() must not be called.
711 assert( recording_interval_.is_finite() );
712
713 return recording_interval_;
714}
715
716inline const Time&
722
723inline const std::vector< std::string >&
725{
726 // During simulation, events are created without recordables
727 // information. On these, record_from() must not be called.
728 assert( record_from_ );
729
730 return *record_from_;
731}
732
740{
741public:
743 typedef std::vector< double > DataItem;
744
754 struct Item
755 {
756 Item( size_t n )
757 : data( n, std::numeric_limits< double >::max() )
758 , timestamp( Time::neg_inf() )
759 {
760 }
763 };
764
766 typedef std::vector< Item > Container;
767
769 DataLoggingReply( const Container& );
770
771 void operator()() override;
772
774 const Container&
775 get_info() const
776 {
777 return info_;
778 }
779
780private:
783
786 clone() const override
787 {
788 assert( false );
789 return nullptr;
790 }
791
794};
795
797 : Event()
798 , info_( d )
799{
800}
801
809{
810 double g_;
811
812public:
813 void operator()() override;
814 ConductanceEvent* clone() const override;
815
816 void set_conductance( double );
817 double get_conductance() const;
818};
819
820inline ConductanceEvent*
822{
823 return new ConductanceEvent( *this );
824}
825
826inline void
828{
829 g_ = g;
830}
831
832inline double
834{
835 return g_;
836}
837
838
855template < typename D >
856class DataEvent : public Event
857{
858 std::shared_ptr< D > data_;
859
860public:
861 void set_pointer( D& data );
862 std::shared_ptr< D > get_pointer() const;
863};
864
865template < typename D >
866inline void
868{
869 data_ = data;
870}
871
872template < typename D >
873inline std::shared_ptr< D >
875{
876 return data_;
877}
878
879class DoubleDataEvent : public DataEvent< double >
880{
881public:
882 void operator()() override;
883 DoubleDataEvent* clone() const override;
884};
885
886inline DoubleDataEvent*
888{
889 return new DoubleDataEvent( *this );
890}
891
892//*************************************************************
893// Inline implementations.
894
895inline bool
897{
898 return sender_;
899}
900
901inline bool
903{
904 return receiver_;
905}
906
907inline bool
909{
910 return ( sender_is_valid() and receiver_is_valid() and d_ > 0 );
911}
912
913inline void
915{
916 receiver_ = &r;
917}
918
919inline void
921{
922 sender_ = &s;
923}
924
925inline void
926Event::set_sender_node_id( const size_t node_id )
927{
928 sender_node_id_ = node_id;
929}
930
931inline void
932Event::set_sender_node_id_info( const size_t tid, const synindex syn_id, const size_t lcid )
933{
934 // lag and offset of SpikeData are not used here
935 sender_spike_data_.set( tid, syn_id, lcid, 0, 0.0 );
936}
937
938inline Node&
940{
941 assert( receiver_ );
942 return *receiver_;
943}
944
945inline Node&
947{
948 assert( sender_ );
949 return *sender_;
950}
951
952inline size_t
954{
955 assert( sender_node_id_ > 0 );
956 return sender_node_id_;
957}
958
959inline double
961{
962 return w_;
963}
964
965inline void
967{
968 w_ = w;
969}
970
971inline Time const&
973{
974 return stamp_;
975}
976
977inline void
979{
980 stamp_ = s;
981 stamp_steps_ = 0; // setting stamp_steps to zero indicates
982 // stamp_steps needs to be recalculated from
983 // stamp_ next time it is needed (e.g., in
984 // get_rel_delivery_steps)
985}
986
987inline void
992
993inline bool
998
999inline long
1001{
1002 return d_;
1003}
1004
1005inline long
1007{
1008 if ( stamp_steps_ == 0 )
1009 {
1011 }
1012 return stamp_steps_ + d_ - 1 - t.get_steps();
1013}
1014
1015inline void
1017{
1018 d_ = d;
1019}
1020
1021inline double
1023{
1024 return offset_;
1025}
1026
1027inline void
1029{
1030 offset_ = t;
1031}
1032
1033inline size_t
1035{
1036 return p_;
1037}
1038
1039inline size_t
1041{
1042 return rp_;
1043}
1044
1045inline void
1047{
1048 p_ = p;
1049}
1050
1051inline void
1053{
1054 rp_ = rp;
1055}
1056}
1057
1058#endif /* EVENT_H */
Event for electrical conductances.
Definition event.h:809
double get_conductance() const
Definition event.h:833
void set_conductance(double)
Definition event.h:827
double g_
Definition event.h:810
ConductanceEvent * clone() const override
Definition event.h:821
void operator()() override
Deliver the event to receiver.
Definition event.cpp:107
Event for electrical currents.
Definition event.h:569
void set_current(double)
Definition event.h:587
double get_current() const
Definition event.h:593
double c_
Definition event.h:570
CurrentEvent * clone() const override
Definition event.h:581
void operator()() override
Deliver the event to receiver.
Definition event.cpp:95
"Callback request event" for use in Device.
Definition event.h:615
void operator()() override
Deliver the event to receiver.
Definition event.cpp:101
"Callback request event" for use in Device.
Definition event.h:521
void operator()() override
Deliver the event to receiver.
Definition event.cpp:83
Event for transmitting arbitrary data.
Definition event.h:857
std::shared_ptr< D > get_pointer() const
Definition event.h:874
std::shared_ptr< D > data_
Definition event.h:858
void set_pointer(D &data)
Definition event.h:867
Provide logged data through request transmitting reference.
Definition event.h:740
const Container & info_
data to be transmitted, with time stamps
Definition event.h:793
std::vector< Item > Container
Container for entries.
Definition event.h:766
DataLoggingReply(const Container &)
Construct with reference to data and time stamps to transmit.
Definition event.h:796
DataLoggingReply(const DataLoggingReply &)
Prohibit copying.
void operator()() override
Deliver the event to receiver.
Definition event.cpp:125
const Container & get_info() const
Access referenced data.
Definition event.h:775
std::vector< double > DataItem
Data type data at single recording time.
Definition event.h:743
DataLoggingReply * clone() const override
Prohibit cloning.
Definition event.h:786
Request data to be logged/logged data to be sent.
Definition event.h:636
const Time & get_recording_interval() const
Access to stored time interval.
Definition event.h:707
const std::vector< std::string > & record_from() const
Access to vector of recordables.
Definition event.h:724
Time recording_interval_
Interval between two recordings, first is step 1.
Definition event.h:662
DataLoggingRequest * clone() const override
Definition event.h:701
DataLoggingRequest()
Create empty request for use during simulation.
Definition event.h:674
Time recording_offset_
Offset relative to which the intervals are computed.
Definition event.h:665
void operator()() override
Deliver the event to receiver.
Definition event.cpp:119
const Time & get_recording_offset() const
Access to stored offset.
Definition event.h:717
std::vector< std::string > const *const record_from_
Names of properties to record from.
Definition event.h:671
Definition event.h:880
DoubleDataEvent * clone() const override
Definition event.h:887
void operator()() override
Deliver the event to receiver.
Definition event.cpp:113
Encapsulate information sent between nodes.
Definition event.h:103
Time const & get_stamp() const
Return time stamp of the event.
Definition event.h:972
void set_flush_event_flag(bool is_flush_event)
Sets the flush event flag.
Definition event.h:988
void set_receiver(Node &)
Change pointer to receiving Node.
Definition event.h:914
void set_port(size_t p)
Set the port number.
Definition event.h:1046
size_t get_sender_node_id() const
Sender is local.
Definition event.h:953
virtual void set_diffusion_factor(double)
Set diffusion_factor of the event (see DiffusionConnectionEvent).
Definition event.h:295
size_t get_rport() const
Return the receiver port number of the event.
Definition event.h:1040
double w_
Weight of the connection.
Definition event.h:407
bool sender_is_valid() const
Returns true if the pointer to the sender node is valid.
Definition event.h:896
void set_stamp(Time const &)
Set the time stamp of the event.
Definition event.h:978
long get_rel_delivery_steps(const Time &t) const
Relative spike delivery time in steps.
Definition event.h:1006
long d_
Transmission delay.
Definition event.h:375
void set_weight(double t)
Set weight of the event.
Definition event.h:966
size_t rp_
Receiver port number (r-port).
Definition event.h:366
virtual Event * clone() const =0
virtual void operator()()=0
Deliver the event to receiver.
Event()
Definition event.cpp:32
void set_sender(Node &)
Change pointer to sending Node.
Definition event.h:920
void set_sender_node_id(const size_t)
Change node ID of sending Node.
Definition event.h:926
void set_sender_node_id_info(const size_t tid, const synindex syn_id, const size_t lcid)
Set tid, syn_id, lcid of spike_data_.
Definition event.h:932
void set_delay_steps(long)
Set the transmission delay of the event.
Definition event.h:1016
double get_weight() const
Return the weight.
Definition event.h:960
void set_rport(size_t p)
Set the receiver port number (r-port).
Definition event.h:1052
size_t retrieve_sender_node_id_from_source_table() const
Sender is not local.
Definition event.cpp:50
Node & get_receiver() const
Return reference to receiving Node.
Definition event.h:939
Time stamp_
Time stamp.
Definition event.h:383
void set_offset(double t)
Set the creation time of the Event.
Definition event.h:1028
bool is_valid() const
Check integrity of the event.
Definition event.h:908
long get_delay_steps() const
Return transmission delay of the event.
Definition event.h:1000
virtual void set_drift_factor(double)
Set drift_factor of the event (see DiffusionConnectionEvent).
Definition event.h:290
size_t get_receiver_node_id() const
Return node ID of receiving Node.
Definition event.cpp:65
size_t get_port() const
Return the sender port number of the event.
Definition event.h:1034
Node * receiver_
Pointer to receiver or nullptr.
Definition event.h:342
bool is_flush_event()
Returns whether this spike is a flush event.
Definition event.h:994
Node * sender_
Pointer to sender or nullptr.
Definition event.h:341
Node & get_sender() const
Return reference to sending Node.
Definition event.h:946
bool receiver_is_valid() const
Returns true if the pointer to the receiver node is valid.
Definition event.h:902
size_t sender_node_id_
node ID of sender or 0
Definition event.h:334
double get_offset() const
Return the creation time offset of the Event.
Definition event.h:1022
size_t p_
Sender port number.
Definition event.h:354
long stamp_steps_
Time stamp in steps.
Definition event.h:392
virtual ~Event()
Definition event.h:108
SpikeData sender_spike_data_
spike data of sender node, in some cases required to retrieve node ID
Definition event.h:335
double offset_
Offset for precise spike times.
Definition event.h:402
Base class for all NEST network objects.
Definition node.h:99
Event for firing rate information.
Definition event.h:535
void set_rate(double)
Definition event.h:553
RateEvent * clone() const override
Definition event.h:547
double get_rate() const
Definition event.h:559
void operator()() override
Deliver the event to receiver.
Definition event.cpp:89
double r_
Definition event.h:536
Used to communicate spikes.
Definition spike_data.h:101
void set(const size_t tid, const synindex syn_id, const size_t lcid, const unsigned int lag, const double offset)
Required in connection with direct-send events.
Definition spike_data.h:269
bool is_flush_event() const
Returns whether this spike is a flush event.
Definition spike_data.h:377
void set_flush_event_flag(bool is_flush_event)
Sets the flush event flag.
Definition spike_data.h:389
Event for spike information.
Definition event.h:418
SpikeEvent()
Definition event.h:431
SpikeEvent * clone() const override
Definition event.h:437
void operator()() override
Deliver the event to receiver.
Definition event.cpp:71
size_t get_multiplicity() const
Definition event.h:449
size_t multiplicity_
Definition event.h:428
void set_multiplicity(size_t)
Definition event.h:443
Definition nest_time.h:135
bool is_finite() const
Definition nest_time.h:369
long get_steps() const
Definition nest_time.h:504
Event for recording the weight of a spike.
Definition event.h:459
void set_receiver_node_id(size_t)
Change node ID of receiving Node.
Definition event.h:492
WeightRecorderEvent * clone() const override
Definition event.h:486
size_t receiver_node_id_
node ID of receiver or 0.
Definition event.h:477
WeightRecorderEvent()
Definition event.h:480
size_t get_receiver_node_id() const
Return node ID of receiving Node.
Definition event.h:498
void operator()() override
Deliver the event to receiver.
Definition event.cpp:77
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
Data item with pertaining time stamp.
Definition event.h:755
Time timestamp
Definition event.h:762
DataItem data
Definition event.h:761
Item(size_t n)
Definition event.h:756