From 9741694fca7dc59a2d16ed6a69f905d22472038c Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 18 Sep 2009 10:32:57 +0200 Subject: [PATCH] Save static evaluation also for failed low nodes When a node fails low and bestValue is still equal to the original static node evaluation, then save this in TT along with usual info. This will allow us to avoid a future costly evaluation() call. This patch extends to failed low nodes what we already do for failed high ones. No functional change. Signed-off-by: Marco Costalba --- src/search.cpp | 10 +++++++--- src/tt.cpp | 4 ++-- src/value.h | 4 +++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 0c9f1ee7..93a58203 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1535,7 +1535,7 @@ namespace { if (isCheck) staticValue = -VALUE_INFINITE; - else if (tte && tte->type() == VALUE_TYPE_EVAL) + else if (tte && (tte->type() & VALUE_TYPE_EVAL)) { // Use the cached evaluation score if possible assert(ei.futilityMargin == Value(0)); @@ -1556,7 +1556,7 @@ namespace { { // Store the score to avoid a future costly evaluation() call if (!isCheck && !tte && ei.futilityMargin == 0) - TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EVAL, Depth(-127*OnePly), MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EV_LO, Depth(-127*OnePly), MOVE_NONE); return bestValue; } @@ -1644,9 +1644,13 @@ namespace { Move m = ss[ply].pv[ply]; if (!pvNode) { + // If bestValue isn't changed it means it is still the static evaluation of + // the node, so keep this info to avoid a future costly evaluation() call. + ValueType type = (bestValue == staticValue && !ei.futilityMargin ? VALUE_TYPE_EV_UP : VALUE_TYPE_UPPER); Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1)); + if (bestValue < beta) - TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, d, MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), type, d, MOVE_NONE); else TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, d, m); } diff --git a/src/tt.cpp b/src/tt.cpp index e140a0ba..9f0e21fd 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -121,8 +121,8 @@ void TranspositionTable::store(const Key posKey, Value v, ValueType t, Depth d, { if (!tte->key() || tte->key() == posKey32) // empty or overwrite old { - // Do not overwrite when new type is VALUE_TYPE_EVAL - if (tte->key() && t == VALUE_TYPE_EVAL) + // Do not overwrite when new type is VALUE_TYPE_EV_LO + if (tte->key() && t == VALUE_TYPE_EV_LO) return; if (m == MOVE_NONE) diff --git a/src/value.h b/src/value.h index 51517462..3af00d8e 100644 --- a/src/value.h +++ b/src/value.h @@ -37,7 +37,9 @@ enum ValueType { VALUE_TYPE_UPPER = 1, // Upper bound VALUE_TYPE_LOWER = 2, // Lower bound VALUE_TYPE_EXACT = 3, // Exact score - VALUE_TYPE_EVAL = 4 // Evaluation cache + VALUE_TYPE_EVAL = 4, // Evaluation cache + VALUE_TYPE_EV_UP = 5, // Evaluation cache for upper bound + VALUE_TYPE_EV_LO = 6 // Evaluation cache for lower bound }; -- 2.39.2