KrisLibrary  1.0.0
IntervalMap.h
1 #ifndef STATS_INTERVAL_MAP_H
2 #define STATS_INTERVAL_MAP_H
3 
4 #include <KrisLibrary/Logger.h>
5 #include "statistics.h"
6 #include <vector>
7 #include <KrisLibrary/structs/array2d.h>
8 
9 namespace Statistics {
10 
15 template <class Data>
17 {
18  public:
19  IntervalMap();
21  void Clear();
23  void InitSplit(Real split);
25  void InitPartition(size_t n,Real a,Real b);
27  void Fill(const Data& val)
28  { std::fill(intervals.begin(),intervals.end(),val); }
29 
31  void IntervalRange(int index,Real& min,Real& max) const;
33  int GetIntervalIndex(Real val) const;
35  const Data& GetIntervalData(Real val) const
36  { return intervals[GetIntervalIndex(val)]; }
37  Data& GetIntervalData(Real val)
38  { return intervals[GetIntervalIndex(val)]; }
39 
40  std::vector<Real> divs;
42  std::vector<Data> intervals;
43 };
44 
45 template <class Data>
47 {
48  public:
49  typedef Real Point[2];
50  typedef int Index[2];
51  typedef size_t Size[2];
52 
53  IntervalMap2D();
55  void Clear();
57  void InitPartition(const Size dims,const Point min, const Point max);
59  void Fill(const Data& val)
60  { intervals.set(val); }
61 
63  void IntervalRange(const Index index,Point min,Point max) const;
65  void GetIntervalIndex(const Point val,Index index) const;
67  const Data& GetIntervalData(const Point val) const
68  { Index i; GetIntervalIndex(val,i);
69  return intervals(i[0],i[1]); }
70  Data& GetIntervalData(const Point val)
71  { Index i; GetIntervalIndex(val,i);
72  return intervals(i[0],i[1]); }
73 
74  std::vector<Real> div1,div2;
76 };
77 
78 template <class Data>
80 {
81  Clear();
82 }
83 
84 template <class Data>
86 {
87  divs.clear();
88  intervals.resize(1); //infinite
89 }
90 
91 template <class Data>
92 void IntervalMap<Data>::InitSplit(Real splitVal)
93 {
94  divs.resize(1);
95  intervals.resize(2);
96  divs[0] = splitVal;
97 }
98 
99 template <class Data>
100 void IntervalMap<Data>::InitPartition(size_t n,Real a,Real b)
101 {
102  if(n == 0) {
103  LOG4CXX_ERROR(KrisLibrary::logger(),"Warning, resizing interval map to have 0 divisions -- was this intended?"<<"\n");
104  Clear();
105  }
106  else {
107  divs.resize(n+1);
108  intervals.resize(n+2);
109  Real x=a, h=(b-a)/n;
110  for(size_t i=0;i<=n;i++) {
111  divs[i] = x;
112  x+=h;
113  }
114  }
115 }
116 
117 template <class Data>
118 void IntervalMap<Data>::IntervalRange(int index,Real& min,Real& max) const
119 {
120  assert(divs.size()+1 == intervals.size());
121  assert(index >= 0 && index < (int)intervals.size());
122  if(index == 0) min=-Inf;
123  else min = divs[index-1];
124  if(index+1 == (int)intervals.size()) max=Inf;
125  else max = divs[index];
126 }
127 
128 template <class Data>
130 {
131  if(intervals.empty()) return -1;
132  if(val <= divs.front()) return 0;
133  else if(val > divs.back()) return intervals.size()-1;
134  else {
135  std::vector<Real>::const_iterator it = --std::lower_bound(divs.begin(),divs.end(),val);
136  int index=(it-divs.begin())+1;
137  //Next 3 lines are for debugging only
138  Real a,b;
139  IntervalRange(index,a,b);
140  assert(a < val && val <= b);
141  return index;
142  }
143 }
144 
145 
146 template <class Data>
148 {
149  Clear();
150 }
151 
152 template <class Data>
154 {
155  div1.clear();
156  div2.clear();
157  intervals.resize(1,1); //infinite
158 }
159 
160 template <class Data>
161 void IntervalMap2D<Data>::InitPartition(const Size dims,const Point min,const Point max)
162 {
163  if(dims[0] == 0 || dims[1] == 0) {
164  LOG4CXX_ERROR(KrisLibrary::logger(),"Warning, resizing interval map to have 0 divisions -- was this intended?"<<"\n");
165  Clear();
166  }
167  else {
168  size_t m=dims[0],n=dims[1];
169  div1.resize(m+1);
170  div2.resize(n+1);
171  intervals.resize(m+2,n+2);
172  Real x=min[0], dx=(max[0]-min[0])/m;
173  for(size_t i=0;i<=m;i++) {
174  div1[i] = x;
175  x+=dx;
176  }
177  Real y=min[1], dy=(max[1]-min[1])/n;
178  for(size_t i=0;i<=n;i++) {
179  div2[i] = y;
180  y+=dy;
181  }
182  }
183 }
184 
185 template <class Data>
186 void IntervalMap2D<Data>::IntervalRange(const Index index,Point min,Point max) const
187 {
188  assert(div1.size()+1 == intervals.m);
189  assert(div2.size()+1 == intervals.n);
190  assert(index[0] >= 0 && index[0] < (int)intervals.m);
191  assert(index[1] >= 0 && index[1] < (int)intervals.n);
192  min[0] = (index[0] == 0? -Inf: div1[index[0]-1]);
193  max[0] = (index[0]+1 == intervals.m? Inf: div1[index[0]]);
194  min[1] = (index[1] == 0? -Inf: div2[index[1]-1]);
195  max[1] = (index[1]+1 == intervals.n? Inf: div2[index[1]]);
196 }
197 
198 template <class Data>
199 void IntervalMap2D<Data>::GetIntervalIndex(const Point val,Index index) const
200 {
201  if(intervals.empty()) { index[0]=index[1]=-1; return; }
202  if(val[0] <= div1.front()) index[0]=0;
203  else if(val[0] > div1.back()) index[0]=intervals.m-1;
204  else {
205  std::vector<Real>::const_iterator it = --std::lower_bound(div1.begin(),div1.end(),val[0]);
206  index[0]=(it-div1.begin())+1;
207  }
208  if(val[1] <= div2.front()) index[1]=0;
209  else if(val[1] > div2.back()) index[1]=intervals.n-1;
210  else {
211  std::vector<Real>::const_iterator it = --std::lower_bound(div2.begin(),div2.end(),val[1]);
212  index[1]=(it-div2.begin())+1;
213  }
214 }
215 
216 
217 } //namespace Statistics
218 
219 #endif
void InitPartition(const Size dims, const Point min, const Point max)
Creates mxn uniformly spaced intervals betwen min,max.
Definition: IntervalMap.h:161
void Clear()
Sets the interval to be (-inf,inf)
Definition: IntervalMap.h:85
void Fill(const Data &val)
Fills all intervals with the given value.
Definition: IntervalMap.h:59
Contains all definitions in the statistics directory.
Definition: BernoulliDistribution.h:6
Basic statistical utilities.
An integer tuple class.
Definition: IntTuple.h:14
Definition: IntervalMap.h:46
void Clear()
Sets the interval to be (-inf,inf)x(-inf,inf)
Definition: IntervalMap.h:153
const Data & GetIntervalData(Real val) const
Returns the data of the interval containing val.
Definition: IntervalMap.h:35
Division of the real numbers into interval sets. Each interval is assigned data of type Data...
Definition: IntervalMap.h:16
void InitSplit(Real split)
Creates the intervals (-inf,split],(split,inf)
Definition: IntervalMap.h:92
The logging system used in KrisLibrary.
const Data & GetIntervalData(const Point val) const
Returns the data of the interval containing val.
Definition: IntervalMap.h:67
void GetIntervalIndex(const Point val, Index index) const
Returns the index of the interval containing val.
Definition: IntervalMap.h:199
void Fill(const Data &val)
Fills all intervals with the given value.
Definition: IntervalMap.h:27
int GetIntervalIndex(Real val) const
Returns the index of the interval containing val.
Definition: IntervalMap.h:129
void IntervalRange(const Index index, Point min, Point max) const
Returns the range of the interval indexed by index.
Definition: IntervalMap.h:186
void IntervalRange(int index, Real &min, Real &max) const
Returns the range of the interval indexed by index.
Definition: IntervalMap.h:118
void InitPartition(size_t n, Real a, Real b)
Creates n uniformly spaced intervals betwen a,b.
Definition: IntervalMap.h:100
std::vector< Data > intervals
divs.size()+1 intervals (-inf,x0],(x1,x2],...,(xn-1,xn],(xn,inf)
Definition: IntervalMap.h:42