double processInternalChild(Sequence &parentNmer,int childID, NthOrdSubstMatrix &Pt) { Array2D<double>::RowIn2DArray<double> row=L[childID]; Array1D<double> V(numNmers); Sequence childNmer; for(int i=0 ; i<numNmers ; ++i) { childNmer.fromInt(i,numCols,alphabetMap); double joint=jointProb(parentNmer,childNmer,Pt); V[i]=safeAdd(joint,row[i]); } double ll=sumLogProbs(V); return ll; }
virtual void processNode(InternalNode &u) { int id=u.getID(); Array2D<double>::RowIn2DArray<double> row=L[id]; int left=u.getLeft()->getID(), right=u.getRight()->getID(); NthOrdSubstMatrix &leftPt=*u.getLeftSubstMatrix(); NthOrdSubstMatrix &rightPt=*u.getRightSubstMatrix(); Sequence nmer; for(int i=0 ; i<numNmers ; ++i) { nmer.fromInt(i,numCols,alphabetMap); row[i]= processInternalChild(nmer,left,leftPt)+ processInternalChild(nmer,right,rightPt); } }
void NmerRateMatrix::eqFreqsFromMarginals(Array1D<double> singleNucEqFreqs) { eqSingle=singleNucEqFreqs; const int n=order+1; Sequence nmer; for(int i=0 ; i<numNmers ; ++i) { nmer.fromInt(i,n,alphabetMap); double P=1.0; for(int pos=0 ; pos<n ; ++pos) { P*=singleNucEqFreqs[nmer[pos]]; // ### should be in log space?? //cout<<singleNucEqFreqs[nmer[pos]]<<" * "; } //cout<<" = "<<P<<endl; eq[i]=P; } if(lowerOrderModel) static_cast<NmerRateMatrix*>(lowerOrderModel)-> eqFreqsFromMarginals(singleNucEqFreqs); }