Replaced Name members by name() virtual functions (fixing a bug in matlab/dai.cpp)
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 4 Oct 2010 08:40:52 +0000 (10:40 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Mon, 4 Oct 2010 08:40:52 +0000 (10:40 +0200)
33 files changed:
ChangeLog
include/dai/alldai.h
include/dai/bp.h
include/dai/cbp.h
include/dai/daialg.h
include/dai/decmap.h
include/dai/doc.h
include/dai/exactinf.h
include/dai/fbp.h
include/dai/gibbs.h
include/dai/hak.h
include/dai/jtree.h
include/dai/lc.h
include/dai/mf.h
include/dai/mr.h
include/dai/treeep.h
include/dai/trwbp.h
src/alldai.cpp
src/bp.cpp
src/cbp.cpp
src/decmap.cpp
src/exactinf.cpp
src/fbp.cpp
src/gibbs.cpp
src/hak.cpp
src/jtree.cpp
src/lc.cpp
src/matlab/dai.cpp
src/mf.cpp
src/mr.cpp
src/treeep.cpp
src/trwbp.cpp
tests/testdai.cpp

index aa39936..cd91c07 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 libDAI-0.2.7 (2010-08-19)
 -------------------------
 
+* Replaced all Name members by name() virtual functions and removed global variable DAINames
+  (this fixes a bug in matlab/dai.cpp reported by Thomas Mensink)
 * Removed interfaces deprecated in 0.2.6.
 * Fixed a bug in JTree::findMaximum() (reported by zhengyun84 and Dhruv Batra):
   if one or more variables had a MAP belief with more than one maximum, an 
index 9987723..181cb01 100644 (file)
@@ -71,7 +71,7 @@ namespace dai {
 
 
 /// Constructs a new inference algorithm.
-/** \param name The name of the inference algorithm (should be one of the names in DAINames).
+/** \param name The name of the inference algorithm.
  *  \param fg The FactorGraph that the algorithm should be applied to.
  *  \param opts A PropertySet specifying the options for the algorithm.
  *  \return Returns a pointer to the new InfAlg object; it is the responsibility of the caller to delete it later.
@@ -119,49 +119,6 @@ std::pair<std::string, PropertySet> parseNameProperties( const std::string &s, c
 std::map<std::string,std::string> readAliasesFile( const std::string &filename );
 
 
-/// Contains the names of all inference algorithms compiled into libDAI.
-static const char* DAINames[] = {
-    ExactInf::Name,
-#ifdef DAI_WITH_BP
-    BP::Name,
-#endif
-#ifdef DAI_WITH_FBP
-    FBP::Name,
-#endif
-#ifdef DAI_WITH_TRWBP
-    TRWBP::Name,
-#endif
-#ifdef DAI_WITH_MF
-    MF::Name,
-#endif
-#ifdef DAI_WITH_HAK
-    HAK::Name,
-#endif
-#ifdef DAI_WITH_LC
-    LC::Name,
-#endif
-#ifdef DAI_WITH_TREEEP
-    TreeEP::Name,
-#endif
-#ifdef DAI_WITH_JTREE
-    JTree::Name,
-#endif
-#ifdef DAI_WITH_MR
-    MR::Name,
-#endif
-#ifdef DAI_WITH_GIBBS
-    Gibbs::Name,
-#endif
-#ifdef DAI_WITH_CBP
-    CBP::Name,
-#endif
-#ifdef DAI_WITH_DECMAP
-    DecMAP::Name,
-#endif
-    ""
-};
-
-
 } // end of namespace dai
 
 
index 1400ca3..8d35bf6 100644 (file)
@@ -139,9 +139,6 @@ class BP : public DAIAlgFG {
             InfType inference;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
         /// Specifies whether the history of message updates should be recorded
         bool recordSentMessages;
 
@@ -190,7 +187,7 @@ class BP : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual BP* clone() const { return new BP(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "BP"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &vs ) const;
         virtual Factor beliefV( size_t i ) const;
index f9052b9..d16a947 100644 (file)
@@ -60,6 +60,9 @@ class CBP : public DAIAlgFG {
 
 
     public:
+        /// Default constructor
+        CBP() : DAIAlgFG(), _beliefsV(), _beliefsF(), _logZ(0.0), _iters(0), _maxdiff(0.0), _sum_level(0.0), _num_leaves(0), _clamp_ofstream() {}
+
         /// Construct CBP object from FactorGraph \a fg and PropertySet \a opts
         /** \param fg Factor graph.
          *  \param opts Parameters @see Properties
@@ -69,13 +72,10 @@ class CBP : public DAIAlgFG {
             construct();
         }
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     /// \name General InfAlg interface
     //@{
         virtual CBP* clone() const { return new CBP(*this); }
-        virtual std::string identify() const { return std::string(Name) + props.toString(); }
+        virtual std::string name() const { return "CBP"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet & ) const { DAI_THROW(NOT_IMPLEMENTED); }
         virtual Factor beliefV( size_t i ) const { return _beliefsV[i]; }
index 3a28712..751f882 100644 (file)
@@ -47,8 +47,13 @@ class InfAlg {
 
     /// \name Queries
     //@{
+        /// Returns the name of the algorithm
+        virtual std::string name() const = 0;
+
         /// Identifies itself for logging purposes
-        virtual std::string identify() const = 0;
+        virtual std::string identify() const {
+            return name() + printProperties();
+        }
 
         /// Returns reference to underlying FactorGraph.
         virtual FactorGraph &fg() = 0;
index 190b002..0656331 100644 (file)
@@ -54,9 +54,6 @@ class DecMAP : public DAIAlgFG {
             PropertySet iaopts;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
         /// Default constructor
         DecMAP() : DAIAlgFG(), _state(), _logp(), _maxdiff(), _iters(), props() {}
@@ -71,7 +68,7 @@ class DecMAP : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual DecMAP* clone() const { return new DecMAP(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "DECMAP"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &/*vs*/ ) const;
         virtual Factor beliefV( size_t i ) const;
index baeb332..fc46ec3 100644 (file)
@@ -11,8 +11,6 @@
 /** \file
  *  \brief Contains additional doxygen documentation
  *
- *  \todo Replace all Name members by virtual functions (or add virtual functions returning the Name)
- *
  *  \idea Adapt (part of the) guidelines in http://www.boost.org/development/requirements.html#Design_and_Programming
  *
  *  \idea Use "gcc -MM" to generate dependencies for targets: http://make.paulandlesley.org/autodep.html
index 7757f85..5492732 100644 (file)
@@ -40,9 +40,6 @@ class ExactInf : public DAIAlgFG {
             size_t verbose;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     private:
         /// All single variable marginals
         std::vector<Factor> _beliefsV;
@@ -70,7 +67,7 @@ class ExactInf : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual ExactInf* clone() const { return new ExactInf(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "EXACT"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &vs ) const;
         virtual Factor beliefV( size_t i ) const { return _beliefsV[i]; }
index d6cbd63..dfd86f8 100644 (file)
@@ -61,10 +61,6 @@ class FBP : public BP {
         std::vector<Real> _weight;
 
     public:
-        /// Name of this inference algorithm
-        static const char *Name;
-
-    public:
     /// \name Constructors/destructors
     //@{
         /// Default constructor
@@ -83,7 +79,7 @@ class FBP : public BP {
     /// \name General InfAlg interface
     //@{
         virtual FBP* clone() const { return new FBP(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "FBP"; }
         virtual Real logZ() const;
     //@}
 
index 7f763f8..0428d39 100644 (file)
@@ -67,9 +67,6 @@ class Gibbs : public DAIAlgFG {
             size_t verbose;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
         /// Default constructor
         Gibbs() : DAIAlgFG(), _sample_count(0), _var_counts(), _factor_counts(), _iters(0), _state(), _max_state(), _max_score(-INFINITY) {}
@@ -87,7 +84,7 @@ class Gibbs : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual Gibbs* clone() const { return new Gibbs(*this); }
-        virtual std::string identify() const { return std::string(Name) + printProperties(); }
+        virtual std::string name() const { return "GIBBS"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &vs ) const;
         virtual Factor beliefV( size_t i ) const;
index 99927f8..6429aed 100644 (file)
@@ -90,9 +90,6 @@ class HAK : public DAIAlgRG {
             size_t loopdepth;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
     /// \name Constructors/destructors
     //@{
@@ -113,7 +110,7 @@ class HAK : public DAIAlgRG {
     /// \name General InfAlg interface
     //@{
         virtual HAK* clone() const { return new HAK(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "HAK"; }
         virtual Factor belief( const VarSet &vs ) const;
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const;
index 00364b7..ad2dec3 100644 (file)
@@ -103,9 +103,6 @@ class JTree : public DAIAlgRG {
             size_t maxmem;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
     /// \name Constructors/destructors
     //@{
@@ -124,7 +121,7 @@ class JTree : public DAIAlgRG {
     /// \name General InfAlg interface
     //@{
         virtual JTree* clone() const { return new JTree(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "JTREE"; }
         virtual Factor belief( const VarSet &vs ) const;
         virtual std::vector<Factor> beliefs() const;
         virtual Real logZ() const;
index 3231b8a..0616e3a 100644 (file)
@@ -91,9 +91,6 @@ class LC : public DAIAlgFG {
             PropertySet cavaiopts;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
         /// Default constructor
         LC() : DAIAlgFG(), _pancakes(), _cavitydists(), _phis(), _beliefs(), _maxdiff(), _iters(), props() {}
@@ -108,7 +105,7 @@ class LC : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual LC* clone() const { return new LC(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "LC"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &/*vs*/ ) const;
         virtual Factor beliefV( size_t i ) const { return _beliefs[i]; }
