2 #ifndef OPENGM_ALPHAEXPANSION_HXX 3 #define OPENGM_ALPHAEXPANSION_HXX 12 template<
class GM,
class INF>
14 :
public Inference<GM, typename INF::AccumulationType>
31 template<
class _GM,
class _ACC>
44 const size_t maxNumberOfSteps = 1000,
45 const InferenceParameter& para = InferenceParameter()
48 maxNumberOfSteps_(maxNumberOfSteps),
49 labelInitialType_(DEFAULT_LABEL),
50 orderType_(DEFAULT_ORDER),
62 : parameter_(p.parameter_),
63 maxNumberOfSteps_(p.maxNumberOfSteps_),
64 labelInitialType_(p.labelInitialType_),
65 orderType_(p.orderType_),
66 randSeedOrder_(p.randSeedOrder_),
67 randSeedLabel_(p.randSeedLabel_),
68 labelOrder_(p.labelOrder_),
84 std::string
name()
const;
86 template<
class StateIterator>
87 void setState(StateIterator, StateIterator);
90 template<
class Visitor>
96 const GraphicalModelType& gm_;
98 std::vector<LabelType> label_;
99 std::vector<LabelType> labelList_;
103 void incrementAlpha();
104 void setLabelOrder(std::vector<LabelType>& l);
105 void setLabelOrderRandom(
unsigned int);
106 void setInitialLabel(std::vector<LabelType>& l);
107 void setInitialLabelLocalOptimal();
108 void setInitialLabelRandom(
unsigned int);
113 template<
class GM,
class INF>
117 return "Alpha-Expansion";
120 template<
class GM,
class INF>
127 template<
class GM,
class INF>
128 template<
class StateIterator>
136 label_.assign(begin, end);
139 template<
class GM,
class INF>
146 label_.assign(begin, begin+gm_.numberOfVariables());
153 template<
class GM,
class INF>
157 const GraphicalModelType& gm,
164 for(
size_t j=0; j<gm_.numberOfFactors(); ++j) {
165 if(gm_[j].numberOfVariables() > 2) {
166 throw RuntimeError(
"This implementation of Alpha-Expansion supports only factors of order <= 2.");
169 for(
size_t i=0; i<gm_.numberOfVariables(); ++i) {
170 size_t numSt = gm_.numberOfLabels(i);
171 if(numSt > maxState_) {
177 setInitialLabelRandom(parameter_.randSeedLabel_);
180 setInitialLabelLocalOptimal();
183 setInitialLabel(parameter_.label_);
186 label_.resize(gm_.numberOfVariables(), 0);
191 setLabelOrderRandom(parameter_.randSeedOrder_);
194 setLabelOrder(parameter_.labelOrder_);
197 labelList_.resize(maxState_);
198 for(
size_t i=0; i<maxState_; ++i)
203 alpha_ = labelList_[counter_];
208 template<
class GM,
class INF>
212 setInitialLabelRandom(parameter_.randSeedLabel_);
215 setInitialLabelLocalOptimal();
218 setInitialLabel(parameter_.label_);
221 std::fill(label_.begin(),label_.end(),0);
226 setLabelOrderRandom(parameter_.randSeedOrder_);
229 setLabelOrder(parameter_.labelOrder_);
232 for(
size_t i=0; i<maxState_; ++i)
236 alpha_ = labelList_[counter_];
239 template<
class GM,
class INF>
248 const size_t shape[] = {2};
249 size_t vars[] = {var1};
256 template<
class GM,
class INF>
278 template<
class GM,
class INF>
282 EmptyVisitorType visitor;
283 return infer(visitor);
286 template<
class GM,
class INF>
287 template<
class Visitor>
294 bool exitInf =
false;
296 size_t countUnchanged = 0;
297 size_t numberOfVariables = gm_.numberOfVariables();
298 std::vector<size_t> variable2Node(numberOfVariables);
300 visitor.begin(*
this);
307 while(it++ < parameter_.maxNumberOfSteps_ && countUnchanged < maxState_ && exitInf ==
false) {
308 size_t numberOfAuxiliaryNodes = 0;
309 for(
size_t k=0 ; k<gm_.numberOfFactors(); ++k) {
311 if(factor.numberOfVariables() == 2) {
312 size_t var1 = factor.variableIndex(0);
313 size_t var2 = factor.variableIndex(1);
314 if(label_[var1] != label_[var2] && label_[var1] != alpha_ && label_[var2] != alpha_ ) {
315 ++numberOfAuxiliaryNodes;
319 std::vector<size_t> numFacDim(4, 0);
320 INF inf(numberOfVariables + numberOfAuxiliaryNodes, numFacDim, parameter_.parameter_);
321 size_t varX = numberOfVariables;
322 size_t countAlphas = 0;
323 for (
size_t k=0 ; k<gm_.numberOfVariables(); ++k) {
324 if (label_[k] == alpha_ ) {
325 addUnary(inf, k, 0, std::numeric_limits<ValueType>::infinity());
329 if(countAlphas < gm_.numberOfVariables()) {
330 for (
size_t k=0 ; k<gm_.numberOfFactors(); ++k) {
332 if(factor.numberOfVariables() == 1) {
333 size_t var = factor.variableIndex(0);
335 vecX[0] = label_[var];
336 if (label_[var] != alpha_ ) {
337 addUnary(inf, var, factor(vecA), factor(vecX));
340 else if (factor.numberOfVariables() == 2) {
341 size_t var1 = factor.variableIndex(0);
342 size_t var2 = factor.variableIndex(1);
343 std::vector<IndexType> vars(2); vars[0]=var1;vars[1]=var2;
344 vecAA[0] = vecAA[1] = alpha_;
345 vecAX[0] = alpha_; vecAX[1] = label_[var2];
346 vecXA[0] = label_[var1]; vecXA[1] = alpha_;
347 vecXX[0] = label_[var1]; vecXX[1] = label_[var2];
348 if(label_[var1]==alpha_ && label_[var2]==alpha_) {
351 else if(label_[var1]==alpha_) {
352 addUnary(inf, var2, factor(vecAA), factor(vecAX));
354 else if(label_[var2]==alpha_) {
355 addUnary(inf, var1, factor(vecAA), factor(vecXA));
357 else if(label_[var1]==label_[var2]) {
358 addPairwise(inf, var1, var2, factor(vecAA), factor(vecAX), factor(vecXA), factor(vecXX));
361 OPENGM_ASSERT(varX < numberOfVariables + numberOfAuxiliaryNodes);
362 addPairwise(inf, var1, varX, 0, factor(vecAX), 0, 0);
363 addPairwise(inf, var2, varX, 0, factor(vecXA), 0, 0);
364 addUnary(inf, varX, factor(vecAA), factor(vecXX));
369 std::vector<LabelType> state;
372 OPENGM_ASSERT(state.size() == numberOfVariables + numberOfAuxiliaryNodes);
373 for(
size_t var=0; var<numberOfVariables ; ++var) {
374 if (label_[var] != alpha_ && state[var]==0) {
375 label_[var] = alpha_;
381 ValueType energy2 = gm_.evaluate(label_);
387 if(AccumulationType::bop(energy2, energy)) {
401 template<
class GM,
class INF>
405 std::vector<LabelType>&
arg,
414 arg.resize(label_.size());
415 for(
size_t i=0; i<label_.size(); ++i) {
422 template<
class GM,
class INF>
426 std::vector<LabelType>& l
428 if(l.size() == maxState_) {
433 template<
class GM,
class INF>
440 labelList_.resize(maxState_);
441 for (
size_t i=0; i<maxState_;++i) {
444 random_shuffle(labelList_.begin(), labelList_.end());
447 template<
class GM,
class INF>
451 std::vector<LabelType>& l
453 label_.resize(gm_.numberOfVariables());
454 if(l.size() == label_.size()) {
455 for(
size_t i=0; i<l.size();++i) {
456 if(l[i]>=gm_.numberOfLabels(i))
return;
458 for(
size_t i=0; i<l.size();++i) {
464 template<
class GM,
class INF>
467 label_.resize(gm_.numberOfVariables(), 0);
468 std::vector<size_t> accVec;
469 for(
size_t i=0; i<gm_.numberOfFactors();++i) {
470 if(gm_[i].numberOfVariables()==1) {
471 std::vector<size_t> state(1, 0);
473 for(state[0]=1; state[0]<gm_.numberOfLabels(i); ++state[0]) {
474 if(AccumulationType::bop(gm_[i](state.begin()), value)) {
475 value = gm_[i](state.begin());
476 label_[i] = state[0];
483 template<
class GM,
class INF>
490 label_.resize(gm_.numberOfVariables());
491 for(
size_t i=0; i<gm_.numberOfVariables();++i) {
492 label_[i] = rand() % gm_.numberOfLabels(i);
496 template<
class GM,
class INF>
499 counter_ = (counter_+1) % maxState_;
500 alpha_ = labelList_[counter_];
505 #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)
virtual ValueType value() const
return the solution (value)
InferenceTermination arg(std::vector< LabelType > &, const size_t=1) const
INF::AccumulationType AccumulationType
unsigned int randSeedOrder_
std::vector< LabelType > labelOrder_
InferenceType::Parameter InferenceParameter
visitors::TimingVisitor< AlphaExpansion< GM, INF > > TimingVisitorType
#define OPENGM_ASSERT(expression)
AlphaExpansion< _GM, RebindedInf > type
INF::template RebindGmAndAcc< _GM, _ACC >::type RebindedInf
GraphicalModelType::IndexType IndexType
GraphicalModelType::FactorType FactorType
AlphaExpansion(const GraphicalModelType &, Parameter para=Parameter())
GraphicalModelType::ValueType ValueType
Inference algorithm interface.
unsigned int randSeedLabel_
Alpha-Expansion Algorithm.
visitors::EmptyVisitor< AlphaExpansion< GM, INF > > EmptyVisitorType
InferenceTermination infer()
const GraphicalModelType & graphicalModel() const
void setState(StateIterator, StateIterator)
std::vector< LabelType > label_
GraphicalModelType::LabelType LabelType
InferenceParameter parameter_
static const size_t ContinueInf
LabelingIntitialType labelInitialType_
INF::template RebindGm< _GM >::type RebindedInf
AlphaExpansion< _GM, RebindedInf > type