OpenGM  2.3.x
Discrete Graphical Model Library
fieldofexperts.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_FoE_FUNCTION_HXX
3 #define OPENGM_FoE_FUNCTION_HXX
4 
5 #include <algorithm>
6 #include <vector>
7 #include <cmath>
8 
9 #include "opengm/opengm.hxx"
13 
14 namespace opengm {
15 
19 template<class T, class I = size_t, class L = size_t>
21 : public FunctionBase<FoEFunction<T, I, L>, T, size_t, size_t>
22 {
23 public:
24  typedef T ValueType;
25  typedef L LabelType;
26  typedef I IndexType;
27 
28  FoEFunction(const std::vector<T>&, const std::vector<T>&, const L);
29  template<class IT>
30  FoEFunction(IT, IT, const L, const I, const size_t);
31  FoEFunction();
32  LabelType shape(const size_t) const;
33  size_t size() const;
34  size_t dimension() const;
35  template<class ITERATOR> ValueType operator()(ITERATOR) const;
36 
37  void setDefault();
38 
39 protected:
40  std::vector<T> experts_;
41  std::vector<T> alphas_;
43  I order_;
44  mutable std::vector<T> l_;
45 
46 friend class FunctionSerialization<FoEFunction<T, I, L> > ;
47 };
48 
51 template<class T, class I, class L>
52 struct FunctionRegistration<FoEFunction<T, I, L> > {
53  enum ID {
55  };
56 };
57 
59 template<class T, class I, class L>
60 class FunctionSerialization<FoEFunction<T, I, L> > {
61 public:
62  typedef typename FoEFunction<T, I, L>::ValueType ValueType;
63 
64  static size_t indexSequenceSize(const FoEFunction<T, I, L>&);
65  static size_t valueSequenceSize(const FoEFunction<T, I, L>&);
66  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR>
67  static void serialize(const FoEFunction<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
68  template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR>
69  static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, FoEFunction<T, I, L>&);
70 };
72 
74  template <class T, class I, class L>
75  inline
77  ()
78  {
79  experts_.resize(0);
80  alphas_.resize(0);
81  numLabels_= 0;
82  order_ = 0;
83  l_.resize(order_);
84  }
85 
86  template <class T, class I, class L>
87  inline void
89  ()
90  {
91  experts_.resize(3*4);
92  alphas_.resize(3);
93 
94  const double a_alpha[3] = {0.586612685392731, 1.157638405566669, 0.846059486257292};
95  const double a_expert[3][4] = {
96  {-0.0582774013402734, 0.0339010363051084, -0.0501593018104054, 0.0745568557931712},
97  {0.0492112815304123, -0.0307820846538285, -0.123247230948424, 0.104812330861557},
98  {0.0562633568728865, 0.0152832583489560, -0.0576215592718086, -0.0139673758425540}
99  };
100  for(size_t e=0; e<3; ++e){
101  alphas_[e] = a_alpha[e];
102  OPENGM_ASSERT( alphas_[e] == a_alpha[e]);
103  for(size_t i=0; i<4;++i){
104  experts_[e+i*3] = a_expert[e][i];
105  }
106  }
107  numLabels_= 256;
108  order_ = 4;
109  l_.resize(order_);
110  }
111 
112 
117  template <class T, class I, class L>
118  inline
120  (const std::vector<T>& e, const std::vector<T>& a, const L numL)
121  {
122  experts_ = e;
123  alphas_ = a;
124  numLabels_ = numL;
125  order_ = e.size()/a.size();
126  l_.resize(order_);
127  OPENGM_ASSERT(order_*alphas_.size() == experts_.size());
128  }
129 
134  template <class T, class I, class L>
135  template<class IT>
136  inline
137  FoEFunction<T, I, L>::FoEFunction(IT ite, IT ita, const L numLabels, const I numVars, const size_t numExperts){
138  numLabels_ = numLabels;
139  order_ = numVars;
140  experts_.resize(numVars*numExperts);
141  alphas_.resize(numExperts);
142  l_.resize(order_);
143  for(size_t i=0; i<numVars*numExperts; ++i,++ite)
144  experts_[i] = *ite;
145  for(size_t i=0; i<numExperts; ++i,++ita)
146  alphas_[i] = *ita;
147  }
148 
149 
150 template <class T, class I, class L>
151 template <class ITERATOR>
152 inline T
154 (
155  ITERATOR begin
156 ) const {
157  //copy/cast one time to avoid additional casts
158  for (size_t j = 0; j < order_; ++j) {
159  l_[j] = static_cast<T>(*begin);
160  ++begin;
161  OPENGM_ASSERT(l_[j]< numLabels_);
162  }
163  ValueType val = 0.0;
164  size_t i = 0;
165  for (size_t e = 0; e < alphas_.size(); ++e) {
166  ValueType dot = 0.0;
167  for (size_t j = 0; j < order_; ++j,++i) {
168  dot += experts_[i] * l_[j];
169  }
170  val += alphas_[e] * std::log(1 + 0.5 * dot * dot);
171  }
172  return val;
173 }
174 
175 template <class T, class I, class L>
176 inline L
178 (
179  const size_t i
180 ) const {
181  OPENGM_ASSERT(i < dimension());
182  return numLabels_;
183 }
184 
185 template <class T, class I, class L>
186 inline size_t
188  return order_;
189 }
190 
191 template <class T, class I, class L>
192 inline size_t
194  size_t s=1;
195  for(size_t i=0; i<dimension(); ++i)
196  s *= numLabels_;
197  return s;
198 }
199 
200 template<class T, class I, class L>
201 inline size_t
203 (
204  const FoEFunction<T, I, L> & src
205 ) {
206  return 3;
207 }
208 
209 template<class T, class I, class L>
210 inline size_t
211 FunctionSerialization<FoEFunction<T, I, L> >::valueSequenceSize
212 (
213  const FoEFunction<T, I, L> & src
214 ) {
215  return src.experts_.size()+src.alphas_.size();
216 }
217 
218 template<class T, class I, class L>
219 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
220 inline void
221 FunctionSerialization<FoEFunction<T, I, L> >::serialize
222 (
223  const FoEFunction<T, I, L> & src,
224  INDEX_OUTPUT_ITERATOR indexOutIterator,
225  VALUE_OUTPUT_ITERATOR valueOutIterator
226 ) {
227  for(size_t i=0; i<src.experts_.size(); ++i){
228  *valueOutIterator = src.experts_[i];
229  ++valueOutIterator;
230  }
231  std::cout <<std::endl;
232  for(size_t i=0; i<src.alphas_.size(); ++i){
233  *valueOutIterator = src.alphas_[i];
234  ++valueOutIterator;
235  }
236 
237  *indexOutIterator = src.alphas_.size();
238  ++indexOutIterator;
239  *indexOutIterator = src.order_;
240  ++indexOutIterator;
241  *indexOutIterator = src.numLabels_;
242 }
243 
244 template<class T, class I, class L>
245 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
246 inline void
247 FunctionSerialization<FoEFunction<T, I, L> >::deserialize
248 (
249  INDEX_INPUT_ITERATOR indexInIterator,
250  VALUE_INPUT_ITERATOR valueInIterator,
251  FoEFunction<T, I, L> & dst
252 ) {
253  size_t numExperts = *indexInIterator;
254  ++indexInIterator;
255  size_t order = *indexInIterator;
256  ++indexInIterator;
257  size_t numLabels = *indexInIterator;
258 
259  std::vector<T> alphas(numExperts);
260  std::vector<T> experts(numExperts*order);
261 
262  for(size_t i=0; i<numExperts*order; ++i){
263  experts[i] = *valueInIterator;
264  ++valueInIterator;
265  }
266  for(size_t i=0; i<numExperts; ++i){
267  alphas[i] = *valueInIterator;
268  ++valueInIterator;
269  }
270 
271  dst=FoEFunction<T, I, L>(experts,alphas,numLabels);
272 }
273 
274 } // namespace opengm
275 
276 #endif // #ifndef OPENGM_FoE_FUNCTION_HXX
size_t size() const
The OpenGM namespace.
Definition: config.hxx:43
Fallback implementation of member functions of OpenGM functions.
FoEFunction()
constructor for demo function
ValueType operator()(ITERATOR) const
Field of Expert function.
LabelType shape(const size_t) const
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
std::vector< T > experts_
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
std::vector< T > alphas_
size_t dimension() const
std::vector< T > l_