Wrote daialg.h/cpp unit test
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Fri, 9 Apr 2010 09:42:17 +0000 (11:42 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Fri, 9 Apr 2010 09:42:17 +0000 (11:42 +0200)
ChangeLog
Makefile
include/dai/exactinf.h
tests/unit/daialg.cpp [new file with mode: 0644]

index 0a16f97..1fcff06 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -144,7 +144,7 @@ git HEAD
 * Compressed Makefile
 * Added unit tests for var, smallset, varset, graph, bipgraph,
   weightedgraph, enum, util, exceptions, properties, index, prob, 
-  factor, factorgraph, clustergraph, regiongraph
+  factor, factorgraph, clustergraph, regiongraph, daialg
 * Added unit testing framework
 * Added initialization of TRWBP weights by sampling spanning trees
 * Cleaned up MR code:
index da8033e..56ba4bc 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -124,7 +124,7 @@ examples : examples/example$(EE) examples/example_bipgraph$(EE) examples/example
 
 matlabs : matlab/dai$(ME) matlab/dai_readfg$(ME) matlab/dai_writefg$(ME) matlab/dai_potstrength$(ME)
 
-unittests : tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE) tests/unit/graph$(EE) tests/unit/bipgraph$(EE) tests/unit/weightedgraph$(EE) tests/unit/enum$(EE) tests/unit/enum$(EE) tests/unit/util$(EE) tests/unit/exceptions$(EE) tests/unit/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE) tests/unit/factor$(EE) tests/unit/factorgraph$(EE) tests/unit/clustergraph$(EE) tests/unit/regiongraph$(EE)
+unittests : tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE) tests/unit/graph$(EE) tests/unit/bipgraph$(EE) tests/unit/weightedgraph$(EE) tests/unit/enum$(EE) tests/unit/enum$(EE) tests/unit/util$(EE) tests/unit/exceptions$(EE) tests/unit/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE) tests/unit/factor$(EE) tests/unit/factorgraph$(EE) tests/unit/clustergraph$(EE) tests/unit/regiongraph$(EE) tests/unit/daialg$(EE)
        echo Running unit tests...
        tests/unit/var$(EE)
        tests/unit/smallset$(EE)
@@ -142,6 +142,7 @@ unittests : tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE)
        tests/unit/factorgraph$(EE)
        tests/unit/clustergraph$(EE)
        tests/unit/regiongraph$(EE)
+       tests/unit/daialg$(EE)
 
 tests : tests/testdai$(EE) tests/testem/testem$(EE) tests/testbbp$(EE) $(unittests)
 
@@ -289,7 +290,7 @@ clean :
        -rm matlab/*$(ME)
        -rm examples/example$(EE) examples/example_bipgraph$(EE) examples/example_varset$(EE) examples/example_permute$(EE) examples/example_sprinkler$(EE) examples/example_sprinkler_gibbs$(EE) examples/example_sprinkler_em$(EE)
        -rm tests/testdai$(EE) tests/testem/testem$(EE) tests/testbbp$(EE)
-       -rm tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE) tests/unit/graph$(EE) tests/unit/bipgraph$(EE) tests/unit/weightedgraph$(EE) tests/unit/enum$(EE) tests/unit/util$(EE) tests/unit/exceptions$(EE) tests/unit/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE) tests/unit/factor$(EE) tests/unit/factorgraph$(EE) tests/unit/clustergraph$(EE) tests/unit/regiongraph$(EE)
+       -rm tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE) tests/unit/graph$(EE) tests/unit/bipgraph$(EE) tests/unit/weightedgraph$(EE) tests/unit/enum$(EE) tests/unit/util$(EE) tests/unit/exceptions$(EE) tests/unit/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE) tests/unit/factor$(EE) tests/unit/factorgraph$(EE) tests/unit/clustergraph$(EE) tests/unit/regiongraph$(EE) tests/unit/daialg$(EE)
        -rm factorgraph_test.fg
        -rm utils/fg2dot$(EE) utils/createfg$(EE) utils/fginfo$(EE)
        -rm -R doc
@@ -336,6 +337,7 @@ clean :
        -del tests\unit\factorgraph$(EE)
        -del tests\unit\clustergraph$(EE)
        -del tests\unit\regiongraph$(EE)
+       -del tests\unit\daialg$(EE)
        -del factorgraph_test.fg
        -del $(LIB)\libdai$(LE)
        -rmdir lib
index 233deef..86de319 100644 (file)
@@ -78,7 +78,7 @@ class ExactInf : public DAIAlgFG {
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const { return _logZ; }
         virtual void init();
-        virtual void init( const VarSet &/*ns*/ ) { DAI_THROW(NOT_IMPLEMENTED); }
+        virtual void init( const VarSet &/*ns*/ ) {}
         virtual Real run();
         virtual Real maxDiff() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
         virtual size_t Iterations() const { DAI_THROW(NOT_IMPLEMENTED); return 0; }
