along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <cmath>
#include <algorithm>
+#include <cmath>
#include "search.h"
#include "timeman.h"
/// Constants
const int MoveHorizon = 50; // Plan time management at most this many moves ahead
- const float MaxRatio = 3.0f; // When in trouble, we can step over reserved time with this ratio
+ const float MaxRatio = 7.0f; // When in trouble, we can step over reserved time with this ratio
const float StealRatio = 0.33f; // However we must not steal time from remaining moves over this ratio
}
-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);
}
// Initialize to maximum values but unstablePVExtraTime that is reset
unstablePVExtraTime = 0;
- optimumSearchTime = maximumSearchTime = limits.time[us];
+ optimumSearchTime = maximumSearchTime = limits.time[us]; // In msec
+
+ // Scale down emergencyBaseTime if we are under very high time pressure to
+ // avoid moving immediately and so blundering.
+ if (maximumSearchTime)
+ emergencyBaseTime /= std::max(emergencyBaseTime * 100 / maximumSearchTime, 1);
// We calculate optimum time usage for different hypothetic "moves to go"-values and choose the
// minimum of calculated search time values. Usually the greatest hypMTG gives the minimum values.