From: Marco Costalba Date: Fri, 18 Aug 2017 15:44:37 +0000 (-0700) Subject: Reformat time manager code X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=e10255339fc7cb54bb0466945f759646f442f4f0 Reformat time manager code In particular clarify that 'sd' parameter is used only in !movesToGo case. Verified with Ivan's check tool it is equivalent to original code. No functional change. --- diff --git a/src/timeman.cpp b/src/timeman.cpp index b5d1a66c..ea1e92d2 100644 --- a/src/timeman.cpp +++ b/src/timeman.cpp @@ -31,17 +31,15 @@ namespace { enum TimeType { OptimumTime, MaxTime }; int remaining(int myTime, int myInc, int moveOverhead, int movesToGo, - int ply, bool ponder, TimeType type) { + int moveNum, bool ponder, TimeType type) { if (myTime <= 0) return 0; - int moveNumber = (ply + 1) / 2; - double ratio; // Which ratio of myTime we are going to use. It's <= 1 if not ponder - double sd = 8.5; + double ratio; // Which ratio of myTime we are going to use // Usage of increment follows quadratic distribution with the maximum at move 25 - double inc = myInc * std::max(55.0, 120.0 - 0.12 * (moveNumber - 25) * (moveNumber - 25)); + double inc = myInc * std::max(55.0, 120 - 0.12 * (moveNum - 25) * (moveNum - 25)); // In moves-to-go we distribute time according to a quadratic function with // the maximum around move 20 for 40 moves in y time case. @@ -49,28 +47,26 @@ namespace { { ratio = (type == OptimumTime ? 1.0 : 6.0) / std::min(50, movesToGo); - if (moveNumber <= 40) - ratio *= 1.1 - 0.001 * (moveNumber - 20) * (moveNumber - 20); + if (moveNum <= 40) + ratio *= 1.1 - 0.001 * (moveNum - 20) * (moveNum - 20); else ratio *= 1.5; + + ratio *= 1 + inc / (myTime * 8.5); } // Otherwise we increase usage of remaining time as the game goes on else { - sd = 1 + 20 * moveNumber / (500.0 + moveNumber); - ratio = (type == OptimumTime ? 0.017 : 0.07) * sd; + double k = 1 + 20 * moveNum / (500.0 + moveNum); + ratio = (type == OptimumTime ? 0.017 : 0.07) * (k + inc / myTime); } - ratio = std::min(1.0, ratio * (1 + inc / (myTime * sd))); - - assert(ratio <= 1); + int time = int(std::min(1.0, ratio) * std::max(0, myTime - moveOverhead)); - if (ponder && type == OptimumTime) - ratio *= 1.25; + if (type == OptimumTime && ponder) + time *= 1.25; - int time = int(ratio * (myTime - moveOverhead)); - - if (type == OptimumTime) + if (type == MaxTime) time -= 10; // Keep always at least 10 millisecs on the clock return std::max(0, time); @@ -109,9 +105,11 @@ void TimeManagement::init(Search::LimitsType& limits, Color us, int ply) limits.npmsec = npmsec; } + int moveNum = (ply + 1) / 2; + startTime = limits.startTime; optimumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, - limits.movestogo, ply, ponder, OptimumTime); + limits.movestogo, moveNum, ponder, OptimumTime); maximumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, - limits.movestogo, ply, ponder, MaxTime); + limits.movestogo, moveNum, ponder, MaxTime); }