📄 dnaml.c
字号:
sib_back_ptr = sib_ptr->back; lw = - (sib_back_ptr->v); for (i = 0; i < rcategs; i++) for (j = 0; j < categs; j++) { tbl[i][j]->ww[sib_index] = exp(tbl[i][j]->ratxi * lw); tbl[i][j]->zz[sib_index] = exp(tbl[i][j]->ratxv * lw); tbl[i][j]->wwzz[sib_index] = tbl[i][j]->ww[sib_index] * tbl[i][j]->zz[sib_index]; tbl[i][j]->vvzz[sib_index] = (1.0 - tbl[i][j]->ww[sib_index]) * tbl[i][j]->zz[sib_index]; } } /* Loop 2: */ for (i = 0; i < endsite; i++) { k = category[alias[i]-1] - 1; for (j = 0; j < rcategs; j++) { /* Loop 2.1 */ sib_ptr = p; for (sib_index=0; sib_index < num_sibs; sib_index++) { sib_ptr = sib_ptr->next; sib_back_ptr = sib_ptr->back; local_nvd->wwzz[sib_index] = tbl[j][k]->wwzz[sib_index]; local_nvd->vvzz[sib_index] = tbl[j][k]->vvzz[sib_index]; local_nvd->yy[sib_index] = 1.0 - tbl[j][k]->zz[sib_index]; memcpy(local_nvd->xx[sib_index], sib_back_ptr->x[i][j], sizeof(sitelike)); } /* Loop 2.2 */ for (sib_index=0; sib_index < num_sibs; sib_index++) { local_nvd->sum[sib_index] = local_nvd->yy[sib_index] * (freqa * local_nvd->xx[sib_index][(long)A] + freqc * local_nvd->xx[sib_index][(long)C] + freqg * local_nvd->xx[sib_index][(long)G] + freqt * local_nvd->xx[sib_index][(long)T]); local_nvd->sumr[sib_index] = freqar * local_nvd->xx[sib_index][(long)A] + freqgr * local_nvd->xx[sib_index][(long)G]; local_nvd->sumy[sib_index] = freqcy * local_nvd->xx[sib_index][(long)C] + freqty * local_nvd->xx[sib_index][(long)T]; local_nvd->vzsumr[sib_index] = local_nvd->vvzz[sib_index] * local_nvd->sumr[sib_index]; local_nvd->vzsumy[sib_index] = local_nvd->vvzz[sib_index] * local_nvd->sumy[sib_index]; } /* Initialize to one, multiply incremental values for every sibling a node has */ p_xx[(long)A] = 1 ; p_xx[(long)C] = 1 ; p_xx[(long)G] = 1 ; p_xx[(long)T] = 1 ; for (sib_index=0; sib_index < num_sibs; sib_index++) { p_xx[(long)A] *= local_nvd->sum[sib_index] + local_nvd->wwzz[sib_index] * local_nvd->xx[sib_index][(long)A] + local_nvd->vzsumr[sib_index]; p_xx[(long)C] *= local_nvd->sum[sib_index] + local_nvd->wwzz[sib_index] * local_nvd->xx[sib_index][(long)C] + local_nvd->vzsumy[sib_index]; p_xx[(long)G] *= local_nvd->sum[sib_index] + local_nvd->wwzz[sib_index] * local_nvd->xx[sib_index][(long)G] + local_nvd->vzsumr[sib_index]; p_xx[(long)T] *= local_nvd->sum[sib_index] + local_nvd->wwzz[sib_index] * local_nvd->xx[sib_index][(long)T] + local_nvd->vzsumy[sib_index]; } /* And the final point of this whole function: */ memcpy(p->x[i][j], p_xx, sizeof(sitelike)); } } p->initialized = true; free_nvd (local_nvd); free (local_nvd);} /* nuview */void slopecurv(node *p,double y,double *like,double *slope,double *curve){ /* compute log likelihood, slope and curvature at node p */ long i, j, k, lai; double sum, sumc, sumterm, lterm, sumcs, sumcc, sum2, slope2, curve2, temp; double lz, zz, z1, zzs, z1s, zzc, z1c, aa, bb, cc, prod1, prod2, prod12, prod3; contribarr thelike, nulike, nuslope, nucurve, theslope, thecurve, clai, cslai, cclai; node *q; sitelike x1, x2; q = p->back; sum = 0.0; lz = -y; for (i = 0; i < rcategs; i++) for (j = 0; j < categs; j++) { tbl[i][j]->orig_zz = exp(tbl[i][j]->rat * lz); tbl[i][j]->z1 = exp(tbl[i][j]->ratxv * lz); } for (i = 0; i < endsite; i++) { k = category[alias[i]-1] - 1; for (j = 0; j < rcategs; j++) { if (y > 0.0) { zz = tbl[j][k]->orig_zz; z1 = tbl[j][k]->z1; } else { zz = 1.0; z1 = 1.0; } zzs = -tbl[j][k]->rat * zz ; z1s = -tbl[j][k]->ratxv * z1 ; temp = tbl[j][k]->rat; zzc = temp * temp * zz; temp = tbl[j][k]->ratxv; z1c = temp * temp * z1; memcpy(x1, p->x[i][j], sizeof(sitelike)); prod1 = freqa * x1[0] + freqc * x1[(long)C - (long)A] + freqg * x1[(long)G - (long)A] + freqt * x1[(long)T - (long)A]; memcpy(x2, q->x[i][j], sizeof(sitelike)); prod2 = freqa * x2[0] + freqc * x2[(long)C - (long)A] + freqg * x2[(long)G - (long)A] + freqt * x2[(long)T - (long)A]; prod3 = (x1[0] * freqa + x1[(long)G - (long)A] * freqg) * (x2[0] * freqar + x2[(long)G - (long)A] * freqgr) + (x1[(long)C - (long)A] * freqc + x1[(long)T - (long)A] * freqt) * (x2[(long)C - (long)A] * freqcy + x2[(long)T - (long)A] * freqty); prod12 = freqa * x1[0] * x2[0] + freqc * x1[(long)C - (long)A] * x2[(long)C - (long)A] + freqg * x1[(long)G - (long)A] * x2[(long)G - (long)A] + freqt * x1[(long)T - (long)A] * x2[(long)T - (long)A]; aa = prod12 - prod3; bb = prod3 - prod1*prod2; cc = prod1 * prod2; term[i][j] = zz * aa + z1 * bb + cc; slopeterm[i][j] = zzs * aa + z1s * bb; curveterm[i][j] = zzc * aa + z1c * bb; } sumterm = 0.0; for (j = 0; j < rcategs; j++) sumterm += probcat[j] * term[i][j]; lterm = log(sumterm); for (j = 0; j < rcategs; j++) { term[i][j] = term[i][j] / sumterm; slopeterm[i][j] = slopeterm[i][j] / sumterm; curveterm[i][j] = curveterm[i][j] / sumterm; } sum += aliasweight[i] * lterm; } for (i = 0; i < rcategs; i++) { thelike[i] = 1.0; theslope[i] = 0.0; thecurve[i] = 0.0; } for (i = 0; i < sites; i++) { sumc = 0.0; sumcs = 0.0; sumcc = 0.0; for (k = 0; k < rcategs; k++) { sumc += probcat[k] * thelike[k]; sumcs += probcat[k] * theslope[k]; sumcc += probcat[k] * thecurve[k]; } sumc *= lambda; sumcs *= lambda; sumcc *= lambda; if ((ally[i] > 0) && (location[ally[i]-1] > 0)) { lai = location[ally[i] - 1]; memcpy(clai, term[lai - 1], rcategs*sizeof(double)); memcpy(cslai, slopeterm[lai - 1], rcategs*sizeof(double)); memcpy(cclai, curveterm[lai - 1], rcategs*sizeof(double)); if (weight[i] > 1) { for (j = 0; j < rcategs; j++) { if (clai[j] > 0.0) clai[j] = exp(weight[i]*log(clai[j])); else clai[j] = 0.0; if (cslai[j] > 0.0) cslai[j] = exp(weight[i]*log(cslai[j])); else cslai[j] = 0.0; if (cclai[j] > 0.0) cclai[j] = exp(weight[i]*log(cclai[j])); else cclai[j] = 0.0; } } for (j = 0; j < rcategs; j++) { nulike[j] = ((1.0 - lambda) * thelike[j] + sumc) * clai[j]; nuslope[j] = ((1.0 - lambda) * theslope[j] + sumcs) * clai[j] + ((1.0 - lambda) * thelike[j] + sumc) * cslai[j]; nucurve[j] = ((1.0 - lambda) * thecurve[j] + sumcc) * clai[j] + 2.0 * ((1.0 - lambda) * theslope[j] + sumcs) * cslai[j] + ((1.0 - lambda) * thelike[j] + sumc) * cclai[j]; } } else { for (j = 0; j < rcategs; j++) { nulike[j] = ((1.0 - lambda) * thelike[j] + sumc); nuslope[j] = ((1.0 - lambda) * theslope[j] + sumcs); nucurve[j] = ((1.0 - lambda) * thecurve[j] + sumcc); } } memcpy(thelike, nulike, rcategs*sizeof(double)); memcpy(theslope, nuslope, rcategs*sizeof(double)); memcpy(thecurve, nucurve, rcategs*sizeof(double)); } sum2 = 0.0; slope2 = 0.0; curve2 = 0.0; for (i = 0; i < rcategs; i++) { sum2 += probcat[i] * thelike[i]; slope2 += probcat[i] * theslope[i]; curve2 += probcat[i] * thecurve[i]; } sum += log(sum2); (*like) = sum; (*slope) = slope2 / sum2; (*curve) = (curve2 - slope2 * slope2 / sum2) / sum2;} /* slopecurv */void makenewv(node *p){ /* Newton-Raphson algorithm improvement of a branch length */ long it, ite; double y, yold=0, yorig, like, slope, curve, oldlike=0; boolean done, firsttime, better; node *q; q = p->back; y = p->v; yorig = y; done = false; firsttime = true; it = 1; ite = 0; while ((it < iterations) && (ite < 20) && (!done)) { slopecurv (p, y, &like, &slope, &curve); better = false; if (firsttime) { yold = y; oldlike = like; firsttime = false; better = true; } else { if (like > oldlike) { yold = y; oldlike = like; better = true; it++; } } if (better) { y = y + slope/fabs(curve); if (yold < epsilon) yold = epsilon; } else { if (fabs(y - yold) < epsilon) ite = 20; y = (y + 19*yold) / 20.0; } ite++; done = fabs(y-yold) < epsilon; } smoothed = (fabs(yold-yorig) < epsilon) && (yorig > 1000.0*epsilon); p->v = yold; q->v = yold; curtree.likelihood = oldlike;} /* makenewv */void update(node *p){ long num_sibs, i; node *sib_ptr; if (!p->tip && !p->initialized) nuview(p); if (!p->back->tip && !p->back->initialized) nuview(p->back); if ((!usertree) || (usertree && !lngths) || p->iter) { makenewv(p); if (!p->tip) { num_sibs = count_sibs (p); sib_ptr = p; for (i=0; i < num_sibs; i++) { sib_ptr = sib_ptr->next; sib_ptr->initialized = false; } } if (!p->back->tip) { num_sibs = count_sibs (p->back); sib_ptr = p->back; for (i=0; i < num_sibs; i++) { sib_ptr = sib_ptr->next; sib_ptr->initialized = false; } } }} /* update */void smooth(node *p){ long i, num_sibs; node *sib_ptr; smoothed = false; update (p); if (p->tip) return; num_sibs = count_sibs (p); sib_ptr = p; for (i=0; i < num_sibs; i++) { sib_ptr = sib_ptr->next; if (polishing || (smoothit && !smoothed)) { smooth(sib_ptr->back); p->initialized = false; sib_ptr->initialized = false; } }} /* smooth */void insert_(node *p, node *q, boolean dooinit){ /* Insert q near p */ long i, j, num_sibs; node *r, *sib_ptr; r = p->next->next; hookup(r, q->back); hookup(p->next, q); q->v = 0.5 * q->v; q->back->v = q->v; r->v = q->v; r->back->v = r->v; p->initialized = false; p->next->initialized = false; p->next->next->initialized = false; if (dooinit) { inittrav(p); inittrav(q); inittrav(q->back); } i = 1; while (i <= smoothings) { smooth (p); if (!smoothit) { if (!p->tip) { num_sibs = count_sibs (p); sib_ptr = p; for (j=0; j < num_sibs; j++) { smooth (sib_ptr->next->back); sib_ptr = sib_ptr->next; } } } else smooth(p->back); i++; }} /* insert_ */void dnaml_re_move(node **p, node **q){ /* remove p and record in q where it was */ long i; /** assumes bifurcations */ *q = (*p)->next->back; hookup(*q, (*p)->next->next->back); (*p)->next->back = NULL; (*p)->next->next->back = NULL; inittrav((*q)); inittrav((*q)->back); i = 1; while (i <= smoothings) { smooth(*q); if (smoothit) smooth((*q)->back); i++; }} /* dnaml_re_move */void buildnewtip(long m, tree *tr){ node *p; p = tr->nodep[nextsp + spp - 3]; hookup(tr->nodep[m - 1], p); p->v = initialv; p->back->v = initialv;} /* buildnewtip */void buildsimpletree(tree *tr){ hookup(tr->nodep[enterorder[0] - 1], tr->nodep[enterorder[1] - 1]); tr->nodep[enterorder[0] - 1]->v = 0.1; tr->nodep[enterorder[0] - 1]->back->v = 0.1; tr->nodep[enterorder[1] - 1]->v = 0.1; tr->nodep[enterorder[1] - 1]->back->v = 0.1; buildnewtip(enterorder[2], tr); insert_(tr->nodep[enterorder[2] - 1]->back, tr->nodep[enterorder[0] - 1], false);} /* buildsimpletree2 */void addtraverse(node *p, node *q, boolean contin){ /* try adding p at q, proceed recursively through tree */ long i, num_sibs; double like, vsave = 0; node *qback = NULL, *sib_ptr; if (!smoothit) { vsave = q->v; qback = q->back; } insert_(p, q, false); like = evaluate(p, false); if (like > bestyet || bestyet == UNDEFINED) { bestyet = like; if (smoothit) dnamlcopy(&curtree, &bestree, nonodes2, rcategs); else qwhere = q; succeeded = true; } if (smoothit) dnamlcopy(&priortree, &curtree, nonodes2, rcategs); else { hookup (q, qback); q->v = vsave; q->back->v = vsave; curtree.likelihood = bestyet; } if (!q->tip && contin) { num_sibs = count_sibs (q); if (q == curtree.start) num_sibs++; sib_ptr = q; for (i=0; i < num_sibs; i++) { addtraverse(p, sib_ptr->next->back, contin); sib_ptr = sib_ptr->next; } }} /* addtraverse */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -