1 #ifndef OPENGM_LABEL_ORDER_FUNCTION_HXX_
2 #define OPENGM_LABEL_ORDER_FUNCTION_HXX_
20 template<
class VALUE_TYPE,
class INDEX_TYPE =
size_t,
class LABEL_TYPE =
size_t>
31 typedef typename LinearConstraintFunctionTraitsType::ValueType
ValueType;
32 typedef typename LinearConstraintFunctionTraitsType::IndexType
IndexType;
33 typedef typename LinearConstraintFunctionTraitsType::LabelType
LabelType;
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);
53 template<
class Iterator>
54 ValueType
operator()(Iterator statesBegin)
const;
55 size_t shape(
const size_t i)
const;
60 ValueType
min()
const;
61 ValueType
max()
const;
62 MinMaxFunctor<ValueType>
minMax()
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;
100 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
119 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
128 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
129 class FunctionSerialization<LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE> > {
131 typedef typename LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::ValueType ValueType;
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>&);
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.");
487 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
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_) {
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.");
509 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
510 template <
class ITERATOR_TYPE>
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_) {
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.");
533 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
538 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
539 template<
class Iterator>
541 if(labelOrder_[statesBegin[0]] <= labelOrder_[statesBegin[1]]) {
544 return returnInvalid_;
548 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
551 return (i==0 ? numLabelsVar1_ : numLabelsVar2_);
554 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
559 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
564 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
566 return returnValid_ < returnInvalid_ ? returnValid_ : returnInvalid_;
569 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
571 return returnValid_ > returnInvalid_ ? returnValid_ : returnInvalid_;
574 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
576 if(returnValid_ < returnInvalid_) {
577 return MinMaxFunctor<VALUE_TYPE>(returnValid_, returnInvalid_);
580 return MinMaxFunctor<VALUE_TYPE>(returnInvalid_, returnValid_);
584 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
586 return constraints_.begin();
589 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
591 return constraints_.end();
594 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
596 return indicatorVariableList_.begin();
599 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
601 return indicatorVariableList_.end();
604 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
605 template <
class LABEL_ITERATOR>
607 const ValueType weight = labelOrder_[labelingBegin[0]] - labelOrder_[labelingBegin[1]];
608 if(weight <= tolerance) {
611 violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
614 if(useSingleConstraint_) {
615 violatedConstraintsIds_[0] = 0;
616 violatedConstraintsWeights_[0] = weight;
618 if(useMultipleConstraints_) {
619 violatedConstraintsIds_[(useSingleConstraint_ ? 1 : 0)] = labelingBegin[0] + (useSingleConstraint_ ? 1 : 0);
620 violatedConstraintsWeights_[(useSingleConstraint_ ? 1 : 0)] = weight;
625 violatedConstraintsEnd =
ViolatedLinearConstraintsIteratorType(constraints_.begin(), violatedConstraintsIds_.begin(), (useSingleConstraint_ ? 1 : 0) + (useMultipleConstraints_ ? 1 : 0));
626 violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
631 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
632 template <
class LABEL_ITERATOR>
634 size_t numViolatedConstraints = 0;
636 double weightVar2 = 0.0;
637 for(
IndexType i = 0; i < numLabelsVar2_; ++i) {
638 weightVar2 -= labelOrder_[i] * labelingBegin[numLabelsVar1_ + i];
641 double totalWeight = weightVar2;
642 for(
IndexType i = 0; i < numLabelsVar1_; ++i) {
643 double currentWeight = (labelOrder_[i] * labelingBegin[i]);
645 if(useSingleConstraint_) {
646 totalWeight += currentWeight;
648 if(useMultipleConstraints_) {
649 currentWeight += weightVar2;
650 if(currentWeight > tolerance) {
651 violatedConstraintsIds_[numViolatedConstraints] = i + (useSingleConstraint_ ? 1 : 0);
652 violatedConstraintsWeights_[numViolatedConstraints] = currentWeight;
653 ++numViolatedConstraints;
658 if(useSingleConstraint_) {
659 if(totalWeight > tolerance) {
660 violatedConstraintsIds_[numViolatedConstraints] = 0;
661 violatedConstraintsWeights_[numViolatedConstraints] = totalWeight;
662 ++numViolatedConstraints;
668 violatedConstraintsWeightsBegin = violatedConstraintsWeights_.begin();
671 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
673 if(labelOrder_.size() < std::max(numLabelsVar1_, numLabelsVar2_)) {
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));
685 for(
size_t i = 0; i < numLabelsVar2_; ++i) {
686 indicatorVariableList_[numLabelsVar1_ + i] =
typename LinearConstraintType::IndicatorVariableType(
IndexType(1),
LabelType(i));
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]);
698 for(
size_t i = 0; i < numLabelsVar2_; ++i) {
699 constraints_[0].add(
typename LinearConstraintType::IndicatorVariableType(
IndexType(1),
LabelType(i)), -labelOrder_[i]);
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]);
715 template<
class VALUE_TYPE,
class INDEX_TYPE,
class LABEL_TYPE>
717 const size_t shapeSize = 2;
718 const size_t labelOrderSize = 1;
719 const size_t totalIndexSize = shapeSize + labelOrderSize;
720 return totalIndexSize;
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;
727 const size_t totalValueSize = labelOrderSize + returnSize;
728 return totalValueSize;
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) {
736 *indexOutIterator = src.numLabelsVar1_;
738 *indexOutIterator = src.numLabelsVar2_;
742 *indexOutIterator = src.labelOrder_.size();
746 for(
size_t i = 0; i < src.labelOrder_.size(); ++i) {
747 *valueOutIterator = src.labelOrder_[i];
752 *valueOutIterator = src.returnValid_;
754 *valueOutIterator = src.returnInvalid_;
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) {
762 const size_t numLabelsVar1 = *indexInIterator;
764 const size_t numLabelsVar2 = *indexInIterator;
768 const size_t labelOrderSize = *indexInIterator;
771 typename LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>::LabelOrderType labelOrder(valueInIterator, valueInIterator + labelOrderSize);
772 valueInIterator += labelOrderSize;
775 VALUE_TYPE returnValid = *valueInIterator;
779 VALUE_TYPE returnInvalid = *valueInIterator;
781 dst = LabelOrderFunction<VALUE_TYPE, INDEX_TYPE, LABEL_TYPE>(numLabelsVar1, numLabelsVar2, labelOrder, returnValid, returnInvalid);
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.
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.
std::vector< LinearConstraintType > LinearConstraintsContainerType
void challenge_impl(ViolatedLinearConstraintsIteratorType &violatedConstraintsBegin, ViolatedLinearConstraintsIteratorType &violatedConstraintsEnd, ViolatedLinearConstraintsWeightsIteratorType &violatedConstraintsWeightsBegin, LABEL_ITERATOR labelingBegin, const ValueType tolerance=0.0) const
Implementation of LinearConstraintFunctionBase::challenge.
std::vector< double > ViolatedLinearConstraintsWeightsContainerType
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.
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)
ViolatedLinearConstraintsWeightsContainerType::const_iterator ViolatedLinearConstraintsWeightsIteratorType
LinearConstraintsContainerType::const_iterator LinearConstraintsIteratorType
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.
LinearConstraint< ValueType, IndexType, LabelType > LinearConstraintType
~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.
LinearConstraintType::VariableLabelPairsIteratorType VariableLabelPairsIteratorType
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.
LinearConstraintType::IndicatorVariablesContainerType IndicatorVariablesContainerType
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...
LinearConstraintType::IndicatorVariablesIteratorType IndicatorVariablesIteratorType
ValueType min() const
Minimum value of the label order function.
ValueType operator()(Iterator statesBegin) const
Function evaluation.