From 3f14ed6602936ecf98b0a26c5abc1c980a091f63 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 8 Dec 2011 19:12:17 +0100 Subject: [PATCH] Don't update bestValue when pruning Simply return a fail-low score Signed-off-by: Marco Costalba --- src/search.cpp | 19 ++++++++++++------- src/thread.cpp | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 5d753e8e..4c69a052 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -948,6 +948,9 @@ split_point_start: // At split points actual search starts from here { lock_grab(&(sp->lock)); bestValue = sp->bestValue; + moveCount = sp->moveCount; + + assert(bestValue > -VALUE_INFINITE && moveCount > 0); } // Step 11. Loop through moves @@ -1065,13 +1068,7 @@ split_point_start: // At split points actual search starts from here if (futilityValue < beta) { if (SpNode) - { lock_grab(&(sp->lock)); - if (futilityValue > sp->bestValue) - sp->bestValue = bestValue = futilityValue; - } - else if (futilityValue > bestValue) - bestValue = futilityValue; continue; } @@ -1220,9 +1217,17 @@ split_point_start: // At split points actual search starts from here // case of StopRequest or thread.cutoff_occurred() are set, but this is // harmless because return value is discarded anyhow in the parent nodes. // If we are in a singular extension search then return a fail low score. - if (!SpNode && !moveCount) + if (!moveCount) return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW; + // We have pruned all the moves, so return a fail-low score + if (bestValue == -VALUE_INFINITE) + { + assert(!playedMoveCount); + + bestValue = alpha; + } + // Step 21. Update tables // If the search is not aborted, update the transposition table, // history counters, and killer moves. diff --git a/src/thread.cpp b/src/thread.cpp index cf35c288..9c132a03 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -263,7 +263,7 @@ Value ThreadsManager::split(Position& pos, Stack* ss, Value alpha, Value beta, Value bestValue, Depth depth, Move threatMove, int moveCount, MovePicker* mp, int nodeType) { assert(pos.pos_is_ok()); - assert(bestValue >= -VALUE_INFINITE); + assert(bestValue > -VALUE_INFINITE); assert(bestValue <= alpha); assert(alpha < beta); assert(beta <= VALUE_INFINITE); -- 2.39.2