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
This commit is contained in:
VoyagerOne
2017-03-18 15:41:55 -07:00
committed by Joona Kiiski
parent c80d52c845
commit 352bd6f5aa
3 changed files with 12 additions and 7 deletions

View File

@@ -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<PvNode>(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY;