1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\
* This is GNU Go, a Go program. Contact gnugo@gnu.org, or see *
* http://www.gnu.org/software/gnugo/ for more information. *
* *
* Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, *
* 2008 and 2009 by the Free Software Foundation. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation - version 3 or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License in file COPYING for more details. *
* *
* You should have received a copy of the GNU General Public *
* License along with this program; if not, write to the Free *
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02111, USA. *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This file describes the compiled form of the pattern database.
* mkpat is used to compile various source files <name>.db into
* intermediate files <name>.c which define data structures
* describing the patterns.
*/
#ifndef _PATTERN_H_
#define _PATTERN_H_
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/* local versions of absolute value, min and max */
#define gg_abs(x) ((x) < 0 ? -(x) : (x))
#define gg_min(a, b) ((a)<(b) ? (a) : (b))
#define gg_max(a, b) ((a)<(b) ? (b) : (a))
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
* Ditto for AIX 3.2 and <stdlib.h>.
*/
#ifndef _NO_PROTO
#define _NO_PROTO
#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
#else
#define GRID_OPT 0
#endif
#ifndef GRID_OPT
#error GRID_OPT should be defined as 0, 1 or 2
#endif
/* Include support for pattern profiling. May be turned off in stable
* releases to save some memory.
*
* FIXME: should probably be included in config.h
*/
#define PROFILE_PATTERNS 0
/* this trick forces a compile error if ints are not at least 32-bit */
struct _unused_patterns_h {
int unused[sizeof(unsigned int) >= 4 ? 1 : -1];
};
#define ATTACK_MACRO(pos) ((stackp == 0) ? (worm[pos].attack_codes[0]) : attack(pos, NULL))
#define DEFEND_MACRO(pos) ((stackp == 0) ? (worm[pos].defense_codes[0]) : find_defense(pos, NULL))
struct pattern; /* forward reference to keep gcc happy */
/* this is the type of a function which the matcher can
* call to evaluate the score of a move.
* parameters:
* pattern and rotation are the current pattern being considered
* ti, tj: IN = posn of the 7, 8 or 9 marker
* OUT = recommended move
* return value : weight of move, or 0 if match failed
*/
typedef int (*pattern_helper_fn_ptr)(struct pattern *, int rotation,
int move, int color);
typedef int (*autohelper_fn_ptr)(int rotation, int move,
int color, int action);
/* each pattern is compiled into a sequence of these elements.
* Each describes a relative x, y from the pattern origin,
* and a description of what should be there.
* Current attributes are
* 0 = .
* 1 = X
* 2 = O
* 3 = x
* 4 = o
* 5 = , (barriers only)
* 6 = a (half-eye only, OBSOLETE)
* 7 = ! (connection and barriers only)
*/
#define ATT_dot 0
#define ATT_X 1
#define ATT_O 2
#define ATT_x 3
#define ATT_o 4
#define ATT_comma 5
#define ATT_a 6
#define ATT_not 7
/* Pattern classes. The semantics of these varies between different
* databases. The descriptions here mostly relate to patterns in
* patterns.db and other databases which are handled by shapes.c.
*/
#define CLASS_O 0x0001 /* O stones must be alive or unknown */
#define CLASS_o 0x0002 /* O stones must be dead or unknown */
#define CLASS_X 0x0004 /* X stones must be alive or unknown */
#define CLASS_x 0x0008 /* X stones must be dead or unknown */
#define CLASS_s 0x0010 /* move is a sacrifice */
#define CLASS_n 0x0020 /* X could also make this move if we do not */
#define CLASS_D 0x0040 /* defense pattern */
#define CLASS_C 0x0080 /* move connects two worms */
#define CLASS_c 0x0100 /* move weakly connects two worms */
/* for owl databases: combinable pattern */
#define CLASS_B 0x0200 /* move breaks connection between enemy worms */
#define CLASS_A 0x0400 /* attack pattern */
#define CLASS_b 0x0800 /* move is intended to block opponent */
#define CLASS_e 0x1000 /* move is intended to expand territory */
#define CLASS_E 0x2000 /* move is intended to expand moyo */
#define CLASS_a 0x4000 /* strategical level attack */
#define CLASS_d 0x8000 /* strategical level defense */
#define CLASS_I 0x00010000 /* invasions patterns (influence.db) */
#define CLASS_J 0x00020000 /* joseki standard move */
#define CLASS_j 0x00040000 /* joseki move, slightly less urgent */
#define CLASS_t 0x00080000 /* minor joseki move (tenuki OK) */
#define CLASS_U 0x00100000 /* very urgent joseki move */
#define CLASS_T 0x00200000 /* joseki trick move */
#define CLASS_W 0x00400000 /* worthwhile threat move */
#define CLASS_F 0x00800000 /* for joseki moves: a fuseki pattern */
#define CLASS_N 0x01000000 /* antisuji move (do _not_ play) */
#define CLASS_Y 0x80000000 /* used for experimental patterns */
/* Collection of the classes inducing move reasons. */
#define CLASS_MOVE_REASONS (CLASS_C | CLASS_B | CLASS_b | \
CLASS_e | CLASS_E | CLASS_I | CLASS_a | CLASS_d | \
CLASS_J | CLASS_j | CLASS_U | CLASS_T | CLASS_t | \
CLASS_W | CLASS_c | CLASS_F)
/* directions for applying edge-constraints */
#define NORTH_EDGE 1
#define SOUTH_EDGE 2
#define EAST_EDGE 4
#define WEST_EDGE 8
/* different kinds of autohelpers */
#define HAVE_CONSTRAINT 1
#define HAVE_ACTION 2
/* Values of the action parameter to indicate where an influence autohelper
* is called from.
*/
#define INFLUENCE_CALLBACK 1
#define FOLLOWUP_INFLUENCE_CALLBACK 2
typedef struct patval {
short offset;
unsigned char att;
} Patval;
/* Build-time version of patval structure. */
typedef struct patval_b {
int x;
int y;
int att;
} Patval_b;
enum attribute_type {
MIN_VALUE,
MAX_VALUE,
MIN_TERRITORY,
MAX_TERRITORY,
SHAPE,
FOLLOWUP,
REVERSE_FOLLOWUP,
/* For `mkpat'. */
FIRST_OFFSET_ATTRIBUTE,
THREATENS_TO_CAPTURE = FIRST_OFFSET_ATTRIBUTE,
THREATENS_EYE,
REVERSE_SENTE,
NUM_ATTRIBUTES,
LAST_ATTRIBUTE = NUM_ATTRIBUTES
};
#ifdef HAVE_TRANSPARENT_UNIONS
struct pattern_attribute {
enum attribute_type type;
/* GCC allows unnamed (and transparent) unions. */
union {
float value;
int offset;
};
};
#else
struct pattern_attribute {
enum attribute_type type;
float value;
int offset;
};
#endif
/*
* Each pattern as a whole is compiled to an instance of this structure.
*/
struct pattern {
struct patval *patn; /* array of elements */
int patlen; /* number of elements */
int trfno; /* number of transformations (rotations and reflections) */
const char *name; /* short description of pattern (optional) */
int mini, minj; /* min and max (relative to anchor) extent of ... */
int maxi, maxj; /* ...the pattern */
int height, width; /* differences between max and min extents */
unsigned int edge_constraints; /* and combinations of NORTH, EAST etc.
* for edges */
int move_offset; /* offset of the suggested move (relative to anchor) */
#if GRID_OPT
unsigned int and_mask[8]; /* for each rotation, masks for a */
unsigned int val_mask[8]; /* 4x4 grid around anchor */
#endif
unsigned int class; /* classification of pattern */
/* Value (owl-style, used for pattern sorting) is not stored as an
* attribute, because it is very common.
*/
float value;
/* Pattern attributes like shape, followup etc. */
struct pattern_attribute *attributes;
int autohelper_flag; /* whether autohelper has constraint and/or action */
pattern_helper_fn_ptr helper; /* helper function, or NULL */
autohelper_fn_ptr autohelper; /* automatically generated helper */
/* function, or NULL */
int anchored_at_X; /* 3 if the pattern has 'X' at the anchor posn */
float constraint_cost; /* mkpat's estimate of the constraint complexity.*/
#if PROFILE_PATTERNS
int hits;
int dfa_hits;
int reading_nodes;
#endif
};
struct pattern_db {
int fixed_for_size;
const int fixed_anchor;
struct pattern *patterns;
struct dfa_rt *pdfa;
};
struct fullboard_pattern {
Hash_data fullboard_hash; /* Hash of the full board position. */
int number_of_stones; /* Number of stones on board. */
const char *name; /* Pattern identifier. */
int move_offset; /* position of the move relative to tengen */
int value; /* value for pattern, if matched */
};
/* Monte Carlo local patterns. */
struct mc_pattern_database {
const char *name;
const unsigned int *values;
};
/* helper functions */
#define DECLARE(x) int x(struct pattern *pattern, int transformation, int move, int color)
DECLARE(jump_out_helper);
DECLARE(jump_out_far_helper);
DECLARE(high_handicap_helper);
DECLARE(reinforce_helper);
DECLARE(throw_in_atari_helper);
DECLARE(cutstone2_helper);
DECLARE(thrash_around_helper);
/* autohelper fns */
int seki_helper(int str);
void threaten_to_save_helper(int move, int str);
void threaten_to_capture_helper(int move, int str);
void prevent_attack_threat_helper(int move, int str);
void defend_against_atari_helper(int move, int str);
void amalgamate_most_valuable_helper(int apos, int bpos, int cpos);
int finish_ko_helper(int apos);
int squeeze_ko_helper(int apos);
int backfill_helper(int apos, int bpos, int cpos);
int owl_threatens_attack(int apos, int bpos);
int connect_and_cut_helper(int Apos, int bpos, int cpos);
int connect_and_cut_helper2(int Apos, int bpos, int cpos, int color);
int edge_double_sente_helper(int move, int apos, int bpos, int cpos);
void test_attack_either_move(int move, int color, int worma, int wormb);
int adjacent_to_stone_in_atari(int str);
int adjacent_to_defendable_stone_in_atari(int str);
void backfill_replace(int move, int str);
int break_mirror_helper(int str, int color);
int distrust_tactics_helper(int str);
int disconnect_helper(int apos, int bpos);
/* pattern arrays themselves */
extern struct pattern_db pat_db;
extern struct pattern_db aa_attackpat_db;
extern struct pattern_db owl_attackpat_db;
extern struct pattern_db owl_vital_apat_db;
extern struct pattern_db owl_defendpat_db;
extern struct pattern_db conn_db;
extern struct pattern_db attpat_db;
extern struct pattern_db defpat_db;
extern struct pattern_db endpat_db;
extern struct pattern_db influencepat_db;
extern struct pattern_db barrierspat_db;
extern struct pattern_db fusekipat_db;
extern struct pattern_db handipat_db;
extern struct pattern_db oracle_db;
extern struct corner_db joseki_db;
extern struct fullboard_pattern fuseki19[];
extern struct fullboard_pattern fuseki13[];
extern struct fullboard_pattern fuseki9[];
extern struct mc_pattern_database mc_pattern_databases[];
struct corner_db;
struct corner_variation;
struct corner_pattern;
struct corner_db {
int max_width; /* Largest possible width and... */
int max_height; /* ... largest possible height of database patterns. */
unsigned char num_top_variations; /* Number of top level variations. */
struct corner_variation *top_variations;
};
struct corner_variation {
int move_offset; /* Offset of the move in this variation. */
signed char xor_att; /* 0 - the same color as the first matched stone,
* 3 - the opposite color.
*/
unsigned char num_stones; /* Number of stones in the `move_offset' rectangle. */
unsigned char num_variations; /* Number of subvariations. */
struct corner_variation *variations; /* Pointer to subvariation array. */
struct corner_pattern *pattern; /* Address of matched pattern (if any). */
};
struct corner_pattern {
int second_corner_offset; /* Offset of pattern's second corner. */
int symmetric; /* If the pattern is symmetric ('/' symmetry). */
unsigned int class; /* Pattern class. */
const char *name; /* Pattern name (optional). */
/* Pattern attributes like shape (the only one used currently). */
struct pattern_attribute *attributes;
int autohelper_flag; /* Whether autohelper has constraint and/or action. */
autohelper_fn_ptr autohelper; /* Automatically generated helper (or NULL). */
};
/* Build time version of corner_variation structure. */
struct corner_variation_b {
int move_offset;
signed char xor_att;
unsigned char num_stones;
unsigned char num_variations;
struct corner_variation_b *next;
struct corner_variation_b *child;
int child_num;
int pattern_num;
};
#endif /* _PATTERN_H_ */
/*
* Local Variables:
* tab-width: 8
* c-basic-offset: 2
* End:
*/
|