Stop earlier if iteration is taking too long
authorUri Blass <uriblass@gmail.com>
Mon, 6 Jan 2014 06:06:39 +0000 (08:06 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 8 Jan 2014 14:45:55 +0000 (23:45 +0900)
If we are still at first move, without a fail-low and
current iteration is taking too long to complete then
stop the search.

Passed short TC:
LLR: 2.97 (-2.94,2.94) [-1.50,4.50]
Total: 26030 W: 4959 L: 4785 D: 16286

Long TC:
LLR: 2.95 (-2.94,2.94) [0.00,6.00]
Total: 18019 W: 2936 L: 2752 D: 12331

And performed well at 40/30
ELO: 4.33 +-2.8 (95%) LOS: 99.9%
Total: 20000 W: 3480 L: 3231 D: 13289

bench: 8502826

src/search.cpp
src/search.h

index 7075c3373a2c90eec8a021e45d8552544f529ab7..505e9ec2a481f49efa53e3276c14e2c6b15b1572 100644 (file)
@@ -43,7 +43,7 @@ namespace Search {
   std::vector<RootMove> RootMoves;
   Position RootPos;
   Color RootColor;
-  Time::point SearchTime;
+  Time::point SearchTime, IterationTime;
   StateStackPtr SetupStates;
 }
 
@@ -396,6 +396,8 @@ namespace {
                 sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
         }
 
+        IterationTime = Time::now() - SearchTime;
+
         // If skill levels are enabled and time is up, pick a sub-optimal best move
         if (skill.enabled() && skill.time_to_pick(depth))
             skill.pick_move();
@@ -429,7 +431,7 @@ namespace {
             // Stop the search if most of the available time has been used. We
             // probably don't have enough time to search the first move at the
             // next iteration anyway.
-            if (Time::now() - SearchTime > (TimeMgr.available_time() * 62) / 100)
+            if (IterationTime > (TimeMgr.available_time() * 62) / 100)
                 stop = true;
 
             // Stop the search early if one move seems to be much better than others
@@ -1629,7 +1631,8 @@ void check_time() {
   Time::point elapsed = Time::now() - SearchTime;
   bool stillAtFirstMove =    Signals.firstRootMove
                          && !Signals.failedLowAtRoot
-                         &&  elapsed > TimeMgr.available_time();
+                         &&  elapsed > (TimeMgr.available_time() * 62) / 100
+                         &&  elapsed > IterationTime * 1.4;
 
   bool noMoreTime =   elapsed > TimeMgr.maximum_time() - 2 * TimerThread::Resolution
                    || stillAtFirstMove;
index dba5dd121efa760d1afa590bfe812c1e63e92041..ab1076cd61891559d84d198940880e6cbf988f61 100644 (file)
@@ -98,7 +98,7 @@ extern LimitsType Limits;
 extern std::vector<RootMove> RootMoves;
 extern Position RootPos;
 extern Color RootColor;
-extern Time::point SearchTime;
+extern Time::point SearchTime, IterationTime;
 extern StateStackPtr SetupStates;
 
 extern void init();