]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Do not exit early even when seeing mate
[stockfish] / src / search.cpp
index 33e170acb8364fca92117ee63e881b1bcaf1ad98..aec6434553a8c82f48908fad4183ed20ea50121d 100644 (file)
@@ -633,12 +633,6 @@ namespace {
         // Check for some early stop condition
         if (!StopRequest && Limits.useTimeManagement())
         {
-            // Stop search early when the last two iterations returned a mate score
-            if (   depth >= 5
-                && abs(bestValues[depth])     >= VALUE_MATE_IN_PLY_MAX
-                && abs(bestValues[depth - 1]) >= VALUE_MATE_IN_PLY_MAX)
-                StopRequest = true;
-
             // Stop search early if one move seems to be much better than the
             // others or if there is only a single legal move. Also in the latter
             // case we search up to some depth anyway to get a proper score.
@@ -726,7 +720,7 @@ namespace {
     if (PvNode && thread.maxPly < ss->ply)
         thread.maxPly = ss->ply;
 
-    // Step 1. Initialize node.
+    // Step 1. Initialize node and poll. Polling can abort search
     if (!SpNode)
     {
         ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
@@ -742,6 +736,18 @@ namespace {
         goto split_point_start;
     }
 
+    if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
+    {
+        NodesSincePoll = 0;
+        poll(pos);
+    }
+
+    // Step 2. Check for aborted search and immediate draw
+    if ((   StopRequest
+         || pos.is_draw<false>()
+         || ss->ply > PLY_MAX) && !RootNode)
+        return VALUE_DRAW;
+
     // Step 3. Mate distance pruning
     if (!RootNode)
     {
@@ -902,12 +908,7 @@ namespace {
             if (pos.pl_move_is_legal(move, ci.pinned))
             {
                 pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
-
-                if (pos.is_draw<false>() || ss->ply + 1 > PLY_MAX)
-                    value = VALUE_DRAW;
-                else
-                    value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
-
+                value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
                 pos.undo_move(move);
                 if (value >= rbeta)
                     return value;
@@ -1097,22 +1098,6 @@ split_point_start: // At split points actual search starts from here
       // Step 14. Make the move
       pos.do_move(move, st, ci, givesCheck);
 
-      // Step XX. Poll. Check if search should be aborted.
-      if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
-      {
-          NodesSincePoll = 0;
-          poll(pos);
-      }
-
-      // Step XX. Check for aborted search and immediate draw
-      if (   StopRequest
-          || pos.is_draw<false>()
-          || ss->ply + 1 > PLY_MAX)
-      {
-          value = VALUE_DRAW;
-          goto undo;
-      }
-
       // Step extra. pv search (only in PV nodes)
       // The first move in list is the expected PV
       if (isPvMove)
@@ -1159,7 +1144,6 @@ split_point_start: // At split points actual search starts from here
       }
 
       // Step 17. Undo move
-undo:
       pos.undo_move(move);
 
       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);