Example #1
0
/*
  f - previous estimate of the 4 possible haplotype frequencies (in normal scale)
  s1 - GLs (in log scale) for site1 for all "n" individuals
  s2 - GLs (in log scale) for site2 for all "n" individuals
  n - number of individuals
*/
int pair_freq_iter_log(double f[4], double **s1, double **s2, uint64_t n)
{
  double ff[4];
  int k, h;

  // Convert haplot frequencies to log-scale
  conv_space(f, 4, log);
  for (k = 0; k < 4; ++k)
    ff[k] = -INFINITY;

  for (uint64_t i = 0; i < n; ++i) {
    double *p[2], sum, tmp;
    p[0] = s1[i];
    p[1] = s2[i];

    sum = -INFINITY;
    for (k = 0; k < 4; ++k)
      for (h = 0; h < 4; ++h)
	sum = logsum(sum, f[k] + f[h] + p[0][_G1(k,h)] + p[1][_G2(k,h)]);

    for (k = 0; k < 4; ++k) {
      tmp = -INFINITY;
      for (h = 0; h < 4; ++h)
	logsum(tmp, f[k] + f[h] + logsum(p[0][_G1(h,k)] + p[1][_G2(h,k)], p[0][_G1(k,h)] + p[1][_G2(k,h)]));

      ff[k] = logsum(ff[k], tmp - sum);
    }
  }

  // Calculate frequency
  for (k = 0; k < 4; ++k)
    f[k] = exp(ff[k]) / (2 * n);

  // Normalize
  for (k = 0; k < 4; k++)
    f[k] /= f[0] + f[1] + f[2] + f[3];

  return 0;
}
Example #2
0
int pair_freq_iter(double f[4], double **s1, double **s2, uint64_t n)
{
  double ff[4];
  int k, h;

  memset(ff, 0, 4 * sizeof(double));

  for (uint64_t i = 0; i < n; ++i) {
    double *p[2], sum, tmp;
    p[0] = s1[i];
    p[1] = s2[i];

    sum = 0;
    for (k = 0; k < 4; ++k)
      for (h = 0; h < 4; ++h)
	sum += f[k] * f[h] * p[0][_G1(k,h)] * p[1][_G2(k,h)];

    for (k = 0; k < 4; ++k) {
      tmp = 0;
      for (h = 0; h < 4; ++h)
	tmp += f[k] * f[h] * (p[0][_G1(h,k)] * p[1][_G2(h,k)] + p[0][_G1(k,h)] * p[1][_G2(k,h)]);

      ff[k] += tmp / sum;
    }
  }

  // Calculate frequency
  for (k = 0; k < 4; ++k)
    f[k] = ff[k] / (2 * n);

  // Normalize
  for (k = 0; k < 4; k++)
    f[k] /= f[0] + f[1] + f[2] + f[3];

  return 0;
}
Example #3
0
File: em.c Project: xied75/samtools
// 0: the previous site; 1: the current site
static int pair_freq_iter(int n, double *pdg[2], double f[4])
{
	double ff[4];
	int i, k, h;
//	printf("%lf,%lf,%lf,%lf\n", f[0], f[1], f[2], f[3]);
	memset(ff, 0, 4 * sizeof(double));
	for (i = 0; i < n; ++i) {
		double *p[2], sum, tmp;
		p[0] = pdg[0] + i * 3; p[1] = pdg[1] + i * 3;
		for (k = 0, sum = 0.; k < 4; ++k)
			for (h = 0; h < 4; ++h)
				sum += f[k] * f[h] * p[0][_G1(k,h)] * p[1][_G2(k,h)];
		for (k = 0; k < 4; ++k) {
			tmp = f[0] * (p[0][_G1(0,k)] * p[1][_G2(0,k)] + p[0][_G1(k,0)] * p[1][_G2(k,0)])
				+ f[1] * (p[0][_G1(1,k)] * p[1][_G2(1,k)] + p[0][_G1(k,1)] * p[1][_G2(k,1)])
				+ f[2] * (p[0][_G1(2,k)] * p[1][_G2(2,k)] + p[0][_G1(k,2)] * p[1][_G2(k,2)])
				+ f[3] * (p[0][_G1(3,k)] * p[1][_G2(3,k)] + p[0][_G1(k,3)] * p[1][_G2(k,3)]);
			ff[k] += f[k] * tmp / sum;
		}
	}
	for (k = 0; k < 4; ++k) f[k] = ff[k] / (2 * n);
	return 0;
}