Adopted contributions by Christian.
authorJoris Mooij <jorism@marvin.jorismooij.nl>
Mon, 25 Aug 2008 09:25:48 +0000 (11:25 +0200)
committerJoris Mooij <jorism@marvin.jorismooij.nl>
Mon, 25 Aug 2008 09:25:48 +0000 (11:25 +0200)
* Contributions by Christian, resulting in vast speed and memory improvements
  for large factor graphs:
  - Sparse implementation of nodes->edge conversion table _E12ind in bipgraph.h
  - New FactorGraph constructor that constructs from given ranges of factors
    and variables
  - Optimization of FactorGraph constructors
* FactorGraph constructors no longer check for short loops and for
  negative entries. Also, the normtype is now Prob::NORMPROB by default.
* Moved everything into namespace "dai"

47 files changed:
ChangeLog
alldai.cpp
alldai.h
bipgraph.h
bp.cpp
bp.h
clustergraph.cpp
clustergraph.h
daialg.cpp
daialg.h
diffs.h
enum.h
example.cpp
factor.h
factorgraph.cpp
factorgraph.h
hak.cpp
hak.h
index.h
jtree.cpp
jtree.h
lc.cpp
lc.h
mf.cpp
mf.h
mr.cpp
mr.h
prob.h
properties.cpp
properties.h
regiongraph.cpp
regiongraph.h
tests/test.cpp
treeep.cpp
treeep.h
util.cpp
util.h
utils/createfg.cpp
utils/fg2dot.cpp
utils/fginfo.cpp
utils/remove_short_loops.cpp
var.h
varset.h
weightedgraph.cpp
weightedgraph.h
x2x.cpp
x2x.h

index cade4da..c352fd0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+libDAI-0.2.2 (2008-??-??)
+-------------------------
+
+* Contributions by Christian, resulting in vast speed and memory improvements
+  for large factor graphs:
+  - Sparse implementation of nodes->edge conversion table _E12ind in bipgraph.h
+  - New FactorGraph constructor that constructs from given ranges of factors
+    and variables
+  - Optimization of FactorGraph constructors
+* FactorGraph constructors no longer check for short loops and for
+  negative entries. Also, the normtype is now Prob::NORMPROB by default.
+* Moved everything into namespace "dai"
+
+
 libDAI-0.2.1 (2008-05-26)
 -------------------------
 
index 70dcc05..10fa8a5 100644 (file)
@@ -22,6 +22,9 @@
 #include "alldai.h"
 
 
