// $Id: computeMarginalAlg.cpp 1735 2007-02-26 13:46:37Z itaymay $ #include "definitions.h" #include "treeIt.h" #include "computeMarginalAlg.h" #include #include using namespace std; void computeMarginalAlg::fillComputeMarginal(const tree& et, const sequenceContainer& sc, const stochasticProcess& sp, const int pos, const computePijHom& pi, suffStatGlobalHomPos& ssc, const suffStatGlobalHomPos& cup, const suffStatGlobalHomPos& cdown, doubleRep & posProb){ // filling the exact probs. tree::nodeP mynode = NULL; ssc.allocatePlace(et.getNodesNum(),pi.alphabetSize()); treeIterTopDownConst tIt(et); for (mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { assert (mynode != NULL); int letter; if (mynode->isLeaf()) { for(letter=0; letterid(),letter))?1.0:0.0; ssc.set(mynode->id(),letter,val); } continue; } doubleRep sumProb =0; for(letter=0; letterfather()==NULL) prob=1.0; // special case of the root. else { for(int letter_in_f=0; letter_in_fid(),letter_in_f)* pi.getPij(mynode->id(),letter,letter_in_f); } } prob = prob*sp.freq(letter)* cup.get(mynode->id(),letter); ssc.set(mynode->id(),letter,prob); sumProb += prob; } for(letter=0; letterid(),letter); ssc.set(mynode->id(),letter,getV/sumProb); } // CHECKING: /* LOG(5,<<" checking marginal of node: "<name()<id(),u)<<" "); SSum +=ssc.get(mynode->id(),u); } LOG(5,<<"\nsum of marginals = "<isRoot()) posProb = convert(sumProb); } } /* if (val>1) { LOG(5,<<"x val = " << val<1 "); } if (val>1) { LOG(5,<<" val = " << val<1 "); } */