Undid JunctionTree modification to handle multiple components, since it was buggy
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 12 Apr 2010 20:30:32 +0000 (22:30 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 12 Apr 2010 20:30:32 +0000 (22:30 +0200)
Makefile.LINUX
include/dai/jtree.h
src/jtree.cpp

index ec455a4..e5bf70c 100644 (file)
@@ -48,8 +48,8 @@ CCINC=-Iinclude
 # Standard libraries to include
 LIBS=-ldai
 # For linking with BOOST libraries
-BOOSTLIBS_PO=-lboost_program_options
-BOOSTLIBS_UTF=-lboost_unit_test_framework
+BOOSTLIBS_PO=-lboost_program_options-mt
+BOOSTLIBS_UTF=-lboost_unit_test_framework-mt
 # Additional library search paths for linker
 CCLIB=-Llib
 
index 74bce1c..3c6d926 100644 (file)
@@ -110,9 +110,10 @@ class JTree : public DAIAlgRG {
         JTree() : DAIAlgRG(), _mes(), _logZ(), RTree(), Qa(), Qb(), props() {}
 
         /// Construct from FactorGraph \a fg and PropertySet \a opts
-        /** \param fg factor graph
+        /** \param fg factor graph (which has to be connected);
          ** \param opts Parameters @see Properties
          *  \param automatic if \c true, construct the junction tree automatically, using the heuristic in opts['heuristic'].
+         *  \throw FACTORGRAPH_NOT_CONNECTED if \a fg is not connected
          */
         JTree( const FactorGraph &fg, const PropertySet &opts, bool automatic=true );
     //@}
index ed855f6..20c021f 100644 (file)
@@ -66,6 +66,9 @@ string JTree::printProperties() const {
 JTree::JTree( const FactorGraph &fg, const PropertySet &opts, bool automatic ) : DAIAlgRG(), _mes(), _logZ(), RTree(), Qa(), Qb(), props() {
     setProperties( opts );
 
+    if( !fg.isConnected() )
+        DAI_THROW(FACTORGRAPH_NOT_CONNECTED);
+
     if( automatic ) {
         // Create ClusterGraph which contains factors as clusters
         vector<VarSet> cl;
@@ -117,15 +120,12 @@ void JTree::construct( const FactorGraph &fg, const std::vector<VarSet> &cl, boo
     // Construct a weighted graph (each edge is weighted with the cardinality
     // of the intersection of the nodes, where the nodes are the elements of cl).
     WeightedGraph<int> JuncGraph;
-    for( size_t i = 0; i < cl.size(); i++ ) {
-        if( i )
-            JuncGraph[UEdge(i,0)] = 0; // for clusters that consist of a single variable
+    for( size_t i = 0; i < cl.size(); i++ )
         for( size_t j = i+1; j < cl.size(); j++ ) {
             size_t w = (cl[i] & cl[j]).size();
             if( w )
                 JuncGraph[UEdge(i,j)] = w;
         }
-    }
 
     // Construct maximal spanning tree using Prim's algorithm
     RTree = MaxSpanningTree( JuncGraph, true );