X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=e7933f762422af11fe541156e10206ec3562b2bc;hp=8b5f3b2b6d8c6171575a31f1cb3e3afcfe8327f3;hb=4ad6a3496b4ab2234e1a2436116be827be2d3a20;hpb=4894231ff71b4132ce77cac7e01dc708bc93f426 diff --git a/src/search.cpp b/src/search.cpp index 8b5f3b2b..e7933f76 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); @@ -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() || 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(pos, ss+1, -beta, -alpha, depth-ONE_PLY); + + if (pos.is_draw() || ss->ply+1 > PLY_MAX) + value = VALUE_DRAW; + else + value = -qsearch(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() || ply < 2)) {