|
|
|
@@ -0,0 +1,138 @@ |
|
|
|
#include <iostream> |
|
|
|
// #include <sys/time.h> |
|
|
|
// #include <sys/resource.h> |
|
|
|
|
|
|
|
#include "base.h" |
|
|
|
|
|
|
|
|
|
|
|
void Dealer::reportPrepare(void) { |
|
|
|
|
|
|
|
double ev = (double) playerStats.currentResult / (double) n_hand; |
|
|
|
double error = error_standard_deviations * sqrt (playerStats.variance / (double) n_hand); |
|
|
|
|
|
|
|
insert("result", std::to_string(ev)); |
|
|
|
insert("variance", std::to_string(playerStats.variance)); |
|
|
|
insert("deviation", std::to_string(sqrt(playerStats.variance))); |
|
|
|
insert("error", std::to_string(error)); |
|
|
|
|
|
|
|
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 it = results.begin(); it != results.end(); ++it) { |
|
|
|
std::cerr << it->first << ": " << it->second << 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; |
|
|
|
} |