示例#1
0
void update(node *p)
{ /* update branch lengths around a node */
  boolean negatives;

  if (p->tip)
    return;
  makedists(p);
  makebigv(p,&negatives);
  if (negatives)
    correctv(p);
  littlev(p);
  nuview(p);
}  /* update */
示例#2
0
void update(node *p)
{
  /* update branch lengths around a node */

  if (p->tip)
    return;
  makedists(p);
  if (p->iter || p->next->iter || p->next->next->iter) {
    makebigv(p);
    correctv(p);
  }
  nuview(p);
}  /* update */
示例#3
0
文件: stdfns.c 项目: jujaga/CSC-464
double evaluate(node *p, boolean saveit)
{
#ifdef CALLCOUNT
	printf("evaluate\n");
#endif
#ifdef TIMINGS
	get_start_time(eval_tk);
#endif 
	
	contribarr tterm;
	double sum, sum2, sumc, y, lz, y1, z1zz, z1yy, prod12, prod1, prod2, prod3,
	sumterm, lterm;
	long i, j, k, lai;
	node *q;
	sitelike x1, x2;
	
	sum = 0.0;
	q = p->back;
	if ( p->initialized  == false && p->tip == false)  nuview(p);
	if ( q->initialized  == false && q->tip == false)  nuview(q);
	y = p->v;
	lz = -y;
	for (i = 0; i < rcategs; i++)
		for (j = 0; j < categs; j++) {
			tbl[i][j]->orig_zz = exp(tbl[i][j]->ratxi * lz);
			tbl[i][j]->z1 = exp(tbl[i][j]->ratxv * lz);
			tbl[i][j]->z1zz = tbl[i][j]->z1 * tbl[i][j]->orig_zz;
			tbl[i][j]->z1yy = tbl[i][j]->z1 - tbl[i][j]->z1zz;
		}
	for (i = 0; i < endsite; i++) {
		k = category[alias[i]-1] - 1;
		for (j = 0; j < rcategs; j++) {
			if (y > 0.0) {
				y1 = 1.0 - tbl[j][k]->z1;
				z1zz = tbl[j][k]->z1zz;
				z1yy = tbl[j][k]->z1yy;
			} else {
				y1 = 0.0;
				z1zz = 1.0;
				z1yy = 0.0;
			}
			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];
			tterm[j] = z1zz * prod12 + z1yy * prod3 + y1 * prod1 * prod2;
		}
		sumterm = 0.0;
		for (j = 0; j < rcategs; j++)
			sumterm += probcat[j] * tterm[j];
		lterm = log(sumterm) + p->underflows[i] + q->underflows[i];
		for (j = 0; j < rcategs; j++)
			clai[j] = tterm[j] / sumterm;
		memcpy(contribution[i], clai, rcategs*sizeof(double));
		if (saveit && !auto_ && usertree && (which <= shimotrees))
			l0gf[which - 1][i] = lterm;
		sum += aliasweight[i] * lterm;
	}
	for (j = 0; j < rcategs; j++)
		like[j] = 1.0;
	for (i = 0; i < sites; i++) {
		sumc = 0.0;
		for (k = 0; k < rcategs; k++)
			sumc += probcat[k] * like[k];
		sumc *= lambda;
		if ((ally[i] > 0) && (location[ally[i]-1] > 0)) {
			lai = location[ally[i] - 1];
			memcpy(clai, contribution[lai - 1], rcategs*sizeof(double));
			for (j = 0; j < rcategs; j++)
				nulike[j] = ((1.0 - lambda) * like[j] + sumc) * clai[j];
		} else {
			for (j = 0; j < rcategs; j++)
				nulike[j] = ((1.0 - lambda) * like[j] + sumc);
		}
		memcpy(like, nulike, rcategs*sizeof(double));
	}
	sum2 = 0.0;
	for (i = 0; i < rcategs; i++)
		sum2 += probcat[i] * like[i];
	sum += log(sum2);
	curtree.likelihood = sum;
	if (!saveit || auto_ || !usertree) {
#ifdef TIMINGS
		get_stop_time(eval_tk);
#endif
		return sum;
	}
	if(which <= shimotrees)
		l0gl[which - 1] = sum;
	if (which == 1) {
		maxwhich = 1;
		maxlogl = sum;
#ifdef TIMINGS
		get_stop_time(eval_tk);
#endif
		return sum;
	}
	if (sum > maxlogl) {
		maxwhich = which;
		maxlogl = sum;
	}
#ifdef TIMINGS
	get_stop_time(eval_tk);
#endif
	
	return sum;
}  /* evaluate */