2 #ifndef OPENGM_POTTS_G_FUNCTION_HXX
3 #define OPENGM_POTTS_G_FUNCTION_HXX
35 template<
class T,
class I=
size_t,
class L=
size_t>
46 template<
class ITERATOR,
class ITERATOR2>
PottsGFunction(ITERATOR, ITERATOR, ITERATOR2);
47 LabelType
shape(
const size_t)
const;
50 template<
class ITERATOR> ValueType
operator()(ITERATOR)
const;
53 template<
class LABELITERATOR>
void setByLabel(LABELITERATOR, T);
60 std::vector<LabelType> shape_;
61 std::vector<ValueType> values_;
68 template<
class T,
class I,
class L>
69 const size_t PottsGFunction<T, I, L>::BellNumbers_[16] = {1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545};
73 template<
class T,
class I,
class L>
74 struct FunctionRegistration<PottsGFunction<T, I, L> > {
81 template<
class T,
class I,
class L>
82 class FunctionSerialization<PottsGFunction<T, I, L> > {
84 typedef typename PottsGFunction<T, I, L>::ValueType ValueType;
86 static size_t indexSequenceSize(
const PottsGFunction<T, I, L> &);
87 static size_t valueSequenceSize(
const PottsGFunction<T, I, L> &);
88 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
89 static void serialize(
const PottsGFunction<T, I, L> &, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR );
90 template<
class INDEX_INPUT_ITERATOR ,
class VALUE_INPUT_ITERATOR>
91 static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, PottsGFunction<T, I, L> &);
95 template<
class T,
class I,
class L>
96 template<
class ITERATOR>
103 : shape_(shapeBegin, shapeEnd),
104 size_(std::accumulate(shapeBegin, shapeEnd, 1, std::multiplies<
typename std::iterator_traits<ITERATOR>::value_type >()))
108 if(shape_.size()<=4){
109 values_.resize(BellNumbers_[shape_.size()], 0);
111 P.resize(shape_.size());
112 values_.resize(P.BellNumber(shape_.size()), 0);
114 OPENGM_ASSERT(BellNumbers_[shape_.size()] == values_.size());
117 template<
class T,
class I,
class L>
118 template<
class ITERATOR,
class ITERATOR2>
124 ITERATOR2 valuesBegin
126 : shape_(shapeBegin, shapeEnd),
127 size_(std::accumulate(shapeBegin, shapeEnd, 1, std::multiplies<
typename std::iterator_traits<ITERATOR>::value_type >()))
130 if(shape_.size()<=4){
131 values_.resize(BellNumbers_[shape_.size()]);
133 P.resize(shape_.size());
134 values_.resize(P.BellNumber(shape_.size()), 0);
136 for(
size_t i=0; i<values_.size(); ++i) {
137 values_[i] = *valuesBegin;
140 OPENGM_ASSERT(BellNumbers_[shape_.size()] == values_.size());
144 template<
class T,
class I,
class L>
151 template<
class T,
class I,
class L>
152 template<
class ITERATOR>
166 if(shape_.size()<=4){
169 for(
size_t i=1; i<shape_.size(); ++i) {
170 for(
size_t j=0; j<i; ++j) {
171 if(*(begin+i)==*(begin+j)) {
178 case 0: value = values_[0];
break;
179 case 1: value = values_[1];
break;
180 case 2: value = values_[2];
break;
182 case 4: value = values_[3];
break;
185 case 7: value = values_[4];
break;
187 case 8: value = values_[5];
break;
188 case 12: value = values_[6];
break;
189 case 16: value = values_[7];
break;
190 case 18: value = values_[8];
break;
191 case 25: value = values_[9];
break;
192 case 32: value = values_[10];
break;
193 case 33: value = values_[11];
break;
194 case 42: value = values_[12];
break;
195 case 52: value = values_[13];
break;
196 case 63: value = values_[14];
break;
201 const size_t n = P.label2Index(begin, shape_.size());
207 template<
class T,
class I,
class L>
208 template<
class LABELITERATOR>
211 if(shape_.size()<=4){
214 for(
size_t i=1; i<shape_.size(); ++i) {
215 for(
size_t j=0; j<i; ++j) {
216 if(*(it+i)==*(it+j)) indexer += bit;
220 setByPartition(indexer, value);
223 size_t n = P.label2Index(it,shape_.size());
228 template<
class T,
class I,
class L>
231 if(shape_.size()<=4){
233 case 0: values_[0] = value;
break;
234 case 1: values_[1] = value;
break;
235 case 2: values_[2] = value;
break;
237 case 4: values_[3] = value;
break;
240 case 7: values_[4] = value;
break;
241 case 8: values_[5] = value;
break;
242 case 12: values_[6] = value;
break;
243 case 16: values_[7] = value;
break;
244 case 18: values_[8] = value;
break;
245 case 25: values_[9] = value;
break;
246 case 32: values_[10] = value;
break;
247 case 33: values_[11] = value;
break;
248 case 42: values_[12] = value;
break;
249 case 52: values_[13] = value;
break;
250 case 63: values_[14] = value;
break;
255 size_t n = P.number2Index(partition);
260 template<
class T,
class I,
class L>
271 template<
class T,
class I,
class L>
275 return shape_.size();
278 template<
class T,
class I,
class L>
284 template<
class T,
class I,
class L>
289 for(
size_t i=1; i<values_.size()-1; ++i)
290 t &= values_[0] == values_[i];
294 template<
class T,
class I,
class L>
301 template<
class T,
class I,
class L>
310 template<
class T,
class I,
class L>
312 FunctionSerialization<PottsGFunction<T, I, L> >::valueSequenceSize
314 const PottsGFunction<T, I, L> & src
316 return src.values_.size();
319 template<
class T,
class I,
class L>
320 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
322 FunctionSerialization<PottsGFunction<T, I, L> >::serialize
324 const PottsGFunction<T, I, L> & src,
325 INDEX_OUTPUT_ITERATOR indexOutIterator,
326 VALUE_OUTPUT_ITERATOR valueOutIterator
328 const size_t dim = src.dimension();
329 *indexOutIterator = dim;
331 for(
size_t i=0; i<dim; ++i) {
332 *indexOutIterator = src.shape(i);
335 for(
size_t i=0; i<src.values_.size(); ++i) {
336 *valueOutIterator = src.values_[i];
341 template<
class T,
class I,
class L>
342 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
344 FunctionSerialization<PottsGFunction<T, I, L> >::deserialize
346 INDEX_INPUT_ITERATOR indexInIterator,
347 VALUE_INPUT_ITERATOR valueInIterator,
348 PottsGFunction<T, I, L> & dst
350 const size_t dim=*indexInIterator;
352 std::vector<size_t> shape(dim);
353 std::vector<T> values(dst.BellNumbers_[dim]);
354 for(
size_t i=0; i<dim; ++i) {
355 shape[i]=*indexInIterator;
358 for(
size_t i=0; i<values.size(); ++i) {
359 values[i] = *valueInIterator;
362 dst = PottsGFunction<T, I, L>(shape.begin(), shape.end(), values.begin());
367 #endif // #ifndef OPENGM_POTTS_G_FUNCTION_HXX
Fallback implementation of member functions of OpenGM functions.
#define OPENGM_ASSERT(expression)
ValueType operator()(ITERATOR) const
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
void setByPartition(size_t, T)
bool isGeneralizedPotts() const
static const size_t MaximalOrder_
Generalized Potts Function.
LabelType shape(const size_t) const
void setByLabel(LABELITERATOR, T)
static const size_t BellNumbers_[16]