+namespace dai {
+
+
 InfAlg *newInfAlg( const string &name, const FactorGraph &fg, const Properties &opts ) {
     if( name == BP::Name ) 
         return new BP (fg, opts);
@@ -40,3 +43,6 @@ InfAlg *newInfAlg( const string &name, const FactorGraph &fg, const Properties &
     else
         throw "Unknown inference algorithm";
 }
+
+
+}
index df6d6f8..ea7d750 100644 (file)
--- a/alldai.h
+++ b/alldai.h
@@ -33,6 +33,9 @@
 #include "mr.h"
 
 
+namespace dai {
+
+
 /// newInfAlg constructs a new approximate inference algorithm named name for the
 /// FactorGraph fg with optionts opts and returns a pointer to the new object.
 /// The caller needs to delete it (maybe some sort of smart_ptr might be useful here).
@@ -42,5 +45,7 @@ InfAlg *newInfAlg( const string &name, const FactorGraph &fg, const Properties &
 /// AINames contains the names of all approximate inference algorithms
 static const char* DAINames[] = {BP::Name, MF::Name, HAK::Name, LC::Name, TreeEP::Name, MR::Name, JTree::Name};
 
+}
+
 
 #endif
index 6abc133..b0c0e1a 100644 (file)
 
 #include <vector>
 #include <algorithm>
+#include <boost/numeric/ublas/vector_sparse.hpp>
+
+
+namespace dai {
 
 
 /// A BipartiteGraph represents a graph with two types of nodes
@@ -46,7 +50,7 @@ template <class T1, class T2> class BipartiteGraph {
         std::vector<_edge_t>                _E12;
 
         /// Conversion matrix that computes which index of _E12 corresponds to a vertex index pair (v1,v2)
-        std::vector<std::vector<size_t> >   _E12ind;
+        std::vector<boost::numeric::ublas::mapped_vector<size_t> > _E12ind;
 
         /// Neighbour indices of vertices of first type
         std::vector<_nb_t>                  _nb1;
@@ -115,7 +119,7 @@ template <class T1, class T2> class BipartiteGraph {
         _nb_t & nb2( size_t i2 ) { return _nb2[i2]; }
 
         /// Converts the pair of indices (i1,i2) to the corresponding edge index
-        size_t VV2E( const size_t i1, const size_t i2 ) const { return _E12ind[i1][i2]; }
+        size_t VV2E( const size_t i1, const size_t i2 ) const { return _E12ind[i1](i2); }
 
 
         /// Regenerates internal structures (_E12ind, _nb1 and _nb2) based upon _V1, _V2 and _E12
@@ -145,16 +149,15 @@ template <class T1, class T2> class BipartiteGraph {
             }
 
             // Calculate _E12ind
-            
-            // Allocate data structures
-            _E12ind.clear();
-            std::vector<size_t> col(_V2.size(),-1);
-            _E12ind.assign(_V1.size(), col);
-            // Assign elements
+            _E12ind = std::vector<boost::numeric::ublas::mapped_vector<size_t> >(_V1.size(), boost::numeric::ublas::mapped_vector<size_t>(_V2.size()) );            
             for( size_t k = 0; k < _E12.size(); k++ )
-                _E12ind[_E12[k].first][_E12[k].second] = k;
+                _E12ind[_E12[k].first](_E12[k].second) = k;
+                    
         }
 };
 
 
+}
+
+
 #endif
diff --git a/bp.cpp b/bp.cpp
index e8ae3d4..4a5419b 100644 (file)
--- a/bp.cpp
+++ b/bp.cpp
@@ -30,6 +30,9 @@
 #include "properties.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -344,3 +347,6 @@ void BP::init( const VarSet &ns ) {
             message(ni,*I).fill( 1.0 );
     }
 }
+
+
+}
diff --git a/bp.h b/bp.h
index f7afa28..e8bf564 100644 (file)
--- a/bp.h
+++ b/bp.h
@@ -28,6 +28,9 @@
 #include "enum.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -36,7 +39,7 @@ class BP : public DAIAlgFG {
         typedef vector<size_t>  _ind_t;
 
         vector<_ind_t>          _indices;
-        vector<Prob>            _messages, _newmessages;    
+        vector<Prob>            _messages, _newmessages;
 
     public:
         ENUM4(UpdateType,SEQFIX,SEQRND,SEQMAX,PARALL)
@@ -89,4 +92,8 @@ class BP : public DAIAlgFG {
         bool checkProperties();
 };
 
+
+}
+
+
 #endif
index 1c025fe..3a33a11 100644 (file)
@@ -26,6 +26,9 @@
 #include "clustergraph.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -114,3 +117,6 @@ ClusterGraph ClusterGraph::VarElim_MinFill() const {
 
     return result;
 }
+
+
+}
index b838eea..e187caa 100644 (file)
@@ -28,6 +28,9 @@
 #include "varset.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -175,4 +178,7 @@ class ClusterGraph : public set<VarSet> {
 };
 
 
+}
+
+
 #endif
index 023a64a..c4c3d92 100644 (file)
@@ -22,6 +22,9 @@
 #include "daialg.h"
 
 
