// is already divided by 455.
double prob_score_real(int k, double a, double prodai, double kfac, double rd_norm)
{
- double nom = prodai * pow(2.0, -rd_norm * a);
- double denom = kfac * pow(1.0 + pow(2.0, -rd_norm), k+a);
+ double nom = prodai * pow(2.0, rd_norm * a);
+ double denom = kfac * pow(1.0 + pow(2.0, rd_norm), k+a);
return nom/denom;
}
static inline double evaluate_int_point(int k, double a, double prodai_precompute, double kfac_precompute, double r1, double mu2, double sigma2, double winfac, double x)
{
- double probscore = prob_score_real(k, a, prodai_precompute, kfac_precompute, (r1 - x)*winfac);
+ double probscore = prob_score_real(k, a, prodai_precompute, kfac_precompute, (x - r1)*winfac);
double z = (x - mu2)/sigma2;
double gaussian = exp(-(z*z/2.0));
return probscore * gaussian;
compute_new_rating(mu1, sigma1, mu2, sigma2, k, i, newmu1, newsigma1);
compute_new_rating(mu2, sigma2, mu1, sigma1, i, k, newmu2, newsigma2);
printf("%u-%u,%f,%+f,%+f\n",
- k, i, prob_score(k, i, mu1-mu2), newmu1-mu1, newmu2-mu2);
+ k, i, prob_score(k, i, mu2-mu1), newmu1-mu1, newmu2-mu2);
}
for (int i = k; i --> 0; ) {
double newmu1, newmu2, newsigma1, newsigma2;
compute_new_rating(mu1, sigma1, mu2, sigma2, i, k, newmu1, newsigma1);
compute_new_rating(mu2, sigma2, mu1, sigma1, k, i, newmu2, newsigma2);
printf("%u-%u,%f,%+f,%+f\n",
- i, k, prob_score(k, i, mu2-mu1), newmu1-mu1, newmu2-mu2);
+ i, k, prob_score(k, i, mu1-mu2), newmu1-mu1, newmu2-mu2);
}
}
}