Fixed regression FBP and bugs in TRWBP
[libdai.git] / src / fbp.cpp
index 893388e..8cd51b0 100644 (file)
@@ -34,12 +34,12 @@ Real FBP::logZ() const {
     Real sum = 0.0;
     for( size_t I = 0; I < nrFactors(); I++ ) {
         sum += (beliefF(I) * factor(I).log(true)).sum();  // FBP
-        sum += scaleF(I) * beliefF(I).entropy();  // FBP
+        sum += Weight(I) * beliefF(I).entropy();  // FBP
     }
     for( size_t i = 0; i < nrVars(); ++i ) {
         Real c_i = 0.0;
         foreach( const Neighbor &I, nbV(i) )
-            c_i += scaleF(I);
+            c_i += Weight(I);
         sum += (1.0 - c_i) * beliefV(i).entropy();  // FBP
     }
     return sum;
@@ -51,15 +51,15 @@ void FBP::calcNewMessage( size_t i, size_t _I ) {
     // calculate updated message I->i
     size_t I = nbV(i,_I);
 
-    Real scale = scaleF(I); // FBP: c_I
+    Real c_I = Weight(I); // FBP: c_I
 
     Factor Fprod( factor(I) );
     Prob &prod = Fprod.p();
     if( props.logdomain ) {
         prod.takeLog();
-        prod *= (1/scale); // FBP
+        prod /= c_I; // FBP
     } else
-        prod ^= (1/scale); // FBP
+        prod ^= (1.0 / c_I); // FBP
     
     // Calculate product of incoming messages and factor I
     foreach( const Neighbor &j, nbF(I) )
@@ -76,9 +76,9 @@ void FBP::calcNewMessage( size_t i, size_t _I ) {
                 } else {
                     // FBP: multiply by m_Ij^(1-1/c_I)
                     if( props.logdomain )
-                        prod_j += message( j, J.iter )*(1-1/scale);
+                        prod_j += message( j, J.iter ) * (1.0 - 1.0 / c_I);
                     else
-                        prod_j *= message( j, J.iter )^(1-1/scale);
+                        prod_j *= message( j, J.iter ) ^ (1.0 - 1.0 / c_I);
                 }
 
             // multiply prod with prod_j
@@ -90,6 +90,7 @@ void FBP::calcNewMessage( size_t i, size_t _I ) {
                     Fprod *= Factor( var(j), prod_j );
             } else {
                 /* OPTIMIZED VERSION */
+                size_t _I = j.dual;
                 // ind is the precalculated IndexFor(j,I) i.e. to x_I == k corresponds x_j == ind[k]
                 const ind_t &ind = index(j, _I);
                 for( size_t r = 0; r < prod.size(); ++r )
@@ -129,7 +130,7 @@ void FBP::calcNewMessage( size_t i, size_t _I ) {
     }
 
     // FBP
-    marg ^= scale;
+    marg ^= c_I;
 
     // Store result
     if( props.logdomain )
@@ -145,16 +146,16 @@ void FBP::calcNewMessage( size_t i, size_t _I ) {
 
 /* This code has been copied from bp.cpp, except where comments indicate FBP-specific behaviour */
 void FBP::calcBeliefF( size_t I, Prob &p ) const {
-    Real scale = scaleF(I); // FBP: c_I
+    Real c_I = Weight(I); // FBP: c_I
 
     Factor Fprod( factor(I) );
     Prob &prod = Fprod.p();
     
     if( props.logdomain ) {
         prod.takeLog();
-        prod /= scale; // FBP
+        prod /= c_I; // FBP
     } else
-        prod ^= (1/scale); // FBP
+        prod ^= (1.0 / c_I); // FBP
 
     foreach( const Neighbor &j, nbF(I) ) {
         // prod_j will be the product of messages coming into j
@@ -169,9 +170,9 @@ void FBP::calcBeliefF( size_t I, Prob &p ) const {
             } else {
                 // FBP: multiply by m_Ij^(1-1/c_I)
                 if( props.logdomain )
-                    prod_j += newMessage( j, J.iter)*(1-1/scale);
+                    prod_j += newMessage( j, J.iter) * (1.0 - 1.0 / c_I);
                 else
-                    prod_j *= newMessage( j, J.iter)^(1-1/scale);
+                    prod_j *= newMessage( j, J.iter) ^ (1.0 - 1.0 / c_I);
             }
 
         // multiply prod with prod_j
@@ -202,7 +203,7 @@ void FBP::calcBeliefF( size_t I, Prob &p ) const {
 
 void FBP::construct() {
     BP::construct();
-    _scale_factor.resize( nrFactors(), 1.0 );
+    _weight.resize( nrFactors(), 1.0 );
 }