pachi_py/pachi/uct/internal.h (137 lines of code) (raw):

#ifndef PACHI_UCT_INTERNAL_H #define PACHI_UCT_INTERNAL_H /* Internal UCT structures */ #include "debug.h" #include "move.h" #include "ownermap.h" #include "pattern.h" #include "patternsp.h" #include "patternprob.h" #include "playout.h" #include "stats.h" struct tree; struct tree_node; struct uct_policy; struct uct_prior; struct uct_dynkomi; struct uct_pluginset; struct joseki_dict; /* How big proportion of ownermap counts must be of one color to consider * the point sure. */ #define GJ_THRES 0.8 /* How many games to consider at minimum before judging groups. */ #define GJ_MINGAMES 500 /* Internal engine state. */ struct uct { int debug_level; enum uct_reporting { UR_TEXT, UR_JSON, UR_JSON_BIG, } reporting; int reportfreq; int games, gamelen; floating_t resign_threshold, sure_win_threshold; double best2_ratio, bestr_ratio; floating_t max_maintime_ratio; bool pass_all_alive; /* Current value */ bool allow_losing_pass; bool territory_scoring; int expand_p; bool playout_amaf; bool amaf_prior; int playout_amaf_cutoff; double dumpthres; int force_seed; bool no_tbook; bool fast_alloc; unsigned long max_tree_size; unsigned long max_pruned_size; unsigned long pruning_threshold; int mercymin; int significant_threshold; int threads; enum uct_thread_model { TM_TREE, /* Tree parallelization w/o virtual loss. */ TM_TREEVL, /* Tree parallelization with virtual loss. */ } thread_model; int virtual_loss; bool pondering_opt; /* User wants pondering */ bool pondering; /* Actually pondering now */ bool slave; /* Act as slave in distributed engine. */ int max_slaves; /* Optional, -1 if not set */ int slave_index; /* 0..max_slaves-1, or -1 if not set */ enum stone my_color; int fuseki_end; int yose_start; int dynkomi_mask; int dynkomi_interval; struct uct_dynkomi *dynkomi; floating_t initial_extra_komi; floating_t val_scale; int val_points; bool val_extra; bool val_byavg; bool val_bytemp; floating_t val_bytemp_min; int random_policy_chance; bool local_tree; int tenuki_d; floating_t local_tree_aging; #define LTREE_PLAYOUTS_MULTIPLIER 100 floating_t local_tree_depth_decay; bool local_tree_allseq; bool local_tree_neival; enum { LTE_ROOT, LTE_EACH, LTE_TOTAL, } local_tree_eval; bool local_tree_rootchoose; struct { int level; int playouts; } debug_after; char *banner; struct uct_policy *policy; struct uct_policy *random_policy; struct playout_policy *playout; struct uct_prior *prior; struct uct_pluginset *plugins; struct joseki_dict *jdict; struct pattern_setup pat; /* Various modules (prior, policy, ...) set this if they want pattern * database to be loaded. */ bool want_pat; /* Used within frame of single genmove. */ struct board_ownermap ownermap; /* Used for coordination among slaves of the distributed engine. */ int stats_hbits; int shared_nodes; int shared_levels; double stats_delay; /* stored in seconds */ int played_own; int played_all; /* games played by all slaves */ /* Game state - maintained by setup_state(), reset_state(). */ struct tree *t; }; #define UDEBUGL(n) DEBUGL_(u->debug_level, n) bool uct_pass_is_safe(struct uct *u, struct board *b, enum stone color, bool pass_all_alive); void uct_prepare_move(struct uct *u, struct board *b, enum stone color); void uct_genmove_setup(struct uct *u, struct board *b, enum stone color); void uct_pondering_stop(struct uct *u); /* This is the state used for descending the tree; we use this wrapper * structure in order to be able to easily descend in multiple trees * in parallel (e.g. main tree and local tree) or compute cummulative * "path value" throughout the tree descent. */ struct uct_descent { /* Active tree nodes: */ struct tree_node *node; /* Main tree. */ struct tree_node *lnode; /* Local tree. */ /* Value of main tree node (with all value factors, but unbiased * - without exploration factor), from black's perspective. */ struct move_stats value; }; typedef struct tree_node *(*uctp_choose)(struct uct_policy *p, struct tree_node *node, struct board *b, enum stone color, coord_t exclude); typedef floating_t (*uctp_evaluate)(struct uct_policy *p, struct tree *tree, struct uct_descent *descent, int parity); typedef void (*uctp_descend)(struct uct_policy *p, struct tree *tree, struct uct_descent *descent, int parity, bool allow_pass); typedef void (*uctp_winner)(struct uct_policy *p, struct tree *tree, struct uct_descent *descent); typedef void (*uctp_prior)(struct uct_policy *p, struct tree *tree, struct tree_node *node, struct board *b, enum stone color, int parity); typedef void (*uctp_update)(struct uct_policy *p, struct tree *tree, struct tree_node *node, enum stone node_color, enum stone player_color, struct playout_amafmap *amaf, struct board *final_board, floating_t result); typedef void (*uctp_done)(struct uct_policy *p); struct uct_policy { struct uct *uct; uctp_choose choose; uctp_winner winner; uctp_evaluate evaluate; uctp_descend descend; uctp_update update; uctp_prior prior; uctp_done done; bool wants_amaf; void *data; }; #endif