Move draw checks right after doing the move
authorJoona Kiiski <joona.kiiski@gmail.com>
Mon, 11 Jul 2011 21:09:50 +0000 (00:09 +0300)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 19 Jul 2011 16:36:14 +0000 (17:36 +0100)
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index 94b34389178f0f18119d010bea23c8bdebf3d06e..33e170acb8364fca92117ee63e881b1bcaf1ad98 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);