+namespace dai {
+
+
 /// Calculate the marginal of obj on ns by clamping 
 /// all variables in ns and calculating logZ for each joined state
 Factor calcMarginal( const InfAlg & obj, const VarSet & ns, bool reInit ) {
@@ -222,3 +225,6 @@ vector<Factor> calcPairBeliefsNew( const InfAlg & obj, const VarSet& ns, bool re
 
     return result;
 }
+
+
+}
index a112796..5a1eeb1 100644 (file)
--- a/daialg.h
+++ b/daialg.h
@@ -31,6 +31,9 @@
 #include "properties.h"
 
 
+namespace dai {
+
+
 /// The InfAlg class is the common denominator of the various approximate inference algorithms.
 /// A InfAlg object represents a discrete factorized probability distribution over multiple variables 
 /// together with an inference algorithm.
@@ -281,5 +284,7 @@ vector<Factor> calcPairBeliefsNew( const InfAlg & obj, const VarSet& ns, bool re
 Factor calcMarginal2ndO( const InfAlg & obj, const VarSet& ns, bool reInit );
 
 
+}
+
 
 #endif
diff --git a/diffs.h b/diffs.h
index 52fa781..406ced1 100644 (file)
--- a/diffs.h
+++ b/diffs.h
 
 #include <vector>
 
+
+namespace dai {
+
+
 using namespace std;
 
 
@@ -67,4 +71,8 @@ class Diffs : public vector<double> {
         }
 };
 
+
+}
+
+
 #endif
diff --git a/enum.h b/enum.h
index 649ae6c..d3975d5 100644 (file)
--- a/enum.h
+++ b/enum.h
@@ -27,6 +27,9 @@
 #include <iostream>
 
 
+namespace dai {
+
+
 // C++ enums are too limited for my purposes. This defines wrapper classes
 // that provide much more functionality than a simple enum. The only
 // disadvantage is that one wrapper class needs to be written for each
 };
 
 
+}
+
+
 #endif
