Merge pull request #50 from lemonsqueeze/can_countercap
[pachi.git] / playout.h
blobd931d98ee809dacd230a457cbb57e9a589024414
1 #ifndef PACHI_PLAYOUT_H
2 #define PACHI_PLAYOUT_H
4 #define MAX_GAMELEN 600
6 struct board;
7 struct move;
8 enum stone;
9 struct prior_map;
10 struct board_ownermap;
13 /** Playout policy interface: */
15 struct playout_policy;
16 struct playout_setup;
18 /* Initialize policy data structures for new playout; subsequent choose calls
19 * (but not assess/permit calls!) will all be made on the same board; if
20 * setboard is used, it is guaranteed that choose will pick all moves played
21 * on the board subsequently. The routine is expected to initialize b->ps
22 * with internal data. At the playout end, b->ps will be simply free()d,
23 * so make sure all data is within single allocated block. */
24 typedef void (*playoutp_setboard)(struct playout_policy *playout_policy, struct board *b);
26 /* Pick the next playout simulation move. */
27 typedef coord_t (*playoutp_choose)(struct playout_policy *playout_policy, struct playout_setup *playout_setup, struct board *b, enum stone to_play);
29 /* Set number of won (>0) or lost (<0) games for each considerable
30 * move (usually a proportion of @games); can leave some untouched
31 * if policy has no opinion. The number must have proper parity;
32 * just use uct/prior.h:add_prior_value(). */
33 typedef void (*playoutp_assess)(struct playout_policy *playout_policy, struct prior_map *map, int games);
35 /* Allow play of randomly selected move. */
36 typedef bool (*playoutp_permit)(struct playout_policy *playout_policy, struct board *b, struct move *m);
38 /* Tear down the policy state; policy and policy->data will be free()d by caller. */
39 typedef void (*playoutp_done)(struct playout_policy *playout_policy);
41 struct playout_policy {
42 int debug_level;
43 /* We call setboard when we start new playout.
44 * We call choose when we ask policy about next move.
45 * We call assess when we ask policy about how good given move is.
46 * We call permit when we ask policy if we can make a randomly chosen move. */
47 playoutp_setboard setboard;
48 playoutp_choose choose;
49 playoutp_assess assess;
50 playoutp_permit permit;
51 playoutp_done done;
52 /* By default, with setboard set we will refuse to make (random)
53 * moves outside of the *choose routine in order not to mess up
54 * state tracking. If you use *setboard but do not track state
55 * (e.g. you just initialize some per-playout data, like the Moggy
56 * policy), set setboard_randomok too. */
57 bool setboard_randomok;
58 /* Particular playout policy's internal data. */
59 void *data;
63 /** Playout engine interface: */
65 /* Engine hook for forcing moves before doing policy decision.
66 * Return pass to forward to policy. */
67 typedef coord_t (*playouth_prepolicy)(struct playout_policy *playout_policy, struct playout_setup *setup, struct board *b, enum stone color);
69 /* Engine hook for choosing moves in case policy did not choose
70 * a move.
71 * Return pass to forward to uniformly random selection. */
72 typedef coord_t (*playouth_postpolicy)(struct playout_policy *playout_policy, struct playout_setup *setup, struct board *b, enum stone color);
74 struct playout_setup {
75 unsigned int gamelen; /* Maximal # of moves in playout. */
76 /* Minimal difference between captures to terminate the playout.
77 * 0 means don't check. */
78 int mercymin;
80 void *hook_data; // for hook to reference its state
81 playouth_prepolicy prepolicy_hook;
82 playouth_postpolicy postpolicy_hook;
86 struct playout_amafmap {
87 /* We keep record of the game so that we can
88 * examine nakade moves; really going out of our way to
89 * implement nakade AMAF properly turns out to be crucial
90 * when reading some tactical positions in depth (even if
91 * they are just one-stone-snapback). */
92 coord_t game[MAX_GAMELEN];
93 bool is_ko_capture[MAX_GAMELEN];
94 int gamelen;
95 /* Our current position in the game sequence; in AMAF, we search
96 * the range [game_baselen, gamelen[ */
97 int game_baselen;
101 /* >0: starting_color wins, <0: starting_color loses; the actual
102 * number is a DOUBLE of the score difference
103 * 0: superko inside the game tree (XXX: jigo not handled) */
104 int play_random_game(struct playout_setup *setup,
105 struct board *b, enum stone starting_color,
106 struct playout_amafmap *amafmap,
107 struct board_ownermap *ownermap,
108 struct playout_policy *policy);
110 coord_t play_random_move(struct playout_setup *setup,
111 struct board *b, enum stone color,
112 struct playout_policy *policy);
114 void playout_policy_done(struct playout_policy *p);
116 #endif