X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Ftt.cpp;h=19f21de22f21ee12f077538f4a812f46ef40a64c;hp=62e200bdcf9d3ad70f84f39b09a61e413afe3cd9;hb=2416242c966bfccd5a779e037dfe0d2d4cd8f3fe;hpb=2fd075d1ea62e0d68c7044ec8d199067c901adaa diff --git a/src/tt.cpp b/src/tt.cpp index 62e200bd..19f21de2 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -54,7 +54,7 @@ void TranspositionTable::resize(size_t mbSize) { /// TranspositionTable::clear() overwrites the entire transposition table -/// with zeroes. It is called whenever the table is resized, or when the +/// with zeros. It is called whenever the table is resized, or when the /// user asks the program to clear the table (from the UCI interface). void TranspositionTable::clear() { @@ -63,58 +63,34 @@ void TranspositionTable::clear() { } -/// TranspositionTable::probe() looks up the current position in the -/// transposition table. Returns a pointer to the TTEntry or NULL if -/// position is not found. +/// TranspositionTable::probe() looks up the current position in the transposition +/// table. It returns true and a pointer to the TTEntry if the position is found. +/// Otherwise, it returns false and a pointer to an empty or least valuable TTEntry +/// to be replaced later. A TTEntry t1 is considered to be more valuable than a +/// TTEntry t2 if t1 is from the current search and t2 is from a previous search, +/// or if the depth of t1 is bigger than the depth of t2. -const TTEntry* TranspositionTable::probe(const Key key) const { +TTEntry* TranspositionTable::probe(const Key key, bool& found) const { TTEntry* const tte = first_entry(key); - const uint16_t key16 = key >> 48; + const uint16_t key16 = key >> 48; // Use the high 16 bits as key inside the cluster for (unsigned i = 0; i < TTClusterSize; ++i) - if (tte[i].key16 == key16) + if (!tte[i].key16 || tte[i].key16 == key16) { - tte[i].genBound8 = generation | (uint8_t)tte[i].bound(); // Refresh - return &tte[i]; - } - - return NULL; -} - - -/// TranspositionTable::store() writes a new entry containing position key and -/// valuable information of current position. The lowest order bits of position -/// key are used to decide in which cluster the position will be placed. -/// When a new entry is written and there are no empty entries available in the -/// cluster, it replaces the least valuable of the entries. A TTEntry t1 is considered -/// to be more valuable than a TTEntry t2 if t1 is from the current search and t2 -/// is from a previous search, or if the depth of t1 is bigger than the depth of t2. - -void TranspositionTable::store(const Key key, Value v, Bound b, Depth d, Move m, Value statV) { - - TTEntry* const tte = first_entry(key); - const uint16_t key16 = key >> 48; // Use the high 16 bits as key inside the cluster + if (tte[i].key16) + tte[i].genBound8 = uint8_t(generation8 | tte[i].bound()); // Refresh - for (unsigned i = 0; i < TTClusterSize; ++i) - { - if (!tte[i].key16 || tte[i].key16 == key16) // Empty or overwrite old - { - // Save preserving any existing ttMove - tte[i].save(key16, v, b, d, m ? m : tte[i].move(), generation, statV); - return; + return found = (bool)tte[i].key16, &tte[i]; } - } - // Implement replace strategy + // Find an entry to be replaced according to the replacement strategy TTEntry* replace = tte; for (unsigned i = 1; i < TTClusterSize; ++i) - { - if ( (( tte[i].genBound8 & 0xFC) == generation || tte[i].bound() == BOUND_EXACT) - - ((replace->genBound8 & 0xFC) == generation) + if ( (( tte[i].genBound8 & 0xFC) == generation8 || tte[i].bound() == BOUND_EXACT) + - ((replace->genBound8 & 0xFC) == generation8) - (tte[i].depth8 < replace->depth8) < 0) replace = &tte[i]; - } - replace->save(key16, v, b, d, m, generation, statV); + return found = false, replace; }