Skip to content

Commit

Permalink
mm: gogui analyze commands
Browse files Browse the repository at this point in the history
  • Loading branch information
lemonsqueeze committed Jul 18, 2018
1 parent ca33969 commit edaba3d
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 11 deletions.
63 changes: 52 additions & 11 deletions engines/patternplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,37 @@
struct patternplay {
int debug_level;

struct pattern_setup pat;
struct pattern_config pc;
};

struct pattern_config*
engine_patternplay_get_pc(struct engine *e)
{
struct patternplay *pp = e->data;
return &pp->pc;
}

static void
debug_pattern_best_moves(struct pattern_config *pc, struct board *b, enum stone color,
coord_t *best_c, int nbest)
{
struct ownermap ownermap;
mcowner_playouts_fast(b, color, &ownermap);

fprintf(stderr, "\n");
for (int i = 0; i < nbest; i++) {
struct move m = { .coord = best_c[i], .color = color };
struct pattern p;
pattern_match(pc, &p, b, &m, &ownermap);

char buffer[512]; strbuf_t strbuf;
strbuf_t *buf = strbuf_init(&strbuf, buffer, sizeof(buffer));
dump_gammas(buf, pc, &p);
fprintf(stderr, "%3s gamma %s\n", coord2sstr(m.coord, b), buf->str);
}
fprintf(stderr, "\n");
}


static coord_t
patternplay_genmove(struct engine *e, struct board *b, struct time_info *ti, enum stone color, bool pass_all_alive)
Expand All @@ -28,7 +56,16 @@ 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->pat, b, color, pats, probs);
struct ownermap ownermap;
mcowner_playouts_fast(b, color, &ownermap);
pattern_rate_moves(&pp->pc, b, color, pats, probs, &ownermap);

float best_r[20] = { 0.0, };
coord_t best_c[20];
find_pattern_best_moves(b, probs, best_c, best_r, 20);
print_pattern_best_moves(b, best_c, best_r, 20);
if (pp->debug_level >= 4)
debug_pattern_best_moves(&pp->pc, b, color, best_c, 20);

int best = 0;
for (int f = 0; f < b->flen; f++) {
Expand All @@ -51,10 +88,12 @@ patternplay_best_moves(struct engine *e, struct board *b, struct time_info *ti,

struct pattern pats[b->flen];
floating_t probs[b->flen];
pattern_rate_moves(&pp->pat, b, color, pats, probs);

for (int f = 0; f < b->flen; f++)
best_moves_add(b->f[f], probs[f], best_c, best_r, nbest);
struct ownermap ownermap;
mcowner_playouts_fast(b, color, &ownermap);
pattern_rate_moves(&pp->pc, b, color, pats, probs, &ownermap);

find_pattern_best_moves(b, probs, best_c, best_r, nbest);
print_pattern_best_moves(b, best_c, best_r, nbest);
}

void
Expand All @@ -63,11 +102,13 @@ patternplay_evaluate(struct engine *e, struct board *b, struct time_info *ti, fl
struct patternplay *pp = e->data;

struct pattern pats[b->flen];
pattern_rate_moves(&pp->pat, b, color, pats, vals);
struct ownermap ownermap;
mcowner_playouts_fast(b, color, &ownermap);
pattern_rate_moves(&pp->pc, b, color, pats, vals, &ownermap);

#if 0
// unused variable 'total' in above call to pattern_rate_moves()
floating_t total = pattern_rate_moves(&pp->pat, b, color, pats, vals);
floating_t total = pattern_rate_moves(&pp->pc, b, color, pats, vals);
/* Rescale properly. */
for (int f = 0; f < b->flen; f++) {
probs[f] /= total;
Expand Down Expand Up @@ -111,7 +152,7 @@ patternplay_state_init(char *arg)
pp->debug_level++;

} else if (!strcasecmp(optname, "patterns") && optval) {
patterns_init(&pp->pat, optval, false, true);
patterns_init(&pp->pc, optval, false, true);
pat_setup = true;

} else
Expand All @@ -120,9 +161,9 @@ patternplay_state_init(char *arg)
}

if (!pat_setup)
patterns_init(&pp->pat, NULL, false, true);
patterns_init(&pp->pc, NULL, false, true);

if (!pp->pat.pc.spat_dict || !pp->pat.pd)
if (!using_patterns())
die("Missing spatial dictionary / probtable, aborting.\n");
return pp;
}
Expand Down
1 change: 1 addition & 0 deletions engines/patternplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
#include "engine.h"

