+ float nom = 0.0f, denom = 0.0f;
+ for (unsigned i = 0; i < all_matches.size(); ++i) {
+ const match& m = all_matches[i];
+
+ float mu1 = mu[m.player];
+ float mu2 = mu[m.other_player];
+ float mu = mu1 - mu2;
+ float x = m.margin;
+ float w = m.weight;
+
+ nom += w * ((x - mu) * (x - mu));
+ denom += w;
+ }
+
+ float best_sigma = sqrt(nom / denom) / sqrt(2.0f); // Divide evenly between the two players.
+ for (int i = 0; i < num_players; ++i) {
+ sigma[i] = best_sigma;
+ }
+}
+
+/*
+ * diff(priorlogL, sigma) = w ( (x - mu)² - sigma² ) / sigma³
+ * maximizer for sigma is given by: sum_i[ (w_i/sigma)³ ((x - mu)² - sigma²) ] = 0
+ * sum_i[ w_i ( (x - mu)² - sigma² ) ] = 0 |: sigma != 0
+ * sum_i[ w_i (x - mu)² ] = sum[ w_i sigma² ]
+ * sigma = sqrt( sum_i[ w_i (x - mu)² ] / sum[w_i] )
+ */
+void update_prior_sigma(float *mu, float *sigma, int num_players)
+{
+ float nom = 0.0f, denom = 0.0f;