2 #ifndef OPENGM_ALPHAEXPANSIONFUSION_HXX
3 #define OPENGM_ALPHAEXPANSIONSUSION_HXX
7 #include "opengm/inference/fix-fusion/fusion-move.hpp"
19 template<
class GM,
class ACC>
36 const size_t maxNumberOfSteps = 1000
58 std::string
name()
const;
60 template<
class StateIterator>
61 void setState(StateIterator, StateIterator);
64 template<
class Visitor>
70 const GraphicalModelType& gm_;
72 static const size_t maxOrder_ =10;
73 std::vector<LabelType> label_;
74 std::vector<LabelType> labelList_;
78 void incrementAlpha();
79 void setLabelOrder(std::vector<LabelType>& l);
80 void setLabelOrderRandom(
unsigned int);
81 void setInitialLabel(std::vector<LabelType>& l);
82 void setInitialLabelLocalOptimal();
83 void setInitialLabelRandom(
unsigned int);
90 template<
class GM,
class ACC>
94 return "Alpha-Expansion-Fusion";
97 template<
class GM,
class ACC>
104 template<
class GM,
class ACC>
105 template<
class StateIterator>
113 label_.assign(begin, end);
116 template<
class GM,
class ACC>
123 label_.assign(begin, begin+gm_.numberOfVariables());
130 template<
class GM,
class ACC>
134 const GraphicalModelType& gm,
141 for(
size_t j=0; j<gm_.numberOfFactors(); ++j) {
142 if(gm_[j].numberOfVariables() > maxOrder_) {
143 throw RuntimeError(
"This implementation of Alpha-Expansion-Fusion supports only factors of this order! Increase the constant maxOrder_!");
146 for(
size_t i=0; i<gm_.numberOfVariables(); ++i) {
147 size_t numSt = gm_.numberOfLabels(i);
148 if(numSt > maxState_) {
153 if(parameter_.labelInitialType_ == Parameter::RANDOM_LABEL) {
154 setInitialLabelRandom(parameter_.randSeedLabel_);
156 else if(parameter_.labelInitialType_ == Parameter::LOCALOPT_LABEL) {
157 setInitialLabelLocalOptimal();
159 else if(parameter_.labelInitialType_ == Parameter::EXPLICIT_LABEL) {
160 setInitialLabel(parameter_.label_);
163 label_.resize(gm_.numberOfVariables(), 0);
167 if(parameter_.orderType_ == Parameter::RANDOM_ORDER) {
168 setLabelOrderRandom(parameter_.randSeedOrder_);
170 else if(parameter_.orderType_ == Parameter::EXPLICIT_ORDER) {
171 setLabelOrder(parameter_.labelOrder_);
174 labelList_.resize(maxState_);
175 for(
size_t i=0; i<maxState_; ++i)
180 alpha_ = labelList_[counter_];
185 template<
class GM,
class ACC>
188 if(parameter_.labelInitialType_ == Parameter::RANDOM_LABEL) {
189 setInitialLabelRandom(parameter_.randSeedLabel_);
191 else if(parameter_.labelInitialType_ == Parameter::LOCALOPT_LABEL) {
192 setInitialLabelLocalOptimal();
194 else if(parameter_.labelInitialType_ == Parameter::EXPLICIT_LABEL) {
195 setInitialLabel(parameter_.label_);
198 std::fill(label_.begin(),label_.end(),0);
202 if(parameter_.orderType_ == Parameter::RANDOM_ORDER) {
203 setLabelOrderRandom(parameter_.randSeedOrder_);
205 else if(parameter_.orderType_ == Parameter::EXPLICIT_ORDER) {
206 setLabelOrder(parameter_.labelOrder_);
209 for(
size_t i=0; i<maxState_; ++i)
213 alpha_ = labelList_[counter_];
216 template<
class GM,
class ACC>
226 inf.AddUnaryTerm((
int) (var1), v0, v1);
229 template<
class GM,
class ACC>
232 AlphaExpansionFusion<GM, ACC>::addPairwise
242 inf.AddPairwiseTerm((
int) (var1), (
int)(var2),v0,v1,v2,v3);
245 template<
class GM,
class ACC>
249 EmptyVisitorType visitor;
250 return infer(visitor);
253 template<
class GM,
class ACC>
254 template<
class Visitor>
261 bool exitInf =
false;
263 size_t countUnchanged = 0;
268 visitor.begin(*
this);
277 while(it++ < parameter_.maxNumberOfSteps_ && countUnchanged < maxState_ && exitInf ==
false) {
279 unsigned int maxNumAssignments = 1 << maxOrder_;
280 std::vector<ValueType> coeffs(maxNumAssignments);
281 std::vector<LabelType> cliqueLabels(maxOrder_);
283 HigherOrderEnergy<ValueType, maxOrder_> hoe;
284 hoe.AddVars(gm_.numberOfVariables());
285 for(
IndexType f=0; f<gm_.numberOfFactors(); ++f){
286 IndexType size = gm_[f].numberOfVariables();
289 }
else if (size == 1) {
293 hoe.AddUnaryTerm(var, e1 - e0);
297 unsigned int numAssignments = 1 << size;
299 for (
unsigned int subset = 1; subset < numAssignments; ++subset) {
305 for(
unsigned int assignment = 0; assignment < numAssignments; ++assignment){
306 for (
unsigned int i = 0; i < size; ++i) {
309 if (assignment & (1 << i)) {
310 cliqueLabels[i] = alpha_;
312 cliqueLabels[i] = label_[gm_[f].variableIndex(i)];
315 ValueType energy = gm_[f](cliqueLabels.begin());
316 for (
unsigned int subset = 1; subset < numAssignments; ++subset){
318 if (assignment & ~subset) {
324 for (
unsigned int b = 0; b < size; ++b) {
325 parity ^= (((assignment ^ subset) & (1 << b)) != 0);
327 coeffs[subset] += parity ? -energy : energy;
331 typename HigherOrderEnergy<ValueType, maxOrder_> ::VarId vars[maxOrder_];
332 for (
unsigned int subset = 1; subset < numAssignments; ++subset) {
334 for (
unsigned int b = 0; b < size; ++b) {
335 if (subset & (1 << b)) {
336 vars[degree++] = gm_[f].variableIndex(b);
339 std::sort(vars, vars+degree);
340 hoe.AddTerm(coeffs[subset], degree, vars);
344 kolmogorov::qpbo::QPBO<ValueType> qr(gm_.numberOfVariables(), 0);
348 for (
IndexType i = 0; i < gm_.numberOfVariables(); ++i) {
349 int label = qr.GetLabel(i);
352 ++numberOfChangedVariables;
358 if(numberOfChangedVariables>0){
471 template<
class GM,
class ACC>
475 std::vector<LabelType>& arg,
484 arg.resize(label_.size());
485 for(
size_t i=0; i<label_.size(); ++i) {
492 template<
class GM,
class ACC>
496 std::vector<LabelType>& l
498 if(l.size() == maxState_) {
503 template<
class GM,
class ACC>
505 AlphaExpansionFusion<GM, ACC>::setLabelOrderRandom
510 labelList_.resize(maxState_);
511 for (
size_t i=0; i<maxState_;++i) {
514 random_shuffle(labelList_.begin(), labelList_.end());
517 template<
class GM,
class ACC>
519 AlphaExpansionFusion<GM, ACC>::setInitialLabel
521 std::vector<LabelType>& l
523 label_.resize(gm_.numberOfVariables());
524 if(l.size() == label_.size()) {
525 for(
size_t i=0; i<l.size();++i) {
526 if(l[i]>=gm_.numberOfLabels(i))
return;
528 for(
size_t i=0; i<l.size();++i) {
534 template<
class GM,
class ACC>
536 AlphaExpansionFusion<GM, ACC>::setInitialLabelLocalOptimal() {
537 label_.resize(gm_.numberOfVariables(), 0);
538 std::vector<size_t> accVec;
539 for(
size_t i=0; i<gm_.numberOfFactors();++i) {
540 if(gm_[i].numberOfVariables()==1) {
541 std::vector<size_t> state(1, 0);
542 ValueType value = gm_[i](state.begin());
543 for(state[0]=1; state[0]<gm_.numberOfLabels(i); ++state[0]) {
544 if(AccumulationType::bop(gm_[i](state.begin()), value)) {
545 value = gm_[i](state.begin());
546 label_[i] = state[0];
553 template<
class GM,
class ACC>
555 AlphaExpansionFusion<GM, ACC>::setInitialLabelRandom
560 label_.resize(gm_.numberOfVariables());
561 for(
size_t i=0; i<gm_.numberOfVariables();++i) {
562 label_[i] = rand() % gm_.numberOfLabels(i);
566 template<
class GM,
class ACC>
568 AlphaExpansionFusion<GM, ACC>::incrementAlpha() {
569 counter_ = (counter_+1) % maxState_;
570 alpha_ = labelList_[counter_];
575 #endif // #ifndef OPENGM_ALPHAEXPANSIONFUSION_HXX
const GraphicalModelType & graphicalModel() const
std::vector< LabelType > label_
AlphaExpansionFusion(const GraphicalModelType &, Parameter para=Parameter())
Alpha-Expansion-Fusion Algorithm uses the code of Alexander Fix to reduce the higer order moves to bi...
visitors::TimingVisitor< AlphaExpansionFusion< GM, ACC > > TimingVisitorType
LabelingIntitialType labelInitialType_
#define OPENGM_ASSERT(expression)
Parameter(const size_t maxNumberOfSteps=1000)
InferenceTermination infer()
GraphicalModelType::IndexType IndexType
std::vector< LabelType > labelOrder_
InferenceTermination arg(std::vector< LabelType > &, const size_t=1) const
output a solution
visitors::VerboseVisitor< AlphaExpansionFusion< GM, ACC > > VerboseVisitorType
GraphicalModelType::ValueType ValueType
Inference algorithm interface.
visitors::EmptyVisitor< AlphaExpansionFusion< GM, ACC > > EmptyVisitorType
GraphicalModelType::LabelType LabelType
unsigned int randSeedLabel_
void setStartingPoint(typename std::vector< LabelType >::const_iterator)
set initial labeling
static const size_t ContinueInf
void setState(StateIterator, StateIterator)
unsigned int randSeedOrder_