OpenGM  2.3.x
Discrete Graphical Model Library
utilities2.hxx
Go to the documentation of this file.
1 /*
2  * smallobjects.h
3  *
4  * Created on: Jul 28, 2010
5  * Author: bsavchyn
6  */
7 
8 #ifndef UTILITIES2_HXX_
9 #define UTILITIES2_HXX_
10 #include <functional>
11 #include <numeric>
12 #include <string>
13 #include <stdexcept>
14 #include <cmath>
15 #include <sstream>
16 
17 #ifdef TRWS_DEBUG_OUTPUT
18 #include "output_debug_utils.hxx"
19 #endif
20 
21 namespace opengm {
22 namespace trws_base{
23 
24 template<class AnyType>
25 std::string any2string(const AnyType& any)
26 {
27  std::stringstream out;
28  out << any;
29  return out.str();
30 }
31 
32 template<class GM>
34 {
35 public:
36  typedef typename GM::IndexType IndexType;
37  static const IndexType InvalidIndex;
38  VariableToFactorMapping(const GM& gm);
39  IndexType operator() (IndexType var)const{OPENGM_ASSERT(var < _mapping.size()); return _mapping[var];}
40  bool EachVariableHasUnaryFactor()const{return (_numberOfUnaryFactors==_mapping.size());}
41  IndexType numberOfUnaryFactors()const{return _numberOfUnaryFactors;}
42 private:
43  std::vector<IndexType> _mapping;
44  IndexType _numberOfUnaryFactors;
45 };
46 
47 template <class GM>
48 const typename VariableToFactorMapping<GM>::IndexType VariableToFactorMapping<GM>::InvalidIndex=std::numeric_limits<IndexType>::max();
49 
50 template<class GM>
52 _mapping(gm.numberOfVariables(),InvalidIndex)//invalid index
53 {
54  for (IndexType i=0;i<gm.numberOfFactors();++i)
55  if (gm[i].numberOfVariables() == 1)
56  { if (_mapping[gm[i].variableIndex(0)]==InvalidIndex)
57  _mapping[gm[i].variableIndex(0)]=i;
58  else std::runtime_error("VariableToFactorMapping::VariableToFactorMapping() : duplicate unary factor!");
59  }
60 
61  _numberOfUnaryFactors=std::count_if(_mapping.begin(),_mapping.end(),std::bind2nd(std::not_equal_to<IndexType>(),InvalidIndex));
62 }
63 
64 template<class FACTOR>
66 {
67 public:
68  typedef typename FACTOR::ValueType ValueType;
69  typedef typename FACTOR::LabelType LabelType;
70  FactorWrapper(const FACTOR& f):_f(f){};
71  ValueType operator () (LabelType l1, LabelType l2)const
72  {LabelType lab[]={l1,l2}; return _f(lab);}
73 private:
74  const FACTOR& _f;
75 };
76 
77 
78 template < class InputIterator, class UnaryOperator >
79 InputIterator transform_inplace ( InputIterator first, InputIterator last, UnaryOperator op )
80 {
81  while (first != last)
82  {
83  *first= op(*first);
84  ++first;
85  }
86 
87  return first;
88 }
89 
90 inline void exception_check (bool condition,const std::string& str)
91 {
92  if (!condition) throw std::runtime_error(str);
93 }
94 
95 template < class Matrix,class OutputIterator, class Pseudo2DArray>
96 OutputIterator copy_transpose( const Matrix* src,size_t totalsize,OutputIterator outBegin,size_t rowlength, Pseudo2DArray& arr2d)
97 {
98  exception_check(totalsize%rowlength == 0,"copy_transpose(): totalsize%rowlength != 0");
99 
100  arr2d.resize(rowlength,totalsize/rowlength);
101  for (size_t i=0;i<rowlength;++i)
102  outBegin=std::copy(arr2d.beginSrc(src,i),arr2d.endSrc(src,i),outBegin);
103 
104  return outBegin;
105 }
106 
107 
108 template <class T> struct plus2ndMul : std::binary_function <T,T,T> {
109  plus2ndMul(T mul):_mul(mul){};
110  T operator() (T x, T y) const
111  {return x+y*_mul;}
112 private:
113  T _mul;
114 };
115 
116 template <class T> struct mul2ndPlus : std::binary_function <T,T,T> {
117  mul2ndPlus(T add):_add(add){};
118  T operator() (T x, T y) const
119  {return x*(y+_add);}
120 private:
121  T _add;
122 };
123 
124 template <class T> struct mulAndExp : std::unary_function <T,T> {
125  mulAndExp(T mul):_mul(mul){};
126  T operator() (T x) const
127  {return ::exp(_mul*x);}
128 private:
129  T _mul;
130 };
131 
132 
133 template <class T> struct make0ifless : std::unary_function <T,T> {
134  make0ifless(T threshold):_threshold(threshold){};
135  T operator() (T x) const
136  {return (x < _threshold ? 0.0 : x);}
137 private:
138  T _threshold;
139 };
140 
141 template <class T> struct minusminus : std::binary_function <T,T,T> {
142  T operator() (const T& x, const T& y) const
143  {return y-x;}
144 };
145 
146 template <class T> struct plusplusConst : std::binary_function <T,T,T>
147 {
148  plusplusConst(const T& constant):_constant(constant) {};
149  T operator() (const T& x, const T& y) const
150  {return x+y+_constant;}
151 private:
152  T _constant;
153 };
154 
155 
156 template <class T> struct maximum : std::binary_function <T,T,T> {
157  T operator() (const T& x, const T& y) const
158  {return std::max(x,y);}
159 };
160 
161 
162  template<class T>
164  {
165  public:
166  typedef T value_type;
167  typedef std::forward_iterator_tag iterator_category;
168  typedef void difference_type;
169  typedef T* pointer;
170  typedef T& reference;
171  srcIterator():_pbin(0),_pindex(0){};
172  srcIterator(const srcIterator<T>& it):_pbin(it._pbin),_pindex(it._pindex){};
173  srcIterator(T* pbin, size_t* pindex):_pbin(pbin),_pindex(pindex){};
174  //T& operator * (){return (*_pbin)[*_pindex];}
175  T& operator * (){return *(_pbin+(*_pindex));}
176  srcIterator& operator ++(){++_pindex; return *this;}
177  srcIterator operator ++(int){srcIterator it(*this);++_pindex; return it;}
178  bool operator != (const srcIterator& it)const{return ((it._pbin!=_pbin)||(it._pindex!=_pindex));};
179  bool operator == (const srcIterator& it)const{return !(*this!=it);}
180  srcIterator& operator +=(size_t offset){_pindex+=offset; return (*this);}
181  private:
182  T* _pbin;
183  size_t* _pindex;
184  };
185 
186  template<class T>
187  srcIterator<T> operator + (const srcIterator<T>& it,size_t offset){srcIterator<T> result=it; return (result+=offset);}
188 
189  template<class T>
191  {
192  public:
194  typedef const T* const_trgiterator;
196  typedef T* trgiterator;
197 
198  Pseudo2DArray(size_t srcsize=0,size_t trgsize=0):_srcsize(srcsize),_trgsize(trgsize){_setupindex();};
199 
200  inline void resize(size_t srcsize,size_t trgsize);
201 
202  const_srciterator beginSrc(const T* pbin,size_t src) {assert(src<_srcsize); return const_srciterator(pbin,&_index[src*_trgsize]);};
203  const_srciterator endSrc(const T* pbin,size_t src){return beginSrc(pbin,src)+_trgsize;};
204 
205  const_trgiterator beginTrg(const T* pbin,size_t trg){assert(trg<_trgsize); return pbin+trg*_srcsize;};
206  const_trgiterator endTrg(const T* pbin,size_t trg){return beginTrg(pbin,trg)+_srcsize;}
207 
208  srciterator beginSrcNC(T* pbin,size_t src) {assert(src<_srcsize); return srciterator(pbin,&_index[src*_trgsize]);};
209  srciterator endSrcNC(T* pbin,size_t src){return beginSrcNC(pbin,src)+_trgsize;};
210 
211  trgiterator beginTrgNC(T* pbin,size_t trg){assert(trg<_trgsize); return pbin+trg*_srcsize;};
212  trgiterator endTrgNC(T* pbin,size_t trg){return beginTrgNC(pbin,trg)+_srcsize;}
213 
214  private:
215  void _setupindex();
216  size_t _srcsize;
217  size_t _trgsize;
218  std::vector<size_t> _index;
219  };
220 
221  template<class T>
222  void Pseudo2DArray<T>::resize(size_t srcsize,size_t trgsize)
223  {
224  if ((srcsize==_srcsize) && (trgsize==_trgsize))
225  return;
226 
227  _srcsize=srcsize;
228  _trgsize=trgsize;
229  _setupindex();
230  };
231 
232  template<class T>
234  {
235  _index.assign(_srcsize*_trgsize,0);
236  if (_index.empty())
237  return;
238  size_t* _pindex=&_index[0];
239  for (size_t src=0;src<_srcsize;++src)
240  for (size_t trg=0;trg<_trgsize;++trg)
241  *(_pindex++)=trg*_srcsize+src;
242  };
243 
244 
245  template<class Object>
246  void DeallocatePointer(Object* p)
247  {
248  if (p!=0) delete p;
249  }
250 
251 
252 };
253 }
254 
255 #endif /* SMALLOBJECTS_H_ */
void DeallocatePointer(Object *p)
Definition: utilities2.hxx:246
T operator()(T x, T y) const
Definition: utilities2.hxx:118
srcIterator< T > operator+(const srcIterator< T > &it, size_t offset)
Definition: utilities2.hxx:187
The OpenGM namespace.
Definition: config.hxx:43
plusplusConst(const T &constant)
Definition: utilities2.hxx:148
void exception_check(bool condition, const std::string &str)
Definition: utilities2.hxx:90
void resize(size_t srcsize, size_t trgsize)
Definition: utilities2.hxx:222
ValueType operator()(LabelType l1, LabelType l2) const
Definition: utilities2.hxx:71
trgiterator beginTrgNC(T *pbin, size_t trg)
Definition: utilities2.hxx:211
const_srciterator endSrc(const T *pbin, size_t src)
Definition: utilities2.hxx:203
Pseudo2DArray(size_t srcsize=0, size_t trgsize=0)
Definition: utilities2.hxx:198
T operator()(const T &x, const T &y) const
Definition: utilities2.hxx:142
srcIterator(T *pbin, size_t *pindex)
Definition: utilities2.hxx:173
srcIterator< const T > const_srciterator
Definition: utilities2.hxx:193
const_trgiterator beginTrg(const T *pbin, size_t trg)
Definition: utilities2.hxx:205
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
srciterator beginSrcNC(T *pbin, size_t src)
Definition: utilities2.hxx:208
srciterator endSrcNC(T *pbin, size_t src)
Definition: utilities2.hxx:209
bool operator!=(const srcIterator &it) const
Definition: utilities2.hxx:178
InputIterator transform_inplace(InputIterator first, InputIterator last, UnaryOperator op)
Definition: utilities2.hxx:79
std::forward_iterator_tag iterator_category
Definition: utilities2.hxx:167
IndexType operator()(IndexType var) const
Definition: utilities2.hxx:39
OutputIterator copy_transpose(const Matrix *src, size_t totalsize, OutputIterator outBegin, size_t rowlength, Pseudo2DArray &arr2d)
Definition: utilities2.hxx:96
std::string any2string(const AnyType &any)
Definition: utilities2.hxx:25
srcIterator & operator+=(size_t offset)
Definition: utilities2.hxx:180
trgiterator endTrgNC(T *pbin, size_t trg)
Definition: utilities2.hxx:212
srcIterator(const srcIterator< T > &it)
Definition: utilities2.hxx:172
T operator()(const T &x, const T &y) const
Definition: utilities2.hxx:157
T operator()(T x, T y) const
Definition: utilities2.hxx:110
T operator()(const T &x, const T &y) const
Definition: utilities2.hxx:149
const_trgiterator endTrg(const T *pbin, size_t trg)
Definition: utilities2.hxx:206
bool operator==(const srcIterator &it) const
Definition: utilities2.hxx:179
const_srciterator beginSrc(const T *pbin, size_t src)
Definition: utilities2.hxx:202