io-chess
UCI chess engine
Loading...
Searching...
No Matches
TimeManager.h
Go to the documentation of this file.
1#pragma once
2
15
16#include "chess.hpp" // For chess::Color
17#include <algorithm>
18#include <chrono>
19#include <cmath>
20#include <cstdint>
21
22struct SearchParams;
23
29public:
41
47 int64_t softLimit;
48 int64_t hardLimit;
49 int64_t optimalTime;
50 int64_t panicTime;
52 };
53
58 struct Config {
59 // Phase multipliers (0.0 = opening, 1.0 = endgame)
60 float openingMultiplier = 0.75f;
61 float middlegameMultiplier = 1.25f;
62 float endgameMultiplier = 0.70f;
63
64 // Time control multipliers
65 float bulletMultiplier = 0.55f;
66 float blitzMultiplier = 0.75f;
67 float rapidMultiplier = 1.0f;
68 float classicalMultiplier = 1.15f;
69
70 // Eval-based multipliers
71 float criticalMultiplier = 1.4f;
72 float edgeMultiplier = 1.0f;
73 float winningMultiplier = 0.65f;
74 float losingMultiplier = 0.85f;
75
76 // Instability extension
79
80 // Increment handling
81 float incrementUsage = 0.7f;
82 float incrementReserve = 0.3f;
84
85 // Safety margins
86 int moveOverheadMs = 50;
87 int minTimeMs = 10;
88 int panicThresholdMs = 3000;
89 int ultraPanicMs = 1000;
90 };
91
92 TimeManager() = default;
93 explicit TimeManager(const Config &cfg) : config_(cfg) {}
94
105 TimeAllocation calculate(const SearchParams &params, chess::Color side,
106 float phase, float evalCp, int moveNumber) const;
107
118 bool shouldStop(int64_t elapsed, int depth, int bestMoveChanges,
119 int scoreDrops, const TimeAllocation &allocation) const;
120
130 float getExtensionFactor(int bestMoveChanges, int scoreDrops) const;
131
132 const Config &config() const { return config_; }
133 void setConfig(const Config &cfg) { config_ = cfg; }
134
135private:
137
138 TimeControl detectTimeControl(int baseTimeMs, int incrementMs) const;
139 float getPhaseMultiplier(float phase) const;
140 float getEvalMultiplier(float evalCp) const;
141 float getControlMultiplier(TimeControl control) const;
142 int estimateMovesRemaining(int moveNumber, float phase, int movestogo) const;
143};
TimeControl detectTimeControl(int baseTimeMs, int incrementMs) const
Definition TimeManager.cpp:12
TimeManager(const Config &cfg)
Definition TimeManager.h:93
float getEvalMultiplier(float evalCp) const
Definition TimeManager.cpp:67
TimeAllocation calculate(const SearchParams &params, chess::Color side, float phase, float evalCp, int moveNumber) const
Calculates time allocation for a position.
Definition TimeManager.cpp:150
bool shouldStop(int64_t elapsed, int depth, int bestMoveChanges, int scoreDrops, const TimeAllocation &allocation) const
Checks if search should stop based on elapsed time and stability.
Definition TimeManager.cpp:389
TimeControl
Categorization of time controls based on base time.
Definition TimeManager.h:34
@ CLASSICAL
Definition TimeManager.h:38
@ BLITZ
2-5 minutes base
Definition TimeManager.h:36
@ BULLET
< 2 minutes base
Definition TimeManager.h:35
@ RAPID
5-15 minutes base
Definition TimeManager.h:37
@ CORRESPONDENCE
Definition TimeManager.h:39
TimeManager()=default
void setConfig(const Config &cfg)
Definition TimeManager.h:133
int estimateMovesRemaining(int moveNumber, float phase, int movestogo) const
Definition TimeManager.cpp:116
float getPhaseMultiplier(float phase) const
Definition TimeManager.cpp:43
const Config & config() const
Definition TimeManager.h:132
float getExtensionFactor(int bestMoveChanges, int scoreDrops) const
Gets the extension factor based on search instability.
Definition TimeManager.cpp:364
float getControlMultiplier(TimeControl control) const
Definition TimeManager.cpp:100
Config config_
Definition TimeManager.h:136
Parameters defining the constraints for a search operation.
Definition ISearch.h:125
Tunable configuration for time management heuristics.
Definition TimeManager.h:58
float incrementUsage
Use 70% of increment per move.
Definition TimeManager.h:81
int instabilityThreshold
Changes before extending.
Definition TimeManager.h:78
int ultraPanicMs
Emergency mode.
Definition TimeManager.h:89
float bulletMultiplier
Very aggressive time saving.
Definition TimeManager.h:65
float classicalMultiplier
Can think deeper.
Definition TimeManager.h:68
float winningMultiplier
Clear advantage (>200cp).
Definition TimeManager.h:73
float maxInstabilityExtension
Max extension factor.
Definition TimeManager.h:77
float criticalMultiplier
Unclear position (±50cp).
Definition TimeManager.h:71
int minTimeMs
Absolute minimum thinking time.
Definition TimeManager.h:87
int minMovesForIncrement
Don't rely on inc for first moves.
Definition TimeManager.h:83
int panicThresholdMs
Enter panic below this.
Definition TimeManager.h:88
float openingMultiplier
Quick in opening (book/theory).
Definition TimeManager.h:60
float incrementReserve
Keep 30% as buffer.
Definition TimeManager.h:82
int moveOverheadMs
Network latency buffer.
Definition TimeManager.h:86
float edgeMultiplier
Slight edge (50-150cp).
Definition TimeManager.h:72
float blitzMultiplier
Balanced.
Definition TimeManager.h:66
float middlegameMultiplier
Think hard in complex positions.
Definition TimeManager.h:61
float endgameMultiplier
Simpler, fewer variations.
Definition TimeManager.h:62
float rapidMultiplier
Normal.
Definition TimeManager.h:67
float losingMultiplier
Swindle mode (<-150cp).
Definition TimeManager.h:74
Recommended time limits for the current move.
Definition TimeManager.h:46
int64_t hardLimit
Absolute maximum (ms).
Definition TimeManager.h:48
TimeControl control
Detected time control type.
Definition TimeManager.h:51
int64_t panicTime
Below this, enter panic mode.
Definition TimeManager.h:50
int64_t optimalTime
Ideal time to use (ms).
Definition TimeManager.h:49
int64_t softLimit
Normal stopping point (ms).
Definition TimeManager.h:47