X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=aec6434553a8c82f48908fad4183ed20ea50121d;hp=e7933f762422af11fe541156e10206ec3562b2bc;hb=03ad183384d484990248cb22394a93926f421520;hpb=4ad6a3496b4ab2234e1a2436116be827be2d3a20 diff --git a/src/search.cpp b/src/search.cpp index e7933f76..aec64345 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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() + || 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() || ss->ply + 1 > PLY_MAX) - value = VALUE_DRAW; - else - value = -search(pos, ss+1, -rbeta, -rbeta+1, rdepth); - + value = -search(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() - || 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); @@ -1322,6 +1306,10 @@ undo: 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() || 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. @@ -1456,12 +1444,7 @@ undo: // Make and search the move pos.do_move(move, st, ci, givesCheck); - - if (pos.is_draw() || ss->ply+1 > PLY_MAX) - value = VALUE_DRAW; - else - value = -qsearch(pos, ss+1, -beta, -alpha, depth-ONE_PLY); - + value = -qsearch(pos, ss+1, -beta, -alpha, depth-ONE_PLY); pos.undo_move(move); assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);