OpenGM  2.3.x
Discrete Graphical Model Library
label_order_function.hxx
Go to the documentation of this file.
1 #ifndef OPENGM_LABEL_ORDER_FUNCTION_HXX_
2 #define OPENGM_LABEL_ORDER_FUNCTION_HXX_
3 
4 #include <algorithm>
5 #include <vector>
6 #include <cmath>
7 
8 #include <opengm/opengm.hxx>
10 
14 
15 namespace opengm {
16 
17 /*********************
18  * class definition *
19  *********************/
20 template<class VALUE_TYPE, class INDEX_TYPE = size_t, class LABEL_TYPE = size_t>
21 class LabelOrderFunction : public LinearConstraintFunctionBase<LabelOrderFunction<VALUE_TYPE,INDEX_TYPE, LABEL_TYPE> > {
22 public:
23  // public function properties
24  static const bool useSingleConstraint_ = true;
25  static const bool useMultipleConstraints_ = false;
26 
27  // typedefs
31  typedef typename LinearConstraintFunctionTraitsType::ValueType ValueType;
32  typedef typename LinearConstraintFunctionTraitsType::IndexType IndexType;
33  typedef typename LinearConstraintFunctionTraitsType::LabelType LabelType;
34  typedef std::vector<ValueType> LabelOrderType;
35  typedef typename LinearConstraintFunctionTraitsType::LinearConstraintType LinearConstraintType;
36  typedef typename LinearConstraintFunctionTraitsType::LinearConstraintsContainerType LinearConstraintsContainerType;
37  typedef typename LinearConstraintFunctionTraitsType::LinearConstraintsIteratorType LinearConstraintsIteratorType;
38  typedef typename LinearConstraintFunctionTraitsType::IndicatorVariablesContainerType IndicatorVariablesContainerType;
39  typedef typename LinearConstraintFunctionTraitsType::IndicatorVariablesIteratorType IndicatorVariablesIteratorType;
40  typedef typename LinearConstraintFunctionTraitsType::VariableLabelPairsIteratorType VariableLabelPairsIteratorType;
41  typedef typename LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsIteratorType ViolatedLinearConstraintsIteratorType;
42  typedef typename LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsWeightsContainerType ViolatedLinearConstraintsWeightsContainerType;
43  typedef typename LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsWeightsIteratorType ViolatedLinearConstraintsWeightsIteratorType;
44 
45  // constructors
47  LabelOrderFunction(const LabelType numLabelsVar1, const LabelType numLabelsVar2, const LabelOrderType& labelOrder, const ValueType returnValid = 0.0, const ValueType returnInvalid = 1.0);
48  template <class ITERATOR_TYPE>
49  LabelOrderFunction(const LabelType numLabelsVar1, const LabelType numLabelsVar2, ITERATOR_TYPE labelOrderBegin, const ValueType returnValid = 0.0, const ValueType returnInvalid = 1.0);
51 
52  // function access
53  template<class Iterator>
54  ValueType operator()(Iterator statesBegin) const; // function evaluation
55  size_t shape(const size_t i) const; // number of labels of the indicated input variable
56  size_t dimension() const; // number of input variables
57  size_t size() const; // number of parameters
58 
59  // specializations
60  ValueType min() const;
61  ValueType max() const;
62  MinMaxFunctor<ValueType> minMax() const;
63 
64 protected:
65  // storage
66  static const size_t dimension_ = 2;
67  LabelType numLabelsVar1_;
68  LabelType numLabelsVar2_;
69  size_t size_;
70  LabelOrderType labelOrder_;
71  ValueType returnValid_;
72  ValueType returnInvalid_;
73  LinearConstraintsContainerType constraints_;
74  mutable std::vector<size_t> violatedConstraintsIds_;
75  mutable ViolatedLinearConstraintsWeightsContainerType violatedConstraintsWeights_;
76  IndicatorVariablesContainerType indicatorVariableList_;
77 
78  // implementations for LinearConstraintFunctionBase
79  LinearConstraintsIteratorType linearConstraintsBegin_impl() const;
80  LinearConstraintsIteratorType linearConstraintsEnd_impl() const;
81  IndicatorVariablesIteratorType indicatorVariablesOrderBegin_impl() const;
82  IndicatorVariablesIteratorType indicatorVariablesOrderEnd_impl() const;
83  template <class LABEL_ITERATOR>
84  void challenge_impl(ViolatedLinearConstraintsIteratorType& violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType& violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType& violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance = 0.0) const;
85  template <class LABEL_ITERATOR>
86  void challengeRelaxed_impl(ViolatedLinearConstraintsIteratorType& violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType& violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType& violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance = 0.0) const;
87 
88  // sanity check
89  bool checkLabelOrder() const;
90 
91  // helper functions
93  void createConstraints();
94 
95  // friends
96  friend class FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> >;
97  friend class opengm::LinearConstraintFunctionBase<LabelOrderFunction<VALUE_TYPE,INDEX_TYPE, LABEL_TYPE> >;
98 };
99 
100 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
101 struct LinearConstraintFunctionTraits<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> > {
102  // typedefs
103  typedef VALUE_TYPE ValueType;
104  typedef INDEX_TYPE IndexType;
105  typedef LABEL_TYPE LabelType;
107  typedef std::vector<LinearConstraintType> LinearConstraintsContainerType;
108  typedef typename LinearConstraintsContainerType::const_iterator LinearConstraintsIteratorType;
114  typedef typename ViolatedLinearConstraintsWeightsContainerType::const_iterator ViolatedLinearConstraintsWeightsIteratorType;
115 };
116 
119 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
120 struct FunctionRegistration<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> > {
121  enum ID {
122  // TODO set final Id
124  };
125 };
126 
128 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
129 class FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> > {
130 public:
131  typedef typename LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::ValueType ValueType;
132 
133  static size_t indexSequenceSize(const LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>&);
134  static size_t valueSequenceSize(const LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>&);
135  template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR>
136  static void serialize(const LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
137  template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR>
138  static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>&);
139 };
141 
142 /***********************
143  * class documentation *
144  ***********************/
474 /******************
475  * implementation *
476  ******************/
477 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
479  numLabelsVar2_(), size_(), labelOrder_(), returnValid_(), returnInvalid_(),
480  constraints_(), violatedConstraintsIds_(), violatedConstraintsWeights_(),
481  indicatorVariableList_() {
483  throw opengm::RuntimeError("Unsupported configuration for label order function. At least one of LabelOrderFunction::useSingleConstraint_ and LabelOrderFunction::useMultipleConstraints_ has to be set to true.");
484  }
485 }
486 
487 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
488 inline LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::LabelOrderFunction(const LabelType numLabelsVar1, const LabelType numLabelsVar2, const LabelOrderType& labelOrder, const ValueType returnValid, const ValueType returnInvalid)
489  : numLabelsVar1_(numLabelsVar1), numLabelsVar2_(numLabelsVar2),
490  size_(numLabelsVar1_ * numLabelsVar2_), labelOrder_(labelOrder),
491  returnValid_(returnValid), returnInvalid_(returnInvalid),
492  constraints_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
493  violatedConstraintsIds_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
494  violatedConstraintsWeights_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
495  indicatorVariableList_(numLabelsVar1_ + numLabelsVar2_) {
497 
499  throw opengm::RuntimeError("Unsupported configuration for label order function. At least one of LabelOrderFunction::useSingleConstraint_ and LabelOrderFunction::useMultipleConstraints_ has to be set to true.");
500  }
501 
502  // fill indicator variable list
504 
505  // create linear constraints
507 }
508 
509 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
510 template <class ITERATOR_TYPE>
511 inline LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::LabelOrderFunction(const LabelType numLabelsVar1, const LabelType numLabelsVar2, ITERATOR_TYPE labelOrderBegin, const ValueType returnValid, const ValueType returnInvalid)
512  : numLabelsVar1_(numLabelsVar1), numLabelsVar2_(numLabelsVar2),
513  size_(numLabelsVar1_ * numLabelsVar2_),
514  labelOrder_(labelOrderBegin, labelOrderBegin + std::max(numLabelsVar1_, numLabelsVar2_)),
515  returnValid_(returnValid), returnInvalid_(returnInvalid),
516  constraints_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
517  violatedConstraintsIds_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
518  violatedConstraintsWeights_((useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? numLabelsVar1_ : 0)),
519  indicatorVariableList_(numLabelsVar1_ + numLabelsVar2_) {
521 
523  throw opengm::RuntimeError("Unsupported configuration for label order function. At least one of LabelOrderFunction::useSingleConstraint_ and LabelOrderFunction::useMultipleConstraints_ has to be set to true.");
524  }
525 
526  // fill indicator variable list
528 
529  // create linear constraints
531 }
532 
533 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
535 
536 }
537 
538 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
539 template<class Iterator>
541  if(labelOrder_[statesBegin[0]] <= labelOrder_[statesBegin[1]]) {
542  return returnValid_;
543  } else {
544  return returnInvalid_;
545  }
546 }
547 
548 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
550  OPENGM_ASSERT(i < dimension_);
551  return (i==0 ? numLabelsVar1_ : numLabelsVar2_);
552 }
553 
554 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
556  return dimension_;
557 }
558 
559 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
561  return size_;
562 }
563 
564 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
566  return returnValid_ < returnInvalid_ ? returnValid_ : returnInvalid_;
567 }
568 
569 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
571  return returnValid_ > returnInvalid_ ? returnValid_ : returnInvalid_;
572 }
573 
574 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
575 inline MinMaxFunctor<typename LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::ValueType> LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::minMax() const {
576  if(returnValid_ < returnInvalid_) {
577  return MinMaxFunctor<VALUE_TYPE>(returnValid_, returnInvalid_);
578  }
579  else {
580  return MinMaxFunctor<VALUE_TYPE>(returnInvalid_, returnValid_);
581  }
582 }
583 
584 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
586  return constraints_.begin();
587 }
588 
589 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
591  return constraints_.end();
592 }
593 
594 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
596  return indicatorVariableList_.begin();
597 }
598 
599 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
601  return indicatorVariableList_.end();
602 }
603 
604 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
605 template <class LABEL_ITERATOR>
606 inline void LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::challenge_impl(ViolatedLinearConstraintsIteratorType& violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType& violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType& violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance) const {
607  const ValueType weight = labelOrder_[labelingBegin[0]] - labelOrder_[labelingBegin[1]];
608  if(weight <= tolerance) {
609  violatedConstraintsBegin = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), 0);
610  violatedConstraintsEnd = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), 0);
611  violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
612  return;
613  } else {
614  if(useSingleConstraint_) {
615  violatedConstraintsIds_[0] = 0;
616  violatedConstraintsWeights_[0] = weight;
617  }
618  if(useMultipleConstraints_) {
619  violatedConstraintsIds_[(useSingleConstraint_ ? 1 : 0)] = labelingBegin[0] + (useSingleConstraint_ ? 1 : 0);
620  violatedConstraintsWeights_[(useSingleConstraint_ ? 1 : 0)] = weight;
621 
622  }
623 
624  violatedConstraintsBegin = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), 0);
625  violatedConstraintsEnd = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), (useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? 1 : 0));
626  violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
627  return;
628  }
629 }
630 
631 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
632 template <class LABEL_ITERATOR>
633 inline void LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::challengeRelaxed_impl(ViolatedLinearConstraintsIteratorType& violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType& violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType& violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance) const {
634  size_t numViolatedConstraints = 0;
635 
636  double weightVar2 = 0.0;
637  for(IndexType i = 0; i < numLabelsVar2_; ++i) {
638  weightVar2 -= labelOrder_[i] * labelingBegin[numLabelsVar1_ + i];
639  }
640 
641  double totalWeight = weightVar2;
642  for(IndexType i = 0; i < numLabelsVar1_; ++i) {
643  double currentWeight = (labelOrder_[i] * labelingBegin[i]); // - ();
644 
645  if(useSingleConstraint_) {
646  totalWeight += currentWeight;
647  }
648  if(useMultipleConstraints_) {
649  currentWeight += weightVar2;
650  if(currentWeight > tolerance) {
651  violatedConstraintsIds_[numViolatedConstraints] = i + (useSingleConstraint_ ? 1 : 0);
652  violatedConstraintsWeights_[numViolatedConstraints] = currentWeight;
653  ++numViolatedConstraints;
654  }
655  }
656  }
657 
658  if(useSingleConstraint_) {
659  if(totalWeight > tolerance) {
660  violatedConstraintsIds_[numViolatedConstraints] = 0;
661  violatedConstraintsWeights_[numViolatedConstraints] = totalWeight;
662  ++numViolatedConstraints;
663  }
664  }
665 
666  violatedConstraintsBegin = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), 0);
667  violatedConstraintsEnd = ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), numViolatedConstraints);
668  violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
669 }
670 
671 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
673  if(labelOrder_.size() < std::max(numLabelsVar1_, numLabelsVar2_)) {
674  return false;
675  } else {
676  return true;
677  }
678 }
679 
680 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
682  for(size_t i = 0; i < numLabelsVar1_; ++i) {
683  indicatorVariableList_[i] = typename LinearConstraintType::IndicatorVariableType(IndexType(0), LabelType(i));
684  }
685  for(size_t i = 0; i < numLabelsVar2_; ++i) {
686  indicatorVariableList_[numLabelsVar1_ + i] = typename LinearConstraintType::IndicatorVariableType(IndexType(1), LabelType(i));
687  }
688 }
689 
690 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
692  if(useSingleConstraint_) {
693  constraints_[0].setBound(0.0);
694  constraints_[0].setConstraintOperator(LinearConstraintType::LinearConstraintOperatorType::LessEqual);
695  for(size_t i = 0; i < numLabelsVar1_; ++i) {
696  constraints_[0].add(typename LinearConstraintType::IndicatorVariableType(IndexType(0), LabelType(i)), labelOrder_[i]);
697  }
698  for(size_t i = 0; i < numLabelsVar2_; ++i) {
699  constraints_[0].add(typename LinearConstraintType::IndicatorVariableType(IndexType(1), LabelType(i)), -labelOrder_[i]);
700  }
701  }
702  if(useMultipleConstraints_) {
703  for(size_t i = 0; i < numLabelsVar1_; ++i) {
704  constraints_[i + (useSingleConstraint_ ? 1 : 0)].add(typename LinearConstraintType::IndicatorVariableType(IndexType(0), LabelType(i)), labelOrder_[i]);
705  constraints_[i + (useSingleConstraint_ ? 1 : 0)].setBound(0.0);
706  constraints_[i + (useSingleConstraint_ ? 1 : 0)].setConstraintOperator(LinearConstraintType::LinearConstraintOperatorType::LessEqual);
707  for(size_t j = 0; j < numLabelsVar2_; ++j) {
708  constraints_[i + (useSingleConstraint_ ? 1 : 0)].add(typename LinearConstraintType::IndicatorVariableType(IndexType(1), LabelType(j)), -labelOrder_[j]);
709  }
710  }
711  }
712 }
713 
715 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
717  const size_t shapeSize = 2; // numLabelsVar1 and numLabelsVar2
718  const size_t labelOrderSize = 1;
719  const size_t totalIndexSize = shapeSize + labelOrderSize;
720  return totalIndexSize;
721 }
722 
723 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
724 inline size_t FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> >::valueSequenceSize(const LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>& src) {
725  const size_t labelOrderSize = src.labelOrder_.size();
726  const size_t returnSize = 2; //returnValid and returnInvalid
727  const size_t totalValueSize = labelOrderSize + returnSize;
728  return totalValueSize;
729 }
730 
731 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
732 template<class INDEX_OUTPUT_ITERATOR, class VALUE_OUTPUT_ITERATOR>
733 inline void FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> >::serialize(const LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>& src, INDEX_OUTPUT_ITERATOR indexOutIterator, VALUE_OUTPUT_ITERATOR valueOutIterator) {
734  // index output
735  // shape
736  *indexOutIterator = src.numLabelsVar1_;
737  ++indexOutIterator;
738  *indexOutIterator = src.numLabelsVar2_;
739  ++indexOutIterator;
740 
741  // label order size
742  *indexOutIterator = src.labelOrder_.size();
743 
744  // value output
745  // label order
746  for(size_t i = 0; i < src.labelOrder_.size(); ++i) {
747  *valueOutIterator = src.labelOrder_[i];
748  ++valueOutIterator;
749  }
750 
751  // return values
752  *valueOutIterator = src.returnValid_;
753  ++valueOutIterator;
754  *valueOutIterator = src.returnInvalid_;
755 }
756 
757 template<class VALUE_TYPE, class INDEX_TYPE, class LABEL_TYPE>
758 template<class INDEX_INPUT_ITERATOR, class VALUE_INPUT_ITERATOR>
759 inline void FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> >::deserialize( INDEX_INPUT_ITERATOR indexInIterator, VALUE_INPUT_ITERATOR valueInIterator, LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>& dst) {
760  // index input
761  // shape
762  const size_t numLabelsVar1 = *indexInIterator;
763  ++indexInIterator;
764  const size_t numLabelsVar2 = *indexInIterator;
765  ++indexInIterator;
766 
767  // label order size
768  const size_t labelOrderSize = *indexInIterator;
769 
770  // value input
771  typename LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::LabelOrderType labelOrder(valueInIterator, valueInIterator + labelOrderSize);
772  valueInIterator += labelOrderSize;
773 
774  // valid value
775  VALUE_TYPE returnValid = *valueInIterator;
776  ++valueInIterator;
777 
778  // invalid value
779  VALUE_TYPE returnInvalid = *valueInIterator;
780 
781  dst = LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>(numLabelsVar1, numLabelsVar2, labelOrder, returnValid, returnInvalid);
782 }
784 
785 } // namespace opengm
786 
787 #endif /* OPENGM_LABEL_ORDER_FUNCTION_HXX_ */
LinearConstraintFunctionTraitsType::IndicatorVariablesContainerType IndicatorVariablesContainerType
Defines the indicator variables container type which is used to store the indicator variables used by...
LinearConstraintsIteratorType linearConstraintsEnd_impl() const
Implementation of LinearConstraintFunctionBase::linearConstraintsEnd.
The OpenGM namespace.
Definition: config.hxx:43
std::vector< ValueType > LabelOrderType
Type to store the weights of the label order.
void createConstraints()
Helper function to create all linear constraints which are implied by the label order function...
LinearConstraintFunctionBase< LinearConstraintFunctionType > LinearConstraintFunctionBaseType
Typedef of the LinearConstraintFunctionBase class with appropriate template parameter.
IndicatorVariablesContainerType::const_iterator IndicatorVariablesIteratorType
Defines the const iterator type to iterate over the set of indicator variables.
void challenge_impl(ViolatedLinearConstraintsIteratorType &violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType &violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType &violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance=0.0) const
Implementation of LinearConstraintFunctionBase::challenge.
Provides interface for liner constraint functions.
IndicatorVariableType::IteratorType VariableLabelPairsIteratorType
Defines the const iterator type to iterate over the variable label pairs of an indicator variable...
LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsWeightsContainerType ViolatedLinearConstraintsWeightsContainerType
Defines the violated linear constraints weights container type which is used to store the weights of ...
LinearConstraintsIteratorType linearConstraintsBegin_impl() const
Implementation of LinearConstraintFunctionBase::linearConstraintsBegin.
ViolatedLinearConstraintsWeightsContainerType violatedConstraintsWeights_
Stores the weights of the violated constraints which are detected by LabelOrderFunction::challenge an...
IndicatorVariablesContainerType indicatorVariableList_
A list of all indicator variables present in the label order function.
void fillIndicatorVariableList()
Helper function to fill LabelOrderFunction::indicatorVariableList_ with all indicator variables used ...
LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsWeightsIteratorType ViolatedLinearConstraintsWeightsIteratorType
Defines the violated linear constraints weights iterator type which is used to iterate over the weigh...
LabelType numLabelsVar2_
The number of labels of the second variable.
LinearConstraintsContainerType constraints_
Stores the linear constraints of the label order function.
STL namespace.
std::vector< IndicatorVariableType > IndicatorVariablesContainerType
Defines the storage type for the set of indicator variables.
LabelType numLabelsVar1_
The number of labels of the first variable.
static const size_t dimension_
The dimension of the label order function.
Defines the const iterator type to iterate over the subset of a sequence.
#define OPENGM_ASSERT(expression)
Definition: opengm.hxx:77
ViolatedLinearConstraintsWeightsContainerType::const_iterator ViolatedLinearConstraintsWeightsIteratorType
size_t size() const
Number of parameters.
ValueType returnValid_
Stores the return value of LabelOrderFunction::operator() if no constraint is violated.
LinearConstraintFunctionTraitsType::LabelType LabelType
Typedef of the LABEL_TYPE template parameter type from the class LabelOrderFunction.
MinMaxFunctor< ValueType > minMax() const
Get minimum and maximum at the same time.
size_t dimension() const
Number of input variables.
LinearConstraintFunctionTraitsType::IndexType IndexType
Typedef of the INDEX_TYPE template parameter type from the class LabelOrderFunction.
LinearConstraintFunctionTraitsType::IndicatorVariablesIteratorType IndicatorVariablesIteratorType
Defines the indicator variables container iterator type which is used to iterate over the indicator v...
LinearConstraintFunctionTraitsType::ValueType ValueType
Typedef of the VALUE_TYPE template parameter type from the class LabelOrderFunction.
Base class for linear constraint functions.
~LabelOrderFunction()
LabelOrderFunction destructor.
size_t size_
Stores the size of the label order function.
LabelOrderFunction< VALUE_TYPE, INDEX_TYPE, LABEL_TYPE > LinearConstraintFunctionType
Typedef of the LabelOrderFunction class with appropriate template parameter.
LinearConstraintFunctionTraitsType::ViolatedLinearConstraintsIteratorType ViolatedLinearConstraintsIteratorType
Defines the violated linear constraints iterator type which is used to iterate over the set of violat...
SubsequenceIterator< LinearConstraintsIteratorType, typename std::vector< size_t >::const_iterator > ViolatedLinearConstraintsIteratorType
LinearConstraintFunctionTraits< LinearConstraintFunctionType > LinearConstraintFunctionTraitsType
Typedef of the LinearConstraintFunctionTraits class with appropriate template parameter.
LinearConstraintFunctionTraitsType::LinearConstraintType LinearConstraintType
Typedef of the LinearConstraint class which is used to represent linear constraints.
Traits class for linear constraint functions.
std::vector< size_t > violatedConstraintsIds_
Stores the indices of the violated constraints which are detected by LabelOrderFunction::challenge an...
static const bool useMultipleConstraints_
Describe the label order constraint in multiple linear constraints.
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.
LabelOrderType labelOrder_
The weights defining the label order.
LinearConstraintFunctionTraitsType::LinearConstraintsContainerType LinearConstraintsContainerType
Defines the linear constraints container type which is used to store multiple linear constraints...
Provides implementation for class LinearConstraint.
ValueType returnInvalid_
Stores the return value of LabelOrderFunction::operator() if at least one constraint is violated...
LinearConstraintFunctionTraitsType::LinearConstraintsIteratorType LinearConstraintsIteratorType
Defines the linear constraints container iterator type which is used to iterate over the set of linea...
IndicatorVariablesIteratorType indicatorVariablesOrderBegin_impl() const
Implementation of LinearConstraintFunctionBase::indicatorVariablesOrderBegin.
IndicatorVariablesIteratorType indicatorVariablesOrderEnd_impl() const
Implementation of LinearConstraintFunctionBase::indicatorVariablesOrderEnd.
A linear constraint function class ensuring the correct label order for two variables.
size_t shape(const size_t i) const
Number of labels of the indicated input variable.
ValueType max() const
Maximum value of the label order function.
Provides implementation for class SubsequenceIterator.
void challengeRelaxed_impl(ViolatedLinearConstraintsIteratorType &violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType &violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType &violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance=0.0) const
Implementation of LinearConstraintFunctionBase::challengeRelaxed.
bool checkLabelOrder() const
Check label order weights. Only used for assertion in debug mode.
static const bool useSingleConstraint_
Describe the label order constraint in one single linear constraint.
LabelOrderFunction()
LabelOrderFunction constructor.
Define a linear constraint for a set of indicatorVariables.
LinearConstraintFunctionTraitsType::VariableLabelPairsIteratorType VariableLabelPairsIteratorType
Defines the variable label pairs iterator type which is used to iterate over the variable label pairs...
OpenGM runtime error.
Definition: opengm.hxx:100
ValueType min() const
Minimum value of the label order function.
ValueType operator()(Iterator statesBegin) const
Function evaluation.