The only call site of Time.maximum() corrected by 10.
Do this directly in remaining().
Ponder increased Time.optimum by 25% in init(). Idem.
Delete unused includes.
No functional change.
if (Threads.ponder)
return;
if (Threads.ponder)
return;
- if ( (Limits.use_time_management() && elapsed > Time.maximum() - 10)
+ if ( (Limits.use_time_management() && elapsed > Time.maximum())
|| (Limits.movetime && elapsed >= Limits.movetime)
|| (Limits.nodes && Threads.nodes_searched() >= (uint64_t)Limits.nodes))
Threads.stop = true;
|| (Limits.movetime && elapsed >= Limits.movetime)
|| (Limits.nodes && Threads.nodes_searched() >= (uint64_t)Limits.nodes))
Threads.stop = true;
-#include <cfloat>
-#include <cmath>
#include "search.h"
#include "timeman.h"
#include "search.h"
#include "timeman.h"
enum TimeType { OptimumTime, MaxTime };
enum TimeType { OptimumTime, MaxTime };
- int remaining(int myTime, int myInc, int moveOverhead,
- int movesToGo, int ply, TimeType type) {
+ int remaining(int myTime, int myInc, int moveOverhead, int movesToGo,
+ int ply, bool ponder, TimeType type) {
if (myTime <= 0)
return 0;
int moveNumber = (ply + 1) / 2;
if (myTime <= 0)
return 0;
int moveNumber = (ply + 1) / 2;
- double ratio; // Which ratio of myTime we are going to use. It is <= 1
+ double ratio; // Which ratio of myTime we are going to use. It's <= 1 if not ponder
double sd = 8.5;
// Usage of increment follows quadratic distribution with the maximum at move 25
double sd = 8.5;
// Usage of increment follows quadratic distribution with the maximum at move 25
ratio = std::min(1.0, ratio * (1 + inc / (myTime * sd)));
ratio = std::min(1.0, ratio * (1 + inc / (myTime * sd)));
- return int(ratio * std::max(0, myTime - moveOverhead));
+ assert(ratio <= 1);
+
+ if (ponder && type == OptimumTime)
+ ratio *= 1.25;
+
+ int time = int(ratio * (myTime - moveOverhead));
+
+ if (type == OptimumTime)
+ time -= 10; // Keep always at least 10 millisecs on the clock
+
+ return std::max(0, time);
void TimeManagement::init(Search::LimitsType& limits, Color us, int ply)
{
void TimeManagement::init(Search::LimitsType& limits, Color us, int ply)
{
- int moveOverhead = Options["Move Overhead"];
- int npmsec = Options["nodestime"];
+ int moveOverhead = Options["Move Overhead"];
+ int npmsec = Options["nodestime"];
+ bool ponder = Options["Ponder"];
// If we have to play in 'nodes as time' mode, then convert from time
// to nodes, and use resulting values in time management formulas.
// If we have to play in 'nodes as time' mode, then convert from time
// to nodes, and use resulting values in time management formulas.
}
startTime = limits.startTime;
}
startTime = limits.startTime;
- optimumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, limits.movestogo, ply, OptimumTime);
- maximumTime = remaining(limits.time[us], limits.inc[us], moveOverhead, limits.movestogo, ply, MaxTime);
-
- if (Options["Ponder"])
- optimumTime += optimumTime / 4;
+ optimumTime = remaining(limits.time[us], limits.inc[us], moveOverhead,
+ limits.movestogo, ply, ponder, OptimumTime);
+ maximumTime = remaining(limits.time[us], limits.inc[us], moveOverhead,
+ limits.movestogo, ply, ponder, MaxTime);