From 968040d17500e7a2ef9ab347a678ee9c5092fe4c Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Mon, 5 Jul 2010 00:33:20 +0200 Subject: [PATCH] PF_{CAPTURE,AESCAPE}_CONNECTION: Implement --- board.c | 2 ++ pattern.c | 24 ++++++++++++++++++------ pattern.h | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/board.c b/board.c index 9f905f0..fce7002 100644 --- a/board.c +++ b/board.c @@ -429,12 +429,14 @@ board_gamma_update(struct board *board, coord_t coord, enum stone color) int i = 0; i |= (trait_at(board, coord, color).cap1 == trait_at(board, coord, color).cap) << PF_CAPTURE_1STONE; i |= (!trait_at(board, coord, stone_other(color)).safe) << PF_CAPTURE_TRAPPED; + i |= (trait_at(board, coord, color).cap < neighbor_count_at(board, coord, stone_other(color))) << PF_CAPTURE_CONNECTION; value *= board->gamma->gamma[FEAT_CAPTURE][i]; } if (trait_at(board, coord, stone_other(color)).cap) { int i = 0; i |= (trait_at(board, coord, stone_other(color)).cap1 == trait_at(board, coord, stone_other(color)).cap) << PF_AESCAPE_1STONE; i |= (!trait_at(board, coord, color).safe) << PF_AESCAPE_TRAPPED; + i |= (trait_at(board, coord, stone_other(color)).cap < neighbor_count_at(board, coord, color)) << PF_AESCAPE_CONNECTION; value *= board->gamma->gamma[FEAT_AESCAPE][i]; } if (!trait_at(board, coord, color).safe) diff --git a/pattern.c b/pattern.c index 4431798..33ebae4 100644 --- a/pattern.c +++ b/pattern.c @@ -49,8 +49,8 @@ pattern_spec PATTERN_SPEC_MATCHALL = { * BOARD_GAMMA code! You cannot just tinker with this spec freely. */ pattern_spec PATTERN_SPEC_MATCHFAST = { [FEAT_PASS] = 0, - [FEAT_CAPTURE] = (1<payload |= (trait_at(b, m->coord, m->color).cap1 == trait_at(b, m->coord, m->color).cap) << PF_CAPTURE_1STONE; if (PS_PF(CAPTURE, TRAPPED)) f->payload |= (!trait_at(b, m->coord, stone_other(m->color)).safe) << PF_CAPTURE_TRAPPED; + if (PS_PF(CAPTURE, CONNECTION)) + f->payload |= (trait_at(b, m->coord, m->color).cap < neighbor_count_at(b, m->coord, stone_other(m->color))) << PF_CAPTURE_CONNECTION; (f++, p->n++); return f; } @@ -167,7 +171,7 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, /* Whether an escape move would be safe for the opponent. */ int captures = 0; coord_t onelib = -1; - int extra_libs = 0; + int extra_libs = 0, connectable_groups = 0; bool onestone = false, multistone = false; foreach_neighbor(b, m->coord, { @@ -181,6 +185,7 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, group_t g = group_at(b, c); assert(g); if (board_group_info(b, g).libs > 1) { + connectable_groups++; if (board_group_info(b, g).libs > 2) { extra_libs += 2; // connected out } else { @@ -242,6 +247,8 @@ pattern_match_capture(struct pattern_config *pc, pattern_spec ps, f->payload |= (onestone && !multistone) << PF_CAPTURE_1STONE; if (PS_PF(CAPTURE, TRAPPED)) f->payload |= (extra_libs < 2) << PF_CAPTURE_TRAPPED; + if (PS_PF(CAPTURE, CONNECTION)) + f->payload |= (connectable_groups > 0) << PF_CAPTURE_CONNECTION; (f++, p->n++); } return f; @@ -262,6 +269,8 @@ pattern_match_aescape(struct pattern_config *pc, pattern_spec ps, f->payload |= (trait_at(b, m->coord, stone_other(m->color)).cap1 == trait_at(b, m->coord, stone_other(m->color)).cap) << PF_AESCAPE_1STONE; if (PS_PF(AESCAPE, TRAPPED)) f->payload |= (!trait_at(b, m->coord, m->color).safe) << PF_AESCAPE_TRAPPED; + if (PS_PF(AESCAPE, CONNECTION)) + f->payload |= (trait_at(b, m->coord, stone_other(m->color)).cap < neighbor_count_at(b, m->coord, m->color)) << PF_AESCAPE_CONNECTION; (f++, p->n++); return f; } @@ -274,7 +283,7 @@ pattern_match_aescape(struct pattern_config *pc, pattern_spec ps, /* This is very similar in spirit to board_safe_to_play(). */ group_t in_atari = -1; coord_t onelib = -1; - int extra_libs = 0; + int extra_libs = 0, connectable_groups = 0; bool onestone = false, multistone = false; foreach_neighbor(b, m->coord, { @@ -290,6 +299,7 @@ pattern_match_aescape(struct pattern_config *pc, pattern_spec ps, } group_t g = group_at(b, c); assert(g); if (board_group_info(b, g).libs > 1) { + connectable_groups++; if (board_group_info(b, g).libs > 2) { extra_libs += 2; // connected out } else { @@ -329,6 +339,8 @@ pattern_match_aescape(struct pattern_config *pc, pattern_spec ps, f->payload |= (onestone && !multistone) << PF_AESCAPE_1STONE; if (PS_PF(AESCAPE, TRAPPED)) f->payload |= (extra_libs < 2) << PF_AESCAPE_TRAPPED; + if (PS_PF(AESCAPE, CONNECTION)) + f->payload |= (connectable_groups > 0) << PF_AESCAPE_CONNECTION; (f++, p->n++); } return f; diff --git a/pattern.h b/pattern.h index 5b1e5ed..0a75a92 100644 --- a/pattern.h +++ b/pattern.h @@ -50,6 +50,8 @@ enum feature_id { #define PF_CAPTURE_1STONE 4 /* [bit5] Unsafe move for opponent? */ #define PF_CAPTURE_TRAPPED 5 + /* [bit6] Preventing connection to an outside group. */ +#define PF_CAPTURE_CONNECTION 6 FEAT_CAPTURE, /* Atari escape (extension). */ @@ -59,6 +61,8 @@ enum feature_id { #define PF_AESCAPE_1STONE 1 /* [bit2] Unsafe move for us? */ #define PF_AESCAPE_TRAPPED 2 + /* [bit3] Connecting out to an outside group. */ +#define PF_AESCAPE_CONNECTION 3 FEAT_AESCAPE, /* Self-atari move. */ -- 2.11.4.GIT