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;