void TranspositionTable::clear() { hashMask = table.size() - 1; tbGen.reset(); notUsedCnt = 0; TTEntry ent; ent.clear(); for (size_t i = 0; i < table.size(); i++) ent.store(table[i]); }
void TranspositionTable::insert(U64 key, const Move& sm, int type, int ply, int depth, int evalScore) { if (depth < 0) depth = 0; size_t idx0 = getIndex(key); U64 key2 = getStoredKey(key); TTEntry ent0, ent1; ent0.load(table[idx0]); size_t idx = idx0; TTEntry* ent = &ent0; if (ent0.getKey() != key2) { size_t idx1 = idx0 ^ 1; ent1.load(table[idx1]); idx = idx1; ent = &ent1; if (ent1.getKey() != key2) if (ent1.betterThan(ent0, generation)) { idx = idx0; ent = &ent0; } } bool doStore = true; if ((ent->getKey() == key2) && (ent->getDepth() > depth) && (ent->getType() == type)) { if (type == TType::T_EXACT) doStore = false; else if ((type == TType::T_GE) && (sm.score() <= ent->getScore(ply))) doStore = false; else if ((type == TType::T_LE) && (sm.score() >= ent->getScore(ply))) doStore = false; } if (doStore) { if ((ent->getKey() != key2) || (sm.from() != sm.to())) ent->setMove(sm); ent->setKey(key2); ent->setScore(sm.score(), ply); ent->setDepth(depth); ent->setGeneration((S8)generation); ent->setType(type); ent->setEvalScore(evalScore); ent->store(table[idx]); } }