lazy_list.hpp
Go to the documentation of this file.
1 
6 #ifndef LAZY_LIST_HPP
7 #define LAZY_LIST_HPP 1
8 
9 #include <cassert>
10 #include "universal_error.hpp"
11 #include <algorithm>
12 
13 using std::vector;
14 using std::size_t;
15 
17 template<class T> class LazyList
18 {
19 public:
20 
24  virtual size_t size(void) const = 0;
25 
30  virtual T operator[](const size_t i) const = 0;
31 
36  T at(const size_t i) const
37  {
38  assert(i<size());
39  return (*this)[i];
40  }
41 
42  virtual ~LazyList(void) {}
43 };
44 
49 template<class T> vector<T> serial_generate(const LazyList<T>& ll)
50 {
51  vector<T> res(ll.size());
52  for(size_t i=0, endp=res.size();i<endp;++i)
53  res[i] = ll[i];
54  return res;
55 }
56 
62 template<class T> vector<T> termwise_product(const vector<T>& v,
63  const T& s)
64 {
65  class Multiplier: public LazyList<T>
66  {
67  public:
68 
69  Multiplier(const vector<T>& v_i,
70  const T& s_i):
71  v_(v_i), s_(s_i) {}
72 
73  size_t size(void) const
74  {
75  return v_.size();
76  }
77 
78  T operator[](size_t i) const
79  {
80  return s_*v_[i];
81  }
82 
83  private:
84  const vector<T>& v_;
85  const T& s_;
86  } multiplier(v,s);
87 
88  return serial_generate(multiplier);
89 }
90 
96 template<class T> vector<T> trim_top(const vector<T>& v,
97  const size_t max_index)
98 {
99  class Trimmer: public LazyList<T>
100  {
101  public:
102 
103  Trimmer(const vector<T>& v_i,
104  const size_t max_index_i):
105  v_(v_i), max_index_(max_index_i) {}
106 
107  size_t getLength(void) const
108  {
109  return max_index_;
110  }
111 
112  T operator()(size_t i) const
113  {
114  return v_[i];
115  }
116 
117  private:
118  const vector<T>& v_;
119  const size_t max_index_;
120  } trimmer(v,max_index);
121 
122  return serial_generate(trimmer);
123 }
124 
130 template<class T> int ElementNumber(vector<vector<T> > const& vec)
131 {
132  size_t res=0;
133  for(size_t i=0;i<vec.size();++i)
134  res+=vec[i].size();
135  return static_cast<int>(res);
136 }
137 
144 template<class T> void ListExchange(vector<T> &vec,vector<int> const& indeces,
145  vector<T> const& data)
146 {
147  if(indeces.size()!=data.size())
148  {
149  UniversalError eo("Matching vectors are not the same length");
150  eo.AddEntry("indeces length",static_cast<double>(indeces.size()));
151  eo.AddEntry("data length",static_cast<double>(data.size()));
152  throw eo;
153  }
154  for(size_t i=0;i<indeces.size();++i)
155  vec[static_cast<size_t>(indeces[i])]=data[i];
156 }
157 
162 template<class T> T lazy_sum(const LazyList<T>& i2m)
163 {
164  T res = i2m[0];
165  for(size_t i=1;i<i2m.size();++i)
166  res += i2m[i];
167  return res;
168 }
169 
174 template<class T> T lazy_max(const LazyList<T>& i2m)
175 {
176  T res = i2m(0);
177  for(size_t i=1;i<i2m.getLength();++i)
178  res = max(res,i2m(i));
179  return res;
180 }
181 
186 template<class T> T lazy_min(const LazyList<T>& i2m)
187 {
188  T res = i2m[0];
189  for(size_t i=1;i<i2m.size();++i)
190  res = std::min(res,i2m[i]);
191  return res;
192 }
193 
195 template<class T> class Echo: public LazyList<T>
196 {
197 public:
198 
202  explicit Echo(const vector<T>& v):
203  v_(v) {}
204 
205  size_t size(void) const
206  {
207  return v_.size();
208  }
209 
210  T operator[](size_t i) const
211  {
212  return v_[i];
213  }
214 
215 private:
216  const vector<T>& v_;
217 };
218 
220 template<class T> class ContiguousChunk: public LazyList<T>
221 {
222 public:
223 
230  size_t low,
231  size_t high):
232  i2m_(i2m), low_(low), high_(high)
233  {
234  assert(high_>low_);
235  }
236 
237  size_t size(void) const
238  {
239  return high_-low_;
240  }
241 
242  T operator[](size_t i) const
243  {
244  return i2m_(i+low_);
245  }
246 
247 private:
248  const LazyList<T>& i2m_;
249  const size_t low_;
250  const size_t high_;
251 };
252 
253 #endif // LAZY_LIST_HPP
Echo(const vector< T > &v)
Class constructor.
Definition: lazy_list.hpp:202
size_t size(void) const
Returns the length of the list.
Definition: lazy_list.hpp:205
vector< T > trim_top(const vector< T > &v, const size_t max_index)
Trims a list and retains only a specific number of the first terms.
Definition: lazy_list.hpp:96
Converts a vector to a lazy list.
Definition: lazy_list.hpp:195
T operator[](size_t i) const
Returns a single member of the list.
Definition: lazy_list.hpp:210
T lazy_min(const LazyList< T > &i2m)
Finds the minimum of a lazy list.
Definition: lazy_list.hpp:186
Container for error reports.
ContiguousChunk(const LazyList< T > &i2m, size_t low, size_t high)
Class constructor.
Definition: lazy_list.hpp:229
vector< T > serial_generate(const LazyList< T > &ll)
Creates a vector from an LazyList.
Definition: lazy_list.hpp:49
void ListExchange(vector< T > &vec, vector< int > const &indeces, vector< T > const &data)
Exchanges memebers in vec with indeces given by indeces and data given by data.
Definition: lazy_list.hpp:144
double max(vector< double > const &v)
returns the maximal term in a vector
Definition: utils.cpp:52
T at(const size_t i) const
bound checked access function
Definition: lazy_list.hpp:36
Creates a contiguous chunk of a lazy list.
Definition: lazy_list.hpp:220
Ordered list whose terms are evaluated lazily.
Definition: lazy_list.hpp:17
virtual T operator[](const size_t i) const =0
Returns a single member of the list.
size_t size(void) const
Returns the length of the list.
Definition: lazy_list.hpp:237
int ElementNumber(vector< vector< T > > const &vec)
Calculates the total number of elements in the 2d vector.
Definition: lazy_list.hpp:130
double min(vector< double > const &v)
Returns the minimal term in a vector.
Definition: utils.cpp:44
T operator[](size_t i) const
Returns a single member of the list.
Definition: lazy_list.hpp:242
T lazy_sum(const LazyList< T > &i2m)
Sums terms of a lazy list.
Definition: lazy_list.hpp:162
vector< T > termwise_product(const vector< T > &v, const T &s)
Multiplies all terms of std::vector with a scalar.
Definition: lazy_list.hpp:62
void AddEntry(std::string const &field, double value)
Adds an entry to the list.
T lazy_max(const LazyList< T > &i2m)
Finds the maximum of a lazy list.
Definition: lazy_list.hpp:174
A class for storing error and debug information.
virtual size_t size(void) const =0
Returns the length of the list.