From 969ad8001c12adfeb55b494e2bc3981364c8bf5e Mon Sep 17 00:00:00 2001 From: Joona Kiiski Date: Tue, 12 Jul 2011 00:09:50 +0300 Subject: [PATCH] Move draw checks right after doing the move Signed-off-by: Marco Costalba --- src/search.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 94b34389..33e170ac 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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() - || 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(pos, ss+1, -rbeta, -rbeta+1, rdepth); + + if (pos.is_draw() || ss->ply + 1 > PLY_MAX) + value = VALUE_DRAW; + else + value = -search(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() + || 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); -- 2.39.2