X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=fa7052d0dc0c2605201a17bd283742541e1c3c59;hp=ad0660d1582dbfce6ef27fc654897fcaf0eb4929;hb=c295599e4ad481f677b14cb0be14174b61ebff81;hpb=977f6349a9bbe52079f826328457cfafb8536014 diff --git a/src/search.cpp b/src/search.cpp index ad0660d1..fa7052d0 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -251,10 +251,10 @@ namespace { int MultiPV; // Time managment variables - int SearchStartTime, MaxNodes, MaxDepth, OptimumSearchTime; - int MaximumSearchTime, ExtraSearchTime, ExactMaxTime; + int SearchStartTime, MaxNodes, MaxDepth, ExactMaxTime; bool UseTimeManagement, InfiniteSearch, PonderSearch, StopOnPonderhit; bool FirstRootMove, AbortSearch, Quit, AspirationFailLow; + TimeManager TimeMgr; // Log file bool UseLogFile; @@ -401,7 +401,6 @@ bool think(const Position& pos, bool infinite, bool ponder, int time[], int incr // Initialize global search variables StopOnPonderhit = AbortSearch = Quit = AspirationFailLow = false; - OptimumSearchTime = MaximumSearchTime = ExtraSearchTime = 0; NodesSincePoll = 0; TM.resetNodeCounters(); SearchStartTime = get_system_time(); @@ -473,16 +472,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int time[], int incr int myTime = time[pos.side_to_move()]; int myIncrement = increment[pos.side_to_move()]; if (UseTimeManagement) - { - get_search_times(myTime, myIncrement, movesToGo, pos.startpos_ply_counter(), - &OptimumSearchTime, &MaximumSearchTime); - - if (get_option_value_bool("Ponder")) - { - OptimumSearchTime += OptimumSearchTime / 4; - OptimumSearchTime = Min(OptimumSearchTime, MaximumSearchTime); - } - } + TimeMgr.update(myTime, myIncrement, movesToGo, pos.startpos_ply_counter()); // Set best NodesBetweenPolls interval to avoid lagging under // heavy time pressure. @@ -626,20 +616,20 @@ namespace { if ( Iteration >= 8 && EasyMove == pv[0] && ( ( rml.get_move_cumulative_nodes(0) > (nodes * 85) / 100 - && current_search_time() > OptimumSearchTime / 16) + && current_search_time() > TimeMgr.optimumSearchTime / 16) ||( rml.get_move_cumulative_nodes(0) > (nodes * 98) / 100 - && current_search_time() > OptimumSearchTime / 32))) + && current_search_time() > TimeMgr.optimumSearchTime / 32))) stopSearch = true; // Add some extra time if the best move has changed during the last two iterations if (Iteration > 5 && Iteration <= 50) - ExtraSearchTime = BestMoveChangesByIteration[Iteration] * (OptimumSearchTime / 2) - + BestMoveChangesByIteration[Iteration-1] * (OptimumSearchTime / 3); + TimeMgr.best_move_changes(BestMoveChangesByIteration[Iteration], + BestMoveChangesByIteration[Iteration-1]); // Stop search if most of MaxSearchTime is consumed at the end of the // iteration. We probably don't have enough time to search the first // move at the next iteration anyway. - if (current_search_time() > ((OptimumSearchTime + ExtraSearchTime) * 80) / 128) + if (current_search_time() > (TimeMgr.available_time() * 80) / 128) stopSearch = true; if (stopSearch) @@ -2145,9 +2135,9 @@ namespace { bool stillAtFirstMove = FirstRootMove && !AspirationFailLow - && t > OptimumSearchTime + ExtraSearchTime; + && t > TimeMgr.available_time(); - bool noMoreTime = t > MaximumSearchTime + bool noMoreTime = t > TimeMgr.maximumSearchTime || stillAtFirstMove; if ( (Iteration >= 3 && UseTimeManagement && noMoreTime) @@ -2168,9 +2158,9 @@ namespace { bool stillAtFirstMove = FirstRootMove && !AspirationFailLow - && t > OptimumSearchTime + ExtraSearchTime; + && t > TimeMgr.available_time(); - bool noMoreTime = t > MaximumSearchTime + bool noMoreTime = t > TimeMgr.maximumSearchTime || stillAtFirstMove; if (Iteration >= 3 && UseTimeManagement && (noMoreTime || StopOnPonderhit))