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

📄 proml.c

📁 一个神经网络工具箱
💻 C
📖 第 1 页 / 共 5 页
字号:
      }      putc('\n', outfile);    }    putc('\n', outfile);  }  putc('\n', outfile);}  /* input_protdata */void makeweights(){  /* make up weights vector to avoid duplicate computations */  long i;  for (i = 1; i <= sites; i++) {    alias[i - 1] = i;    ally[i - 1] = 0;    aliasweight[i - 1] = weight[i - 1];    location[i - 1] = 0;  }  sitesort2   (sites, aliasweight);  sitecombine2(sites, aliasweight);  sitescrunch2(sites, 1, 2, aliasweight);  for (i = 1; i <= sites; i++) {    if (aliasweight[i - 1] > 0)      endsite = i;  }  for (i = 1; i <= endsite; i++) {    location[alias[i - 1] - 1] = i;    ally[alias[i - 1] - 1] = alias[i - 1];  }  term = (double **) Malloc(endsite * sizeof(double *));  for (i = 0; i < endsite; i++)     term[i] = (double *) Malloc(rcategs * sizeof(double));  slopeterm = (double **) Malloc(endsite * sizeof(double *));  for (i = 0; i < endsite; i++)     slopeterm[i] = (double *) Malloc(rcategs * sizeof(double));  curveterm = (double **) Malloc(endsite * sizeof(double *));  for (i = 0; i < endsite; i++)     curveterm[i] = (double *) Malloc(rcategs * sizeof(double));  mp = (vall *) Malloc(sites*sizeof(vall));  contribution = (contribarr *) Malloc(endsite*sizeof(contribarr));}  /* makeweights */void prot_makevalues(long categs, pointarray treenode, long endsite,                        long spp, sequence y, steptr alias){  /* set up fractional likelihoods at tips   */  /* a version of makevalues2 found in seq.c */  /* used by proml                             */  long i, j, k, l;  long b;  for (k = 0; k < endsite; k++) {    j = alias[k];    for (i = 0; i < spp; i++) {      for (l = 0; l < categs; l++) {        memset(treenode[i]->protx[k][l], 0, sizeof(double)*20);        switch (y[i][j - 1]) {        case 'A':          treenode[i]->protx[k][l][0] = 1.0;          break;        case 'R':          treenode[i]->protx[k][l][(long)arginine   - (long)alanine] = 1.0;          break;        case 'N':          treenode[i]->protx[k][l][(long)asparagine - (long)alanine] = 1.0;          break;        case 'D':          treenode[i]->protx[k][l][(long)aspartic   - (long)alanine] = 1.0;          break;        case 'C':          treenode[i]->protx[k][l][(long)cysteine   - (long)alanine] = 1.0;          break;        case 'Q':          treenode[i]->protx[k][l][(long)glutamine  - (long)alanine] = 1.0;          break;        case 'E':          treenode[i]->protx[k][l][(long)glutamic   - (long)alanine] = 1.0;          break;        case 'G':          treenode[i]->protx[k][l][(long)glycine    - (long)alanine] = 1.0;          break;        case 'H':          treenode[i]->protx[k][l][(long)histidine  - (long)alanine] = 1.0;          break;        case 'I':          treenode[i]->protx[k][l][(long)isoleucine - (long)alanine] = 1.0;          break;        case 'L':          treenode[i]->protx[k][l][(long)leucine    - (long)alanine] = 1.0;          break;        case 'K':          treenode[i]->protx[k][l][(long)lysine     - (long)alanine] = 1.0;          break;        case 'M':          treenode[i]->protx[k][l][(long)methionine - (long)alanine] = 1.0;          break;        case 'F':          treenode[i]->protx[k][l][(long)phenylalanine - (long)alanine] = 1.0;          break;        case 'P':          treenode[i]->protx[k][l][(long)proline    - (long)alanine] = 1.0;          break;        case 'S':          treenode[i]->protx[k][l][(long)serine     - (long)alanine] = 1.0;          break;        case 'T':          treenode[i]->protx[k][l][(long)threonine  - (long)alanine] = 1.0;          break;        case 'W':          treenode[i]->protx[k][l][(long)tryptophan - (long)alanine] = 1.0;          break;        case 'Y':          treenode[i]->protx[k][l][(long)tyrosine   - (long)alanine] = 1.0;          break;        case 'V':          treenode[i]->protx[k][l][(long)valine     - (long)alanine] = 1.0;          break;        case 'B':          treenode[i]->protx[k][l][(long)asparagine - (long)alanine] = 1.0;          treenode[i]->protx[k][l][(long)aspartic   - (long)alanine] = 1.0;          break;        case 'Z':          treenode[i]->protx[k][l][(long)glutamine  - (long)alanine] = 1.0;          treenode[i]->protx[k][l][(long)glutamic   - (long)alanine] = 1.0;          break;        case 'X':                /* unknown aa                            */          for (b = 0; b <= 19; b++)            treenode[i]->protx[k][l][b] = 1.0;          break;        case '?':                /* unknown aa                            */          for (b = 0; b <= 19; b++)            treenode[i]->protx[k][l][b] = 1.0;          break;        case '*':                /* stop codon symbol                    */          for (b = 0; b <= 19; b++)            treenode[i]->protx[k][l][b] = 1.0;          break;        case '-':                /* deletion event-absent data or aa */          for (b = 0; b <= 19; b++)            treenode[i]->protx[k][l][b] = 1.0;          break;        }      }    }  }}  /* prot_makevalues */void alloc_pmatrix(long sib){  /* Allocate memory for a new pmatrix.  Called iff num_sibs>max_num_sibs */  long j, k, l;  double ****temp_matrix;  temp_matrix = (double ****) Malloc (rcategs * sizeof(double ***));  for (j = 0; j < rcategs; j++) {    temp_matrix[j] = (double ***) Malloc(categs * sizeof(double **));    for (k = 0; k < categs; k++) {      temp_matrix[j][k] = (double **) Malloc(20 * sizeof (double *));      for (l = 0; l < 20; l++)        temp_matrix[j][k][l] = (double *) Malloc(20 * sizeof(double));    }  }  pmatrices[sib] = temp_matrix;  max_num_sibs++;}  /* alloc_pmatrix */void prot_inittable(){  /* Define a lookup table. Precompute values and print them out in tables */  /* Allocate memory for the pmatrices, dpmatices and ddpmatrices          */  long i, j, k, l;  double sumrates;  /* Allocate memory for pmatrices, the array of pointers to pmatrices     */  pmatrices = (double *****) Malloc ( spp * sizeof(double ****));  /* Allocate memory for the first 2 pmatrices, the matrix of conversion   */  /* probabilities, but only once per run (aka not on the second jumble.   */    alloc_pmatrix(0);    alloc_pmatrix(1);  /*  Allocate memory for one dpmatrix, the first derivative matrix        */  dpmatrix = (double ****) Malloc( rcategs * sizeof(double ***));  for (j = 0; j < rcategs; j++) {    dpmatrix[j] = (double ***) Malloc( categs * sizeof(double **));    for (k = 0; k < categs; k++) {      dpmatrix[j][k] = (double **) Malloc( 20 * sizeof(double *));      for (l = 0; l < 20; l++)        dpmatrix[j][k][l] = (double *) Malloc( 20 * sizeof(double));    }  }  /*  Allocate memory for one ddpmatrix, the second derivative matrix      */  ddpmatrix = (double ****) Malloc( rcategs * sizeof(double ***));  for (j = 0; j < rcategs; j++) {    ddpmatrix[j] = (double ***) Malloc( categs * sizeof(double **));    for (k = 0; k < categs; k++) {      ddpmatrix[j][k] = (double **) Malloc( 20 * sizeof(double *));      for (l = 0; l < 20; l++)        ddpmatrix[j][k][l] = (double *) Malloc( 20 * sizeof(double));    }  }  /* Allocate memory and assign values to tbl, the matrix of possible rates*/  tbl = (double **) Malloc( rcategs * sizeof(double *));  for (j = 0; j < rcategs; j++)    tbl[j] = (double *) Malloc( categs * sizeof(double));  for (j = 0; j < rcategs; j++)    for (k = 0; k < categs; k++)      tbl[j][k] = rrate[j]*rate[k];  sumrates = 0.0;  for (i = 0; i < endsite; i++) {    for (j = 0; j < rcategs; j++)      sumrates += aliasweight[i] * probcat[j]        * tbl[j][category[alias[i] - 1] - 1];  }  sumrates /= (double)sites;  for (j = 0; j < rcategs; j++)    for (k = 0; k < categs; k++) {      tbl[j][k] /= sumrates;    }  if (gama) {    fprintf(outfile, "\nDiscrete approximation to gamma distributed rates\n");    fprintf(outfile,    " Coefficient of variation of rates = %f  (alpha = %f)\n",      cv, alpha);  }  if (rcategs > 1) {    fprintf(outfile, "\nStates in HMM   Rate of change    Probability\n\n");    for (i = 0; i < rcategs; i++)      if (probcat[i] < 0.0001)        fprintf(outfile, "%9ld%16.3f%20.6f\n", i+1, rrate[i], probcat[i]);      else if (probcat[i] < 0.001)          fprintf(outfile, "%9ld%16.3f%19.5f\n", i+1, rrate[i], probcat[i]);        else if (probcat[i] < 0.01)            fprintf(outfile, "%9ld%16.3f%18.4f\n", i+1, rrate[i], probcat[i]);          else            fprintf(outfile, "%9ld%16.3f%17.3f\n", i+1, rrate[i], probcat[i]);    putc('\n', outfile);    if (auto_)      fprintf(outfile,     "Expected length of a patch of sites having the same rate = %8.3f\n",             1/lambda);    putc('\n', outfile);  }  if (categs > 1) {    fprintf(outfile, "\nSite category   Rate of change\n\n");    for (k = 0; k < categs; k++)      fprintf(outfile, "%9ld%16.3f\n", k+1, rate[k]);  }  if ((rcategs  > 1) || (categs >> 1))    fprintf(outfile, "\n\n");}  /* prot_inittable */void getinput(){  /* reads the input data */  if (!justwts || firstset)    inputoptions();  if (!justwts || firstset)    input_protdata(sites);  makeweights();  setuptree2(curtree);  if (!usertree || reconsider) {    setuptree2(bestree);    setuptree2(priortree);    if (njumble > 1)      setuptree2(bestree2);  }  prot_allocx(nonodes2, rcategs, curtree.nodep, usertree);  if (!usertree || reconsider) {    prot_allocx(nonodes2, rcategs, bestree.nodep, 0);    prot_allocx(nonodes2, rcategs, priortree.nodep, 0);    if (njumble > 1)      prot_allocx(nonodes2, rcategs, bestree2.nodep, 0);  }  prot_makevalues(rcategs, curtree.nodep, endsite, spp, y, alias);}  /* getinput */void inittravtree(node *p){  /* traverse tree to set initialized and v to initial values */  p->initialized = false;  p->back->initialized = false;  if (!p->tip) {    inittravtree(p->next->back);    inittravtree(p->next->next->back);  }}  /* inittravtree */void prot_nuview(node *p){  long i, j, k, l, m, num_sibs, sib_index;  node *sib_ptr, *sib_back_ptr;  psitelike prot_xx, x2;  double lw, prod7;  double **pmat;  /* Figure out how many siblings the current node has  */  /* and be sure that pmatrices is large enough         */  num_sibs = count_sibs(p);  for (i = 0; i < num_sibs; i++)    if (pmatrices[i] == NULL)      alloc_pmatrix(i);  /* Recursive calls, should be called for all children */  sib_ptr = p;  for (i=0 ; i < num_sibs; i++) {    sib_ptr      = sib_ptr->next;    sib_back_ptr = sib_ptr->back;    if (!sib_back_ptr->tip &&        !sib_back_ptr->initialized)      prot_nuview(sib_back_ptr);  }  /* Make pmatrices for all possible combinations of category, rcateg      */  /* and sib                                                                   */  sib_ptr = p;                                /* return to p */  for (sib_index=0; sib_index < num_sibs; sib_index++) {    sib_ptr      = sib_ptr->next;    sib_back_ptr = sib_ptr->back;    lw = sib_back_ptr->v;    for (j = 0; j < rcategs; j++)      for (k = 0; k < categs; k++)        make_pmatrix(pmatrices[sib_index][j][k], NULL, NULL, 0, lw,                                        tbl[j][k], eigmat, probmat);  }  for (i = 0; i < endsite; i++) {    k = category[alias[i]-1] - 1;    for (j = 0; j < rcategs; j++) {      /* initialize to 1 all values of prot_xx */      for (m = 0; m <= 19; m++)        prot_xx[m] = 1;      sib_ptr = p;                        /* return to p */      /* loop through all sibs and calculate likelihoods for all possible*/      /* amino acid combinations                                         */      for (sib_index=0; sib_index < num_sibs; sib_index++) {        sib_ptr      = sib_ptr->next;        sib_back_ptr = sib_ptr->back;        memcpy(x2, sib_back_ptr->protx[i][j], sizeof(psitelike));        pmat = pmatrices[sib_index][j][k];        for (m = 0; m <= 19; m++) {          prod7 = 0;          for (l = 0; l <= 19; l++)            prod7 += (pmat[m][l] * x2[l]);          prot_xx[m] *= prod7;        }      }      /* And the final point of this whole function: */      memcpy(p->protx[i][j], prot_xx, sizeof(psitelike));    }  }  p->initialized = true;}  /* prot_nuview */void prot_slopecurv(node *p,double y,double *like,double *slope,double *curve){  /* compute log likelihood, slope and curvature at node p */  long i, j, k, l, m, lai;  double sum, sumc, sumterm, lterm, sumcs, sumcc, sum2, slope2, curve2;  double frexm = 0;                        /* frexm = freqaa[m]*x1[m] */                                        /* frexml = frexm*x2[l]    */  double prod4m, prod5m, prod6m;        /* elements of prod4-5 for */                                        /* each m                   */  double **pmat, **dpmat, **ddpmat;        /* local pointers to global*/                                        /* matrices                   */  double prod4, prod5, prod6;  contribarr thelike, nulike, nuslope, nucurve,    theslope, thecurve, clai, cslai, cclai;  node *q;  psitelike x1, x2;  q = p->back;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -