From e6482b7d97a6620cebdd569cce575d42ed80c871 Mon Sep 17 00:00:00 2001 From: Uri Blass Date: Sat, 24 Aug 2013 19:29:44 +0300 Subject: [PATCH 1/1] Time management: move faster if PV is stable Move faster but compensate by allocating more time when the best move changes. Passed short TC at 15+0.05 LLR: 2.93 (-2.94,2.94) Total: 13895 W: 3030 L: 2882 D: 798 Long TC at 60+0.05 LLR: 2.96 (-2.94,2.94) Total: 9266 W: 1777 L: 1624 D: 5865 At time increment 30+0.5 LLR: 2.96 (-2.94,2.94) Total: 6703 W: 1238 L: 1134 D: 4331 And at fixed game number, longer TC 120+0.05 ELO: 5.17 +-2.8 (95%) LOS: 100.0% Total: 19306 W: 3378 L: 3091 D: 12837 bench: 4728533 --- src/search.cpp | 15 ++++++++------- src/timeman.cpp | 5 ++--- src/timeman.h | 2 +- src/ucioption.cpp | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 4717a4d5..dcd8b0d1 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -84,7 +84,7 @@ namespace { size_t PVSize, PVIdx; TimeManager TimeMgr; - int BestMoveChanges; + float BestMoveChanges; Value DrawValue[COLOR_NB]; HistoryStats History; GainsStats Gains; @@ -304,13 +304,14 @@ namespace { 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; @@ -332,14 +333,14 @@ namespace { // 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++) { @@ -437,7 +438,7 @@ namespace { // 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 diff --git a/src/timeman.cpp b/src/timeman.cpp index 8d2bacca..bdcaee84 100644 --- a/src/timeman.cpp +++ b/src/timeman.cpp @@ -76,10 +76,9 @@ namespace { } -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); } diff --git a/src/timeman.h b/src/timeman.h index e12b0007..4896fe6e 100644 --- a/src/timeman.h +++ b/src/timeman.h @@ -26,7 +26,7 @@ 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; } diff --git a/src/ucioption.cpp b/src/ucioption.cpp index 384d9317..90961809 100644 --- a/src/ucioption.cpp +++ b/src/ucioption.cpp @@ -83,7 +83,7 @@ void init(OptionsMap& o) { 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); } -- 2.39.2