example.cpp
This example illustrates how to read a factor graph from a file and how to run several inference algorithms (junction tree, loopy belief propagation, and the max-product algorithm) on it.
#include <iostream>
#include <map>
#include <dai/alldai.h>
using namespace dai;
using namespace std;
int main( int argc, char *argv[] ) {
if ( argc != 2 ) {
cout << "Usage: " << argv[0] << " <filename.fg>" << endl << endl;
cout << "Reads factor graph <filename.fg> and runs" << endl;
cout << "Belief Propagation and JunctionTree on it." << endl << endl;
return 1;
} else {
FactorGraph fg;
fg.ReadFromFile(argv[1]);
size_t maxiter = 10000;
Real tol = 1e-9;
size_t verb = 1;
PropertySet opts;
opts.set("maxiter",maxiter);
opts.set("tol",tol);
opts.set("verbose",verb);
JTree jt( fg, opts("updates",string("HUGIN")) );
jt.init();
jt.run();
JTree jtmap( fg, opts("updates",string("HUGIN"))("inference",string("MAXPROD")) );
jtmap.init();
jtmap.run();
vector<size_t> jtmapstate = jtmap.findMaximum();
BP bp(fg, opts("updates",string("SEQRND"))("logdomain",false));
bp.init();
bp.run();
BP mp(fg, opts("updates",string("SEQRND"))("logdomain",false)("inference",string("MAXPROD"))("damping",string("0.1")));
mp.init();
mp.run();
vector<size_t> mpstate = mp.findMaximum();
DecMAP decmap(fg, opts("reinit",true)("ianame",string("BP"))("iaopts",string("[damping=0.1,inference=MAXPROD,logdomain=0,maxiter=1000,tol=1e-9,updates=SEQRND,verbose=1]")) );
decmap.init();
decmap.run();
vector<size_t> decmapstate = decmap.findMaximum();
cout << "Exact variable marginals:" << endl;
for( size_t i = 0; i < fg.nrVars(); i++ )
cout << jt.belief(fg.var(i)) << endl;
cout << "Approximate (loopy belief propagation) variable marginals:" << endl;
for( size_t i = 0; i < fg.nrVars(); i++ )
cout << bp.belief(fg.var(i)) << endl;
cout << "Exact factor marginals:" << endl;
for( size_t I = 0; I < fg.nrFactors(); I++ )
cout << jt.belief(fg.factor(I).vars()) << endl;
cout << "Approximate (loopy belief propagation) factor marginals:" << endl;
for( size_t I = 0; I < fg.nrFactors(); I++ )
cout << bp.belief(fg.factor(I).vars()) << endl;
cout << "Exact log partition sum: " << jt.logZ() << endl;
cout << "Approximate (loopy belief propagation) log partition sum: " << bp.logZ() << endl;
cout << "Exact MAP variable marginals:" << endl;
for( size_t i = 0; i < fg.nrVars(); i++ )
cout << jtmap.belief(fg.var(i)) << endl;
cout << "Approximate (max-product) MAP variable marginals:" << endl;
for( size_t i = 0; i < fg.nrVars(); i++ )
cout << mp.belief(fg.var(i)) << endl;
cout << "Exact MAP factor marginals:" << endl;
for( size_t I = 0; I < fg.nrFactors(); I++ )
cout << jtmap.belief(fg.factor(I).vars()) << " == " << jtmap.beliefF(I) << endl;
cout << "Approximate (max-product) MAP factor marginals:" << endl;
for( size_t I = 0; I < fg.nrFactors(); I++ )
cout << mp.belief(fg.factor(I).vars()) << " == " << mp.beliefF(I) << endl;
cout << "Exact MAP state (log score = " << fg.logScore( jtmapstate ) << "):" << endl;
for( size_t i = 0; i < jtmapstate.size(); i++ )
cout << fg.var(i) << ": " << jtmapstate[i] << endl;
cout << "Approximate (max-product) MAP state (log score = " << fg.logScore( mpstate ) << "):" << endl;
for( size_t i = 0; i < mpstate.size(); i++ )
cout << fg.var(i) << ": " << mpstate[i] << endl;
cout << "Approximate DecMAP state (log score = " << fg.logScore( decmapstate ) << "):" << endl;
for( size_t i = 0; i < decmapstate.size(); i++ )
cout << fg.var(i) << ": " << decmapstate[i] << endl;
}
return 0;
}