X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=remoteglot.pl;h=7f1a6687e72aa597827212a95a673b429e1b2bd2;hp=b248d5f74b1568f162b3b5685d0d3a739243991c;hb=7314c1611dbab18a6ebdd5934697dd5cf94ed437;hpb=f45d6376e3ca0bbdbfad739ad3a771d3faa7cfdc diff --git a/remoteglot.pl b/remoteglot.pl index b248d5f..7f1a668 100755 --- a/remoteglot.pl +++ b/remoteglot.pl @@ -278,26 +278,28 @@ sub parse_infos { # Search for "multipv" first of all, since e.g. Stockfish doesn't put it first. for my $i (0..$#x - 1) { - if ($x[$i] =~ 'multipv') { + if ($x[$i] eq 'multipv') { $mpv = $x[$i + 1]; next; } } while (scalar @x > 0) { - if ($x[0] =~ 'multipv') { + if ($x[0] eq 'multipv') { # Dealt with above shift @x; shift @x; next; } - if ($x[0] =~ /^(currmove|currmovenumber|cpuload)$/) { + if ($x[0] eq 'currmove' || $x[0] eq 'currmovenumber' || $x[0] eq 'cpuload') { my $key = shift @x; my $value = shift @x; $info->{$key} = $value; next; } - if ($x[0] =~ /^(depth|seldepth|hashfull|time|nodes|nps|tbhits)$/) { + if ($x[0] eq 'depth' || $x[0] eq 'seldepth' || $x[0] eq 'hashfull' || + $x[0] eq 'time' || $x[0] eq 'nodes' || $x[0] eq 'nps' || + $x[0] eq 'tbhits') { my $key = shift @x; my $value = shift @x; $info->{$key . $mpv} = $value; @@ -309,7 +311,7 @@ sub parse_infos { delete $info->{'score_cp' . $mpv}; delete $info->{'score_mate' . $mpv}; - while ($x[0] =~ /^(cp|mate|lowerbound|upperbound)$/) { + while ($x[0] eq 'cp' || $x[0] eq 'mate' || $x[0] eq 'lowerbound' || $x[0] eq 'upperbound') { if ($x[0] eq 'cp') { shift @x; $info->{'score_cp' . $mpv} = shift @x; @@ -353,7 +355,7 @@ sub parse_ids { } } -sub prettyprint_pv { +sub prettyprint_pv_no_cache { my ($board, @pvs) = @_; if (scalar @pvs == 0 || !defined($pvs[0])) { @@ -363,7 +365,20 @@ sub prettyprint_pv { my $pv = shift @pvs; my ($from_col, $from_row, $to_col, $to_row, $promo) = parse_uci_move($pv); my ($pretty, $nb) = $board->prettyprint_move($from_row, $from_col, $to_row, $to_col, $promo); - return ($pretty, prettyprint_pv($nb, @pvs)); + return ( $pretty, prettyprint_pv_no_cache($nb, @pvs) ); +} + +sub prettyprint_pv { + my ($pos, @pvs) = @_; + + my $cachekey = join('', @pvs); + if (exists($pos->{'prettyprint_cache'}{$cachekey})) { + return @{$pos->{'prettyprint_cache'}{$cachekey}}; + } else { + my @res = prettyprint_pv_no_cache($pos->{'board'}, @pvs); + $pos->{'prettyprint_cache'}{$cachekey} = \@res; + return @res; + } } sub output { @@ -401,12 +416,12 @@ sub output { eval { my $dummy; if (exists($info->{'pv'})) { - $dummy = prettyprint_pv($pos_calculating->{'board'}, @{$info->{'pv'}}); + $dummy = prettyprint_pv($pos_calculating, @{$info->{'pv'}}); } my $mpv = 1; while (exists($info->{'pv' . $mpv})) { - $dummy = prettyprint_pv($pos_calculating->{'board'}, @{$info->{'pv' . $mpv}}); + $dummy = prettyprint_pv($pos_calculating, @{$info->{'pv' . $mpv}}); ++$mpv; } }; @@ -467,7 +482,7 @@ sub output_screen { } $text .= ":\n"; - $text .= " " . join(', ', prettyprint_pv($pos_calculating->{'board'}, @{$info->{'pv' . $mpv}})) . "\n"; + $text .= " " . join(', ', prettyprint_pv($pos_calculating, @{$info->{'pv' . $mpv}})) . "\n"; $text .= "\n"; ++$mpv; } @@ -475,7 +490,7 @@ sub output_screen { # single-PV my $score = long_score($info, $pos_calculating, ''); $text .= " $score\n" if defined($score); - $text .= " PV: " . join(', ', prettyprint_pv($pos_calculating->{'board'}, @{$info->{'pv'}})); + $text .= " PV: " . join(', ', prettyprint_pv($pos_calculating, @{$info->{'pv'}})); $text .= "\n"; if (exists($info->{'nodes'}) && exists($info->{'nps'}) && exists($info->{'depth'})) { @@ -505,8 +520,8 @@ sub output_screen { eval { my $pv = $info->{'pv' . $mpv}; - my $pretty_move = join('', prettyprint_pv($pos_calculating_second_engine->{'board'}, $pv->[0])); - my @pretty_pv = prettyprint_pv($pos_calculating_second_engine->{'board'}, @$pv); + my $pretty_move = join('', prettyprint_pv($pos_calculating_second_engine, $pv->[0])); + my @pretty_pv = prettyprint_pv($pos_calculating_second_engine, @$pv); if (scalar @pretty_pv > 5) { @pretty_pv = @pretty_pv[0..4]; push @pretty_pv, "..."; @@ -553,7 +568,7 @@ sub output_json { # single-PV only for now $json->{'pv_uci'} = $info->{'pv'}; - $json->{'pv_pretty'} = [ prettyprint_pv($pos_calculating->{'board'}, @{$info->{'pv'}}) ]; + $json->{'pv_pretty'} = [ prettyprint_pv($pos_calculating, @{$info->{'pv'}}) ]; my %refutation_lines = (); my @refutation_lines = (); @@ -566,8 +581,8 @@ sub output_json { eval { my $pv = $info->{'pv' . $mpv}; - my $pretty_move = join('', prettyprint_pv($pos_calculating->{'board'}, $pv->[0])); - my @pretty_pv = prettyprint_pv($pos_calculating->{'board'}, @$pv); + my $pretty_move = join('', prettyprint_pv($pos_calculating, $pv->[0])); + my @pretty_pv = prettyprint_pv($pos_calculating, @$pv); $refutation_lines{$pv->[0]} = { sort_key => $pretty_move, depth => $info->{'depth' . $mpv}, @@ -696,7 +711,7 @@ sub book_info { if ($move eq '') { $pmove = '(current)'; } else { - ($pmove) = prettyprint_pv($board, $move); + ($pmove) = prettyprint_pv_no_cache($board, $move); $pmove .= $annotation; }