2 #ifndef OPENGM_ALPHABEATSWAP_HXX 3 #define OPENGM_ALPHABETASWAP_HXX 14 template<
class GM,
class INF>
32 template<
class _GM,
class _ACC>
41 maxNumberOfIterations_ = 1000;
45 : parameter_(p.parameter_),
46 maxNumberOfIterations_(maxNumberOfIterations_){
54 std::string
name()
const;
57 template<
class VISITOR>
64 const GraphicalModelType& gm_;
66 std::vector<LabelType> label_;
76 template<
class GM,
class INF>
81 std::fill(label_.begin(),label_.end(),0);
84 template<
class GM,
class INF>
87 if (++beta_ >= maxState_) {
88 if (++alpha_ >= maxState_ - 1) {
98 template<
class GM,
class INF>
101 return "Alpha-Beta-Swap";
104 template<
class GM,
class INF>
110 template<
class GM,
class INF>
113 const GraphicalModelType& gm,
119 label_.resize(gm_.numberOfVariables(), 0);
122 for (
size_t j = 0; j < gm_.numberOfFactors(); ++j) {
123 if (gm_[j].numberOfVariables() > 2) {
124 throw RuntimeError(
"This implementation of Alpha-Beta-Swap supports only factors of order <= 2.");
128 for (
size_t i = 0; i < gm_.numberOfVariables(); ++i) {
129 size_t numSt = gm_.numberOfLabels(i);
130 if (numSt > maxState_)
135 template<
class GM,
class INF>
142 label_.assign(begin, begin+gm_.numberOfVariables());
149 template<
class GM,
class INF>
158 const size_t shape[] = {2};
159 const size_t vars[] = {var1};
166 template<
class GM,
class INF>
178 const size_t shape[] = {2, 2};
179 const size_t vars[] = {var1, var2};
188 template<
class GM,
class INF>
195 template<
class GM,
class INF>
196 template<
class VISITOR>
203 visitor.begin(*
this);
205 size_t countUnchanged = 0;
206 size_t numberOfVariables = gm_.numberOfVariables();
207 std::vector<size_t> variable2Node(numberOfVariables, 0);
219 size_t numberOfLabelPairs = maxState_*(maxState_ - 1)/2;
220 while (it++ < parameter_.maxNumberOfIterations_ && countUnchanged < numberOfLabelPairs && exitInf ==
false) {
223 std::vector<size_t> numFacDim(4, 0);
224 for (
size_t i = 0; i < numberOfVariables; ++i) {
225 if (label_[i] == alpha_ || label_[i] == beta_) {
226 variable2Node[i] = counter++;
232 INF inf(counter, numFacDim);
247 for (
size_t k = 0; k < gm_.numberOfFactors(); ++k) {
249 if (factor.numberOfVariables() == 1) {
250 size_t var = factor.variableIndex(0);
251 size_t node = variable2Node[var];
252 if (label_[var] == alpha_ || label_[var] == beta_) {
255 addUnary(inf, node, factor(vecA), factor(vecB));
258 }
else if (factor.numberOfVariables() == 2) {
259 size_t var1 = factor.variableIndex(0);
260 size_t var2 = factor.variableIndex(1);
261 size_t node1 = variable2Node[var1];
262 size_t node2 = variable2Node[var2];
264 if ((label_[var1] == alpha_ || label_[var1] == beta_) && (label_[var2] == alpha_ || label_[var2] == beta_)) {
265 addPairwise(inf, node1, node2, factor(vecAA), factor(vecAB), factor(vecBA), factor(vecBB));
267 }
else if ((label_[var1] == alpha_ || label_[var1] == beta_) && (label_[var2] != alpha_ && label_[var2] != beta_)) {
268 vecAX[1] = vecBX[1] = label_[var2];
269 addUnary(inf, node1, factor(vecAX), factor(vecBX));
271 }
else if ((label_[var2] == alpha_ || label_[var2] == beta_) && (label_[var1] != alpha_ && label_[var1] != beta_)) {
272 vecXA[0] = vecXB[0] = label_[var1];
273 addUnary(inf, node2, factor(vecXA), factor(vecXB));
278 std::vector<LabelType> state;
282 for (
size_t var = 0; var < numberOfVariables; ++var) {
283 if (label_[var] == alpha_ || label_[var] == beta_) {
284 if (state[variable2Node[var]] == 0)
285 label_[var] = alpha_;
292 ValueType energy2 = gm_.evaluate(label_);
297 if (AccumulationType::bop(energy2, energy)) {
307 template<
class GM,
class INF>
314 arg.resize(label_.size());
315 for (
size_t i = 0; i < label_.size(); ++i)
323 #endif // #ifndef OPENGM_ALPHABEATSWAP_HXX
const GraphicalModelType & graphicalModel() const
Factor (with corresponding function and variable indices), independent of a GraphicalModel.
AlphaBetaSwap< _GM, RebindedInf > type
opengm::visitors::EmptyVisitor< AlphaBetaSwap< GM, INF > > EmptyVisitorType
AlphaBetaSwap< _GM, RebindedInf > type
opengm::visitors::VerboseVisitor< AlphaBetaSwap< GM, INF > > VerboseVisitorType
#define OPENGM_ASSERT(expression)
AlphaBetaSwap(const GraphicalModelType &, Parameter=Parameter())
void setStartingPoint(typename std::vector< LabelType >::const_iterator)
INF::template RebindGmAndAcc< _GM, _ACC >::type RebindedInf
InferenceType::Parameter parameter_
opengm::visitors::TimingVisitor< AlphaBetaSwap< GM, INF > > TimingVisitorType
GraphicalModelType::FactorType FactorType
Alpha-Beta-Swap Algorithm.
INF::AccumulationType AccumulationType
size_t maxNumberOfIterations_
InferenceTermination arg(std::vector< LabelType > &, const size_t=1) const
GraphicalModelType::ValueType ValueType
Inference algorithm interface.
GraphicalModelType::LabelType LabelType
InferenceTermination infer()
static const size_t ContinueInf
INF::template RebindGm< _GM >::type RebindedInf