Merged regiongraph.* and daialg.* from SVN head,
[libdai.git] / include / dai / treeep.h
index edef1ce..9120085 100644 (file)
@@ -32,6 +32,7 @@
 #include <dai/clustergraph.h>
 #include <dai/weightedgraph.h>
 #include <dai/jtree.h>
 #include <dai/clustergraph.h>
 #include <dai/weightedgraph.h>
 #include <dai/jtree.h>
+#include <dai/properties.h>
 #include <dai/enum.h>
 
 
 #include <dai/enum.h>
 
 
@@ -84,16 +85,27 @@ class TreeEP : public JTree {
         std::map<size_t, TreeEPSubTree>  _Q;
 
     public:
         std::map<size_t, TreeEPSubTree>  _Q;
 
     public:
-        ENUM2(TypeType,ORG,ALT)
-        TypeType Type() const { return GetPropertyAs<TypeType>("type"); }
-        
-        TreeEP() : JTree(), _Q() {};
-        TreeEP( const TreeEP& x ) : JTree(x), _Q(x._Q) {
+        struct Properties {
+            size_t verbose;
+            size_t maxiter;
+            double tol;
+            DAI_ENUM(TypeType,ORG,ALT)
+            TypeType type;
+        } props;
+        double maxdiff;
+
+    public:
+        /// Default constructor
+        TreeEP() : JTree(), _Q(), props(), maxdiff() {};
+        /// Copy constructor
+        TreeEP( const TreeEP& x ) : JTree(x), _Q(x._Q), props(x.props), maxdiff(x.maxdiff) {
             for( size_t I = 0; I < nrFactors(); I++ )
                 if( offtree( I ) )
                     _Q[I].I() = &factor(I);
         }
         TreeEP* clone() const { return new TreeEP(*this); }
             for( size_t I = 0; I < nrFactors(); I++ )
                 if( offtree( I ) )
                     _Q[I].I() = &factor(I);
         }
         TreeEP* clone() const { return new TreeEP(*this); }
+        /// Create (virtual constructor)
+        virtual TreeEP* create() const { return new TreeEP(); }
         TreeEP & operator=( const TreeEP& x ) {
             if( this != &x ) {
                 JTree::operator=(x);
         TreeEP & operator=( const TreeEP& x ) {
             if( this != &x ) {
                 JTree::operator=(x);
@@ -101,23 +113,30 @@ class TreeEP : public JTree {
                 for( size_t I = 0; I < nrFactors(); I++ )
                     if( offtree( I ) )
                         _Q[I].I() = &factor(I);
                 for( size_t I = 0; I < nrFactors(); I++ )
                     if( offtree( I ) )
                         _Q[I].I() = &factor(I);
+                props = x.props;
+                maxdiff = x.maxdiff;
             }
             return *this;
         }
             }
             return *this;
         }
-        TreeEP( const FactorGraph &fg, const Properties &opts );
+        TreeEP( const FactorGraph &fg, const PropertySet &opts );
         void ConstructRG( const DEdgeVec &tree );
 
         static const char *Name;
         std::string identify() const;
         void init();
         void ConstructRG( const DEdgeVec &tree );
 
         static const char *Name;
         std::string identify() const;
         void init();
+        /// Clear messages and beliefs corresponding to the nodes in ns
+        virtual void init( const VarSet &/*ns*/ ) { init(); }
         double run();
         Real logZ() const;
 
         bool offtree( size_t I ) const { return (fac2OR[I] == -1U); }
 
         double run();
         Real logZ() const;
 
         bool offtree( size_t I ) const { return (fac2OR[I] == -1U); }
 
-        void init( const VarSet &/*ns*/ ) { init(); }
-        void undoProbs( const VarSet &ns ) { RegionGraph::undoProbs( ns ); init( ns ); }
-        bool checkProperties();
+        void restoreFactors( const VarSet &ns ) { RegionGraph::restoreFactors( ns ); init( ns ); }
+
+        void setProperties( const PropertySet &opts );
+        PropertySet getProperties() const;
+        std::string printProperties() const;
+        double maxDiff() const { return maxdiff; }
 };
 
 
 };