- Solved the proliferation of type checks for different DAI_ENUM's in properties.cpp
[libdai.git] / include / dai / mr.h
index 707d4f6..2c09295 100644 (file)
@@ -28,6 +28,8 @@
 #include <dai/factorgraph.h>
 #include <dai/daialg.h>
 #include <dai/enum.h>
+#include <dai/properties.h>
+#include <dai/exceptions.h>
 
 
 namespace dai {
@@ -55,14 +57,19 @@ class MR : public DAIAlgFG {
         std::vector<double> Mag;
 
     public:
-        ENUM2(UpdateType,FULL,LINEAR)
-        ENUM3(InitType,RESPPROP,CLAMPING,EXACT)
+        struct Properties {
+            size_t verbose;
+            double tol;
+            DAI_ENUM(UpdateType,FULL,LINEAR)
+            DAI_ENUM(InitType,RESPPROP,CLAMPING,EXACT)
+            UpdateType updates;
+            InitType inits;
+        } props;
+        double maxdiff;
 
-        UpdateType Updates() const { return GetPropertyAs<UpdateType>("updates"); }
-        InitType Inits() const { return GetPropertyAs<InitType>("inits"); }
-
-        MR( const FactorGraph & fg, const Properties &opts );
-        void init(size_t _N, double *_w, double *_th);
+    public:
+        MR( const FactorGraph & fg, const PropertySet &opts );
+        void init(size_t Nin, double *_w, double *_th);
         void makekindex();
         void read_files();
         void init_cor();
@@ -71,10 +78,16 @@ class MR : public DAIAlgFG {
         void solveM();
         double run();
         Factor belief( const Var &n ) const;
-        Factor belief( const VarSet &/*ns*/ ) const { assert( 0 == 1 ); }
+        Factor belief( const VarSet &/*ns*/ ) const { 
+            DAI_THROW(NOT_IMPLEMENTED);
+            return Factor(); 
+        }
         std::vector<Factor> beliefs() const;
-        Complex logZ() const { return NAN; }
-        void init() { assert( checkProperties() ); }
+        Real logZ() const { 
+            DAI_THROW(NOT_IMPLEMENTED);
+            return 0.0; 
+        }
+        void init() {}
         static const char *Name;
         std::string identify() const;
         double _tJ(size_t i, sub_nb A);
@@ -89,10 +102,12 @@ 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();
+        MR* clone() const { return new MR(*this); }
 
+        void setProperties( const PropertySet &opts );
+        PropertySet getProperties() const;
+        std::string printProperties() const;
+        double maxDiff() const { return maxdiff; }
 }; 
 
 
@@ -106,7 +121,7 @@ class sub_nb {
     public:
         // construct full subset containing nr_elmt elements
         sub_nb(size_t nr_elmt) {
-#ifdef DEBUG
+#ifdef DAI_DEBUG
             assert( nr_elmt < sizeof(size_t) / sizeof(char) * 8 );
 #endif
             bits = nr_elmt;
@@ -152,7 +167,7 @@ class sub_nb {
                     else
                         i--;
                 }
-#ifdef DEBUG
+#ifdef DAI_DEBUG
             assert( bit < bits );
 #endif
             return bit;