index 5bada87..531a677 100644 (file)
@@ -1,20 +1,20 @@
-/*  Copyright 2006-2008  Joris Mooij
-    jorism@jorismooij.nl
+/*  Copyright (C) 2006-2008  Joris Mooij  [j dot mooij at science dot ru dot nl]
+    Radboud University Nijmegen, The Netherlands
     
-    This file is part of AI.
+    This file is part of libDAI.
 
-    AI is free software; you can redistribute it and/or modify
+    libDAI is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
 
-    AI is distributed in the hope that it will be useful,
+    libDAI is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with AI; if not, write to the Free Software
+    along with libDAI; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
 
@@ -23,6 +23,7 @@
 #include "alldai.h"
 
 
+using namespace dai;
 using namespace std;
 
 
index 2c01e17..04ff6c9 100644 (file)
--- a/factor.h
+++ b/factor.h
@@ -30,6 +30,9 @@
 #include "index.h"
 
 
+namespace dai {
+
+
 template<typename T> class      TFactor;
 typedef TFactor<Real>           Factor;
 typedef TFactor<Complex>        CFactor;
@@ -356,4 +359,7 @@ template<typename T> TFactor<T> RemoveFirstOrderInteractions( const TFactor<T> &
 }
 
 
+}
+
+
 #endif
index bd15554..14fd2fe 100644 (file)
 #include <string>
 #include <algorithm>
 #include <functional>
+#include <tr1/unordered_map>
 #include "factorgraph.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
-FactorGraph::FactorGraph( const vector<Factor> &P ) : BipartiteGraph<Var,Factor>(), _undoProbs(), _hasNegatives(false), _normtype(Prob::NORMPROB) {
-    // add Factors
+FactorGraph::FactorGraph( const vector<Factor> &P ) : BipartiteGraph<Var,Factor>(), _undoProbs(), _normtype(Prob::NORMPROB) {
+    // add factors, obtain variables
     set<Var> _vars;
-    for(vector<Factor>::const_iterator p2 = P.begin(); p2 != P.end(); p2++ ) {
-        V2s().push_back(*p2);
-        if( !_hasNegatives && p2->hasNegatives() )
-            _hasNegatives = true;
-        for( set<Var>::const_iterator i = p2->vars().begin(); i != p2->vars().end(); i++ )
-            _vars.insert(*i);
+    V2s().reserve( P.size() );
+    size_t nrEdges = 0;
+    for( vector<Factor>::const_iterator p2 = P.begin(); p2 != P.end(); p2++ ) {
+        V2s().push_back( *p2 );
+       copy( p2->vars().begin(), p2->vars().end(), inserter( _vars, _vars.begin() ) );
+       nrEdges += p2->vars().size();
     }
 
-    // if negative factors are present, use LINF norm
-    if( _hasNegatives )
-        _normtype = Prob::NORMLINF;
-    
     // add _vars
-    for(VarSet::const_iterator p1 = _vars.begin(); p1 != _vars.end(); p1++ )
-        vars().push_back(*p1);
+    V1s().reserve( _vars.size() );
+    for( set<Var>::const_iterator p1 = _vars.begin(); p1 != _vars.end(); p1++ )
+        V1s().push_back( *p1 );
+    
+    // create graph structure
+    createGraph( nrEdges );
+}
 
+
+/// Part of constructors (creates edges, neighbours and adjacency matrix)
+void FactorGraph::createGraph( size_t nrEdges ) {
+    // create a mapping for indices
+    std::tr1::unordered_map<size_t, size_t> hashmap;
+    
+    for( size_t i = 0; i < vars().size(); i++ )        
+       hashmap[vars()[i].label()] = i;
+    
     // create edges
-    for(size_t i2 = 0; i2 < nrFactors(); i2++ ) {
-        VarSet ns = factor(i2).vars();
-        for(VarSet::const_iterator q = ns.begin(); q != ns.end(); q++ ) {
-            for(size_t i1=0; i1 < nrVars(); i1++ ) {
-                if (var(i1) == *q) {
-                    edges().push_back(_edge_t(i1,i2));
-                    break;
-                }
-            }
-        }
+    edges().reserve( nrEdges );
+    for( size_t i2 = 0; i2 < nrFactors(); i2++ ) {
+        const VarSet& ns = factor(i2).vars();
+        for( VarSet::const_iterator q = ns.begin(); q != ns.end(); q++ )
+            edges().push_back(_edge_t(hashmap[q->label()], i2));               
     }
 
     // calc neighbours and adjacency matrix
     Regenerate();
-
-    // Check for short loops
-    if( hasShortLoops(P) )
-        cerr << "FactorGraph::FactorGraph():  WARNING: short loops are present" << endl;
 }
 
 
 /*FactorGraph& FactorGraph::addFactor( const Factor &I ) {
     // add Factor
     _V2.push_back( I );
-    if( !_hasNegatives && I.hasNegatives() )
-        _hasNegatives = true;
-
-    // if negative factors are present, use LINF norm
-    if( _hasNegatives )
-        _normtype = Prob::NORMLINF;
 
     // add new vars in Factor
     for( VarSet::const_iterator i = I.vars().begin(); i != I.vars().end(); i++ ) {
@@ -303,6 +302,15 @@ void FactorGraph::makeCavity(const Var & n) {
 }
 
 
+bool FactorGraph::hasNegatives() const {
+    bool result = false;
+    for( size_t I = 0; I < nrFactors() && !result; I++ )
+        if( factor(I).hasNegatives() )
+           result = true;
+    return result;
+}
+
 /*FactorGraph & FactorGraph::DeleteFactor(size_t I) {
     // Go through all edges
     for( vector<_edge_t>::iterator edge = _E12.begin(); edge != _E12.end(); edge++ )
@@ -617,3 +625,6 @@ bool FactorGraph::isConnected() const {
         return remaining.empty();
     }
 }
+
+
+}
index 9723a96..7dada6e 100644 (file)
 #include "bipgraph.h"
 #include "factor.h"
 
+#include <tr1/unordered_map>
+
+
+namespace dai {
+
 
 using namespace std;
 
 
+bool hasShortLoops(const vector<Factor> &P);
+void RemoveShortLoops(vector<Factor> &P);
+
 class FactorGraph : public BipartiteGraph<Var,Factor> {
     protected:
         map<size_t,Prob>    _undoProbs;
-        bool                _hasNegatives;
         Prob::NormType      _normtype;
 
     public:
         /// Default constructor
-        FactorGraph() : BipartiteGraph<Var,Factor>(), _undoProbs(), _hasNegatives(false), _normtype(Prob::NORMPROB) {};
+        FactorGraph() : BipartiteGraph<Var,Factor>(), _undoProbs(), _normtype(Prob::NORMPROB) {};
         /// Copy constructor
-        FactorGraph(const FactorGraph & x) : BipartiteGraph<Var,Factor>(x), _undoProbs(), _hasNegatives(x._hasNegatives), _normtype(x._normtype) {};
+        FactorGraph(const FactorGraph & x) : BipartiteGraph<Var,Factor>(x), _undoProbs(), _normtype(x._normtype) {};
         /// Construct FactorGraph from vector of Factors
         FactorGraph(const vector<Factor> &P);
+        // Construct a FactorGraph from given factor and variable iterators
+        template<typename FactorInputIterator, typename VarInputIterator>
+        FactorGraph(FactorInputIterator fact_begin, FactorInputIterator fact_end, VarInputIterator var_begin, VarInputIterator var_end, size_t nr_fact_hint = 0, size_t nr_var_hint = 0 );
+        
         /// Assignment operator
         FactorGraph & operator=(const FactorGraph & x) {
             if(this!=&x) {
                 BipartiteGraph<Var,Factor>::operator=(x);
                 _undoProbs      = x._undoProbs;
-                _hasNegatives   = x._hasNegatives;
                 _normtype       = x._normtype;
             }
             return *this;
@@ -109,7 +119,7 @@ class FactorGraph : public BipartiteGraph<Var,Factor> {
 
         virtual void clamp( const Var & n, size_t i );
         
-        bool hasNegatives() const { return _hasNegatives; }
+        bool hasNegatives() const;
         Prob::NormType NormType() const { return _normtype; }
         
         vector<VarSet> Cliques() const;
@@ -122,11 +132,35 @@ class FactorGraph : public BipartiteGraph<Var,Factor> {
         bool isConnected() const;
 
         virtual void updatedFactor( size_t I ) {};
+
+    private:
+        /// Part of constructors (creates edges, neighbours and adjacency matrix)
+        void createGraph( size_t nrEdges );
 };
 
 
-bool hasShortLoops(const vector<Factor> &P);
-void RemoveShortLoops(vector<Factor> &P);
+// assumes that the set of variables in [var_begin,var_end) is the union of the variables in the factors in [fact_begin, fact_end)
+template<typename FactorInputIterator, typename VarInputIterator>
+FactorGraph::FactorGraph(FactorInputIterator fact_begin, FactorInputIterator fact_end, VarInputIterator var_begin, VarInputIterator var_end, size_t nr_fact_hint, size_t nr_var_hint ) : BipartiteGraph<Var,Factor>(), _undoProbs(), _normtype(Prob::NORMPROB) {
+    // add factors
+    size_t nrEdges = 0;
+    V2s().reserve( nr_fact_hint );
+    for( FactorInputIterator p2 = fact_begin; p2 != fact_end; ++p2 ) {
+        V2s().push_back( *p2 );
+       nrEdges += p2->vars().size();
+    }
+    // add variables
+    V1s().reserve( nr_var_hint );
+    for( VarInputIterator p1 = var_begin; p1 != var_end; ++p1 )
+       V1s().push_back( *p1 );
+
+    // create graph structure
+    createGraph( nrEdges );
+}
+
+
+}
 
 
 #endif
diff --git a/hak.cpp b/hak.cpp
index 453ec54..dc57653 100644 (file)
--- a/hak.cpp
+++ b/hak.cpp
@@ -25,6 +25,9 @@
 #include "diffs.h"
 
 
+namespace dai {
+
+
 const char *HAK::Name = "HAK";
 
 
@@ -402,3 +405,6 @@ Complex HAK::logZ() const {
     }
     return sum;
 }
+
+
+}
diff --git a/hak.h b/hak.h
index 9867f2d..62deefa 100644 (file)
--- a/hak.h
+++ b/hak.h
@@ -28,6 +28,9 @@
 #include "enum.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -100,4 +103,7 @@ class HAK : public DAIAlgRG {
 };
 
 
+}
+
+
 #endif
diff --git a/index.h b/index.h
index ee7443c..dc132d3 100644 (file)
--- a/index.h
+++ b/index.h
 #ifndef __INDEX_H__
 #define __INDEX_H__
 
+
 #include <vector>
 #include "varset.h"
 
+
+namespace dai {
+
+
 /* Example:
  *
  * Index i ({s_j_1,s_j_2,...,s_j_m}, {s_1,...,s_N});    // j_k in {1,...,N}
@@ -34,6 +39,7 @@
  * }
  */
 
