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>
63 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
65 template<
class INDEX_INPUT_ITERATOR ,
class VALUE_INPUT_ITERATOR>
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>
153 template<
class T,
class I,
class L>
154 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
159 INDEX_OUTPUT_ITERATOR indexOutIterator,
160 VALUE_OUTPUT_ITERATOR valueOutIterator
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 >
178 INDEX_INPUT_ITERATOR indexInIterator,
179 VALUE_INPUT_ITERATOR valueInIterator,
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;
198 #endif // #ifndef OPENGM_POTTS_N_FUNCTION_HXX
Fallback implementation of member functions of OpenGM functions.
#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
LabelType shape(const size_t) const
ValueType operator()(ITERATOR) const
Potts function in N variables.