static double evaluatePartialGTRCAT(int i, double ki, int counter, traversalInfo *ti, double qz, int w, double *EIGN, double *EI, double *EV, double *tipVector, unsigned char **yVector, int branchReference, int mxtips) { double lz, term; double d[3]; double *x1, *x2; int scale = 0, k; double *lVector = (double *)malloc_aligned(sizeof(double) * 4 * mxtips); traversalInfo *trav = &ti[0]; assert(isTip(trav->pNumber, mxtips)); x1 = &(tipVector[4 * yVector[trav->pNumber][i]]); for(k = 1; k < counter; k++) { double qz = ti[k].qz[branchReference], rz = ti[k].rz[branchReference]; qz = (qz > zmin) ? log(qz) : log(zmin); rz = (rz > zmin) ? log(rz) : log(zmin); computeVectorGTRCAT(lVector, &scale, ki, i, qz, rz, &ti[k], EIGN, EI, EV, tipVector, yVector, mxtips); } x2 = &lVector[4 * (trav->qNumber - mxtips)]; assert(0 <= (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips); if(qz < zmin) lz = zmin; lz = log(qz); lz *= ki; d[0] = EXP (EIGN[1] * lz); d[1] = EXP (EIGN[2] * lz); d[2] = EXP (EIGN[3] * lz); term = x1[0] * x2[0]; term += x1[1] * x2[1] * d[0]; term += x1[2] * x2[2] * d[1]; term += x1[3] * x2[3] * d[2]; term = LOG(FABS(term)) + (scale * LOG(minlikelihood)); term = term * w; free(lVector); return term; }
static double evaluatePartialGTRCAT(int i, double ki, int counter, traversalInfo *ti, double qz, int w, double *EIGN, double *EI, double *EV, double *tipVector, unsigned char **yVector, int branchReference, int mxtips, double* expVector) { double lz, term; double d[3]; double *x1, *x2; int scale = 0, k; double *lVector = (double *)rax_malloc(sizeof(double) * 4 * mxtips); traversalInfo *trav = &ti[0]; assert(isTip(trav->pNumber, mxtips)); x1 = &(tipVector[4 * yVector[trav->pNumber][i]]); if (!expVector) { for(k = 1; k < counter; k++) computeVectorGTRCAT(lVector, &scale, ki, i, ti[k].qz[branchReference], ti[k].rz[branchReference], &ti[k], EIGN, EI, EV, tipVector, yVector, mxtips); } else { for(k = 1; k < counter; k++) { double *ev1 = &expVector[k*6], *ev2 = &expVector[k*6+3]; computeVectorGTRCAT_FAST(lVector, &scale, ki, i, &ti[k], EI, EV, tipVector, yVector, mxtips, ev1, ev2); } } x2 = &lVector[4 * (trav->qNumber - mxtips)]; assert(0 <= (trav->qNumber - mxtips) && (trav->qNumber - mxtips) < mxtips); if(qz < zmin) lz = zmin; lz = log(qz); lz *= ki; d[0] = EXP (EIGN[0] * lz); d[1] = EXP (EIGN[1] * lz); d[2] = EXP (EIGN[2] * lz); term = x1[0] * x2[0]; term += x1[1] * x2[1] * d[0]; term += x1[2] * x2[2] * d[1]; term += x1[3] * x2[3] * d[2]; term = LOG(FABS(term)) + (scale * LOG(minlikelihood)); term = term * w; rax_free(lVector); return term; }