index 7f9ba63..ac07b7f 100644 (file)
@@ -74,9 +74,6 @@ class MF : public DAIAlgFG {
             UpdateType updates;
         } props;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
     /// \name Constructors/destructors
     //@{
@@ -96,7 +93,7 @@ class MF : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual MF* clone() const { return new MF(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "MF"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &vs ) const;
         virtual Factor beliefV( size_t i ) const;
index ed56172..979b02a 100644 (file)
@@ -96,9 +96,6 @@ class MR : public DAIAlgFG {
             InitType inits;
         } props;
 
-        /// Name of this inference method
-        static const char *Name;
-
     public:
         /// Default constructor
         MR() : DAIAlgFG(), supported(), G(), tJ(), theta(), M(), cors(), Mag(), _maxdiff(), _iters(), props() {}
@@ -115,7 +112,7 @@ class MR : public DAIAlgFG {
     /// \name General InfAlg interface
     //@{
         virtual MR* clone() const { return new MR(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "MR"; }
         virtual Factor belief( const Var &v ) const { return beliefV( findVar( v ) ); }
         virtual Factor belief( const VarSet &/*vs*/ ) const;
         virtual Factor beliefV( size_t i ) const;
index 5577c82..1aecb82 100644 (file)
@@ -71,9 +71,6 @@ class TreeEP : public JTree {
             TypeType type;
         } props;
 
-        /// Name of this inference method
-        static const char *Name;
-
     private:
         /// Stores the data structures needed to efficiently update the approximation of an off-tree factor.
         /** The TreeEP object stores a TreeEPSubTree object for each off-tree factor.
@@ -185,7 +182,7 @@ class TreeEP : public JTree {
     /// \name General InfAlg interface
     //@{
         virtual TreeEP* clone() const { return new TreeEP(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "TREEEP"; }
         virtual Real logZ() const;
         virtual void init();
         virtual void init( const VarSet &/*ns*/ ) { init(); }
index d36d854..879c586 100644 (file)
@@ -65,9 +65,6 @@ class TRWBP : public BP {
          */
         size_t nrtrees;
 
-        /// Name of this inference algorithm
-        static const char *Name;
-
     public:
     /// \name Constructors/destructors
     //@{
@@ -89,7 +86,7 @@ class TRWBP : public BP {
     /// \name General InfAlg interface
     //@{
         virtual TRWBP* clone() const { return new TRWBP(*this); }
-        virtual std::string identify() const;
+        virtual std::string name() const { return "TRWBP"; }
         virtual Real logZ() const;
         virtual void setProperties( const PropertySet &opts );
         virtual PropertySet getProperties() const;
index 266227f..81cf3a5 100644 (file)
@@ -23,54 +23,54 @@ using namespace std;
 
 
 InfAlg *newInfAlg( const std::string &name, const FactorGraph &fg, const PropertySet &opts ) {
-    if( name == ExactInf::Name )
+    if( name == ExactInf().name() )
         return new ExactInf (fg, opts);
 #ifdef DAI_WITH_BP
-    if( name == BP::Name )
+    if( name == BP().name() )
         return new BP (fg, opts);
 #endif
 #ifdef DAI_WITH_FBP
-    if( name == FBP::Name )
+    if( name == FBP().name() )
         return new FBP (fg, opts);
 #endif
 #ifdef DAI_WITH_TRWBP
-    if( name == TRWBP::Name )
+    if( name == TRWBP().name() )
         return new TRWBP (fg, opts);
 #endif
 #ifdef DAI_WITH_MF
-    if( name == MF::Name )
+    if( name == MF().name() )
         return new MF (fg, opts);
 #endif
 #ifdef DAI_WITH_HAK
-    if( name == HAK::Name )
+    if( name == HAK().name() )
         return new HAK (fg, opts);
 #endif
 #ifdef DAI_WITH_LC
-    if( name == LC::Name )
+    if( name == LC().name() )
         return new LC (fg, opts);
 #endif
 #ifdef DAI_WITH_TREEEP
-    if( name == TreeEP::Name )
+    if( name == TreeEP().name() )
         return new TreeEP (fg, opts);
 #endif
 #ifdef DAI_WITH_JTREE
-    if( name == JTree::Name )
+    if( name == JTree().name() )
         return new JTree (fg, opts);
 #endif
 #ifdef DAI_WITH_MR
-    if( name == MR::Name )
+    if( name == MR().name() )
         return new MR (fg, opts);
 #endif
 #ifdef DAI_WITH_GIBBS
-    if( name == Gibbs::Name )
+    if( name == Gibbs().name() )
         return new Gibbs (fg, opts);
 #endif
 #ifdef DAI_WITH_CBP
-    if( name == CBP::Name )
+    if( name == CBP().name() )
         return new CBP (fg, opts);
 #endif
 #ifdef DAI_WITH_DECMAP
-    if( name == DecMAP::Name )
+    if( name == DecMAP().name() )
         return new DecMAP (fg, opts);
 #endif
     DAI_THROWE(UNKNOWN_DAI_ALGORITHM,"Unknown libDAI algorithm: " + name);
index 4b165f5..a88e16f 100644 (file)
@@ -25,9 +25,6 @@ namespace dai {
 using namespace std;
 
 
-const char *BP::Name = "BP";
-
-
 #define DAI_BP_FAST 1
 
 
@@ -335,7 +332,7 @@ Real BP::run() {
         }
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
+            cerr << name() << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
     if( maxDiff > _maxdiff )
@@ -345,10 +342,10 @@ Real BP::run() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::run:  WARNING: not converged after " << _iters << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+                cerr << name() << "::run:  WARNING: not converged after " << _iters << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 3 )
-                cerr << Name << "::run:  ";
+                cerr << name() << "::run:  ";
                 cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
@@ -432,11 +429,6 @@ Real BP::logZ() const {
 }
 
 
-string BP::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 void BP::init( const VarSet &ns ) {
     for( VarSet::const_iterator n = ns.begin(); n != ns.end(); ++n ) {
         size_t ni = findVar( *n );
index f565133..185d868 100644 (file)
@@ -29,9 +29,6 @@ using namespace std;
 using boost::shared_ptr;
 
 
-const char *CBP::Name = "CBP";
-
-
 /// Given a sorted vector of states \a xis and total state count \a n_states, return a vector of states not in \a xis
 vector<size_t> complement( vector<size_t> &xis, size_t n_states ) {
     vector<size_t> cmp_xis( 0 );
index dc9300f..91da27a 100644 (file)
@@ -17,9 +17,6 @@ namespace dai {
 using namespace std;
 
 
-const char *DecMAP::Name = "DECMAP";
-
-
 void DecMAP::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("ianame") );
     DAI_ASSERT( opts.hasKey("iaopts") );
@@ -66,11 +63,6 @@ DecMAP::DecMAP( const FactorGraph& fg, const PropertySet& opts ) : DAIAlgFG(fg),
 }
 
 
-string DecMAP::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 Factor DecMAP::belief( const VarSet& vs ) const {
     if( vs.size() == 0 )
         return Factor();
index 97a1a9c..d6f5fb8 100644 (file)
@@ -19,9 +19,6 @@ namespace dai {
 using namespace std;
 
 
-const char *ExactInf::Name = "EXACT";
-
-
 void ExactInf::setProperties( const PropertySet &opts ) {
     if( opts.hasKey("verbose") )
         props.verbose = opts.getStringAs<size_t>("verbose");
@@ -141,9 +138,4 @@ Factor ExactInf::belief( const VarSet &ns ) const {
 }
 
 
-string ExactInf::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 } // end of namespace dai
index 979dda7..ea919b1 100644 (file)
@@ -21,14 +21,6 @@ namespace dai {
 using namespace std;
 
 
-const char *FBP::Name = "FBP";
-
-
-string FBP::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 // This code has been copied from bp.cpp, except where comments indicate FBP-specific behaviour
 Real FBP::logZ() const {
     Real sum = 0.0;
index 0ce37d2..703ee83 100644 (file)
@@ -25,9 +25,6 @@ namespace dai {
 using namespace std;
 
 
-const char *Gibbs::Name = "GIBBS";
-
-
 void Gibbs::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("maxiter") );
     props.maxiter = opts.getStringAs<size_t>("maxiter");
@@ -213,7 +210,7 @@ Real Gibbs::run() {
     }
 
     if( props.verbose >= 3 )
-        cerr << Name << "::run:  ran " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
+        cerr << name() << "::run:  ran " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
 
     if( _iters == 0 )
         return INFINITY;
index 924be17..4ff18f2 100644 (file)
@@ -21,9 +21,6 @@ namespace dai {
 using namespace std;
 
 
-const char *HAK::Name = "HAK";
-
-
 /// Sets factor entries that lie between 0 and \a epsilon to \a epsilon
 template <class T>
 TFactor<T>& makePositive( TFactor<T> &f, T epsilon ) {
@@ -195,7 +192,7 @@ HAK::HAK(const FactorGraph & fg, const PropertySet &opts) : DAIAlgRG(), _Qa(), _
         for( set<VarSet>::const_iterator c = scl.begin(); c != scl.end(); c++ )
             cl.push_back(*c);
         if( props.verbose >= 3 ) {
-            cerr << Name << " uses the following clusters: " << endl;
+            cerr << name() << " uses the following clusters: " << endl;
             for( vector<VarSet>::const_iterator cli = cl.begin(); cli != cl.end(); cli++ )
                 cerr << *cli << endl;
         }
@@ -265,12 +262,7 @@ HAK::HAK(const FactorGraph & fg, const PropertySet &opts) : DAIAlgRG(), _Qa(), _
     construct();
 
     if( props.verbose >= 3 )
-        cerr << Name << " regiongraph: " << *this << endl;
-}
-
-
-string HAK::identify() const {
-    return string(Name) + printProperties();
+        cerr << name() << " regiongraph: " << *this << endl;
 }
 
 
@@ -387,7 +379,7 @@ Real HAK::doGBP() {
             Qb_new.normalize();
             if( Qb_new.hasNaNs() ) {
                 // TODO: WHAT TO DO IN THIS CASE?
-                cerr << Name << "::doGBP:  Qb_new has NaNs!" << endl;
+                cerr << name() << "::doGBP:  Qb_new has NaNs!" << endl;
                 return 1.0;
             }
             /* TODO: WHAT IS THE PURPOSE OF THE FOLLOWING CODE?
@@ -416,7 +408,7 @@ Real HAK::doGBP() {
                 Qa_new ^= (1.0 / OR(alpha).c());
                 Qa_new.normalize();
                 if( Qa_new.hasNaNs() ) {
-                    cerr << Name << "::doGBP:  Qa_new has NaNs!" << endl;
+                    cerr << name() << "::doGBP:  Qa_new has NaNs!" << endl;
                     return 1.0;
                 }
                 /* TODO: WHAT IS THE PURPOSE OF THE FOLLOWING CODE?
@@ -446,7 +438,7 @@ Real HAK::doGBP() {
         }
 
         if( props.verbose >= 3 )
-            cerr << Name << "::doGBP:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
+            cerr << name() << "::doGBP:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
     if( maxDiff > _maxdiff )
@@ -456,10 +448,10 @@ Real HAK::doGBP() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::doGBP:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+            cerr << name() << "::doGBP:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 2 )
-                cerr << Name << "::doGBP:  ";
+                cerr << name() << "::doGBP:  ";
             cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
@@ -537,7 +529,7 @@ Real HAK::doDoubleLoop() {
         total_iter += Iterations();
 
         if( props.verbose >= 3 )
-            cerr << Name << "::doDoubleLoop:  maxdiff " << maxDiff << " after " << total_iter << " passes" << endl;
+            cerr << name() << "::doDoubleLoop:  maxdiff " << maxDiff << " after " << total_iter << " passes" << endl;
     }
 
     // restore _maxiter, _verbose and _maxdiff
@@ -560,10 +552,10 @@ Real HAK::doDoubleLoop() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::doDoubleLoop:  WARNING: not converged after " << total_iter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+                cerr << name() << "::doDoubleLoop:  WARNING: not converged after " << total_iter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
             } else {
                 if( props.verbose >= 3 )
-                    cerr << Name << "::doDoubleLoop:  ";
+                    cerr << name() << "::doDoubleLoop:  ";
                 cerr << "converged in " << total_iter << " passes (" << toc() - tic << " seconds)." << endl;
             }
         }
index b71e62a..d2253bb 100644 (file)
@@ -19,9 +19,6 @@ namespace dai {
 using namespace std;
 
 
-const char *JTree::Name = "JTREE";
-
-
 void JTree::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("updates") );
 
@@ -225,11 +222,6 @@ void JTree::GenerateJT( const FactorGraph &fg, const std::vector<VarSet> &cl ) {
 }
 
 
-string JTree::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 Factor JTree::belief( const VarSet &vs ) const {
     vector<Factor>::const_iterator beta;
     for( beta = Qb.begin(); beta != Qb.end(); beta++ )
index 09034e9..0226319 100644 (file)
@@ -24,9 +24,6 @@ namespace dai {
 using namespace std;
 
 
-const char *LC::Name = "LC";
-
-
 void LC::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("tol") );
     DAI_ASSERT( opts.hasKey("maxiter") );
@@ -111,11 +108,6 @@ LC::LC( const FactorGraph & fg, const PropertySet &opts ) : DAIAlgFG(fg), _panca
 }
 
 
-string LC::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 void LC::CalcBelief (size_t i) {
     _beliefs[i] = _pancakes[i].marginal(var(i));
 }
@@ -171,7 +163,7 @@ Real LC::InitCavityDists( const std::string &name, const PropertySet &opts ) {
     double tic = toc();
 
     if( props.verbose >= 1 ) {
-        cerr << Name << "::InitCavityDists:  ";
+        cerr << this->name() << "::InitCavityDists:  ";
         if( props.cavity == Properties::CavityType::UNIFORM )
             cerr << "Using uniform initial cavity distributions" << endl;
         else if( props.cavity == Properties::CavityType::FULL )
@@ -190,7 +182,7 @@ Real LC::InitCavityDists( const std::string &name, const PropertySet &opts ) {
     }
 
     if( props.verbose >= 1 ) {
-        cerr << Name << "::InitCavityDists used " << toc() - tic << " seconds." << endl;
+        cerr << this->name() << "::InitCavityDists used " << toc() - tic << " seconds." << endl;
     }
 
     return maxdiff;
@@ -199,7 +191,7 @@ Real LC::InitCavityDists( const std::string &name, const PropertySet &opts ) {
 
 long LC::SetCavityDists( std::vector<Factor> &Q ) {
     if( props.verbose >= 1 )
-        cerr << Name << "::SetCavityDists:  Setting initial cavity distributions" << endl;
+        cerr << name() << "::SetCavityDists:  Setting initial cavity distributions" << endl;
     if( Q.size() != nrVars() )
         return -1;
     for( size_t i = 0; i < nrVars(); i++ ) {
@@ -245,7 +237,7 @@ Factor LC::NewPancake (size_t i, size_t _I, bool & hasNaNs) {
     piet.normalize();
 
     if( piet.hasNaNs() ) {
-        cerr << Name << "::NewPancake(" << i << ", " << _I << "):  has NaNs!" << endl;
+        cerr << name() << "::NewPancake(" << i << ", " << _I << "):  has NaNs!" << endl;
         hasNaNs = true;
     }
 
@@ -290,7 +282,7 @@ Real LC::run() {
             break;
         }
     if( hasNaNs ) {
-        cerr << Name << "::run:  initial _pancakes has NaNs!" << endl;
+        cerr << name() << "::run:  initial _pancakes has NaNs!" << endl;
         return 1.0;
     }
 
@@ -326,7 +318,7 @@ Real LC::run() {
         }
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
+            cerr << name() << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
     if( maxDiff > _maxdiff )
@@ -336,10 +328,10 @@ Real LC::run() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-                cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+                cerr << name() << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 2 )
-                cerr << Name << "::run:  ";
+                cerr << name() << "::run:  ";
                 cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
index 0fb5ada..803d42d 100644 (file)
@@ -126,11 +126,11 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[] ) {
 
     if( nlhs >= 6 ) {
         std::vector<std::size_t> map_state;
-        if( obj->identify() == "BP" ) {
+        if( obj->name() == "BP" ) {
             BP* obj_bp = dynamic_cast<BP *>(obj);
             DAI_ASSERT( obj_bp != 0 );
             map_state = obj_bp->findMaximum();
-        } else if( obj->identify() == "JTREE" ) {
+        } else if( obj->name() == "JTree" ) {
             JTree* obj_jtree = dynamic_cast<JTree *>(obj);
             DAI_ASSERT( obj_jtree != 0 );
             map_state = obj_jtree->findMaximum();
index d2be915..42ede4a 100644 (file)
@@ -23,9 +23,6 @@ namespace dai {
 using namespace std;
 
 
-const char *MF::Name = "MF";
-
-
 void MF::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("tol") );
     DAI_ASSERT( opts.hasKey("maxiter") );
@@ -85,11 +82,6 @@ void MF::construct() {
 }
 
 
-string MF::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 void MF::init() {
     if( props.init == Properties::InitType::UNIFORM )
         for( size_t i = 0; i < nrVars(); i++ )
@@ -143,7 +135,7 @@ Real MF::run() {
             Factor nb = calcNewBelief( i );
 
             if( nb.hasNaNs() ) {
-                cerr << Name << "::run():  ERROR: new belief of variable " << var(i) << " has NaNs!" << endl;
+                cerr << name() << "::run():  ERROR: new belief of variable " << var(i) << " has NaNs!" << endl;
                 return 1.0;
             }
 
@@ -155,7 +147,7 @@ Real MF::run() {
         }
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
+            cerr << name() << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
     if( maxDiff > _maxdiff )
@@ -165,10 +157,10 @@ Real MF::run() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+            cerr << name() << "::run:  WARNING: not converged within " << props.maxiter << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 3 )
-                cerr << Name << "::run:  ";
+                cerr << name() << "::run:  ";
             cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
index e25599d..56ec8bd 100644 (file)
@@ -27,9 +27,6 @@ namespace dai {
 using namespace std;
 
 
-const char *MR::Name = "MR";
-
-
 void MR::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("tol") );
     DAI_ASSERT( opts.hasKey("updates") );
@@ -346,11 +343,6 @@ Real MR::calcCavityCorrelations() {
 }
 
 
-string MR::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 Real MR::run() {
     if( supported ) {
         if( props.verbose >= 1 )
@@ -370,7 +362,7 @@ Real MR::run() {
         calcMagnetizations();
 
         if( props.verbose >= 1 )
-            cerr << Name << " needed " << toc() - tic << " seconds." << endl;
+            cerr << name() << " needed " << toc() - tic << " seconds." << endl;
 
         return _maxdiff;
     } else
index 7a1246a..eea46a2 100644 (file)
@@ -23,9 +23,6 @@ namespace dai {
 using namespace std;
 
 
-const char *TreeEP::Name = "TREEEP";
-
-
 void TreeEP::setProperties( const PropertySet &opts ) {
     DAI_ASSERT( opts.hasKey("tol") );
     DAI_ASSERT( opts.hasKey("type") );
@@ -179,11 +176,6 @@ void TreeEP::construct( const FactorGraph& fg, const RootedTree& tree ) {
 }
 
 
-string TreeEP::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 void TreeEP::init() {
     runHUGIN();
 
@@ -223,7 +215,7 @@ Real TreeEP::run() {
         swap( newBeliefs, oldBeliefs );
 
         if( props.verbose >= 3 )
-            cerr << Name << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
+            cerr << name() << "::run:  maxdiff " << maxDiff << " after " << _iters+1 << " passes" << endl;
     }
 
     if( maxDiff > _maxdiff )
@@ -233,10 +225,10 @@ Real TreeEP::run() {
         if( maxDiff > props.tol ) {
             if( props.verbose == 1 )
                 cerr << endl;
-            cerr << Name << "::run:  WARNING: not converged after " << _iters << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
+            cerr << name() << "::run:  WARNING: not converged after " << _iters << " passes (" << toc() - tic << " seconds)...final maxdiff:" << maxDiff << endl;
         } else {
             if( props.verbose >= 3 )
-                cerr << Name << "::run:  ";
+                cerr << name() << "::run:  ";
             cerr << "converged in " << _iters << " passes (" << toc() - tic << " seconds)." << endl;
         }
     }
index 17041a4..7c3d421 100644 (file)
@@ -20,9 +20,6 @@ namespace dai {
 using namespace std;
 
 
-const char *TRWBP::Name = "TRWBP";
-
-
 void TRWBP::setProperties( const PropertySet &opts ) {
     BP::setProperties( opts );
 
@@ -50,11 +47,6 @@ string TRWBP::printProperties() const {
 }
 
 
-string TRWBP::identify() const {
-    return string(Name) + printProperties();
-}
-
-
 // This code has been copied from bp.cpp, except where comments indicate TRWBP-specific behaviour
 Real TRWBP::logZ() const {
     Real sum = 0.0;
index a052b26..30f4177 100644 (file)
@@ -330,14 +330,6 @@ int main( int argc, char *argv[] ) {
             // Parse method
             pair<string, PropertySet> meth = parseNameProperties( methods[m], Aliases );
 
-            // Check whether name is valid
-            size_t n = 0;
-            for( ; strlen( DAINames[n] ) != 0; n++ )
-                if( meth.first == DAINames[n] )
-                    break;
-            if( strlen( DAINames[n] ) == 0 )
-                DAI_THROWE(UNKNOWN_DAI_ALGORITHM,string("Unknown DAI algorithm \"") + meth.first + string("\" in \"") + methods[m] + string("\""));
-
             // Construct object for running the method
             TestDAI testdai(fg, meth.first, meth.second );