1 #include "phalanx.h"
2
3 #ifndef REHASH
4 # define REHASH 3
5 #endif
6
7 thashentry *HT;
8 unsigned SizeHT = 70000;
9 unsigned Age = 0;
10
11 /**
12 *** 16-bit-int representation of move. To be used in the binary
13 *** opening book and hash table.
14 **/
smove(tmove * m)15 unsigned smove(tmove *m)
16 {
17 unsigned sm;
18 sm = ( m->from << 8 );
19 if( m->special ) return sm | m->special;
20 sm |= m->to;
21 if( m->in1 != m->in2a ) switch( m->in2a )
22 { case WQ: sm -= 10; break; case BQ: sm += 10; break;
23 case WR: sm -= 20; break; case BR: sm += 20; break;
24 case WB: sm -= 30; break; case BB: sm += 30; break;
25 case WN: sm -= 40; break; case BN: sm += 40; break;
26 }
27 return sm;
28 }
29
30
seekHT(void)31 thashentry *seekHT(void)
32 {
33 register int i;
34 register thashentry *t;
35
36 for( i=0; i!=REHASH; i++ )
37 {
38 t = HT + ( G[Counter].hashboard + i ) % SizeHT;
39 if( G[Counter].hashboard == t->hashboard ) return t;
40 }
41
42 return NULL;
43 }
44
45
46
47 /************************************************************
48 * We need a good replacement strategy!
49 * Good cells to replace:
50 * 1) empty (not used) or cell with the same board
51 * 2) cell stored at previous search
52 * 3) cell that stores results computed at a low depth
53 *********************************************************/
writeHT(int value,int Alpha,int Beta)54 void writeHT( int value, int Alpha, int Beta )
55 {
56 register int i;
57 register thashentry *t;
58 register thashentry *best = NULL;
59 tmove *m = & PV[Ply][Ply];
60
61 /* First pass: look for the same board or an empty cell */
62 for( i=0; i!=REHASH; i++ )
63 {
64 t = HT + ( G[Counter].hashboard + i ) % SizeHT;
65 if( G[Counter].hashboard == t->hashboard
66 || t->hashboard == 0 ) { best = t; break; }
67 }
68
69 /* Second pass: look for an oldest-aged cell */
70 if( best == NULL )
71 for( i=0; i!=REHASH; i++ )
72 {
73 t = HT + ( G[Counter].hashboard + i ) % SizeHT;
74 if( t->age < Age && ( best==NULL || best->age > t->age ) ) best = t;
75 }
76
77 /* Third pass: look for a cell with least depth */
78 if( best == NULL )
79 for( i=0; i!=REHASH; i++ )
80 {
81 t = HT + ( G[Counter].hashboard + i ) % SizeHT;
82 if( best==NULL || best->depth > t->depth ) best = t;
83 }
84
85 /* Checkmate score must be adjusted moves to be counted from
86 * here rather than from the root position */
87 if( value > CHECKMATE-100 ) best->value = value+Ply;
88 else if( value < -CHECKMATE+100 ) best->value = value-Ply;
89 else best->value = value;
90
91 if( value <= Alpha ) best->result = alpha_cut;
92 else
93 if( value >= Beta ) best->result = beta_cut;
94 else
95 best->result = no_cut;
96
97 /* alpha_cut brings no killer information */
98 if( best->result != alpha_cut ) best->move = smove(m);
99 else if( best->hashboard != G[Counter].hashboard ) best->move = 0;
100
101 best->hashboard = G[Counter].hashboard;
102 best->age = Age;
103 best->depth = Depth;
104
105 }
106
107
108
109 /*
110 * Full recomputation of hash board.
111 */
hashboard(void)112 unsigned hashboard(void)
113 {
114
115 register int i;
116 unsigned result = 0;
117 for ( i=A1; i!=H9; i++ ) if ( B[i] != 3 && B[i] != 0 )
118 {
119 /*
120 int square = i%10-1 + 8*(i/10-2);
121 int piece = B[i];
122 piece = piece/8 - ( color(piece)==WHITE ? 1 : 2 );
123 */
124 result ^= H[ HP[ B[i] ] ][ HS[i] ];
125 }
126
127 if( Color == BLACK ) result ^= HASH_COLOR;
128
129 #undef debug
130 #ifdef debug
131 /* just showing the result */
132 printf ("Debug: Hashboard = %08X\n",result);
133 printf ("Hit ENTER to continue "); getchar();
134 #endif
135
136 return result;
137 }
138
139
140
141
142
143 /********************************************************
144 * The rest contains random numbers
145 * to be used for hashing.
146 ********************************************************/
147
148 unsigned H[12][64]=
149 {
150 {
151 0x8C78407C, 0xC3667B4A, 0x22AD4CED, 0x0BCAE627,
152 0x5BE2A9A3, 0xC4940655, 0x274C9DCB, 0xB55EB368,
153 0xE6C71E6E, 0x9A9E7EEE, 0xC425FD27, 0xCC007EED,
154 0x476192E5, 0x89E3D3A5, 0xEA78FAFB, 0x27665BD0,
155 0x9E46E105, 0xCD8B82C2, 0x2EA87ABA, 0x54462C94,
156 0xB3449DD5, 0x42666A5D, 0x3F657968, 0x4DCF2DE5,
157 0x09290438, 0x3E95D957, 0xD2E53D4F, 0x8E16CDF2,
158 0xCE6DFEA2, 0x75640BA3, 0xED9F39A4, 0x3AC65C2C,
159 0xBBDD20E3, 0x98132489, 0x5F7FBA11, 0x28C05E8D,
160 0x930D52BE, 0x5B21D077, 0x09710190, 0x0D45D752,
161 0x645D0413, 0x2E22DBD7, 0xA1B7583F, 0x37034473,
162 0xA247F1CA, 0x6DFBBAF5, 0x45389FEF, 0xF841DCB1,
163 0x7040F197, 0xEF9CE22F, 0xF775B834, 0x9AA89DA4,
164 0x8D53D2F0, 0x379D964D, 0x1D29DAB7, 0xD9507BBF,
165 0x9670F36B, 0x459B60B9, 0x99A710A3, 0x3BF21F7E,
166 0x0813320E, 0xFD99DBF7, 0x32CCF151, 0x6FDD5C05
167 },
168
169 {
170 0xF31F74FC, 0x5B939226, 0xD9D53A93, 0x3A273431,
171 0xEF296980, 0xF5412E1B, 0x4DF02F5B, 0xA4179950,
172 0x731CCC54, 0x4FF36FB0, 0x68459C3C, 0xD6B84245,
173 0x3B3C6C3F, 0x6D697176, 0xE9FBDA0D, 0xA03D888C,
174 0x4909A463, 0xAD14FFCF, 0x505ED35C, 0xC21FC657,
175 0x3DC31765, 0x92AAC442, 0xD341CC0F, 0x6C5BBAB1,
176 0xB8502A8B, 0x18A67A16, 0x8E2EB8B1, 0x78ACCA56,
177 0xD9A341F6, 0xE72BD561, 0x889A3CE9, 0xAE76C9C2,
178 0x8AE93753, 0xF9A98412, 0x933EF928, 0x3314A922,
179 0xF279492F, 0x4AE1499F, 0x1A1F4A53, 0x4B2BDD5B,
180 0x1FC5C7E7, 0x1EEAB635, 0xE9190AFA, 0x1B05337B,
181 0x78DC1ECF, 0xD07AD6A0, 0xC98650B7, 0xA7FFB330,
182 0x4EBA9C85, 0xD99CE128, 0xBC94E705, 0x4E829926,
183 0xA84ED58B, 0x874DD802, 0xF47628A3, 0x9CA58BB0,
184 0x0FA76581, 0xCC490CAC, 0xC391C24C, 0xA1DF2A2B,
185 0x038FCCBD, 0xFCD97DA4, 0xADE39237, 0xA004F9FF
186 },
187
188 {
189 0x50EC499A, 0x57244DD1, 0x989DAB7C, 0x39943899,
190 0x0506EA3E, 0x62B98D9F, 0xD2602F70, 0x9BFB7CC1,
191 0x7E1DEC6D, 0xEA1614B0, 0x9A47DAB5, 0x2863A26D,
192 0x2E177B72, 0xDABC13E1, 0xE61AB6C9, 0x18D42B25,
193 0xCA795ACC, 0x664E849D, 0x9B597A60, 0x73F03242,
194 0xCB576344, 0x31253FEB, 0x173CE93B, 0x5E7238CA,
195 0xC0521EF1, 0x67767816, 0xF8F0AB0C, 0x860D3784,
196 0xE86BB2C3, 0x4754DDC7, 0x4E013AA1, 0xDC7E3630,
197 0xD7FA7EF2, 0x3ED76494, 0x897DF05F, 0xAF6D0BAF,
198 0xDF277D17, 0xD73D7EB6, 0xCE29640A, 0x1556B57A,
199 0x4CE3D7A2, 0xA0AA143B, 0x4E7036D0, 0x18FE8ABC,
200 0x3E8E47D1, 0xB42C78FD, 0x56516DC9, 0x6A2366E0,
201 0x454863EE, 0xEADC1C32, 0x06FDF69B, 0xBDC94E8B,
202 0x54144F7D, 0x454E3D51, 0x459683C2, 0xB55F7DBB,
203 0x1FAAFFB0, 0x097045AF, 0xEC1A0D56, 0x499B69A1,
204 0xE8B4269A, 0x78FA53DA, 0xFA3F866C, 0x36FAB278
205 },
206
207 {
208 0x9A348CF3, 0xDE7E448B, 0xCF27554C, 0x2CFA638F,
209 0xCEA9243C, 0x27E2BB7E, 0x997E6C9E, 0x7EA514B9,
210 0xA8B716B9, 0x45E49D60, 0xF1FC5321, 0xA937BCF5,
211 0xC496971C, 0xC4B80B3B, 0x3206D1FB, 0x5670616B,
212 0xCA2DB3C3, 0x01EAFE8A, 0xBD174755, 0x0DD3D042,
213 0xB8591C80, 0x15B6F0FB, 0x23D3A6F7, 0x1DE910AA,
214 0x2F1A056A, 0x9714E13A, 0x0F17DE0E, 0xC8C48954,
215 0xE75A5034, 0x32D7A560, 0x72CB9C52, 0x62794B32,
216 0x98DE2EEE, 0x1140E617, 0x4CC1C405, 0x2C319BB2,
217 0x622AF9E9, 0x9D6ECA20, 0x7DD528A7, 0x6272DA54,
218 0x0EDBCF46, 0x4911DD6E, 0x89D4673F, 0x171F78B4,
219 0xBF20922B, 0xEB4FF37A, 0x069DF251, 0x377C8E42,
220 0xE5892067, 0x77FF3A2C, 0x9E4B9142, 0xAEED36BC,
221 0xD27C3989, 0xC01C2F8C, 0x59127E91, 0x214F868E,
222 0x0945B82A, 0x797203E6, 0xE3F125DF, 0x2A7FD03D,
223 0xC3E5D603, 0xF7CB6AAA, 0xCDD12B04, 0x8669DBCC
224 },
225
226 {
227 0x69590D31, 0x16D9B0F1, 0x674B7BF3, 0xD76F69A7,
228 0xA66766B1, 0x7FEF1874, 0xF5B204C3, 0xDF548D7F,
229 0x41167C52, 0x321D609E, 0xAB6ED1D7, 0x027178D4,
230 0x89ADF27B, 0xB8E2B6DF, 0x19F76ABE, 0x41F7A411,
231 0xBD30CD84, 0x55D73E2E, 0x9EA86CD3, 0x4E3C73E9,
232 0xCD75DF37, 0x4C8180FE, 0xD90E1CD1, 0xD183DA5E,
233 0x52103498, 0x7A924A14, 0x74343213, 0x3EDC35CC,
234 0x63E7DD1C, 0x65364446, 0x05861C2B, 0xF2C67748,
235 0x2F58E1BB, 0x276DF71B, 0xA249122A, 0x67F0928B,
236 0x5E03001C, 0xEB9A0419, 0x9499CF06, 0xC6442C17,
237 0x983FE628, 0x2A7EF798, 0xB8306B58, 0xC10B4767,
238 0xA1EF9EBB, 0x5DA508B0, 0xE0698489, 0x502E2166,
239 0x1C0203E1, 0xED070148, 0x2FC4485E, 0x6FE5BB03,
240 0x426D5037, 0xC8B4F020, 0x029AEF51, 0xA3A66A3C,
241 0x5C117F3A, 0x14068942, 0x56DDD16C, 0xA7026955,
242 0xCB6BA5CE, 0xEB30E20B, 0x14EFDCEA, 0xB0E615EC
243 },
244
245 {
246 0x5DEDF0A4, 0xB7D958A1, 0x5DE41621, 0xE6451281,
247 0x8988FBAB, 0xFFA12EF9, 0x4DD994BF, 0xB5AEA3D8,
248 0x45FD3758, 0x43552D82, 0xC63614C0, 0x4BB63A8E,
249 0x7E4FF025, 0xF1F1A3C4, 0x4363B994, 0x371DBCE8,
250 0x3BFFCA9C, 0x11A2FF9B, 0x5A694E9A, 0x033069E0,
251 0xF2E4CF8F, 0x5002250D, 0xE7911156, 0xAC1E0C0C,
252 0x4883A403, 0xF394E56E, 0x906FEE65, 0x66C4C893,
253 0x0DD9FCB5, 0x9347DDBB, 0x84E0477A, 0x087CD416,
254 0x8898C22D, 0x17030492, 0x290AEEE5, 0xD6E170C9,
255 0xCA1C9885, 0x7FCCCC08, 0x2E895D9F, 0x4D73C332,
256 0x0AB56CF9, 0x9F73F163, 0x2DC27FE5, 0xF917D52F,
257 0x0E965189, 0x124514A6, 0x3F504E11, 0x9F1EB4D9,
258 0x2D48917A, 0x7B9A80CE, 0xB19B3D07, 0xCD79E55F,
259 0x2EA71B3A, 0x365A6F84, 0x1CB15057, 0x72F0011C,
260 0xC049EB75, 0xE621EFBE, 0x842D9DBF, 0xA704E426,
261 0x9FE20D6E, 0x98524416, 0x3ECC79FC, 0x3B05F6A7
262 },
263
264 {
265 0xB57B6D79, 0xD3DD2098, 0xAB159E6E, 0xDA63753B,
266 0x34C873EB, 0xFB55B708, 0x34CFFA24, 0x2D689DD9,
267 0x5F6A63FB, 0xAC862A1F, 0x111E4467, 0x6DDD5404,
268 0x20712442, 0xA291C35C, 0xF7C0C840, 0xF8B099AA,
269 0x2B428B60, 0xFC684FEB, 0x3DDE74F5, 0xD8101CD5,
270 0x0196DDC4, 0x2CF3F64F, 0x3927252D, 0x79FBDCDD,
271 0xE8555194, 0xA6B45FE7, 0x77355E02, 0xF007DC63,
272 0x1F01EAE1, 0x050B036D, 0x5B128D46, 0x0713409F,
273 0x4732CB7B, 0x00CF5262, 0x873B3BF5, 0x29CB2119,
274 0x9B1F6CEC, 0xC5F09BC5, 0xACFADC7B, 0x9AF997FE,
275 0xF3A80F72, 0x9AD8566A, 0x3A5846E4, 0xCE9957E7,
276 0x5A773A0D, 0x64D9DC1B, 0x14137768, 0xD5E2149D,
277 0xE11FAC72, 0xF141CB01, 0xD1DA5AC4, 0x876D6DF4,
278 0x3DA52A20, 0x79A1A38C, 0x52A8D32D, 0x4818FC2D,
279 0x72474A4D, 0x38C45617, 0x792ADBE2, 0x543EB6AF,
280 0xC967585B, 0xB9A99FB9, 0xB96BEAD2, 0x9DBF4552
281 },
282
283 {
284 0x5F126D87, 0x209590FA, 0x90ED9298, 0xC5933CFC,
285 0xB1526FC5, 0x566FA246, 0x6F57234A, 0xFE0DA29C,
286 0x688DD003, 0xB35FDCFE, 0xD0046D83, 0x92277A7D,
287 0x6488800B, 0x15C8319F, 0x7449411C, 0xE1C619C5,
288 0x7A01905B, 0x19C28E70, 0xAA8C6CA1, 0xE016E8A3,
289 0x91BF3060, 0x6AD8A4BD, 0x36625121, 0x6D74365F,
290 0x95E0D370, 0x55AFED48, 0xEC9A0A00, 0xF3761CE3,
291 0x091D44C1, 0x83F6C456, 0xC28B4BDB, 0xF12FF37F,
292 0xCF3FA70A, 0xFDC369A6, 0x83C91DB0, 0x44D097C2,
293 0x0FBFB224, 0xF24ED416, 0x4F438995, 0x7B0FEAE6,
294 0x3943729E, 0x35F82C7A, 0x8A234F89, 0x80C91E1A,
295 0xEB1A1262, 0x978E78C6, 0x767B7DFB, 0x08F0DADE,
296 0x2DE99D20, 0x35FB22EB, 0x8BB0FD9F, 0x605EE2EA,
297 0xBEFF4C9D, 0x0FE77DA7, 0x500AE16A, 0x10D3482B,
298 0xA87187EB, 0x854027FC, 0x7C0FE08B, 0x34607ECF,
299 0xD0234C8C, 0xF6D73D2E, 0x0948578B, 0x74ACFEA8
300 },
301
302 {
303 0x14454B76, 0x89C9C4FB, 0x4343E832, 0xEDFBCDAF,
304 0xD6AE6671, 0x31B22D7D, 0xDB9D415E, 0xD0D1E4FB,
305 0x73C35D86, 0x29695252, 0x99EE7F32, 0x232FEE60,
306 0x2B4FE03D, 0x59C92328, 0x43B7835A, 0x0AF1F352,
307 0x430D1D4B, 0x5F9E3619, 0x49D0BD47, 0xA3D6E289,
308 0x936636BD, 0x4FA1A859, 0x7A15317F, 0x93FBBE1C,
309 0x1FE45E6E, 0x4526CCDE, 0x07AA1600, 0x3F5DA670,
310 0xC05B6532, 0x9AF76BF2, 0x3A9A73F9, 0x13BD7268,
311 0x6BD8E37F, 0xFB96271E, 0x95014B60, 0xF4C7B5C3,
312 0x01D23DB6, 0x0B3F0A85, 0x4BCB4683, 0x597ED680,
313 0x53BFBB56, 0xB3D7D046, 0xF4B14E8A, 0xB60AE278,
314 0x4D29F5AE, 0x268AA1F4, 0xE28B5ACA, 0x29481E5A,
315 0x0BD29CE1, 0xC4ADD091, 0x21F11101, 0xAF182B94,
316 0x78C9DD4C, 0x0C59C5C6, 0xF484EAB5, 0x3AA65D4B,
317 0x387CF5A8, 0x7DEEEBE9, 0x92865FDC, 0x83650242,
318 0x83F4BBB4, 0x47CBDCCB, 0x1BB6C2EB, 0xD9DB0D93
319 },
320
321 {
322 0x07E5E382, 0xAD974E9B, 0xF108F97A, 0xBC925B4C,
323 0x43FC2D0A, 0x2D2D16F4, 0xFC8E33C0, 0x5D905103,
324 0x09002E56, 0x342F3BA6, 0xC52F8051, 0xBCC7AFBD,
325 0xF44BCC8E, 0x9CF2BA63, 0x2AF62947, 0x6D32A4E2,
326 0x97CB4B7E, 0x7EB36969, 0x6C5A1BEF, 0x91DDABAF,
327 0xD19F38D1, 0x28168456, 0x18F5BFF7, 0xD942A200,
328 0xD74AC610, 0xA084BA17, 0x6209C788, 0x71298136,
329 0x2E478EB0, 0xC6FF24F1, 0x7FB12530, 0xB05DCEDD,
330 0x63CEE2B8, 0x9828CCA7, 0x74267745, 0xCE31CE0B,
331 0x7F5E241A, 0x9DD687D7, 0xF49A4001, 0x2079D26E,
332 0x77A7F9AB, 0xF018F8E6, 0x6732A7D8, 0x050FE733,
333 0x509F344C, 0xDDDAAA74, 0xBDE184D6, 0xCA198ED9,
334 0x0E013550, 0xF6AB7695, 0x81AB4084, 0x1E1FBE13,
335 0x74641C6F, 0xA42D6C69, 0x7A59A7DE, 0x97FE33E1,
336 0x22A5C0E7, 0x2DDAB736, 0x11E80476, 0xEB197C10,
337 0xEF2D5E0D, 0xA80ADF81, 0x01B6A52D, 0x3F60E848
338 },
339
340 {
341 0x0591FA9E, 0xD84CCD30, 0xAF8645F3, 0xA8F14118,
342 0xEF4E2EB5, 0x1D7EBA58, 0xB1FC516B, 0x328E94D2,
343 0x98F01FE2, 0xA33BAE23, 0xFBFF78E2, 0x319FC7A0,
344 0xB4F9AD3D, 0x83354F5A, 0x822E27B5, 0x6E4D8FBF,
345 0x0DFD5C47, 0xED41261F, 0x7DF08357, 0xA54CF110,
346 0xBF7A0373, 0x3A899027, 0x679C2E1D, 0x902FB5D1,
347 0x937155EA, 0x0C11875D, 0x9AC4F3DD, 0xC0FCBCD2,
348 0xA317C764, 0x7D6106C2, 0x48931D7F, 0x8D38AD15,
349 0x1E5EEAF1, 0x799D6466, 0x120A0D78, 0xA358EF27,
350 0x8301E807, 0x41453072, 0x3DDDD84E, 0x67DAA5B7,
351 0xC4831F14, 0xB4FF3ECC, 0x54FBE1DF, 0xF487050B,
352 0xE23FC0CB, 0x4DA17492, 0xE21D074D, 0x78F519B4,
353 0x73641E6C, 0x471797DE, 0x0B9EF879, 0xCB34E343,
354 0x093C039B, 0x032C80AC, 0x8D71A4E8, 0x40EE5B0F,
355 0xFBDC92DD, 0x2C03A2BD, 0x4E40AB0C, 0x01AC0C5A,
356 0x3ADEC6DD, 0x450A4C28, 0xF246725D, 0x79CD91EB
357 },
358
359 {
360 0x72ACDC1B, 0xF2014F34, 0xFA67FB76, 0x6C0951E3,
361 0xC84F7766, 0x0BF7F3E7, 0x5056038F, 0xB1773ABF,
362 0x40C2A3DD, 0xBC19DD18, 0x2DD4A6EC, 0x421E6F72,
363 0xDFE17CDB, 0xFE0B6A09, 0x3FA0C3EA, 0x1661B6A1,
364 0x40FEE764, 0x84B26A19, 0xF858D748, 0xCBF20F5F,
365 0xB83792BF, 0x83CE6144, 0x5B1C27E1, 0xBAD45539,
366 0xFC174283, 0xD8E4151B, 0x9C51B5A3, 0xA4CBB787,
367 0x829892B4, 0xB0DBB955, 0xAE9BF750, 0xD5EC9DE5,
368 0xBA425010, 0x5D401F05, 0xC1A67E17, 0xFF57C3B2,
369 0xD2F9FCF1, 0xFA92C983, 0xF4ECAC03, 0x01F39D8F,
370 0x85842BC7, 0x9AF22BFF, 0xA240C52A, 0xC92F7885,
371 0xCEC15E11, 0x9D12F7EC, 0x92912226, 0x622D12EC,
372 0xF1562785, 0x4DA4B897, 0x38B97ACC, 0xD7E70669,
373 0x5330B480, 0x821DC482, 0x446387E8, 0x26FFFE50,
374 0xF4B0E87A, 0x2BB8837C, 0x6839CEEA, 0xEA444EE6,
375 0x5635F0EE, 0x55CA3220, 0xDF276DDF, 0xBB90E015
376 }
377 };
378
379