Merged SVN head ...
[libdai.git] / src / mr.cpp
index b49b9c4..76b4ef8 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;
@@ -455,8 +466,9 @@ void MR::solvemcav() {
         }
     } while((maxdev>props.tol)&&(run<maxruns));
 
-    if( maxdev > maxdiff )
-        maxdiff = maxdev;
+    _iters = run;
+    if( maxdev > _maxdiff )
+        _maxdiff = maxdev;
 
     if(run==maxruns){
         if( props.verbose >= 1 )
@@ -496,11 +508,11 @@ void MR::init_cor() {
     for( size_t i = 0; i < nrVars(); i++ ) {
         vector<Factor> pairq;
         if( props.inits == Properties::InitType::CLAMPING ) {
-            BP bpcav(*this, PropertySet()("updates",string("SEQMAX"))("tol", string("1e-9"))("maxiter", string("1000UL"))("verbose", string("0UL"))("logdomain", string("0")));
+            BP bpcav(*this, PropertySet()("updates", string("SEQMAX"))("tol", string("1e-9"))("maxiter", string("10000UL"))("verbose", string("0UL"))("logdomain", string("0")));
             bpcav.makeCavity( i );
             pairq = calcPairBeliefs( bpcav, delta(i), false );
         } else if( props.inits == Properties::InitType::EXACT ) {
-            JTree jtcav(*this, PropertySet()("updates",string("HUGIN"))("verbose", 0UL) );
+            JTree jtcav(*this, PropertySet()("updates", string("HUGIN"))("verbose", string("0UL")) );
             jtcav.makeCavity( i );
             pairq = calcPairBeliefs( jtcav, delta(i), false );
         }
@@ -508,7 +520,7 @@ void MR::init_cor() {
             VarSet::const_iterator kit = pairq[jk].vars().begin();
             size_t j = findVar( *(kit) );
             size_t k = findVar( *(++kit) );
-            pairq[jk].normalize(Prob::NORMPROB);
+            pairq[jk].normalize();
             double cor = (pairq[jk][3] - pairq[jk][2] - pairq[jk][1] + pairq[jk][0]) - (pairq[jk][3] + pairq[jk][2] - pairq[jk][1] - pairq[jk][0]) * (pairq[jk][3] - pairq[jk][2] + pairq[jk][1] - pairq[jk][0]);
             for( size_t _j = 0; _j < con[i]; _j++ ) if( nb[i][_j] == j )
                 for( size_t _k = 0; _k < con[i]; _k++ ) if( nb[i][_k] == k ) {
@@ -521,9 +533,7 @@ void MR::init_cor() {
 
 
 string MR::identify() const { 
-    stringstream result (stringstream::out);
-    result << Name << getProperties();
-    return result.str();
+    return string(Name) + printProperties();
 }
 
 
@@ -552,8 +562,8 @@ double MR::run() {
 
         if( props.inits == Properties::InitType::RESPPROP ) {
             double md = init_cor_resp();
-            if( md > maxdiff )
-                maxdiff = md;
+            if( md > _maxdiff )
+                _maxdiff = md;
         } else if( props.inits == Properties::InitType::EXACT )
             init_cor(); // FIXME no MaxDiff() calculation
         else if( props.inits == Properties::InitType::CLAMPING )
@@ -565,11 +575,11 @@ double MR::run() {
         solveM();
 
         if( props.verbose >= 1 )
-            cout << "MR needed " << toc() - tic << " clocks." << endl;
+            cout << Name << " needed " << toc() - tic << " seconds." << endl;
 
         return 0.0;
     } else
-        return -1.0;
+        return 1.0;
 }
 
 
@@ -608,7 +618,7 @@ vector<Factor> MR::beliefs() const {
 
 
 
-MR::MR( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), supported(true), maxdiff(0.0) {
+MR::MR( const FactorGraph &fg, const PropertySet &opts ) : DAIAlgFG(fg), supported(true), _maxdiff(0.0), _iters(0) {
     setProperties( opts );
 
     // check whether all vars in fg are binary