1 //#define _GLIBCXX_PARALLEL
14 enum Result { WHITE = 0, DRAW, BLACK };
16 string bpfen_and_move;
18 int opening_num, white_elo, black_elo;
20 bool operator< (const Element& other) const {
21 return bpfen_and_move < other.bpfen_and_move;
25 int main(int argc, char **argv)
27 vector<Element> elems;
29 for (int i = 1; i < argc; ++i) {
30 FILE *fp = fopen(argv[i], "rb");
41 string bpfen_and_move;
42 bpfen_and_move.resize(l);
43 if (fread(&bpfen_and_move[0], l, 1, fp) != 1) {
56 int opening_num, white_elo, black_elo;
57 if (fread(&white_elo, sizeof(white_elo), 1, fp) != 1) {
62 if (fread(&black_elo, sizeof(black_elo), 1, fp) != 1) {
67 if (fread(&opening_num, sizeof(opening_num), 1, fp) != 1) {
72 elems.emplace_back(Element {move(bpfen_and_move), Result(r), opening_num, white_elo, black_elo});
76 printf("Read %ld elems\n", elems.size());
79 printf("Sorting...\n");
80 sort(elems.begin(), elems.end());
82 printf("Writing SSTable...\n");
83 mtbl_writer* mtbl = mtbl_writer_init("open.mtbl", NULL);
86 double sum_white_elo = 0.0, sum_black_elo = 0.0;
87 for (int i = 0; i < elems.size(); ++i) {
88 if (elems[i].result == WHITE) {
90 } else if (elems[i].result == DRAW) {
92 } else if (elems[i].result == BLACK) {
95 c.opening_num = elems[i].opening_num;
96 if (elems[i].white_elo >= 100 && elems[i].black_elo >= 100) {
97 sum_white_elo += elems[i].white_elo;
98 sum_black_elo += elems[i].black_elo;
101 if (i == elems.size() - 1 || elems[i].bpfen_and_move != elems[i + 1].bpfen_and_move) {
102 c.avg_white_elo = sum_white_elo / num_elo;
103 c.avg_black_elo = sum_black_elo / num_elo;
104 mtbl_writer_add(mtbl,
105 (const uint8_t *)elems[i].bpfen_and_move.data(), elems[i].bpfen_and_move.size(),
106 (const uint8_t *)&c, sizeof(c));
109 sum_white_elo = sum_black_elo = 0.0;
112 mtbl_writer_destroy(&mtbl);