]> git.sesse.net Git - foosball/blobdiff - foorank.cpp
Oops, also remember the C++ part of the assessment.
[foosball] / foorank.cpp
index f8ecf63872be9f5abd67af011f531ba595a901b6..3ad0bb1ea725203b402c3ee8fd438e084c7bcb0e 100644 (file)
@@ -343,14 +343,8 @@ void least_squares(vector<pair<double, double> > &curve, double mu1, double sigm
        sigma_result = sigma;
 }
 
-int main(int argc, char **argv)
+void compute_new_rating(double mu1, double sigma1, double mu2, double sigma2, int score1, int score2, double &mu, double &sigma)
 {
-       double mu1 = atof(argv[1]);
-       double sigma1 = atof(argv[2]);
-       double mu2 = atof(argv[3]);
-       double sigma2 = atof(argv[4]);
-       int score1 = atoi(argv[5]);
-       int score2 = atoi(argv[6]);
        vector<pair<double, double> > curve;
 
        if (score1 == 10) {
@@ -367,9 +361,41 @@ int main(int argc, char **argv)
                }
        }
 
-       double mu_est, sigma_est, mu, sigma;
+       double mu_est, sigma_est;
        normalize(curve);
        estimate_musigma(curve, mu_est, sigma_est);
        least_squares(curve, mu_est, sigma_est, mu, sigma);
-       printf("%f %f\n", mu, sigma);
 }
+
+int main(int argc, char **argv)
+{
+       double mu1 = atof(argv[1]);
+       double sigma1 = atof(argv[2]);
+       double mu2 = atof(argv[3]);
+       double sigma2 = atof(argv[4]);
+
+       if (argc > 5) {
+               int score1 = atoi(argv[5]);
+               int score2 = atoi(argv[6]);
+               double mu, sigma;
+               compute_new_rating(mu1, sigma1, mu2, sigma2, score1, score2, mu, sigma);
+               printf("%f %f\n", mu, sigma);
+       } else {
+               // assess all possible scores
+               for (int i = 0; i <= 9; ++i) {
+                       double newmu1, newmu2, newsigma1, newsigma2;
+                       compute_new_rating(mu1, sigma1, mu2, sigma2, 10, i, newmu1, newsigma1);
+                       compute_new_rating(mu2, sigma2, mu1, sigma1, i, 10, newmu2, newsigma2);
+                       printf("10-%u,%f,%+f,%+f\n",
+                               i, prob_score(i, mu1-mu2), newmu1-mu1, newmu2-mu2);
+               }
+               for (int i = 10; i --> 0; ) {
+                       double newmu1, newmu2, newsigma1, newsigma2;
+                       compute_new_rating(mu1, sigma1, mu2, sigma2, i, 10, newmu1, newsigma1);
+                       compute_new_rating(mu2, sigma2, mu1, sigma1, 10, i, newmu2, newsigma2);
+                       printf("%u-10,%f,%+f,%+f\n",
+                               i, prob_score(i, mu2-mu1), newmu1-mu1, newmu2-mu2);
+               }
+       }
+}
+