From 5f3c660d5d768ea5132439c5a8916673b909c0c9 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 3 Jun 2010 12:10:12 +0200 Subject: [PATCH] Shortcut futility pruning in qsearch If we have pruned one capture due to its final value we can prune also following ones because captures are MVV ordered. Also avoid a compare when not in PV because in that case is always false. No functional change. --- src/search.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 8fa1a379..6715d680 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1467,12 +1467,13 @@ namespace { EvalInfo ei; StateInfo st; Move ttMove, move; - Value staticValue, bestValue, value, futilityBase, futilityValue; + Value staticValue, bestValue, value, futilityBase; bool isCheck, enoughMaterial, moveIsCheck, evasionPrunable; const TTEntry* tte = NULL; int moveCount = 0; int ply = pos.ply(); Value oldAlpha = alpha; + Value futilityValue = VALUE_INFINITE; TM.incrementNodeCounter(pos.thread()); ss->init(ply); @@ -1524,7 +1525,7 @@ namespace { return bestValue; } - if (bestValue > alpha) + if (PvNode && bestValue > alpha) alpha = bestValue; // If we are near beta then try to get a cutoff pushing checks a bit further @@ -1560,6 +1561,11 @@ namespace { && !move_is_promotion(move) && !pos.move_is_passed_pawn_push(move)) { + // Can only decrease from previous move because of + // MVV ordering so we don't need to recheck. + if (futilityValue < alpha) + continue; + futilityValue = futilityBase + pos.endgame_value_of_piece_on(move_to(move)) + (move_is_ep(move) ? PawnValueEndgame : Value(0)); -- 2.39.2