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