From 352bd6f5aa348e15909f50266fc5bdc003df35bf Mon Sep 17 00:00:00 2001 From: VoyagerOne Date: Sat, 18 Mar 2017 15:41:55 -0700 Subject: [PATCH] Skip quiet moves based on moveCount pruning threshold and history stats If we can moveCountPrune and next quiet move has negative stats, then go directly to the next move stage (Bad_Captures). Reduction formula is tweaked to compensate for the decrease in move count that is used in LMR. STC: LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 6847 W: 1276 L: 1123 D: 4448 LTC: LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 48687 W: 6503 L: 6226 D: 35958 Bench: 5919519 Closes #1036 --- src/movepick.cpp | 6 ++++-- src/movepick.h | 2 +- src/search.cpp | 11 +++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/movepick.cpp b/src/movepick.cpp index 83421272..2ea859a2 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -175,7 +175,7 @@ void MovePicker::score() { /// left. It picks the move with the biggest value from a list of generated moves /// taking care not to return the ttMove if it has already been searched. -Move MovePicker::next_move() { +Move MovePicker::next_move(bool skipQuiets) { Move move; @@ -248,9 +248,11 @@ Move MovePicker::next_move() { ++stage; case QUIET: - while (cur < endMoves) + while ( cur < endMoves + && (!skipQuiets || cur->value >= VALUE_ZERO)) { move = *cur++; + if ( move != ttMove && move != ss->killers[0] && move != ss->killers[1] diff --git a/src/movepick.h b/src/movepick.h index e1a2e6df..c1914182 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -95,7 +95,7 @@ public: MovePicker(const Position&, Move, Depth, Square); MovePicker(const Position&, Move, Depth, Search::Stack*); - Move next_move(); + Move next_move(bool skipQuiets = false); private: template void score(); diff --git a/src/search.cpp b/src/search.cpp index 88af0840..f07085ed 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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)); @@ -906,8 +907,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; -- 2.39.2