2 #ifndef OPENGM_GREEDYGREMLIN_HXX 3 #define OPENGM_GREEDYGREMLIN_HXX 33 template<
class GM,
class ACC>
52 template<
class _GM,
class _ACC>
68 virtual std::string
name()
const {
return "GreedyGremlin";}
81 std::vector<LabelType> conf_;
92 template<
class GM,
class ACC >
97 ):gm_(gm), parameter_(para)
99 conf_.resize(gm.numberOfVariables(),0);
108 template<
class GM,
class ACC >
115 template <
class GM,
class ACC>
125 template<
class GM,
class ACC>
126 template<
class VisitorType>
129 std::vector<bool> nodeColor(gm_.numberOfVariables(),
false);
130 std::vector<IndexType> waitingList(gm_.numberOfVariables());
135 visitor.begin(*
this);
136 const ValueType neutral = GM::OperatorType::template neutral<ValueType>();
137 while(waitingListFirst<waitingList.size()){
139 IndexType var = waitingList[waitingListFirst++];
140 std::vector<ValueType> vals(gm_.numberOfLabels(var),neutral);
142 for(
typename GM::ConstFactorIterator fit=gm_.factorsOfVariableBegin(var); fit!=gm_.factorsOfVariableEnd(var); ++fit){
144 for(
typename GM::ConstVariableIterator vit=gm_.variablesOfFactorBegin(*fit); vit!=gm_.variablesOfFactorEnd(*fit); ++vit){
145 if(nodeColor[*vit]==
false){
151 std::vector<LabelType> l(gm_[*fit].numberOfVariables());
153 for(
size_t i=0; i<l.size();++i){
154 if(gm_[*fit].variableIndex(i)==var)
157 l[i] = conf_[gm_[*fit].variableIndex(i)];
159 for(l[p]=0; l[p]<gm_.numberOfLabels(var);++l[p]){
160 const ValueType v = gm_[*fit](l.begin());
161 GM::OperatorType::op(v,vals[l[p]]);
167 for(
size_t i=0; i<vals.size();++i){
168 if(ACC::bop(vals[i],vals[conf_[var]]))
173 for(
typename GM::ConstFactorIterator fit=gm_.factorsOfVariableBegin(var); fit!=gm_.factorsOfVariableEnd(var); ++fit){
174 for(
typename GM::ConstVariableIterator vit=gm_.variablesOfFactorBegin(*fit); vit!=gm_.variablesOfFactorEnd(*fit); ++vit){
175 if(nodeColor[*vit]==
false){
176 nodeColor[*vit]=
true;
177 waitingList[++waitingListLast] = *vit;
190 template<
class GM,
class ACC>
192 ::arg(std::vector<LabelType>& conf,
const size_t n)
const 207 template<
class GM,
class ACC>
215 template<
class GM,
class ACC>
225 #endif // #ifndef OPENGM_GREEDYGREMLIN_HXX
virtual InferenceTermination infer()
GreedyGremlin(const GM &gm, Parameter para=Parameter())
constructor
virtual std::string name() const
GM GraphicalModelType
graphical model type
#define OPENGM_ASSERT(expression)
virtual InferenceTermination args(std::vector< std::vector< LabelType > > &v) const
args
visitors::TimingVisitor< GreedyGremlin< GM, ACC > > TimingVisitorType
GreedyGremlin< _GM, ACC > type
visitors::VerboseVisitor< GreedyGremlin< GM, ACC > > VerboseVisitorType
visitor
GraphicalModelType::IndexType IndexType
virtual InferenceTermination factorMarginal(const size_t, IndependentFactorType &out) const
output a solution for a marginal for all variables connected to a factor
GraphicalModelType::ValueType ValueType
const GraphicalModelType & graphicalModel() const
Inference algorithm interface.
GreedyGremlin< _GM, _ACC > type
ACC AccumulationType
accumulation type
virtual void reset()
reset
virtual InferenceTermination arg(std::vector< LabelType > &v, const size_t=1) const
output a solution
virtual InferenceTermination marginal(const size_t, IndependentFactorType &out) const
output a solution for a marginal for a specific variable
GraphicalModelType::LabelType LabelType
static const size_t ContinueInf
visitors::EmptyVisitor< GreedyGremlin< GM, ACC > > EmptyVisitorType
GraphicalModelType::IndependentFactorType IndependentFactorType