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 <mcostalba@gmail.com>
if (isCheck)
staticValue = -VALUE_INFINITE;
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));
{
// Use the cached evaluation score if possible
assert(ei.futilityMargin == Value(0));
{
// Store the score to avoid a future costly evaluation() call
if (!isCheck && !tte && ei.futilityMargin == 0)
{
// 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);
Move m = ss[ply].pv[ply];
if (!pvNode)
{
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));
Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
- 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);
}
else
TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, d, m);
}
{
if (!tte->key() || tte->key() == posKey32) // empty or overwrite old
{
{
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)
return;
if (m == MOVE_NONE)
VALUE_TYPE_UPPER = 1, // Upper bound
VALUE_TYPE_LOWER = 2, // Lower bound
VALUE_TYPE_EXACT = 3, // Exact score
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