Initial commit of GNU Go v3.8.
[sgk-go] / engine / move_reasons.h
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
* 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. *
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* values for move_reason.type */
#define THREAT_BIT 1
/* Only use even values for non-threat move reasons! */
#define ATTACK_MOVE 2
#define ATTACK_MOVE_GOOD_KO 4
#define ATTACK_MOVE_BAD_KO 6
#define ATTACK_THREAT (ATTACK_MOVE | THREAT_BIT)
#define DEFEND_MOVE 8
#define DEFEND_MOVE_GOOD_KO 10
#define DEFEND_MOVE_BAD_KO 12
#define DEFEND_THREAT (DEFEND_MOVE | THREAT_BIT)
#define CONNECT_MOVE 14
#define CUT_MOVE 16
#define SEMEAI_MOVE 18
#define SEMEAI_THREAT (SEMEAI_MOVE | THREAT_BIT)
#define EXPAND_TERRITORY_MOVE 20
#define EXPAND_MOYO_MOVE 22
#define INVASION_MOVE 24
#define OWL_ATTACK_MOVE 26
#define OWL_ATTACK_MOVE_GOOD_KO 28
#define OWL_ATTACK_MOVE_BAD_KO 30
#define OWL_ATTACK_THREAT (OWL_ATTACK_MOVE | THREAT_BIT)
#define OWL_DEFEND_MOVE 32
#define OWL_DEFEND_MOVE_GOOD_KO 34
#define OWL_DEFEND_MOVE_BAD_KO 36
#define OWL_DEFEND_THREAT (OWL_DEFEND_MOVE | THREAT_BIT)
#define OWL_PREVENT_THREAT 38
#define UNCERTAIN_OWL_ATTACK 40
#define UNCERTAIN_OWL_DEFENSE 42
#define STRATEGIC_ATTACK_MOVE 44
#define STRATEGIC_DEFEND_MOVE 46
#define MY_ATARI_ATARI_MOVE 50
#define YOUR_ATARI_ATARI_MOVE 52
#define VITAL_EYE_MOVE 54
#define OWL_ATTACK_MOVE_GAIN 60
#define OWL_DEFEND_MOVE_LOSS 62
#define POTENTIAL_SEMEAI_ATTACK 64
#define POTENTIAL_SEMEAI_DEFENSE 66
#define ANTISUJI_MOVE 70
#define EITHER_MOVE 100
#define ALL_MOVE 102
/* Bitmap values for move_reason.status */
#define ACTIVE 0
#define TERRITORY_REDUNDANT 1
#define STRATEGICALLY_REDUNDANT 2
#define REDUNDANT (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT)
#define SECONDARY 4
#define MAX_REASONS 120
#define MAX_TRACE_LENGTH 160
#define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD
struct move_reason {
int type; /* e.g. attack, defend, or connect */
int what; /* pointer into list of strings, list of pair of dragons,
or similar */
int status; /* This is a bitmap to mark redundant or secondary
move reasons. */
};
struct move_data {
float value; /* total comparison value, computed at the very end */
float final_value; /* value after point redistribution. */
float additional_ko_value; /* Additional threat value if ko fight going on.*/
float territorial_value; /* Value in terms of actual profit. */
float strategical_value; /* Value with respect to strength, weakness, and
safety of all groups on the board. */
float maxpos_shape; /* Maximal positive contribution to shape */
float maxneg_shape; /* Maximal negative contribution to shape */
int numpos_shape; /* Number of positive contributions to shape */
int numneg_shape; /* Number of negative contributions to shape */
float followup_value; /* Value of followup move (our sente). */
float influence_followup_value; /* Followup value of move as reported by
experimental influence. */
float reverse_followup_value; /* Value of opponents followup move
(reverse sente). */
float secondary_value; /* Secondary move value. */
float min_value; /* Minimum allowed value for the move. */
float max_value; /* Maximum allowed value for the move. */
float min_territory; /* Minimum territorial value. */
float max_territory; /* Maximum territorial value. */
float randomness_scaling; /* Increase to randomize this move. */
int reason[MAX_REASONS]; /* List of reasons for a move. */
int move_safety; /* Whether the move seems safe. */
int worthwhile_threat; /* Play this move as a pure threat. */
float random_number; /* Random number connected to this move. */
};
/*
* Some sizes.
*
* FIXME: Many of these could be optimized more for size (e.g. MAX_EYES)
*/
#define MAX_MOVE_REASONS 1000
#define MAX_WORMS 2*MAX_BOARD*MAX_BOARD/3
#define MAX_DRAGONS MAX_WORMS
#define MAX_CONNECTIONS 4*MAX_WORMS
#define MAX_POTENTIAL_SEMEAI 50
#define MAX_EYES MAX_BOARD*MAX_BOARD/2
#define MAX_LUNCHES MAX_WORMS
#define MAX_EITHER 100
#define MAX_ALL 100
#define MAX_ATTACK_THREATS 6
extern struct move_data move[BOARDMAX];
extern struct move_reason move_reasons[MAX_MOVE_REASONS];
extern int next_reason;
/* Connections */
extern int conn_worm1[MAX_CONNECTIONS];
extern int conn_worm2[MAX_CONNECTIONS];
extern int next_connection;
extern int semeai_target1[MAX_POTENTIAL_SEMEAI];
extern int semeai_target2[MAX_POTENTIAL_SEMEAI];
/* Unordered sets (currently pairs) of move reasons / targets */
typedef struct {
int reason1;
int what1;
int reason2;
int what2;
} Reason_set;
extern Reason_set either_data[MAX_EITHER];
extern int next_either;
extern Reason_set all_data[MAX_ALL];
extern int next_all;
/* Eye shapes */
extern int eyes[MAX_EYES];
extern int eyecolor[MAX_EYES];
extern int next_eye;
/* Lunches */
extern int lunch_dragon[MAX_LUNCHES]; /* eater */
extern int lunch_worm[MAX_LUNCHES]; /* food */
extern int next_lunch;
/* Point redistribution */
extern int replacement_map[BOARDMAX];
/* The color for which we are evaluating moves. */
extern int current_color;
int find_worm(int str);
int find_dragon(int str);
int move_reason_known(int pos, int type, int what);
int attack_move_reason_known(int pos, int what);
int defense_move_reason_known(int pos, int what);
int owl_attack_move_reason_known(int pos, int what);
int owl_defense_move_reason_known(int pos, int what);
int owl_move_reason_known(int pos, int what);
int semeai_move_reason_known(int pos, int what);
int get_biggest_owl_target(int pos);
int is_antisuji_move(int pos);
void discard_redundant_move_reasons(int pos);
void mark_changed_dragon(int pos, int color, int affected, int affected2,
int move_reason_type,
signed char safe_stones[BOARDMAX],
float strength[BOARDMAX], float *effective_size);
void mark_changed_string(int affected, signed char changed_stones[BOARDMAX],
float strength[BOARDMAX], signed char new_status);
int adjacent_to_nondead_stone(int pos, int color);
int find_connection(int worm1, int worm2);
/*
* Local Variables:
* tab-width: 8
* c-basic-offset: 2
* End:
*/