// $Id: bestHKYparam.cpp 10004 2011-11-13 04:40:13Z rubi $ #include "bestHKYparam.h" #include using namespace std; #include "bblEM.h" #include "bblEMProportionalEB.h" #include "bblLSProportionalEB.h" #include "numRec.h" #include "logFile.h" #include "bestAlpha.h" bestHkyParamFixedTree::bestHkyParamFixedTree(const tree& et, //findBestHkyParamFixedTree const sequenceContainer& sc, stochasticProcess& sp, const Vdouble * weights, const MDOUBLE upperBoundOnHkyParam, const MDOUBLE epsilonHkyParamOptimization){ LOG(5,<<"findBestHkyParamFixedTree"<(sp.getPijAccelerator()->getReplacementModel()))->changeTrTv(bestA); } bestHkyParamAndBBL::bestHkyParamAndBBL(tree& et, //find Best HkyParam and best BBL const sequenceContainer& sc, stochasticProcess& sp, const Vdouble * weights, const MDOUBLE upperBoundOnHkyParam, const MDOUBLE epsilonHkyParamOptimization, const MDOUBLE epsilonLikelihoodImprovment, const int maxBBLIterations, const int maxTotalIterations){ LOG(5,<<"find Best HkyParam and best BBL"< oldL+epsilonLikelihoodImprovment) { oldL = _bestL; } else {//LL converged if (_bestL > oldL) (static_cast(sp.getPijAccelerator()->getReplacementModel()))->changeTrTv(bestA); else _bestL = oldL; break; } _bestHkyParam = bestA; (static_cast(sp.getPijAccelerator()->getReplacementModel()))->changeTrTv(bestA); LOG(5,<<"bestHkyParamAndBBL: trtv = "<<_bestHkyParam< oldL+epsilonLikelihoodImprovment) { oldL = _bestL; } else { _bestL = oldL; break; } } } bestHkyParamAlphaAndBBL::bestHkyParamAlphaAndBBL( //find best TrTv (=HkyParam), Alpha and best branch lengths tree& et, const sequenceContainer& sc, stochasticProcess& sp, const Vdouble * weights, const int maxTotalIterations, const MDOUBLE epsilonLikelihoodImprovment, const MDOUBLE epsilonHkyParamOptimization, const MDOUBLE epsilonAlphaOptimization, const MDOUBLE epsilonBBL, const MDOUBLE upperBoundOnHkyParam, const int maxBBLIterations, const MDOUBLE initAlpha, const MDOUBLE upperBoundOnAlpha) { MDOUBLE oldL = VERYSMALL; MDOUBLE newL = VERYSMALL; // first guess for the parameters MDOUBLE prevHkyParam = static_cast(sp.getPijAccelerator()->getReplacementModel())->getTrTv(); MDOUBLE prevAlpha = initAlpha; tree prevTree; for (int i=0; i < maxTotalIterations; ++i) { // optimize HkyParam newL = -brent(0.0, prevHkyParam, upperBoundOnHkyParam, C_evalHkyParam(et,sc,sp,weights), epsilonHkyParamOptimization, &_bestHkyParam); (static_cast(sp.getPijAccelerator()->getReplacementModel()))->changeTrTv(_bestHkyParam); LOG(5,<<"bestHkyParamAlphaAndBBL: trtv = "<<_bestHkyParam<(sp.distr()))->setAlpha(_bestAlpha); LOG(5,<<"# bestHkyParamAlphaAndBBL::bestHkyParamAlphaAndBBL iteration " << i << ": after param optimization:" < oldL+epsilonLikelihoodImprovment) { oldL = newL; _bestL = newL; prevHkyParam = _bestHkyParam; prevAlpha = _bestAlpha; prevTree = et; } else { if (newL>oldL) { _bestL = newL; } else { _bestL = oldL; _bestHkyParam = prevHkyParam; et = prevTree; } break; } } } bestHkyParamAlphaAndBBLProportional::bestHkyParamAlphaAndBBLProportional( //find best TrTv (=HkyParam), global Alpha, local Alpha, and best branch lengths tree& et, vector& sc, multipleStochasticProcess* msp, gammaDistribution* pProportionDist, Vdouble initLocalAlphas, Vdouble initLocalKappas, const MDOUBLE upperBoundOnLocalAlpha, const MDOUBLE initGlobalAlpha, const MDOUBLE upperBoundOnGlobalAlpha, const MDOUBLE upperBoundOnHkyParam, const int maxTotalIterations, const int maxBBLIterations, const bool optimizeSelectedBranches, const bool optimizeTree, const string branchLengthOptimizationMethod, const bool optimizeLocalParams, const bool optimizeGlobalAlpha, const Vdouble * weights, const MDOUBLE epsilonLikelihoodImprovment, const MDOUBLE epsilonHkyParamOptimization, const MDOUBLE epsilonLocalAlphaOptimization, const MDOUBLE epsilonGlobalAlphaOptimization, const MDOUBLE epsilonBBL) { LOG(5,<<"Starting bestHkyParamAlphaAndBBLProportional"<getSPVecSize()); //doubleRep oldL(VERYSMALL);//DR //doubleRep newL; MDOUBLE oldL = VERYSMALL; MDOUBLE newL; _bestLvec.resize(msp->getSPVecSize(),0.0); _bestLocalAlphaVec = initLocalAlphas; _bestGlobalAlpha = initGlobalAlpha; int spIndex; //initial HKY params _bestHkyParamVec = initLocalKappas; pProportionDist->setAlpha(_bestGlobalAlpha); for(spIndex = 0;spIndex < msp->getSPVecSize();++spIndex){ (static_cast(msp->getSp(spIndex)->getPijAccelerator()->getReplacementModel()))->changeTrTv(_bestHkyParamVec[spIndex]); (static_cast(msp->getSp(spIndex)->distr()))->setAlpha(_bestLocalAlphaVec[spIndex]); } //first compute the likelihood; _bestLvec = likelihoodComputation::getTreeLikelihoodProportionalAllPosAlphTheSame(et,sc,msp,pProportionDist,weights); MDOUBLE ax_local = 0.0; MDOUBLE c_HKYParam_x = upperBoundOnHkyParam; MDOUBLE c_localAlpha_x = upperBoundOnLocalAlpha; for (int i=0; i < maxTotalIterations; ++i) { if(optimizeLocalParams){ for(spIndex = 0;spIndex < msp->getSPVecSize();++spIndex){ //optimize hky MDOUBLE hky_x(_bestHkyParamVec[spIndex]); newLvec[spIndex] = -brent(ax_local,hky_x,c_HKYParam_x, C_evalLocalHkyParam(et,sc[spIndex],*msp->getSp(spIndex),pProportionDist,weights), epsilonHkyParamOptimization, ¤t_HkyParamVec[spIndex]); if (newLvec[spIndex] >= _bestLvec[spIndex]) { _bestLvec[spIndex] = newLvec[spIndex]; _bestHkyParamVec[spIndex] = current_HkyParamVec[spIndex]; } else {//likelihood went down! LOG(2,<<"likelihood went down in optimizing hky param"<(msp->getSp(spIndex)->getPijAccelerator()->getReplacementModel()))->changeTrTv(_bestHkyParamVec[spIndex]);//safety //optimize local alpha MDOUBLE localAlpha_x(_bestLocalAlphaVec[spIndex]); newLvec[spIndex] = -brent(ax_local,localAlpha_x,c_localAlpha_x, C_evalLocalAlpha(et,sc[spIndex],*msp->getSp(spIndex),pProportionDist,weights), epsilonLocalAlphaOptimization, ¤tLocalAlphaVec[spIndex]); if (newLvec[spIndex] >= _bestLvec[spIndex]) { _bestLvec[spIndex] = newLvec[spIndex]; _bestLocalAlphaVec[spIndex] = currentLocalAlphaVec[spIndex]; } else {//likelihood went down! LOG(2,<<"likelihood went down in optimizing local alpha"<(msp->getSp(spIndex)->distr()))->setAlpha(_bestLocalAlphaVec[spIndex]); } LOGnOUT(2,<<"Done with HKY local params optimization. LL: "<= sumVdouble(_bestLvec)) { _bestGlobalAlpha = currentGlobalAlpha; } else {//likelihood went down! LOG(2,<<"likelihood went down in optimizing global alpha"<setAlpha(_bestGlobalAlpha); //whether or not likelihood has improved we need to update _bestLvec _bestLvec = likelihoodComputation::getTreeLikelihoodProportionalAllPosAlphTheSame(et,sc,msp,pProportionDist,weights); LOGnOUT(2,<<"Done with global alpha optimization"< oldL+epsilonLikelihoodImprovment) { //all params have already been updated oldL = sumVdouble(_bestLvec); } else { break; } LOGnOUT(4,<<"Done with optimization iteration "<