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]); } }
// Transposition Table look up + alpha/beta update TTLookupValue AlphaBeta::TTlookup(const GameState & state, AlphaBetaScore & alpha, AlphaBetaScore & beta, const size_t & depth) { TTEntry * entry = _TT->lookupScan(state.calculateHash(0), state.calculateHash(1)); if (entry && (entry->getDepth() == depth)) { // get the value and type of the entry AlphaBetaScore TTvalue = entry->getScore(); // set alpha and beta depending on the type of entry in the TT if (entry->getType() == TTEntry::LOWER) { if (TTvalue > alpha) { alpha = TTvalue; } } else if (entry->getType() == TTEntry::UPPER) { if (TTvalue < beta) { beta = TTvalue; } } else { printf("LOL\n"); alpha = TTvalue; beta = TTvalue; } if (alpha >= beta) { // this will be a cut _results.ttcuts++; return TTLookupValue(true, true, entry); } else { // found but no cut _results.ttFoundNoCut++; return TTLookupValue(true, false, entry); } } else if (entry) { _results.ttFoundLessDepth++; return TTLookupValue(true, false, entry); } return TTLookupValue(false, false, entry); }