/// Namespace variables
- // Book
- Book OpeningBook;
-
// Root move list
RootMoveList Rml;
// Skill level adjustment
int SkillLevel;
bool SkillLevelEnabled;
- RKISS RK;
// Node counters, used only by thread[0] but try to keep in different cache
// lines (64 bytes each) from the heavy multi-thread read accessed variables.
}
-/// perft() is our utility to verify move generation. All the legal moves up to
-/// given depth are generated and counted and the sum returned.
+/// perft() is our utility to verify move generation. All the leaf nodes up to
+/// the given depth are generated and counted and the sum returned.
int64_t perft(Position& pos, Depth depth) {
bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
+ static Book book;
+
// Initialize global search-related variables
StopOnPonderhit = StopRequest = QuitRequest = AspirationFailLow = SendSearchedNodes = false;
NodesSincePoll = 0;
// Look for a book move
if (Options["OwnBook"].value<bool>())
{
- if (Options["Book File"].value<std::string>() != OpeningBook.name())
- OpeningBook.open(Options["Book File"].value<std::string>());
+ if (Options["Book File"].value<std::string>() != book.name())
+ book.open(Options["Book File"].value<std::string>());
- Move bookMove = OpeningBook.get_move(pos, Options["Best Book Move"].value<bool>());
+ Move bookMove = book.get_move(pos, Options["Best Book Move"].value<bool>());
if (bookMove != MOVE_NONE)
{
if (Limits.ponder)
excludedMove = ss->excludedMove;
posKey = excludedMove ? pos.get_exclusion_key() : pos.get_key();
- tte = TT.retrieve(posKey);
+ tte = TT.probe(posKey);
ttMove = tte ? tte->move() : MOVE_NONE;
// At PV nodes we check for exact scores, while at non-PV nodes we check for
ss->skipNullMove = false;
ttMove = ss->bestMove;
- tte = TT.retrieve(posKey);
+ tte = TT.probe(posKey);
}
split_point_start: // At split points actual search starts from here
// Transposition table lookup. At PV nodes, we don't use the TT for
// pruning, but only for move ordering.
- tte = TT.retrieve(pos.get_key());
+ tte = TT.probe(pos.get_key());
ttMove = (tte ? tte->move() : MOVE_NONE);
if (!PvNode && tte && ok_to_use_TT(tte, ttDepth, beta, ss->ply))
assert(MultiPV > 1);
+ static RKISS rk;
+
// Rml list is already sorted by pv_score in descending order
int s;
int max_s = -VALUE_INFINITE;
// PRNG sequence should be non deterministic
for (int i = abs(get_system_time() % 50); i > 0; i--)
- RK.rand<unsigned>();
+ rk.rand<unsigned>();
// Choose best move. For each move's score we add two terms both dependent
// on wk, one deterministic and bigger for weaker moves, and one random,
break;
// This is our magical formula
- s += ((max - s) * wk + var * (RK.rand<unsigned>() % wk)) / 128;
+ s += ((max - s) * wk + var * (rk.rand<unsigned>() % wk)) / 128;
if (s > max_s)
{
pos.do_move(pv[0], *st++);
- while ( (tte = TT.retrieve(pos.get_key())) != NULL
+ while ( (tte = TT.probe(pos.get_key())) != NULL
&& tte->move() != MOVE_NONE
&& pos.move_is_legal(tte->move())
&& ply < PLY_MAX
do {
k = pos.get_key();
- tte = TT.retrieve(k);
+ tte = TT.probe(k);
// Don't overwrite existing correct entries
if (!tte || tte->move() != pv[ply])