+
 class Index
 {
 private:
@@ -97,6 +103,7 @@ public:
     };
 };
 
+
 class multind {
     private:
         std::vector<size_t> _dims;  // dimensions
@@ -125,7 +132,7 @@ class multind {
         }
         std::vector<size_t> vi(size_t li) const {   // linear index to vector index
             std::vector<size_t> v(_dims.size(),0);
-            assert(li >= 0 && li < _pdims.back());
+            assert(li < _pdims.back());
             for( long j = v.size()-1; j >= 0; j-- ) {
                 size_t q = li / _pdims[j];
                 v[j] = q;
@@ -145,4 +152,8 @@ class multind {
         // FIXME add an iterator, which increases a vector index just using addition
 };
 
+
+}
+
+
 #endif
index 51018fb..4ddb402 100644 (file)
--- a/jtree.cpp
+++ b/jtree.cpp
@@ -23,6 +23,9 @@
 #include "jtree.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -504,3 +507,6 @@ Factor JTree::calcMarginal( const VarSet& ns ) {
         }
     }
 }
+
+
+}
diff --git a/jtree.h b/jtree.h
index 9cc0217..aca1733 100644 (file)
--- a/jtree.h
+++ b/jtree.h
@@ -33,6 +33,9 @@
 #include "enum.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -92,4 +95,7 @@ class JTree : public DAIAlgRG {
 };
 
 
