NEURON
netcon.h
Go to the documentation of this file.
1 #pragma once
2 
3 #undef check
4 
6 #include "nrnmpi.h"
7 #include "nrnneosm.h"
8 #include "pool.hpp"
9 #include "tqitem.hpp"
10 #include "htlist.h"
11 
12 #include <InterViews/observe.h>
13 
14 #include <memory>
15 #include <unordered_map>
16 #include <vector>
17 
18 #if 0
19 #define STATISTICS(arg) ++arg
20 #else
21 #define STATISTICS(arg) /**/
22 #endif
23 
24 class PreSyn;
25 class PlayRecord;
26 class Cvode;
27 class TQueue;
28 struct NrnThread;
29 class NetCvode;
30 class HocEvent;
32 class HocCommand;
33 struct STETransition;
34 class IvocVect;
35 class Multisend_Send;
37 struct hoc_Item;
38 struct Object;
39 struct Point_process;
40 struct Section;
41 using SelfEventPPTable = std::unordered_map<long, Point_process*>;
42 
43 #define DiscreteEventType 0
44 #define TstopEventType 1 // no longer used
45 #define NetConType 2
46 #define SelfEventType 3
47 #define PreSynType 4
48 #define HocEventType 5
49 #define PlayRecordEventType 6
50 // the above will in turn steer to proper PlayRecord type
51 #define NetParEventType 7
52 
53 #if DISCRETE_EVENT_OBSERVER
54 class DiscreteEvent: public Observer {
55 #else
57 #endif
58  public:
59  DiscreteEvent();
60  virtual ~DiscreteEvent();
61  virtual void send(double deliverytime, NetCvode*, NrnThread*);
62  virtual void deliver(double t, NetCvode*, NrnThread*);
63  virtual void pr(const char*, double t, NetCvode*);
64  virtual void disconnect(Observable*){};
65  virtual int pgvts_op(int& i) {
66  i = 0;
67  return 2;
68  }
69  virtual void pgvts_deliver(double t, NetCvode*);
70  virtual NrnThread* thread();
71 
72  virtual int type() {
73  return DiscreteEventType;
74  }
75  virtual DiscreteEvent* savestate_save();
76  virtual void savestate_restore(double deliverytime, NetCvode*);
77  virtual void savestate_write(FILE*);
78  static DiscreteEvent* savestate_read(FILE*);
79 
80  // actions performed over each item in the event queue.
81  virtual void frecord_init(TQItem*){};
82 
83  static unsigned long discretevent_send_;
84  static unsigned long discretevent_deliver_;
85 };
86 
87 class NetCon: public DiscreteEvent {
88  public:
89  NetCon(PreSyn* src, Object* target);
90  virtual ~NetCon();
91  virtual void send(double sendtime, NetCvode*, NrnThread*);
92  virtual void deliver(double, NetCvode*, NrnThread*);
93  virtual void pr(const char*, double t, NetCvode*);
94  virtual int pgvts_op(int& i) {
95  i = 1;
96  return 2;
97  }
98  virtual void pgvts_deliver(double t, NetCvode*);
99  virtual NrnThread* thread();
100 
101  virtual int type() {
102  return NetConType;
103  }
104  virtual DiscreteEvent* savestate_save();
105  static DiscreteEvent* savestate_read(FILE*);
106 
107  void chksrc();
108  void chktar();
109  void rmsrc();
110  void replace_src(PreSyn*);
111  virtual void disconnect(Observable*);
112 
113  double delay_;
116  double* weight_;
118  int cnt_;
119  bool active_;
120 
121  static unsigned long netcon_send_active_;
122  static unsigned long netcon_send_inactive_;
123  static unsigned long netcon_deliver_;
124 };
125 
126 typedef std::unordered_map<void*, NetCon*> NetConSaveWeightTable;
127 typedef std::unordered_map<long, NetCon*> NetConSaveIndexTable;
128 
129 class NetConSave: public DiscreteEvent {
130  public:
131  NetConSave(NetCon*);
132  virtual ~NetConSave();
133  virtual void savestate_restore(double deliverytime, NetCvode*);
134  virtual void savestate_write(FILE*);
136 
137  static void invalid();
138  static NetCon* weight2netcon(double*);
139  static NetCon* index2netcon(long);
140 
141  private:
144 };
145 
146 class SelfEvent: public DiscreteEvent {
147  public:
148  SelfEvent();
149  virtual ~SelfEvent();
150  virtual void deliver(double, NetCvode*, NrnThread*);
151  virtual void pr(const char*, double t, NetCvode*);
152  void clear() {} // called by sepool_->free_all
153  virtual int pgvts_op(int& i) {
154  i = 1;
155  return 2;
156  }
157  virtual void pgvts_deliver(double t, NetCvode*);
158 
159  virtual int type() {
160  return SelfEventType;
161  }
162  virtual DiscreteEvent* savestate_save();
163  virtual void savestate_restore(double deliverytime, NetCvode*);
164  virtual void savestate_write(FILE*);
165  static DiscreteEvent* savestate_read(FILE*);
166  virtual NrnThread* thread();
167 
168  double flag_;
170  double* weight_;
171  Datum* movable_; // pointed-to Datum holds TQItem*
172 
173  static unsigned long selfevent_send_;
174  static unsigned long selfevent_move_;
175  static unsigned long selfevent_deliver_;
176  static void savestate_free();
177 
178  private:
179  void call_net_receive(NetCvode*);
180  static Point_process* index2pp(int type, int oindex);
181  static std::unique_ptr<SelfEventPPTable> sepp_;
182 };
183 
184 using NetConPList = std::vector<NetCon*>;
185 
187  public:
188  // condition detection factored out of PreSyn for re-use
189  ConditionEvent();
190  virtual ~ConditionEvent();
191  virtual void check(NrnThread*, double sendtime, double teps = 0.0);
192  virtual double value() {
193  return -1.;
194  }
195  void condition(Cvode*);
196  void abandon_statistics(Cvode*);
197  virtual void asf_err() = 0;
198 
199  double valold_, told_;
200  double valthresh_; // go below this to reset threshold detector.
202  bool flag_; // true when below, false when above.
203 
204  static unsigned long init_above_;
205  static unsigned long send_qthresh_;
206  static unsigned long abandon_;
207  static unsigned long eq_abandon_;
208  static unsigned long abandon_init_above_;
209  static unsigned long abandon_init_below_;
210  static unsigned long abandon_above_;
211  static unsigned long abandon_below_;
212  static unsigned long deliver_qthresh_;
213 };
214 
215 class WatchCondition: public ConditionEvent, public HTList {
216  public:
218  virtual ~WatchCondition();
219  virtual double value() {
220  return (*c_)(pnt_);
221  }
222  virtual void send(double, NetCvode*, NrnThread*);
223  virtual void deliver(double, NetCvode*, NrnThread*);
224  virtual void pr(const char*, double t, NetCvode*);
225  void activate(double flag);
226  virtual void asf_err();
227  virtual int pgvts_op(int& i) {
228  i = 1;
229  return 2;
230  }
231  virtual void pgvts_deliver(double t, NetCvode*);
232  virtual NrnThread* thread();
233 
234  double nrflag_;
236  double (*c_)(Point_process*);
237  // For WatchCondition transfer to CoreNEURON.
238  // Could be figured out from watch semantics and
239  // the index where this == _watch_array[index]
240  // At least this avoids a search over the _watch_array.
242 
243  static unsigned long watch_send_;
244  static unsigned long watch_deliver_;
245 };
246 
248  public:
249  STECondition(Point_process*, double (*)(Point_process*) = NULL);
250  void deliver(double, NetCvode*, NrnThread*) override;
251  void pgvts_deliver(double t, NetCvode*) override;
252  double value() override;
253  NrnThread* thread() override;
254 
256 };
257 
258 class PreSyn: public ConditionEvent {
259  public:
260  PreSyn(neuron::container::data_handle<double> src, Object* osrc, Section* ssrc = nullptr);
261  virtual ~PreSyn();
262  virtual void send(double sendtime, NetCvode*, NrnThread*);
263  virtual void deliver(double, NetCvode*, NrnThread*);
264  virtual void pr(const char*, double t, NetCvode*);
265  virtual void asf_err();
266  virtual int pgvts_op(int& i) {
267  i = 0;
268  return 0;
269  }
270  virtual void pgvts_deliver(double t, NetCvode*);
271  virtual NrnThread* thread();
272 
273  virtual int type() {
274  return PreSynType;
275  }
276  virtual DiscreteEvent* savestate_save();
277  static DiscreteEvent* savestate_read(FILE*);
278 
279  virtual double value() {
280  assert(thvar_);
281  return *thvar_ - threshold_;
282  }
283 
284  void update(Observable*);
285  void disconnect(Observable*);
286  void record_stmt(const char*);
287  void record_stmt(Object*);
288  void record(IvocVect*, IvocVect* idvec = nullptr, int rec_id = 0);
289  void record(double t);
290  void init();
291  double mindelay();
292  void fanout(double, NetCvode*, NrnThread*); // used by bbsavestate
293 
295  double threshold_;
296  double delay_;
304  hoc_Item* hi_th_; // in the netcvode psl_th_
305  long hi_index_; // for SaveState read and write
307  int rec_id_;
309  int gid_;
310 #if NRNMPI
311  unsigned char localgid_; // compressed gid for spike transfer
312 #endif
313 #if NRN_MUSIC
314  void* music_port_;
315 #endif
316 #if NRNMPI
317  union { // A PreSyn cannot be both a source spike generator
318  // and a receiver of off-host spikes.
319  Multisend_Send* multisend_send_;
320  Multisend_Send_Phase2* multisend_send_phase2_;
321  int srchost_;
322  } bgp;
323 #endif
324 
325  static unsigned long presyn_send_mindelay_;
326  static unsigned long presyn_send_direct_;
327  static unsigned long presyn_deliver_netcon_;
328  static unsigned long presyn_deliver_direct_;
329  static unsigned long presyn_deliver_ncsend_;
330 };
331 
332 typedef std::unordered_map<long, PreSyn*> PreSynSaveIndexTable;
333 
334 class PreSynSave: public DiscreteEvent {
335  public:
336  PreSynSave(PreSyn*);
337  virtual ~PreSynSave();
338  virtual void savestate_restore(double deliverytime, NetCvode*);
339  virtual void savestate_write(FILE*);
342 
343  static void invalid();
344  static PreSyn* hindx2presyn(long);
345 
346  private:
348 };
349 
350 
351 class HocEvent: public DiscreteEvent {
352  public:
353  HocEvent();
354  virtual ~HocEvent();
355  virtual void pr(const char*, double t, NetCvode*);
356  static HocEvent* alloc(const char* stmt, Object*, int, Object* pyact = nullptr);
357  void hefree();
358  void clear(); // called by hepool_->free_all
359  virtual void deliver(double, NetCvode*, NrnThread*);
360  virtual void allthread_handle();
361  static void reclaim();
362  virtual int pgvts_op(int& i) {
363  i = 0;
364  return 2;
365  }
366  virtual void pgvts_deliver(double t, NetCvode*);
368  return stmt_;
369  }
370 
371  virtual int type() {
372  return HocEventType;
373  }
374  virtual DiscreteEvent* savestate_save();
375  virtual void savestate_restore(double deliverytime, NetCvode*);
376  virtual void savestate_write(FILE*);
377  static DiscreteEvent* savestate_read(FILE*);
378 
379  static unsigned long hocevent_send_;
380  static unsigned long hocevent_deliver_;
381 
382  private:
385  int reinit_;
388 };
389 
390 class NetParEvent: public DiscreteEvent {
391  public:
392  NetParEvent();
393  virtual ~NetParEvent();
394  virtual void send(double, NetCvode*, NrnThread*);
395  virtual void deliver(double, NetCvode*, NrnThread*);
396  virtual void pr(const char*, double t, NetCvode*);
397  virtual int pgvts_op(int& i) {
398  i = 0;
399  return 4;
400  }
401  virtual void pgvts_deliver(double t, NetCvode*);
402 
403  virtual int type() {
404  return NetParEventType;
405  }
406  virtual DiscreteEvent* savestate_save();
407  virtual void savestate_restore(double deliverytime, NetCvode*);
408  virtual void savestate_write(FILE*);
409  static DiscreteEvent* savestate_read(FILE*);
410 
411  public:
412  double wx_, ws_; // exchange time and "spikes to Presyn" time
413  int ithread_; // for pr()
414 };
415 
416 extern PreSyn* nrn_gid2outputpresyn(int gid);
static unsigned long abandon_
Definition: netcon.h:206
static unsigned long deliver_qthresh_
Definition: netcon.h:212
bool flag_
Definition: netcon.h:202
static unsigned long send_qthresh_
Definition: netcon.h:205
virtual double value()
Definition: netcon.h:192
static unsigned long init_above_
Definition: netcon.h:204
static unsigned long abandon_above_
Definition: netcon.h:210
static unsigned long abandon_init_above_
Definition: netcon.h:208
double told_
Definition: netcon.h:199
static unsigned long eq_abandon_
Definition: netcon.h:207
double valthresh_
Definition: netcon.h:200
static unsigned long abandon_below_
Definition: netcon.h:211
virtual void asf_err()=0
TQItem * qthresh_
Definition: netcon.h:201
static unsigned long abandon_init_below_
Definition: netcon.h:209
Definition: cvodeobj.h:97
virtual int type()
Definition: netcon.h:72
virtual DiscreteEvent * savestate_save()
Definition: netcvode.cpp:4679
virtual void pr(const char *, double t, NetCvode *)
Definition: netcvode.cpp:2937
virtual void disconnect(Observable *)
Definition: netcon.h:64
virtual void savestate_write(FILE *)
Definition: netcvode.cpp:4698
virtual void deliver(double t, NetCvode *, NrnThread *)
Definition: netcvode.cpp:2925
static unsigned long discretevent_send_
Definition: netcon.h:81
static unsigned long discretevent_deliver_
Definition: netcon.h:84
static DiscreteEvent * savestate_read(FILE *)
Definition: netcvode.cpp:4694
virtual void pgvts_deliver(double t, NetCvode *)
Definition: netcvode.cpp:2933
virtual void send(double deliverytime, NetCvode *, NrnThread *)
Definition: netcvode.cpp:2920
virtual ~DiscreteEvent()
Definition: netcvode.cpp:4677
virtual void savestate_restore(double deliverytime, NetCvode *)
Definition: netcvode.cpp:4688
virtual int pgvts_op(int &i)
Definition: netcon.h:65
virtual void frecord_init(TQItem *)
Definition: netcon.h:81
virtual NrnThread * thread()
Definition: netcvode.cpp:2929
Definition: htlist.h:34
HocCommand * stmt_
Definition: netcon.h:383
static unsigned long hocevent_deliver_
Definition: netcon.h:380
virtual int type()
Definition: netcon.h:371
int reinit_
Definition: netcon.h:385
HocCommand * stmt()
Definition: netcon.h:367
virtual int pgvts_op(int &i)
Definition: netcon.h:362
Object * ppobj_
Definition: netcon.h:384
static HocEvent * next_del_
Definition: netcon.h:386
static HocEventPool * hepool_
Definition: netcon.h:387
static unsigned long hocevent_send_
Definition: netcon.h:379
Definition: netcon.h:87
virtual int pgvts_op(int &i)
Definition: netcon.h:94
double * weight_
Definition: netcon.h:116
virtual int type()
Definition: netcon.h:101
bool active_
Definition: netcon.h:119
static unsigned long netcon_send_active_
Definition: netcon.h:121
int cnt_
Definition: netcon.h:118
double delay_
Definition: netcon.h:113
Point_process * target_
Definition: netcon.h:115
Object * obj_
Definition: netcon.h:117
static unsigned long netcon_deliver_
Definition: netcon.h:123
PreSyn * src_
Definition: netcon.h:114
static unsigned long netcon_send_inactive_
Definition: netcon.h:122
NetCon * netcon_
Definition: netcon.h:135
static NetConSaveWeightTable * wtable_
Definition: netcon.h:142
static NetConSaveIndexTable * idxtable_
Definition: netcon.h:143
int ithread_
Definition: netcon.h:413
virtual int type()
Definition: netcon.h:403
virtual int pgvts_op(int &i)
Definition: netcon.h:397
double ws_
Definition: netcon.h:412
Definition: netcon.h:258
static unsigned long presyn_send_direct_
Definition: netcon.h:326
virtual int pgvts_op(int &i)
Definition: netcon.h:266
int output_index_
Definition: netcon.h:308
long hi_index_
Definition: netcon.h:305
HocCommand * stmt_
Definition: netcon.h:302
static unsigned long presyn_deliver_ncsend_
Definition: netcon.h:329
Section * ssrc_
Definition: netcon.h:299
hoc_Item * hi_th_
Definition: netcon.h:304
IvocVect * idvec_
Definition: netcon.h:301
int rec_id_
Definition: netcon.h:307
NrnThread * nt_
Definition: netcon.h:303
virtual int type()
Definition: netcon.h:273
int gid_
Definition: netcon.h:309
double delay_
Definition: netcon.h:296
static unsigned long presyn_deliver_direct_
Definition: netcon.h:328
Object * osrc_
Definition: netcon.h:298
IvocVect * tvec_
Definition: netcon.h:300
double threshold_
Definition: netcon.h:295
static unsigned long presyn_deliver_netcon_
Definition: netcon.h:327
virtual double value()
Definition: netcon.h:279
int use_min_delay_
Definition: netcon.h:306
static unsigned long presyn_send_mindelay_
Definition: netcon.h:325
NetConPList dil_
Definition: netcon.h:294
PreSyn * presyn_
Definition: netcon.h:340
bool have_qthresh_
Definition: netcon.h:341
static PreSynSaveIndexTable * idxtable_
Definition: netcon.h:347
STETransition * stet_
Definition: netcon.h:255
void clear()
Definition: netcon.h:152
virtual int type()
Definition: netcon.h:159
static unsigned long selfevent_deliver_
Definition: netcon.h:175
static unsigned long selfevent_send_
Definition: netcon.h:173
Datum * movable_
Definition: netcon.h:171
static unsigned long selfevent_move_
Definition: netcon.h:174
virtual int pgvts_op(int &i)
Definition: netcon.h:153
double * weight_
Definition: netcon.h:170
static std::unique_ptr< SelfEventPPTable > sepp_
Definition: netcon.h:181
Point_process * target_
Definition: netcon.h:169
double flag_
Definition: netcon.h:168
virtual double value()
Definition: netcon.h:219
static unsigned long watch_send_
Definition: netcon.h:243
static unsigned long watch_deliver_
Definition: netcon.h:244
Point_process * pnt_
Definition: netcon.h:235
double nrflag_
Definition: netcon.h:234
virtual int pgvts_op(int &i)
Definition: netcon.h:227
int watch_index_
Definition: netcon.h:241
#define i
Definition: md1redef.h:19
#define assert(ex)
Definition: hocassrt.h:24
void init()
Definition: init.cpp:141
void update(NrnThread *_nt)
static void check(VecTNode &)
Definition: cellorder1.cpp:401
#define NetParEventType
Definition: netcon.h:51
std::unordered_map< void *, NetCon * > NetConSaveWeightTable
Definition: netcon.h:126
#define PreSynType
Definition: netcon.h:47
#define HocEventType
Definition: netcon.h:48
#define DiscreteEventType
Definition: netcon.h:43
std::unordered_map< long, Point_process * > SelfEventPPTable
Definition: netcon.h:41
PreSyn * nrn_gid2outputpresyn(int gid)
Definition: netpar.cpp:1556
#define SelfEventType
Definition: netcon.h:46
std::vector< NetCon * > NetConPList
Definition: netcon.h:184
std::unordered_map< long, PreSyn * > PreSynSaveIndexTable
Definition: netcon.h:332
std::unordered_map< long, NetCon * > NetConSaveIndexTable
Definition: netcon.h:127
#define NetConType
Definition: netcon.h:45
static realtype c_
static void activate()
static uint32_t value
Definition: scoprand.cpp:25
#define NULL
Definition: spdefs.h:105
Represent main neuron object computed by single thread.
Definition: multicore.h:58
Definition: hocdec.h:173
A point process is computed just like regular mechanisms.
Definition: section_fwd.hpp:77
Definition: tqitem.hpp:3
Non-template stable handle to a generic value.