]> git.sesse.net Git - remoteglot/commitdiff
Add some special early output when the position changes.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 28 Dec 2020 00:08:25 +0000 (01:08 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 28 Dec 2020 00:08:25 +0000 (01:08 +0100)
config.pm
remoteglot.pl

index 44ed56b0b50555498e80fede05077e3981c85464..7f7e23c8688b7178ab6df4525b6d31d73ed304a1 100644 (file)
--- a/config.pm
+++ b/config.pm
@@ -58,6 +58,7 @@ our %engine2_config = (
 our $engine2_grpc_backend = undef;  # Not used by us, but will be communicated to serve-analysis.js.
 
 our $update_max_interval = 1.0;
+our $update_force_after_move = 0.2;
 our @masters = (
        'Sesse',
 );
index 9d611c0e6cfe2700cc0f8a5118f36b2e318b72fa..455d73066d56a24c41f2636ccb799f7a23b16262 100755 (executable)
@@ -76,6 +76,10 @@ my $last_move;
 my $last_text = '';
 my ($pos_calculating, $pos_calculating_second_engine);
 
+# If not undef, we've started calculating this position but haven't ever given out
+# any analysis for it, so we're on a forced timer to do so.
+my $pos_calculating_started = undef;
+
 setoptions($engine, \%remoteglotconf::engine_config);
 uciprint($engine, "ucinewgame");
 
@@ -388,12 +392,22 @@ sub handle_position {
                # the position.)
                #
                # Do not output anything new to the main analysis; that's
-               # going to be obsolete really soon.
+               # going to be obsolete really soon. (Exception: If we've never
+               # output anything for this move, ie., it didn't hit the 200ms
+               # limit, spit it out to the user anyway. It's probably a really
+               # fast blitz game or something, and it's good to show the moves
+               # as they come in even without great analysis.)
                $pos_calculating->{'white_clock'} = $pos->{'white_clock'};
                $pos_calculating->{'black_clock'} = $pos->{'black_clock'};
                delete $pos_calculating->{'white_clock_target'};
                delete $pos_calculating->{'black_clock_target'};
-               output_json(1);
+
+               if (defined($pos_calculating_started)) {
+                       output_json(0);
+               } else {
+                       output_json(1);
+               }
+               $pos_calculating_started = [Time::HiRes::gettimeofday];
 
                # Ask the engine to stop; we will throw away its data until it
                # sends us "bestmove", signaling the end of it.
@@ -411,6 +425,7 @@ sub handle_position {
        uciprint($engine, "position fen " . $pos->fen());
        uciprint($engine, "go infinite");
        $pos_calculating = $pos;
+       $pos_calculating_started = [Time::HiRes::gettimeofday];
 
        if (defined($engine2)) {
                if (defined($pos_calculating_second_engine)) {
@@ -634,15 +649,22 @@ sub output {
        return if (!defined($pos_calculating));
 
        # Don't update too often.
-       my $age = Time::HiRes::tv_interval($latest_update);
-       if ($age < $remoteglotconf::update_max_interval) {
-               my $wait = $remoteglotconf::update_max_interval + 0.01 - $age;
-               $output_timer = AnyEvent->timer(after => $wait, cb => \&output);
+       my $wait = $remoteglotconf::update_max_interval - Time::HiRes::tv_interval($latest_update);
+       my $new_pos_wait = defined($pos_calculating_started) ?
+               $remoteglotconf::update_force_after_move - Time::HiRes::tv_interval($pos_calculating_started)
+               : 10000.0;
+       $wait = $new_pos_wait if ($new_pos_wait < $wait);
+       if ($wait > 0.0) {
+               $output_timer = AnyEvent->timer(after => $wait + 0.01, cb => \&output);
                return;
        }
        
        my $info = $engine->{'info'};
 
+       # We're outputting something for this position now, so the special handling
+       # for new positions is off.
+       undef $pos_calculating_started;
+       
        #
        # If we have tablebase data from a previous lookup, replace the
        # engine data with the data from the tablebase.