+}
+
+
 #endif
diff --git a/lc.cpp b/lc.cpp
index 314d8b9..a1b24a9 100644 (file)
--- a/lc.cpp
+++ b/lc.cpp
@@ -30,6 +30,9 @@
 #include "x2x.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -138,7 +141,7 @@ double LC::CalcCavityDist (size_t i, const string &name, const Properties &opts)
             
             // Set interactions of order > 2 to zero
             size_t N = delta(var(i)).size();
-            double *p = &(*Bi.p().p().begin());
+            Real *p = &(*Bi.p().p().begin());
             x2x::p2logp (N, p);
             x2x::logp2w (N, p);
             x2x::fill (N, p, 2, 0.0);
@@ -150,7 +153,7 @@ double LC::CalcCavityDist (size_t i, const string &name, const Properties &opts)
             
             // Set cumulants of order > 2 to zero
             size_t N = delta(var(i)).size();
-            double *p = &(*Bi.p().p().begin());
+            Real *p = &(*Bi.p().p().begin());
             x2x::p2m (N, p);
             x2x::m2c (N, p, N);
             x2x::fill (N, p, 2, 0.0);
@@ -343,3 +346,6 @@ double LC::run() {
 
     return diffs.max();
 }
+
+
+}
diff --git a/lc.h b/lc.h
index 1eac766..e7ac306 100644 (file)
--- a/lc.h
+++ b/lc.h
@@ -28,6 +28,9 @@
 #include "factorgraph.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -104,4 +107,7 @@ class LC : public DAIAlgFG {
 };
 
 
+}
+
+
 #endif
diff --git a/mf.cpp b/mf.cpp
index 630d83b..dc37657 100644 (file)
--- a/mf.cpp
+++ b/mf.cpp
@@ -28,6 +28,9 @@
 #include "util.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -194,3 +197,6 @@ void MF::init( const VarSet &ns ) {
             _beliefs[i].fill( 1.0 );
     }
 }
+
+
+}
diff --git a/mf.h b/mf.h
index a376161..1482fc6 100644 (file)
--- a/mf.h
+++ b/mf.h
 #include "daialg.h"
 #include "factorgraph.h"
 
+
+namespace dai {
+
+
 using namespace std;
 
 
@@ -70,4 +74,7 @@ class MF : public DAIAlgFG {
 };
 
 
+}
+
+
 #endif
diff --git a/mr.cpp b/mr.cpp
index 33458a2..273f806 100644 (file)
--- a/mr.cpp
+++ b/mr.cpp
@@ -30,6 +30,9 @@
 #include "diffs.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -579,7 +582,7 @@ Factor MR::belief( const Var &n ) const {
     if( supported ) {
         size_t i = findVar( n );
 
-        double x[2];
+        Real x[2];
         x[0] = 0.5 - Mag[i] / 2.0;
         x[1] = 0.5 + Mag[i] / 2.0;
 
@@ -655,3 +658,6 @@ MR::MR( const FactorGraph &fg, const Properties &opts ) : DAIAlgFG(fg, opts), su
     delete th;
     delete w;
 }
+
+
+}
diff --git a/mr.h b/mr.h
index acd0281..4f7a03f 100644 (file)
--- a/mr.h
+++ b/mr.h
@@ -29,6 +29,9 @@
 #include "enum.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -145,11 +148,12 @@ class sub_nb {
         size_t operator[](size_t i) { 
             size_t bit;
             for(bit = 0; bit < bits; bit++ )
-                if( s & (1U << bit) )
+                if( s & (1U << bit) ) {
                     if( i == 0 )
                         break;
                     else
                         i--;
+                }
 #ifdef DEBUG
             assert( bit < bits );
 #endif
@@ -209,4 +213,7 @@ class sub_nb {
 };
 
 
+}
+
+
 #endif
