// $Id: computeUpAlgFactors.cpp 8034 2010-06-03 20:26:39Z itaymay $ #include "definitions.h" #include "computeUpAlg.h" #include "seqContainerTreeMap.h" #include "logFile.h" #include #include #include #include using namespace std; void computeNodeFactorAndSetSsc(MDOUBLE & minFactor,suffStatGlobalHomPos& ssc, int nodeId, const int alphSize){ // given a number = probability (val), it is changed to a new number which is 10 to the power of factor + val. // for example if val = 0.001, it is changed to 0.1 and factor 2. minFactor=100000; for (int i=0; i < alphSize; ++i) { MDOUBLE tmpfactor=0; doubleRep val = ssc.get(nodeId,i); if (val >0) { while (val < 0.1) { val *=10; tmpfactor++; } } else tmpfactor=minFactor; if (tmpfactor(10.0),minFactor); ssc.set(nodeId,j,tmp); } } void computeUpAlg::fillComputeUpWithFactors(const tree& et, const sequenceContainer& sc, const int pos, const computePijHom& pi, suffStatGlobalHomPos& ssc, vector& factors) { factors.resize(et.getNodesNum(),0.0); seqContainerTreeMap sctm(sc,et); ssc.allocatePlace(et.getNodesNum(),pi.alphabetSize()); treeIterDownTopConst tIt(et); for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { int letter; if (mynode->getNumberOfSons() == 0) {// leaf for(letter=0; letterid()); doubleRep val = sc.getAlphabet()->relations(sc[seqID][pos],letter); ssc.set(mynode->id(),letter,val); } computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),pi.alphabetSize()); } else { for(letter=0; lettergetNumberOfSons(); ++i){ doubleRep prob=0.0; for(int letInSon=0; letInSongetSon(i)->id(),letInSon)* pi.getPij(mynode->getSon(i)->id(),letter,letInSon); } total_prob*=prob; } ssc.set(mynode->id(),letter,total_prob); } computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),pi.alphabetSize()); for(int k=0; k < mynode->getNumberOfSons();++k) { factors[mynode->id()]+=factors[mynode->getSon(k)->id()]; } } } } void computeUpAlg::fillComputeUpWithFactors(const tree& et, const sequenceContainer& sc, const int pos, const stochasticProcess& sp, suffStatGlobalHomPos& ssc, vector& factors) { factors.resize(et.getNodesNum(),0.0); seqContainerTreeMap sctm(sc,et); ssc.allocatePlace(et.getNodesNum(),sp.alphabetSize()); treeIterDownTopConst tIt(et); for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { int letter; if (mynode->getNumberOfSons() == 0) {// leaf for(letter=0; letterid()); doubleRep val = sc.getAlphabet()->relations(sc[seqID][pos],letter); ssc.set(mynode->id(),letter,val); } computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize()); } else { for(letter=0; lettergetNumberOfSons();++i){ doubleRep prob=0.0; for(int letInSon=0; letInSongetSon(i)->id(),letInSon)* sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*sp.getGlobalRate());// taking care of the glubal is new. } assert(prob>=0); total_prob*=prob; } ssc.set(mynode->id(),letter,total_prob); } computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize()); for(int k=0; k < mynode->getNumberOfSons();++k) { factors[mynode->id()]+=factors[mynode->getSon(k)->id()]; } } } } void computeUpAlg::fillComputeUpSpecificGlobalRateFactors(const tree& et, const sequenceContainer& sc, const int pos, const stochasticProcess& sp, suffStatGlobalHomPos& ssc, const MDOUBLE gRate, vector& factors) { factors.resize(et.getNodesNum(),0.0); seqContainerTreeMap sctm(sc,et); ssc.allocatePlace(et.getNodesNum(),sp.alphabetSize()); treeIterDownTopConst tIt(et); for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { #ifdef VERBOS LOG(5,<name()<getNumberOfSons() == 0) {// leaf for(letter=0; letterid()); doubleRep val = sc.getAlphabet()->relations(sc[seqID][pos],letter); ssc.set(mynode->id(),letter,val); } computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize()); } else { int letterWithTotalProbEqZero =0; for(letter=0; lettergetNumberOfSons();++i){ doubleRep prob=0.0; for(int letInSon=0; letInSongetSon(i)->id(),letInSon)>=0); assert(sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*gRate)>=0); prob += ssc.get(mynode->getSon(i)->id(),letInSon)* sp.Pij_t(letter,letInSon,mynode->getSon(i)->dis2father()*gRate); } assert(prob>=0); total_prob*=prob; } if (total_prob ==0) ++letterWithTotalProbEqZero; ssc.set(mynode->id(),letter,total_prob); } // end of else computeNodeFactorAndSetSsc(factors[mynode->id()],ssc,mynode->id(),sp.alphabetSize()); for(int k=0; k < mynode->getNumberOfSons();++k) { factors[mynode->id()]+=factors[mynode->getSon(k)->id()]; } if (letterWithTotalProbEqZero == sp.alphabetSize() && (mynode->getNumberOfSons() > 0)) { LOG(5,<<" total prob =0"); for (int z=0; z getNumberOfSons(); ++z) { LOG(5,<<"son "<getSon(z)->name()<getSon(z)->dis2father()<sons[z]->id(),letInSon) = "<getSon(z)->id(),letInSon))<getSon(i)->dis2father()*gRate) = "<sons[i]->dis2father()*gRate)<getSon(i)->dis2father() = "<getSon(i)->dis2father()<