]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Small microoptimization in in_check; do not go through a row unless it has attacking...
[remoteglot] / remoteglot.pl
index b248d5f74b1568f162b3b5685d0d3a739243991c..7f1a6687e72aa597827212a95a673b429e1b2bd2 100755 (executable)
@@ -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;
                }