diff --git a/prob.h b/prob.h
index 27b0fa9..cc6144a 100644 (file)
--- a/prob.h
+++ b/prob.h
@@ -31,6 +31,9 @@
 #include "util.h"
 
 
+namespace dai {
+
+
 typedef double                  Real;
 typedef std::complex<double>    Complex;
 
@@ -472,4 +475,7 @@ template <typename T> class TProb {
 };
 
 
+}
+
+
 #endif
index aa461fa..fa49300 100644 (file)
@@ -24,6 +24,9 @@
 #include "alldai.h"
 
 
+namespace dai {
+
+
 /// Sends a single Property object to an output stream
 std::ostream& operator<< (std::ostream & os, const Property & p) {
     os << p.first << "=";
@@ -121,3 +124,6 @@ std::istream& operator >> (std::istream& is, Properties & ps) {
 
     return is;
 }
+
+
+}
index e1b0fff..bc443fc 100644 (file)
@@ -31,6 +31,9 @@
 #include <typeinfo>
 
 
+namespace dai {
+
+
 typedef std::string PropertyKey;
 typedef boost::any  PropertyValue;
 typedef std::pair<PropertyKey, PropertyValue> Property;
@@ -99,4 +102,7 @@ class Properties : public std::map<PropertyKey, PropertyValue> {
 };
 
 
+}
+
+
 #endif
index f986bc0..bef1788 100644 (file)
@@ -26,6 +26,9 @@
 #include "clustergraph.h"
 
 
+namespace dai {
+
+
 RegionGraph::RegionGraph(const FactorGraph & fg, const vector<Region> & ors, const vector<Region> & irs, const vector<R_edge_t> & edges) : FactorGraph(fg), BipRegGraph(), _fac2OR() {
     // Copy outer regions (giving them counting number 1.0)
     ORs().reserve( ors.size() );
@@ -274,3 +277,6 @@ ostream & operator << (ostream & os, const RegionGraph & rg) {
 
     return(os);
 }
+
+
+}
index 5891d46..d6859af 100644 (file)
@@ -29,6 +29,9 @@
 #include "weightedgraph.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -225,4 +228,7 @@ class RegionGraph : public FactorGraph, BipRegGraph {
 };
 
 
+}
+
+
 #endif
index d5f1422..f1497e0 100644 (file)
@@ -31,6 +31,7 @@
 
 
 using namespace std;
+using namespace dai;
 namespace po = boost::program_options;
 
 
index fc5ce31..62f557d 100644 (file)
@@ -28,6 +28,9 @@
 #include "diffs.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -472,3 +475,6 @@ Complex TreeEP::logZ() const {
     
     return sum;
 }
+
+
+}
index 4ea7031..ae488ac 100644 (file)
--- a/treeep.h
+++ b/treeep.h
@@ -34,6 +34,9 @@
 #include "enum.h"
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -120,4 +123,7 @@ class TreeEP : public JTree {
 };
 
 
+}
+
+
 #endif
index 586c215..f71cd63 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -26,6 +26,9 @@
 #include <boost/random/variate_generator.hpp>
 
 
