Collect more corrections to optimum/maximum
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Fri, 18 Aug 2017 07:38:27 +0000 (09:38 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 18 Aug 2017 15:38:40 +0000 (08:38 -0700)
The only call site of Time.maximum() corrected by 10.
Do this directly in remaining().

Ponder increased Time.optimum by 25% in init(). Idem.
Delete unused includes.

No functional change.

src/search.cpp
src/timeman.cpp

index fbcae4601b3d071e1448456b847d1ce1de7b0840..7b3fd18bb03cd66df479dd50ca7ec7c84b6226e6 100644 (file)
@@ -1491,7 +1491,7 @@ moves_loop: // When in check search starts from here
     if (Threads.ponder)
         return;
 
-    if (   (Limits.use_time_management() && elapsed > Time.maximum() - 10)
+    if (   (Limits.use_time_management() && elapsed > Time.maximum())
         || (Limits.movetime && elapsed >= Limits.movetime)
         || (Limits.nodes && Threads.nodes_searched() >= (uint64_t)Limits.nodes))
             Threads.stop = true;
index 55d98c1fa98b693a0b948d2d1175e8017d466e6c..b5d1a66c30b05faf1d26da029ebd42ab7bbdfe8a 100644 (file)
@@ -19,8 +19,6 @@
 */
 
 #include <algorithm>
-#include <cfloat>
-#include <cmath>
 
 #include "search.h"
 #include "timeman.h"
@@ -32,14 +30,14 @@ namespace {
 
   enum TimeType { OptimumTime, MaxTime };
 
-  int remaining(int myTime, int myInc, int moveOverhead,
-                int movesToGo, int ply, TimeType type) {
+  int remaining(int myTime, int myInc, int moveOverhead, int movesToGo,
+                int ply, bool ponder, TimeType type) {
 
     if (myTime <= 0)
         return 0;
 
     int moveNumber = (ply + 1) / 2;
-    double ratio;    // Which ratio of myTime we are going to use. It is <= 1
+    double ratio; // Which ratio of myTime we are going to use. It's <= 1 if not ponder
     double sd = 8.5;
 
     // Usage of increment follows quadratic distribution with the maximum at move 25
@@ -65,7 +63,17 @@ namespace {
 
     ratio = std::min(1.0, ratio * (1 + inc / (myTime * sd)));
 
-    return int(ratio * std::max(0, myTime - moveOverhead));
+    assert(ratio <= 1);
+
+    if (ponder && type == OptimumTime)
+        ratio *= 1.25;
+
+    int time = int(ratio * (myTime - moveOverhead));
+
+    if (type == OptimumTime)
+        time -= 10; // Keep always at least 10 millisecs on the clock
+
+    return std::max(0, time);
   }
 
 } // namespace
@@ -82,8 +90,9 @@ namespace {
 
 void TimeManagement::init(Search::LimitsType& limits, Color us, int ply)
 {
-  int moveOverhead    = Options["Move Overhead"];
-  int npmsec          = Options["nodestime"];
+  int moveOverhead = Options["Move Overhead"];
+  int npmsec       = Options["nodestime"];
+  bool ponder      = Options["Ponder"];
 
   // If we have to play in 'nodes as time' mode, then convert from time
   // to nodes, and use resulting values in time management formulas.
@@ -101,9 +110,8 @@ void TimeManagement::init(Search::LimitsType& limits, Color us, int ply)
   }
 
   startTime = limits.startTime;
-  optimumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, limits.movestogo, ply, OptimumTime);
-  maximumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, limits.movestogo, ply, MaxTime);
-
-  if (Options["Ponder"])
-      optimumTime += optimumTime / 4;
+  optimumTime = remaining(limits.time[us], limits.inc[us], moveOverhead,
+                          limits.movestogo, ply, ponder, OptimumTime);
+  maximumTime = remaining(limits.time[us], limits.inc[us], moveOverhead,
+                          limits.movestogo, ply, ponder, MaxTime);
 }