#include // #include // #include #include "base.h" void Dealer::reportPrepare(void) { double ev = (double) playerStats.result / (double) n_hand; double error = error_standard_deviations * sqrt (playerStats.variance / (double) n_hand); report.push_back(reportItem("bankroll", "%g", playerStats.bankroll)); report.push_back(reportItem("result", "%g", playerStats.result)); report.push_back(reportItem("ev", "%g", ev)); report.push_back(reportItem("hands", "%g", n_hand)); report.push_back(reportItem("variance", "%g", playerStats.variance)); report.push_back(reportItem("deviation", "%g", sqrt(playerStats.variance))); report.push_back(reportItem("error", "%g", error)); report.push_back(reportItem("played_hands", "%g", n_hands)); report.push_back(reportItem("total_money_waged", "%g", playerStats.totalMoneyWaged)); report.push_back(reportItem("bustsPlayer", "%g", playerStats.bustsPlayer)); report.push_back(reportItem("bustsDealer", "%g", playerStats.bustsDealer)); report.push_back(reportItem("wins", "%g", playerStats.wins)); report.push_back(reportItem("pushes", "%g", playerStats.pushes)); report.push_back(reportItem("losses", "%g", playerStats.losses)); return; } int Dealer::writeReportYAML(void) { // FILE *file; // struct rusage usage; // double wall; // double ev, error; // int precision; // char format[32]; // if ((file = blackjack_conf.yaml_report) == NULL) { // file = stderr; // } // TODO: choose if comments with explanations are to be added std::cerr << "---" << std::endl; for (auto item : report) { std::cerr << item.key << ": "; fprintf(stderr, item.format.c_str(), item.value); std::cerr << std::endl; } // std::cerr << "rules:" << std::endl; // std::cerr << " decks: " << decks << std::endl; // std::cerr << " hands: " << n_hands << std::endl; // std::cerr << " hit_soft_17: %d\n", // blackjack_conf.hit_soft_17); // std::cerr << " double_after_split: %d\n", // blackjack_conf.double_after_split); // std::cerr << " blackjack_pays: %g\n", // blackjack_conf.blackjack_pays); // std::cerr << " rng_seed: %d\n", blackjack_conf.rng_seed); // std::cerr << " number_of_burnt_cards: %d\n", // blackjack_conf.number_of_burnt_cards); // std::cerr << " no_negative_bankroll: %d\n", // blackjack_conf.no_negative_bankroll); // std::cerr << " max_bet: %d\n", blackjack_conf.max_bet); // if (blackjack_conf.decks > 0) // { // std::cerr << " penetration: %g\n", // blackjack_conf.penetration); // std::cerr << " penetration_sigma: %g\n", // blackjack_conf.penetration_sigma); // } // TODO // if (getrusage (RUSAGE_SELF, &usage) == 0) { // std::cerr << "cpu:" << std::endl; // std::cerr << " user: " + (usage.ru_utime.tv_sec + 1e-6 * usage.ru_utime.tv_usec) << std::endl; // std::cerr << " system: " + (usage.ru_stime.tv_sec + 1e-6 * usage.ru_stime.tv_usec) << std::endl; // measue final wall time // TODO: chrono // gettimeofday (&wall_time_final, NULL); // wall = (blackjack.wall_time_final.tv_sec - // blackjack.wall_time_initial.tv_sec) + // 1e-6 * (blackjack.wall_time_final.tv_usec - // blackjack.wall_time_initial.tv_usec); // std::cerr << " wall: %g\n", wall); // speed // std::cerr << " second_per_hand: %.1e\n", wall / blackjack.hand); // std::cerr << " hands_per_second: %.1e\n", blackjack.hand / wall); // } // std::cerr << "player: " << std::endl; // std::cerr << " wins: " ((double) player->wins / (double) player->number_of_hands)) << std::endl; // std::cerr << " pushes: %g\n", // (double) player->pushes / (double) player->number_of_hands); // std::cerr << " losses: %g\n", // (double) player->losses / (double) player->number_of_hands); // std::cerr << " dealer_blackjacks: %g\n", // (double) player->dealer_blackjacks / // (double) player->number_of_hands); // std::cerr << " player_blackjacks: %g\n", // (double) player->player_blackjacks / // (double) player->number_of_hands); // std::cerr << " dealer_busts: %g\n", // (double) player->dealer_busts / (double) player->number_of_hands); // std::cerr << " player_busts: %g\n", // (double) player->player_busts / (double) player->number_of_hands); // std::cerr << " doubled_hands: %g\n", // (double) player->doubled_hands / (double) player->number_of_hands); // std::cerr << " doubled_wins: %g\n", // (double) player->doubled_wins / (double) player->number_of_hands); // std::cerr << " insured_hands: %g\n", // (double) player->insured_hands / (double) player->number_of_hands); // std::cerr << " insured_wins: %g\n", // (double) player->insured_wins / (double) player->number_of_hands); // std::cerr << " number_of_hands: %g\n", // (double) player->number_of_hands); // std::cerr << " number_of_shuffles: %g\n", (double) blackjack.shuffles); // std::cerr << " total_money_waged: %g\n", // (double) player->total_money_waged); // std::cerr << " worst_bankroll: %g\n", // (double) player->worst_bankroll); // std::cerr << " final_bankroll: %g\n", (double) player->bankroll); // return is a keyword! // precision = (int) (ceil (-log10 (error))) - 2; // if (precision >= 0) { // snprintf (format, 32, ("%%+.%df ± %%.%df"), precision, precision); // } else { // snprintf (format, 32, ("%%+.0f ± %%.0f")); // } // std::cerr << " variance: % g\n", player->variance); // std::cerr << " deviation: % g\n", sqrt (player->variance)); // std::cerr << " error: % g\n", // sqrt (player->variance / (double) (blackjack.hand))); // std::cerr << " result: \"("), std::cerr << format, // 100.0 * ev, // 100 * error); // std::cerr << ") %%\"" << std::endl; std::cerr << "..." << std::endl; return 0; }