mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Refresh TT entries generation automatically on probe
And other assorted simplifications, tested with SPRT[-3, 1] Passed both short TC LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 18814 W: 3600 L: 3475 D: 11739 And long TC LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 20731 W: 3217 L: 3096 D: 14418 No functional change.
This commit is contained in:
parent
f12449d492
commit
ffdf63ff7c
3 changed files with 24 additions and 32 deletions
|
@ -534,7 +534,6 @@ namespace {
|
||||||
: ttValue >= beta ? (tte->bound() & BOUND_LOWER)
|
: ttValue >= beta ? (tte->bound() & BOUND_LOWER)
|
||||||
: (tte->bound() & BOUND_UPPER)))
|
: (tte->bound() & BOUND_UPPER)))
|
||||||
{
|
{
|
||||||
TT.refresh(tte);
|
|
||||||
ss->currentMove = ttMove; // Can be MOVE_NONE
|
ss->currentMove = ttMove; // Can be MOVE_NONE
|
||||||
|
|
||||||
// If ttMove is quiet, update killers, history, counter move and followup move on TT hit
|
// If ttMove is quiet, update killers, history, counter move and followup move on TT hit
|
||||||
|
|
15
src/tt.cpp
15
src/tt.cpp
|
@ -70,12 +70,15 @@ void TranspositionTable::clear() {
|
||||||
|
|
||||||
const TTEntry* TranspositionTable::probe(const Key key) const {
|
const TTEntry* TranspositionTable::probe(const Key key) const {
|
||||||
|
|
||||||
const TTEntry* tte = first_entry(key);
|
TTEntry* tte = first_entry(key);
|
||||||
uint32_t key32 = key >> 32;
|
uint32_t key32 = key >> 32;
|
||||||
|
|
||||||
for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
|
for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
|
||||||
if (tte->key() == key32)
|
if (tte->key32 == key32)
|
||||||
|
{
|
||||||
|
tte->generation8 = generation; // Refresh
|
||||||
return tte;
|
return tte;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -99,7 +102,7 @@ void TranspositionTable::store(const Key key, Value v, Bound b, Depth d, Move m,
|
||||||
|
|
||||||
for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
|
for (unsigned i = 0; i < ClusterSize; ++i, ++tte)
|
||||||
{
|
{
|
||||||
if (!tte->key() || tte->key() == key32) // Empty or overwrite old
|
if (!tte->key32 || tte->key32 == key32) // Empty or overwrite old
|
||||||
{
|
{
|
||||||
if (!m)
|
if (!m)
|
||||||
m = tte->move(); // Preserve any existing ttMove
|
m = tte->move(); // Preserve any existing ttMove
|
||||||
|
@ -109,9 +112,9 @@ void TranspositionTable::store(const Key key, Value v, Bound b, Depth d, Move m,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement replace strategy
|
// Implement replace strategy
|
||||||
c1 = (replace->generation() == generation ? 2 : 0);
|
c1 = (replace->generation8 == generation ? 2 : 0);
|
||||||
c2 = (tte->generation() == generation || tte->bound() == BOUND_EXACT ? -2 : 0);
|
c2 = (tte->generation8 == generation || tte->bound() == BOUND_EXACT ? -2 : 0);
|
||||||
c3 = (tte->depth() < replace->depth() ? 1 : 0);
|
c3 = (tte->depth16 < replace->depth16 ? 1 : 0);
|
||||||
|
|
||||||
if (c1 + c2 + c3 > 0)
|
if (c1 + c2 + c3 > 0)
|
||||||
replace = tte;
|
replace = tte;
|
||||||
|
|
40
src/tt.h
40
src/tt.h
|
@ -37,25 +37,25 @@ struct TTEntry {
|
||||||
|
|
||||||
void save(uint32_t k, Value v, Bound b, Depth d, Move m, int g, Value ev) {
|
void save(uint32_t k, Value v, Bound b, Depth d, Move m, int g, Value ev) {
|
||||||
|
|
||||||
key32 = (uint32_t)k;
|
key32 = (uint32_t)k;
|
||||||
move16 = (uint16_t)m;
|
move16 = (uint16_t)m;
|
||||||
bound8 = (uint8_t)b;
|
bound8 = (uint8_t)b;
|
||||||
generation8 = (uint8_t)g;
|
generation8 = (uint8_t)g;
|
||||||
value16 = (int16_t)v;
|
value16 = (int16_t)v;
|
||||||
depth16 = (int16_t)d;
|
depth16 = (int16_t)d;
|
||||||
evalValue = (int16_t)ev;
|
evalValue = (int16_t)ev;
|
||||||
}
|
}
|
||||||
void set_generation(uint8_t g) { generation8 = g; }
|
|
||||||
|
|
||||||
uint32_t key() const { return key32; }
|
uint32_t key() const { return key32; }
|
||||||
Depth depth() const { return (Depth)depth16; }
|
Move move() const { return (Move)move16; }
|
||||||
Move move() const { return (Move)move16; }
|
Bound bound() const { return (Bound)bound8; }
|
||||||
Value value() const { return (Value)value16; }
|
Value value() const { return (Value)value16; }
|
||||||
Bound bound() const { return (Bound)bound8; }
|
Depth depth() const { return (Depth)depth16; }
|
||||||
int generation() const { return (int)generation8; }
|
Value eval_value() const { return (Value)evalValue; }
|
||||||
Value eval_value() const { return (Value)evalValue; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend struct TranspositionTable;
|
||||||
|
|
||||||
uint32_t key32;
|
uint32_t key32;
|
||||||
uint16_t move16;
|
uint16_t move16;
|
||||||
uint8_t bound8, generation8;
|
uint8_t bound8, generation8;
|
||||||
|
@ -79,7 +79,6 @@ public:
|
||||||
|
|
||||||
const TTEntry* probe(const Key key) const;
|
const TTEntry* probe(const Key key) const;
|
||||||
TTEntry* first_entry(const Key key) const;
|
TTEntry* first_entry(const Key key) const;
|
||||||
void refresh(const TTEntry* tte) const;
|
|
||||||
void resize(uint64_t mbSize);
|
void resize(uint64_t mbSize);
|
||||||
void clear();
|
void clear();
|
||||||
void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV);
|
void store(const Key key, Value v, Bound type, Depth d, Move m, Value statV);
|
||||||
|
@ -103,13 +102,4 @@ inline TTEntry* TranspositionTable::first_entry(const Key key) const {
|
||||||
return table + ((uint32_t)key & hashMask);
|
return table + ((uint32_t)key & hashMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// TranspositionTable::refresh() updates the 'generation' value of the TTEntry
|
|
||||||
/// to avoid aging. It is normally called after a TT hit.
|
|
||||||
|
|
||||||
inline void TranspositionTable::refresh(const TTEntry* tte) const {
|
|
||||||
|
|
||||||
const_cast<TTEntry*>(tte)->set_generation(generation);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // #ifndef TT_H_INCLUDED
|
#endif // #ifndef TT_H_INCLUDED
|
||||||
|
|
Loading…
Add table
Reference in a new issue