X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=7029ae032ef8ba2703a7fa5080f4f319628fcf46;hp=cb16798dc427fcc30162a9f346c0402aac680a95;hb=30c583204f97da2c67b5042c30327013e70ae209;hpb=a6d6a2c2fad093a47b575ee4cfb8d346ba037fb3 diff --git a/src/search.cpp b/src/search.cpp index cb16798d..7029ae03 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -82,7 +82,7 @@ namespace { // History and stats update bonus, based on depth Value stat_bonus(Depth depth) { int d = depth / ONE_PLY ; - return Value(d * d + 2 * d - 2); + return d > 17 ? VALUE_ZERO : Value(d * d + 2 * d - 2); } // Skill structure is used to implement strength limit @@ -163,7 +163,7 @@ void Search::init() { for (int d = 1; d < 64; ++d) for (int mc = 1; mc < 64; ++mc) { - double r = log(d) * log(mc) / 2; + double r = log(d) * log(mc) / 1.95; Reductions[NonPV][imp][d][mc] = int(std::round(r)); Reductions[PV][imp][d][mc] = std::max(Reductions[NonPV][imp][d][mc] - 1, 0); @@ -542,7 +542,7 @@ namespace { Depth extension, newDepth; Value bestValue, value, ttValue, eval; bool ttHit, inCheck, givesCheck, singularExtensionNode, improving; - bool captureOrPromotion, doFullDepthSearch, moveCountPruning; + bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets; Piece moved_piece; int moveCount, quietCount; @@ -829,10 +829,11 @@ moves_loop: // When in check search starts from here && !excludedMove // Recursive singular search is not allowed && (tte->bound() & BOUND_LOWER) && tte->depth() >= depth - 3 * ONE_PLY; + skipQuiets = false; // Step 11. Loop through moves // Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs - while ((move = mp.next_move()) != MOVE_NONE) + while ((move = mp.next_move(skipQuiets)) != MOVE_NONE) { assert(is_ok(move)); @@ -867,12 +868,7 @@ moves_loop: // When in check search starts from here moveCountPruning = depth < 16 * ONE_PLY && moveCount >= FutilityMoveCounts[improving][depth / ONE_PLY]; - // Step 12. Extensions - // Extend checks - if ( givesCheck - && !moveCountPruning - && pos.see_ge(move, VALUE_ZERO)) - extension = ONE_PLY; + // Step 12. Singular and Gives Check Extensions // Singular extension search. If all moves but one fail low on a search of // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move @@ -881,7 +877,6 @@ moves_loop: // When in check search starts from here // ttValue minus a margin then we extend the ttMove. if ( singularExtensionNode && move == ttMove - && !extension && pos.legal(move)) { Value rBeta = std::max(ttValue - 2 * depth / ONE_PLY, -VALUE_MATE); @@ -893,6 +888,10 @@ moves_loop: // When in check search starts from here if (value < rBeta) extension = ONE_PLY; } + else if ( givesCheck + && !moveCountPruning + && pos.see_ge(move, VALUE_ZERO)) + extension = ONE_PLY; // Calculate new depth for this move newDepth = depth - ONE_PLY + extension; @@ -906,8 +905,10 @@ moves_loop: // When in check search starts from here && (!pos.advanced_pawn_push(move) || pos.non_pawn_material() >= 5000)) { // Move count based pruning - if (moveCountPruning) + if (moveCountPruning) { + skipQuiets = true; continue; + } // Reduced depth of the next LMR search int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY;