/* This file is part of ctak. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ctak. If not, see . */ #ifndef TT_H #define TT_H #include #include // =================================================================== // Types // =================================================================== enum TT_FLAG { TT_EXACT, TT_LOWERBOUND, TT_UPPERBOUND }; #ifdef RECORD_PV #include #endif typedef struct tt_node_s { uint16_t gen; uint64_t key; enum TT_FLAG flag; uint8_t depth; float value; action_t action; #ifdef RECORD_PV // use for generating training data only pv_leaf_t leaf; #endif } tt_entry_t; // =================================================================== // Variables // =================================================================== // Direct-mapped hash table (no chaining); one slot per key. #define TT_SIZE ((uint32_t)((1 << 19) - 1)) // =================================================================== // Methods // =================================================================== // Bump the generation counter, invalidating all entries. Called from // negamax_init when the board size (and hence the zobrist table) changes; // entries are otherwise kept across plies on purpose (see negamax.c). int tt_init(void); tt_entry_t *tt_seek(const uint64_t key); // Store a search result for `key', returning the entry it was written to, or // NULL when the replacement policy keeps the current occupant instead. // // Replacement policy per slot: // // - generation and key match: always update // // - otherwise (empty slot, stale generation, or a different key): replace the // occupant unless it is a deeper search of a different position, which is // kept. tt_entry_t *tt_store(const uint64_t key, const enum TT_FLAG flag, const uint8_t depth, const float value, const action_t action); #endif