mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Remember when TT value equals static evaluation value
When the stored TT value equals the static value set a proper flag so to not call evaluation() if we hit the same position again but use the stored TT value instead. This is another trick to avoid calling costly evaluation() in qsearch. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
c6c4713ab2
commit
6a8e46d53e
3 changed files with 22 additions and 7 deletions
|
@ -1455,7 +1455,7 @@ namespace {
|
||||||
if (isCheck)
|
if (isCheck)
|
||||||
staticValue = -VALUE_INFINITE;
|
staticValue = -VALUE_INFINITE;
|
||||||
|
|
||||||
else if (tte && tte->type() == VALUE_TYPE_EVAL)
|
else if (tte && (tte->type() == VALUE_TYPE_EVAL || tte->staticValue()))
|
||||||
{
|
{
|
||||||
// Use the cached evaluation score if possible
|
// Use the cached evaluation score if possible
|
||||||
assert(tte->value() == evaluate(pos, ei, threadID));
|
assert(tte->value() == evaluate(pos, ei, threadID));
|
||||||
|
@ -1569,10 +1569,21 @@ namespace {
|
||||||
if (!pvNode)
|
if (!pvNode)
|
||||||
{
|
{
|
||||||
Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
|
Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1));
|
||||||
|
Value v = value_to_tt(bestValue, ply);
|
||||||
|
TTEntry* e;
|
||||||
if (bestValue < beta)
|
if (bestValue < beta)
|
||||||
TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_UPPER);
|
e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
|
||||||
else
|
else
|
||||||
TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_LOWER);
|
e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_LOWER);
|
||||||
|
|
||||||
|
assert(e && e == TT.retrieve(pos));
|
||||||
|
assert(!e->staticValue());
|
||||||
|
|
||||||
|
// If the just stored value happens to be equal to the static evaluation
|
||||||
|
// score then set the flag, so to avoid calling evaluation() next time we
|
||||||
|
// hit this position.
|
||||||
|
if (staticValue == v && !ei.futilityMargin)
|
||||||
|
e->setStaticValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update killers only for good check moves
|
// Update killers only for good check moves
|
||||||
|
|
|
@ -103,7 +103,7 @@ void TranspositionTable::clear() {
|
||||||
/// current search and t2 is from a previous search, or if the depth of t1
|
/// current search and t2 is from a previous search, or if the depth of t1
|
||||||
/// is bigger than the depth of t2.
|
/// is bigger than the depth of t2.
|
||||||
|
|
||||||
void TranspositionTable::store(const Position &pos, Value v, Depth d,
|
TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
|
||||||
Move m, ValueType type) {
|
Move m, ValueType type) {
|
||||||
TTEntry *tte, *replace;
|
TTEntry *tte, *replace;
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
|
||||||
m = tte->move();
|
m = tte->move();
|
||||||
|
|
||||||
*tte = TTEntry(pos.get_key(), v, type, d, m, generation);
|
*tte = TTEntry(pos.get_key(), v, type, d, m, generation);
|
||||||
return;
|
return tte;
|
||||||
}
|
}
|
||||||
else if (i == 0) // replace would be a no-op in this common case
|
else if (i == 0) // replace would be a no-op in this common case
|
||||||
continue;
|
continue;
|
||||||
|
@ -130,6 +130,7 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
|
||||||
}
|
}
|
||||||
*replace = TTEntry(pos.get_key(), v, type, d, m, generation);
|
*replace = TTEntry(pos.get_key(), v, type, d, m, generation);
|
||||||
writes++;
|
writes++;
|
||||||
|
return replace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
7
src/tt.h
7
src/tt.h
|
@ -46,7 +46,8 @@
|
||||||
/// the 32 bits of the data field are so defined
|
/// the 32 bits of the data field are so defined
|
||||||
///
|
///
|
||||||
/// bit 0-16: move
|
/// bit 0-16: move
|
||||||
/// bit 17-19: not used
|
/// bit 17: stored value equals static value
|
||||||
|
/// bit 18-19: not used
|
||||||
/// bit 20-22: value type
|
/// bit 20-22: value type
|
||||||
/// bit 23-31: generation
|
/// bit 23-31: generation
|
||||||
|
|
||||||
|
@ -61,6 +62,8 @@ public:
|
||||||
Value value() const { return Value(value_); }
|
Value value() const { return Value(value_); }
|
||||||
ValueType type() const { return ValueType((data >> 20) & 7); }
|
ValueType type() const { return ValueType((data >> 20) & 7); }
|
||||||
int generation() const { return (data >> 23); }
|
int generation() const { return (data >> 23); }
|
||||||
|
bool staticValue() const { return ((data >> 17) & 1); }
|
||||||
|
void setStaticValue() { data |= (1 << 17); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Key key_;
|
Key key_;
|
||||||
|
@ -80,7 +83,7 @@ public:
|
||||||
~TranspositionTable();
|
~TranspositionTable();
|
||||||
void set_size(unsigned mbSize);
|
void set_size(unsigned mbSize);
|
||||||
void clear();
|
void clear();
|
||||||
void store(const Position &pos, Value v, Depth d, Move m, ValueType type);
|
TTEntry* store(const Position &pos, Value v, Depth d, Move m, ValueType type);
|
||||||
TTEntry* retrieve(const Position &pos) const;
|
TTEntry* retrieve(const Position &pos) const;
|
||||||
void new_search();
|
void new_search();
|
||||||
void insert_pv(const Position &pos, Move pv[]);
|
void insert_pv(const Position &pos, Move pv[]);
|
||||||
|
|
Loading…
Add table
Reference in a new issue