Cleanup of BBP code
[libdai.git] / include / dai / mr.h
index 707d4f6..39bf995 100644 (file)
@@ -1,6 +1,10 @@
-/*  Copyright (C) 2006-2008  Joris Mooij  [j dot mooij at science dot ru dot nl]
+/*  Copyright (C) 2006-2008  Joris Mooij  [joris dot mooij at tuebingen dot mpg dot de]
+    Radboud University Nijmegen, The Netherlands /
+    Max Planck Institute for Biological Cybernetics, Germany
+
+    Copyright (C) 2007  Bastian Wemmenhove
     Radboud University Nijmegen, The Netherlands
-    
+
     This file is part of libDAI.
 
     libDAI is free software; you can redistribute it and/or modify
 */
 
 
+/// \file
+/// \brief Defines class MR
+/// \todo Improve documentation
+
+
 #ifndef __defined_libdai_mr_h
 #define __defined_libdai_mr_h
 
 #include <dai/factorgraph.h>
 #include <dai/daialg.h>
 #include <dai/enum.h>
+#include <dai/properties.h>
+#include <dai/exceptions.h>
+#include <boost/dynamic_bitset.hpp>
 
 
 namespace dai {
 
 
-class sub_nb;
-
-
+/// Approximate inference algorithm by Montanari and Rizzo
 class MR : public DAIAlgFG {
     private:
         bool supported;                                            // is the underlying factor graph supported?
@@ -49,34 +59,77 @@ class MR : public DAIAlgFG {
         std::vector<std::vector<std::vector<double> > > cors;
     
         static const size_t kmax = 31;
+        typedef boost::dynamic_bitset<> sub_nb;
         
         size_t N;
 
         std::vector<double> Mag;
 
+        double _maxdiff;
+        size_t _iters;
+
     public:
-        ENUM2(UpdateType,FULL,LINEAR)
-        ENUM3(InitType,RESPPROP,CLAMPING,EXACT)
+        /// Parameters of this inference algorithm
+        struct Properties {
+            /// Enumeration of different types of update equations
+            DAI_ENUM(UpdateType,FULL,LINEAR);
 
-        UpdateType Updates() const { return GetPropertyAs<UpdateType>("updates"); }
-        InitType Inits() const { return GetPropertyAs<InitType>("inits"); }
+            /// Enumeration of different ways of initializing the cavity correlations
+            DAI_ENUM(InitType,RESPPROP,CLAMPING,EXACT);
 
-        MR( const FactorGraph & fg, const Properties &opts );
-        void init(size_t _N, double *_w, double *_th);
+            /// Verbosity
+            size_t verbose;
+
+            /// Tolerance
+            double tol;
+
+            /// Update equations
+            UpdateType updates;
+
+            /// How to initialize the cavity correlations
+            InitType inits;
+        } props;
+
+        /// Name of this inference method
+        static const char *Name;
+
+    public:
+        /// Default constructor
+        MR() : DAIAlgFG(), supported(), con(), nb(), tJ(), theta(), M(), kindex(), cors(), N(), Mag(), _maxdiff(), _iters(), props() {}
+
+        /// Construct from FactorGraph fg and PropertySet opts
+        MR( const FactorGraph &fg, const PropertySet &opts );
+
+
+        /// @name General InfAlg interface
+        //@{
+        virtual MR* clone() const { return new MR(*this); }
+        virtual MR* create() const { return new MR(); }
+        virtual std::string identify() const;
+        virtual Factor belief( const Var &n ) const;
+        virtual Factor belief( const VarSet &/*ns*/ ) const { DAI_THROW(NOT_IMPLEMENTED); return Factor(); }
+        virtual std::vector<Factor> beliefs() const;
+        virtual Real logZ() const { DAI_THROW(NOT_IMPLEMENTED); return 0.0; }
+        virtual void init() {}
+        virtual void init( const VarSet &/*ns*/ ) { DAI_THROW(NOT_IMPLEMENTED); }
+        virtual double run();
+        virtual double maxDiff() const { return _maxdiff; }
+        virtual size_t Iterations() const { return _iters; }
+        //@}
+
+
+        /// @name Additional interface specific for MR
+        //@{ 
+        //@}
+        
+    private:
+        void init(size_t Nin, double *_w, double *_th);
         void makekindex();
-        void read_files();
         void init_cor();
         double init_cor_resp();
         void solvemcav();
         void solveM();
-        double run();
-        Factor belief( const Var &n ) const;
-        Factor belief( const VarSet &/*ns*/ ) const { assert( 0 == 1 ); }
-        std::vector<Factor> beliefs() const;
-        Complex logZ() const { return NAN; }
-        void init() { assert( checkProperties() ); }
-        static const char *Name;
-        std::string identify() const;
+
         double _tJ(size_t i, sub_nb A);
 
         double Omega(size_t i, size_t _j, size_t _l);
@@ -89,126 +142,11 @@ class MR : public DAIAlgFG {
         void sum_subs(size_t j, sub_nb A, double *sum_even, double *sum_odd);
 
         double sign(double a) { return (a >= 0) ? 1.0 : -1.0; }
-        MR* clone() const { assert( 0 == 1 ); }
-
-        bool checkProperties();
-
-}; 
-
-
-// represents a subset of nb[i] as a binary number
-// the elements of a subset should be thought of as indices in nb[i]
-class sub_nb {
-    private:
-        size_t s;
-        size_t bits;
-    
-    public:
-        // construct full subset containing nr_elmt elements
-        sub_nb(size_t nr_elmt) {
-#ifdef DEBUG
-            assert( nr_elmt < sizeof(size_t) / sizeof(char) * 8 );
-#endif
-            bits = nr_elmt;
-            s = (1U << bits) - 1;
-        }
-
-        // copy constructor
-        sub_nb( const sub_nb & x ) : s(x.s), bits(x.bits) {}
-
-        // assignment operator 
-        sub_nb & operator=( const sub_nb &x ) {
-            if( this != &x ) {
-                s = x.s;
-                bits = x.bits;
-            }
-            return *this;
-        }
-
-        // returns number of elements
-        size_t size() {
-            size_t size = 0;
-            for(size_t bit = 0; bit < bits; bit++)
-                if( s & (1U << bit) )
-                    size++;
-            return size;
-        }
-
-        // increases s by one (for enumeration in lexicographical order)
-        sub_nb operator++() { 
-            s++; 
-            if( s >= (1U << bits) )
-                s = 0;
-            return *this; 
-        }
         
-        // return i'th element of this subset
-        size_t operator[](size_t i) { 
-            size_t bit;
-            for(bit = 0; bit < bits; bit++ )
-                if( s & (1U << bit) ) {
-                    if( i == 0 )
-                        break;
-                    else
-                        i--;
-                }
-#ifdef DEBUG
-            assert( bit < bits );
-#endif
-            return bit;
-        }
-
-        // add index _j to this subset
-        sub_nb &operator +=(size_t _j) {
-            s |= (1U << _j); 
-            return *this;
-        }
-
-        // return copy with index _j
-        sub_nb operator+(size_t _j) {
-            sub_nb x = *this;
-            x += _j;
-            return x;
-        }
-
-        // delete index _j from this subset
-        sub_nb &operator -=(size_t _j) {
-            s &= ~(1U << _j); 
-            return *this;
-        }
-
-        // return copy without index _j
-        sub_nb operator-(size_t _j) {
-            sub_nb x = *this;
-            x -= _j;
-            return x;
-        }
-
-        // empty this subset
-        sub_nb & clear() {
-            s = 0;
-            return *this;
-        }
-
-        // returns true if subset is empty
-        bool empty() { return (s == 0); }
-
-        // return 1 if _j is contained, 0 otherwise ("is element of")
-        size_t operator&(size_t _j) { return s & (1U << _j); }
-
-        friend std::ostream& operator<< (std::ostream& os, const sub_nb x) {
-            if( x.bits == 0 )
-                os << "empty";
-            else {
-                for(size_t bit = x.bits; bit > 0; bit-- )
-                    if( x.s & (1U << (bit-1)) )
-                        os << "1";
-                    else
-                        os << "0";
-            }
-            return os;
-        }
-};
+        void setProperties( const PropertySet &opts );
+        PropertySet getProperties() const;
+        std::string printProperties() const;
+}; 
 
 
 } // end of namespace dai