X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=63481d367e260f1292978aee0fc96cd61ea4d926;hp=8d713fb86448f5b7fadcd1e472ba0b68fe70af44;hb=b777b17f6ff7fe9670d864cf31106fdefdca3001;hpb=1b0df1ae141be1461e3fbe809b5b27c3e360753f diff --git a/src/search.cpp b/src/search.cpp index 8d713fb8..63481d36 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -57,7 +57,7 @@ namespace { inline Value razor_margin(Depth d) { return Value(512 + 32 * d); } // Futility lookup tables (initialized at startup) and their access functions - int FutilityMoveCounts[2][32]; // [improving][depth] + int FutilityMoveCounts[2][16]; // [improving][depth] inline Value futility_margin(Depth d) { return Value(200 * d); @@ -88,7 +88,7 @@ namespace { Value value_to_tt(Value v, int ply); Value value_from_tt(Value v, int ply); void update_stats(const Position& pos, Stack* ss, Move move, Depth depth, Move* quiets, int quietsCnt); - string uci_pv(const Position& pos, int depth, Value alpha, Value beta); + string uci_pv(const Position& pos, Depth depth, Value alpha, Value beta); struct Skill { Skill(int l, size_t rootSize) : level(l), @@ -101,7 +101,7 @@ namespace { } size_t candidates_size() const { return candidates; } - bool time_to_pick(int depth) const { return depth == 1 + level; } + bool time_to_pick(Depth depth) const { return depth == 1 + level; } Move pick_move(); int level; @@ -135,7 +135,7 @@ void Search::init() { } // Init futility move count array - for (int d = 0; d < 32; ++d) + for (int d = 0; d < 16; ++d) { FutilityMoveCounts[0][d] = int(2.4 + 0.773 * pow(d + 0.00, 1.8)); FutilityMoveCounts[1][d] = int(2.9 + 1.045 * pow(d + 0.49, 1.8)); @@ -191,26 +191,19 @@ void Search::think() { sync_cout << "info depth 0 score " << UCI::format_value(RootPos.checkers() ? -VALUE_MATE : VALUE_DRAW) << sync_endl; - - goto finalize; } + else + { + for (size_t i = 0; i < Threads.size(); ++i) + Threads[i]->maxPly = 0; - // Reset the threads, still sleeping: will wake up at split time - for (size_t i = 0; i < Threads.size(); ++i) - Threads[i]->maxPly = 0; - - Threads.timer->run = true; - Threads.timer->notify_one(); // Wake up the recurring timer - - id_loop(RootPos); // Let's start searching ! - - Threads.timer->run = false; // Stop the timer + Threads.timer->run = true; + Threads.timer->notify_one(); // Wake up the recurring timer -finalize: + id_loop(RootPos); // Let's start searching ! - // When search is stopped this info is not printed - sync_cout << "info nodes " << RootPos.nodes_searched() - << " time " << Time::now() - SearchTime + 1 << sync_endl; + Threads.timer->run = false; + } // When we reach the maximum depth, we can arrive here without a raise of // Signals.stop. However, if we are pondering or in an infinite search, @@ -223,7 +216,6 @@ finalize: RootPos.this_thread()->wait_for(Signals.stop); } - // Best move could be MOVE_NONE when searching on a stalemate position sync_cout << "bestmove " << UCI::format_move(RootMoves[0].pv[0], RootPos.is_chess960()) << " ponder " << UCI::format_move(RootMoves[0].pv[1], RootPos.is_chess960()) << sync_endl; @@ -239,12 +231,12 @@ namespace { void id_loop(Position& pos) { Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2) - int depth; + Depth depth; Value bestValue, alpha, beta, delta; std::memset(ss-2, 0, 5 * sizeof(Stack)); - depth = 0; + depth = DEPTH_ZERO; BestMoveChanges = 0; bestValue = delta = alpha = -VALUE_INFINITE; beta = VALUE_INFINITE; @@ -277,7 +269,7 @@ namespace { for (PVIdx = 0; PVIdx < std::min(multiPV, RootMoves.size()) && !Signals.stop; ++PVIdx) { // Reset aspiration window starting size - if (depth >= 5) + if (depth >= 5 * ONE_PLY) { delta = Value(16); alpha = std::max(RootMoves[PVIdx].prevScore - delta,-VALUE_INFINITE); @@ -289,7 +281,7 @@ namespace { // high/low anymore. while (true) { - bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); + bestValue = search(pos, ss, alpha, beta, depth, false); // Bring the best move to the front. It is critical that sorting // is done with a stable algorithm because all the values but the @@ -342,9 +334,12 @@ namespace { // Sort the PV lines searched so far and update the GUI std::stable_sort(RootMoves.begin(), RootMoves.begin() + PVIdx + 1); - if ( !Signals.stop - && ( PVIdx + 1 == std::min(multiPV, RootMoves.size()) - || Time::now() - SearchTime > 3000)) + if (Signals.stop) + sync_cout << "info nodes " << RootPos.nodes_searched() + << " time " << Time::now() - SearchTime << sync_endl; + + else if ( PVIdx + 1 == std::min(multiPV, RootMoves.size()) + || Time::now() - SearchTime > 3000) sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl; } @@ -362,7 +357,7 @@ namespace { if (Limits.use_time_management() && !Signals.stop && !Signals.stopOnPonderhit) { // Take some extra time if the best move has changed - if (depth > 4 && multiPV == 1) + if (depth > 4 * ONE_PLY && multiPV == 1) TimeMgr.pv_instability(BestMoveChanges); // Stop the search if only one legal move is available or all @@ -1303,7 +1298,7 @@ moves_loop: // When in check and at SpNode search starts from here // requires that all (if any) unsearched PV lines are sent using a previous // search score. - string uci_pv(const Position& pos, int depth, Value alpha, Value beta) { + string uci_pv(const Position& pos, Depth depth, Value alpha, Value beta) { std::stringstream ss; Time::point elapsed = Time::now() - SearchTime + 1; @@ -1321,13 +1316,13 @@ moves_loop: // When in check and at SpNode search starts from here if (depth == 1 && !updated) continue; - int d = updated ? depth : depth - 1; + Depth d = updated ? depth : depth - ONE_PLY; Value v = updated ? RootMoves[i].score : RootMoves[i].prevScore; if (ss.rdbuf()->in_avail()) // Not at first line ss << "\n"; - ss << "info depth " << d + ss << "info depth " << d / ONE_PLY << " seldepth " << selDepth << " multipv " << i + 1 << " score " << (i == PVIdx ? UCI::format_value(v, alpha, beta) : UCI::format_value(v))