From 0a318cdddf8b6bdd05c2e0ee9b3b61a031d398ed Mon Sep 17 00:00:00 2001 From: Michael Chaly Date: Sat, 18 Dec 2021 11:51:19 +0300 Subject: [PATCH] Adjust reductions based on current node delta and root delta This patch is a follow up of previous 2 patches that introduced more reductions for PV nodes with low delta and more pruning for nodes with low delta. Instead of writing separate heuristics now it adjust reductions based on delta / rootDelta - it allows to remove 3 separate adjustements of pruning/LMR in different places and also makes reduction dependence on delta and rootDelta smoother. Also now it works for all pruning heuristics and not just 2. Passed STC https://tests.stockfishchess.org/tests/view/61ba9b6c57a0d0f327c2d48b LLR: 2.94 (-2.94,2.94) <0.00,2.50> Total: 79192 W: 20513 L: 20163 D: 38516 Ptnml(0-2): 238, 8900, 21024, 9142, 292 passed LTC https://tests.stockfishchess.org/tests/view/61baf77557a0d0f327c2eb8e LLR: 2.96 (-2.94,2.94) <0.50,3.00> Total: 158400 W: 41134 L: 40572 D: 76694 Ptnml(0-2): 101, 16372, 45745, 16828, 154 closes https://github.com/official-stockfish/Stockfish/pull/3862 bench 4651538 --- src/search.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 2abfbaf2..8a4db351 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -69,9 +69,9 @@ namespace { // Reductions lookup table, initialized at startup int Reductions[MAX_MOVES]; // [depth or moveNumber] - Depth reduction(bool i, Depth d, int mn, bool rangeReduction) { + Depth reduction(bool i, Depth d, int mn, bool rangeReduction, Value delta, Value rootDelta) { int r = Reductions[d] * Reductions[mn]; - return (r + 534) / 1024 + (!i && r > 904) + rangeReduction; + return (r + 1358 - int(delta) * 1024 / int(rootDelta)) / 1024 + (!i && r > 904) + rangeReduction; } constexpr int futility_move_count(bool improving, Depth depth) { @@ -1015,6 +1015,8 @@ moves_loop: // When in check, search starts here // Calculate new depth for this move newDepth = depth - 1; + Value delta = beta - alpha; + // Step 13. Pruning at shallow depth (~200 Elo). Depth conditions are important for mate finding. if ( !rootNode && pos.non_pawn_material(us) @@ -1024,7 +1026,7 @@ moves_loop: // When in check, search starts here moveCountPruning = moveCount >= futility_move_count(improving, depth); // Reduced depth of the next LMR search - int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, rangeReduction > 2), 0); + int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, rangeReduction > 2, delta, thisThread->rootDelta), 0); if ( captureOrPromotion || givesCheck) @@ -1052,8 +1054,6 @@ moves_loop: // When in check, search starts here history += thisThread->mainHistory[us][from_to(move)]; - lmrDepth = std::max(0, lmrDepth - (beta - alpha < thisThread->rootDelta / 4)); - // Futility pruning: parent node (~5 Elo) if ( !ss->inCheck && lmrDepth < 8 @@ -1161,12 +1161,11 @@ moves_loop: // When in check, search starts here || !captureOrPromotion || (cutNode && (ss-1)->moveCount > 1))) { - Depth r = reduction(improving, depth, moveCount, rangeReduction > 2); + Depth r = reduction(improving, depth, moveCount, rangeReduction > 2, delta, thisThread->rootDelta); // Decrease reduction at some PvNodes (~2 Elo) if ( PvNode - && bestMoveCount <= 3 - && beta - alpha >= thisThread->rootDelta / 4) + && bestMoveCount <= 3) r--; // Decrease reduction if position is or has been on the PV @@ -1175,10 +1174,6 @@ moves_loop: // When in check, search starts here && !likelyFailLow) r -= 2; - // Increase reduction at non-PV nodes (~3 Elo) - if (!PvNode) - r++; - // Decrease reduction if opponent's move count is high (~1 Elo) if ((ss-1)->moveCount > 13) r--; -- 2.39.2