Skip to content

Commit

Permalink
Prune before extension
Browse files Browse the repository at this point in the history
Switch execution order in search: do move pruning before extension detection.

STC:
LLR: 2.96 (-2.94,2.94) [-1.50,4.50]
Total: 5762 W: 1307 L: 1181 D: 3274
http://tests.stockfishchess.org/tests/view/5dcc56e90ebc59025bcbb833

LTC:
LLR: 2.96 (-2.94,2.94) [0.00,3.50]
Total: 72956 W: 11959 L: 11585 D: 49412
http://tests.stockfishchess.org/tests/view/5dcc62840ebc59025bcbb96f

Closes official-stockfish/Stockfish#2413

Bench: 4532366
  • Loading branch information
locutus2 authored and snicolet committed Nov 14, 2019
1 parent a131975 commit a00a336
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 40 deletions.
2 changes: 1 addition & 1 deletion src/evaluate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ namespace {
constexpr Score PassedRank[RANK_NB] = {
S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
};

// OutpostRank[Rank] contains a bonus according to the rank of the outpost
constexpr Score OutpostRank[RANK_NB] = {
S(0, 0), S(0, 0), S(0, 0), S(28, 18), S(30, 24), S(32, 19)
Expand Down
80 changes: 41 additions & 39 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -955,7 +955,45 @@ namespace {
movedPiece = pos.moved_piece(move);
givesCheck = pos.gives_check(move);

// Step 13. Extensions (~70 Elo)
// Calculate new depth for this move
newDepth = depth - 1;

// Step 13. Pruning at shallow depth (~170 Elo)
if ( !rootNode
&& pos.non_pawn_material(us)
&& bestValue > VALUE_MATED_IN_MAX_PLY)
{
// Skip quiet moves if movecount exceeds our FutilityMoveCount threshold
moveCountPruning = moveCount >= futility_move_count(improving, depth);

if ( !captureOrPromotion
&& !givesCheck
&& (!PvNode || !pos.advanced_pawn_push(move) || pos.non_pawn_material(~us) > BishopValueMg))
{
// Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount), 0);

// Countermoves based pruning (~20 Elo)
if ( lmrDepth < 4 + ((ss-1)->statScore > 0 || (ss-1)->moveCount == 1)
&& (*contHist[0])[movedPiece][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[movedPiece][to_sq(move)] < CounterMovePruneThreshold)
continue;

// Futility pruning: parent node (~2 Elo)
if ( lmrDepth < 6
&& !inCheck
&& ss->staticEval + 250 + 211 * lmrDepth <= alpha)
continue;

// Prune moves with negative SEE (~10 Elo)
if (!pos.see_ge(move, Value(-(31 - std::min(lmrDepth, 18)) * lmrDepth * lmrDepth)))
continue;
}
else if (!pos.see_ge(move, Value(-199) * depth)) // (~20 Elo)
continue;
}

// Step 14. Extensions (~70 Elo)

// Singular extension search (~60 Elo). If all moves but one fail low on a
// search of (alpha-s, beta-s), and just one fails high on (alpha, beta),
Expand Down Expand Up @@ -1009,44 +1047,8 @@ namespace {
if (type_of(move) == CASTLING)
extension = 1;

// Calculate new depth for this move
newDepth = depth - 1 + extension;

// Step 14. Pruning at shallow depth (~170 Elo)
if ( !rootNode
&& pos.non_pawn_material(us)
&& bestValue > VALUE_MATED_IN_MAX_PLY)
{
// Skip quiet moves if movecount exceeds our FutilityMoveCount threshold
moveCountPruning = moveCount >= futility_move_count(improving, depth);

if ( !captureOrPromotion
&& !givesCheck
&& (!PvNode || !pos.advanced_pawn_push(move) || pos.non_pawn_material(~us) > BishopValueMg))
{
// Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount), 0);

// Countermoves based pruning (~20 Elo)
if ( lmrDepth < 4 + ((ss-1)->statScore > 0 || (ss-1)->moveCount == 1)
&& (*contHist[0])[movedPiece][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[movedPiece][to_sq(move)] < CounterMovePruneThreshold)
continue;

// Futility pruning: parent node (~2 Elo)
if ( lmrDepth < 6
&& !inCheck
&& ss->staticEval + 250 + 211 * lmrDepth <= alpha)
continue;

// Prune moves with negative SEE (~10 Elo)
if (!pos.see_ge(move, Value(-(31 - std::min(lmrDepth, 18)) * lmrDepth * lmrDepth)))
continue;
}
else if ( !(givesCheck && extension)
&& !pos.see_ge(move, Value(-199) * depth)) // (~20 Elo)
continue;
}
// Add extension to new depth
newDepth += extension;

// Speculative prefetch as early as possible
prefetch(TT.first_entry(pos.key_after(move)));
Expand Down

0 comments on commit a00a336

Please sign in to comment.