2 #ifndef OPENGM_ALPHABEATSWAP_HXX
3 #define OPENGM_ALPHABETASWAP_HXX
14 template<
class GM,
class INF>
35 std::string
name()
const;
38 template<
class VISITOR>
45 const GraphicalModelType& gm_;
47 std::vector<LabelType> label_;
57 template<
class GM,
class INF>
62 std::fill(label_.begin(),label_.end(),0);
65 template<
class GM,
class INF>
68 if (++beta_ >= maxState_) {
69 if (++alpha_ >= maxState_ - 1) {
79 template<
class GM,
class INF>
82 return "Alpha-Beta-Swap";
85 template<
class GM,
class INF>
91 template<
class GM,
class INF>
94 const GraphicalModelType& gm,
100 label_.resize(gm_.numberOfVariables(), 0);
103 for (
size_t j = 0; j < gm_.numberOfFactors(); ++j) {
104 if (gm_[j].numberOfVariables() > 2) {
105 throw RuntimeError(
"This implementation of Alpha-Beta-Swap supports only factors of order <= 2.");
109 for (
size_t i = 0; i < gm_.numberOfVariables(); ++i) {
110 size_t numSt = gm_.numberOfLabels(i);
111 if (numSt > maxState_)
116 template<
class GM,
class INF>
123 label_.assign(begin, begin+gm_.numberOfVariables());
130 template<
class GM,
class INF>
139 const size_t shape[] = {2};
140 const size_t vars[] = {var1};
147 template<
class GM,
class INF>
149 AlphaBetaSwap<GM, INF>::addPairwise
159 const size_t shape[] = {2, 2};
160 const size_t vars[] = {var1, var2};
169 template<
class GM,
class INF>
176 template<
class GM,
class INF>
177 template<
class VISITOR>
184 visitor.begin(*
this);
186 size_t countUnchanged = 0;
187 size_t numberOfVariables = gm_.numberOfVariables();
188 std::vector<size_t> variable2Node(numberOfVariables, 0);
200 size_t numberOfLabelPairs = maxState_*(maxState_ - 1)/2;
201 while (it++ < parameter_.maxNumberOfIterations_ && countUnchanged < numberOfLabelPairs && exitInf ==
false) {
204 std::vector<size_t> numFacDim(4, 0);
205 for (
size_t i = 0; i < numberOfVariables; ++i) {
206 if (label_[i] == alpha_ || label_[i] == beta_) {
207 variable2Node[i] = counter++;
213 INF inf(counter, numFacDim);
228 for (
size_t k = 0; k < gm_.numberOfFactors(); ++k) {
230 if (factor.numberOfVariables() == 1) {
231 size_t var = factor.variableIndex(0);
232 size_t node = variable2Node[var];
233 if (label_[var] == alpha_ || label_[var] == beta_) {
236 addUnary(inf, node, factor(vecA), factor(vecB));
239 }
else if (factor.numberOfVariables() == 2) {
240 size_t var1 = factor.variableIndex(0);
241 size_t var2 = factor.variableIndex(1);
242 size_t node1 = variable2Node[var1];
243 size_t node2 = variable2Node[var2];
245 if ((label_[var1] == alpha_ || label_[var1] == beta_) && (label_[var2] == alpha_ || label_[var2] == beta_)) {
246 addPairwise(inf, node1, node2, factor(vecAA), factor(vecAB), factor(vecBA), factor(vecBB));
248 }
else if ((label_[var1] == alpha_ || label_[var1] == beta_) && (label_[var2] != alpha_ && label_[var2] != beta_)) {
249 vecAX[1] = vecBX[1] = label_[var2];
250 addUnary(inf, node1, factor(vecAX), factor(vecBX));
252 }
else if ((label_[var2] == alpha_ || label_[var2] == beta_) && (label_[var1] != alpha_ && label_[var1] != beta_)) {
253 vecXA[0] = vecXB[0] = label_[var1];
254 addUnary(inf, node2, factor(vecXA), factor(vecXB));
259 std::vector<LabelType> state;
263 for (
size_t var = 0; var < numberOfVariables; ++var) {
264 if (label_[var] == alpha_ || label_[var] == beta_) {
265 if (state[variable2Node[var]] == 0)
266 label_[var] = alpha_;
273 ValueType energy2 = gm_.evaluate(label_);
278 if (AccumulationType::bop(energy2, energy)) {
288 template<
class GM,
class INF>
295 arg.resize(label_.size());
296 for (
size_t i = 0; i < label_.size(); ++i)
304 #endif // #ifndef OPENGM_ALPHABEATSWAP_HXX
const GraphicalModelType & graphicalModel() const
Factor (with corresponding function and variable indices), independent of a GraphicalModel.
opengm::visitors::EmptyVisitor< AlphaBetaSwap< GM, INF > > EmptyVisitorType
opengm::visitors::VerboseVisitor< AlphaBetaSwap< GM, INF > > VerboseVisitorType
#define OPENGM_ASSERT(expression)
AlphaBetaSwap(const GraphicalModelType &, Parameter=Parameter())
void setStartingPoint(typename std::vector< LabelType >::const_iterator)
set initial labeling
InferenceType::Parameter parameter_
opengm::visitors::TimingVisitor< AlphaBetaSwap< GM, INF > > TimingVisitorType
GraphicalModelType::FactorType FactorType
Alpha-Beta-Swap Algorithm.
INF::AccumulationType AccumulationType
size_t maxNumberOfIterations_
GraphicalModelType::ValueType ValueType
InferenceTermination arg(std::vector< LabelType > &, const size_t=1) const
output a solution
Inference algorithm interface.
GraphicalModelType::LabelType LabelType
InferenceTermination infer()
static const size_t ContinueInf