NEURON
tqueue.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #undef check
4 
5 #include <assert.h>
6 
7 #include <nrnmutdec.h>
8 #include <pool.hpp>
9 
10 #include "tqitem.hpp"
11 
13 
14 // bin queue for the fixed step method for NetCons and PreSyns. Splay tree
15 // for others.
16 // fifo for the NetCons and PreSyns with same delay. Splay tree for
17 // others (especially SelfEvents).
18 // note that most methods below assume a TQItem is in the splay tree
19 // For the bin part, only insert_fifo, and remove make sense,
20 // and forall_callback does the splay tree first and then the bin (so
21 // not in time order)
22 // The bin part assumes a fixed step method.
23 
24 #define COLLECT_TQueue_STATISTICS 1
25 template <typename T>
26 class SPTree;
27 
28 // helper class for the TQueue (SplayTBinQueue).
29 class BinQ {
30  public:
31  BinQ();
32  virtual ~BinQ();
33  void enqueue(double tt, TQItem*);
34  void shift(double tt) {
35  assert(!bins_[qpt_]);
36  tt_ = tt;
37  if (++qpt_ >= nbin_) {
38  qpt_ = 0;
39  }
40  }
41  TQItem* top() {
42  return bins_[qpt_];
43  }
44  TQItem* dequeue();
45  double tbin() {
46  return tt_;
47  }
48  // for iteration
49  TQItem* first();
50  TQItem* next(TQItem*);
51  void remove(TQItem*);
52  void resize(int);
53 #if COLLECT_TQueue_STATISTICS
54  public:
55  int nfenq, nfdeq, nfrem;
56 #endif
57  private:
58  double tt_; // time at beginning of qpt_ interval
59  int nbin_, qpt_;
61 };
62 
63 class TQueue {
64  public:
65  TQueue(TQItemPool*, int mkmut = 0);
66  virtual ~TQueue();
67 
69  return least_;
70  }
71  TQItem* second_least(double t);
72 #if NRN_ENABLE_THREADS
73  double least_t() {
74  double tt;
75  MUTLOCK;
76  if (least_) {
77  tt = least_->t_;
78  } else {
79  tt = 1e15;
80  }
81  MUTUNLOCK;
82  return tt;
83  }
84 #else
85  double least_t() {
86  if (least_) {
87  return least_->t_;
88  } else {
89  return 1e15;
90  }
91  }
92 #endif
93  TQItem* atomic_dq(double til);
94  TQItem* insert(double t, void* data);
95  TQItem* enqueue_bin(double t, void* data);
97  return binq_->dequeue();
98  }
99  void shift_bin(double t) {
100  ++nshift_;
101  binq_->shift(t);
102  }
103  double tbin() {
104  return binq_->tbin();
105  }
106  TQItem* top() {
107  return binq_->top();
108  }
109  void release(TQItem*);
110  TQItem* find(double t);
111  void remove(TQItem*);
112  void move(TQItem*, double tnew);
113  void move_least(double tnew);
114  void print();
115  void check(const char* errmess);
116  void statistics();
117  void spike_stat(double*);
118  void forall_callback(void (*)(const TQItem*, int));
119  int nshift_;
120  void deleteitem(TQItem*);
121 
122  public:
123  BinQ* binq() {
124  return binq_;
125  }
126 
127  private:
128  double least_t_nolock() {
129  if (least_) {
130  return least_->t_;
131  } else {
132  return 1e15;
133  }
134  }
135  void move_least_nolock(double tnew);
140  MUTDEC
141 #if COLLECT_TQueue_STATISTICS
142  unsigned long ninsert, nrem, nleast, nbal, ncmplxrem;
144 #endif
145 };
146 
147 class SelfQueue { // not really a queue but a doubly linked list for fast
148  public: // insertion, deletion, iteration
149  SelfQueue(TQItemPool*, int mkmut = 0);
150  virtual ~SelfQueue();
151  TQItem* insert(void*);
152  void* remove(TQItem*);
153  void remove_all();
155  return head_;
156  }
158  return q->right_;
159  }
160 
161  private:
164  MUTDEC
165 };
Definition: tqueue.hpp:29
TQItem * top()
Definition: tqueue.hpp:41
virtual ~BinQ()
Definition: tqueue.cpp:288
BinQ()
Definition: tqueue.cpp:275
void resize(int)
Definition: tqueue.cpp:295
double tbin()
Definition: tqueue.hpp:45
int nfenq
Definition: tqueue.hpp:55
TQItem * next(TQItem *)
Definition: tqueue.cpp:368
void shift(double tt)
Definition: tqueue.hpp:34
double tt_
Definition: tqueue.hpp:58
TQItem * first()
Iterate in ascending bin order starting at current bin.
Definition: tqueue.cpp:357
int qpt_
Definition: tqueue.hpp:59
int nbin_
Definition: tqueue.hpp:59
int nfrem
Definition: tqueue.hpp:55
void enqueue(double tt, TQItem *)
Definition: tqueue.cpp:318
void remove(TQItem *)
Definition: tqueue.cpp:382
TQItem * dequeue()
Definition: tqueue.cpp:345
TQItem ** bins_
Definition: tqueue.hpp:60
int nfdeq
Definition: tqueue.hpp:55
TQItem * first()
Definition: tqueue.hpp:154
void remove_all()
Definition: tqueue.cpp:434
TQItem * head_
Definition: tqueue.hpp:162
void * remove(TQItem *)
Definition: tqueue.cpp:419
TQItemPool * tpool_
Definition: tqueue.hpp:163
virtual ~SelfQueue()
Definition: tqueue.cpp:402
TQItem * insert(void *)
Definition: tqueue.cpp:406
TQItem * next(TQItem *q)
Definition: tqueue.hpp:157
SelfQueue(TQItemPool *, int mkmut=0)
Definition: tqueue.cpp:397
void statistics()
Definition: tqueue.cpp:166
TQItem * second_least(double t)
Definition: tqueue.cpp:119
unsigned long nleastsrch
Definition: tqueue.hpp:143
void remove(TQItem *)
Definition: tqueue.cpp:225
TQItem * insert(double t, void *data)
Definition: tqueue.cpp:190
TQItem * enqueue_bin(double t, void *data)
Definition: tqueue.cpp:209
TQItem * dequeue_bin()
Definition: tqueue.hpp:96
SPTree< TQItem > * sptree_
Definition: tqueue.hpp:136
double least_t()
Definition: tqueue.hpp:85
void deleteitem(TQItem *)
Definition: tqueue.cpp:87
TQItem * top()
Definition: tqueue.hpp:106
double least_t_nolock()
Definition: tqueue.hpp:128
MUTDEC unsigned long nleast
Definition: tqueue.hpp:142
MUTDEC unsigned long ncmplxrem
Definition: tqueue.hpp:142
void check(const char *errmess)
Definition: tqueue.cpp:115
BinQ * binq()
Definition: tqueue.hpp:123
TQItemPool * tpool_
Definition: tqueue.hpp:139
TQItem * least()
Definition: tqueue.hpp:68
void move(TQItem *, double tnew)
Definition: tqueue.cpp:148
void shift_bin(double t)
Definition: tqueue.hpp:99
unsigned long nmove
Definition: tqueue.hpp:143
void release(TQItem *)
Definition: tqueue.cpp:220
int nshift_
Definition: tqueue.hpp:119
void print()
Definition: tqueue.cpp:91
unsigned long nfastmove
Definition: tqueue.hpp:143
TQItem * atomic_dq(double til)
Definition: tqueue.cpp:245
TQItem * find(double t)
Definition: tqueue.cpp:261
MUTDEC unsigned long nrem
Definition: tqueue.hpp:142
unsigned long nfindsrch
Definition: tqueue.hpp:143
unsigned long ncompare
Definition: tqueue.hpp:143
MUTDEC unsigned long nbal
Definition: tqueue.hpp:142
BinQ * binq_
Definition: tqueue.hpp:137
MUTDEC unsigned long ninsert
Definition: tqueue.hpp:142
TQItem * least_
Definition: tqueue.hpp:138
unsigned long nfind
Definition: tqueue.hpp:143
void move_least_nolock(double tnew)
Definition: tqueue.cpp:134
virtual ~TQueue()
Definition: tqueue.cpp:73
void forall_callback(void(*)(const TQItem *, int))
Definition: tqueue.cpp:103
TQueue(TQItemPool *, int mkmut=0)
Definition: tqueue.cpp:59
double tbin()
Definition: tqueue.hpp:103
void move_least(double tnew)
Definition: tqueue.cpp:128
void spike_stat(double *)
Definition: tqueue.cpp:180
#define assert(ex)
Definition: hocassrt.h:24
size_t q
#define MUTDEC
Definition: nrnmutdec.h:31
#define MUTLOCK
Definition: nrnmutdec.h:35
#define MUTUNLOCK
Definition: nrnmutdec.h:36
Definition: tqitem.hpp:3
double t_
Definition: tqitem.hpp:8