Fixed a bug (introduced in commit 64db6bc3...) and another one in Factors2mx
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 4 Aug 2010 15:10:07 +0000 (17:10 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 4 Aug 2010 15:10:07 +0000 (17:10 +0200)
ChangeLog
include/dai/clustergraph.h
include/dai/factor.h
include/dai/jtree.h
include/dai/varset.h
src/jtree.cpp
src/matlab/matlab.cpp
utils/fginfo.cpp

index b4429f9..5d3aea7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,11 @@
 git HEAD
 --------
+* [Matt Dunham] Fixed a bug in Factors2mx in src/matlab/matlab.cpp:
+  segfault if factors depending on 0 variables were passed to MatLab
 * Added source code for one of the winning solvers of the 
   UAI 2010 Approximate Inference Challenge 
 * Improved VarSet
-  - nrStates() now returns a double instead of a size_t
+  - nrStates() now returns a long double instead of a size_t
 * Improved ClusterGraph
   - added ClusterGraph(const FactorGraph& fg, bool onlyMaximal) constructor
   - findVar( const Var& n ) no longer throws an exception if the variable is
index 25fc185..06e80cc 100644 (file)
@@ -310,7 +310,7 @@ namespace dai {
                     varindices.insert( i );
 
                 // Do variable elimination
-                size_t totalStates = 0;
+                long double totalStates = 0.0;
                 while( !varindices.empty() ) {
                     size_t i = f( cl, varindices );
                     VarSet Di = cl.elimVar( i );
index abcc786..05f3e82 100644 (file)
@@ -73,10 +73,14 @@ class TFactor {
         TFactor( const Var &v ) : _vs(v), _p(v.states()) {}
 
         /// Constructs factor depending on variables in \a vars with uniform distribution
-        TFactor( const VarSet& vars ) : _vs(vars), _p(_vs.nrStates()) {}
+        TFactor( const VarSet& vars ) : _vs(vars), _p((size_t)_vs.nrStates()) {
+            DAI_ASSERT( _vs.nrStates() <= std::numeric_limits<std::size_t>::max() );
+        }
 
         /// Constructs factor depending on variables in \a vars with all values set to \a p
-        TFactor( const VarSet& vars, T p ) : _vs(vars), _p(_vs.nrStates(),p) {}
+        TFactor( const VarSet& vars, T p ) : _vs(vars), _p((size_t)_vs.nrStates(),p) {
+            DAI_ASSERT( _vs.nrStates() <= std::numeric_limits<std::size_t>::max() );
+        }
 
         /// Constructs factor depending on variables in \a vars, copying the values from a std::vector<>
         /** \tparam S Type of values of \a x
@@ -86,7 +90,7 @@ class TFactor {
         template<typename S>
         TFactor( const VarSet& vars, const std::vector<S> &x ) : _vs(vars), _p() {
             DAI_ASSERT( x.size() == vars.nrStates() );
-           _p = TProb<T>( x.begin(), x.begin() + _vs.nrStates(), _vs.nrStates() );
+            _p = TProb<T>( x.begin(), x.end(), x.size() );
         }
 
         /// Constructs factor depending on variables in \a vars, copying the values from an array
@@ -344,7 +348,8 @@ class TFactor {
             else {
                 TFactor<T> f(*this); // make a copy
                 _vs |= g._vs;
-                size_t N = _vs.nrStates();
+                DAI_ASSERT( _vs.nrStates() < std::numeric_limits<std::size_t>::max() );
+                size_t N = (size_t)_vs.nrStates();
 
                 IndexFor i_f( f._vs, _vs );
                 IndexFor i_g( g._vs, _vs );
@@ -402,7 +407,8 @@ class TFactor {
                 result._p = _p.pwBinaryTr( g._p, op );
             } else {
                 result._vs = _vs | g._vs;
-                size_t N = result._vs.nrStates();
+                DAI_ASSERT( result._vs.nrStates() < std::numeric_limits<std::size_t>::max() );
+                size_t N = (size_t)result._vs.nrStates();
 
                 IndexFor i_f( _vs, result.vars() );
                 IndexFor i_g( g._vs, result.vars() );
index 83ad338..96ef98a 100644 (file)
@@ -209,7 +209,7 @@ class JTree : public DAIAlgRG {
  *  \throws OUT_OF_MEMORY if the total number of states becomes larger than maxStates
  *  \return a pair (number of variables in largest clique, number of states in largest clique)
  */
-std::pair<size_t,double> boundTreewidth( const FactorGraph &fg, greedyVariableElimination::eliminationCostFunction fn, size_t maxStates=0 );
+std::pair<size_t,long double> boundTreewidth( const FactorGraph &fg, greedyVariableElimination::eliminationCostFunction fn, size_t maxStates=0 );
 
 
 } // end of namespace dai
index a58e572..f176064 100644 (file)
@@ -131,8 +131,8 @@ class VarSet : public SmallSet<Var> {
          *  number of possible values ("states") of variable \f$x_l\f$, the number of
          *  joint configurations of the variables in \f$\{x_l\}_{l\in L}\f$ is given by \f$\prod_{l\in L} S_l\f$.
          */
-        double nrStates() const {
-            double states = 1.0;
+        long double nrStates() const {
+            long double states = 1.0;
             for( VarSet::const_iterator n = begin(); n != end(); n++ )
                 states *= n->states();
             return states;
index 186a635..f0e8a7d 100644 (file)
@@ -404,9 +404,10 @@ Real JTree::logZ() const {
 
 size_t JTree::findEfficientTree( const VarSet& vs, RootedTree &Tree, size_t PreviousRoot ) const {
     // find new root clique (the one with maximal statespace overlap with vs)
-    size_t maxval = 0, maxalpha = 0;
+    long double maxval = 0.0;
+    size_t maxalpha = 0;
     for( size_t alpha = 0; alpha < nrORs(); alpha++ ) {
-        size_t val = VarSet(vs & OR(alpha).vars()).nrStates();
+        long double val = VarSet(vs & OR(alpha).vars()).nrStates();
         if( val > maxval ) {
             maxval = val;
             maxalpha = alpha;
@@ -566,7 +567,7 @@ Factor JTree::calcMarginal( const VarSet& vs ) {
 }
 
 
-std::pair<size_t,double> boundTreewidth( const FactorGraph &fg, greedyVariableElimination::eliminationCostFunction fn, size_t maxStates ) {
+std::pair<size_t,long double> boundTreewidth( const FactorGraph &fg, greedyVariableElimination::eliminationCostFunction fn, size_t maxStates ) {
     // Create cluster graph from factor graph
     ClusterGraph _cg( fg, true );
 
@@ -579,7 +580,7 @@ std::pair<size_t,double> boundTreewidth( const FactorGraph &fg, greedyVariableEl
     for( size_t i = 0; i < ElimVec.size(); i++ ) {
         if( ElimVec[i].size() > treewidth )
             treewidth = ElimVec[i].size();
-        size_t s = ElimVec[i].nrStates();
+        long double s = ElimVec[i].nrStates();
         if( s > nrstates )
             nrstates = s;
     }
index 1b49b8b..b125619 100644 (file)
@@ -41,8 +41,10 @@ mxArray *Factors2mx(const vector<Factor> &Ps) {
             BiMember_data[i] = j->label();
             dims.push_back( j->states() );
         }
+        while( dims.size() <= 2 )
+            dims.push_back( 1 );
 
-        mxArray *BiP = mxCreateNumericArray(I->vars().size(), &(*(dims.begin())), mxDOUBLE_CLASS, mxREAL);
+        mxArray *BiP = mxCreateNumericArray(dims.size(), &(*(dims.begin())), mxDOUBLE_CLASS, mxREAL);
         double *BiP_data = mxGetPr(BiP);
         for( size_t j = 0; j < I->nrStates(); j++ )
             BiP_data[j] = (*I)[j];
index 311bcb8..5eb8794 100644 (file)
@@ -154,7 +154,7 @@ int main( int argc, char *argv[] ) {
         // Calculate complexity for LCBP
         long double cavsum_lcbp = 0.0;
         long double cavsum_lcbp2 = 0.0;
-        size_t max_Delta_size = 0;
+        long double max_Delta_size = 0.0;
         map<size_t,size_t> cavsizes;
         for( size_t i = 0; i < fg.nrVars(); i++ ) {
             VarSet di = fg.delta(i);
@@ -162,7 +162,7 @@ int main( int argc, char *argv[] ) {
                 cavsizes[di.size()]++;
             else
                 cavsizes[di.size()] = 1;
-            size_t Ds = fg.Delta(i).nrStates();
+            long double Ds = fg.Delta(i).nrStates();
             if( Ds > max_Delta_size )
                 max_Delta_size = Ds;
             cavsum_lcbp += di.nrStates();