OpenGM  2.3.x
Discrete Graphical Model Library
lweightedsum_of_functions.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_LEARNABLE_LWEIGHTEDSUM_OF_FUNCTIONS_FUNCTION_HXX
3 #define OPENGM_LEARNABLE_LWEIGHTEDSUM_OF_FUNCTIONS_FUNCTION_HXX
4 
5 #include <algorithm>
6 #include <vector>
7 #include <cmath>
8 
9 #include "opengm/opengm.hxx"
14 
15 namespace opengm {
16 namespace functions {
17 namespace learnable {
18 
27 template<class T, class I = size_t, class L = size_t>
29  : public opengm::FunctionBase<opengm::functions::learnable::LWeightedSumOfFunctions<T, I, L>, T, I, L>
30 {
31 public:
32  typedef T ValueType;
33  typedef L LabelType;
34  typedef I IndexType;
35 
37  LWeightedSumOfFunctions(const std::vector<L>& shape,
38  const opengm::learning::Weights<T>& weights,
39  const std::vector<size_t>& weightIDs,
40  const std::vector<marray::Marray<T> >& feat
41  );
42 
43  L shape(const size_t) const;
44  size_t size() const;
45  size_t dimension() const;
46  template<class ITERATOR> T operator()(ITERATOR) const;
47 
48  // parameters
49  void setWeights(const opengm::learning::Weights<T>& weights) const
50  {weights_ = &weights;}
51  size_t numberOfWeights()const
52  {return weightIDs_.size();}
53  I weightIndex(const size_t weightNumber) const
54  {return weightIDs_[weightNumber];} //dummy
55  template<class ITERATOR>
56  T weightGradient(size_t,ITERATOR) const;
57 
58 protected:
60  std::vector<L> shape_;
61  std::vector<size_t> weightIDs_;
62  std::vector<marray::Marray<T> > feat_;
63 
65 };
66 
67 
68 template <class T, class I, class L>
69 inline
71 (
72  const std::vector<L>& shape,
73  const opengm::learning::Weights<T>& weights,
74  const std::vector<size_t>& weightIDs,
75  const std::vector<marray::Marray<T> >& feat
76  )
77  : shape_(shape), weights_(&weights), weightIDs_(weightIDs),feat_(feat)
78 {
79  OPENGM_ASSERT( weightIDs_.size() == feat_.size() );
80  for(size_t i=0; i<weightIDs_.size(); ++i){
81  OPENGM_ASSERT( size() == feat_[i].size() );
82  for(size_t j=0; j<dimension(); ++j)
83  OPENGM_ASSERT( shape_[j] == feat_[i].shape(j))
84  }
85 }
86 
87 template <class T, class I, class L>
88 inline
90  : shape_(std::vector<L>(0)), weightIDs_(std::vector<size_t>(0)), feat_(std::vector<marray::Marray<T> >(0))
91 {
92  ;
93 }
94 
95 
96 template <class T, class I, class L>
97 template <class ITERATOR>
98 inline T
100 (
101  size_t weightNumber,
102  ITERATOR begin
103 ) const {
104  OPENGM_ASSERT(weightNumber< numberOfWeights());
105  return feat_[weightNumber](begin);
106 }
107 
108 template <class T, class I, class L>
109 template <class ITERATOR>
110 inline T
112 (
113  ITERATOR begin
114 ) const {
115  T val = 0;
116  for(size_t i=0;i<numberOfWeights();++i){
117  val += weights_->getWeight(weightIDs_[i]) * weightGradient(i,begin);
118  }
119  return val;
120 }
121 
122 
123 template <class T, class I, class L>
124 inline L
126 (
127  const size_t i
128 ) const {
129  return shape_[i];
130 }
131 
132 template <class T, class I, class L>
133 inline size_t
135  return shape_.size();
136 }
137 
138 template <class T, class I, class L>
139 inline size_t
141  size_t s = 1;
142  for(size_t i=0; i<dimension(); ++i)
143  s *=shape_[i];
144  return s;
145 }
146 
147 } // namespace learnable
148 } // namespace functions
149 
150 
152 template<class T, class I, class L>
154 public:
156 
157  static size_t indexSequenceSize(const opengm::functions::learnable::LWeightedSumOfFunctions<T, I, L>&);
158  static size_t valueSequenceSize(const opengm::functions::learnable::LWeightedSumOfFunctions<T, I, L>&);
159  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR>
160  static void serialize(const opengm::functions::learnable::LWeightedSumOfFunctions<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
161  template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR>
162  static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, opengm::functions::learnable::LWeightedSumOfFunctions<T, I, L>&);
163 };
164 
165 template<class T, class I, class L>
167  enum ID {
169  };
170 };
171 
172 template<class T, class I, class L>
173 inline size_t
175 (
177 ) {
178  return 1+src.shape_.size()+1+src.weightIDs_.size();
179 }
180 
181 template<class T, class I, class L>
182 inline size_t
184 (
186 ) {
187  return src.feat_.size()*src.size();
188 }
189 
190 template<class T, class I, class L>
191 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
192 inline void
194 (
196  INDEX_OUTPUT_ITERATOR indexOutIterator,
197  VALUE_OUTPUT_ITERATOR valueOutIterator
198 ) {
199  // save shape
200  *indexOutIterator = src.shape_.size();
201  ++indexOutIterator;
202  for(size_t i=0; i<src.shape_.size();++i){
203  *indexOutIterator = src.shape_[i];
204  ++indexOutIterator;
205  }
206  //save parameter ids
207  *indexOutIterator = src.weightIDs_.size();
208  ++indexOutIterator;
209  for(size_t i=0; i<src.weightIDs_.size();++i){
210  *indexOutIterator = src.weightIDs_[i];
211  ++indexOutIterator;
212  }
213 
214  OPENGM_ASSERT_OP(src.weightIDs_.size(), ==, src.feat_.size());
215 
216  // save features
217  for(size_t i=0; i<src.weightIDs_.size();++i){
218  for(size_t j=0; j<src.feat_[i].size();++j){
219  *valueOutIterator = src.feat_[i](j);
220  ++valueOutIterator;
221  }
222  }
223 }
224 
225 template<class T, class I, class L>
226 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
227 inline void
229 (
230  INDEX_INPUT_ITERATOR indexInIterator,
231  VALUE_INPUT_ITERATOR valueInIterator,
233 ) {
234  //read shape
235  size_t dim = *indexInIterator;
236  size_t size = 1;
237  ++indexInIterator;
238  std::vector<L> shape(dim);
239  for(size_t i=0; i<dim;++i){
240  shape[i] = *indexInIterator;
241  size *= *indexInIterator;
242  ++indexInIterator;
243  }
244  //read parameter ids
245  size_t numW =*indexInIterator;
246  ++indexInIterator;
247  std::vector<size_t> parameterIDs(numW);
248  for(size_t i=0; i<numW;++i){
249  parameterIDs[i] = *indexInIterator;
250  ++indexInIterator;
251  }
252  //read features
253  std::vector<marray::Marray<T> > feat(numW,marray::Marray<T>(shape.begin(),shape.end()));
254  for(size_t i=0; i<numW;++i){
255  for(size_t j=0; j<size;++j){
256  feat[i](j)=*valueInIterator;
257  ++valueInIterator;
258  }
259  }
260 }
261 
262 } // namespace opengm
263 
264 #endif //OPENGM_LEARNABLE_LWEIGHTEDSUM_OF_FUNCTIONS_FUNCTION_HXX
The OpenGM namespace.
Definition: config.hxx:43
Fallback implementation of member functions of OpenGM functions.
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
ValueType getWeight(const size_t pi) const
Definition: weights.hxx:66
#define OPENGM_ASSERT_OP(a, op, b)
runtime assertion
Definition: opengm.hxx:53
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
Learnable weighted sum of feature-functions.
opengm::functions::learnable::LWeightedSumOfFunctions< T, I, L >::ValueType ValueType
void setWeights(const opengm::learning::Weights< T > &weights) const