diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pptdb.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/src/pptdb.c b/src/pptdb.c index 79f60c5..f3d19bf 100644 --- a/src/pptdb.c +++ b/src/pptdb.c @@ -23,6 +23,9 @@ #include <string.h> #include <tak.h> +#include <actions.h> + +#include <math.h> int generate; uint64_t heights[16]; @@ -74,15 +77,22 @@ write_input(const int dx, const int dy, const uint8_t swap) { // Warning: performs _no_ checks on input whatsoever static enum ACT_RESULT -parse_line(const char *pt, const ssize_t read) { +parse_line(const char *pt, const ssize_t read, float *out_avg_actions) { ssize_t idx; enum ACT_RESULT r; int total_plies = 0; + float avg_actions = 0; + action_list_t *actions; + for (idx=0;idx<read;idx++) { if (pt[idx]==',') total_plies++; } for(idx=0;;) { + actions = action_list_generate(); + avg_actions += (float)(actions->length); + action_list_free(actions); + if (pt[idx] == 'P') { // P [A-F][1-6] [CF]?, idx+=2; @@ -142,9 +152,12 @@ parse_line(const char *pt, const ssize_t read) { } // Parse next action while (idx<read && pt[idx++]!=','); - if (idx>=read) return ACT_OK; + if (idx>=read) goto count_this; next_ply(); } + count_this: + avg_actions /= (float) total_plies; + *out_avg_actions = avg_actions; return ACT_OK; } @@ -172,6 +185,11 @@ int main(int argc, char **argv) { const uint8_t size = argv[1][0]-'0'; +#define LAZY_MAX_GAMES 1000000 + float avg_actions[LAZY_MAX_GAMES]; + for (uint32_t k=0; k<LAZY_MAX_GAMES; k++) avg_actions[k]=0; + action_list_init(size); + playtak_fh = fopen(argv[2], "r"); if (playtak_fh == NULL) exit(EXIT_FAILURE); @@ -190,7 +208,7 @@ int main(int argc, char **argv) { if (line[read-4] == '0') outcome_black = 0.9; else outcome_black = -0.9; // Parse the line - r = parse_line(line,read-4); + r = parse_line(line,read-4, avg_actions+games); // Adjust counts if we're not generating training data if (generate == 0) { if (r == ACT_ILLEGAL) { @@ -227,16 +245,25 @@ int main(int argc, char **argv) { printf("Read %d games\n",games); if (generate==0) { + float sum = 0; + for (uint32_t k=0; k<games; k++) sum+=avg_actions[k]; + const float mean = sum/(float)games; + float variance = 0; + for (uint32_t k=0; k<games; k++) variance+=(avg_actions[k]-mean)*(avg_actions[k]-mean); + variance /= (float) games; + printf("Illegals: %d\nOverflows: %d\n\ Black wins: %.3f%%\n\ Road wins: %d\nFlat wins: %d\n\ Average turns to road win: %.3f\n\ -Average turns to flat win: %.3f\n", +Average turns to flat win: %.3f\n\ +Mean avaiable actions per ply per game: %.3f ± %.3f σ\n", illegal, overflow, (double)black_wins / (double)(black_wins+white_wins) * 100, road_wins, flat_wins, (double)(road_turns)/(double)(road_wins), - (double)(flat_turns)/(double)(flat_wins)); + (double)(flat_turns)/(double)(flat_wins), + mean, sqrt(variance)); for (int k = 2; k < 16; k++) { printf("Height %2d: %7ld\n",k,heights[k]); } |
