OpenGM  2.3.x
Discrete Graphical Model Library
pottsn.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_POTTS_N_FUNCTION_HXX
3 #define OPENGM_POTTS_N_FUNCTION_HXX
4 
5 #include <algorithm>
6 #include <vector>
7 
8 #include "opengm/opengm.hxx"
11 
12 namespace opengm {
13 
17 template<class T, class I = size_t, class L = size_t>
19 : public FunctionBase<PottsNFunction<T, I, L>, T, I, L> {
20 public:
21  typedef T ValueType;
22  typedef I IndexType;
23  typedef L LabelType;
24  typedef T value_type;
25 
27  template<class ITERATOR> PottsNFunction(ITERATOR, ITERATOR, const T, const T);
28  LabelType shape(const size_t) const;
29  size_t size() const;
30  size_t dimension() const;
31  template<class ITERATOR> ValueType operator()(ITERATOR) const;
32  bool isPotts() const
33  { return true; }
34  bool isGeneralizedPotts() const
35  { return true; }
36 
37 private:
38  std::vector<LabelType> shape_;
39  size_t size_;
40  ValueType valueEqual_;
41  ValueType valueNotEqual_;
42 
43 friend class FunctionSerialization<PottsNFunction<T, I, L> >;
44 };
45 
48 template<class T, class I, class L>
49 struct FunctionRegistration<PottsNFunction<T, I, L> > {
50  enum ID {
52  };
53 };
54 
56 template<class T, class I, class L>
57 class FunctionSerialization<PottsNFunction<T, I, L> > {
58 public:
59  typedef typename PottsNFunction<T, I, L>::ValueType ValueType;
60 
61  static size_t indexSequenceSize(const PottsNFunction<T, I, L> &);
62  static size_t valueSequenceSize(const PottsNFunction<T, I, L> &);
63  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
64  static void serialize(const PottsNFunction<T, I, L> &, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR );
65  template<class INDEX_INPUT_ITERATOR , class VALUE_INPUT_ITERATOR>
66  static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, PottsNFunction<T, I, L> &);
67 };
69 
70 template<class T, class I, class L>
71 template <class ITERATOR>
72 inline
74 (
75  ITERATOR shapeBegin,
76  ITERATOR shapeEnd,
77  const T valueEqual,
78  const T valueNotEqual
79 )
80 : shape_(shapeBegin, shapeEnd),
81  size_(std::accumulate(shapeBegin, shapeEnd, 1, std::multiplies<typename std::iterator_traits<ITERATOR>::value_type >())),
82  valueEqual_(valueEqual),
83  valueNotEqual_(valueNotEqual)
84 {
85  OPENGM_ASSERT(shape_.size() != 0);
86 }
87 
88 template<class T, class I, class L>
89 inline
91 : shape_(),
92  size_(0),
93  valueEqual_(T()),
94  valueNotEqual_(T())
95 {}
96 
97 template<class T, class I, class L>
98 template <class ITERATOR>
99 inline T
101 (
102  ITERATOR begin
103 ) const {
104  size_t tmp = static_cast<size_t> (*begin);
105  for(size_t i=0;i<shape_.size(); ++i) {
106  if(static_cast<size_t> (begin[i]) != tmp) {
107  return valueNotEqual_;
108  }
109  }
110  return valueEqual_;
111 }
112 
113 template<class T, class I, class L>
116 (
117  const size_t i
118 ) const {
119  OPENGM_ASSERT(i < shape_.size());
120  return shape_[i];
121 }
122 
123 template<class T, class I, class L>
124 inline size_t
126  return shape_.size();
127 }
128 
129 template<class T, class I, class L>
130 inline size_t
132  return size_;
133 }
134 
135 template<class T, class I, class L>
136 inline size_t
138 (
139  const PottsNFunction<T, I, L> & src
140 ) {
141  return src.dimension()+1;
142 }
143 
144 template<class T, class I, class L>
145 inline size_t
146 FunctionSerialization<PottsNFunction<T, I, L> >::valueSequenceSize
147 (
148  const PottsNFunction<T, I, L> & src
149 ) {
150  return 2;
151 }
152 
153 template<class T, class I, class L>
154 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
155 inline void
156 FunctionSerialization<PottsNFunction<T, I, L> >::serialize
157 (
158  const PottsNFunction<T, I, L> & src,
159  INDEX_OUTPUT_ITERATOR indexOutIterator,
160  VALUE_OUTPUT_ITERATOR valueOutIterator
161 ) {
162  const size_t dim = src.dimension();
163  *indexOutIterator = dim;
164  for(size_t i=0;i<dim;++i) {
165  ++indexOutIterator;
166  *indexOutIterator = src.shape(i);
167  }
168  *valueOutIterator = src.valueEqual_;
169  ++valueOutIterator;
170  *valueOutIterator = src.valueNotEqual_;
171 }
172 
173 template<class T, class I, class L>
174 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
175 inline void
176 FunctionSerialization<PottsNFunction<T, I, L> >::deserialize
177 (
178  INDEX_INPUT_ITERATOR indexInIterator,
179  VALUE_INPUT_ITERATOR valueInIterator,
180  PottsNFunction<T, I, L> & dst
181 ) {
182  const size_t dim = *indexInIterator;
183  ++indexInIterator;
184  std::vector<size_t> shape(dim);
185  for(size_t i=0; i<dim; ++i) {
186  shape[i] = *indexInIterator;
187  ++indexInIterator;
188  }
189 
190  const ValueType param1 = *valueInIterator;
191  ++valueInIterator;
192  const ValueType param2 = *valueInIterator;
193  dst = PottsNFunction<T, I, L>(shape.begin(), shape.end(), param1, param2);
194 }
195 
196 } // namespace opengm
197 
198 #endif // #ifndef OPENGM_POTTS_N_FUNCTION_HXX
size_t size() const
Definition: pottsn.hxx:131
LabelType shape(const size_t) const
Definition: pottsn.hxx:116
The OpenGM namespace.
Definition: config.hxx:43
Fallback implementation of member functions of OpenGM functions.
ValueType operator()(ITERATOR) const
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
size_t dimension() const
Definition: pottsn.hxx:125
bool isPotts() const
Definition: pottsn.hxx:32
bool isGeneralizedPotts() const
Definition: pottsn.hxx:34
Potts function in N variables.
Definition: pottsn.hxx:18