]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Move the draw check also for qsearch
[stockfish] / src / search.cpp
index 8b5f3b2b6d8c6171575a31f1cb3e3afcfe8327f3..e7933f762422af11fe541156e10206ec3562b2bc 100644 (file)
@@ -726,7 +726,7 @@ namespace {
     if (PvNode && thread.maxPly < ss->ply)
         thread.maxPly = ss->ply;
 
-    // Step 1. Initialize node and poll. Polling can abort search
+    // Step 1. Initialize node.
     if (!SpNode)
     {
         ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
@@ -742,18 +742,6 @@ 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)
     {
@@ -914,7 +902,12 @@ namespace {
             if (pos.pl_move_is_legal(move, ci.pinned))
             {
                 pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
-                value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
+
+                if (pos.is_draw<false>() || ss->ply + 1 > PLY_MAX)
+                    value = VALUE_DRAW;
+                else
+                    value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
+
                 pos.undo_move(move);
                 if (value >= rbeta)
                     return value;
@@ -1104,6 +1097,22 @@ 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)
@@ -1150,6 +1159,7 @@ 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);
@@ -1312,10 +1322,6 @@ split_point_start: // At split points actual search starts from here
     ss->bestMove = ss->currentMove = MOVE_NONE;
     ss->ply = (ss-1)->ply + 1;
 
-    // Check for an instant draw or maximum ply reached
-    if (pos.is_draw<true>() || ss->ply > PLY_MAX)
-        return VALUE_DRAW;
-
     // Decide whether or not to include checks, this fixes also the type of
     // TT entry depth that we are going to use. Note that in qsearch we use
     // only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
@@ -1450,7 +1456,12 @@ split_point_start: // At split points actual search starts from here
 
       // Make and search the move
       pos.do_move(move, st, ci, givesCheck);
-      value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
+
+      if (pos.is_draw<true>() || ss->ply+1 > PLY_MAX)
+          value = VALUE_DRAW;
+      else
+          value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
+
       pos.undo_move(move);
 
       assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
@@ -2023,7 +2034,7 @@ split_point_start: // At split points actual search starts from here
     while (   (tte = TT.probe(pos.get_key())) != NULL
            && tte->move() != MOVE_NONE
            && pos.move_is_pl(tte->move())
-           && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces(pos.side_to_move()))
+           && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces())
            && ply < PLY_MAX
            && (!pos.is_draw<false>() || ply < 2))
     {