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;
    }
Exemplo n.º 3
0
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 );
}