/* 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; }
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; }
// 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; }