void ExactInf::construct() { // clear variable beliefs and reserve space _beliefsV.clear(); _beliefsV.reserve( nrVars() ); for( size_t i = 0; i < nrVars(); i++ ) _beliefsV.push_back( Factor( var(i) ) ); // clear factor beliefs and reserve space _beliefsF.clear(); _beliefsF.reserve( nrFactors() ); for( size_t I = 0; I < nrFactors(); I++ ) _beliefsF.push_back( Factor( factor(I).vars() ) ); }
Factor ExactInf::belief( const VarSet &ns ) const { if( ns.size() == 0 ) return Factor(); else if( ns.size() == 1 ) { return beliefV( findVar( *(ns.begin()) ) ); } else { size_t I; for( I = 0; I < nrFactors(); I++ ) if( factor(I).vars() >> ns ) break; if( I == nrFactors() ) DAI_THROW(BELIEF_NOT_AVAILABLE); return beliefF(I).marginal(ns); } }
void CBP::construct() { // prepare datastructures for compression for (size_t i=0; i<nrVars(); i++) { _gndVarToSuperVar[i] = i; } for (size_t i=0; i<nrFactors(); i++) { _gndFacToSuperFac[i] = i; } // create edge properties _edges.clear(); _edges.reserve( nrVars() ); for( size_t i = 0; i < nrVars(); ++i ) { _edges.push_back( vector<EdgeProp>() ); _edges[i].reserve( nbV(i).size() ); foreach( const Neighbor &I, nbV(i) ) { EdgeProp newEP; size_t edgeCount = factor(I).counts()[I.dual].size(); newEP.message = vector<Prob>(edgeCount,Prob( var(i).states() )); newEP.newMessage = vector<Prob>(edgeCount,Prob( var(i).states() )); newEP.count = vector<int>(edgeCount); newEP.index = vector<ind_t>(edgeCount); newEP.nrPos = edgeCount; // simulate orginal varSet with possibly more variables, must ensure that the number of variables is equal to number of ground variables VarSet gndVarSet; size_t varCount = 0; foreach(const Neighbor &tmpVar, nbF(I)) { for(map<size_t, int>::const_iterator iter=factor(I).counts()[tmpVar.iter].begin(); iter!=factor(I).counts()[tmpVar.iter].end();iter++) { gndVarSet |= Var(varCount, var(tmpVar).states()); varCount++; } } varCount = 0; foreach(const Neighbor &tmpVar, nbF(I)) { size_t pos=0; for(map<size_t, int>::const_iterator iter=factor(I).counts()[tmpVar.iter].begin(); iter!=factor(I).counts()[tmpVar.iter].end();iter++,pos++) { if (tmpVar == i) { // assumes that counts are iterated in increases order of positions size_t sortedPos = factor(I).sigma()[(*iter).first]; newEP.count[pos] = (*iter).second; newEP.index[pos].reserve( factor(I).states() ); for( IndexFor k( Var(sortedPos, var(i).states()), gndVarSet ); k >= 0; ++k ) { newEP.index[pos].push_back( k ); } } varCount++; } } _edges[i].push_back( newEP ); }
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; }
void CFactorGraph::printDot( std::ostream &os ) const { os << "graph G {" << endl; os << "node[shape=circle,width=0.4,fixedsize=true];" << endl; for( size_t i = 0; i < nrVars(); i++ ) os << "\tv" << var(i).label() << ";" << endl; os << "node[shape=box,width=0.3,height=0.3,fixedsize=true];" << endl; for( size_t I = 0; I < nrFactors(); I++ ) os << "\tf" << I << ";" << endl; for( size_t i = 0; i < nrVars(); i++ ) foreach( const Neighbor &I, nbV(i) ) // for all neighboring factors I of i os << "\tv" << var(i).label() << " -- f" << I << ";" << endl; os << "}" << endl; }
// This code has been copied from bp.cpp, except where comments indicate TRWBP-specific behaviour Real TRWBP::logZ() const { Real sum = 0.0; for( size_t I = 0; I < nrFactors(); I++ ) { sum += (beliefF(I) * factor(I).log(true)).sum(); // TRWBP/FBP sum += Weight(I) * beliefF(I).entropy(); // TRWBP/FBP } for( size_t i = 0; i < nrVars(); ++i ) { Real c_i = 0.0; bforeach( const Neighbor &I, nbV(i) ) c_i += Weight(I); if( c_i != 1.0 ) sum += (1.0 - c_i) * beliefV(i).entropy(); // TRWBP/FBP } return sum; }
std::vector<std::size_t> ExactInf::findMaximum() const { Factor P; for( size_t I = 0; I < nrFactors(); I++ ) P *= factor(I); size_t linearState = P.p().argmax().first; // convert to state map<Var, size_t> state = calcState( P.vars(), linearState ); // convert to desired output data structure vector<size_t> mapState; mapState.reserve( nrVars() ); for( size_t i = 0; i < nrVars(); i++ ) mapState.push_back( state[var(i)] ); return mapState; }
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 ); }
void ExactInf::init() { for( size_t i = 0; i < nrVars(); i++ ) _beliefsV[i].fill( 1.0 ); for( size_t I = 0; I < nrFactors(); I++ ) _beliefsF[I].fill( 1.0 ); }