From 3a2cf6b3c59c9bc8edc5586786dac8f5d5f28cb3 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Wed, 11 Jan 2012 03:17:07 +0100 Subject: [PATCH] Patternplay: Use patterns_init(); pattern_rate_moves() uses pattern_setup --- pattern.c | 32 +++++++++++++++++++++++++++++++- pattern.h | 2 +- patternplay/patternplay.c | 29 +++++++++-------------------- patternprob.c | 6 +++--- patternprob.h | 2 +- uct/prior.c | 4 ++-- 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/pattern.c b/pattern.c index 571b438..6894387 100644 --- a/pattern.c +++ b/pattern.c @@ -97,7 +97,7 @@ feature_payloads(struct pattern_config *pc, enum feature_id f) void -patterns_init(struct pattern_setup *pat, bool will_append, bool load_prob) +patterns_init(struct pattern_setup *pat, char *arg, bool will_append, bool load_prob) { memset(pat, 0, sizeof(*pat)); @@ -106,6 +106,36 @@ patterns_init(struct pattern_setup *pat, bool will_append, bool load_prob) memcpy(&pat->ps, PATTERN_SPEC_MATCH_DEFAULT, sizeof(pattern_spec)); + if (arg) { + char *optspec, *next = arg; + while (*next) { + optspec = next; + next += strcspn(next, ":"); + if (*next) { *next++ = 0; } else { *next = 0; } + + char *optname = optspec; + char *optval = strchr(optspec, '='); + if (optval) *optval++ = 0; + + /* See pattern.h:pattern_config for description and + * pattern.c:DEFAULT_PATTERN_CONFIG for default values + * of the following options. */ + if (!strcasecmp(optname, "bdist_max") && optval) { + pat->pc.bdist_max = atoi(optval); + } else if (!strcasecmp(optname, "spat_min") && optval) { + pat->pc.spat_min = atoi(optval); + } else if (!strcasecmp(optname, "spat_max") && optval) { + pat->pc.spat_max = atoi(optval); + } else if (!strcasecmp(optname, "spat_largest")) { + pat->pc.spat_largest = !optval || atoi(optval); + + } else { + fprintf(stderr, "patterns: Invalid argument %s or missing value\n", optname); + exit(EXIT_FAILURE); + } + } + } + if (load_prob && pat->pc.spat_dict) { pat->pd = pattern_pdict_init(NULL, &pat->pc); } diff --git a/pattern.h b/pattern.h index 4727457..661afc3 100644 --- a/pattern.h +++ b/pattern.h @@ -138,7 +138,7 @@ struct pattern_setup { struct pattern_pdict *pd; }; -void patterns_init(struct pattern_setup *pat, bool will_append, bool load_prob); +void patterns_init(struct pattern_setup *pat, char *arg, bool will_append, bool load_prob); /* Append feature to string. */ diff --git a/patternplay/patternplay.c b/patternplay/patternplay.c index 1d13130..fb12c70 100644 --- a/patternplay/patternplay.c +++ b/patternplay/patternplay.c @@ -17,9 +17,7 @@ struct patternplay { int debug_level; - struct pattern_config pc; - pattern_spec ps; - struct pattern_pdict *pd; + struct pattern_setup pat; }; @@ -30,7 +28,7 @@ patternplay_genmove(struct engine *e, struct board *b, struct time_info *ti, enu struct pattern pats[b->flen]; floating_t probs[b->flen]; - pattern_rate_moves(&pp->pc, &pp->ps, pp->pd, b, color, pats, probs); + pattern_rate_moves(&pp->pat, b, color, pats, probs); int best = 0; for (int f = 0; f < b->flen; f++) { @@ -51,7 +49,7 @@ patternplay_evaluate(struct engine *e, struct board *b, struct time_info *ti, fl struct patternplay *pp = e->data; struct pattern pats[b->flen]; - floating_t total = pattern_rate_moves(&pp->pc, &pp->ps, pp->pd, b, color, pats, vals); + floating_t total = pattern_rate_moves(&pp->pat, b, color, pats, vals); #if 0 /* Rescale properly. */ @@ -75,11 +73,9 @@ struct patternplay * patternplay_state_init(char *arg) { struct patternplay *pp = calloc2(1, sizeof(struct patternplay)); + bool pat_setup = false; pp->debug_level = debug_level; - pp->pc = DEFAULT_PATTERN_CONFIG; - pp->pc.spat_dict = spatial_dict_init(false, false); - memcpy(&pp->ps, PATTERN_SPEC_MATCH_DEFAULT, sizeof(pattern_spec)); if (arg) { char *optspec, *next = arg; @@ -98,17 +94,9 @@ patternplay_state_init(char *arg) else pp->debug_level++; - /* See pattern.h:pattern_config for description and - * pattern.c:DEFAULT_PATTERN_CONFIG for default values - * of the following options. */ - } else if (!strcasecmp(optname, "bdist_max") && optval) { - pp->pc.bdist_max = atoi(optval); - } else if (!strcasecmp(optname, "spat_min") && optval) { - pp->pc.spat_min = atoi(optval); - } else if (!strcasecmp(optname, "spat_max") && optval) { - pp->pc.spat_max = atoi(optval); - } else if (!strcasecmp(optname, "spat_largest")) { - pp->pc.spat_largest = !optval || atoi(optval); + } else if (!strcasecmp(optname, "patterns") && optval) { + patterns_init(&pp->pat, optval, false, true); + pat_setup = true; } else { fprintf(stderr, "patternplay: Invalid engine argument %s or missing value\n", optname); @@ -117,7 +105,8 @@ patternplay_state_init(char *arg) } } - pp->pd = pattern_pdict_init(NULL, &pp->pc); + if (!pat_setup) + patterns_init(&pp->pat, NULL, false, true); return pp; } diff --git a/patternprob.c b/patternprob.c index 9a36434..85f58ed 100644 --- a/patternprob.c +++ b/patternprob.c @@ -88,7 +88,7 @@ pattern_pdict_init(char *filename, struct pattern_config *pc) } floating_t -pattern_rate_moves(struct pattern_config *pc, pattern_spec *ps, struct pattern_pdict *pd, +pattern_rate_moves(struct pattern_setup *pat, struct board *b, enum stone color, struct pattern *pats, floating_t *probs) { @@ -102,8 +102,8 @@ pattern_rate_moves(struct pattern_config *pc, pattern_spec *ps, struct pattern_p if (!board_is_valid_move(b, &mo)) continue; - pattern_match(pc, *ps, &pats[f], b, &mo); - floating_t prob = pattern_prob(pd, &pats[f]); + pattern_match(&pat->pc, pat->ps, &pats[f], b, &mo); + floating_t prob = pattern_prob(pat->pd, &pats[f]); if (!isnan(prob)) { probs[f] = prob; total += prob; diff --git a/patternprob.h b/patternprob.h index 9bb4d55..7ca52b2 100644 --- a/patternprob.h +++ b/patternprob.h @@ -43,7 +43,7 @@ static floating_t pattern_prob(struct pattern_pdict *dict, struct pattern *p); * to pats[b->flen] and NON-normalized probability of each pattern * (or NaN in case of no match) to probs[b->flen]. Returns the sum * of all probabilities that can be used for normalization. */ -floating_t pattern_rate_moves(struct pattern_config *pc, pattern_spec *ps, struct pattern_pdict *pd, +floating_t pattern_rate_moves(struct pattern_setup *pat, struct board *b, enum stone color, struct pattern *pats, floating_t *probs); diff --git a/uct/prior.c b/uct/prior.c index f9cecca..25a9551 100644 --- a/uct/prior.c +++ b/uct/prior.c @@ -151,7 +151,7 @@ uct_prior_pattern(struct uct *u, struct tree_node *node, struct prior_map *map) struct board *b = map->b; struct pattern pats[b->flen]; floating_t probs[b->flen]; - pattern_rate_moves(&u->pat.pc, &u->pat.ps, u->pat.pd, b, map->to_play, pats, probs); + pattern_rate_moves(&u->pat, b, map->to_play, pats, probs); if (UDEBUGL(5)) { fprintf(stderr, "Pattern prior at node %s\n", coord2sstr(node->coord, b)); board_print(b, stderr); @@ -290,7 +290,7 @@ uct_prior_init(char *arg, struct board *b, struct uct *u) } if (p->pattern_eqex) { - patterns_init(&u->pat, false, true); + patterns_init(&u->pat, NULL, false, true); } return p; -- 2.11.4.GIT