Some small documentation updates
[libdai.git] / src / bbp.cpp
index fd643f9..b4bd072 100644 (file)
@@ -157,7 +157,7 @@ void BBP::RegenerateInds() {
         _indices[i].reserve( _fg->nbV(i).size() );
         foreach( const Neighbor &I, _fg->nbV(i) ) {
             _ind_t index;
-            index.reserve( _fg->factor(I).states() );
+            index.reserve( _fg->factor(I).nrStates() );
             for( IndexFor k(_fg->var(i), _fg->factor(I).vars()); k.valid(); ++k )
                 index.push_back( k );
             _indices[i].push_back( index );
@@ -188,7 +188,7 @@ void BBP::RegenerateU() {
     for( size_t I = 0; I < _fg->nrFactors(); I++ ) {
         _Umsg[I].resize( _fg->nbF(I).size() );
         foreach( const Neighbor &i, _fg->nbF(I) ) {
-            Prob prod( _fg->factor(I).states(), 1.0 );
+            Prob prod( _fg->factor(I).nrStates(), 1.0 );
             foreach( const Neighbor &j, _fg->nbF(I) )
                 if( i.node != j.node ) {
                     Prob n_jI( _bp_dual.msgN( j, j.dual ) );
@@ -217,7 +217,7 @@ void BBP::RegenerateS() {
                         if( k != i && k.node != j.node ) {
                             const _ind_t &ind = _index( k, k.dual );
                             Prob p( _bp_dual.msgN( k, k.dual ) );
-                            for( size_t x_I = 0; x_I < prod.states(); x_I++ )
+                            for( size_t x_I = 0; x_I < prod.nrStates(); x_I++ )
                                 prod.set( x_I, prod[x_I] * p[ind[x_I]] );
                         }
                     }
@@ -279,7 +279,7 @@ void BBP::RegeneratePsiAdjoints() {
     _adj_psi_F.reserve( _fg->nrFactors() );
     for( size_t I = 0; I < _fg->nrFactors(); I++ ) {
         Prob p( _adj_b_F_unnorm[I] );
-        DAI_ASSERT( p.size() == _fg->factor(I).states() );
+        DAI_ASSERT( p.size() == _fg->factor(I).nrStates() );
         foreach( const Neighbor &i, _fg->nbF(I) ) {
             Prob n_iI( _bp_dual.msgN( i, i.dual ) );
             const _ind_t& ind = _index( i, i.dual );
@@ -737,7 +737,7 @@ std::vector<Prob> BBP::getZeroAdjF( const FactorGraph &fg ) {
     vector<Prob> adj_2;
     adj_2.reserve( fg.nrFactors() );
     for( size_t I = 0; I < fg.nrFactors(); I++ )
-        adj_2.push_back( Prob( fg.factor(I).states(), 0.0 ) );
+        adj_2.push_back( Prob( fg.factor(I).nrStates(), 0.0 ) );
     return adj_2;
 }
 
@@ -777,7 +777,7 @@ void BBP::initCostFnAdj( const BBPCostFunction &cfn, const vector<size_t> *state
                 psi1_adj.push_back( p );
             }
             for( size_t I = 0; I < fg.nrFactors(); I++ ) {
-                size_t dim = fg.factor(I).states();
+                size_t dim = fg.factor(I).nrStates();
                 Prob p( dim, 0.0 );
                 for( size_t xI = 0; xI < dim; xI++ )
                     p.set( xI, 1 + log( _ia->beliefF(I)[xI] / fg.factor(I).p()[xI] ) );
@@ -793,7 +793,7 @@ void BBP::initCostFnAdj( const BBPCostFunction &cfn, const vector<size_t> *state
             vector<Prob> b2_adj;
             b2_adj.reserve( fg.nrFactors() );
             for( size_t I = 0; I < fg.nrFactors(); I++ ) {
-                size_t dim = fg.factor(I).states();
+                size_t dim = fg.factor(I).nrStates();
                 Prob p( dim, 0.0 );
                 for( size_t xI = 0; xI < dim; xI++ ) {
                     Real bIxI = _ia->beliefF(I)[xI];
@@ -872,7 +872,7 @@ void BBP::initCostFnAdj( const BBPCostFunction &cfn, const vector<size_t> *state
             vector<Prob> b2_adj;
             b2_adj.reserve( fg.nrVars() );
             for( size_t I = 0; I <  fg.nrFactors(); I++ ) {
-                size_t n = fg.factor(I).states();
+                size_t n = fg.factor(I).nrStates();
                 Prob delta( n, 0.0 );
 
                 size_t x_I = getFactorEntryForState( fg, I, state );
@@ -1014,7 +1014,8 @@ Real numericBBPTest( const InfAlg &bp, const std::vector<size_t> *state, const P
                 psi_1_prb.set( xi, psi_1_prb[xi] + h );
 //                 psi_1_prb.normalize();
                 size_t I = bp_prb->fg().nbV(i)[0]; // use first factor in list of neighbors of i
-                bp_prb->fg().factor(I) *= Factor( bp_prb->fg().var(i), psi_1_prb );
+                Factor tmp = bp_prb->fg().factor(I) * Factor( bp_prb->fg().var(i), psi_1_prb );
+                bp_prb->fg().setFactor( I, tmp );
 
                 // call 'init' on the perturbed variables
                 bp_prb->init( bp_prb->fg().var(i) );
@@ -1036,7 +1037,7 @@ Real numericBBPTest( const InfAlg &bp, const std::vector<size_t> *state, const P
             cout << "i: " << i
                  << ", p_adj_est: " << p_adj_est
                  << ", bbp.adj_psi_V(i): " << bbp.adj_psi_V(i) << endl;
-            d += dist( p_adj_est, bbp.adj_psi_V(i), Prob::DISTL1 );
+            d += dist( p_adj_est, bbp.adj_psi_V(i), DISTL1 );
         }
     }
     /*    if(1) {
@@ -1086,14 +1087,14 @@ Real numericBBPTest( const InfAlg &bp, const std::vector<size_t> *state, const P
                 cerr << "i: " << i << ", I: " << I
                      << ", adj_n_est: " << p_adj_n_est
                      << ", bbp.adj_n(i,I): " << bbp.adj_n(i,I) << endl;
-                d += dist(p_adj_n_est, bbp.adj_n(i,I), Prob::DISTL1);
+                d += dist(p_adj_n_est, bbp.adj_n(i,I), DISTL1);
 
                 Prob p_adj_m_est( adj_m_est );
                 // compare this numerical estimate to the BBP estimate; sum the distances
                 cerr << "i: " << i << ", I: " << I
                      << ", adj_m_est: " << p_adj_m_est
                      << ", bbp.adj_m(I,i): " << bbp.adj_m(I,i) << endl;
-                d += dist(p_adj_m_est, bbp.adj_m(I,i), Prob::DISTL1);
+                d += dist(p_adj_m_est, bbp.adj_m(I,i), DISTL1);
             }
         }
     }
@@ -1120,7 +1121,7 @@ Real numericBBPTest( const InfAlg &bp, const std::vector<size_t> *state, const P
             cerr << "i: " << i
                  << ", adj_b_V_est: " << p_adj_b_V_est
                  << ", bbp.adj_b_V(i): " << bbp.adj_b_V(i) << endl;
-            d += dist(p_adj_b_V_est, bbp.adj_b_V(i), Prob::DISTL1);
+            d += dist(p_adj_b_V_est, bbp.adj_b_V(i), DISTL1);
         }
     }
     */
@@ -1152,8 +1153,6 @@ void BBP::Properties::set(const PropertySet &opts)
     }
     if( !errormsg.empty() )
         DAI_THROWE(UNKNOWN_PROPERTY, errormsg);
-    if( !opts.hasKey("verbose") )
-        errormsg = errormsg + "BBP: Missing property \"verbose\" for method \"BBP\"\n";
     if( !opts.hasKey("maxiter") )
         errormsg = errormsg + "BBP: Missing property \"maxiter\" for method \"BBP\"\n";
     if( !opts.hasKey("tol") )
@@ -1164,7 +1163,11 @@ void BBP::Properties::set(const PropertySet &opts)
         errormsg = errormsg + "BBP: Missing property \"updates\" for method \"BBP\"\n";
     if( !errormsg.empty() )
         DAI_THROWE(NOT_ALL_PROPERTIES_SPECIFIED,errormsg);
-    verbose = opts.getStringAs<size_t>("verbose");
+    if( opts.hasKey("verbose") ) {
+        verbose = opts.getStringAs<size_t>("verbose");
+    } else {
+        verbose = 0;
+    }
     maxiter = opts.getStringAs<size_t>("maxiter");
     tol = opts.getStringAs<Real>("tol");
     damping = opts.getStringAs<Real>("damping");