Real ExactInf::run() { if( props.verbose >= 1 ) cerr << "Starting " << identify() << "..."; Factor P; for( size_t I = 0; I < nrFactors(); I++ ) P *= factor(I); Real Z = P.sum(); _logZ = std::log(Z); for( size_t i = 0; i < nrVars(); i++ ) _beliefsV[i] = P.marginal(var(i)); for( size_t I = 0; I < nrFactors(); I++ ) _beliefsF[I] = P.marginal(factor(I).vars()); if( props.verbose >= 1 ) cerr << "finished" << endl; return 0.0; }
Factor MF::calcNewBelief( size_t i ) { Factor result; daiforeach( const Neighbor &I, nbV(i) ) { Factor henk; daiforeach( const Neighbor &j, nbF(I) ) // for all j in I \ i if( j != i ) henk *= _beliefs[j]; Factor piet = factor(I).log(true); piet *= henk; piet = piet.marginal(var(i), false); piet = piet.exp(); result *= piet; }
void BP_dual::calcMessages() { // calculate 'n' messages from "factor marginal / factor" for( size_t I = 0; I < fg().nrFactors(); I++ ) { Factor f = _ia->beliefF(I) / fg().factor(I); diaforeach( const Neighbor &i, fg().nbF(I) ) msgN(i, i.dual) = f.marginal( fg().var(i) ).p(); } // calculate 'm' messages and normalizers from 'n' messages for( size_t i = 0; i < fg().nrVars(); i++ ) diaforeach( const Neighbor &I, fg().nbV(i) ) calcNewM( i, I.iter ); // recalculate 'n' messages and normalizers from 'm' messages for( size_t i = 0; i < fg().nrVars(); i++ ) diaforeach( const Neighbor &I, fg().nbV(i) ) calcNewN(i, I.iter); }
Factor ExactInf::calcMarginal( const VarSet &vs ) const { Factor P; for( size_t I = 0; I < nrFactors(); I++ ) P *= factor(I); return P.marginal( vs, true ); }