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