Added TProb<T>::operator==( const TProb<T> & ) and added some unit tests for prob...
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 29 Mar 2010 09:03:56 +0000 (11:03 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 29 Mar 2010 09:03:56 +0000 (11:03 +0200)
20 files changed:
ChangeLog
Makefile
include/dai/alldai.h
include/dai/bp.h
include/dai/cbp.h
include/dai/exactinf.h
include/dai/fbp.h
include/dai/gibbs.h
include/dai/hak.h
include/dai/index.h
include/dai/lc.h
include/dai/mf.h
include/dai/mr.h
include/dai/prob.h
include/dai/treeep.h
include/dai/trwbp.h
include/dai/weightedgraph.h
src/cbp.cpp
src/daialg.cpp
tests/unit/prob.cpp [new file with mode: 0644]

index ad1e072..1ef55ba 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 git HEAD
 --------
 
+* Improved prob.h/cpp:
+  - Added operator==( const TProb<T> &q )
 * Improved index.h/cpp:
   - Added multifor::reset()
 * Improved properties.h/cpp:
@@ -50,7 +52,7 @@ git HEAD
 * Removed RandomDRegularGraph()
 * Compressed Makefile
 * Added unit tests for var, smallset, varset, graph, bipgraph,
-  weightedgraph, enum, util, properties
+  weightedgraph, enum, util, properties, index, prob
 * Added unit testing framework
 * Added initialization of TRWBP weights by sampling spanning trees
 * Cleaned up MR code:
@@ -742,4 +744,4 @@ description in the help).
 
 0.1.0   (2006-02-28)
 --------------------
-First version worthy a version number.
+First version worthy of a version number.
index b487774..7fc5f8c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -122,7 +122,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/properties$(EE) tests/unit/index$(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/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE)
        echo Running unit tests...
        tests/unit/var$(EE)
        tests/unit/smallset$(EE)
@@ -134,6 +134,7 @@ unittests : tests/unit/var$(EE) tests/unit/smallset$(EE) tests/unit/varset$(EE)
        tests/unit/util$(EE)
        tests/unit/properties$(EE)
        tests/unit/index$(EE)
+       tests/unit/prob$(EE)
 
 tests : tests/testdai$(EE) tests/testem/testem$(EE) tests/testbbp$(EE) $(unittests)
 
@@ -215,6 +216,8 @@ tests/unit/properties$(EE) : tests/unit/properties.cpp $(HEADERS) $(LIB)/libdai$
        $(CC) $(CCO)$@ $< $(LIBS) $(BOOSTLIBS_UTF)
 tests/unit/index$(EE) : tests/unit/index.cpp $(HEADERS) $(LIB)/libdai$(LE)
        $(CC) $(CCO)$@ $< $(LIBS) $(BOOSTLIBS_UTF)
+tests/unit/prob$(EE) : tests/unit/prob.cpp $(HEADERS) $(LIB)/libdai$(LE)
+       $(CC) $(CCO)$@ $< $(LIBS) $(BOOSTLIBS_UTF)
 
 
 # TESTS
