2 #ifndef OPENGM_CONSTANT_FUNCTION_HXX
3 #define OPENGM_CONSTANT_FUNCTION_HXX
18 template<
class T,
class I =
size_t,
class L =
size_t>
20 :
public FunctionBase<ConstantFunction<T, I, L>, T, I, L>
28 template<
class ITERATOR>
31 size_t shape(
const IndexType)
const;
34 template<
class ITERATOR> ValueType
operator()(ITERATOR)
const;
39 ValueType
min()
const {
return value_; }
40 ValueType
max()
const {
return value_; }
41 ValueType
sum()
const {
return value_ *
static_cast<T
>(size_); }
44 const double x =
static_cast<double>(value_);
45 const int n =
static_cast<int>(size_);
46 return static_cast<T
>(std::pow(x, n));
48 MinMaxFunctor<ValueType>
minMax()
const {
return MinMaxFunctor<T>(value_, value_); }
52 std::vector<IndexType> shape_;
60 template <
class T,
class I,
class L>
68 template <
class T,
class I,
class L>
69 class FunctionSerialization<ConstantFunction<T, I, L> >{
71 typedef typename ConstantFunction<T, I, L>::ValueType ValueType;
73 static size_t indexSequenceSize(
const ConstantFunction<T, I, L>&);
74 static size_t valueSequenceSize(
const ConstantFunction<T, I, L>&);
75 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
76 static void serialize(
const ConstantFunction<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, ConstantFunction<T, I, L> &);
82 template <
class T,
class I,
class L>
83 template <
class ITERATOR>
92 shape_(shapeBegin, shapeEnd),
93 size_(std::accumulate(shapeBegin, shapeEnd, 1, std::multiplies<
typename std::iterator_traits<ITERATOR>::value_type >()))
96 template <
class T,
class I,
class L>
99 : value_(0), shape_(), size_(0)
102 template <
class T,
class I,
class L>
103 template <
class ITERATOR>
115 template <
class T,
class I,
class L>
125 template <
class T,
class I,
class L>
128 return shape_.size();
132 template <
class T,
class I,
class L>
138 template <
class T,
class I,
class L>
147 template <
class T,
class I,
class L>
149 FunctionSerialization<ConstantFunction<T, I, L> >::valueSequenceSize
151 const ConstantFunction<T, I, L>& src
156 template <
class T,
class I,
class L>
157 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
159 FunctionSerialization<ConstantFunction<T, I, L> >::serialize
161 const ConstantFunction<T, I, L>& src,
162 INDEX_OUTPUT_ITERATOR indexOutIterator,
163 VALUE_OUTPUT_ITERATOR valueOutIterator
165 *valueOutIterator = src.value_;
166 *indexOutIterator = src.dimension();
167 for(
size_t i=0; i<src.dimension(); ++i) {
169 *indexOutIterator = src.shape(i);
173 template <
class T,
class I,
class L>
174 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
176 FunctionSerialization< ConstantFunction<T, I, L> >::deserialize
178 INDEX_INPUT_ITERATOR indexInIterator,
179 VALUE_INPUT_ITERATOR valueInIterator,
180 ConstantFunction<T, I, L>& dst
182 dst.value_ = *valueInIterator;
183 size_t dimension = *indexInIterator;
184 dst.shape_.resize(dimension);
185 for(
size_t i=0; i<dimension; ++i) {
187 dst.shape_[i]=*indexInIterator;
189 dst.size_=std::accumulate(dst.shape_.begin(), dst.shape_.end(), 1, std::multiplies<size_t>());
194 #endif // OPENGM_CONSTANT_FUNCTION_HXX
Fallback implementation of member functions of OpenGM functions.
ValueType product() const
size_t size() const
number of entries a value table encoding this function would have (used for I/O)
size_t shape(const IndexType) const
extension a value table encoding this function would have
ValueType operator()(ITERATOR) const
MinMaxFunctor< ValueType > minMax() const
#define OPENGM_ASSERT(expression)
bool isGeneralizedPotts() const
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.