OpenGM  2.3.x
Discrete Graphical Model Library
truncated_absolute_difference.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_TRUNCATED_ABSOLUTE_DIFFERENCE_FUNCTION_HXX
3 #define OPENGM_TRUNCATED_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<TruncatedAbsoluteDifferenceFunction<T, I, L>, T, I, L> {
17 public:
18  typedef T ValueType;
19  typedef I IndexType;
20  typedef L LabelType;
21 
22  TruncatedAbsoluteDifferenceFunction(const LabelType = 2, const LabelType = 2,
23  const ValueType = ValueType(), const ValueType = ValueType());
24  size_t shape(const IndexType) const;
25  size_t size() const;
26  size_t dimension() const;
27  template<class ITERATOR> T operator()(ITERATOR) const;
28 
29 private:
30  size_t numberOfLabels1_;
31  size_t numberOfLabels2_;
32  T parameter1_;
33  T parameter2_;
34 
36 };
37 
40 template <class T, class I, class L>
42  enum ID { Id = opengm::FUNCTION_TYPE_ID_OFFSET + 3 };
43 };
44 
46 template <class T, class I, class L>
47 class FunctionSerialization<TruncatedAbsoluteDifferenceFunction<T, I, L> > {
48 public:
49  typedef typename TruncatedAbsoluteDifferenceFunction<T, I, L>::ValueType ValueType;
50 
51  static size_t indexSequenceSize(const TruncatedAbsoluteDifferenceFunction<T, I, L>&);
52  static size_t valueSequenceSize(const TruncatedAbsoluteDifferenceFunction<T, I, L>&);
53  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
54  static void serialize(const TruncatedAbsoluteDifferenceFunction<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, TruncatedAbsoluteDifferenceFunction<T, I, L>&);
57 };
59 
60 template <class T, class I, class L>
61 inline
63 (
64  const LabelType numberOfLabels1,
65  const LabelType numberOfLabels2,
66  const ValueType parameter1,
67  const ValueType parameter2
68 )
69 : numberOfLabels1_(numberOfLabels1),
70  numberOfLabels2_(numberOfLabels2),
71  parameter1_(parameter1),
72  parameter2_(parameter2)
73 {}
74 
75 template <class T, class I, class L>
76 template <class ITERATOR>
79 (
80  ITERATOR begin
81 ) const {
82  T value = begin[0];
83  value -= begin[1];
84  return abs(value) > parameter1_ ? parameter1_ * parameter2_ : abs(value) * parameter2_;
85 }
86 
90 template <class T, class I, class L>
91 inline size_t
93  const IndexType i
94 ) const {
95  OPENGM_ASSERT(i < 2);
96  return (i==0 ? numberOfLabels1_ : numberOfLabels2_);
97 }
98 
99 // order (number of variables) of the function
100 template <class T, class I, class L>
101 inline size_t
103  return 2;
104 }
105 
107 template <class T, class I, class L>
108 inline size_t
110  return numberOfLabels1_ * numberOfLabels2_;
111 }
112 
113 template <class T, class I, class L>
114 inline size_t
116 (
118 ) {
119  return 2;
120 }
121 
122 template <class T, class I, class L>
123 inline size_t
124 FunctionSerialization<TruncatedAbsoluteDifferenceFunction<T, I, L> >::valueSequenceSize
125 (
126  const TruncatedAbsoluteDifferenceFunction<T, I, L>& src
127 ) {
128  return 2;
129 }
130 
131 template <class T, class I, class L>
132 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR >
133 inline void
134 FunctionSerialization<TruncatedAbsoluteDifferenceFunction<T, I, L> >::serialize
135 (
136  const TruncatedAbsoluteDifferenceFunction<T, I, L>& src,
137  INDEX_OUTPUT_ITERATOR indexOutIterator,
138  VALUE_OUTPUT_ITERATOR valueOutIterator
139 ) {
140  *indexOutIterator = src.shape(0);
141  ++indexOutIterator;
142  *indexOutIterator = src.shape(1);
143 
144  *valueOutIterator = src.parameter1_;
145  ++valueOutIterator;
146  *valueOutIterator = src.parameter2_;
147 }
148 
149 template <class T, class I, class L>
150 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR >
151 inline void
152 FunctionSerialization<TruncatedAbsoluteDifferenceFunction<T, I, L> >::deserialize
153 (
154  INDEX_INPUT_ITERATOR indexInIterator,
155  VALUE_INPUT_ITERATOR valueInIterator,
156  TruncatedAbsoluteDifferenceFunction<T, I, L>& dst
157 ) {
158  const size_t shape1=*indexInIterator;
159  ++ indexInIterator;
160  const size_t shape2=*indexInIterator;
161  const ValueType param1=*valueInIterator;
162  ++valueInIterator;
163  const ValueType param2=*valueInIterator;
164  dst = TruncatedAbsoluteDifferenceFunction<T, I, L>(shape1,shape2,param1,param2);
165 }
166 
167 } // namespace opengm
168 
169 #endif // OPENGM_TRUNCATED_ABSOLUTE_DIFFERENCE_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
size_t shape(const IndexType) const
extension a value table encoding this function would have
size_t size() const
number of entries a value table encoding this function would have (used for I/O)
truncated absolute differents between the labels of 2 variables
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
TruncatedAbsoluteDifferenceFunction(const LabelType=2, const LabelType=2, const ValueType=ValueType(), const ValueType=ValueType())
T abs(const T &x)
Definition: opengm.hxx:111