#include "bestAlphaAndK.h" #include "computePijComponent.h" #include "betaOmegaDistribution.h" #include "codonUtils.h" optimizeSelectonParameters::optimizeSelectonParameters(tree& et, //find Best params and best BBL const sequenceContainer& sc, vector& spVec, distribution * distr, bool bblFlag, bool isGamma, bool isBetaProbSet,bool isOmegaSet, bool isKappaSet, bool isAlphaSet, bool isBetaSet, const MDOUBLE upperBoundOnAlpha, const MDOUBLE upperBoundOnBeta, const MDOUBLE epsilonAlphaOptimization, const MDOUBLE epsilonKOptimization, const MDOUBLE epsilonLikelihoodImprovment, const int maxBBLIterations, const int maxTotalIterations){ //initialization MDOUBLE lowerValueOfParamK = 0; MDOUBLE lowerValueOfParamAlpha = 0.1; MDOUBLE lowerValueOfParamBeta = 0.1; MDOUBLE omegaLowerBoundary = 0.99; // this is to allow brent to reach the exact lower bound value MDOUBLE omegaUpperBoundary = 5.0; MDOUBLE upperValueOfParamK = 5; // changed from 50, Adi S. 2/1/07 MDOUBLE initialGuessValueOfParamTr; initialGuessValueOfParamTr = _bestK = static_cast(spVec[0].getPijAccelerator()->getReplacementModel())->getK(); MDOUBLE initialGuessValueOfParamAlpha; if (isGamma) initialGuessValueOfParamAlpha = _bestAlpha = static_cast(distr)->getAlpha(); else initialGuessValueOfParamAlpha = _bestAlpha = static_cast(distr)->getAlpha(); MDOUBLE initialGuessValueOfParamBeta; if (isGamma) initialGuessValueOfParamBeta = _bestBeta = static_cast(distr)->getBeta(); else initialGuessValueOfParamBeta = _bestBeta = static_cast(distr)->getBeta(); MDOUBLE initialGuessValueOfParamOmega = -1; MDOUBLE initialGuessValueOfParamBetaProb = -1; if (!isGamma) { initialGuessValueOfParamOmega = _bestOmega = static_cast(distr)->getOmega(); initialGuessValueOfParamBetaProb = _bestBetaProb = static_cast(distr)->getBetaProb(); } _bestL = likelihoodComputation2Codon::getTreeLikelihoodAllPosAlphTheSame(et,sc,spVec,distr);; MDOUBLE newL = _bestL; MDOUBLE alphaFound = 0; MDOUBLE kFound = 0; MDOUBLE betaFound = 0; MDOUBLE omegaFound = 0; MDOUBLE betaProbFound = 0; bool changed = false; int i=0; LOG(5,< _bestL+epsilonLikelihoodImprovment) { _bestL = newL; changed = true; } } if (changed==false) break; } LOG(5,<clone(); } MDOUBLE evalParam::operator()(MDOUBLE param){ if (_alphaOrKs==-1) updateAlpha(param); else if (_alphaOrKs==-2) updateBeta(param); else if (_alphaOrKs==0) updateK(param); else if (_alphaOrKs==1) updateOmega(param); else if (_alphaOrKs==2) updateBetaProb(param); MDOUBLE res = likelihoodComputation2Codon::getTreeLikelihoodAllPosAlphTheSame(_et,_sc,_spVec,_distr); return -res; //return -log(likelihood). } void evalParam::updateBeta(MDOUBLE param){ if (_isGamma) static_cast(_distr)->setBeta(param); else static_cast(_distr)->setBeta(param); for (int categor = 0; categor < _spVec.size();categor++){ static_cast(_spVec[categor].getPijAccelerator()->getReplacementModel())->setW(_distr->rates(categor)); } normalizeMatrices(_spVec,_distr); } void evalParam::updateAlpha(MDOUBLE param){ if (_isGamma)static_cast(_distr)->setAlpha(param); else static_cast(_distr)->setAlpha(param); for (int categor = 0; categor < _spVec.size();categor++){ static_cast(_spVec[categor].getPijAccelerator()->getReplacementModel())->setW(_distr->rates(categor)); } normalizeMatrices(_spVec,_distr); } void evalParam::updateK(MDOUBLE param){ for (int categor = 0; categor < _spVec.size();categor++){ static_cast(_spVec[categor].getPijAccelerator()->getReplacementModel())->setK(param); } normalizeMatrices(_spVec,_distr); } void evalParam::updateOmega(MDOUBLE param){ int size = _spVec.size(); static_cast(_spVec[size-1].getPijAccelerator()->getReplacementModel())->setW(param); normalizeMatrices(_spVec,_distr); } void evalParam::updateBetaProb(MDOUBLE param){ static_cast(_distr)->setBetaProb(param); normalizeMatrices(_spVec,_distr); }