#include "definitions.h" #include "computeDownAlg.h" #include "computeUpAlg.h" #include "matrixUtils.h" #include "treeIt.h" #include "likelihoodComputation.h" #include "computePosteriorExpectationOfSubstitutions_nonReversibleSp.h" using namespace std; /******************************************************************************************** Posterior of observing a certain state substitution along a branch: P(Node=x,Father=y|D) = P(D,Node=x,Father=y)/P(D) usage: posteriorPerNodePer2States[mynode->id()][fatherState][sonState] *********************************************************************************************/ void computePosteriorExpectationOfSubstitutions_nonReversibleSp::computePosteriorOfChangeGivenTerminals(VVVdouble &posteriorPerNodePer2States, int pos){ int numNodes = _tr.getNodesNum(); int alphabetSize = _sp->alphabetSize(); posteriorPerNodePer2States.resize(numNodes); for (int n=0;nid()][fatherState][sonState]= computePosterioGivenTerminalsPerBranch(mynode->id(),sonState,fatherState,sscUp,sscDownNonRev, pi,ll,mynode->name()); } } } } /******************************************************************************************** Posterior of observing a certain state substitution along a branch: P(Node=sonState,Father=fatherState|D) = P(D,Node=sonState,Father=fatherState)/P(D) usage: posteriorPerNodePer2States[mynode->id()][fatherState][sonState] *********************************************************************************************/ MDOUBLE computePosteriorExpectationOfSubstitutions_nonReversibleSp::computePosterioGivenTerminalsPerBranch (int nodeId,int sonState, int fatherState,suffStatGlobalHomPos &sscUp, suffStatGlobalGamPos &sscDown,computePijHom &pi, MDOUBLE &LLData, const string nodeName) { MDOUBLE res=0.0; MDOUBLE resDXY, Down, Up, pij; for (int stateAtRoot = 0; stateAtRoot<_sp->alphabetSize(); ++stateAtRoot){ Down = convert(sscDown.get(stateAtRoot,nodeId,fatherState)); Up = convert(sscUp.get(nodeId,sonState)); pij = pi.getPij(nodeId,fatherState,sonState); res+=(_sp->freq(stateAtRoot)* Down* Up* pij); } resDXY = res; res/=LLData; // if(gainLossOptions::_printDEBUGinfo) // LOG(3,< 1 + 1e-4){ LOGnOUT(3,< 1 + 0.000001) || (res<-0.000001)){ string err = "Error in computePosteriorExpectationOfSubstitutions_nonReversibleSp::computePosterioGivenTerminalsPerBranch, non probability value "; err+=double2string(res); err+=" at node "; err+=int2string(nodeId); err+= " sonState "; err+= int2string(sonState); err+= " fatherState "; err+= int2string(fatherState); errorMsg::reportError(err); } return res; }