NEURON
ivocvect.h
Go to the documentation of this file.
1 #ifndef ivoc_vector_h
2 #define ivoc_vector_h
3 
4 // definition of vector classes from the gnu c++ class library
5 #include <nrnmutdec.h>
6 #include <vector>
7 #include <numeric>
8 #include <algorithm>
9 
10 extern "C" {
11 extern void notify_freed_val_array(double*, size_t);
12 }
13 
14 #define Vect IvocVect
15 using ParentVect = std::vector<double>;
16 struct Object;
17 
18 class IvocVect {
19  public:
20  IvocVect(Object* obj = NULL);
21  IvocVect(int, Object* obj = NULL);
22  IvocVect(int, double, Object* obj = NULL);
23  IvocVect(IvocVect&, Object* obj = NULL);
24  ~IvocVect();
25 
26  Object** temp_objvar();
27  int buffer_size();
28  void buffer_size(int);
29  void label(const char*);
30 
31  inline double& elem(int n) {
32  return vec_.at(n);
33  }
34 
35  inline std::vector<double>& vec() {
36  return vec_;
37  }
38 
39  inline double* data() {
40  return vec_.data();
41  }
42 
43  inline size_t size() const {
44  return vec_.size();
45  }
46 
47  inline void resize(size_t n) {
48  if (n > vec_.size()) {
49  notify_freed_val_array(vec_.data(), vec_.size());
50  }
51  vec_.resize(n);
52  }
53 
54  inline void resize(size_t n, double fill_value) {
55  if (n > vec_.size()) {
56  notify_freed_val_array(vec_.data(), vec_.size());
57  }
58  vec_.resize(n, fill_value);
59  }
60 
61  inline double& operator[](size_t index) {
62  return vec_.at(index);
63  }
64 
65  inline auto begin() -> std::vector<double>::iterator {
66  return vec_.begin();
67  }
68 
69  inline auto end() -> std::vector<double>::iterator {
70  return vec_.end();
71  }
72 
73  inline void push_back(double v) {
74  vec_.push_back(v);
75  }
76 
77 #if USE_PTHREAD
78  void mutconstruct(int mkmut) {
79  if (!mut_)
80  MUTCONSTRUCT(mkmut)
81  }
82 #else
83  void mutconstruct(int) {}
84 #endif
85  void lock() {
86  MUTLOCK
87  }
88  void unlock() {
89  MUTUNLOCK
90  }
91 
92  public:
93  // intended as friend static Object** temp_objvar(IvocVect*);
94  Object* obj_; // so far only needed by record and play; not reffed
95  char* label_;
96  std::vector<double> vec_; // std::vector holding data
97  MUTDEC
98 };
99 
100 template <class InputIterator>
101 double var(InputIterator begin, InputIterator end) {
102  const size_t size = end - begin;
103  const double sum = std::accumulate(begin, end, 0.0);
104  const double m = sum / size;
105 
106  double accum = 0.0;
107  std::for_each(begin, end, [&](const double d) { accum += (d - m) * (d - m); });
108 
109  return accum / (size - 1);
110 }
111 
112 template <class InputIterator>
113 double stdDev(InputIterator begin, InputIterator end) {
114  return sqrt(var(begin, end));
115 }
116 
117 extern "C" {
118 extern Vect* vector_new(int, Object*); // use this if possible
119 extern Vect* vector_new0();
120 extern Vect* vector_new1(int);
121 extern Vect* vector_new2(Vect*);
122 extern void vector_delete(Vect*);
123 extern int vector_buffer_size(Vect*);
124 extern Object** vector_temp_objvar(Vect*);
125 extern Object** vector_pobj(Vect*);
126 
127 extern int is_vector_arg(int);
128 extern char* vector_get_label(Vect*);
129 extern void vector_set_label(Vect*, char*);
130 } // extern "C"
131 
132 #if defined(__cplusplus)
133 extern "C" {
134 #endif
135 
136 extern Vect* vector_arg(int);
137 extern double* vector_vec(Vect*);
138 extern int vector_capacity(Vect*);
139 extern void vector_resize(Vect*, int);
140 
141 #if defined(__cplusplus)
142 }
143 #endif
144 
145 #endif
short index
Definition: cabvars.h:10
IvocVect(Object *obj=NULL)
Definition: ivocvect.cpp:182
double * data()
Definition: ivocvect.h:39
char * label_
Definition: ivocvect.h:95
void mutconstruct(int)
Definition: ivocvect.h:83
double & operator[](size_t index)
Definition: ivocvect.h:61
void lock()
Definition: ivocvect.h:85
std::vector< double > vec_
Definition: ivocvect.h:96
auto end() -> std::vector< double >::iterator
Definition: ivocvect.h:69
size_t size() const
Definition: ivocvect.h:43
int buffer_size()
Definition: ivocvect.cpp:1375
void unlock()
Definition: ivocvect.h:88
Object ** temp_objvar()
Definition: ivocvect.cpp:366
void label(const char *)
Definition: ivocvect.cpp:214
void resize(size_t n, double fill_value)
Definition: ivocvect.h:54
std::vector< double > & vec()
Definition: ivocvect.h:35
Object * obj_
Definition: ivocvect.h:94
void resize(size_t n)
Definition: ivocvect.h:47
void push_back(double v)
Definition: ivocvect.h:73
double & elem(int n)
Definition: ivocvect.h:31
auto begin() -> std::vector< double >::iterator
Definition: ivocvect.h:65
Object ** vector_pobj(Vect *)
Definition: ivocvect.cpp:331
Vect * vector_new0()
Definition: ivocvect.cpp:304
Vect * vector_new1(int)
Definition: ivocvect.cpp:307
int vector_buffer_size(Vect *)
Definition: ivocvect.cpp:316
void notify_freed_val_array(double *, size_t)
Definition: ivoc.cpp:101
std::vector< double > ParentVect
Definition: ivocvect.h:15
char * vector_get_label(Vect *)
Definition: ivocvect.cpp:334
double var(InputIterator begin, InputIterator end)
Definition: ivocvect.h:101
#define Vect
Definition: ivocvect.h:14
double stdDev(InputIterator begin, InputIterator end)
Definition: ivocvect.h:113
void vector_resize(Vect *, int)
Definition: ivocvect.cpp:322
void vector_delete(Vect *)
Definition: ivocvect.cpp:313
void vector_set_label(Vect *, char *)
Definition: ivocvect.cpp:337
Vect * vector_new2(Vect *)
Definition: ivocvect.cpp:310
int is_vector_arg(int)
Definition: ivocvect.cpp:405
Vect * vector_new(int, Object *)
Definition: ivocvect.cpp:301
Vect * vector_arg(int)
Definition: ivocvect.cpp:397
Object ** vector_temp_objvar(Vect *)
Definition: ivocvect.cpp:325
int vector_capacity(Vect *)
Definition: ivocvect.cpp:319
double * vector_vec(Vect *)
Definition: ivocvect.cpp:328
#define v
Definition: md1redef.h:4
sqrt
Definition: extdef.h:3
int const size_t const size_t n
Definition: nrngsl.h:11
#define MUTCONSTRUCT(mkmut)
Definition: nrnmutdec.h:70
#define MUTDEC
Definition: nrnmutdec.h:68
#define MUTLOCK
Definition: nrnmutdec.h:72
#define MUTUNLOCK
Definition: nrnmutdec.h:73
#define begin
Definition: redef.h:32
#define NULL
Definition: sptree.h:16
Definition: hocdec.h:227