- memset(mu_stddev, 0, sizeof(mu_stddev));
-
- for (unsigned i = 0; i < all_matches.size(); ++i) {
- const match &m = all_matches[i];
-
- int p1 = m.player;
- int p2 = m.other_player;
-
- double sigma_sq = global_sigma * global_sigma;
- float w = m.weight;
-
- // Temporarily use mu_stddev to store the diagonal of the Hessian.
- mu_stddev[p1] += w / sigma_sq;
- mu_stddev[p2] += w / sigma_sq;
+ // FIXME: Use pseudoinverse if applicable.
+ Matrix<float, Dynamic, Dynamic> ih = hessian.inverse();
+ for (unsigned i = 0; i < players.size(); ++i) {
+ mu_stddev[i] = sqrt(ih(i, i));