The sum-product algorithm.
#include <gosumproduct.h>
#include <gomaxsum.h>
#include <goautoptr.h>
#include <gofunctor.h>
#include <goplot.h>
{
public:
{
this->setFunctor (&*this->ff);
};
{
if (X[1] - X[0] == 2)
return 1.0f;
else
return 0.0f;
};
};
int main ()
{
vars[0]->value = 0;
vars[1]->value = 1;
vars[2]->value = 2;
factors[0]->value = 3;
fg.
connect (vars[0], 0, vars[1], 0);
fg.
connect (vars[1], 1, vars[2], 0);
fg.
connect (factors[0], 0, vars[0], 1);
printf ("\nSecond test graph:\n");
{
{
vars[i]->value = i + 1;
}
fg.
connect (vars[0], 0, vars[1], 0);
fg.
connect (vars[1], 1, vars[8], 0);
fg.
connect (vars[1], 2, vars[2], 0);
fg.
connect (vars[2], 1, vars[3], 0);
fg.
connect (vars[2], 2, vars[4], 0);
fg.
connect (vars[2], 3, vars[5], 0);
fg.
connect (vars[4], 1, vars[6], 0);
fg.
connect (vars[6], 1, vars[7], 0);
fg.
connect (vars[8], 1, vars[9], 0);
fg.
connect (vars[9], 1, vars[10], 0);
sp.
run (fg.myVariables[0], fg);
}
#if 1
{
fg.
connect (vars[0], 0, factors[0], 0);
fg.
connect (vars[0], 1, factors[1], 0);
fg.
connect (vars[1], 0, factors[0], 1);
fg.
connect (vars[2], 0, factors[1], 1);
fg.
connect (vars[2], 1, factors[2], 0);
fg.
connect (vars[3], 0, factors[2], 1);
FILE* f = fopen ("graph2.dot","w");
if (!f)
{
printf ("Could not open graph2.dot for writing.\n");
exit(0);
}
goFGGraphWriteDOT<goSize_t,float> (fg.myVariables[0], f);
fclose (f);
sp.
run (fg.myVariables[0], fg);
{
sp.
marginal (fg.myVariables[i], sp.
getValueCount(), marginal);
x.
fillRange (0.0f, 1.0f, (
float)(marginal.
getSize()));
goString s =
"Marginal var["; s += (int)i; s +=
"]";
}
printf ("Normal operation:\n");
ms.
run (fg.myVariables[0], fg);
printf ("Values: ");
{
printf ("%d ", fg.myVariables[i]->value);
}
printf ("\n");
printf ("Flooding:\n");
ms.
flooding (fg.myVariables[0], fg, 50);
printf ("Values: ");
{
printf ("%d ", fg.myVariables[i]->value);
}
printf ("\n");
}
#endif
{
fg.
connect (fg.myVariables[0], 0, fg.myFactors[0], 0);
fg.
connect (fg.myVariables[0], 1, fg.myFactors[1], 0);
fg.
connect (fg.myVariables[1], 0, fg.myFactors[1], 1);
fg.
connect (fg.myVariables[2], 0, fg.myFactors[1], 2);
fg.
connect (fg.myVariables[2], 1, fg.myFactors[2], 0);
fg.
connect (fg.myVariables[0], 2, fg.myFactors[2], 1);
FILE* f = fopen ("fg.dot","w");
if (!f)
{
printf ("Could not open fg.dot for writing.\n");
exit(0);
}
goFGGraphWriteDOT<goSize_t,float> (fg.myVariables[0], f);
fclose (f);
}
{
{
}
{
fg.
connect (fg.myFactors[i], 0, fg.myVariables[i], 0);
fg.
connect (fg.myFactors[i], 1, fg.myVariables[(i+1) % 5], 1);
}
{
fg.
connect (fg.myFactors[i], 0, fg.myVariables[i-5], 2);
}
FILE* f = fopen ("fg2.dot","w");
if (!f)
{
printf ("Could not open fg2.dot for writing.\n");
exit(0);
}
goFGGraphWriteDOT<goSize_t,float> (fg.myVariables[0], f);
fclose (f);
}
exit(1);
}