+namespace dai {
+
+
 clock_t toc() {
     tms tbuf;
     times(&tbuf);
@@ -37,7 +40,7 @@ clock_t toc() {
 // Try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand
 typedef boost::minstd_rand _rnd_gen_type;
 
-_rnd_gen_type _rnd_gen(42u);
+_rnd_gen_type _rnd_gen(42);
 
 // Define a uniform random number distribution which produces "double"
 // values between 0 and 1 (0 inclusive, 1 exclusive).
@@ -49,7 +52,7 @@ boost::normal_distribution<> _normal_dist;
 boost::variate_generator<_rnd_gen_type&, boost::normal_distribution<> > _normal_rnd(_rnd_gen, _normal_dist);
 
 
-void rnd_seed( size_t seed ) {
+void rnd_seed( int seed ) {
     _rnd_gen.seed(seed);
 }
 
@@ -60,3 +63,6 @@ double rnd_uniform() {
 double rnd_stdnormal() {
     return _normal_rnd();
 }
+
+
+}
diff --git a/util.h b/util.h
index afee52c..666643e 100644 (file)
--- a/util.h
+++ b/util.h
 #include <cstdio>
 
 
+namespace dai {
+
+
 clock_t toc();
-void rnd_seed( size_t seed );
+void rnd_seed( int seed );
 double rnd_uniform();
 double rnd_stdnormal();
 
 
+}
+
+
 #endif
index f103999..5e4b8b9 100644 (file)
@@ -28,6 +28,7 @@
 
 
 using namespace std;
+using namespace dai;
 namespace po = boost::program_options;
 
 
index c718e7c..156d7ca 100644 (file)
 
 #include "../factorgraph.h"
 #include <iostream>
-#include <stdlib.h>
+#include <cstdlib>
+#include <string>
 
+using namespace dai;
 using namespace std;
 
 
@@ -41,7 +43,7 @@ int main( int argc, char *argv[] ) {
             cerr << "Error reading file " << infile << endl;
             return 2;
         } else {
-            if( strcmp( argv[2], "-" ) ) 
+            if( string( argv[2] ) == "-" ) 
                 fg.WriteToDotFile( argv[2] );
             else {
                 cout << "graph G {" << endl;
index b1fa2e2..fdfb188 100644 (file)
@@ -21,8 +21,9 @@
 
 #include "../factorgraph.h"
 #include <iostream>
-#include <stdlib.h>
+#include <cstdlib>
 
+using namespace dai;
 using namespace std;
 
 
index 0e58cc8..ead6be7 100644 (file)
@@ -21,8 +21,9 @@
 
 #include "factorgraph.h"
 #include <iostream>
-#include <stdlib.h>
+#include <cstdlib>
 
+using namespace dai;
 using namespace std;
 
 
diff --git a/var.h b/var.h
index b2208e9..16663c1 100644 (file)
--- a/var.h
+++ b/var.h
@@ -25,6 +25,9 @@
 #include <iostream>
 
 
+namespace dai {
+
+
 /// Represents a discrete variable
 class Var {
     private:
@@ -70,4 +73,7 @@ class Var {
 };
 
 
+}
+
+
 #endif
index 2aee739..269d983 100644 (file)
--- a/varset.h
+++ b/varset.h
@@ -30,6 +30,9 @@
 #include "var.h"
 
 
+namespace dai {
+
+
 /// VarSet represents a set of variables and is a descendant of set<Var>. 
 /// In addition, it provides an easy interface for set-theoretic operations
 /// by operator overloading.
@@ -239,4 +242,7 @@ inline VarSet operator| (const Var& n1, const Var& n2) {
 }
 
 
+}
+
+
 #endif
index b516cd9..dcae3b9 100644 (file)
@@ -25,6 +25,9 @@
 #include "util.h"
 
 
+namespace dai {
+
+
 std::ostream & operator << (std::ostream & os, const DEdgeVec & rt) {
     os << "[";
     for( size_t n = 0; n < rt.size(); n++ )
@@ -145,3 +148,6 @@ UEdgeVec RandomDRegularGraph( size_t N, size_t d ) {
 
     return G;
 }
+
+
+}
index 5b5ed59..590b7c2 100644 (file)
@@ -29,6 +29,9 @@
 #include <set>
 
 
+namespace dai {
+
+
 using namespace std;
 
 
@@ -167,4 +170,7 @@ DEdgeVec GrowRootedTree( const Graph & T, size_t Root );
 UEdgeVec RandomDRegularGraph( size_t N, size_t d );
 
 
+}
+
+
 #endif
diff --git a/x2x.cpp b/x2x.cpp
index a375517..9dc007c 100644 (file)
--- a/x2x.cpp
+++ b/x2x.cpp
@@ -22,8 +22,9 @@ CHANGES:
 */
 
 
-#include <math.h>
-#include <string.h>
+#include <cmath>
+#include <cstring>
+
 
 
 namespace x2x {
diff --git a/x2x.h b/x2x.h
index 8309fe7..af65a91 100644 (file)
--- a/x2x.h
+++ b/x2x.h
@@ -19,8 +19,8 @@
 */
 
 
-#include <math.h>
-#include <string.h>
+#include <cmath>
+#include <cstring>
 
 
 namespace x2x {