Merged SVN head ...
[libdai.git] / include / dai / daialg.h
index 5d3226e..1147b22 100644 (file)
@@ -38,11 +38,13 @@ namespace dai {
 /// together with an inference algorithm.
 class InfAlg {
     public:
 /// together with an inference algorithm.
 class InfAlg {
     public:
-        /// Clone (virtual copy constructor)
+        /// Clone *this (virtual copy constructor)
         virtual InfAlg* clone() const = 0;
 
         virtual InfAlg* clone() const = 0;
 
-        /// Virtual desctructor
-        // (this is needed because this class contains virtual functions)
+        /// Create (virtual default constructor)
+        virtual InfAlg* create() const = 0;
+        
+        /// Virtual desctructor (needed because this class contains virtual functions)
         virtual ~InfAlg() {}
         
         /// Identifies itself for logging purposes
         virtual ~InfAlg() {}
         
         /// Identifies itself for logging purposes
@@ -63,6 +65,9 @@ class InfAlg {
         /// Clear messages and beliefs
         virtual void init() = 0;
 
         /// Clear messages and beliefs
         virtual void init() = 0;
 
+        /// Clear messages and beliefs corresponding to the nodes in ns
+        virtual void init( const VarSet &ns ) = 0;
+
         /// The actual approximate inference algorithm
         virtual double run() = 0;
 
         /// The actual approximate inference algorithm
         virtual double run() = 0;
 
@@ -77,10 +82,10 @@ class InfAlg {
         virtual void restoreFactors( const VarSet &ns ) = 0;
 
         /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$)
         virtual void restoreFactors( const VarSet &ns ) = 0;
 
         /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$)
-        virtual void clamp( const Var & n, size_t i ) = 0;
+        virtual void clamp( const Var & n, size_t i, bool backup = false ) = 0;
 
         /// Set all factors interacting with var(i) to 1
 
         /// Set all factors interacting with var(i) to 1
-        virtual void makeCavity( size_t i ) = 0;
+        virtual void makeCavity( size_t i, bool backup = false ) = 0;
 
         /// Get reference to underlying FactorGraph
         virtual FactorGraph &fg() = 0;
 
         /// Get reference to underlying FactorGraph
         virtual FactorGraph &fg() = 0;
@@ -88,8 +93,11 @@ class InfAlg {
         /// Get const reference to underlying FactorGraph
         virtual const FactorGraph &fg() const = 0;
 
         /// Get const reference to underlying FactorGraph
         virtual const FactorGraph &fg() const = 0;
 
-        /// Return maximum difference between beliefs in the last pass
+        /// Return maximum difference between single node beliefs in the last pass
         virtual double maxDiff() const = 0;
         virtual double maxDiff() const = 0;
+
+        /// Return number of passes over the factorgraph
+        virtual size_t Iterations() const = 0;
 };
 
 
 };
 
 
@@ -105,6 +113,15 @@ class DAIAlg : public InfAlg, public T {
         /// Copy constructor
         DAIAlg( const DAIAlg & x ) : InfAlg(x), T(x) {}
 
         /// Copy constructor
         DAIAlg( const DAIAlg & x ) : InfAlg(x), T(x) {}
 
+        /// Assignment operator
+        DAIAlg & operator=( const DAIAlg &x ) {
+            if( this != &x ) {
+                InfAlg::operator=(x);
+                T::operator=(x);
+            }
+            return *this;
+        }
+
         /// Save factor I (using T::backupFactor)
         void backupFactor( size_t I ) { T::backupFactor( I ); }
         /// Save Factors involving ns (using T::backupFactors)
         /// Save factor I (using T::backupFactor)
         void backupFactor( size_t I ) { T::backupFactor( I ); }
         /// Save Factors involving ns (using T::backupFactors)
@@ -116,10 +133,10 @@ class DAIAlg : public InfAlg, public T {
         void restoreFactors( const VarSet &ns ) { T::restoreFactors( ns ); }
 
         /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$) (using T::clamp)
         void restoreFactors( const VarSet &ns ) { T::restoreFactors( ns ); }
 
         /// Clamp variable n to value i (i.e. multiply with a Kronecker delta \f$\delta_{x_n, i}\f$) (using T::clamp)
-        void clamp( const Var & n, size_t i ) { T::clamp( n, i ); }
+        void clamp( const Var & n, size_t i, bool backup = false ) { T::clamp( n, i, backup ); }
 
         /// Set all factors interacting with var(i) to 1 (using T::makeCavity)
 
         /// Set all factors interacting with var(i) to 1 (using T::makeCavity)
-        void makeCavity( size_t i ) { T::makeCavity( i ); }
+        void makeCavity( size_t i, bool backup = false ) { T::makeCavity( i, backup ); }
 
         /// Get reference to underlying FactorGraph
         FactorGraph &fg() { return (FactorGraph &)(*this); }
 
         /// Get reference to underlying FactorGraph
         FactorGraph &fg() { return (FactorGraph &)(*this); }