Skip to content

Commit

Permalink
Skip quiet moves based on moveCount pruning threshold and history stats
Browse files Browse the repository at this point in the history
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 official-stockfish#1036
  • Loading branch information
VoyagerOne authored and zamar committed Mar 18, 2017
1 parent c80d52c commit 352bd6f
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 7 deletions.
6 changes: 4 additions & 2 deletions src/movepick.cpp
Expand Up @@ -175,7 +175,7 @@ void MovePicker::score<EVASIONS>() {
/// 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;

Expand Down Expand Up @@ -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]
Expand Down
2 changes: 1 addition & 1 deletion src/movepick.h
Expand Up @@ -95,7 +95,7 @@ class MovePicker {
MovePicker(const Position&, Move, Depth, Square);
MovePicker(const Position&, Move, Depth, Search::Stack*);

Move next_move();
Move next_move(bool skipQuiets = false);

private:
template<GenType> void score();
Expand Down
11 changes: 7 additions & 4 deletions src/search.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -829,10 +829,11 @@ namespace {
&& !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));

Expand Down Expand Up @@ -906,8 +907,10 @@ namespace {
&& (!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<PvNode>(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY;
Expand Down

0 comments on commit 352bd6f

Please sign in to comment.