1 #ifndef OPENGM_LIBDAI_HXX
2 #define OPENGM_LIBDAI_HXX
25 #include <dai/alldai.h>
26 #include <dai/exceptions.h>
34 template<
class GM,
class ACC ,
class SOLVER>
38 typedef ACC AccumulationType;
39 typedef GM GraphicalModelType;
47 virtual const GraphicalModelType& graphicalModel_impl()
const;
48 virtual void reset_impl();
56 ::dai::FactorGraph * convert(
const GM &);
57 ::dai::FactorGraph * factorGraph_;
60 std::string stringAlgParam_;
61 size_t numberOfExtraFactors_;
64 template<
class GM,
class ACC ,
class SOLVER>
70 template<
class GM,
class ACC ,
class SOLVER>
74 const std::string & string_param
76 stringAlgParam_(string_param),
77 numberOfExtraFactors_(0) {
78 factorGraph_=convert(gm_);
79 ia_=dai::newInfAlgFromString(stringAlgParam_,*factorGraph_);
83 template<
class GM,
class ACC ,
class SOLVER>
89 template<
class GM,
class ACC ,
class SOLVER>
94 factorGraph_=convert(gm_);
95 ia_=dai::newInfAlgFromString(stringAlgParam_,*factorGraph_);
99 template<
class GM,
class ACC ,
class SOLVER>
106 catch(
const dai::Exception & e) {
107 std::stringstream ss;
108 ss<<
"libdai Error: "<<e.message(e.getCode())<<e.getMsg()<<
"\n"<<e.getDetailedMsg();
109 throw ::opengm::RuntimeError(ss.str());
120 template<
class GM,
class ACC ,
class SOLVER>
124 const size_t variableIndex,
125 IndependentFactorType & marginalFactor
130 ::dai::Factor mf=this->ia_->belief(this->factorGraph_->var(variableIndex));
131 OPENGM_ASSERT(mf.nrStates()==gm_.numberOfLabels(variableIndex));
132 const size_t varIndex[]={variableIndex};
133 marginalFactor.assign(gm_,varIndex,varIndex +1);
134 for(
size_t i=0;i<mf.nrStates();++i) {
135 marginalFactor(i)=mf.get(i);
136 if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value && opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
138 marginalFactor(i)=
static_cast<ValueType
>(-1.0*std::log(mf.get(i)));
140 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value && opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
142 marginalFactor(i)=
static_cast<ValueType
>(std::log(mf.get(i)));
144 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
146 marginalFactor(i)=
static_cast<ValueType
>(mf.get(i));
148 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
150 throw opengm::RuntimeError(
"zero marginal Values with OP=opengm::Multiplier with ACC=Minimizer are not supported in the opengm- libdai interface ");
153 marginalFactor(i)=
static_cast<ValueType
>(1.0/mf.get(i));
155 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Integrator>::value) {
156 marginalFactor(i)=
static_cast<ValueType
>(mf.get(i));
164 catch(
const dai::Exception & e) {
165 std::stringstream ss;
166 ss<<
"libdai Error: "<<e.message(e.getCode())<<
" "<<e.getMsg()<<
"\n"<<e.getDetailedMsg();
167 throw ::opengm::RuntimeError(ss.str());
170 std::cout <<
"ERROR: Stopp with exception!"<<std::endl;
174 template<
class GM,
class ACC ,
class SOLVER>
178 const size_t factorIndex,
179 IndependentFactorType & marginalFactor
183 OPENGM_ASSERT(factorIndex<this->factorGraph_->nrFactors()-numberOfExtraFactors_);
185 ::dai::VarSet varset;
186 for(
size_t v=0;v<gm_[factorIndex].numberOfVariables();++v) {
187 varset.insert( ::dai::Var(gm_[factorIndex].variableIndex(v), gm_[factorIndex].numberOfLabels(v)) );
189 ::dai::Factor mf=this->ia_->belief(varset);
190 marginalFactor.assign(gm_,gm_[factorIndex].variableIndicesBegin(),gm_[factorIndex].variableIndicesEnd());
192 for(
size_t i=0;i<mf.nrStates();++i) {
193 marginalFactor(i)=mf.get(i);
194 if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value && opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
196 marginalFactor(i)=
static_cast<ValueType
>(-1.0*std::log(mf.get(i)));
198 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value && opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
200 marginalFactor(i)=
static_cast<ValueType
>(std::log(mf.get(i)));
202 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
204 marginalFactor(i)=
static_cast<ValueType
>(mf.get(i));
206 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Integrator>::value) {
208 marginalFactor(i)=
static_cast<ValueType
>(mf.get(i));
210 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
212 throw opengm::RuntimeError(
"zero marginal Values with OP=opengm::Multiplier with ACC=Minimizer are not supported in the opengm- libdai interface ");
215 marginalFactor(i)=
static_cast<ValueType
>(1.0/mf.get(i));
217 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value && opengm::meta::Compare<ACC,opengm::Integrator>::value) {
218 marginalFactor(i)=
static_cast<ValueType
>(mf.get(i));
226 catch(
const dai::Exception & e) {
227 std::stringstream ss;
228 ss<<
"libdai Error: "<<e.message(e.getCode())<<
" "<<e.getMsg()<<
"\n"<<e.getDetailedMsg();
229 throw ::opengm::RuntimeError(ss.str());
232 std::cout <<
"ERROR: Stopp with exception!"<<std::endl;
237 template<
class GM,
class ACC ,
class SOLVER>
246 std::vector<size_t> states=ia_->findMaximum();
247 v.assign(states.begin(),states.end());
250 catch(
const dai::Exception & e) {
251 std::stringstream ss;
252 ss<<
"libdai Error: "<<e.message(e.getCode())<<
" "<<e.getMsg()<<
"\n"<<e.getDetailedMsg();
253 throw ::opengm::RuntimeError(ss.str());
261 template<
class GM,
class ACC ,
class SOLVER>
266 const size_t nrOfFactors=gm.numberOfFactors();
267 const size_t nrOfVariables=gm.numberOfVariables();
268 typedef typename GM::ValueType ValueType;
269 typedef double DaiValueType;
271 std::vector< ::dai::Factor > factors;
272 factors.reserve(nrOfFactors);
273 std::vector<dai::Var> vars(nrOfVariables);
274 for (
size_t i = 0; i < nrOfVariables; ++i) {
275 vars[i] = ::dai::Var(i, gm.numberOfLabels(i));
277 size_t maxFactorSize=0;
278 size_t maxNumberOfVariables=0;
279 for(
size_t f=0;f<nrOfFactors;++f) {
280 const size_t factorSize=gm[f].size();
281 const size_t numberOfVariables=gm[f].numberOfVariables();
282 if(factorSize>maxFactorSize) maxFactorSize=factorSize;
283 if(numberOfVariables>maxNumberOfVariables) maxNumberOfVariables=numberOfVariables;
286 DaiValueType * factorData=
new DaiValueType[maxFactorSize];
288 ::dai::Var * varSet = new ::dai::Var[maxNumberOfVariables];
289 for(
size_t f=0;f<nrOfFactors;++f) {
291 const size_t factorSize=gm[f].size();
292 const size_t numberOfVariables=gm[f].numberOfVariables();
293 if(numberOfVariables==0) {
294 std::cout<<
"\n\n WARNING \n\n";
297 for(
size_t v=0;v<numberOfVariables;++v) {
298 varSet[v]=vars[gm[f].variableIndex(v)];
300 dai::VarSet varset(varSet, varSet + numberOfVariables);
311 opengm::ShapeWalker<typename GM::FactorType::ShapeIteratorType> walker(gm[f].shapeBegin(),numberOfVariables);
312 for(
size_t i=0;i<factorSize;++i) {
314 if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value &&
315 opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
316 viewToFactorData(i)=std::exp(-1.0*
317 static_cast<DaiValueType>(gm[f](walker.coordinateTuple().begin())));
319 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Adder>::value &&
320 opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
321 viewToFactorData(i)=std::exp(1.0*
322 static_cast<DaiValueType>(gm[f](walker.coordinateTuple().begin())));
324 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value &&
325 opengm::meta::Compare<ACC,opengm::Maximizer>::value) {
327 static_cast<DaiValueType
>(gm[f](walker.coordinateTuple().begin()));
329 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value &&
330 opengm::meta::Compare<ACC,opengm::Integrator>::value) {
332 static_cast<DaiValueType
>(gm[f](walker.coordinateTuple().begin()));
334 else if( opengm::meta::Compare<typename GM::OperatorType,opengm::Multiplier>::value &&
335 opengm::meta::Compare<ACC,opengm::Minimizer>::value) {
336 if(gm[f](walker.coordinateTuple().begin())==static_cast<ValueType>(0.0)) {
337 throw opengm::RuntimeError(
"zero Values with OP=opengm::Multiplier with ACC=Minimizer are not supported in the opengm- libdai interface ");
339 viewToFactorData(i)=
static_cast<DaiValueType
>(1.0)/
340 static_cast<DaiValueType
>(gm[f](walker.coordinateTuple().begin()));
343 throw opengm::RuntimeError(
"only build in OpenGM Operators and Accumulators are supported in the opengm- libdai interface ");
348 dai::Factor factor(varset, factorData);
350 factors.push_back(factor);
352 dai::FactorGraph * factorGraph =
new dai::FactorGraph(factors.begin(), factors.end(), vars.begin(), vars.end());
353 delete [] factorData;
355 OPENGM_ASSERT(factorGraph->nrFactors()==gm.numberOfFactors());
356 OPENGM_ASSERT(factorGraph->nrVars()==gm.numberOfVariables());
365 #endif // OPENGM_LIBDAI_HXX
Array-Interface to an interval of memory.
#define OPENGM_ASSERT(expression)
#define OPENGM_GM_TYPE_TYPEDEFS