size_t PVSize, PVIdx;
TimeManager TimeMgr;
- int BestMoveChanges;
+ float BestMoveChanges;
Value DrawValue[COLOR_NB];
HistoryStats History;
GainsStats Gains;
void id_loop(Position& pos) {
Stack stack[MAX_PLY_PLUS_6], *ss = stack+2; // To allow referencing (ss-2)
- int depth, prevBestMoveChanges;
+ int depth;
Value bestValue, alpha, beta, delta;
std::memset(ss-2, 0, 5 * sizeof(Stack));
(ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains
- depth = BestMoveChanges = 0;
+ depth = 0;
+ BestMoveChanges = 0;
bestValue = delta = alpha = -VALUE_INFINITE;
beta = VALUE_INFINITE;
// Iterative deepening loop until requested to stop or target depth reached
while (++depth <= MAX_PLY && !Signals.stop && (!Limits.depth || depth <= Limits.depth))
{
+ // Age out PV variability metric
+ BestMoveChanges *= 0.8;
+
// Save last iteration's scores before first PV line is searched and all
// the move scores but the (new) PV are set to -VALUE_INFINITE.
for (size_t i = 0; i < RootMoves.size(); i++)
RootMoves[i].prevScore = RootMoves[i].score;
- prevBestMoveChanges = BestMoveChanges; // Only sensible when PVSize == 1
- BestMoveChanges = 0;
-
// MultiPV loop. We perform a full root search for each PV line
for (PVIdx = 0; PVIdx < PVSize; PVIdx++)
{
// Take in account some extra time if the best move has changed
if (depth > 4 && depth < 50 && PVSize == 1)
- TimeMgr.pv_instability(BestMoveChanges, prevBestMoveChanges);
+ TimeMgr.pv_instability(BestMoveChanges);
// Stop search if most of available time is already consumed. We
// probably don't have enough time to search the first move at the
}
-void TimeManager::pv_instability(int curChanges, int prevChanges) {
+void TimeManager::pv_instability(float bestMoveChanges) {
- unstablePVExtraTime = curChanges * (optimumSearchTime / 2)
- + prevChanges * (optimumSearchTime / 3);
+ unstablePVExtraTime = int(bestMoveChanges * optimumSearchTime);
}
class TimeManager {
public:
void init(const Search::LimitsType& limits, int currentPly, Color us);
- void pv_instability(int curChanges, int prevChanges);
+ void pv_instability(float bestMoveChanges);
int available_time() const { return optimumSearchTime + unstablePVExtraTime; }
int maximum_time() const { return maximumSearchTime; }
o["Emergency Base Time"] = Option(200, 0, 30000);
o["Emergency Move Time"] = Option(70, 0, 5000);
o["Minimum Thinking Time"] = Option(20, 0, 5000);
- o["Slow Mover"] = Option(100, 10, 1000);
+ o["Slow Mover"] = Option(50, 10, 1000);
o["UCI_Chess960"] = Option(false);
o["UCI_AnalyseMode"] = Option(false, on_eval);
}