struct match {
int other_player;
int margin;
+ float weight;
};
map<int, vector<match> > matches_for_player;
}
/*
- * diff(logL, mu1) = -(mu1 - mu2 - x) / sigma_c^2
- * maximizer for mu1 is given by: sum_i[ (1/sigma_c_i)^2 (mu1 - mu2_i - x_i) ] = 0
- * sum_i[ (1/sigma_c_i)^2 mu1 ] = sum_i [ (1/sigma_c_i)^2 ( mu2_i + x_i ) ]
- * mu1 = sum_i [ (1/sigma_c_i)^2 ( mu2_i + x_i ) ] / sum_i[ (1/sigma_c_i)^2 ]
+ * diff(logL, mu1) = -w * (mu1 - mu2 - x) / sigma_c^2
+ * maximizer for mu1 is given by: sum_i[ (w_i/sigma_c_i)^2 (mu1 - mu2_i - x_i) ] = 0
+ * sum_i[ (w_i/sigma_c_i)^2 mu1 ] = sum_i [ (w_i/sigma_c_i)^2 ( mu2_i + x_i ) ]
+ * mu1 = sum_i [ (w_i/sigma_c_i)^2 ( mu2_i + x_i ) ] / sum_i[ (w_i/sigma_c_i)^2 ]
*/
void update_mu(float *mu, float *sigma, int player_num, const vector<match> &matches)
{
for (unsigned i = 0; i < matches.size(); ++i) {
float sigma1 = sigma[player_num];
float sigma2 = sigma[matches[i].other_player];
- float inv_sigma_c2 = 1.0f / (sigma1 * sigma1 + sigma2 * sigma2);
+ float inv_sigma_c2 = matches[i].weight / (sigma1 * sigma1 + sigma2 * sigma2);
float x = matches[i].margin; // / 70.0f;
nom += (mu[matches[i].other_player] + x) * inv_sigma_c2;
for ( ;; ) {
char pl1[256], pl2[256];
int score1, score2;
+ float weight;
- if (scanf("%s %s %d %d", pl1, pl2, &score1, &score2) != 4) {
+ if (scanf("%s %s %d %d %f", pl1, pl2, &score1, &score2, &weight) != 5) {
fprintf(stderr, "Read %d matches.\n", num_matches);
break;
}
match m1;
m1.other_player = player_map[pl2];
m1.margin = score1 - score2;
+ m1.weight = weight;
matches_for_player[player_map[pl1]].push_back(m1);
match m2;
m2.other_player = player_map[pl1];
m2.margin = score2 - score1;
+ m2.weight = weight;
matches_for_player[player_map[pl2]].push_back(m2);
}