+ construct_hessian(mu, num_players);
+ aux_params[make_pair(locale, "num_iterations")] = num_iterations;
+ aux_params[make_pair(locale, "score_stddev")] = global_sigma / sqrt(2.0f);
+ aux_params[make_pair(locale, "rating_prior_stddev")] = prior_sigma;
+ aux_params[make_pair(locale, "total_log_likelihood")] = compute_total_logl(mu, num_players);
+
+ compute_mu_uncertainty(mu, players);
+ dump_scores(players, mu, mu_stddev, num_players);
+}
+
+int main(int argc, char **argv)
+{
+#if USE_DB
+ pqxx::connection conn("dbname=wloh host=127.0.0.1 user=wloh password=censored");
+#endif
+
+ for (int i = 1; i < argc; ++i) {
+ process_file(argv[i]);
+ }
+
+#if DUMP_RAW
+ dump_raw(mu, num_players);
+ return 0;
+#endif
+
+#if USE_DB
+ pqxx::work txn(conn);
+ txn.exec("SET client_min_messages TO WARNING");
+
+ // Dump aux_params.
+ {
+ txn.exec("TRUNCATE aux_params");
+ pqxx::tablewriter writer(txn, "aux_params");
+ for (map<pair<string, string>, float>::const_iterator it = aux_params.begin(); it != aux_params.end(); ++it) {
+ char str[128];
+ snprintf(str, 128, "%f", it->second);
+
+ vector<string> tuple;
+ tuple.push_back(it->first.first); // locale
+ tuple.push_back(it->first.second); // parameter name
+ tuple.push_back(str);
+ writer.push_back(tuple);
+ }
+ writer.complete();
+ }
+
+ // Dump ratings.
+ {
+ txn.exec("TRUNCATE ratings");
+ pqxx::tablewriter writer(txn, "ratings");
+ for (unsigned i = 0; i < rating_db_tuples.size(); ++i) {
+ char player_str[128], mu_str[128], mu_stddev_str[128];
+ snprintf(player_str, 128, "%d", rating_db_tuples[i].player);
+ snprintf(mu_str, 128, "%f", rating_db_tuples[i].mu);
+ snprintf(mu_stddev_str, 128, "%f", rating_db_tuples[i].mu_stddev);
+
+ vector<string> tuple;
+ tuple.push_back(player_str);
+ tuple.push_back(mu_str);
+ tuple.push_back(mu_stddev_str);
+ writer.push_back(tuple);
+ }
+ writer.complete();
+ }
+
+ // Create a table new_covariance, and dump covariance into it.
+ {
+ txn.exec("CREATE TABLE new_covariance ( player1 smallint NOT NULL, player2 smallint NOT NULL, cov float NOT NULL )");
+ pqxx::tablewriter writer(txn, "new_covariance");
+ for (unsigned i = 0; i < covariance_db_tuples.size(); ++i) {
+ char player1_str[128], player2_str[128], cov_str[128];
+ snprintf(player1_str, 128, "%d", covariance_db_tuples[i].player1);
+ snprintf(player2_str, 128, "%d", covariance_db_tuples[i].player2);
+ snprintf(cov_str, 128, "%f", covariance_db_tuples[i].covariance);
+
+ vector<string> tuple;
+ tuple.push_back(player1_str);
+ tuple.push_back(player2_str);
+ tuple.push_back(cov_str);
+ writer.push_back(tuple);
+ }
+ writer.complete();
+ }
+
+ // Create index, and rename new_covariance on top of covariance.
+ txn.exec("ALTER TABLE new_covariance ADD PRIMARY KEY ( player1, player2 );");
+ txn.exec("DROP TABLE IF EXISTS covariance");
+ txn.exec("ALTER TABLE new_covariance RENAME TO covariance");
+#else
+ //fprintf(stderr, "Optimal sigma: %f (two-player: %f)\n", sigma[0], sigma[0] * sqrt(2.0f));
+ for (map<pair<string, string>, float>::const_iterator it = aux_params.begin(); it != aux_params.end(); ++it) {
+ printf("%s: aux_param %s %f\n", it->first.first.c_str(), it->first.second.c_str(), it->second);
+ }
+#endif
+
+ txn.commit();