- Solved the proliferation of type checks for different DAI_ENUM's in properties.cpp
authorJoris Mooij <jorism@marvin.jorismooij.nl>
Wed, 24 Sep 2008 08:23:28 +0000 (10:23 +0200)
committerJoris Mooij <jorism@marvin.jorismooij.nl>
Wed, 24 Sep 2008 08:23:28 +0000 (10:23 +0200)
The most elegant solution would be to adapt boost::any such that it can
stream a held object to an output stream if the object is streamable.
However, this would require surgery in boost::any (see
http://lists.boost.org/MailArchives/boost/msg78317.php for a discussion
of how to do this), which I consider to be an important disadvantage.

Another possible solution would be to replace boost::any by some class
hierarchy and to store properties as pointers to the base property
class, using inheritance based polymorphism to allow different types of
properties. The main disadvantage of this solution is that a lot of
boiler-plate code has to be written.

The current solution is the addition of a printProperties() method to
each class, which outputs its Props to a std::string. This is used by
the identify() method. The main disadvantage of this method is, that it
requires yet another explicit enumeration of all properties in the code,
which makes maintenance yet more costly. However, this solution is
consistent with the approach of using individual Props structures
instead of a PropertySet object.

18 files changed:
include/dai/bp.h
include/dai/exactinf.h
include/dai/hak.h
include/dai/jtree.h
include/dai/lc.h
include/dai/mf.h
include/dai/mr.h
include/dai/properties.h
include/dai/treeep.h
src/bp.cpp
src/exactinf.cpp
src/hak.cpp
src/jtree.cpp
src/lc.cpp
src/mf.cpp
src/mr.cpp
src/properties.cpp
src/treeep.cpp

index cfb7a15..61981f2 100644 (file)
@@ -106,8 +106,10 @@ class BP : public DAIAlgFG {
         void init( const VarSet &ns );
         void undoProbs( const VarSet &ns ) { FactorGraph::undoProbs(ns); init(ns); }
 
+        /// Set Props according to the PropertySet opts, where the values can be stored as std::strings or as the type of the corresponding Props member
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 };
 
index ca21ce4..3c398dd 100644 (file)
@@ -120,6 +120,7 @@ class ExactInf : public DAIAlgFG {
         void undoProbs( const VarSet &ns ) { FactorGraph::undoProbs(ns); init(ns); }
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
 
         Factor beliefV( size_t i ) const { 
             return _beliefsV[i]; 
index d3f2cde..b782fd9 100644 (file)
@@ -104,6 +104,7 @@ class HAK : public DAIAlgRG {
         void undoProbs( const VarSet &ns ) { RegionGraph::undoProbs( ns ); init( ns ); }
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 
     private:
index 12f4fef..5517865 100644 (file)
@@ -93,6 +93,7 @@ class JTree : public DAIAlgRG {
         Factor calcMarginal( const VarSet& ns );
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return 0.0; }
 };
 
index 354e52b..422f6f1 100644 (file)
@@ -121,6 +121,7 @@ class LC : public DAIAlgFG {
         }
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 };
 
index 2befe07..c5ae9b6 100644 (file)
@@ -81,6 +81,7 @@ class MF : public DAIAlgFG {
         void undoProbs( const VarSet &ns ) { FactorGraph::undoProbs(ns); init(ns); }
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 };
 
index f7c9941..2c09295 100644 (file)
@@ -106,6 +106,7 @@ class MR : public DAIAlgFG {
 
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 }; 
 
index 1399ca9..0bbe2ba 100644 (file)
@@ -88,7 +88,7 @@ class PropertySet : public std::map<PropertyKey, PropertyValue> {
             }
         }
 
