X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=8f074ca6923c6c21e68ceef098dd55dd5f63fa76;hp=4590bd4a1905c6f3e0baa5931f3284487565fe68;hb=27efc5ac996ffc679395317c8bbb16aca996296c;hpb=df722521ba7027df394ed6370571cb5dc2ed6da1 diff --git a/src/search.cpp b/src/search.cpp index 4590bd4a..8f074ca6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -129,7 +129,6 @@ namespace { }; size_t PVIdx; - TimeManagement Time; EasyMoveManager EasyMove; double BestMoveChanges; Value DrawValue[COLOR_NB]; @@ -218,11 +217,12 @@ template uint64_t Search::perft(Position& pos, Depth depth); void Search::think() { - Time.init(Limits, RootPos.side_to_move(), RootPos.game_ply(), now()); + Color us = RootPos.side_to_move(); + Time.init(Limits, us, RootPos.game_ply(), now()); int contempt = Options["Contempt"] * PawnValueEg / 100; // From centipawns - DrawValue[ RootPos.side_to_move()] = VALUE_DRAW - Value(contempt); - DrawValue[~RootPos.side_to_move()] = VALUE_DRAW + Value(contempt); + DrawValue[ us] = VALUE_DRAW - Value(contempt); + DrawValue[~us] = VALUE_DRAW + Value(contempt); TB::Hits = 0; TB::RootInTB = false; @@ -291,6 +291,11 @@ void Search::think() { Threads.timer->run = false; } + // When playing in 'nodes as time' mode, subtract the searched nodes from + // the available ones before to exit. + if (Limits.npmsec) + Time.availableNodes += Limits.inc[us] - RootPos.nodes_searched(); + // 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, // the UCI protocol states that we shouldn't print the best move before the @@ -594,7 +599,7 @@ namespace { ss->currentMove = ttMove; // Can be MOVE_NONE // If ttMove is quiet, update killers, history, counter move on TT hit - if (ttValue >= beta && ttMove && !pos.capture_or_promotion(ttMove) && !inCheck) + if (ttValue >= beta && ttMove && !pos.capture_or_promotion(ttMove)) update_stats(pos, ss, ttMove, depth, nullptr, 0); return ttValue; @@ -940,8 +945,6 @@ moves_loop: // When in check and at SpNode search starts from here } ss->currentMove = move; - if (!SpNode && !captureOrPromotion && quietCount < 64) - quietsSearched[quietCount++] = move; // Step 14. Make the move pos.do_move(move, st, givesCheck); @@ -1065,6 +1068,7 @@ moves_loop: // When in check and at SpNode search starts from here rm.score = -VALUE_INFINITE; } + bool newBestMove = false; if (value > bestValue) { bestValue = SpNode ? splitPoint->bestValue = value : value; @@ -1077,6 +1081,7 @@ moves_loop: // When in check and at SpNode search starts from here && (move != EasyMove.get(pos.key()) || moveCount > 1)) EasyMove.clear(); + newBestMove = true; bestMove = SpNode ? splitPoint->bestMove = move : move; if (PvNode && !RootNode) // Update pv even in fail-high case @@ -1096,6 +1101,9 @@ moves_loop: // When in check and at SpNode search starts from here } } + if (!SpNode && !captureOrPromotion && !newBestMove && quietCount < 64) + quietsSearched[quietCount++] = move; + // Step 19. Check for splitting the search if ( !SpNode && Threads.size() >= 2 @@ -1139,8 +1147,8 @@ moves_loop: // When in check and at SpNode search starts from here : inCheck ? mated_in(ss->ply) : DrawValue[pos.side_to_move()]; // Quiet best move: update killers, history and countermoves - else if (bestValue >= beta && !pos.capture_or_promotion(bestMove) && !inCheck) - update_stats(pos, ss, bestMove, depth, quietsSearched, quietCount - 1); + else if (bestMove != MOVE_NONE && !pos.capture_or_promotion(bestMove)) + update_stats(pos, ss, bestMove, depth, quietsSearched, quietCount); tte->save(posKey, value_to_tt(bestValue, ss->ply), bestValue >= beta ? BOUND_LOWER : @@ -1297,8 +1305,7 @@ moves_loop: // When in check and at SpNode search starts from here // Detect non-capture evasions that are candidates to be pruned evasionPrunable = InCheck && bestValue > VALUE_MATED_IN_MAX_PLY - && !pos.capture(move) - && !pos.can_castle(pos.side_to_move()); + && !pos.capture(move); // Don't search moves with negative SEE values if ( (!InCheck || evasionPrunable) @@ -1398,8 +1405,7 @@ moves_loop: // When in check and at SpNode search starts from here *pv = MOVE_NONE; } - // update_stats() updates killers, history and countermoves stats after a fail-high - // of a quiet move. + // update_stats() updates killers, history, countermove history and countermoves stats for a quiet best move. void update_stats(const Position& pos, Stack* ss, Move move, Depth depth, Move* quiets, int quietsCnt) {