⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dnaml.c

📁 一个神经网络工具箱
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -