OpenGM  2.3.x
Discrete Graphical Model Library
lpotts.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_LEARNABLE_POTTS_FUNCTION_HXX
3 #define OPENGM_LEARNABLE_POTTS_FUNCTION_HXX
4 
5 #include <algorithm>
6 #include <vector>
7 #include <cmath>
8 
9 #include "opengm/opengm.hxx"
13 
14 namespace opengm {
15 namespace functions {
16 namespace learnable {
17 
28 template<class T, class I = size_t, class L = size_t>
29 class LPotts
30  : public opengm::FunctionBase<opengm::functions::learnable::LPotts<T, I, L>, T, I, L>
31 {
32 public:
33  typedef T ValueType;
34  typedef L LabelType;
35  typedef I IndexType;
36 
37  LPotts();
38  LPotts(const opengm::learning::Weights<T>& weights,
39  const L numLabels,
40  const std::vector<size_t>& weightIDs,
41  const std::vector<T>& feat
42  );
43  LPotts(const L numLabels,
44  const std::vector<size_t>& weightIDs,
45  const std::vector<T>& feat
46  );
47  L shape(const size_t) const;
48  size_t size() const;
49  size_t dimension() const;
50  template<class ITERATOR> T operator()(ITERATOR) const;
51 
52  // parameters
53  void setWeights(const opengm::learning::Weights<T>& weights) const
54  {weights_ = &weights;}
55  size_t numberOfWeights()const
56  {return weightIDs_.size();}
57  I weightIndex(const size_t weightNumber) const
58  {return weightIDs_[weightNumber];} //dummy
59  template<class ITERATOR>
60  T weightGradient(size_t,ITERATOR) const;
61 
62  bool isPotts() const {return true;}
63  bool isGeneralizedPotts() const {return true;}
64 
65 protected:
68  std::vector<size_t> weightIDs_;
69  std::vector<T> feat_;
70 
71 
73 };
74 
75 
76 template <class T, class I, class L>
77 inline
78 LPotts<T, I, L>::LPotts
79 (
80  const opengm::learning::Weights<T>& weights,
81  const L numLabels,
82  const std::vector<size_t>& weightIDs,
83  const std::vector<T>& feat
84  )
85  : weights_(&weights), numLabels_(numLabels), weightIDs_(weightIDs),feat_(feat)
86 {
87  OPENGM_ASSERT( weightIDs_.size()==feat_.size() );
88 }
89 
90 template <class T, class I, class L>
91 inline
93 (
94  const L numLabels,
95  const std::vector<size_t>& weightIDs,
96  const std::vector<T>& feat
97  )
98  : numLabels_(numLabels), weightIDs_(weightIDs),feat_(feat)
99 {
100  OPENGM_ASSERT( weightIDs_.size()==feat_.size() );
101 }
102 
103 template <class T, class I, class L>
104 inline
106 ( )
107  : numLabels_(0), weightIDs_(std::vector<size_t>(0)), feat_(std::vector<T>(0))
108 {
109  OPENGM_ASSERT( weightIDs_.size()==feat_.size() );
110 }
111 
112 
113 template <class T, class I, class L>
114 template <class ITERATOR>
115 inline T
117 (
118  size_t weightNumber,
119  ITERATOR begin
120 ) const {
121  OPENGM_ASSERT(weightNumber< numberOfWeights());
122  if( *(begin) != *(begin+1) )
123  return (*this).feat_[weightNumber];
124  return 0;
125 }
126 
127 template <class T, class I, class L>
128 template <class ITERATOR>
129 inline T
131 (
132  ITERATOR begin
133 ) const {
134  T val = 0;
135  for(size_t i=0;i<numberOfWeights();++i){
136  val += weights_->getWeight(weightIDs_[i]) * weightGradient(i,begin);
137  }
138  return val;
139 }
140 
141 
142 template <class T, class I, class L>
143 inline L
145 (
146  const size_t i
147 ) const {
148  return numLabels_;
149 }
150 
151 template <class T, class I, class L>
152 inline size_t
154  return 2;
155 }
156 
157 template <class T, class I, class L>
158 inline size_t
160  return numLabels_*numLabels_;
161 }
162 
163 } // namespace learnable
164 } // namespace functions
165 
166 
168 template<class T, class I, class L>
170 public:
172 
173  static size_t indexSequenceSize(const opengm::functions::learnable::LPotts<T, I, L>&);
174  static size_t valueSequenceSize(const opengm::functions::learnable::LPotts<T, I, L>&);
175  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR>
176  static void serialize(const opengm::functions::learnable::LPotts<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
177  template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR>
178  static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, opengm::functions::learnable::LPotts<T, I, L>&);
179 };
180 
181 template<class T, class I, class L>
183  enum ID {
185  };
186 };
187 
188 template<class T, class I, class L>
189 inline size_t
191 (
193 ) {
194  return 2+src.weightIDs_.size();
195 }
196 
197 template<class T, class I, class L>
198 inline size_t
200 (
202 ) {
203  return src.feat_.size();
204 }
205 
206 template<class T, class I, class L>
207 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
208 inline void
210 (
212  INDEX_OUTPUT_ITERATOR indexOutIterator,
213  VALUE_OUTPUT_ITERATOR valueOutIterator
214 ) {
215  *indexOutIterator = src.numLabels_;
216  ++indexOutIterator;
217  *indexOutIterator = src.feat_.size();
218  ++indexOutIterator;
219  for(size_t i=0; i<src.weightIDs_.size();++i){
220  *indexOutIterator = src.weightIndex(i);
221  ++indexOutIterator;
222  }
223  for(size_t i=0; i<src.feat_.size();++i){
224  *valueOutIterator = src.feat_[i];
225  ++valueOutIterator;
226  }
227 }
228 
229 template<class T, class I, class L>
230 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
231 inline void
233 (
234  INDEX_INPUT_ITERATOR indexInIterator,
235  VALUE_INPUT_ITERATOR valueInIterator,
237 ) {
238  dst.numLabels_=*indexInIterator;
239  ++ indexInIterator;
240  const size_t numW=*indexInIterator;
241  ++indexInIterator;
242  dst.feat_.resize(numW);
243  dst.weightIDs_.resize(numW);
244  for(size_t i=0; i<numW;++i){
245  dst.feat_[i]=*valueInIterator;
246  dst.weightIDs_[i]=*indexInIterator;
247  ++indexInIterator;
248  ++valueInIterator;
249  }
250 }
251 
252 } // namespace opengm
253 
254 #endif // #ifndef OPENGM_LEARNABLE_FUNCTION_HXX
The OpenGM namespace.
Definition: config.hxx:43
Fallback implementation of member functions of OpenGM functions.
const opengm::learning::Weights< T > * weights_
Definition: lpotts.hxx:66
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
ValueType getWeight(const size_t pi) const
Definition: weights.hxx:66
T weightGradient(size_t, ITERATOR) const
Definition: lpotts.hxx:117
L shape(const size_t) const
Definition: lpotts.hxx:145
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
void setWeights(const opengm::learning::Weights< T > &weights) const
Definition: lpotts.hxx:53
opengm::functions::learnable::LPotts< T, I, L >::ValueType ValueType
Definition: lpotts.hxx:171
I weightIndex(const size_t weightNumber) const
Definition: lpotts.hxx:57
Learnable feature function for two variables.
Definition: lpotts.hxx:29
std::vector< size_t > weightIDs_
Definition: lpotts.hxx:68