// $Id: bblEMProprtional.cpp 962 2006-11-07 15:13:34Z privmane $ #include "bblEM.h" #include "bblEMProportional.h" #include "likelihoodComputation.h" using namespace likelihoodComputation; #include "computeUpAlg.h" #include "computeDownAlg.h" #include "computeCounts.h" #include "treeIt.h" #include "fromCountTableComponentToDistance.h" #include //#define VERBOS #include "fromCountTableComponentToDistanceProp.h" bblEMProportional::bblEMProportional(tree& et, const vector& sc, const vector& sp, const vector * weights, const int maxIterations, const MDOUBLE epsilon, const MDOUBLE tollForPairwiseDist): _et(et),_sc(sc),_sp(sp),_weights (weights) { _numberOfGenes = _sc.size(); assert(_sp.size() == _sc.size()); _treeLikelihood = compute_bblEMProp(maxIterations,epsilon,tollForPairwiseDist); } MDOUBLE bblEMProportional::compute_bblEMProp( const int maxIterations, const MDOUBLE epsilon, const MDOUBLE tollForPairwiseDist){ allocatePlaceProp(); MDOUBLE oldL=VERYSMALL; MDOUBLE currL = VERYSMALL; for (int i=0; i < maxIterations; ++i) { computeUpProp(); currL = 0; for (int geneN=0; geneN < _numberOfGenes; ++geneN) { currL += likelihoodComputation::getTreeLikelihoodFromUp2(_et,_sc[geneN],_sp[geneN],_cup[geneN],_posLike[geneN],(_weights?(*_weights)[geneN]:NULL)); } tree oldT = _et; if (currL < oldL + epsilon) { // need to break if (currL * weightsOfGene = (_weights?(*_weights)[gene]:NULL); MDOUBLE weig = (weightsOfGene ? (*weightsOfGene)[pos] : 1.0); if (weig == 0) return; treeIterDownTopConst tIt(_et); for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { if (!tIt->isRoot()) { addCountsProp(gene,pos,mynode,_posLike[gene][pos],weig); } } } void bblEMProportional::addCountsProp(const int gene,const int pos, tree::nodeP mynode, const doubleRep posProb, const MDOUBLE weig){ computeCounts cc; for (int categor =0; categor< _sp[gene].categories(); ++ categor) { cc.computeCountsNodeFatherNodeSonHomPos(_sc[gene], _pij[gene][categor], _sp[gene], _cup[gene][pos][categor], _cdown[gene][categor], weig, posProb, mynode, _computeCountsV[gene][mynode->id()][categor], _sp[gene].ratesProb(categor)); } } void bblEMProportional::optimizeBranchesProp(const MDOUBLE tollForPairwiseDist){ treeIterDownTopConst tIt(_et); for (tree::nodeP mynode = tIt.first(); mynode != tIt.end(); mynode = tIt.next()) { if (!tIt->isRoot()) { fromCountTableComponentToDistanceProp from1(_computeCountsV[mynode->id()],_sp,tollForPairwiseDist,mynode->dis2father()); from1.computeDistance(); mynode->setDisToFather(from1.getDistance()); } } }