Result result;
int opening_num, white_elo, black_elo;
time_t timestamp;
+ long start_position;
bool operator< (const Element& other) const {
return bpfen < other.bpfen;
int opening_num, white_elo, black_elo;
time_t timestamp;
+ long start_position;
if (fread(&white_elo, sizeof(white_elo), 1, fp) != 1) {
perror("fread()");
//exit(1);
//exit(1);
break;
}
+ if (fread(&start_position, sizeof(start_position), 1, fp) != 1) {
+ perror("fread()");
+ //exit(1);
+ break;
+ }
+
l = getc(fp);
if (l == -1) {
}
int bucket = hash_key_to_bucket(bpfen.data(), bpfen.size(), num_buckets);
- elems[bucket].emplace_back(Element {std::move(bpfen), std::move(move), Result(r), opening_num, white_elo, black_elo, timestamp});
+ elems[bucket].emplace_back(Element {std::move(bpfen), std::move(move), Result(r), opening_num, white_elo, black_elo, timestamp, start_position});
++num_elems;
}
fclose(fp);
c.set_first_timestamp(e.timestamp);
}
c.set_opening_num(e.opening_num);
+ c.set_pgn_start_position(e.start_position);
}
if (!moves.count(e.move)) {
moves.insert(e.move);
while (mtbl_iter_next(it, &key, &len_key, &val, &len_val)) {
Count c;
c.ParseFromArray(val, len_val);
- printf("%d %d %d %u %f %f %d %ld",
+ printf("%d %d %d %u %f %f %d %ld %ld",
c.white(), c.draw(), c.black(), c.opening_num(),
double(c.sum_white_elo()) / c.num_elo(),
double(c.sum_black_elo()) / c.num_elo(),
- c.num_elo(), c.first_timestamp());
+ c.num_elo(), c.first_timestamp(),
+ c.pgn_start_position());
for (int j = 0; j < c.move_size(); ++j) {
printf(" %s", c.move(j).c_str());
}
if (c0.has_first_timestamp()) {
c.set_first_timestamp(c0.first_timestamp());
}
+ c.set_pgn_start_position(c0.pgn_start_position());
} else {
c.set_opening_num(c1.opening_num());
if (c1.has_first_timestamp()) {
c.set_first_timestamp(c1.first_timestamp());
}
+ c.set_pgn_start_position(c1.pgn_start_position());
}
// Merge the moves, with deduplication.
optional int64 sum_black_elo = 6;
optional int32 num_elo = 7;
- // First timestamp this position/move was seen.
+ // First timestamp this position/move was seen, and the byte offset
+ // into the PGN file for that game.
optional int64 first_timestamp = 8 [default=32503680000];
+ optional int64 pgn_start_position = 10;
// Moves seen from this position.
repeated string move = 9;
print $line;
chomp $line;
-my ($white, $draw, $black, $opening_num, $white_avg_elo, $black_avg_elo, $num_elo, $timestamp, @moves) = split / /, $line;
+my ($white, $draw, $black, $opening_num, $white_avg_elo, $black_avg_elo, $num_elo, $timestamp, $pgn_start_position, @moves) = split / /, $line;
# Explore one move out.
for my $move (@moves) {
print $chld_in $hex, "\n";
chomp (my $line = <$chld_out>);
-my ($white, $draw, $black, $opening_num, $white_avg_elo, $black_avg_elo, $num_elo, $timestamp, @moves) = split / /, $line;
+my ($white, $draw, $black, $opening_num, $white_avg_elo, $black_avg_elo, $num_elo, $timestamp, $pgn_start_position, @moves) = split / /, $line;
my $opening = $openings{$opening_num} // 'A00: Start position';
# Explore one move out.