From a29dd88f7563c5af871d9adc137218c39586b09c Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 14 Jan 2012 11:45:54 +0100 Subject: [PATCH] Use a set to store SearchMoves We just need to verify if a legal move is among the SearchMoves, so we don't need a vector for this. No functional change. Signed-off-by: Marco Costalba --- src/benchmark.cpp | 3 ++- src/search.cpp | 41 +++++++++++++++++++---------------------- src/search.h | 4 ++-- src/thread.cpp | 2 +- src/thread.h | 3 ++- src/uci.cpp | 4 ++-- 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/benchmark.cpp b/src/benchmark.cpp index b43f0ee5..1491e222 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include "misc.h" @@ -121,7 +122,7 @@ void benchmark(int argc, char* argv[]) { } else { - Threads.start_thinking(pos, limits, vector(), false); + Threads.start_thinking(pos, limits, set(), false); nodes += RootPosition.nodes_searched(); } } diff --git a/src/search.cpp b/src/search.cpp index 86a8defd..0839bd0f 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -42,7 +42,7 @@ namespace Search { volatile SignalsType Signals; LimitsType Limits; - std::vector SearchMoves; + std::set SearchMoves; Position RootPosition; } @@ -282,6 +282,7 @@ void Search::think() { static Book book; // Defined static to initialize the PRNG only once + Move bm; Position& pos = RootPosition; Chess960 = pos.is_chess960(); elapsed_time(true); @@ -293,18 +294,24 @@ void Search::think() { // Populate RootMoves with all the legal moves (default) or, if a SearchMoves // is given, with the subset of legal moves to search. for (MoveList ml(pos); !ml.end(); ++ml) - if (SearchMoves.empty() || count(SearchMoves.begin(), SearchMoves.end(), ml.move())) + if (SearchMoves.empty() || SearchMoves.count(ml.move())) RootMoves.push_back(RootMove(ml.move())); - if (Options["OwnBook"]) + if (RootMoves.empty()) { - Move bookMove = book.probe(pos, Options["Book File"], Options["Best Book Move"]); + cout << "info depth 0 score " + << score_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW) << endl; - if (bookMove && count(RootMoves.begin(), RootMoves.end(), bookMove)) - { - std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), bookMove)); - goto finalize; - } + RootMoves.push_back(MOVE_NONE); + goto finalize; + } + + if ( Options["OwnBook"] + && (bm = book.probe(pos, Options["Book File"], Options["Best Book Move"])) != MOVE_NONE + && count(RootMoves.begin(), RootMoves.end(), bm)) + { + std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), bm)); + goto finalize; } // Read UCI options: GUI could change UCI parameters during the game @@ -375,9 +382,9 @@ void Search::think() { finalize: - // When we reach max depth we arrive here even without a StopRequest, but if - // we are pondering or in infinite search, we shouldn't print the best move - // before we are told to do so. + // When we reach max depth we arrive here even without Signals.stop is raised, + // but if we are pondering or in infinite search, we shouldn't print the best + // move before we are told to do so. if (!Signals.stop && (Limits.ponder || Limits.infinite)) Threads.wait_for_stop_or_ponderhit(); @@ -406,16 +413,6 @@ namespace { bestValue = delta = -VALUE_INFINITE; ss->currentMove = MOVE_NULL; // Hack to skip update gains - // Handle the special case of a mated/stalemate position - if (RootMoves.empty()) - { - cout << "info depth 0 score " - << score_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW) << endl; - - RootMoves.push_back(MOVE_NONE); - return; - } - // Iterative deepening loop until requested to stop or target depth reached while (!Signals.stop && ++depth <= MAX_PLY && (!Limits.maxDepth || depth <= Limits.maxDepth)) { diff --git a/src/search.h b/src/search.h index 8290b41a..d805d462 100644 --- a/src/search.h +++ b/src/search.h @@ -21,7 +21,7 @@ #define SEARCH_H_INCLUDED #include -#include +#include #include "types.h" @@ -70,7 +70,7 @@ struct SignalsType { extern volatile SignalsType Signals; extern LimitsType Limits; -extern std::vector SearchMoves; +extern std::set SearchMoves; extern Position RootPosition; extern void init(); diff --git a/src/thread.cpp b/src/thread.cpp index 99976b12..74ca48cc 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -431,7 +431,7 @@ void Thread::main_loop() { // the search to finish. void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limits, - const std::vector& searchMoves, bool asyncMode) { + const std::set& searchMoves, bool asyncMode) { Thread& main = threads[0]; lock_grab(&main.sleepLock); diff --git a/src/thread.h b/src/thread.h index 48da805b..6bccde4c 100644 --- a/src/thread.h +++ b/src/thread.h @@ -21,6 +21,7 @@ #define THREAD_H_INCLUDED #include +#include #include "lock.h" #include "material.h" @@ -120,7 +121,7 @@ public: void wait_for_stop_or_ponderhit(); void stop_thinking(); void start_thinking(const Position& pos, const Search::LimitsType& limits, - const std::vector& searchMoves, bool asyncMode); + const std::set& searchMoves, bool asyncMode); template Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue, diff --git a/src/uci.cpp b/src/uci.cpp index 6bc387c1..ceb04dc3 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -201,7 +201,7 @@ namespace { string token; Search::LimitsType limits; - std::vector searchMoves; + std::set searchMoves; int time[] = { 0, 0 }, inc[] = { 0, 0 }; while (is >> token) @@ -228,7 +228,7 @@ namespace { is >> limits.maxTime; else if (token == "searchmoves") while (is >> token) - searchMoves.push_back(move_from_uci(pos, token)); + searchMoves.insert(move_from_uci(pos, token)); } limits.time = time[pos.side_to_move()]; -- 2.39.2