2 #ifndef OPENGM_POTTS_N_FUNCTION_HXX
3 #define OPENGM_POTTS_N_FUNCTION_HXX
17 template<
class T,
class I =
size_t,
class L =
size_t>
19 :
public FunctionBase<PottsNFunction<T, I, L>, T, I, L> {
27 template<
class ITERATOR>
PottsNFunction(ITERATOR, ITERATOR,
const T,
const T);
28 LabelType
shape(
const size_t)
const;
31 template<
class ITERATOR> ValueType
operator()(ITERATOR)
const;
38 std::vector<LabelType> shape_;
40 ValueType valueEqual_;
41 ValueType valueNotEqual_;
48 template<
class T,
class I,
class L>
56 template<
class T,
class I,
class L>
57 class FunctionSerialization<PottsNFunction<T, I, L> > {
59 typedef typename PottsNFunction<T, I, L>::ValueType ValueType;
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> &);
70 template<
class T,
class I,
class L>
71 template <
class ITERATOR>
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)
88 template<
class T,
class I,
class L>
97 template<
class T,
class I,
class L>
98 template <
class ITERATOR>
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_;
113 template<
class T,
class I,
class L>
123 template<
class T,
class I,
class L>
126 return shape_.size();
129 template<
class T,
class I,
class L>
135 template<
class T,
class I,
class L>
144 template<
class T,
class I,
class L>
146 FunctionSerialization<PottsNFunction<T, I, L> >::valueSequenceSize
148 const PottsNFunction<T, I, L> & src
153 template<
class T,
class I,
class L>
154 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
156 FunctionSerialization<PottsNFunction<T, I, L> >::serialize
158 const PottsNFunction<T, I, L> & src,
159 INDEX_OUTPUT_ITERATOR indexOutIterator,
160 VALUE_OUTPUT_ITERATOR valueOutIterator
162 const size_t dim = src.dimension();
163 *indexOutIterator = dim;
164 for(
size_t i=0;i<dim;++i) {
166 *indexOutIterator = src.shape(i);
168 *valueOutIterator = src.valueEqual_;
170 *valueOutIterator = src.valueNotEqual_;
173 template<
class T,
class I,
class L>
174 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
176 FunctionSerialization<PottsNFunction<T, I, L> >::deserialize
178 INDEX_INPUT_ITERATOR indexInIterator,
179 VALUE_INPUT_ITERATOR valueInIterator,
180 PottsNFunction<T, I, L> & dst
182 const size_t dim = *indexInIterator;
184 std::vector<size_t> shape(dim);
185 for(
size_t i=0; i<dim; ++i) {
186 shape[i] = *indexInIterator;
190 const ValueType param1 = *valueInIterator;
192 const ValueType param2 = *valueInIterator;
193 dst = PottsNFunction<T, I, L>(shape.begin(), shape.end(), param1, param2);
198 #endif // #ifndef OPENGM_POTTS_N_FUNCTION_HXX
LabelType shape(const size_t) const
Fallback implementation of member functions of OpenGM functions.
ValueType operator()(ITERATOR) const
#define OPENGM_ASSERT(expression)
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
bool isGeneralizedPotts() const
Potts function in N variables.