]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Revert "Convert TB scores in low depth."
[remoteglot] / remoteglot.pl
index 06549f2a53813c9969d0e960cb078cf9c32583a6..56554a6d6b5589a65c13764a7d9ab0c5740bf624 100755 (executable)
@@ -480,6 +480,8 @@ sub parse_infos {
                }
        }
 
+       my $prev_depth = $info->{'depth1'} // $info->{'depth'};
+
        while (scalar @x > 0) {
                if ($x[0] eq 'multipv') {
                        # Dealt with above
@@ -506,6 +508,7 @@ sub parse_infos {
 
                        delete $info->{'score_cp' . $mpv};
                        delete $info->{'score_mate' . $mpv};
+                       delete $info->{'splicepos' . $mpv};
 
                        while ($x[0] eq 'cp' || $x[0] eq 'mate') {
                                if ($x[0] eq 'cp') {
@@ -533,6 +536,14 @@ sub parse_infos {
                die "Unknown info '" . join(',', @x) . "'";
 
        }
+
+       my $now_depth = $info->{'depth1'} // $info->{'depth'};
+       if (defined($prev_depth) && POSIX::floor($now_depth / 10) > POSIX::floor($prev_depth / 10)) {
+               my $d = POSIX::floor($now_depth / 10) * 10;  # In case we skipped some.
+               my $cp = $info->{'score_cp1'} // $info->{'score_cp'};
+               my $mate = $info->{'score_mate1'} // $info->{'score_mate'};
+               push @{$info->{'lowdepth'}}, [ $d, $cp, $mate ];
+       }
 }
 
 sub parse_ids {
@@ -601,8 +612,11 @@ sub complete_using_tbprobe {
        my @pv = @{$info->{'pv' . $mpv}};
        my $key = $pos->fen() . " " . join('', @pv);
        my @moves = ();
+       my $splicepos;
        if (exists($tbprobe_cache{$key})) {
-               @moves = @{$tbprobe_cache{$key}};
+               my $c = $tbprobe_cache{$key};
+               @moves = @{$c->{'moves'}};
+               $splicepos = $c->{'splicepos'};
        } else {
                if ($mpv ne '') {
                        # Force doing at least one move of the PV.
@@ -620,13 +634,13 @@ sub complete_using_tbprobe {
                return if ($pos->num_pieces() > 7);
 
                my $fen = $pos->fen();
-               my $pgn_text = `fathom --path=/srv/syzygy "$fen"`;
+               my $pgn_text = `$remoteglotconf::fathom_cmdline "$fen"`;
                my $pgn = Chess::PGN::Parse->new(undef, $pgn_text);
                return if (!defined($pgn) || !$pgn->read_game() || ($pgn->result ne '0-1' && $pgn->result ne '1-0'));
                $pgn->quick_parse_game;
-               $info->{'pv' . $mpv} = \@moves;
 
                # Splice the PV from the tablebase onto what we have so far.
+               $splicepos = scalar @moves;
                for my $move (@{$pgn->moves}) {
                        last if $move eq '#';
                        last if $move eq '1-0';
@@ -637,7 +651,10 @@ sub complete_using_tbprobe {
                        push @moves, $uci_move;
                }
 
-               $tbprobe_cache{$key} = \@moves;
+               $tbprobe_cache{$key} = {
+                       moves => \@moves,
+                       splicepos => $splicepos
+               };
        }
 
        $info->{'pv' . $mpv} = \@moves;
@@ -648,6 +665,7 @@ sub complete_using_tbprobe {
        } else {
                $info->{'score_mate' . $mpv} = $matelen;
        }
+       $info->{'splicepos' . $mpv} = $splicepos;
 }
 
 sub output {
@@ -688,7 +706,7 @@ sub output {
        #
        my $fen = $pos_calculating->fen();
        if (exists($tb_cache{$fen})) {
-               for my $key (qw(pv score_cp score_mate nodes nps depth seldepth tbhits)) {
+               for my $key (qw(pv score_cp score_mate nodes nps depth seldepth tbhits splicepos)) {
                        delete $info->{$key . '1'};
                        delete $info->{$key};
                }
@@ -728,7 +746,7 @@ sub output {
        # specified.
        #
        if (exists($info->{'pv1'}) && !exists($info->{'pv2'})) {
-               for my $key (qw(pv score_cp score_mate nodes nps depth seldepth tbhits)) {
+               for my $key (qw(pv score_cp score_mate nodes nps depth seldepth tbhits splicepos)) {
                        if (exists($info->{$key . '1'})) {
                                $info->{$key} = $info->{$key . '1'};
                        } else {
@@ -858,8 +876,6 @@ sub output_screen {
                $text .= "\n\n";
        }
 
-       #$text .= book_info($pos_calculating->fen(), $pos_calculating->{'board'}, $pos_calculating->{'toplay'});
-
        my @refutation_lines = ();
        if (defined($engine2)) {
                for (my $mpv = 1; $mpv < 500; ++$mpv) {
@@ -938,6 +954,13 @@ sub output_json {
        $json->{'tablebase'} = $info->{'tablebase'};
        $json->{'pv'} = [ prettyprint_pv($pos_calculating, @{$info->{'pv'}}) ];
 
+       $json->{'lowdepth'} = {};
+       if (exists($info->{'lowdepth'})) {
+               for my $ld (@{$info->{'lowdepth'}}) {
+                       $json->{'lowdepth'}{$ld->[0]} = score_digest_inner($ld->[1], $ld->[2], undef, 0, $pos_calculating);
+               }
+       }
+
        my %refutation_lines = ();
        my @refutation_lines = ();
        if (defined($engine2)) {
@@ -958,6 +981,9 @@ sub output_json {
                                        move => $pretty_move,
                                        pv => \@pretty_pv,
                                };
+                               if (exists($info->{'splicepos' . $mpv})) {
+                                       $refutation_lines{$pretty_move}->{'splicepos'} = $info->{'splicepos' . $mpv};
+                               }
                        };
                }
        }
@@ -1163,20 +1189,43 @@ sub short_score {
 # (with side-to-play information) score_sort_key.
 sub score_digest {
        my ($info, $pos, $mpv) = @_;
+       return score_digest_inner(
+               $info->{'score_cp' . $mpv},
+               $info->{'score_mate' . $mpv},
+               $info->{'splicepos' . $mpv},
+               $info->{'tablebase'},
+               $pos);
+}
 
-       if (defined($info->{'score_mate' . $mpv})) {
-               my $mate = $info->{'score_mate' . $mpv};
+sub score_digest_inner {
+       my ($score, $mate, $sp, $tablebase, $pos) = @_;
+       if (defined($mate)) {
                if ($pos->{'toplay'} eq 'B') {
                        $mate = -$mate;
                }
-               return ['m', $mate];
+               if (defined($sp)) {
+                       if ($mate > 0) {
+                               return ['T', $sp];
+                       } else {
+                               return ['t', $sp];
+                       }
+               } else {
+                       if ($mate > 0) {
+                               return ['M', $mate];
+                       } elsif ($mate < 0) {
+                               return ['m', -$mate];
+                       } elsif ($pos->{'toplay'} eq 'B') {
+                               return ['M', 0];
+                       } else {
+                               return ['m', 0];
+                       }
+               }
        } else {
-               if (exists($info->{'score_cp' . $mpv})) {
-                       my $score = $info->{'score_cp' . $mpv};
+               if (defined($score)) {
                        if ($pos->{'toplay'} eq 'B') {
                                $score = -$score;
                        }
-                       if ($score == 0 && $info->{'tablebase'}) {
+                       if ($score == 0 && $tablebase) {
                                return ['d', undef];
                        } else {
                                return ['cp', int($score)];
@@ -1195,10 +1244,19 @@ sub long_score {
                if ($pos->{'toplay'} eq 'B') {
                        $mate = -$mate;
                }
-               if ($mate > 0) {
-                       return sprintf "White mates in %u", $mate;
+               if (exists($info->{'splicepos' . $mpv})) {
+                       my $sp = $info->{'splicepos' . $mpv};
+                       if ($mate > 0) {
+                               return sprintf "White wins in %u", int(($sp + 1) * 0.5);
+                       } else {
+                               return sprintf "Black wins in %u", int(($sp + 1) * 0.5);
+                       }
                } else {
-                       return sprintf "Black mates in %u", -$mate;
+                       if ($mate > 0) {
+                               return sprintf "White mates in %u", $mate;
+                       } else {
+                               return sprintf "Black mates in %u", -$mate;
+                       }
                }
        } else {
                if (exists($info->{'score_cp' . $mpv})) {
@@ -1250,58 +1308,6 @@ sub plot_score {
        return undef;
 }
 
-my %book_cache = ();
-sub book_info {
-       my ($fen, $board, $toplay) = @_;
-
-       if (exists($book_cache{$fen})) {
-               return $book_cache{$fen};
-       }
-
-       my $ret = `./booklook $fen`;
-       return "" if ($ret =~ /Not found/ || $ret eq '');
-
-       my @moves = ();
-
-       for my $m (split /\n/, $ret) {
-               my ($move, $annotation, $win, $draw, $lose, $rating, $rating_div) = split /,/, $m;
-
-               my $pmove;
-               if ($move eq '')  {
-                       $pmove = '(current)';
-               } else {
-                       ($pmove) = prettyprint_pv_no_cache($board, $move);
-                       $pmove .= $annotation;
-               }
-
-               my $score;
-               if ($toplay eq 'W') {
-                       $score = 1.0 * $win + 0.5 * $draw + 0.0 * $lose;
-               } else {
-                       $score = 0.0 * $win + 0.5 * $draw + 1.0 * $lose;
-               }
-               my $n = $win + $draw + $lose;
-               
-               my $percent;
-               if ($n == 0) {
-                       $percent = "     ";
-               } else {
-                       $percent = sprintf "%4u%%", int(100.0 * $score / $n + 0.5);
-               }
-
-               push @moves, [ $pmove, $n, $percent, $rating ];
-       }
-
-       @moves[1..$#moves] = sort { $b->[2] cmp $a->[2] } @moves[1..$#moves];
-       
-       my $text = "Book moves:\n\n              Perf.     N     Rating\n\n";
-       for my $m (@moves) {
-               $text .= sprintf "  %-10s %s   %6u    %4s\n", $m->[0], $m->[2], $m->[1], $m->[3]
-       }
-
-       return $text;
-}
-
 sub extract_clock {
        my ($pgn, $pos) = @_;