2 #ifndef OPENGM_POTTS_FUNCTION_HXX
3 #define OPENGM_POTTS_FUNCTION_HXX
18 template<
class T,
class I =
size_t,
class L =
size_t>
20 :
public FunctionBase<PottsFunction<T, I, L>, T, size_t, size_t>
29 LabelType
shape(
const size_t)
const;
32 template<
class ITERATOR> ValueType
operator()(ITERATOR)
const;
37 ValueType
parameter(
const size_t index)
const;
43 ValueType
min()
const;
44 ValueType
max()
const;
45 ValueType
sum()
const;
47 MinMaxFunctor<ValueType>
minMax()
const;
50 LabelType numberOfLabels1_;
51 LabelType numberOfLabels2_;
52 ValueType valueEqual_;
53 ValueType valueNotEqual_;
60 template<
class T,
class I,
class L>
68 template<
class T,
class I,
class L>
69 class FunctionSerialization<PottsFunction<T, I, L> > {
71 typedef typename PottsFunction<T, I, L>::ValueType ValueType;
73 static size_t indexSequenceSize(
const PottsFunction<T, I, L>&);
74 static size_t valueSequenceSize(
const PottsFunction<T, I, L>&);
75 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR>
76 static void serialize(
const PottsFunction<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
77 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR>
78 static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, PottsFunction<T, I, L>&);
87 template <
class T,
class I,
class L>
91 const L numberOfLabels1,
92 const L numberOfLabels2,
96 : numberOfLabels1_(numberOfLabels1),
97 numberOfLabels2_(numberOfLabels2),
98 valueEqual_(valueEqual),
99 valueNotEqual_(valueNotEqual)
102 template <
class T,
class I,
class L>
103 template <
class ITERATOR>
109 return (begin[0]==begin[1] ? valueEqual_ : valueNotEqual_);
112 template <
class T,
class I,
class L>
118 template <
class T,
class I,
class L>
124 template <
class T,
class I,
class L>
131 return (i==0 ? numberOfLabels1_ : numberOfLabels2_);
134 template <
class T,
class I,
class L>
140 template <
class T,
class I,
class L>
143 return numberOfLabels1_*numberOfLabels2_;
146 template<
class T,
class I,
class L>
155 template<
class T,
class I,
class L>
157 FunctionSerialization<PottsFunction<T, I, L> >::valueSequenceSize
159 const PottsFunction<T, I, L> & src
164 template<
class T,
class I,
class L>
165 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
167 FunctionSerialization<PottsFunction<T, I, L> >::serialize
169 const PottsFunction<T, I, L> & src,
170 INDEX_OUTPUT_ITERATOR indexOutIterator,
171 VALUE_OUTPUT_ITERATOR valueOutIterator
173 *indexOutIterator = src.shape(0);
175 *indexOutIterator = src.shape(1);
177 *valueOutIterator = src.valueEqual_;
179 *valueOutIterator = src.valueNotEqual_;
182 template<
class T,
class I,
class L>
183 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
185 FunctionSerialization<PottsFunction<T, I, L> >::deserialize
187 INDEX_INPUT_ITERATOR indexInIterator,
188 VALUE_INPUT_ITERATOR valueInIterator,
189 PottsFunction<T, I, L> & dst
191 const size_t shape1=*indexInIterator;
193 const size_t shape2=*indexInIterator;
194 const ValueType param1=*valueInIterator;
196 const ValueType param2=*valueInIterator;
197 dst=PottsFunction<T, I, L>(shape1, shape2, param1, param2);
200 template<
class T,
class I,
class L>
202 PottsFunction<T, I, L>::operator==
206 return numberOfLabels1_ == fb.numberOfLabels1_ &&
207 numberOfLabels2_ == fb.numberOfLabels2_ &&
208 valueEqual_ == fb.valueEqual_ &&
209 valueNotEqual_ == fb.valueNotEqual_;
212 template<
class T,
class I,
class L>
219 template<
class T,
class I,
class L>
226 return index == 0 ? valueEqual_ : valueNotEqual_;
229 template<
class T,
class I,
class L>
236 return index==0 ? valueEqual_:valueNotEqual_;
239 template<
class T,
class I,
class L>
246 template<
class T,
class I,
class L>
253 template<
class T,
class I,
class L>
257 return valueEqual_<valueNotEqual_ ? valueEqual_ :valueNotEqual_;
260 template<
class T,
class I,
class L>
264 return valueNotEqual_>valueEqual_ ? valueNotEqual_ :valueEqual_;
267 template<
class T,
class I,
class L>
271 const LabelType minLabels = std::min(numberOfLabels1_, numberOfLabels2_);
272 return valueNotEqual_ *
static_cast<T
>(numberOfLabels1_ * numberOfLabels2_ - minLabels)
273 + valueEqual_*static_cast<T>(minLabels);
276 template<
class T,
class I,
class L>
280 const LabelType minLabels = std::min(numberOfLabels1_, numberOfLabels2_);
284 const double x1 =
static_cast<double>(valueNotEqual_);
285 const int n1 =
static_cast<int>(numberOfLabels1_ * numberOfLabels2_ - minLabels);
286 const double x2 =
static_cast<double>(valueEqual_);
287 const int n2 =
static_cast<int>(minLabels);
288 return static_cast<T
>(std::pow(x1, n1) * std::pow(x2, n2));
291 template<
class T,
class I,
class L>
292 inline MinMaxFunctor<typename PottsFunction<T, I, L>::ValueType>
295 if(valueEqual_<valueNotEqual_) {
296 return MinMaxFunctor<T>(valueEqual_, valueNotEqual_);
299 return MinMaxFunctor<T>(valueNotEqual_, valueEqual_);
305 #endif // #ifndef OPENGM_POTTS_FUNCTION_HXX
bool isGeneralizedPotts() const
Fallback implementation of member functions of OpenGM functions.
ValueType product() const
LabelType shape(const size_t) const
ValueType valueEqual() const
ValueType operator()(ITERATOR) const
#define OPENGM_ASSERT(expression)
MinMaxFunctor< ValueType > minMax() const
IndexType numberOfParameters() const
PottsFunction(const LabelType=2, const LabelType=2, const ValueType=ValueType(), const ValueType=ValueType())
constructor
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
ValueType parameter(const size_t index) const
Potts function for two variables.
ValueType valueNotEqual() const
bool operator==(const PottsFunction &) const