1 //#define _GLIBCXX_PARALLEL
3 // Usage: ./binloader IN1 IN2 IN3 ... OUT
17 enum Result { WHITE = 0, DRAW, BLACK };
19 string bpfen_and_move;
21 int opening_num, white_elo, black_elo;
23 bool operator< (const Element& other) const {
24 return bpfen_and_move < other.bpfen_and_move;
28 int main(int argc, char **argv)
30 vector<Element> elems;
32 for (int i = 1; i < argc - 1; ++i) {
33 FILE *fp = fopen(argv[i], "rb");
44 string bpfen_and_move;
45 bpfen_and_move.resize(l);
46 if (fread(&bpfen_and_move[0], l, 1, fp) != 1) {
59 int opening_num, white_elo, black_elo;
60 if (fread(&white_elo, sizeof(white_elo), 1, fp) != 1) {
65 if (fread(&black_elo, sizeof(black_elo), 1, fp) != 1) {
70 if (fread(&opening_num, sizeof(opening_num), 1, fp) != 1) {
75 elems.emplace_back(Element {move(bpfen_and_move), Result(r), opening_num, white_elo, black_elo});
79 printf("Read %ld elems\n", elems.size());
82 printf("Sorting...\n");
83 sort(elems.begin(), elems.end());
85 printf("Writing SSTable...\n");
86 mtbl_writer_options* wopt = mtbl_writer_options_init();
87 mtbl_writer_options_set_compression(wopt, MTBL_COMPRESSION_SNAPPY);
88 mtbl_writer* mtbl = mtbl_writer_init(argv[argc - 1], wopt);
90 for (int i = 0; i < elems.size(); ++i) {
91 if (elems[i].result == WHITE) {
93 } else if (elems[i].result == DRAW) {
95 } else if (elems[i].result == BLACK) {
98 c.opening_num = elems[i].opening_num;
99 if (elems[i].white_elo >= 100 && elems[i].black_elo >= 100) {
100 c.sum_white_elo += elems[i].white_elo;
101 c.sum_black_elo += elems[i].black_elo;
104 if (i == elems.size() - 1 || elems[i].bpfen_and_move != elems[i + 1].bpfen_and_move) {
105 mtbl_writer_add(mtbl,
106 (const uint8_t *)elems[i].bpfen_and_move.data(), elems[i].bpfen_and_move.size(),
107 (const uint8_t *)&c, sizeof(c));
111 mtbl_writer_destroy(&mtbl);