@@ -321,7 +324,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/properties$(EE) tests/unit/index$(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/properties$(EE) tests/unit/index$(EE) tests/unit/prob$(EE)
        -rm utils/fg2dot$(EE) utils/createfg$(EE) utils/fginfo$(EE)
        -rm -R doc
        -rm -R lib
@@ -358,6 +361,7 @@ clean :
        -del tests\unit\util$(EE)
        -del tests\unit\properties$(EE)
        -del tests\unit\index$(EE)
+       -del tests\unit\prob$(EE)
        -del $(LIB)\libdai$(LE)
        -rmdir lib
 endif
index 312cf63..45b9bb5 100644 (file)
@@ -89,7 +89,9 @@ InfAlg *newInfAlgFromString( const std::string &nameOpts, const FactorGraph &fg
 
 
 /// Constructs a new inference algorithm.
-/** \param aliases Maps names to strings in the format "name[key1=val1,key2=val2,...,keyn=valn]"; if not empty, alias substitution
+/** \param nameOpts The name and options of the inference algorithm (should be in the format "name[key1=val1,key2=val2,...,keyn=valn]").
+ *  \param fg The FactorGraph that the algorithm should be applied to.
+ *  \param aliases Maps names to strings in the format "name[key1=val1,key2=val2,...,keyn=valn]"; if not empty, alias substitution
  *  will be performed when parsing \a nameOpts by invoking parseNameProperties(const std::string &,const std::map<std::string,std::string> &)
  *  \see newInfAlgFromString(const std::string &, const FactorGraph &)
  */
index 7750443..ec56dec 100644 (file)
@@ -142,7 +142,8 @@ class BP : public DAIAlgFG {
         BP() : DAIAlgFG(), _edges(), _edge2lut(), _lut(), _maxdiff(0.0), _iters(0U), _sentMessages(), props(), recordSentMessages(false) {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         BP( const FactorGraph & fg, const PropertySet &opts ) : DAIAlgFG(fg), _edges(), _maxdiff(0.0), _iters(0U), _sentMessages(), props(), recordSentMessages(false) {
             setProperties( opts );
index 57f9281..a7de51c 100644 (file)
@@ -61,7 +61,8 @@ class CBP : public DAIAlgFG {
 
     public:
         /// Construct CBP object from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         CBP( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg) {
             props.set( opts );
index 58e51dd..233deef 100644 (file)
@@ -58,7 +58,8 @@ class ExactInf : public DAIAlgFG {
         ExactInf() : DAIAlgFG(), props(), _beliefsV(), _beliefsF(), _logZ(0) {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         ExactInf( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), props(), _beliefsV(), _beliefsF(), _logZ() {
             setProperties( opts );
index b7cb940..d6cbd63 100644 (file)
@@ -71,7 +71,8 @@ class FBP : public BP {
         FBP() : BP(), _weight() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see BP::Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see BP::Properties
          */
         FBP( const FactorGraph &fg, const PropertySet &opts ) : BP(fg, opts), _weight() {
             setProperties( opts );
index 0135397..1dafa11 100644 (file)
@@ -63,7 +63,8 @@ class Gibbs : public DAIAlgFG {
         Gibbs() : DAIAlgFG(), _sample_count(0), _var_counts(), _factor_counts(), _state() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         Gibbs( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _sample_count(0), _var_counts(), _factor_counts(), _state() {
             setProperties( opts );
index 03ff0e1..bfb01b8 100644 (file)
@@ -94,7 +94,8 @@ class HAK : public DAIAlgRG {
         HAK() : DAIAlgRG(), _Qa(), _Qb(), _muab(), _muba(), _maxdiff(0.0), _iters(0U), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         HAK( const FactorGraph &fg, const PropertySet &opts );
 
index a9b3120..12250fd 100644 (file)
@@ -313,7 +313,7 @@ class multifor {
  *  \note The same functionality could be achieved by simply iterating over the linear state and using dai::calcState(),
  *  but the State class offers a more efficient implementation.
  *
- *  \note A State is very similar to a \link multifor \endlink, but tailored for Var 's and VarSet 's.
+ *  \note A State is very similar to a dai::multifor, but tailored for Var 's and VarSet 's.
  *
  *  \see dai::calcLinearState(), dai::calcState()
  *
index 9c97d0b..180df48 100644 (file)
@@ -99,7 +99,8 @@ class LC : public DAIAlgFG {
         LC() : DAIAlgFG(), _pancakes(), _cavitydists(), _phis(), _beliefs(), _maxdiff(), _iters(), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         LC( const FactorGraph &fg, const PropertySet &opts );
 
index 02208df..596cfd6 100644 (file)
@@ -68,7 +68,8 @@ class MF : public DAIAlgFG {
         MF() : DAIAlgFG(), _beliefs(), _maxdiff(0.0), _iters(0U), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          */
         MF( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), _beliefs(), _maxdiff(0.0), _iters(0U), props() {
             setProperties( opts );
index dff91d1..1d8a1be 100644 (file)
@@ -107,7 +107,8 @@ class MR : public DAIAlgFG {
         MR() : DAIAlgFG(), supported(), G(), tJ(), theta(), M(), cors(), Mag(), _maxdiff(), _iters(), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          *  \note This implementation only deals with binary variables and pairwise interactions.
          *  \throw NOT_IMPLEMENTED if \a fg has factors depending on three or more variables or has variables with more than two possible states.
          */
index 1627299..df133ad 100644 (file)
@@ -374,10 +374,17 @@ template <typename T> class TProb {
         /// Lexicographical comparison
         /** \pre <tt>this->size() == q.size()</tt>
          */
-        bool operator<= (const TProb<T> & q) const {
+        bool operator<=( const TProb<T>& q ) const {
             DAI_DEBASSERT( size() == q.size() );
             return lexicographical_compare( begin(), end(), q.begin(), q.end() );
         }
+
+        /// Comparison
+        bool operator==( const TProb<T>& q ) const {
+            if( size() != q.size() )
+                return false;
+            return p() == q.p();
+        }
     //@}
 
     /// \name Unary transformations
index 2851da9..60470fe 100644 (file)
@@ -173,7 +173,8 @@ class TreeEP : public JTree {
         }
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param opts Parameters @see Properties
+        /** \param fg Factor graph.
+         *  \param opts Parameters @see Properties
          *  \note The factor graph has to be connected.
          *  \throw FACTORGRAPH_NOT_CONNECTED if \a fg is not connected
          */
index 9f85815..d36d854 100644 (file)
@@ -77,6 +77,7 @@ class TRWBP : public BP {
         /// Construct from FactorGraph \a fg and PropertySet \a opts.
         /** There is an additional property "nrtrees" which allows to specify the
          *  number of random spanning trees used to set the scale parameters.
+         *  \param fg Factor graph.
          *  \param opts Parameters @see BP::Properties. 
          */
         TRWBP( const FactorGraph &fg, const PropertySet &opts ) : BP(fg, opts), _weight() {
index af6384b..78362ea 100644 (file)
@@ -146,7 +146,8 @@ class RootedTree : public std::vector<DEdge> {
 
 
 /// Constructs a minimum spanning tree from the (non-negatively) weighted graph \a G.
-/** \param usePrim If true, use Prim's algorithm (complexity O(E log(V))), otherwise, use Kruskal's algorithm (complexity O(E log(E)))
+/** \param G Weighted graph that should have non-negative weights.
+ *  \param usePrim If true, use Prim's algorithm (complexity O(E log(V))), otherwise, use Kruskal's algorithm (complexity O(E log(E))).
  *  \note Uses implementation from Boost Graph Library.
  *  \note The vertices of \a G must be in the range [0,N) where N is the number of vertices of \a G.
  */
@@ -210,7 +211,8 @@ template<typename T> RootedTree MinSpanningTree( const WeightedGraph<T> &G, bool
 
 
 /// Constructs a minimum spanning tree from the (non-negatively) weighted graph \a G.
-/** \param usePrim If true, use Prim's algorithm (complexity O(E log(V))), otherwise, use Kruskal's algorithm (complexity O(E log(E)))
+/** \param G Weighted graph that should have non-negative weights.
+ *  \param usePrim If true, use Prim's algorithm (complexity O(E log(V))), otherwise, use Kruskal's algorithm (complexity O(E log(E))).
  *  \note Uses implementation from Boost Graph Library.
  *  \note The vertices of \a G must be in the range [0,N) where N is the number of vertices of \a G.
  */
index 751938e..ef208ac 100644 (file)
@@ -451,7 +451,7 @@ void CBP::printDebugInfo() {
 }
 
 
-pair<size_t, size_t> BBPFindClampVar( const InfAlg &in_bp, bool clampingVar, const PropertySet &bbp_props, const BBPCostFunction &cfn, Real *maxVarOut ) {
+std::pair<size_t, size_t> BBPFindClampVar( const InfAlg &in_bp, bool clampingVar, const PropertySet &bbp_props, const BBPCostFunction &cfn, Real *maxVarOut ) {
     BBP bbp( &in_bp, bbp_props );
     bbp.initCostFnAdj( cfn, NULL );
     bbp.run();
index a04bcc3..02993c6 100644 (file)
@@ -210,20 +210,4 @@ vector<Factor> calcPairBeliefs( const InfAlg & obj, const VarSet& vs, bool reIni
 }
 
 
-std::vector<Factor> calcPairBeliefsNew( const InfAlg& obj, const VarSet& vs, bool reInit ) { 
-    return calcPairBeliefs( obj, vs, reInit, true );
-}
-
-
-Factor calcMarginal2ndO( const InfAlg & obj, const VarSet& vs, bool reInit ) {
-    vector<Factor> pairbeliefs = calcPairBeliefs( obj, vs, reInit );
-
-    Factor Pvs (vs);
-    for( size_t ij = 0; ij < pairbeliefs.size(); ij++ )
-        Pvs *= pairbeliefs[ij];
-
-    return( Pvs.normalized() );
-}
-
-
 } // end of namespace dai
diff --git a/tests/unit/prob.cpp b/tests/unit/prob.cpp
new file mode 100644 (file)
index 0000000..00045ee
--- /dev/null
@@ -0,0 +1,142 @@
+/*  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/prob.h>
+#include <strstream>
+
+
+using namespace dai;
+
+
+#define BOOST_TEST_MODULE ProbTest
+
+
+#include <boost/test/unit_test.hpp>
+
+
+BOOST_AUTO_TEST_CASE( ConstructorsTest ) {
+    // check constructors
+    Prob x1;
+    BOOST_CHECK_EQUAL( x1.size(), 0 );
+    BOOST_CHECK( x1.p() == std::vector<Real>() );
+
+    Prob x2( 3 );
+    BOOST_CHECK_EQUAL( x2.size(), 3 );
+    BOOST_CHECK( x2.p() == std::vector<Real>( 3, 1.0 / 3.0 ) );
+    BOOST_CHECK_EQUAL( x2[0], 1.0 / 3.0 );
+    BOOST_CHECK_EQUAL( x2[1], 1.0 / 3.0 );
+    BOOST_CHECK_EQUAL( x2[2], 1.0 / 3.0 );
+
+    Prob x3( 4, 1.0 );
+    BOOST_CHECK_EQUAL( x3.size(), 4 );
+    BOOST_CHECK( x3.p() == std::vector<Real>( 4, 1.0 ) );
+    BOOST_CHECK_EQUAL( x3[0], 1.0 );
+    BOOST_CHECK_EQUAL( x3[1], 1.0 );
+    BOOST_CHECK_EQUAL( x3[2], 1.0 );
+    BOOST_CHECK_EQUAL( x3[3], 1.0 );
+    x3[0] = 0.5;
+    x3[1] = 1.0;
+    x3[2] = 2.0;
+    x3[3] = 4.0;
+
+    Prob x4( x3.begin(), x3.end() );
+    BOOST_CHECK_EQUAL( x4.size(), 4 );
+    BOOST_CHECK( x4.p() == x3.p() );
+    BOOST_CHECK_EQUAL( x4[0], 0.5 );
+    BOOST_CHECK_EQUAL( x4[1], 1.0 );
+    BOOST_CHECK_EQUAL( x4[2], 2.0 );
+    BOOST_CHECK_EQUAL( x4[3], 4.0 );
+
+    x3.p() = std::vector<Real>( 4, 2.5 );
+    Prob x5( x3.begin(), x3.end(), x3.size() );
+    BOOST_CHECK_EQUAL( x5.size(), 4 );
+    BOOST_CHECK( x5.p() == x3.p() );
+    BOOST_CHECK_EQUAL( x5[0], 2.5 );
+    BOOST_CHECK_EQUAL( x5[1], 2.5 );
+    BOOST_CHECK_EQUAL( x5[2], 2.5 );
+    BOOST_CHECK_EQUAL( x5[3], 2.5 );
+
+    std::vector<int> y( 3, 2 );
+    Prob x6( y );
+    BOOST_CHECK_EQUAL( x6.size(), 3 );
+    BOOST_CHECK( x6.p() == std::vector<Real>( 3, 2.0 ) );
+    BOOST_CHECK_EQUAL( x6[0], 2.0 );
+    BOOST_CHECK_EQUAL( x6[1], 2.0 );
+    BOOST_CHECK_EQUAL( x6[2], 2.0 );
+
+    Prob x7( x6 );
+    BOOST_CHECK( x7 == x6 );
+    
+    Prob x8 = x6;
+    BOOST_CHECK( x8 == x6 );
+}
+
+
+BOOST_AUTO_TEST_CASE( IteratorTest ) {
+    Prob x( 5, 0.0 );
+    size_t i;
+    for( i = 0; i < x.size(); i++ )
+        x[i] = i;
+
+    i = 0;
+    for( Prob::const_iterator cit = x.begin(); cit != x.end(); cit++, i++ )
+        BOOST_CHECK_EQUAL( *cit, i );
+    
+    i = 0;
+    for( Prob::iterator it = x.begin(); it != x.end(); it++, i++ )
+        *it = 4 - i;
+    
+    i = 0;
+    for( Prob::const_iterator it = x.begin(); it != x.end(); it++, i++ )
+        BOOST_CHECK_EQUAL( *it, 4 - i );
+
+    i = 0;
+    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != x.rend(); crit++, i++ )
+        BOOST_CHECK_EQUAL( *crit, i );
+
+    i = 0;
+    for( Prob::reverse_iterator rit = x.rbegin(); rit != x.rend(); rit++, i++ )
+        *rit = 2 * i;
+    
+    i = 0;
+    for( Prob::const_reverse_iterator crit = x.rbegin(); crit != x.rend(); crit++, i++ )
+        BOOST_CHECK_EQUAL( *crit, 2 * i );
+}
+
+
+BOOST_AUTO_TEST_CASE( QueriesTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( UnaryTransformationsTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( UnaryOperationsTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( ScalarOperationsTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( VectorTransformationsTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( VectorOperationsTest ) {
+}
+
+
+BOOST_AUTO_TEST_CASE( RelatedFunctionsTest ) {
+}