From 2e86d1febc163e076320a6a21060fc5a1c7c0dff Mon Sep 17 00:00:00 2001 From: lucasart Date: Wed, 6 May 2015 19:24:00 +0800 Subject: [PATCH] Restore deterministic search state Introduce helper function Search::reset() which clears all kind of search memory, in order to restore a deterministic search state. Generalize TT.clear() into Search::reset() for the following use cases: - bench: needed to guarantee deterministic bench (ie. if you call bench from interactive command line twice in a row you get the same value). - Clear Hash: restore clean search state, which is the purpose of this button. - ucinewgame: ditto. No functional change. Resolves #346 --- src/benchmark.cpp | 2 +- src/movepick.h | 2 ++ src/search.cpp | 12 ++++++++++++ src/search.h | 1 + src/uci.cpp | 3 +-- src/ucioption.cpp | 3 ++- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/benchmark.cpp b/src/benchmark.cpp index fbf7b0e3..07e1341e 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -104,7 +104,7 @@ void benchmark(const Position& current, istream& is) { Options["Hash"] = ttSize; Options["Threads"] = threads; - TT.clear(); + Search::reset(); if (limitType == "time") limits.movetime = stoi(limit); // movetime is in ms diff --git a/src/movepick.h b/src/movepick.h index 423a6a18..44fc51f6 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -21,6 +21,7 @@ #define MOVEPICK_H_INCLUDED #include // For std::max +#include // For std::memset #include "movegen.h" #include "position.h" @@ -43,6 +44,7 @@ struct Stats { const T* operator[](Piece pc) const { return table[pc]; } T* operator[](Piece pc) { return table[pc]; } + void clear() { std::memset(table, 0, sizeof(table)); } void update(Piece pc, Square to, Move m) { diff --git a/src/search.cpp b/src/search.cpp index 9c7190be..152e9fd6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -181,6 +181,18 @@ void Search::init() { } +/// Search::reset() clears all search memory, to restore a deterministic state + +void Search::reset () { + + TT.clear(); + History.clear(); + CounterMovesHistory.clear(); + Gains.clear(); + Countermoves.clear(); +} + + /// Search::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. template diff --git a/src/search.h b/src/search.h index 5e17b829..4e1d3c35 100644 --- a/src/search.h +++ b/src/search.h @@ -106,6 +106,7 @@ extern StateStackPtr SetupStates; void init(); void think(); +void reset(); template uint64_t perft(Position& pos, Depth depth); } // namespace Search diff --git a/src/uci.cpp b/src/uci.cpp index a9fe4f20..b8b371ac 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -27,7 +27,6 @@ #include "search.h" #include "thread.h" #include "timeman.h" -#include "tt.h" #include "uci.h" using namespace std; @@ -181,7 +180,7 @@ void UCI::loop(int argc, char* argv[]) { else if (token == "ucinewgame") { - TT.clear(); + Search::reset(); Time.availableNodes = 0; } else if (token == "isready") sync_cout << "readyok" << sync_endl; diff --git a/src/ucioption.cpp b/src/ucioption.cpp index 2906ae62..828d138f 100644 --- a/src/ucioption.cpp +++ b/src/ucioption.cpp @@ -22,6 +22,7 @@ #include #include "misc.h" +#include "search.h" #include "thread.h" #include "tt.h" #include "uci.h" @@ -34,7 +35,7 @@ UCI::OptionsMap Options; // Global object namespace UCI { /// 'On change' actions, triggered by an option's value change -void on_clear_hash(const Option&) { TT.clear(); } +void on_clear_hash(const Option&) { Search::reset(); } void on_hash_size(const Option& o) { TT.resize(o); } void on_logger(const Option& o) { start_logger(o); } void on_threads(const Option&) { Threads.read_uci_options(); } -- 2.39.2