mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 11:39:15 +00:00
Revert setting a flag when TT value equals static evaluation
Strangely enough it seems that optimization doesn't work. After 760 games at 1+0: +155 -184 =421 -13 ELO Probably the overhead, although small, for setting the flag is not compensated by the saved evaluation call. This could be due to the fact that after a TT value is stored, if and when we hit the position again the stored TT value is actually used as a cut-off so that we don't need to go on with another search and evaluation is avoided in any case. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
2c0cd95ecf
commit
659c54582d
3 changed files with 8 additions and 23 deletions
|
@ -1455,7 +1455,7 @@ namespace {
|
||||||
if (isCheck)
|
if (isCheck)
|
||||||
staticValue = -VALUE_INFINITE;
|
staticValue = -VALUE_INFINITE;
|
||||||
|
|
||||||
else if (tte && (tte->type() == VALUE_TYPE_EVAL || tte->staticValue()))
|
else if (tte && tte->type() == VALUE_TYPE_EVAL)
|
||||||
{
|
{
|
||||||
// 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,21 +1569,10 @@ 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)
|
||||||
e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_UPPER);
|
TT.store(pos, value_to_tt(bestValue, ply), d, MOVE_NONE, VALUE_TYPE_UPPER);
|
||||||
else
|
else
|
||||||
e = TT.store(pos, v, d, MOVE_NONE, VALUE_TYPE_LOWER);
|
TT.store(pos, value_to_tt(bestValue, ply), 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
|
||||||
|
|
|
@ -104,7 +104,7 @@ void TranspositionTable::clear() {
|
||||||
/// is bigger than the depth of t2. A TTEntry of type VALUE_TYPE_EVAL
|
/// is bigger than the depth of t2. A TTEntry of type VALUE_TYPE_EVAL
|
||||||
/// never replaces another entry for the same position.
|
/// never replaces another entry for the same position.
|
||||||
|
|
||||||
TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
|
void TranspositionTable::store(const Position &pos, Value v, Depth d,
|
||||||
Move m, ValueType type) {
|
Move m, ValueType type) {
|
||||||
TTEntry *tte, *replace;
|
TTEntry *tte, *replace;
|
||||||
|
|
||||||
|
@ -116,13 +116,13 @@ TTEntry* TranspositionTable::store(const Position &pos, Value v, Depth d,
|
||||||
// Do not overwrite position entry when VALUE_TYPE_EVAL
|
// Do not overwrite position entry when VALUE_TYPE_EVAL
|
||||||
if ( tte->key()
|
if ( tte->key()
|
||||||
&& type == VALUE_TYPE_EVAL)
|
&& type == VALUE_TYPE_EVAL)
|
||||||
return NULL;
|
return;
|
||||||
|
|
||||||
if (m == MOVE_NONE)
|
if (m == MOVE_NONE)
|
||||||
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 tte;
|
return;
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
@ -136,7 +136,6 @@ TTEntry* 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,8 +46,7 @@
|
||||||
/// 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: stored value equals static value
|
/// bit 17-19: not used
|
||||||
/// bit 18-19: not used
|
|
||||||
/// bit 20-22: value type
|
/// bit 20-22: value type
|
||||||
/// bit 23-31: generation
|
/// bit 23-31: generation
|
||||||
|
|
||||||
|
@ -62,8 +61,6 @@ 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_;
|
||||||
|
@ -83,7 +80,7 @@ public:
|
||||||
~TranspositionTable();
|
~TranspositionTable();
|
||||||
void set_size(unsigned mbSize);
|
void set_size(unsigned mbSize);
|
||||||
void clear();
|
void clear();
|
||||||
TTEntry* store(const Position &pos, Value v, Depth d, Move m, ValueType type);
|
void 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