2 #ifndef OPENGM_GREEDYGREMLIN_HXX
3 #define OPENGM_GREEDYGREMLIN_HXX
33 template<
class GM,
class ACC>
51 virtual std::string
name()
const {
return "GreedyGremlin";}
64 std::vector<LabelType> conf_;
75 template<
class GM,
class ACC >
80 ):gm_(gm), parameter_(para)
82 conf_.resize(gm.numberOfVariables(),0);
91 template<
class GM,
class ACC >
98 template <
class GM,
class ACC>
108 template<
class GM,
class ACC>
109 template<
class VisitorType>
112 std::vector<bool> nodeColor(gm_.numberOfVariables(),
false);
113 std::vector<IndexType> waitingList(gm_.numberOfVariables());
118 visitor.begin(*
this);
119 const ValueType neutral = GM::OperatorType::template neutral<ValueType>();
120 while(waitingListFirst<waitingList.size()){
122 IndexType var = waitingList[waitingListFirst++];
123 std::vector<ValueType> vals(gm_.numberOfLabels(var),neutral);
125 for(
typename GM::ConstFactorIterator fit=gm_.factorsOfVariableBegin(var); fit!=gm_.factorsOfVariableEnd(var); ++fit){
127 for(
typename GM::ConstVariableIterator vit=gm_.variablesOfFactorBegin(*fit); vit!=gm_.variablesOfFactorEnd(*fit); ++vit){
128 if(nodeColor[*vit]==
false){
134 std::vector<LabelType> l(gm_[*fit].numberOfVariables());
136 for(
size_t i=0; i<l.size();++i){
137 if(gm_[*fit].variableIndex(i)==var)
140 l[i] = conf_[gm_[*fit].variableIndex(i)];
142 for(l[p]=0; l[p]<gm_.numberOfLabels(var);++l[p]){
143 const ValueType v = gm_[*fit](l.begin());
144 GM::OperatorType::op(v,vals[l[p]]);
150 for(
size_t i=0; i<vals.size();++i){
151 if(ACC::bop(vals[i],vals[conf_[var]]))
156 for(
typename GM::ConstFactorIterator fit=gm_.factorsOfVariableBegin(var); fit!=gm_.factorsOfVariableEnd(var); ++fit){
157 for(
typename GM::ConstVariableIterator vit=gm_.variablesOfFactorBegin(*fit); vit!=gm_.variablesOfFactorEnd(*fit); ++vit){
158 if(nodeColor[*vit]==
false){
159 nodeColor[*vit]=
true;
160 waitingList[++waitingListLast] = *vit;
173 template<
class GM,
class ACC>
175 ::arg(std::vector<LabelType>& conf,
const size_t n)
const
190 template<
class GM,
class ACC>
198 template<
class GM,
class ACC>
208 #endif // #ifndef OPENGM_GREEDYGREMLIN_HXX
virtual InferenceTermination infer()
GreedyGremlin(const GM &gm, Parameter para=Parameter())
constructor
GM GraphicalModelType
graphical model type
virtual InferenceTermination marginal(const size_t, IndependentFactorType &out) const
output a solution for a marginal for a specific variable
#define OPENGM_ASSERT(expression)
visitors::TimingVisitor< GreedyGremlin< GM, ACC > > TimingVisitorType
visitors::VerboseVisitor< GreedyGremlin< GM, ACC > > VerboseVisitorType
visitor
GraphicalModelType::IndexType IndexType
GraphicalModelType::ValueType ValueType
virtual InferenceTermination factorMarginal(const size_t, IndependentFactorType &out) const
output a solution for a marginal for all variables connected to a factor
Inference algorithm interface.
virtual InferenceTermination args(std::vector< std::vector< LabelType > > &v) const
args
ACC AccumulationType
accumulation type
virtual void reset()
reset
virtual InferenceTermination arg(std::vector< LabelType > &v, const size_t=1) const
output a solution
const GraphicalModelType & graphicalModel() const
virtual std::string name() const
GraphicalModelType::LabelType LabelType
static const size_t ContinueInf
visitors::EmptyVisitor< GreedyGremlin< GM, ACC > > EmptyVisitorType
GraphicalModelType::IndependentFactorType IndependentFactorType