aimstil  5.0.5
SparseVector.h
Go to the documentation of this file.
1 #ifndef SPARSEVECTOR_H_
2 #define SPARSEVECTOR_H_
3 
4 // includes from STL
5 #include <functional>
6 #include <limits>
7 #include <map>
8 
9 // includes from BOOST
10 #include "boost/type_traits.hpp"
11 
12 // includes from TIL
13 #include "til/sparse_vector.h"
14 #include "til/templateTools.h"
15 
16 //includes from TIL
17 #include "globalTraits.h"
18 
19 namespace til
20 {
21 
23  template < typename T >
24  class SparseVector : public sparse_vector<T>
25  {
26  public: // typedefs
27 
29 
30  public: // constructors & destructor
31 
33  SparseVector() : Base() {}
35  SparseVector(std::size_t d) : Base(d) {}
36 
37  // TODO: I am not sure whether we want to enfore the default value to be zero?
38  };
39 
40 
41  namespace policy
42  {
43 
46 
49  /*
50  template < typename T >
51  struct DefaultStoragePolicy : public StoreFunctoreStoragePolicy_label
52  {
53  public: // operators
54  void operator()(T & storage, T value, T) const
55  {
56  storage = value;
57  }
58  };
59  */
60 
62  template < typename T, typename TAccumulation >
64  {
65  public: // typedef
67 
68  public: // operators
69 
70  template < typename X >
71  void operator()(TAccumulation & storage, T value, X) const { Self::store(storage, value); }
72  template < typename X >
73  void operator()(TAccumulation & storage, T value, X, X) const { Self::store(storage, value); }
74  template < typename X >
75  void operator()(TAccumulation & storage, T value, X, X, X) const { Self::store(storage, value); }
76 
77  private: // functions
78  static void store(TAccumulation & storage, T value)
79  {
80  storage += TAccumulation(value);
81  }
82  };
83 
85  template < typename T >
87  {
88  public: // operators
89  void operator()(SparseVector<T> & sv, T value, const std::pair<std::size_t, T> & pair) const
90  {
91  sv.getMap().insert(sv.sparse_end(), std::make_pair(pair.first, value));
92  }
93  void operator()(SparseVector<T> & sv, T value, const std::pair<std::size_t, T> & pair, T) const
94  {
95  sv.getMap().insert(sv.sparse_end(), std::make_pair(pair.first, value));
96  }
97  void operator()(SparseVector<T> & sv, T value, T, const std::pair<std::size_t, T> & pair) const
98  {
99  sv.getMap().insert(sv.sparse_end(), std::make_pair(pair.first, value));
100  }
101  void operator()(SparseVector<T> & sv, T value, const std::pair<std::size_t, T> & pair, std::pair<std::size_t, T>) const
102  {
103  sv.getMap().insert(sv.sparse_end(), std::make_pair(pair.first, value));
104  }
105  };
106  }
107 
108 
109  template < typename TFunctor >
110  class IndexWrap
111  {
112  };
113 
115  template < typename TFunctor, typename TOutput = typename TFunctor::result_type >
117  {
118  public: // typedefs
119 
120  typedef TOutput return_type;
121 
122  private: // Tag classes
123 
124  struct Pair_Tag {};
125  struct Default_Tag {};
126 
127  template < typename _T >
128  struct Tag { typedef Default_Tag type; };
129  template < typename _TKey, typename _TValue >
130  struct Tag<std::pair<_TKey, _TValue> > { typedef Pair_Tag type; };
131 
132  template < typename _T > typename Tag<typename naked_type<_T>::type>::type tagOf(_T) { return typename Tag<typename naked_type<_T>::type>::type (); }
133 
134  public: // constuctors & destructor
135 
136  WrapFunctorForPairs() : m_functor() {}
137 
138 
139  public: // operators
140 
141  /*
142  template < typename T1 >
143  TOutput operator()(T1 x1)
144  {
145  return m_functor(x1);
146  }
147 
148 
149  template < typename TK1, typename T1 >
150  TOutput operator()(std::pair<TK1, T1> & pair1)
151  {
152  return m_functor(pair1->second());
153  }
154  */
155 
156  template < typename T1, typename T2 >
157  TOutput operator()(T1 x1, T2 x2)
158  {
159  return this->wrap(x1, tagOf(x1), x2, tagOf(x2));
160  }
161 
162  /*
163  template < typename T1, typename T2 >
164  TOutput operator()(T1 x1, T2 x2)
165  {
166  return m_functor(x1, x2);
167  }
168  */
169 
170  /*
171  template < typename TK1, typename T1, typename T2 >
172  TOutput operator()(std::pair<TK1, T1> & pair1, T2 x2)
173  {
174  return m_functor(pair1->second, x2);
175  }
176 
177  template < typename T1, typename TK2, typename T2 >
178  TOutput operator()(T1 x1, std::pair<TK2, T2> & pair2)
179  {
180  return m_functor(x1, pair2->second);
181  }
182 
183 
184 
185  template < typename TK1, typename T1, typename TK2, typename T2 >
186  TOutput operator()(std::pair<TK1, T1> & pair1, std::pair<TK2, T2> & pair2) const
187  {
188  }
189  */
190 
191  private: // functions
192 
193  template < typename T1, typename T2 >
194  TOutput wrap(T1 x1, Default_Tag, T2 x2, Default_Tag)
195  {
196  return m_functor(x1, x2);
197  }
198 
199  template < typename T1, typename T2 >
200  TOutput wrap(T1 x1, Default_Tag, T2 & pair2, Pair_Tag)
201  {
202  return m_functor(x1, pair2.second);
203  }
204 
205  template < typename T1, typename T2 >
206  TOutput wrap(T1 & pair1, Pair_Tag, T2 x2, Default_Tag)
207  {
208  return m_functor(pair1.second, x2);
209  }
210 
211  template < typename T1, typename T2 >
212  TOutput wrap(T1 & pair1, Pair_Tag, T2 & pair2, Pair_Tag)
213  {
214  return m_functor(pair1.second, pair2.second);
215  }
216 
217  private: // data
218  TFunctor m_functor;
219  };
220 
223 
224  /*
225  template < typename T >
226  struct is_loop_functor : public boost::is_base_of<LoopFunctor_label, T> {};
227  */
228 
229  template < typename TFunctor, typename TOutput = typename naked_type<TFunctor>::type::return_type >
231  {
232  public: // typedefs
233 
234  typedef TOutput return_type;
235 
236  public: // constructors & destructors
237 
238  LoopWraper() : m_functor() {}
239  LoopWraper(TFunctor & f) : m_functor(f) {}
240 
241  public: // operators
242 
243  template < typename T1 >
244  TOutput operator()(T1 x1)
245  { return m_functor(x1); }
246 
247  template < typename T1, typename T2 >
248  TOutput operator()(T1 x1, T2 x2)
249  { return m_functor(x1, x2); }
250 
251  template < typename T1, typename T2, typename T3 >
252  TOutput operator()(T1 x1, T2 x2, T3 x3)
253  { return m_functor(x1, x2, x3); }
254 
255  public: // functions
256  bool proceed() { return true; }
257  private:
258  TFunctor m_functor;
259  };
260 
261  template < typename TFunctor >
262  typename boost::enable_if<boost::is_stateless<TFunctor>, LoopWraper<TFunctor> >::type
263  loopWraper(TFunctor f) { return LoopWraper<TFunctor>(); }
264 
265  template < typename TFunctor >
266  typename boost::disable_if<boost::is_stateless<TFunctor>, LoopWraper<TFunctor&> >::type
267  loopWraper(TFunctor &f) { return LoopWraper<TFunctor&>(f); }
268 
269 
275  template < typename TFunctor, typename TStorage, typename TStoragePolicy >
277  {
278  public: // typedefs
279 
280  typedef void return_type;
281 
282  public: // constructors & destructor
283  StoreFunctor() : m_functor(), m_data(), m_storagePolicy() {}
284  StoreFunctor(const TStorage & init) : m_functor(), m_data(init), m_storagePolicy() {}
285 
286  public: // set & get
287  const TStorage & get() const { return m_data; }
288 
289  public: // operators
290 
291  /*
292  template < typename T1 >
293  void operator()(std::size_t pos, T1 x)
294  {
295  m_data.getMap().insert(m_data.end(), std::make_pair(pos, m_functor(x)));
296  }
297 
298  template < typename T1, typename T2 >
299  void operator()(std::size_t pos, T1 x, T2 y)
300  {
301  m_data.getMap().insert(m_data.end(), std::make_pair(pos, m_functor(x,y)));
302  }
303  */
304 
305  template < typename T1 >
306  void operator()(T1 & x1)
307  { this->store<T1&>(x1); }
308 
309  template < typename T1 >
310  void operator()(const T1 & x1)
311  { this->store<const T1&>(x1); }
312 
313  template < typename T1, typename T2 >
314  void operator()(T1 & x1, T2 & x2)
315  { this->store<T1&,T2&>(x1,x2); }
316 
317  template < typename T1, typename T2 >
318  void operator()(T1 & x1, const T2 & x2)
319  { this->store<T1&,const T2&>(x1,x2); }
320 
321  template < typename T1, typename T2 >
322  void operator()(const T1 & x1, T2 & x2)
323  { this->store<const T1&,T2&>(x1,x2); }
324 
325  template < typename T1, typename T2 >
326  void operator()(const T1 & x1, const T2 & x2)
327  { this->store<const T1&,const T2&>(x1,x2); }
328 
329  template < typename T1, typename T2, typename T3 >
330  void operator()(T1 & x1, T2 & x2, T3 & x3)
331  {
332  m_storagePolicy(m_data, m_functor(x1, x2, x3), x1, x2, x3);
333  }
334 
335  private: // functions
336 
337  template < typename T1 >
338  void store(T1 x1)
339  {
340  m_storagePolicy(m_data, m_functor(x1), x1);
341  }
342 
343  template < typename T1, typename T2 >
344  void store(T1 x1, T2 x2)
345  {
346  m_storagePolicy(m_data, m_functor(x1, x2), x1, x2);
347  }
348 
349 
350  private: // data
351  TFunctor m_functor;
352  TStorage m_data;
353  TStoragePolicy m_storagePolicy;
354  };
355 
356 
357 
358 
359 
361  template < typename T >
363  {
364  //StoreFunctor<std::multiplies<T>, SparseVector<T> > f(SparseVector<T>(sv1.size()));
366  loop_mapPairs(sv1.getMap(), sv2.getMap(), f);
367  return f.get();
368  }
369 
371  template < typename T >
373  {
374  //StoreFunctor<std::plus<T>, SparseVector<T> > f(SparseVector<T>(sv1.size()));
376  loop_mapEach(sv1.getMap(), sv2.getMap(), f);
377  return f.get();
378  }
379 
381  template < typename T >
383  {
385  //StoreFunctor<std::minus<T>, SparseVector<T> > f(SparseVector<T>(sv1.size()));
386  loop_mapEach(sv1.getMap(), sv2.getMap(), f);
387  return f.get();
388  }
389 
391  template < typename T >
393  {
394  //StoreFunctor<std::divides<T>, SparseVector<T> > f(SparseVector<T>(sv1.size()));
396  loop_mapEach(sv1.getMap(), sv2.getMap(), f);
397  return f.get();
398  }
399 
402  template < typename TPrecision, typename T >
403  TPrecision dot(const SparseVector<T> &sv1, const SparseVector<T> &sv2)
404  {
405  //StoreFunctor<std::multiplies<T>, T > f(0.0);
407  loop_mapPairs(sv1.getMap(), sv2.getMap(), f);
408  return f.get();
409  }
410 
411  /*
412  template < typename T >
413  bool operator==(const SparseVector<T> &sv1, const SparseVector<T> &sv2)
414  {
415  }
416  */
417 
418  template < typename T >
419  std::ostream& operator<<(std::ostream& os, const SparseVector<T> v)
420  {
422  for (; i != v.sparse_end(); ++i)
423  {
424  os << "( " << i->first << " : " << i->second << " ) ";
425  }
426  return os;
427  }
428 
429 } // namespace til
430 
431 
432 #endif /*SPARSEVECTOR_H_*/
TOutput operator()(T1 x1, T2 x2, T3 x3)
Definition: SparseVector.h:252
SparseVector< T > operator+(const SparseVector< T > &sv1, const SparseVector< T > &sv2)
Pointwise addition.
Definition: SparseVector.h:372
sparse_iterator sparse_begin()
void operator()(SparseVector< T > &sv, T value, const std::pair< std::size_t, T > &pair, std::pair< std::size_t, T >) const
Definition: SparseVector.h:101
Matrix3< T > operator-(Matrix3< T > const &mat)
Definition: Matrix3.h:187
void operator()(TAccumulation &storage, T value, X, X) const
Definition: SparseVector.h:73
void operator()(SparseVector< T > &sv, T value, const std::pair< std::size_t, T > &pair) const
Definition: SparseVector.h:89
TPrec dot(const numeric_array< T1, D > &a1, const numeric_array< T2, D > &a2, prec< TPrec >)
Return the dot product of two vectors.
Belongs to package Box Do not include directly, include til/Box.h instead.
Definition: Accumulator.h:10
boost::enable_if< boost::is_stateless< TFunctor >, LoopWraper< TFunctor > >::type loopWraper(TFunctor f)
Definition: SparseVector.h:263
SparseVector()
Create a null vector of size 0.
Definition: SparseVector.h:33
void operator()(T1 &x1, T2 &x2, T3 &x3)
Definition: SparseVector.h:330
boost::enable_if< boost::is_empty< TFunctor > >::type loop_mapPairs(TMap1 &map1, TMap2 &map2, TFunctor f)
Definition: globalTraits.h:121
sparse_iterator sparse_end()
TOutput return_type
Definition: SparseVector.h:234
Label class for StoreFunctor storage policy classes.
Definition: SparseVector.h:45
void operator()(SparseVector< T > &sv, T value, const std::pair< std::size_t, T > &pair, T) const
Definition: SparseVector.h:93
A mathematical vector, using sparse storage policy.
Definition: SparseVector.h:24
StoreFunctor storage policy for SparseVectors.
Definition: SparseVector.h:86
A class that mimic the behavior of std::vector but with a storage policy focused on sparse data...
void operator()(SparseVector< T > &sv, T value, T, const std::pair< std::size_t, T > &pair) const
Definition: SparseVector.h:97
INLINE numeric_array< typename combine< T1, T2 >::type, 3 > operator*(const Affine< T1 > &a, const numeric_array< T2, 3 > &v)
Multiplication between a 3D affine transform and a 3D vector.
void operator()(const T1 &x1, const T2 &x2)
Definition: SparseVector.h:326
Map & getMap()
Returns the internal data.
Default storage policy for StoreFunctor.
Definition: SparseVector.h:63
void operator()(T1 &x1)
Definition: SparseVector.h:306
TOutput operator()(T1 x1, T2 x2)
Definition: SparseVector.h:248
Accumulate< T, TAccumulation > Self
Definition: SparseVector.h:66
SparseVector(std::size_t d)
Create a null vector of length d.
Definition: SparseVector.h:35
SparseVector< T > operator/(const SparseVector< T > &sv1, const SparseVector< T > &sv2)
Pointwise division.
Definition: SparseVector.h:392
const TStorage & get() const
Definition: SparseVector.h:287
void operator()(TAccumulation &storage, T value, X) const
Definition: SparseVector.h:71
Label for loop functors.
Definition: SparseVector.h:222
A functor wrapper to transform a functor with output in an inplace functor.
Definition: SparseVector.h:276
Collects template tools used for library implementation.
std::size_t size() const
Alike STL container&#39;s "size".
TOutput operator()(T1 x1)
Definition: SparseVector.h:244
TOutput operator()(T1 x1, T2 x2)
Definition: SparseVector.h:157
void operator()(T1 &x1, T2 &x2)
Definition: SparseVector.h:314
sparse_vector< T > Base
Definition: SparseVector.h:28
LoopWraper(TFunctor &f)
Definition: SparseVector.h:239
boost::enable_if< boost::is_empty< TFunctor > >::type loop_mapEach(TMap1 &map1, TMap2 &map2, TFunctor f)
Definition: globalTraits.h:248
StoreFunctor(const TStorage &init)
Definition: SparseVector.h:284
Wrap functors so that it can accept pairs as input – it then apply the functor on the second argumen...
Definition: SparseVector.h:116
void operator()(TAccumulation &storage, T value, X, X, X) const
Definition: SparseVector.h:75
void operator()(const T1 &x1, T2 &x2)
Definition: SparseVector.h:322
void operator()(const T1 &x1)
Definition: SparseVector.h:310
void operator()(T1 &x1, const T2 &x2)
Definition: SparseVector.h:318