OpenGM  2.3.x
Discrete Graphical Model Library
absolute_difference.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_ABSOLUTE_DIFFERENCE_FUNCTION_HXX
3 #define OPENGM_ABSOLUTE_DIFFERENCE_FUNCTION_HXX
4 
5 #include "opengm/opengm.hxx"
8 
9 namespace opengm {
10 
14 template<class T, class I = size_t, class L = size_t>
16 : public FunctionBase<AbsoluteDifferenceFunction<T, I, L>, T, I, L>
17 {
18 public:
19  typedef T ValueType;
20  typedef I IndexType;
21  typedef L LabelType;
22 
23  AbsoluteDifferenceFunction(const LabelType = 2, const LabelType = 2, const ValueType = 1);
24  size_t shape(const IndexType) const;
25  size_t size() const;
26  size_t dimension() const;
27  template<class ITERATOR> ValueType operator()(ITERATOR) const;
28 
29 private:
30  LabelType numberOfLabels1_;
31  LabelType numberOfLabels2_;
32  ValueType scale_;
33 };
34 
37 template <class T, class I, class L>
40  enum ID {
42  };
43 };
44 
46 template<class T, class I, class L>
47 class FunctionSerialization<AbsoluteDifferenceFunction<T, I, L> > {
48 public:
49  typedef typename AbsoluteDifferenceFunction<T, I, L>::ValueType ValueType;
50 
51  static size_t indexSequenceSize(const AbsoluteDifferenceFunction<T, I, L>&);
52  static size_t valueSequenceSize(const AbsoluteDifferenceFunction<T, I, L>&);
53  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
54  static void serialize(const AbsoluteDifferenceFunction<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
55  template<class INDEX_INPUT_ITERATOR , class VALUE_INPUT_ITERATOR>
56  static void deserialize(INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, AbsoluteDifferenceFunction<T, I, L>&);
57 };
59 
65 template <class T, class I, class L>
66 inline
68 (
69  const LabelType numberOfLabels1,
70  const LabelType numberOfLabels2,
71  const ValueType scale
72 )
73 : numberOfLabels1_(numberOfLabels1),
74  numberOfLabels2_(numberOfLabels2),
75  scale_(scale)
76 {}
77 
78 template <class T, class I, class L>
79 template <class ITERATOR>
82 (
83  ITERATOR begin
84 ) const {
85  ValueType value = begin[0];
86  value -= begin[1];
87  return scale_*abs(value);
88 }
89 
93 template <class T, class I, class L>
94 inline size_t
96 (
97  const IndexType i
98 ) const {
99  OPENGM_ASSERT(i < 2);
100  return (i==0 ? numberOfLabels1_ : numberOfLabels2_);
101 }
102 
103 // order (number of variables) of the function
104 template <class T, class I, class L>
105 inline size_t
107  return 2;
108 }
109 
111 template <class T, class I, class L>
112 inline size_t
114  return numberOfLabels1_ * numberOfLabels2_;
115 }
116 
117 template<class T, class I, class L>
118 inline size_t
120 (
122 ) {
123  return 2;
124 }
125 
126 template<class T, class I, class L>
127 inline size_t
128 FunctionSerialization<AbsoluteDifferenceFunction<T, I, L> >::valueSequenceSize
129 (
130  const AbsoluteDifferenceFunction<T, I, L>& src
131 ) {
132  return 1;
133 }
134 
135 template<class T, class I, class L>
136 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
137 inline void
138 FunctionSerialization<AbsoluteDifferenceFunction<T, I, L> >::serialize
139 (
140  const AbsoluteDifferenceFunction<T, I, L>& src,
141  INDEX_OUTPUT_ITERATOR indexOutIterator,
142  VALUE_OUTPUT_ITERATOR valueOutIterator
143 ) {
144  *indexOutIterator = src.shape(0);
145  ++indexOutIterator;
146  *indexOutIterator = src.shape(1);
147  L l[]={0,1};
148  *valueOutIterator = src(l);
149 }
150 
151 template<class T, class I, class L>
152 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
153 inline void
154 FunctionSerialization< AbsoluteDifferenceFunction<T, I, L> >::deserialize
155 (
156  INDEX_INPUT_ITERATOR indexInIterator,
157  VALUE_INPUT_ITERATOR valueInIterator,
158  AbsoluteDifferenceFunction<T, I, L>& dst
159 ) {
160  const size_t shape0=*indexInIterator;
161  ++ indexInIterator;
162  dst=AbsoluteDifferenceFunction<T, I, L>(shape0, *indexInIterator,*valueInIterator);
163 }
164 
165 } // namespace opengm
166 
167 #endif // OPENGM_ABSOLUTE_DIFFERENCE_FUNCTION_HXX
The OpenGM namespace.
Definition: config.hxx:43
Fallback implementation of member functions of OpenGM functions.
ValueType operator()(ITERATOR) const
Absolute difference between two labels.
#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 shape(const IndexType) const
extension a value table encoding this function would have
AbsoluteDifferenceFunction(const LabelType=2, const LabelType=2, const ValueType=1)
Constructor.
size_t size() const
number of entries a value table encoding this function would have (used for I/O)
T abs(const T &x)
Definition: opengm.hxx:111