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