Bin.h
Go to the documentation of this file.
1 // \author Darko Veberic
2 // \date 2014
3 
4 #ifndef _utl_Bin_h_
5 #define _utl_Bin_h_
6 
7 #include <vector>
8 #include <iostream>
9 #include <functional>
10 
11 
12 namespace utl {
13 
14  class Equidistant {
15  public:
16  Equidistant(const double start, const double stop, const unsigned int nBins) :
17  fStart(start),
18  fStop(stop),
19  fNBins(nBins),
20  fStep((stop-start)/nBins),
21  fInvStep(1/fStep)
22  { }
23 
24  int GetBinIndex(const double x) const { return int(fInvStep*(x - fStart)); }
25 
26  double GetBinCenter(const int i) const { return Interpolate(i+0.5); }
27  double GetBinLowerEdge(const int i) const { return Interpolate(i); }
28  double GetBinUpperEdge(const int i) const { return Interpolate(i+1); }
29  double GetBinWidth(const int i) const
30  { return (0 <= i && i < int(fNBins)) ? fStep : std::numeric_limits<double>::infinity(); }
31 
32  unsigned int GetNBins() const { return fNBins; }
33  double GetStart() const { return fStart; }
34  double GetStop() const { return fStop; }
35  double GetStep() const { return fStep; }
36 
37  private:
38  double
39  Interpolate(const double i)
40  const
41  {
42  if (i < 0)
43  return -std::numeric_limits<double>::infinity();
44  if (i > int(fNBins))
45  return std::numeric_limits<double>::infinity();
46  return fStart + i*fStep;
47  }
48 
49  double fStart;
50  double fStop;
51  unsigned int fNBins;
52  double fStep;
53  double fInvStep;
54  };
55 
56 
57  template<typename DataType>
58  class EquidistantInNorm : public Equidistant {
59  public:
60  EquidistantInNorm(const double start, const double stop, const unsigned int nBins,
61  const std::function<double(const DataType&)>& norm) :
62  Equidistant(start, stop, nBins),
63  fNorm(norm)
64  { }
65 
66  int GetBinIndex(const DataType& x) const { return Equidistant::GetBinIndex(fNorm(x)); }
67 
68  int GetUnnormalizedBinIndex(const double x) const { return Equidistant::GetBinIndex(x); }
69 
70  private:
71  const std::function<double(const DataType&)> fNorm;
72  };
73 
74 
75  template<class BinType, class DiscretizationType>
76  class Bin : public DiscretizationType {
77  public:
78  Bin(const DiscretizationType& dis, const BinType& init = BinType()) :
79  DiscretizationType(dis),
80  fBins(dis.GetNBins(), init),
81  fUnderflow(init),
82  fOverflow(init)
83  { }
84 
85  std::vector<BinType>& GetAllBins() { return fBins; }
86 
87  const std::vector<BinType>& GetAllBins() const { return fBins; }
88 
89  template<class DataType>
90  BinType& operator()(const DataType& x) { return (*this)[this->GetBinIndex(x)]; }
91 
92  template<class DataType>
93  const BinType& operator()(const DataType& x) const { return (*this)[this->GetBinIndex(x)]; }
94 
95  BinType&
96  operator[](const int i)
97  {
98  if (i < 0)
99  return fUnderflow;
100  if (i >= int(fBins.size()))
101  return fOverflow;
102  return At(i);
103  }
104 
105  const BinType&
106  operator[](const int i)
107  const
108  {
109  if (i < 0)
110  return fUnderflow;
111  if (i >= fBins.size())
112  return fOverflow;
113  return At(i);
114  }
115 
116  bool IsRegularIndex(const int i) const { return 0 <= i && i < fBins.size(); }
117 
118  template<class DataType>
119  void Apply(const DataType& x) { (*this)(x)(x); }
120 
121  template<class DataType, class Indexer>
122  void Apply(const DataType& x, Indexer indexer) { (*this)(indexer(x))(x); }
123 
124  template<typename DataType>
125  void
126  Apply(const std::vector<DataType>& vec)
127  {
128  for (const DataType& x : vec)
129  Apply(x);
130  }
131 
132  template<typename DataType, class Indexer>
133  void
134  Apply(const std::vector<DataType>& vec, Indexer indexer)
135  {
136  for (const DataType& x : vec)
137  Apply(x, indexer);
138  }
139 
140  template<typename DataType, class Indexer, class Unpack>
141  void
142  Apply(const std::vector<DataType>& vec, Indexer indexer, Unpack unpack)
143  {
144  for (const DataType& x : vec)
145  Apply(unpack(x), indexer);
146  }
147 
148  const BinType& GetUnderflow() const { return fUnderflow; }
149  const BinType& GetOverflow() const { return fOverflow; }
150 
151  void
153  {
154  for (auto& b : fBins)
155  b.Clear();
156  fUnderflow.Clear();
157  fOverflow.Clear();
158  }
159 
160  private:
161  #ifdef DEBUG
162  BinType& At(const int i) { return fBins.at(i); }
163  const BinType& At(const int i) const { return fBins.at(i); }
164  #else
165  BinType& At(const int i) { return fBins[i]; }
166  const BinType& At(const int i) const { return fBins[i]; }
167  #endif
168 
169  std::vector<BinType> fBins;
170  BinType fUnderflow;
171  BinType fOverflow;
172  };
173 
174 }
175 
176 
177 #endif
constexpr double Interpolate(const double dx, const double dy, const double x)
const BinType & operator()(const DataType &x) const
Definition: Bin.h:93
const BinType & GetUnderflow() const
Definition: Bin.h:148
EquidistantInNorm(const double start, const double stop, const unsigned int nBins, const std::function< double(const DataType &)> &norm)
Definition: Bin.h:60
void Apply(const DataType &x)
Definition: Bin.h:119
double fInvStep
Definition: Bin.h:53
double GetBinWidth(const int i) const
Definition: Bin.h:29
const BinType & operator[](const int i) const
Definition: Bin.h:106
bool IsRegularIndex(const int i) const
Definition: Bin.h:116
std::vector< BinType > fBins
Definition: Bin.h:169
BinType & operator()(const DataType &x)
Definition: Bin.h:90
const BinType & At(const int i) const
Definition: Bin.h:166
Equidistant(const double start, const double stop, const unsigned int nBins)
Definition: Bin.h:16
double GetStop() const
Definition: Bin.h:34
Bin(const DiscretizationType &dis, const BinType &init=BinType())
Definition: Bin.h:78
BinType & operator[](const int i)
Definition: Bin.h:96
unsigned int fNBins
Definition: Bin.h:51
int GetUnnormalizedBinIndex(const double x) const
Definition: Bin.h:68
void Apply(const std::vector< DataType > &vec, Indexer indexer, Unpack unpack)
Definition: Bin.h:142
unsigned int GetNBins() const
Definition: Bin.h:32
double GetStart() const
Definition: Bin.h:33
int GetBinIndex(const double x) const
Definition: Bin.h:24
double fStep
Definition: Bin.h:52
const std::function< double(const DataType &)> fNorm
Definition: Bin.h:71
double fStart
Definition: Bin.h:49
double norm(utl::Vector x)
BinType fUnderflow
Definition: Bin.h:170
BinType fOverflow
Definition: Bin.h:171
void Apply(const DataType &x, Indexer indexer)
Definition: Bin.h:122
void Apply(const std::vector< DataType > &vec)
Definition: Bin.h:126
double GetBinLowerEdge(const int i) const
Definition: Bin.h:27
double GetBinCenter(const int i) const
Definition: Bin.h:26
void Clear()
Definition: Bin.h:152
double GetStep() const
Definition: Bin.h:35
Definition: Bin.h:76
double GetBinUpperEdge(const int i) const
Definition: Bin.h:28
return fStart i * fStep
Definition: Bin.h:46
std::vector< BinType > & GetAllBins()
Definition: Bin.h:85
void Apply(const std::vector< DataType > &vec, Indexer indexer)
Definition: Bin.h:134
const std::vector< BinType > & GetAllBins() const
Definition: Bin.h:87
BinType & At(const int i)
Definition: Bin.h:165
const BinType & GetOverflow() const
Definition: Bin.h:149
int GetBinIndex(const DataType &x) const
Definition: Bin.h:66
double fStop
Definition: Bin.h:50

, generated on Tue Sep 26 2023.