Esempio n. 1
0
Real LC::CalcCavityDist (size_t i, const std::string &name, const PropertySet &opts) {
    Factor Bi;
    Real maxdiff = 0;

    if( props.verbose >= 2 )
        cerr << "Initing cavity " << var(i) << "(" << delta(i).size() << " vars, " << delta(i).nrStates() << " states)" << endl;

    if( props.cavity == Properties::CavityType::UNIFORM )
        Bi = Factor(delta(i));
    else {
        InfAlg *cav = newInfAlg( name, *this, opts );
        cav->makeCavity( i );

        if( props.cavity == Properties::CavityType::FULL )
            Bi = calcMarginal( *cav, cav->fg().delta(i), props.reinit );
        else if( props.cavity == Properties::CavityType::PAIR ) {
            vector<Factor> pairbeliefs = calcPairBeliefs( *cav, cav->fg().delta(i), props.reinit, false );
            for( size_t ij = 0; ij < pairbeliefs.size(); ij++ )
                Bi *= pairbeliefs[ij];
        } else if( props.cavity == Properties::CavityType::PAIR2 ) {
            vector<Factor> pairbeliefs = calcPairBeliefs( *cav, cav->fg().delta(i), props.reinit, true );
            for( size_t ij = 0; ij < pairbeliefs.size(); ij++ )
                Bi *= pairbeliefs[ij];
        }
        maxdiff = cav->maxDiff();
        delete cav;
    }
    Bi.normalize();
    _cavitydists[i] = Bi;

    return maxdiff;
}
Esempio n. 2
0
Real MR::calcCavityCorrelations() {
    Real md = 0.0;
    for( size_t i = 0; i < nrVars(); i++ ) {
        vector<Factor> pairq;
        if( props.inits == Properties::InitType::EXACT ) {
            JTree jtcav(*this, PropertySet()("updates", string("HUGIN"))("verbose", (size_t)0) );
            jtcav.makeCavity( i );
            pairq = calcPairBeliefs( jtcav, delta(i), false, true );
        } else if( props.inits == Properties::InitType::CLAMPING ) {
            BP bpcav(*this, PropertySet()("updates", string("SEQMAX"))("tol", (Real)1.0e-9)("maxiter", (size_t)10000)("verbose", (size_t)0)("logdomain", false));
            bpcav.makeCavity( i );

            pairq = calcPairBeliefs( bpcav, delta(i), false, true );
            md = std::max( md, bpcav.maxDiff() );
        } else if( props.inits == Properties::InitType::RESPPROP ) {
            BP bpcav(*this, PropertySet()("updates", string("SEQMAX"))("tol", (Real)1.0e-9)("maxiter", (size_t)10000)("verbose", (size_t)0)("logdomain", false));
            bpcav.makeCavity( i );
            bpcav.makeCavity( i );
            bpcav.init();
            bpcav.run();

            BBP bbp( &bpcav, PropertySet()("verbose",(size_t)0)("tol",(Real)1.0e-9)("maxiter",(size_t)10000)("damping",(Real)0.0)("updates",string("SEQ_MAX")) );
            bforeach( const Neighbor &j, G.nb(i) ) {
                // Create weights for magnetization of some spin
                Prob p( 2, 0.0 );
                p.set( 0, -1.0 );
                p.set( 1, 1.0 );

                // BBP cost function would be the magnetization of spin j
                vector<Prob> b1_adj;
                b1_adj.reserve( nrVars() );
                for( size_t l = 0; l < nrVars(); l++ )
                    if( l == j )
                        b1_adj.push_back( p );
                    else
                        b1_adj.push_back( Prob( 2, 0.0 ) );
                bbp.init_V( b1_adj );

                // run BBP to estimate adjoints
                bbp.run();

                bforeach( const Neighbor &k, G.nb(i) ) {
                    if( k != j )
                        cors[i][j.iter][k.iter] = (bbp.adj_psi_V(k)[1] - bbp.adj_psi_V(k)[0]);
                    else
                        cors[i][j.iter][k.iter] = 0.0;
                }
            }
        }

        if( props.inits != Properties::InitType::RESPPROP ) {
            for( size_t jk = 0; jk < pairq.size(); jk++ ) {
                VarSet::const_iterator kit = pairq[jk].vars().begin();
                size_t j = findVar( *(kit) );
                size_t k = findVar( *(++kit) );
                pairq[jk].normalize();
                Real cor = (pairq[jk][3] - pairq[jk][2] - pairq[jk][1] + pairq[jk][0]) - (pairq[jk][3] + pairq[jk][2] - pairq[jk][1] - pairq[jk][0]) * (pairq[jk][3] - pairq[jk][2] + pairq[jk][1] - pairq[jk][0]);

                size_t _j = G.findNb(i,j);
                size_t _k = G.findNb(i,k);
                cors[i][_j][_k] = cor;
                cors[i][_k][_j] = cor;
            }
        }

    }