Added example_imagesegmentation, BipartiteGraph::nb1Set() and nb2Set()
[libdai.git] / src / bp_dual.cpp
index d282d2d..1591492 100644 (file)
@@ -62,7 +62,7 @@ void BP_dual::regenerateBeliefs() {
     for( size_t i = 0; i < fg().nrVars(); i++ )
         _beliefs.b1.push_back( Prob( fg().var(i).states() ) );
     for( size_t I = 0; I < fg().nrFactors(); I++ )
     for( size_t i = 0; i < fg().nrVars(); i++ )
         _beliefs.b1.push_back( Prob( fg().var(i).states() ) );
     for( size_t I = 0; I < fg().nrFactors(); I++ )
-        _beliefs.b2.push_back( Prob( fg().factor(I).states() ) );
+        _beliefs.b2.push_back( Prob( fg().factor(I).nrStates() ) );
 }
 
 
 }
 
 
@@ -93,14 +93,14 @@ void BP_dual::calcNewM( size_t i, size_t _I ) {
             Prob &n = msgN(j,j.dual);
             IndexFor ind( fg().var(j), fg().factor(I).vars() );
             for( size_t x = 0; ind.valid(); x++, ++ind )
             Prob &n = msgN(j,j.dual);
             IndexFor ind( fg().var(j), fg().factor(I).vars() );
             for( size_t x = 0; ind.valid(); x++, ++ind )
-                prod[x] *= n[ind];
+                prod.set( x, prod[x] * n[ind] );
         }
     // Marginalize onto i
     Prob marg( fg().var(i).states(), 0.0 );
     // ind is the precalculated Index(i,I) i.e. to x_I == k corresponds x_i == ind[k]
     IndexFor ind( fg().var(i), fg().factor(I).vars() );
     for( size_t x = 0; ind.valid(); x++, ++ind )
         }
     // Marginalize onto i
     Prob marg( fg().var(i).states(), 0.0 );
     // ind is the precalculated Index(i,I) i.e. to x_I == k corresponds x_i == ind[k]
     IndexFor ind( fg().var(i), fg().factor(I).vars() );
     for( size_t x = 0; ind.valid(); x++, ++ind )
-        marg[ind] += prod[x];
+        marg.set( ind, marg[ind] + prod[x] );
 
     _msgs.Zm[i][_I] = marg.normalize();
     _msgs.m[i][_I] = marg;
 
     _msgs.Zm[i][_I] = marg.normalize();
     _msgs.m[i][_I] = marg;
@@ -142,7 +142,7 @@ void BP_dual::calcBeliefF( size_t I ) {
         IndexFor ind( fg().var(j), fg().factor(I).vars() );
         Prob n( msgN(j,j.dual) );
         for( size_t x = 0; ind.valid(); x++, ++ind )
         IndexFor ind( fg().var(j), fg().factor(I).vars() );
         Prob n( msgN(j,j.dual) );
         for( size_t x = 0; ind.valid(); x++, ++ind )
-            prod[x] *= n[ind];
+            prod.set( x, prod[x] * n[ind] );
     }
     _beliefs.Zb2[I] = prod.normalize();
     _beliefs.b2[I] = prod;
     }
     _beliefs.Zb2[I] = prod.normalize();
     _beliefs.b2[I] = prod;