| 1 | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ |
| 2 | * This is GNU Go, a Go program. Contact gnugo@gnu.org, or see * |
| 3 | * http://www.gnu.org/software/gnugo/ for more information. * |
| 4 | * * |
| 5 | * Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, * |
| 6 | * 2008 and 2009 by the Free Software Foundation. * |
| 7 | * * |
| 8 | * This program is free software; you can redistribute it and/or * |
| 9 | * modify it under the terms of the GNU General Public License as * |
| 10 | * published by the Free Software Foundation - version 3 or * |
| 11 | * (at your option) any later version. * |
| 12 | * * |
| 13 | * This program is distributed in the hope that it will be useful, * |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
| 16 | * GNU General Public License in file COPYING for more details. * |
| 17 | * * |
| 18 | * You should have received a copy of the GNU General Public * |
| 19 | * License along with this program; if not, write to the Free * |
| 20 | * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * |
| 21 | * Boston, MA 02111, USA. * |
| 22 | \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| 23 | |
| 24 | /* values for move_reason.type */ |
| 25 | #define THREAT_BIT 1 |
| 26 | |
| 27 | /* Only use even values for non-threat move reasons! */ |
| 28 | #define ATTACK_MOVE 2 |
| 29 | #define ATTACK_MOVE_GOOD_KO 4 |
| 30 | #define ATTACK_MOVE_BAD_KO 6 |
| 31 | #define ATTACK_THREAT (ATTACK_MOVE | THREAT_BIT) |
| 32 | #define DEFEND_MOVE 8 |
| 33 | #define DEFEND_MOVE_GOOD_KO 10 |
| 34 | #define DEFEND_MOVE_BAD_KO 12 |
| 35 | #define DEFEND_THREAT (DEFEND_MOVE | THREAT_BIT) |
| 36 | |
| 37 | #define CONNECT_MOVE 14 |
| 38 | #define CUT_MOVE 16 |
| 39 | |
| 40 | #define SEMEAI_MOVE 18 |
| 41 | #define SEMEAI_THREAT (SEMEAI_MOVE | THREAT_BIT) |
| 42 | |
| 43 | #define EXPAND_TERRITORY_MOVE 20 |
| 44 | #define EXPAND_MOYO_MOVE 22 |
| 45 | #define INVASION_MOVE 24 |
| 46 | |
| 47 | #define OWL_ATTACK_MOVE 26 |
| 48 | #define OWL_ATTACK_MOVE_GOOD_KO 28 |
| 49 | #define OWL_ATTACK_MOVE_BAD_KO 30 |
| 50 | #define OWL_ATTACK_THREAT (OWL_ATTACK_MOVE | THREAT_BIT) |
| 51 | #define OWL_DEFEND_MOVE 32 |
| 52 | #define OWL_DEFEND_MOVE_GOOD_KO 34 |
| 53 | #define OWL_DEFEND_MOVE_BAD_KO 36 |
| 54 | #define OWL_DEFEND_THREAT (OWL_DEFEND_MOVE | THREAT_BIT) |
| 55 | #define OWL_PREVENT_THREAT 38 |
| 56 | #define UNCERTAIN_OWL_ATTACK 40 |
| 57 | #define UNCERTAIN_OWL_DEFENSE 42 |
| 58 | #define STRATEGIC_ATTACK_MOVE 44 |
| 59 | #define STRATEGIC_DEFEND_MOVE 46 |
| 60 | |
| 61 | #define MY_ATARI_ATARI_MOVE 50 |
| 62 | #define YOUR_ATARI_ATARI_MOVE 52 |
| 63 | #define VITAL_EYE_MOVE 54 |
| 64 | |
| 65 | #define OWL_ATTACK_MOVE_GAIN 60 |
| 66 | #define OWL_DEFEND_MOVE_LOSS 62 |
| 67 | #define POTENTIAL_SEMEAI_ATTACK 64 |
| 68 | #define POTENTIAL_SEMEAI_DEFENSE 66 |
| 69 | |
| 70 | #define ANTISUJI_MOVE 70 |
| 71 | |
| 72 | #define EITHER_MOVE 100 |
| 73 | #define ALL_MOVE 102 |
| 74 | |
| 75 | |
| 76 | /* Bitmap values for move_reason.status */ |
| 77 | #define ACTIVE 0 |
| 78 | #define TERRITORY_REDUNDANT 1 |
| 79 | #define STRATEGICALLY_REDUNDANT 2 |
| 80 | #define REDUNDANT (TERRITORY_REDUNDANT | STRATEGICALLY_REDUNDANT) |
| 81 | #define SECONDARY 4 |
| 82 | |
| 83 | #define MAX_REASONS 120 |
| 84 | |
| 85 | #define MAX_TRACE_LENGTH 160 |
| 86 | |
| 87 | #define HUGE_MOVE_VALUE 10.0*MAX_BOARD*MAX_BOARD |
| 88 | |
| 89 | struct move_reason { |
| 90 | int type; /* e.g. attack, defend, or connect */ |
| 91 | int what; /* pointer into list of strings, list of pair of dragons, |
| 92 | or similar */ |
| 93 | int status; /* This is a bitmap to mark redundant or secondary |
| 94 | move reasons. */ |
| 95 | }; |
| 96 | |
| 97 | struct move_data { |
| 98 | float value; /* total comparison value, computed at the very end */ |
| 99 | float final_value; /* value after point redistribution. */ |
| 100 | float additional_ko_value; /* Additional threat value if ko fight going on.*/ |
| 101 | |
| 102 | float territorial_value; /* Value in terms of actual profit. */ |
| 103 | float strategical_value; /* Value with respect to strength, weakness, and |
| 104 | safety of all groups on the board. */ |
| 105 | |
| 106 | float maxpos_shape; /* Maximal positive contribution to shape */ |
| 107 | float maxneg_shape; /* Maximal negative contribution to shape */ |
| 108 | int numpos_shape; /* Number of positive contributions to shape */ |
| 109 | int numneg_shape; /* Number of negative contributions to shape */ |
| 110 | |
| 111 | float followup_value; /* Value of followup move (our sente). */ |
| 112 | float influence_followup_value; /* Followup value of move as reported by |
| 113 | experimental influence. */ |
| 114 | float reverse_followup_value; /* Value of opponents followup move |
| 115 | (reverse sente). */ |
| 116 | float secondary_value; /* Secondary move value. */ |
| 117 | float min_value; /* Minimum allowed value for the move. */ |
| 118 | float max_value; /* Maximum allowed value for the move. */ |
| 119 | float min_territory; /* Minimum territorial value. */ |
| 120 | float max_territory; /* Maximum territorial value. */ |
| 121 | float randomness_scaling; /* Increase to randomize this move. */ |
| 122 | |
| 123 | int reason[MAX_REASONS]; /* List of reasons for a move. */ |
| 124 | int move_safety; /* Whether the move seems safe. */ |
| 125 | int worthwhile_threat; /* Play this move as a pure threat. */ |
| 126 | float random_number; /* Random number connected to this move. */ |
| 127 | }; |
| 128 | |
| 129 | |
| 130 | |
| 131 | /* |
| 132 | * Some sizes. |
| 133 | * |
| 134 | * FIXME: Many of these could be optimized more for size (e.g. MAX_EYES) |
| 135 | */ |
| 136 | |
| 137 | #define MAX_MOVE_REASONS 1000 |
| 138 | #define MAX_WORMS 2*MAX_BOARD*MAX_BOARD/3 |
| 139 | #define MAX_DRAGONS MAX_WORMS |
| 140 | #define MAX_CONNECTIONS 4*MAX_WORMS |
| 141 | #define MAX_POTENTIAL_SEMEAI 50 |
| 142 | #define MAX_EYES MAX_BOARD*MAX_BOARD/2 |
| 143 | #define MAX_LUNCHES MAX_WORMS |
| 144 | #define MAX_EITHER 100 |
| 145 | #define MAX_ALL 100 |
| 146 | #define MAX_ATTACK_THREATS 6 |
| 147 | |
| 148 | |
| 149 | extern struct move_data move[BOARDMAX]; |
| 150 | extern struct move_reason move_reasons[MAX_MOVE_REASONS]; |
| 151 | extern int next_reason; |
| 152 | |
| 153 | /* Connections */ |
| 154 | extern int conn_worm1[MAX_CONNECTIONS]; |
| 155 | extern int conn_worm2[MAX_CONNECTIONS]; |
| 156 | extern int next_connection; |
| 157 | |
| 158 | extern int semeai_target1[MAX_POTENTIAL_SEMEAI]; |
| 159 | extern int semeai_target2[MAX_POTENTIAL_SEMEAI]; |
| 160 | |
| 161 | /* Unordered sets (currently pairs) of move reasons / targets */ |
| 162 | typedef struct { |
| 163 | int reason1; |
| 164 | int what1; |
| 165 | int reason2; |
| 166 | int what2; |
| 167 | } Reason_set; |
| 168 | extern Reason_set either_data[MAX_EITHER]; |
| 169 | extern int next_either; |
| 170 | extern Reason_set all_data[MAX_ALL]; |
| 171 | extern int next_all; |
| 172 | |
| 173 | /* Eye shapes */ |
| 174 | extern int eyes[MAX_EYES]; |
| 175 | extern int eyecolor[MAX_EYES]; |
| 176 | extern int next_eye; |
| 177 | |
| 178 | /* Lunches */ |
| 179 | extern int lunch_dragon[MAX_LUNCHES]; /* eater */ |
| 180 | extern int lunch_worm[MAX_LUNCHES]; /* food */ |
| 181 | extern int next_lunch; |
| 182 | |
| 183 | /* Point redistribution */ |
| 184 | extern int replacement_map[BOARDMAX]; |
| 185 | |
| 186 | /* The color for which we are evaluating moves. */ |
| 187 | extern int current_color; |
| 188 | |
| 189 | int find_worm(int str); |
| 190 | int find_dragon(int str); |
| 191 | |
| 192 | int move_reason_known(int pos, int type, int what); |
| 193 | int attack_move_reason_known(int pos, int what); |
| 194 | int defense_move_reason_known(int pos, int what); |
| 195 | int owl_attack_move_reason_known(int pos, int what); |
| 196 | int owl_defense_move_reason_known(int pos, int what); |
| 197 | int owl_move_reason_known(int pos, int what); |
| 198 | int semeai_move_reason_known(int pos, int what); |
| 199 | int get_biggest_owl_target(int pos); |
| 200 | int is_antisuji_move(int pos); |
| 201 | |
| 202 | void discard_redundant_move_reasons(int pos); |
| 203 | |
| 204 | void mark_changed_dragon(int pos, int color, int affected, int affected2, |
| 205 | int move_reason_type, |
| 206 | signed char safe_stones[BOARDMAX], |
| 207 | float strength[BOARDMAX], float *effective_size); |
| 208 | void mark_changed_string(int affected, signed char changed_stones[BOARDMAX], |
| 209 | float strength[BOARDMAX], signed char new_status); |
| 210 | int adjacent_to_nondead_stone(int pos, int color); |
| 211 | |
| 212 | int find_connection(int worm1, int worm2); |
| 213 | |
| 214 | /* |
| 215 | * Local Variables: |
| 216 | * tab-width: 8 |
| 217 | * c-basic-offset: 2 |
| 218 | * End: |
| 219 | */ |
| 220 | |