X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=book%2Fbinloader.cpp;fp=book%2Fbinloader.cpp;h=e4b40a6f59a6c0d2ac028f6f0cd69422c5ee1cfd;hp=0000000000000000000000000000000000000000;hb=7dfa8135cabec7261a2a255e7b5edd679e75da0b;hpb=7ac37d77ecacc4f33d8bc76d80e3fb6c7632fb92 diff --git a/book/binloader.cpp b/book/binloader.cpp new file mode 100644 index 0000000..e4b40a6 --- /dev/null +++ b/book/binloader.cpp @@ -0,0 +1,113 @@ +//#define _GLIBCXX_PARALLEL +#include +#include +#include +#include +#include +#include +#include +#include +#include "count.h" + +using namespace std; + +enum Result { WHITE = 0, DRAW, BLACK }; +struct Element { + string bpfen_and_move; + Result result; + int opening_num, white_elo, black_elo; + + bool operator< (const Element& other) const { + return bpfen_and_move < other.bpfen_and_move; + } +}; + +int main(int argc, char **argv) +{ + vector elems; + + for (int i = 1; i < argc; ++i) { + FILE *fp = fopen(argv[i], "rb"); + if (fp == NULL) { + perror(argv[i]); + exit(1); + } + for ( ;; ) { + int l = getc(fp); + if (l == -1) { + break; + } + + string bpfen_and_move; + bpfen_and_move.resize(l); + if (fread(&bpfen_and_move[0], l, 1, fp) != 1) { + perror("fread()"); + // exit(1); + break; + } + + int r = getc(fp); + if (r == -1) { + perror("getc()"); + //exit(1); + break; + } + + int opening_num, white_elo, black_elo; + if (fread(&white_elo, sizeof(white_elo), 1, fp) != 1) { + perror("fread()"); + //exit(1); + break; + } + if (fread(&black_elo, sizeof(black_elo), 1, fp) != 1) { + perror("fread()"); + //exit(1); + break; + } + if (fread(&opening_num, sizeof(opening_num), 1, fp) != 1) { + perror("fread()"); + //exit(1); + break; + } + elems.emplace_back(Element {move(bpfen_and_move), Result(r), opening_num, white_elo, black_elo}); + } + fclose(fp); + + printf("Read %ld elems\n", elems.size()); + } + + printf("Sorting...\n"); + sort(elems.begin(), elems.end()); + + printf("Writing SSTable...\n"); + mtbl_writer* mtbl = mtbl_writer_init("open.mtbl", NULL); + Count c; + int num_elo = 0; + double sum_white_elo = 0.0, sum_black_elo = 0.0; + for (int i = 0; i < elems.size(); ++i) { + if (elems[i].result == WHITE) { + ++c.white; + } else if (elems[i].result == DRAW) { + ++c.draw; + } else if (elems[i].result == BLACK) { + ++c.black; + } + c.opening_num = elems[i].opening_num; + if (elems[i].white_elo >= 100 && elems[i].black_elo >= 100) { + sum_white_elo += elems[i].white_elo; + sum_black_elo += elems[i].black_elo; + ++num_elo; + } + if (i == elems.size() - 1 || elems[i].bpfen_and_move != elems[i + 1].bpfen_and_move) { + c.avg_white_elo = sum_white_elo / num_elo; + c.avg_black_elo = sum_black_elo / num_elo; + mtbl_writer_add(mtbl, + (const uint8_t *)elems[i].bpfen_and_move.data(), elems[i].bpfen_and_move.size(), + (const uint8_t *)&c, sizeof(c)); + c = Count(); + num_elo = 0; + sum_white_elo = sum_black_elo = 0.0; + } + } + mtbl_writer_destroy(&mtbl); +}