diff --git a/tests/unit/daialg.cpp b/tests/unit/daialg.cpp
new file mode 100644 (file)
index 0000000..1b060a8
--- /dev/null
@@ -0,0 +1,114 @@
+/*  This file is part of libDAI - http://www.libdai.org/
+ *
+ *  libDAI is licensed under the terms of the GNU General Public License version
+ *  2, or (at your option) any later version. libDAI is distributed without any
+ *  warranty. See the file COPYING for more details.
+ *
+ *  Copyright (C) 2010  Joris Mooij      [joris dot mooij at libdai dot org]
+ */
+
+
+#define BOOST_TEST_DYN_LINK
+
+
+#include <dai/daialg.h>
+#include <dai/alldai.h>
+#include <strstream>
+
+
+using namespace dai;
+
+
+const double tol = 1e-8;
+
+
+#define BOOST_TEST_MODULE DAIAlgTest
+
+
+#include <boost/test/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE( calcMarginalTest ) {
+    Var v0( 0, 2 );
+    Var v1( 1, 2 );
+    Var v2( 2, 2 );
+    Var v3( 3, 2 );
+    VarSet v01( v0, v1 );
+    VarSet v02( v0, v2 );
+    VarSet v03( v0, v3 );
+    VarSet v12( v1, v2 );
+    VarSet v13( v1, v3 );
+    VarSet v23( v2, v3 );
+    std::vector<Factor> facs;
+    facs.push_back( createFactorIsing( v0, v1, 1.0 ) );
+    facs.push_back( createFactorIsing( v1, v2, 1.0 ) );
+    facs.push_back( createFactorIsing( v2, v3, 1.0 ) );
+    facs.push_back( createFactorIsing( v3, v0, 1.0 ) );
+    facs.push_back( createFactorIsing( v0, -1.0 ) );
+    facs.push_back( createFactorIsing( v1, -1.0 ) );
+    facs.push_back( createFactorIsing( v2, -1.0 ) );
+    facs.push_back( createFactorIsing( v3, 1.0 ) );
+    Factor joint = facs[0] * facs[1] * facs[2] * facs[3] * facs[4] * facs[5] * facs[6] * facs[7];
+    FactorGraph fg( facs );
+    ExactInf ei( fg, PropertySet()("verbose",(size_t)0) );
+    VarSet vs;
+
+    vs = v0;        BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v1;        BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v2;        BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v3;        BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v01;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v02;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v03;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v12;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v13;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v23;       BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v01 | v2;  BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v01 | v3;  BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v02 | v3;  BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v12 | v3;  BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+    vs = v01 | v23; BOOST_CHECK( dist( calcMarginal( ei, vs, false ), joint.marginal( vs ), DISTTV ) < tol );
+}
+
+
+BOOST_AUTO_TEST_CASE( calcPairBeliefsTest ) {
+    Var v0( 0, 2 );
+    Var v1( 1, 2 );
+    Var v2( 2, 2 );
+    Var v3( 3, 2 );
+    VarSet v01( v0, v1 );
+    VarSet v02( v0, v2 );
+    VarSet v03( v0, v3 );
+    VarSet v12( v1, v2 );
+    VarSet v13( v1, v3 );
+    VarSet v23( v2, v3 );
+    std::vector<Factor> facs;
+    facs.push_back( createFactorIsing( v0, v1, 1.0 ) );
+    facs.push_back( createFactorIsing( v1, v2, 1.0 ) );
+    facs.push_back( createFactorIsing( v2, v3, 1.0 ) );
+    facs.push_back( createFactorIsing( v3, v0, 1.0 ) );
+    facs.push_back( createFactorIsing( v0, -1.0 ) );
+    facs.push_back( createFactorIsing( v1, -1.0 ) );
+    facs.push_back( createFactorIsing( v2, -1.0 ) );
+    facs.push_back( createFactorIsing( v3, 1.0 ) );
+    Factor joint = facs[0] * facs[1] * facs[2] * facs[3] * facs[4] * facs[5] * facs[6] * facs[7];
+    FactorGraph fg( facs );
+    ExactInf ei( fg, PropertySet()("verbose",(size_t)0) );
+    VarSet vs;
+
+    std::vector<Factor> pb = calcPairBeliefs( ei, v01 | v23, false, false );
+    BOOST_CHECK( dist( pb[0], joint.marginal( v01 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[1], joint.marginal( v02 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[2], joint.marginal( v03 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[3], joint.marginal( v12 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[4], joint.marginal( v13 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[5], joint.marginal( v23 ), DISTTV ) < tol );
+
+    pb = calcPairBeliefs( ei, v01 | v23, false, true );
+    BOOST_CHECK( dist( pb[0], joint.marginal( v01 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[1], joint.marginal( v02 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[2], joint.marginal( v03 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[3], joint.marginal( v12 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[4], joint.marginal( v13 ), DISTTV ) < tol );
+    BOOST_CHECK( dist( pb[5], joint.marginal( v23 ), DISTTV ) < tol );
+}