Commit | Line | Data |
---|---|---|
7eeb782e AT |
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 |