NEURON
ivocvect.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "nrnmutdec.h"
4 #include "ocnotify.h"
5 
6 #include <vector>
7 #include <numeric>
8 #include <algorithm>
9 
10 using ParentVect = std::vector<double>;
11 struct Object;
12 
13 class IvocVect {
14  public:
15  IvocVect(Object* obj = NULL);
16  IvocVect(int, Object* obj = NULL);
17  IvocVect(int, double, Object* obj = NULL);
18  IvocVect(IvocVect&, Object* obj = NULL);
19  ~IvocVect();
20 
21  Object** temp_objvar();
22  int buffer_size();
23  void buffer_size(int);
24  void label(const char*);
25 
26  inline double& elem(int n) {
27  return vec_.at(n);
28  }
29 
30  inline std::vector<double>& vec() {
31  return vec_;
32  }
33 
34  inline double const* data() const {
35  return vec_.data();
36  }
37 
38  inline double* data() {
39  return vec_.data();
40  }
41 
42  inline size_t size() const {
43  return vec_.size();
44  }
45 
46  inline void resize(size_t n) {
47  if (n > vec_.size()) {
48  notify_freed_val_array(vec_.data(), vec_.size());
49  }
50  vec_.resize(n);
51  }
52 
53  inline void resize(size_t n, double fill_value) {
54  if (n > vec_.size()) {
55  notify_freed_val_array(vec_.data(), vec_.size());
56  }
57  vec_.resize(n, fill_value);
58  }
59 
60  inline double& operator[](size_t index) {
61  return vec_.at(index);
62  }
63 
64  inline auto begin() const -> std::vector<double>::const_iterator {
65  return vec_.begin();
66  }
67 
68  inline auto end() const -> std::vector<double>::const_iterator {
69  return vec_.end();
70  }
71 
72  inline auto begin() -> std::vector<double>::iterator {
73  return vec_.begin();
74  }
75 
76  inline auto end() -> std::vector<double>::iterator {
77  return vec_.end();
78  }
79 
80  inline void push_back(double v) {
81  vec_.push_back(v);
82  }
83 
84 #if NRN_ENABLE_THREADS
85  void mutconstruct(int mkmut) {
86  if (!mut_)
87  MUTCONSTRUCT(mkmut)
88  }
89 #else
90  void mutconstruct(int) {}
91 #endif
92  void lock() {
93  MUTLOCK
94  }
95  void unlock() {
96  MUTUNLOCK
97  }
98 
99  public:
100  // intended as friend static Object** temp_objvar(IvocVect*);
101  Object* obj_; // so far only needed by record and play; not reffed
102  char* label_;
103  std::vector<double> vec_; // std::vector holding data
104  MUTDEC
105 };
106 
107 template <class InputIterator>
108 double var(InputIterator begin, InputIterator end) {
109  const size_t size = end - begin;
110  const double sum = std::accumulate(begin, end, 0.0);
111  const double m = sum / size;
112 
113  double accum = 0.0;
114  std::for_each(begin, end, [&](const double d) { accum += (d - m) * (d - m); });
115 
116  return accum / (size - 1);
117 }
118 
119 template <class InputIterator>
120 double stdDev(InputIterator begin, InputIterator end) {
121  return sqrt(var(begin, end));
122 }
123 
124 extern void vector_delete(IvocVect*);
126 
127 extern int is_vector_arg(int);
128 extern Object** new_vect(IvocVect* v, ssize_t delta, ssize_t start, ssize_t step);
129 
130 extern char* vector_get_label(IvocVect*);
131 extern void vector_set_label(IvocVect*, char*);
132 
133 // olupton 2022-01-21: backwards compatibility
134 using Vect = IvocVect;
IvocVect(Object *obj=NULL)
Definition: ivocvect.cpp:143
double * data()
Definition: ivocvect.h:38
char * label_
Definition: ivocvect.h:102
auto begin() const -> std::vector< double >::const_iterator
Definition: ivocvect.h:64
void mutconstruct(int)
Definition: ivocvect.h:90
double & operator[](size_t index)
Definition: ivocvect.h:60
void lock()
Definition: ivocvect.h:92
double const * data() const
Definition: ivocvect.h:34
std::vector< double > vec_
Definition: ivocvect.h:103
auto end() -> std::vector< double >::iterator
Definition: ivocvect.h:76
size_t size() const
Definition: ivocvect.h:42
int buffer_size()
Definition: ivocvect.cpp:1367
void unlock()
Definition: ivocvect.h:95
Object ** temp_objvar()
Definition: ivocvect.cpp:349
auto end() const -> std::vector< double >::const_iterator
Definition: ivocvect.h:68
void label(const char *)
Definition: ivocvect.cpp:175
void resize(size_t n, double fill_value)
Definition: ivocvect.h:53
std::vector< double > & vec()
Definition: ivocvect.h:30
Object * obj_
Definition: ivocvect.h:101
void resize(size_t n)
Definition: ivocvect.h:46
void push_back(double v)
Definition: ivocvect.h:80
double & elem(int n)
Definition: ivocvect.h:26
auto begin() -> std::vector< double >::iterator
Definition: ivocvect.h:72
#define v
Definition: md1redef.h:11
void notify_freed_val_array(double *p, size_t size)
Definition: ivoc.cpp:152
void vector_set_label(IvocVect *, char *)
Definition: ivocvect.cpp:320
std::vector< double > ParentVect
Definition: ivocvect.h:10
double var(InputIterator begin, InputIterator end)
Definition: ivocvect.h:108
double stdDev(InputIterator begin, InputIterator end)
Definition: ivocvect.h:120
Object ** vector_temp_objvar(IvocVect *)
Definition: ivocvect.cpp:314
int is_vector_arg(int)
Definition: ivocvect.cpp:378
Object ** new_vect(IvocVect *v, ssize_t delta, ssize_t start, ssize_t step)
Definition: ivocvect.cpp:386
void vector_delete(IvocVect *)
Definition: ivocvect.cpp:262
char * vector_get_label(IvocVect *)
Definition: ivocvect.cpp:317
sqrt
Definition: extdef.h:3
step
Definition: extdef.h:7
fixed_vector< double > IvocVect
Definition: ivocvect.hpp:72
int const size_t const size_t n
Definition: nrngsl.h:10
#define MUTCONSTRUCT(mkmut)
Definition: nrnmutdec.h:33
#define MUTDEC
Definition: nrnmutdec.h:31
#define MUTLOCK
Definition: nrnmutdec.h:35
#define MUTUNLOCK
Definition: nrnmutdec.h:36
short index
Definition: cabvars.h:11
#define NULL
Definition: spdefs.h:105
Definition: hocdec.h:173