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>
35 template<
class _GM,
class _ACC>
49 const size_t maxNumberOfSteps = 1000
51 : maxNumberOfSteps_(maxNumberOfSteps),
52 labelInitialType_(DEFAULT_LABEL),
53 orderType_(DEFAULT_ORDER),
65 : maxNumberOfSteps_(p.maxNumberOfSteps_),
66 labelInitialType_(p.labelInitialType_),
67 orderType_(p.orderType_),
68 randSeedOrder_(p.randSeedOrder_),
69 randSeedLabel_(p.randSeedLabel_),
70 labelOrder_(p.labelOrder_),
85 std::string
name()
const;
87 template<
class StateIterator>
88 void setState(StateIterator, StateIterator);
91 template<
class Visitor>
97 const GraphicalModelType& gm_;
99 static const size_t maxOrder_ =10;
100 std::vector<LabelType> label_;
101 std::vector<LabelType> labelList_;
105 void incrementAlpha();
106 void setLabelOrder(std::vector<LabelType>& l);
107 void setLabelOrderRandom(
unsigned int);
108 void setInitialLabel(std::vector<LabelType>& l);
109 void setInitialLabelLocalOptimal();
110 void setInitialLabelRandom(
unsigned int);
117 template<
class GM,
class ACC>
121 return "Alpha-Expansion-Fusion";
124 template<
class GM,
class ACC>
131 template<
class GM,
class ACC>
132 template<
class StateIterator>
140 label_.assign(begin, end);
143 template<
class GM,
class ACC>
150 label_.assign(begin, begin+gm_.numberOfVariables());
157 template<
class GM,
class ACC>
161 const GraphicalModelType& gm,
168 for(
size_t j=0; j<gm_.numberOfFactors(); ++j) {
169 if(gm_[j].numberOfVariables() > maxOrder_) {
170 throw RuntimeError(
"This implementation of Alpha-Expansion-Fusion supports only factors of this order! Increase the constant maxOrder_!");
173 for(
size_t i=0; i<gm_.numberOfVariables(); ++i) {
174 size_t numSt = gm_.numberOfLabels(i);
175 if(numSt > maxState_) {
181 setInitialLabelRandom(parameter_.randSeedLabel_);
184 setInitialLabelLocalOptimal();
187 setInitialLabel(parameter_.label_);
190 label_.resize(gm_.numberOfVariables(), 0);
195 setLabelOrderRandom(parameter_.randSeedOrder_);
198 setLabelOrder(parameter_.labelOrder_);
201 labelList_.resize(maxState_);
202 for(
size_t i=0; i<maxState_; ++i)
207 alpha_ = labelList_[counter_];
212 template<
class GM,
class ACC>
216 setInitialLabelRandom(parameter_.randSeedLabel_);
219 setInitialLabelLocalOptimal();
222 setInitialLabel(parameter_.label_);
225 std::fill(label_.begin(),label_.end(),0);
230 setLabelOrderRandom(parameter_.randSeedOrder_);
233 setLabelOrder(parameter_.labelOrder_);
236 for(
size_t i=0; i<maxState_; ++i)
240 alpha_ = labelList_[counter_];
243 template<
class GM,
class ACC>
253 inf.AddUnaryTerm((
int) (var1), v0, v1);
256 template<
class GM,
class ACC>
269 inf.AddPairwiseTerm((
int) (var1), (
int)(var2),v0,v1,v2,v3);
272 template<
class GM,
class ACC>
276 EmptyVisitorType visitor;
277 return infer(visitor);
280 template<
class GM,
class ACC>
281 template<
class Visitor>
288 bool exitInf =
false;
290 size_t countUnchanged = 0;
295 visitor.begin(*
this);
304 while(it++ < parameter_.maxNumberOfSteps_ && countUnchanged < maxState_ && exitInf ==
false) {
306 unsigned int maxNumAssignments = 1 << maxOrder_;
307 std::vector<ValueType> coeffs(maxNumAssignments);
308 std::vector<LabelType> cliqueLabels(maxOrder_);
310 HigherOrderEnergy<ValueType, maxOrder_> hoe;
311 hoe.AddVars(gm_.numberOfVariables());
312 for(
IndexType f=0; f<gm_.numberOfFactors(); ++f){
313 IndexType size = gm_[f].numberOfVariables();
316 }
else if (size == 1) {
320 hoe.AddUnaryTerm(var, e1 - e0);
324 unsigned int numAssignments = 1 << size;
326 for (
unsigned int subset = 1; subset < numAssignments; ++subset) {
332 for(
unsigned int assignment = 0; assignment < numAssignments; ++assignment){
333 for (
unsigned int i = 0; i < size; ++i) {
336 if (assignment & (1 << i)) {
337 cliqueLabels[i] = alpha_;
339 cliqueLabels[i] = label_[gm_[f].variableIndex(i)];
342 ValueType energy = gm_[f](cliqueLabels.begin());
343 for (
unsigned int subset = 1; subset < numAssignments; ++subset){
345 if (assignment & ~subset) {
351 for (
unsigned int b = 0; b < size; ++b) {
352 parity ^= (((assignment ^ subset) & (1 << b)) != 0);
354 coeffs[subset] += parity ? -energy : energy;
358 typename HigherOrderEnergy<ValueType, maxOrder_> ::VarId vars[maxOrder_];
359 for (
unsigned int subset = 1; subset < numAssignments; ++subset) {
361 for (
unsigned int b = 0; b < size; ++b) {
362 if (subset & (1 << b)) {
363 vars[degree++] = gm_[f].variableIndex(b);
366 std::sort(vars, vars+degree);
367 hoe.AddTerm(coeffs[subset], degree, vars);
371 kolmogorov::qpbo::QPBO<ValueType> qr(gm_.numberOfVariables(), 0);
375 for (
IndexType i = 0; i < gm_.numberOfVariables(); ++i) {
376 int label = qr.GetLabel(i);
379 ++numberOfChangedVariables;
385 if(numberOfChangedVariables>0){
498 template<
class GM,
class ACC>
502 std::vector<LabelType>&
arg,
511 arg.resize(label_.size());
512 for(
size_t i=0; i<label_.size(); ++i) {
519 template<
class GM,
class ACC>
523 std::vector<LabelType>& l
525 if(l.size() == maxState_) {
530 template<
class GM,
class ACC>
537 labelList_.resize(maxState_);
538 for (
size_t i=0; i<maxState_;++i) {
541 random_shuffle(labelList_.begin(), labelList_.end());
544 template<
class GM,
class ACC>
548 std::vector<LabelType>& l
550 label_.resize(gm_.numberOfVariables());
551 if(l.size() == label_.size()) {
552 for(
size_t i=0; i<l.size();++i) {
553 if(l[i]>=gm_.numberOfLabels(i))
return;
555 for(
size_t i=0; i<l.size();++i) {
561 template<
class GM,
class ACC>
564 label_.resize(gm_.numberOfVariables(), 0);
565 std::vector<size_t> accVec;
566 for(
size_t i=0; i<gm_.numberOfFactors();++i) {
567 if(gm_[i].numberOfVariables()==1) {
568 std::vector<size_t> state(1, 0);
570 for(state[0]=1; state[0]<gm_.numberOfLabels(i); ++state[0]) {
571 if(AccumulationType::bop(gm_[i](state.begin()), value)) {
572 value = gm_[i](state.begin());
573 label_[i] = state[0];
580 template<
class GM,
class ACC>
587 label_.resize(gm_.numberOfVariables());
588 for(
size_t i=0; i<gm_.numberOfVariables();++i) {
589 label_[i] = rand() % gm_.numberOfLabels(i);
593 template<
class GM,
class ACC>
596 counter_ = (counter_+1) % maxState_;
597 alpha_ = labelList_[counter_];
602 #endif // #ifndef OPENGM_ALPHAEXPANSIONFUSION_HXX
std::vector< LabelType > label_
virtual ValueType value() const
return the solution (value)
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)
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
AlphaExpansionFusion< _GM, ACC > type
AlphaExpansionFusion< _GM, _ACC > type
GraphicalModelType::ValueType ValueType
Inference algorithm interface.
visitors::EmptyVisitor< AlphaExpansionFusion< GM, ACC > > EmptyVisitorType
GraphicalModelType::LabelType LabelType
unsigned int randSeedLabel_
const GraphicalModelType & graphicalModel() const
void setStartingPoint(typename std::vector< LabelType >::const_iterator)
set initial labeling
static const size_t ContinueInf
void setState(StateIterator, StateIterator)
unsigned int randSeedOrder_