time_stop_conditions(): Minor reorder
[pachi.git] / timeinfo.h
blob4a47d95664a0ac829fa8f072321a4240c7100ec0
1 #ifndef ZZGO_TIMEINFO_H
2 #define ZZGO_TIMEINFO_H
4 /* Time-keeping information about time to spend on the next move and/or
5 * rest of the game. This is only a hint, an engine may decide to spend
6 * more or less time on a given move, provided it never forfeits on time. */
8 /* Note that some ways of specifying time (TD_GAMES) may not make sense
9 * with all engines. */
11 #include <stdbool.h>
13 #include "board.h"
15 struct time_info {
16 /* For how long we can spend the time? */
17 enum time_period {
18 TT_NULL, // No time limit. Other structure elements are undef.
19 TT_MOVE, // Time for the next move.
20 TT_TOTAL, // Time for the rest of the game. Never seen by engine.
21 } period;
22 /* How are we counting the time? */
23 enum time_dimension {
24 TD_GAMES, // Fixed number of simulations to perform.
25 TD_WALLTIME, // Wall time to spend performing simulations.
26 } dim;
27 /* The actual time count. */
28 union {
29 int games; // TD_GAMES
30 struct { // TD_WALLTIME
31 /* Main thinking time. 0 if we are already completely
32 * in byoyomi (but use time_in_byoyomi() to cover also
33 * right-before-byoyomi cases). */
34 double main_time;
36 /* Byoyomi time. This time must be remembered to avoid
37 * rushing at the end of the main period. If no byoyomi,
38 * set to 0. Otherwise, both periods and stones are
39 * larger than zero, and initially we have _periods
40 * periods of length _time and have to play _stones
41 * stones in each. If we play in canadian byoyomi,
42 * _time will shrink until we play all stones of the
43 * current period. */
44 /* (In normal time settings, one of _periods or _stones
45 * is 1.) */
46 double byoyomi_time;
47 int byoyomi_periods;
48 int byoyomi_stones;
49 bool canadian; // time_left field meaning changes
51 /* Absolute time at which our timer started for current move,
52 * 0 if not yet known. The engine always sees > 0. */
53 double timer_start;
54 } t;
55 } len;
56 /* If true, this time info is independent from GTP time_left updates,
57 * which will be ignored. This is the case if the time settings were
58 * forced on the command line. */
59 bool ignore_gtp;
62 /* Parse time information provided in custom format:
63 * =NUM - fixed number of simulations per move
64 * NUM - number of seconds to spend per move (can be float)
65 * _NUM - number of seconds to spend per game
67 * Returns false on parse error. */
68 bool time_parse(struct time_info *ti, char *s);
70 /* Update time settings according to gtp time_settings command. */
71 void time_settings(struct time_info *ti, int main_time, int byoyomi_time, int byoyomi_stones, int byoyomi_periods);
73 /* Update time information according to gtp time_left command. */
74 void time_left(struct time_info *ti, int time_left, int stones_left);
76 /* Returns true if we are in byoyomi (or should play as if in byo yomi
77 * because remaining time per move in main time is less than byoyomi time
78 * per move). */
79 bool time_in_byoyomi(struct time_info *ti);
81 /* Start our timer. kgs does this (correctly) on "play" not "genmove"
82 * unless we are making the first move of the game. */
83 void time_start_timer(struct time_info *ti);
85 /* Returns the current time. */
86 double time_now(void);
88 /* Sleep for a given interval (in seconds). Return immediately if interval < 0. */
89 void time_sleep(double interval);
92 /* Based on existing time information, compute the optimal/maximal time
93 * to be spent on this move. */
95 struct time_stop {
96 /* stop at that time if possible */
97 union {
98 double time; // TD_WALLTIME
99 int playouts; // TD_GAMES
100 } desired;
101 /* stop no later than this */
102 union {
103 double time; // TD_WALLTIME
104 int playouts; // TD_GAMES
105 } worst;
108 /* fuseki_end and yose_start are percentages of expected game length. */
109 void time_stop_conditions(struct time_info *ti, struct board *b, int fuseki_end, int yose_start, struct time_stop *stop);
111 #endif