2 #ifndef OPENGM_ALPHAEXPANSION_HXX
3 #define OPENGM_ALPHAEXPANSION_HXX
12 template<
class GM,
class INF>
14 :
public Inference<GM, typename INF::AccumulationType>
32 const size_t maxNumberOfSteps = 1000,
57 std::string
name()
const;
59 template<
class StateIterator>
60 void setState(StateIterator, StateIterator);
63 template<
class Visitor>
69 const GraphicalModelType& gm_;
71 std::vector<LabelType> label_;
72 std::vector<LabelType> labelList_;
76 void incrementAlpha();
77 void setLabelOrder(std::vector<LabelType>& l);
78 void setLabelOrderRandom(
unsigned int);
79 void setInitialLabel(std::vector<LabelType>& l);
80 void setInitialLabelLocalOptimal();
81 void setInitialLabelRandom(
unsigned int);
86 template<
class GM,
class INF>
90 return "Alpha-Expansion";
93 template<
class GM,
class INF>
100 template<
class GM,
class INF>
101 template<
class StateIterator>
109 label_.assign(begin, end);
112 template<
class GM,
class INF>
119 label_.assign(begin, begin+gm_.numberOfVariables());
126 template<
class GM,
class INF>
130 const GraphicalModelType& gm,
137 for(
size_t j=0; j<gm_.numberOfFactors(); ++j) {
138 if(gm_[j].numberOfVariables() > 2) {
139 throw RuntimeError(
"This implementation of Alpha-Expansion supports only factors of order <= 2.");
142 for(
size_t i=0; i<gm_.numberOfVariables(); ++i) {
143 size_t numSt = gm_.numberOfLabels(i);
144 if(numSt > maxState_) {
149 if(parameter_.labelInitialType_ == Parameter::RANDOM_LABEL) {
150 setInitialLabelRandom(parameter_.randSeedLabel_);
152 else if(parameter_.labelInitialType_ == Parameter::LOCALOPT_LABEL) {
153 setInitialLabelLocalOptimal();
155 else if(parameter_.labelInitialType_ == Parameter::EXPLICIT_LABEL) {
156 setInitialLabel(parameter_.label_);
159 label_.resize(gm_.numberOfVariables(), 0);
163 if(parameter_.orderType_ == Parameter::RANDOM_ORDER) {
164 setLabelOrderRandom(parameter_.randSeedOrder_);
166 else if(parameter_.orderType_ == Parameter::EXPLICIT_ORDER) {
167 setLabelOrder(parameter_.labelOrder_);
170 labelList_.resize(maxState_);
171 for(
size_t i=0; i<maxState_; ++i)
176 alpha_ = labelList_[counter_];
181 template<
class GM,
class INF>
184 if(parameter_.labelInitialType_ == Parameter::RANDOM_LABEL) {
185 setInitialLabelRandom(parameter_.randSeedLabel_);
187 else if(parameter_.labelInitialType_ == Parameter::LOCALOPT_LABEL) {
188 setInitialLabelLocalOptimal();
190 else if(parameter_.labelInitialType_ == Parameter::EXPLICIT_LABEL) {
191 setInitialLabel(parameter_.label_);
194 std::fill(label_.begin(),label_.end(),0);
198 if(parameter_.orderType_ == Parameter::RANDOM_ORDER) {
199 setLabelOrderRandom(parameter_.randSeedOrder_);
201 else if(parameter_.orderType_ == Parameter::EXPLICIT_ORDER) {
202 setLabelOrder(parameter_.labelOrder_);
205 for(
size_t i=0; i<maxState_; ++i)
209 alpha_ = labelList_[counter_];
212 template<
class GM,
class INF>
221 const size_t shape[] = {2};
222 size_t vars[] = {var1};
229 template<
class GM,
class INF>
231 AlphaExpansion<GM, INF>::addPairwise
242 const IndexType vars[] = {var1, var2};
251 template<
class GM,
class INF>
255 EmptyVisitorType visitor;
256 return infer(visitor);
259 template<
class GM,
class INF>
260 template<
class Visitor>
267 bool exitInf =
false;
269 size_t countUnchanged = 0;
270 size_t numberOfVariables = gm_.numberOfVariables();
271 std::vector<size_t> variable2Node(numberOfVariables);
273 visitor.begin(*
this);
280 while(it++ < parameter_.maxNumberOfSteps_ && countUnchanged < maxState_ && exitInf ==
false) {
281 size_t numberOfAuxiliaryNodes = 0;
282 for(
size_t k=0 ; k<gm_.numberOfFactors(); ++k) {
284 if(factor.numberOfVariables() == 2) {
285 size_t var1 = factor.variableIndex(0);
286 size_t var2 = factor.variableIndex(1);
287 if(label_[var1] != label_[var2] && label_[var1] != alpha_ && label_[var2] != alpha_ ) {
288 ++numberOfAuxiliaryNodes;
292 std::vector<size_t> numFacDim(4, 0);
293 INF inf(numberOfVariables + numberOfAuxiliaryNodes, numFacDim, parameter_.parameter_);
294 size_t varX = numberOfVariables;
295 size_t countAlphas = 0;
296 for (
size_t k=0 ; k<gm_.numberOfVariables(); ++k) {
297 if (label_[k] == alpha_ ) {
298 addUnary(inf, k, 0, std::numeric_limits<ValueType>::infinity());
302 if(countAlphas < gm_.numberOfVariables()) {
303 for (
size_t k=0 ; k<gm_.numberOfFactors(); ++k) {
305 if(factor.numberOfVariables() == 1) {
306 size_t var = factor.variableIndex(0);
308 vecX[0] = label_[var];
309 if (label_[var] != alpha_ ) {
310 addUnary(inf, var, factor(vecA), factor(vecX));
313 else if (factor.numberOfVariables() == 2) {
314 size_t var1 = factor.variableIndex(0);
315 size_t var2 = factor.variableIndex(1);
316 std::vector<IndexType> vars(2); vars[0]=var1;vars[1]=var2;
317 vecAA[0] = vecAA[1] = alpha_;
318 vecAX[0] = alpha_; vecAX[1] = label_[var2];
319 vecXA[0] = label_[var1]; vecXA[1] = alpha_;
320 vecXX[0] = label_[var1]; vecXX[1] = label_[var2];
321 if(label_[var1]==alpha_ && label_[var2]==alpha_) {
324 else if(label_[var1]==alpha_) {
325 addUnary(inf, var2, factor(vecAA), factor(vecAX));
327 else if(label_[var2]==alpha_) {
328 addUnary(inf, var1, factor(vecAA), factor(vecXA));
330 else if(label_[var1]==label_[var2]) {
331 addPairwise(inf, var1, var2, factor(vecAA), factor(vecAX), factor(vecXA), factor(vecXX));
334 OPENGM_ASSERT(varX < numberOfVariables + numberOfAuxiliaryNodes);
335 addPairwise(inf, var1, varX, 0, factor(vecAX), 0, 0);
336 addPairwise(inf, var2, varX, 0, factor(vecXA), 0, 0);
337 addUnary(inf, varX, factor(vecAA), factor(vecXX));
342 std::vector<LabelType> state;
345 OPENGM_ASSERT(state.size() == numberOfVariables + numberOfAuxiliaryNodes);
346 for(
size_t var=0; var<numberOfVariables ; ++var) {
347 if (label_[var] != alpha_ && state[var]==0) {
348 label_[var] = alpha_;
354 ValueType energy2 = gm_.evaluate(label_);
360 if(AccumulationType::bop(energy2, energy)) {
374 template<
class GM,
class INF>
378 std::vector<LabelType>& arg,
387 arg.resize(label_.size());
388 for(
size_t i=0; i<label_.size(); ++i) {
395 template<
class GM,
class INF>
399 std::vector<LabelType>& l
401 if(l.size() == maxState_) {
406 template<
class GM,
class INF>
408 AlphaExpansion<GM, INF>::setLabelOrderRandom
413 labelList_.resize(maxState_);
414 for (
size_t i=0; i<maxState_;++i) {
417 random_shuffle(labelList_.begin(), labelList_.end());
420 template<
class GM,
class INF>
422 AlphaExpansion<GM, INF>::setInitialLabel
424 std::vector<LabelType>& l
426 label_.resize(gm_.numberOfVariables());
427 if(l.size() == label_.size()) {
428 for(
size_t i=0; i<l.size();++i) {
429 if(l[i]>=gm_.numberOfLabels(i))
return;
431 for(
size_t i=0; i<l.size();++i) {
437 template<
class GM,
class INF>
439 AlphaExpansion<GM, INF>::setInitialLabelLocalOptimal() {
440 label_.resize(gm_.numberOfVariables(), 0);
441 std::vector<size_t> accVec;
442 for(
size_t i=0; i<gm_.numberOfFactors();++i) {
443 if(gm_[i].numberOfVariables()==1) {
444 std::vector<size_t> state(1, 0);
445 ValueType value = gm_[i](state.begin());
446 for(state[0]=1; state[0]<gm_.numberOfLabels(i); ++state[0]) {
447 if(AccumulationType::bop(gm_[i](state.begin()), value)) {
448 value = gm_[i](state.begin());
449 label_[i] = state[0];
456 template<
class GM,
class INF>
458 AlphaExpansion<GM, INF>::setInitialLabelRandom
463 label_.resize(gm_.numberOfVariables());
464 for(
size_t i=0; i<gm_.numberOfVariables();++i) {
465 label_[i] = rand() % gm_.numberOfLabels(i);
469 template<
class GM,
class INF>
471 AlphaExpansion<GM, INF>::incrementAlpha() {
472 counter_ = (counter_+1) % maxState_;
473 alpha_ = labelList_[counter_];
478 #endif // #ifndef OPENGM_ALPHAEXPANSION_HXX
Factor (with corresponding function and variable indices), independent of a GraphicalModel.
visitors::VerboseVisitor< AlphaExpansion< GM, INF > > VerboseVisitorType
void setStartingPoint(typename std::vector< LabelType >::const_iterator)
set initial labeling
INF::AccumulationType AccumulationType
unsigned int randSeedOrder_
const GraphicalModelType & graphicalModel() const
std::vector< LabelType > labelOrder_
InferenceType::Parameter InferenceParameter
visitors::TimingVisitor< AlphaExpansion< GM, INF > > TimingVisitorType
#define OPENGM_ASSERT(expression)
InferenceTermination arg(std::vector< LabelType > &, const size_t=1) const
output a solution
GraphicalModelType::FactorType FactorType
AlphaExpansion(const GraphicalModelType &, Parameter para=Parameter())
GraphicalModelType::ValueType ValueType
Parameter(const size_t maxNumberOfSteps=1000, const InferenceParameter ¶=InferenceParameter())
Inference algorithm interface.
unsigned int randSeedLabel_
Alpha-Expansion Algorithm.
visitors::EmptyVisitor< AlphaExpansion< GM, INF > > EmptyVisitorType
InferenceTermination infer()
void setState(StateIterator, StateIterator)
std::vector< LabelType > label_
GraphicalModelType::LabelType LabelType
InferenceParameter parameter_
static const size_t ContinueInf
LabelingIntitialType labelInitialType_