struct engine *engine_patternplay_init(char *arg, struct board *b);
struct pattern_config *engine_patternplay_get_pc(struct engine *e);

#endif
118 changes: 118 additions & 0 deletions gogui.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
#include "ownermap.h"
#include "engines/josekibase.h"
#include "uct/uct.h"
#include "pattern.h"
#include "engines/patternplay.h"
#include "patternsp.h"
#include "patternprob.h"

#ifdef DCNN
#include "engines/dcnn.h"
Expand Down Expand Up @@ -52,6 +56,13 @@ cmd_gogui_analyze_commands(struct board *b, struct engine *e, struct time_info *
sbprintf(buf, "gfx/gfx DCNN Ratings/gogui-dcnn_rating\n");
}
#endif
if (!strcmp(e->name, "UCT") && using_patterns()) {
sbprintf(buf, "gfx/gfx Pattern Best Moves/gogui-pattern_best\n");
sbprintf(buf, "gfx/gfx Pattern Color Map/gogui-pattern_colors\n");
sbprintf(buf, "gfx/gfx Pattern Ratings/gogui-pattern_rating\n");
sbprintf(buf, "gfx/gfx Pattern Features/gogui-pattern_features %%p\n");
sbprintf(buf, "gfx/gfx Pattern Gammas/gogui-pattern_gammas %%p\n");
}
if (!strcmp(e->name, "UCT")) {
sbprintf(buf, "gfx/Live gfx = Best Moves/gogui-livegfx best_moves\n");
sbprintf(buf, "gfx/Live gfx = Best Sequence/gogui-livegfx best_seq\n");
Expand Down Expand Up @@ -504,3 +515,110 @@ cmd_gogui_joseki_moves(struct board *b, struct engine *e, struct time_info *ti,
return P_OK;
}
#endif /* JOSEKI */


static struct engine *pattern_engine = NULL;

enum parse_code
cmd_gogui_pattern_best(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp)
{
if (!pattern_engine) pattern_engine = engine_patternplay_init("", b);

enum stone color = S_BLACK;
if (b->last_move.color) color = stone_other(b->last_move.color);

char buffer[10000]; strbuf_t strbuf;
strbuf_t *buf = strbuf_init(&strbuf, buffer, sizeof(buffer));
gogui_best_moves(buf, pattern_engine, b, ti, color, 10, GOGUI_BEST_MOVES, 0);

gtp_reply(gtp, buf->str, NULL);
return P_OK;
}

enum parse_code
cmd_gogui_pattern_colors(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp)
{
if (!pattern_engine) pattern_engine = engine_patternplay_init("", b);

enum stone color = S_BLACK;
if (b->last_move.color) color = stone_other(b->last_move.color);

char buffer[10000]; strbuf_t strbuf;
strbuf_t *buf = strbuf_init(&strbuf, buffer, sizeof(buffer));
gogui_best_moves(buf, pattern_engine, b, ti, color, GOGUI_CANDIDATES, GOGUI_BEST_COLORS, GOGUI_RESCALE_LOG);

gtp_reply(gtp, buf->str, NULL);
return P_OK;
}

enum parse_code
cmd_gogui_pattern_rating(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp)
{
if (!pattern_engine) pattern_engine = engine_patternplay_init("", b);

enum stone color = S_BLACK;
if (b->last_move.color) color = stone_other(b->last_move.color);

char buffer[5000]; strbuf_t strbuf;
strbuf_t *buf = strbuf_init(&strbuf, buffer, sizeof(buffer));
gogui_best_moves(buf, pattern_engine, b, ti, color, GOGUI_CANDIDATES, GOGUI_BEST_WINRATES, 0);

gtp_reply(gtp, buf->str, NULL);
return P_OK;
}

/* Show pattern features on point selected by user. */
enum parse_code
cmd_gogui_pattern_features(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp)
{
if (!pattern_engine) pattern_engine = engine_patternplay_init("", b);

enum stone color = S_BLACK;
if (b->last_move.color) color = stone_other(b->last_move.color);

char *arg; next_tok(arg);
if (!arg) { gtp_error(gtp, "arg missing", NULL); return P_OK; }
coord_t coord = str2coord(arg, board_size(b));
if (board_at(b, coord) != S_NONE) { gtp_reply(gtp, "TEXT Must be empty spot ...", NULL); return P_OK; }

struct ownermap ownermap;
struct pattern p;
struct move m = { .coord = coord, .color = color };
struct pattern_config *pc = engine_patternplay_get_pc(pattern_engine);
mcowner_playouts(b, color, &ownermap);
pattern_match(pc, &p, b, &m, &ownermap);

gtp_reply(gtp, "TEXT ", pattern2sstr(&p), NULL);
return P_OK;
}

/* Show pattern gammas on point selected by user. */
enum parse_code
cmd_gogui_pattern_gammas(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp)
{
if (!pattern_engine) pattern_engine = engine_patternplay_init("", b);

enum stone color = S_BLACK;
if (b->last_move.color) color = stone_other(b->last_move.color);

char *arg; next_tok(arg);
if (!arg) { gtp_error(gtp, "arg missing", NULL); return P_OK; }
coord_t coord = str2coord(arg, board_size(b));
if (board_at(b, coord) != S_NONE) { gtp_reply(gtp, "TEXT Must be empty spot ...", NULL); return P_OK; }

struct ownermap ownermap;
struct pattern p;
struct move m = { .coord = coord, .color = color };
struct pattern_config *pc = engine_patternplay_get_pc(pattern_engine);
mcowner_playouts(b, color, &ownermap);
pattern_match(pc, &p, b, &m, &ownermap);

char buffer[1000]; strbuf_t strbuf;
strbuf_t *buf = strbuf_init(&strbuf, buffer, sizeof(buffer));

sbprintf(buf, "TEXT ");
dump_gammas(buf, pc, &p);

gtp_reply(gtp, buf->str, NULL);
return P_OK;
}
5 changes: 5 additions & 0 deletions gogui.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ enum parse_code cmd_gogui_dcnn_colors(struct board *b, struct engine *e, struct
enum parse_code cmd_gogui_dcnn_rating(struct board *board, struct engine *engine, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_color_palette(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_joseki_moves(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_pattern_best(struct board *board, struct engine *engine, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_pattern_colors(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_pattern_rating(struct board *board, struct engine *engine, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_pattern_features(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp);
enum parse_code cmd_gogui_pattern_gammas(struct board *b, struct engine *e, struct time_info *ti, gtp_t *gtp);


void gogui_show_best_moves(strbuf_t *buf, struct board *b, enum stone color, coord_t *best_c, float *best_r, int n);
Expand Down
5 changes: 5 additions & 0 deletions gtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,11 @@ static gtp_command_t commands[] =
{ "gogui-dcnn_colors", cmd_gogui_dcnn_colors },
{ "gogui-dcnn_rating", cmd_gogui_dcnn_rating },
#endif /* DCNN */
{ "gogui-pattern_best", cmd_gogui_pattern_best },
{ "gogui-pattern_colors", cmd_gogui_pattern_colors },
{ "gogui-pattern_rating", cmd_gogui_pattern_rating },
{ "gogui-pattern_features", cmd_gogui_pattern_features },
{ "gogui-pattern_gammas", cmd_gogui_pattern_gammas },
{ "gogui-color_palette", cmd_gogui_color_palette },

{ 0, 0 }
Expand Down
1 change: 1 addition & 0 deletions gtp.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ enum parse_code gtp_parse(struct board *b, struct engine *e, struct time_info *t
bool gtp_is_valid(struct engine *e, const char *cmd);
void gtp_final_score_str(struct board *board, struct engine *engine, char *reply, int len);
void gtp_reply(gtp_t *gtp, ...);
void gtp_error(gtp_t *gtp, ...);

#define is_gamestart(cmd) (!strcasecmp((cmd), "boardsize"))
#define is_reset(cmd) (is_gamestart(cmd) || !strcasecmp((cmd), "clear_board") || !strcasecmp((cmd), "kgs-rules"))
Expand Down

0 comments on commit edaba3d

Please sign in to comment.