-        /// Converts a property from string to ValueType, if necessary
+        /// Converts a property from string to ValueType (if necessary)
         template<typename ValueType>
         ValueType getStringAs(const PropertyKey &key) const { 
             PropertyValue val = Get(key);
@@ -104,6 +104,18 @@ class PropertySet : public std::map<PropertyKey, PropertyValue> {
                 assert( 0 == 1 );
         }
 
+        /// Converts a property from ValueType to string (if necessary)
+        template<typename ValueType>
+        PropertySet & setAsString(const PropertyKey &key, ValueType &val) { 
+            if( val.type() == typeid(std::string) ) {
+                return Set(key, val);
+            } else {
+                std::stringstream ss (std::stringstream::out);
+                ss << val;
+                return Set(key, ss.str());
+            }
+        }
+
         /// Shorthand for (temporarily) adding properties, e.g. PropertySet p()("method","BP")("verbose",1)("tol",1e-9)
         PropertySet operator()(const PropertyKey &key, const PropertyValue &val) const { PropertySet copy = *this; return copy.Set(key,val); }
 
index 482534f..4080644 100644 (file)
@@ -132,6 +132,7 @@ class TreeEP : public JTree {
 
         void setProperties( const PropertySet &opts );
         PropertySet getProperties() const;
+        std::string printProperties() const;
         double maxDiff() const { return maxdiff; }
 };
 
index 0352565..79d5919 100644 (file)
@@ -65,6 +65,18 @@ PropertySet BP::getProperties() const {
 }
 
 
+string BP::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "maxiter=" << props.maxiter << ",";
+    s << "verbose=" << props.verbose << ",";
+    s << "logdomain=" << props.logdomain << ",";
+    s << "updates=" << props.updates << "]";
+    return s.str();
+}
+
+
 void BP::create() {
     // create edge properties
     edges.clear();
@@ -404,9 +416,7 @@ Real BP::logZ() const {
 
 
 string BP::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index 96ae3e8..d6c59eb 100644 (file)
@@ -46,6 +46,14 @@ PropertySet ExactInf::getProperties() const {
 }
 
 
+string ExactInf::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "verbose=" << props.verbose << "]";
+    return s.str();
+}
+
+
 void ExactInf::create() {
     // clear variable beliefs and reserve space
     _beliefsV.clear();
@@ -115,9 +123,7 @@ Factor ExactInf::belief( const VarSet &ns ) const {
 
 
 string ExactInf::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index 49903b8..dd57706 100644 (file)
@@ -67,6 +67,19 @@ PropertySet HAK::getProperties() const {
 }
 
 
+string HAK::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "maxiter=" << props.maxiter << ",";
+    s << "verbose=" << props.verbose << ",";
+    s << "doubleloop=" << props.doubleloop << ",";
+    s << "clusters=" << props.clusters << ",";
+    s << "loopdepth=" << props.loopdepth << "]";
+    return s.str();
+}
+
+
 void HAK::constructMessages() {
     // Create outer beliefs
     _Qa.clear();
@@ -154,9 +167,7 @@ HAK::HAK(const FactorGraph & fg, const PropertySet &opts) : DAIAlgRG(), props(),
 
 
 string HAK::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index 23be664..558e367 100644 (file)
@@ -49,6 +49,15 @@ PropertySet JTree::getProperties() const {
 }
 
 
+string JTree::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "verbose=" << props.verbose << ",";
+    s << "updates=" << props.updates << "]";
+    return s.str();
+}
+
+
 JTree::JTree( const FactorGraph &fg, const PropertySet &opts, bool automatic ) : DAIAlgRG(fg), _RTree(), _Qa(), _Qb(), _mes(), _logZ(), props() {
     setProperties( opts );
 
@@ -156,9 +165,7 @@ void JTree::GenerateJT( const std::vector<VarSet> &Cliques ) {
 
 
 string JTree::identify() const {
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index d8da46c..f13dead 100644 (file)
@@ -74,6 +74,21 @@ PropertySet LC::getProperties() const {
 }
 
 
+string LC::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "maxiter=" << props.maxiter << ",";
+    s << "verbose=" << props.verbose << ",";
+    s << "cavity=" << props.cavity << ",";
+    s << "updates=" << props.updates << ",";
+    s << "cavainame=" << props.cavainame << ",";
+    s << "cavaiopts=" << props.cavaiopts << ",";
+    s << "reinit=" << props.reinit << "]";
+    return s.str();
+}
+
+
 LC::LC( const FactorGraph & fg, const PropertySet &opts ) : DAIAlgFG(fg), _pancakes(), _cavitydists(), _phis(), _beliefs(), props(), maxdiff(0.0) {
     setProperties( opts );
 
@@ -100,9 +115,7 @@ LC::LC( const FactorGraph & fg, const PropertySet &opts ) : DAIAlgFG(fg), _panca
 
 
 string LC::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index efb4308..582bd57 100644 (file)
@@ -57,6 +57,16 @@ PropertySet MF::getProperties() const {
 }
 
 
+string MF::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "maxiter=" << props.maxiter << ",";
+    s << "verbose=" << props.verbose << "]";
+    return s.str();
+}
+
+
 void MF::create() {
     // clear beliefs
     _beliefs.clear();
@@ -69,9 +79,7 @@ void MF::create() {
 
 
 string MF::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index c42d89e..0daab37 100644 (file)
@@ -62,6 +62,17 @@ PropertySet MR::getProperties() const {
 }
 
 
+string MR::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "verbose=" << props.verbose << ",";
+    s << "updates=" << props.updates << ",";
+    s << "inits=" << props.inits << "]";
+    return s.str();
+}
+
+
 // init N, con, nb, tJ, theta
 void MR::init(size_t Nin, double *_w, double *_th) {
     size_t i,j;
@@ -521,9 +532,7 @@ void MR::init_cor() {
 
 
 string MR::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
index d62d6d5..9166b32 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <iostream>
 #include <dai/properties.h>
-#include <dai/alldai.h>
 #include <dai/exceptions.h>
 
 
@@ -41,34 +40,6 @@ std::ostream& operator<< (std::ostream & os, const Property & p) {
         os << boost::any_cast<bool>(p.second);
     else if( p.second.type() == typeid(PropertySet) )
         os << boost::any_cast<PropertySet>(p.second);
-#ifdef WITH_BP
-    else if( p.second.type() == typeid(BP::Properties::UpdateType) )
-        os << boost::any_cast<BP::Properties::UpdateType>(p.second);
-#endif
-#ifdef WITH_HAK
-    else if( p.second.type() == typeid(HAK::Properties::ClustersType) )
-        os << boost::any_cast<HAK::Properties::ClustersType>(p.second);
-#endif
-#ifdef WITH_JTREE
-    else if( p.second.type() == typeid(JTree::Properties::UpdateType) )
-        os << boost::any_cast<JTree::Properties::UpdateType>(p.second);
-#endif
-#ifdef WITH_MR
-    else if( p.second.type() == typeid(MR::Properties::UpdateType) )
-        os << boost::any_cast<MR::Properties::UpdateType>(p.second);
-    else if( p.second.type() == typeid(MR::Properties::InitType) )
-        os << boost::any_cast<MR::Properties::InitType>(p.second);
-#endif
-#ifdef WITH_TREEEP
-    else if( p.second.type() == typeid(TreeEP::Properties::TypeType) )
-        os << boost::any_cast<TreeEP::Properties::TypeType>(p.second);
-#endif
-#ifdef WITH_LC
-    else if( p.second.type() == typeid(LC::Properties::CavityType) )
-        os << boost::any_cast<LC::Properties::CavityType>(p.second);
-    else if( p.second.type() == typeid(LC::Properties::UpdateType) )
-        os << boost::any_cast<LC::Properties::UpdateType>(p.second);
-#endif
     else
         DAI_THROW(UNKNOWN_PROPERTY_TYPE);
     return( os );
index 6f5b797..a44007f 100644 (file)
@@ -60,6 +60,17 @@ PropertySet TreeEP::getProperties() const {
 }
 
 
+string TreeEP::printProperties() const {
+    stringstream s( stringstream::out );
+    s << "[";
+    s << "tol=" << props.tol << ",";
+    s << "maxiter=" << props.maxiter << ",";
+    s << "verbose=" << props.verbose << ",";
+    s << "type=" << props.type << "]";
+    return s.str();
+}
+
+
 TreeEPSubTree::TreeEPSubTree( const DEdgeVec &subRTree, const DEdgeVec &jt_RTree, const std::vector<Factor> &jt_Qa, const std::vector<Factor> &jt_Qb, const Factor *I ) : _Qa(), _Qb(), _RTree(), _a(), _b(), _I(I), _ns(), _nsrem(), _logZ(0.0) {
     _ns = _I->vars();
 
@@ -386,9 +397,7 @@ void TreeEP::ConstructRG( const DEdgeVec &tree ) {
 
 
 string TreeEP::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }