From c581b7ea36274826b95497570231335dd6b77468 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 5 Nov 2012 10:13:48 +0100 Subject: [PATCH 1/1] Another attempt at evaluation shortcut In this case we try a rather drastic approach: we simply don't futility prune in qsearch when arriving from a null move. So we save evaluating and also save to mess with eval margins at all because margin is used only in futility. Also accuracy should not be affected, actually it improves because we don't prune anything anymore. bench: 5404066 --- src/search.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 253311ae..3ffd8ae4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1102,11 +1102,12 @@ split_point_start: // At split points actual search starts from here Key posKey; Move ttMove, move, bestMove; Value bestValue, value, ttValue, futilityValue, futilityBase; - bool givesCheck, enoughMaterial, evasionPrunable; + bool givesCheck, enoughMaterial, evasionPrunable, fromNull; Depth ttDepth; ss->currentMove = bestMove = MOVE_NONE; ss->ply = (ss-1)->ply + 1; + fromNull = (ss-1)->currentMove == MOVE_NULL; // Check for an instant draw or maximum ply reached if (pos.is_draw() || ss->ply > MAX_PLY) @@ -1144,7 +1145,12 @@ split_point_start: // At split points actual search starts from here } else { - if (tte) + if (fromNull) + { + ss->staticEval = bestValue = -(ss-1)->staticEval; + ss->evalMargin = VALUE_ZERO; + } + else if (tte) { assert(tte->static_value() != VALUE_NONE || Threads.size() > 1); @@ -1192,6 +1198,7 @@ split_point_start: // At split points actual search starts from here if ( !PvNode && !InCheck && !givesCheck + && !fromNull && move != ttMove && enoughMaterial && type_of(move) != PROMOTION -- 2.39.2