Fixed numerical issues in MF, FBP and TRWBP (discovered in sparse branch)
authorJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 6 Jul 2011 19:04:26 +0000 (21:04 +0200)
committerJoris Mooij <joris.mooij@tuebingen.mpg.de>
Wed, 6 Jul 2011 19:04:26 +0000 (21:04 +0200)
ChangeLog
src/fbp.cpp
src/mf.cpp
src/trwbp.cpp

index 4d7cc14..565f560 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+* Fixed numerical issues in MF, FBP and TRWBP (discovered in sparse branch)
 * Jerome Maye found a bug in the State() class in index.h; implemented
   a workaround for the moment
 * Fixed bug in findMaximum(): inconsistent max-beliefs are now detected,
index ea919b1..1fd8f41 100644 (file)
@@ -32,7 +32,8 @@ Real FBP::logZ() const {
         Real c_i = 0.0;
         foreach( const Neighbor &I, nbV(i) )
             c_i += Weight(I);
-        sum += (1.0 - c_i) * beliefV(i).entropy();  // FBP
+        if( c_i != 1.0 )
+            sum += (1.0 - c_i) * beliefV(i).entropy();  // FBP
     }
     return sum;
 }
@@ -63,7 +64,7 @@ Prob FBP::calcIncomingMessageProduct( size_t I, bool without_i, size_t i ) const
                         prod_j += message( j, J.iter );
                     else
                         prod_j *= message( j, J.iter );
-                } else {
+                } else if( c_I != 1.0 ) {
                     // FBP: multiply by m_Ij^(1-1/c_I)
                     if( props.logdomain )
                         prod_j += newMessage( j, J.iter) * (1.0 - 1.0 / c_I);
index f08c9df..b9396cf 100644 (file)
@@ -101,7 +101,7 @@ Factor MF::calcNewBelief( size_t i ) {
                 belief_I_minus_i *= _beliefs[j];
         Factor f_I = factor(I);
         if( props.updates == Properties::UpdateType::NAIVE )
-            f_I.takeLog();
+            f_I.takeLog(true);
         Factor msg_I_i = (belief_I_minus_i * f_I).marginal( var(i), false );
         if( props.updates == Properties::UpdateType::NAIVE )
             result *= msg_I_i.exp();
index 7c3d421..b85705e 100644 (file)
@@ -58,7 +58,8 @@ Real TRWBP::logZ() const {
         Real c_i = 0.0;
         foreach( const Neighbor &I, nbV(i) )
             c_i += Weight(I);
-        sum += (1.0 - c_i) * beliefV(i).entropy();  // TRWBP/FBP
+        if( c_i != 1.0 )
+            sum += (1.0 - c_i) * beliefV(i).entropy();  // TRWBP/FBP
     }
     return sum;
 }
@@ -90,7 +91,7 @@ Prob TRWBP::calcIncomingMessageProduct( size_t I, bool without_i, size_t i ) con
                         prod_j += message( j, J.iter ) * c_J;
                     else
                         prod_j *= message( j, J.iter ) ^ c_J;
-                } else { // TRWBP: multiply by m_Ij^(c_I-1)
+                } else if( c_J != 1.0 ) { // TRWBP: multiply by m_Ij^(c_I-1)
                     if( props.logdomain )
                         prod_j += message( j, J.iter ) * (c_J - 1.0);
                     else