1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
2  * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       *
3  * http://www.gnu.org/software/gnugo/ for more information.          *
4  *                                                                   *
5  * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   *
6  * 2008 and 2009 by the Free Software Foundation.                    *
7  *                                                                   *
8  * This program is free software; you can redistribute it and/or     *
9  * modify it under the terms of the GNU General Public License as    *
10  * published by the Free Software Foundation - version 3 or          *
11  * (at your option) any later version.                               *
12  *                                                                   *
13  * This program is distributed in the hope that it will be useful,   *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     *
16  * GNU General Public License in file COPYING for more details.      *
17  *                                                                   *
18  * You should have received a copy of the GNU General Public         *
19  * License along with this program; if not, write to the Free        *
20  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       *
21  * Boston, MA 02111, USA.                                            *
22 \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
23 
24 /* ---------------------------------------------------------------- *
25  * gnugo.h
26  *	This file contains the public interface to the GNU Go engine.
27  * ---------------------------------------------------------------- */
28 
29 
30 #ifndef _GNUGO_H_
31 #define _GNUGO_H_
32 
33 #include "board.h"
34 
35 #include <stdio.h>
36 
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40 
41 #ifdef HAVE_CRTDBG_H
42 #include <crtdbg.h>
43 #endif
44 
45 #include "sgftree.h"
46 #include "clock.h"
47 #include "winsocket.h"
48 
49 /* interface.c */
50 /* Initialize the whole thing. Should be called once. */
51 void init_gnugo(float memory, unsigned int random_seed);
52 
53 
54 /* ================================================================ */
55 /*                some public macros used everywhere                */
56 /* ================================================================ */
57 
58 
59 /* Used in matchpat.c. Have to be different from WHITE, BLACK. */
60 #define ANCHOR_COLOR 6
61 #define ANCHOR_OTHER 7
62 
63 /* Return codes for reading functions */
64 
65 #define WIN  5
66 #define KO_A 4
67 #define GAIN 3
68 #define LOSS 2
69 #define KO_B 1
70 #define LOSE 0
71 
72 const char *result_to_string(int result);
73 
74 /* Used by break_through(). Must be different from 0 and WIN. */
75 #define CUT  2
76 
77 
78 /* Surrounded */
79 
80 #define SURROUNDED 1
81 #define WEAKLY_SURROUNDED 2
82 
83 /* ================================================================ */
84 /*                        Board manipulation                        */
85 /* ================================================================ */
86 
87 
88 int check_boardsize(int boardsize, FILE *out);
89 void gnugo_clear_board(int boardsize);
90 void gnugo_play_move(int move, int color);
91 int gnugo_play_sgfnode(SGFNode *node, int to_move);
92 int gnugo_sethand(int desired_handicap, SGFNode *node);
93 float gnugo_estimate_score(float *upper, float *lower);
94 
95 /* ================================================================ */
96 /*                           Game handling                          */
97 /* ================================================================ */
98 
99 
100 typedef struct {
101   int handicap;
102   int to_move;		/* whose move it currently is */
103   SGFTree game_record;	/* Game record in sgf format. */
104   int computer_player;	/* BLACK, WHITE, or EMPTY (used as BOTH) */
105 } Gameinfo;
106 
107 void gameinfo_clear(Gameinfo *ginfo);
108 void gameinfo_print(Gameinfo *ginfo);
109 int gameinfo_play_sgftree_rot(Gameinfo *gameinfo, SGFTree *tree,
110 			      const char *untilstr, int orientation);
111 int gameinfo_play_sgftree(Gameinfo *gameinfo, SGFTree *tree,
112 			  const char *untilstr);
113 
114 
115 /* ================================================================ */
116 /*                           global variables                       */
117 /* ================================================================ */
118 
119 
120 /* Miscellaneous debug options. */
121 extern int quiet;		/* Minimal output. */
122 extern int verbose;		/* Bore the opponent. */
123 extern int allpats;		/* generate all patterns, even small ones */
124 extern int printworms;		/* print full data on each string */
125 extern int printmoyo;		/* print moyo board each move */
126 extern int printdragons;	/* print full data on each dragon */
127 extern int printboard;		/* print board each move */
128 extern int showstatistics;	/* print statistics */
129 extern int profile_patterns;	/* print statistics of pattern usage */
130 extern char outfilename[128];	/* output file (-o option) */
131 extern int output_flags;	/* amount of output to outfile */
132 
133 /* output flag bits */
134 #define OUTPUT_MARKDRAGONS         0x0001  /* mark dead and critical dragons */
135 #define OUTPUT_MOVEVALUES          0x0002  /* output values of all moves in list */
136 
137 #define OUTPUT_DEFAULT             0 /* no debug output  by default */
138 
139 /* debug flag bits */
140 /* NOTE : can specify -d0x... */
141 /* Please keep this list in sync with the DEBUG_FLAGS string below. */
142 #define DEBUG_INFLUENCE             0x0001
143 #define DEBUG_EYES                  0x0002
144 #define DEBUG_OWL                   0x0004
145 #define DEBUG_ESCAPE                0x0008
146 #define DEBUG_MATCHER               0x0010
147 #define DEBUG_DRAGONS               0x0020
148 #define DEBUG_SEMEAI                0x0040
149 #define DEBUG_LOADSGF               0x0080
150 #define DEBUG_HELPER                0x0100
151 #define DEBUG_READING               0x0200
152 #define DEBUG_WORMS                 0x0400
153 #define DEBUG_MOVE_REASONS          0x0800
154 #define DEBUG_OWL_PERFORMANCE       0x1000
155 #define DEBUG_BREAKIN		    0x2000
156 #define DEBUG_FILLLIB               0x4000
157 #define DEBUG_READING_PERFORMANCE   0x8000
158 #define DEBUG_SCORING               0x010000
159 #define DEBUG_AFTERMATH             0x020000
160 #define DEBUG_ATARI_ATARI           0x040000
161 #define DEBUG_READING_CACHE         0x080000
162 #define DEBUG_TERRITORY             0x100000
163 #define DEBUG_PERSISTENT_CACHE	    0x200000
164 #define DEBUG_TOP_MOVES             0x400000
165 #define DEBUG_MISCELLANEOUS         0x800000
166 #define DEBUG_ORACLE_STREAM         0x1000000
167 #define DEBUG_LARGE_SCALE           0x1000000
168 #define DEBUG_SPLIT_OWL             0x2000000
169 #define DEBUG_TIME                  0x4000000
170 
171 
172 #define DEBUG_FLAGS "\
173 DEBUG_INFLUENCE             0x0001\n\
174 DEBUG_EYES                  0x0002\n\
175 DEBUG_OWL                   0x0004\n\
176 DEBUG_ESCAPE                0x0008\n\
177 DEBUG_MATCHER               0x0010\n\
178 DEBUG_DRAGONS               0x0020\n\
179 DEBUG_SEMEAI                0x0040\n\
180 DEBUG_LOADSGF               0x0080\n\
181 DEBUG_HELPER                0x0100\n\
182 DEBUG_READING               0x0200\n\
183 DEBUG_WORMS                 0x0400\n\
184 DEBUG_MOVE_REASONS          0x0800\n\
185 DEBUG_OWL_PERFORMANCE       0x1000\n\
186 DEBUG_BREAKIN               0x2000\n\
187 DEBUG_FILLLIB               0x4000\n\
188 DEBUG_READING_PERFORMANCE   0x8000\n\
189 DEBUG_SCORING               0x010000\n\
190 DEBUG_AFTERMATH             0x020000\n\
191 DEBUG_ATARI_ATARI           0x040000\n\
192 DEBUG_READING_CACHE         0x080000\n\
193 DEBUG_TERRITORY             0x100000\n\
194 DEBUG_PERSISTENT_CACHE      0x200000\n\
195 DEBUG_TOP_MOVES             0x400000\n\
196 DEBUG_MISCELLANEOUS         0x800000\n\
197 DEBUG_ORACLE_STREAM         0x1000000\n\
198 DEBUG_LARGE_SCALE           0x1000000\n\
199 DEBUG_SPLIT_OWL             0x2000000\n\
200 DEBUG_TIME                  0x4000000\n\
201 "
202 
203 
204 extern int debug;		/* debug flags */
205 extern int fusekidb;            /* use fuseki database */
206 extern int disable_fuseki;      /* do not generate fuseki moves */
207 extern int josekidb;            /* use joseki database */
208 extern int semeai_variations;   /* max variations considered reading semeai */
209 extern int showtime;		/* print genmove time */
210 extern int showscore;		/* print score */
211 extern int chinese_rules;       /* use chinese (area) rules for counting */
212 extern int experimental_owl_ext;     /* use experimental owl (GAIN/LOSS) */
213 extern int experimental_connections; /* use experimental connection module */
214 extern int alternate_connections;    /* use alternate connection module */
215 extern int owl_threats;              /* compute owl threats */
216 extern int capture_all_dead;         /* capture all dead opponent stones */
217 extern int play_out_aftermath; /* make everything unconditionally settled */
218 extern int resign_allowed;           /* allows GG to resign hopeless games */
219 extern int play_mirror_go;           /* try to play mirror go if possible */
220 extern int mirror_stones_limit;      /* but stop at this number of stones */
221 extern int gtp_version;              /* version of Go Text Protocol */
222 extern int use_monte_carlo_genmove;  /* use Monte Carlo move generation */
223 extern int mc_games_per_level;       /* number of Monte Carlo simulations per level */
224 
225 /* Mandatory values of reading parameters. Normally -1, if set
226  * these override the values derived from the level. */
227 extern int mandated_depth;
228 extern int mandated_backfill_depth;
229 extern int mandated_backfill2_depth;
230 extern int mandated_break_chain_depth;
231 extern int mandated_superstring_depth;
232 extern int mandated_fourlib_depth;
233 extern int mandated_ko_depth;
234 extern int mandated_branch_depth;
235 extern int mandated_aa_depth;
236 extern int mandated_owl_distrust_depth;
237 extern int mandated_owl_branch_depth;
238 extern int mandated_owl_reading_depth;
239 extern int mandated_owl_node_limit;
240 extern int mandated_semeai_node_limit;
241 
242 extern int autolevel_on;
243 
244 extern float potential_moves[BOARDMAX];
245 
246 extern int oracle_exists; /* oracle is available for consultation        */
247 extern int metamachine;   /* use metamachine_genmove                     */
248 
249 /* ================================================================ */
250 /*                 tracing and debugging functions                  */
251 /* ================================================================ */
252 
253 /* Colors. */
254 #define GG_COLOR_BLACK   0
255 #define GG_COLOR_RED     1
256 #define GG_COLOR_GREEN   2
257 #define GG_COLOR_YELLOW  3
258 #define GG_COLOR_BLUE    4
259 #define GG_COLOR_MAGENTA 5
260 #define GG_COLOR_CYAN    6
261 #define GG_COLOR_WHITE   7
262 
263 /* showbord.c */
264 void start_draw_board(void);
265 void draw_color_char(int m, int n, int c, int color);
266 void draw_char(int m, int n, int c);
267 void end_draw_board(void);
268 void showboard(int xo);  /* ascii rep. of board to stderr */
269 
270 
271 /* influence.c */
272 void debug_influence_move(int move);
273 
274 
275 #define TRACE  (!(verbose)) ? (void)0 : (void)gprintf
276 
277 #ifdef HAVE_VARIADIC_DEFINE
278 
279 /* gnuc allows variadic macros, so the tests can be done inline */
280 #define DEBUG(level, fmt, args...) \
281     do { if ((debug & (level))) gprintf(fmt, ##args); } while (0)
282 
283 #else /*HAVE_VARIADIC_DEFINE*/
284 
285 /* if debug == 0, then can skip the function call. */
286 #define DEBUG  (!(debug)) ? (void)0 : (void)DEBUG_func
287 int DEBUG_func(int level, const char *fmt, ...);
288 
289 #endif  /*HAVE_VARIADIC_DEFINE*/
290 
291 
292 /* genmove.c */
293 #define EXAMINE_WORMS               1
294 #define EXAMINE_INITIAL_INFLUENCE   2
295 #define EXAMINE_DRAGONS_WITHOUT_OWL 3
296 #define EXAMINE_DRAGONS             4
297 #define EXAMINE_OWL_REASONS         5
298 #define EXAMINE_INITIAL_INFLUENCE2  6
299 #define FULL_EXAMINE_DRAGONS        7
300 
301 #define EXAMINE_ALL                 99
302 
303 void reset_engine(void);
304 void examine_position(int how_much, int aftermath_play);
305 void silent_examine_position(int how_much);
306 
307 
308 /* ================================================================ */
309 /*                         statistics functions                     */
310 /* ================================================================ */
311 
312 
313 /* These are mostly used for GTP examination. */
314 void reset_owl_node_counter(void);
315 int get_owl_node_counter(void);
316 void reset_reading_node_counter(void);
317 int get_reading_node_counter(void);
318 void reset_connection_node_counter(void);
319 int get_connection_node_counter(void);
320 
321 
322 
323 /* ================================================================ */
324 /*                         Low level functions                      */
325 /* ================================================================ */
326 
327 /* utils.c */
328 void who_wins(int color, FILE *outfile);
329 
330 /* high-level routine to generate the best move for the given color */
331 int genmove(int color, float *value, int *resign);
332 int genmove_conservative(int color, float *value);
333 
334 /* Play through the aftermath. */
335 float aftermath_compute_score(int color, SGFTree *tree);
336 
337 /* Basic information gathering. */
338 /* worm.c */
339 void make_worms(void);
340 void compute_worm_influence(void);
341 
342 /* dragon.c */
343 void make_dragons(int stop_before_owl);
344 void initialize_dragon_data(void);
345 void show_dragons(void);
346 enum dragon_status crude_status(int pos);
347 enum dragon_status dragon_status(int pos);
348 int same_dragon(int dr1, int dr2);
349 
350 /* debugging functions */
351 void prepare_pattern_profiling(void);
352 void report_pattern_profiling(void);
353 
354 /* sgffile.c */
355 void sgffile_add_debuginfo(SGFNode *node, float value);
356 void sgffile_output(SGFTree *tree);
357 
358 void sgffile_printsgf(int color_to_play, const char *filename);
359 void sgffile_printboard(SGFTree *tree);
360 void sgffile_recordboard(SGFNode *node);
361 int get_sgfmove(SGFProperty *property);
362 
363 /* sgfdecide.c */
364 void decide_string(int pos);
365 void decide_connection(int apos, int bpos);
366 void decide_owl(int pos);
367 void decide_dragon_data(int pos);
368 void decide_semeai(int apos, int bpos);
369 void decide_tactical_semeai(int apos, int bpos);
370 void decide_position(void);
371 void decide_eye(int pos);
372 void decide_combination(int color);
373 void decide_surrounded(int pos);
374 void decide_oracle(Gameinfo *gameinfo, char *infilename, char *untilstring);
375 
376 /*oracle.c*/
377 void dismiss_oracle(void);
378 void oracle_clear_board(int boardsize);
379 
380 #endif  /* _GNUGO_H_ */
381 
382 
383 /*
384  * Local Variables:
385  * tab-width: 8
386  * c-basic-offset: 2
387  * End:
388  */
389