10 # define CONV_CDECL __cdecl
11 # define SCKT_NULL INVALID_SOCKET
12 typedef SOCKET sckt_t;
17 # include <sys/times.h>
20 # define SOCKET_ERROR -1
28 # define _CRT_DISABLE_PERFCRIT_LOCKS
29 # define UINT64_MAX ULLONG_MAX
30 # define PRIu64 "I64u"
31 # define PRIx64 "I64x"
32 # define UINT64_C(u) ( u )
34 # define restrict __restrict
35 # define strtok_r strtok_s
37 # define strncpy( dst, src, len ) strncpy_s( dst, len, src, _TRUNCATE )
38 # define snprintf( buf, size, fmt, ... ) \
39 _snprintf_s( buf, size, _TRUNCATE, fmt, __VA_ARGS__ )
40 # define vsnprintf( buf, size, fmt, list ) \
41 _vsnprintf_s( buf, size, _TRUNCATE, fmt, list )
42 typedef unsigned __int64 uint64_t;
43 typedef volatile long lock_t;
45 /* GNU C and Intel C/C++ on x86 and x86-64 */
46 #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
48 # include <inttypes.h>
49 # define restrict __restrict
50 typedef volatile int lock_t;
55 # include <inttypes.h>
56 typedef pthread_mutex_t lock_t;
57 extern unsigned char aifirst_one[512];
58 extern unsigned char ailast_one[512];
63 #define BK_ULTRA_NARROW
73 # if ! defined(WIN32_PIPE)
79 # define SHARE volatile
80 # define SEARCH_ABORT ( root_abort || ptree->tlp_abort )
83 # define SEARCH_ABORT root_abort
86 #define QUIES_PLY_LIMIT 7
93 #define SEC_MARGIN 15U
94 #define SEC_KEEP_ALIVE 180U
95 #define TIME_RESPONSE 200U
96 #define RESIGN_THRESHOLD ( ( MT_CAP_DRAGON * 5 ) / 8 )
97 #define BNZ_VER "Feliz 0.0"
99 #define REP_MAX_PLY 32
100 #define REP_HIST_LEN 256
102 #define EHASH_MASK 0x3fffffU /* occupies 32MB */
104 #define MNJ_MASK 0xfffU
106 #define HIST_SIZE 0x4000U
107 #define HIST_INVALID 0xffffU
108 #define HIST_MAX 0x1000U
110 #define REJEC_MASK 0x0ffffU
111 #define REJEC_MIN_DEPTH ( ( PLY_INC * 5 ) )
113 #define EXT_RECAP1 ( ( PLY_INC * 1 ) / 4 )
114 #define EXT_RECAP2 ( ( PLY_INC * 2 ) / 4 )
115 #define EXT_ONEREP ( ( PLY_INC * 2 ) / 4 )
116 #define EXT_CHECK ( ( PLY_INC * 4 ) / 4 )
118 #define EFUTIL_MG1 ( ( MT_CAP_DRAGON * 2 ) / 8 )
119 #define EFUTIL_MG2 ( ( MT_CAP_DRAGON * 2 ) / 8 )
121 #define FMG_MG ( ( MT_CAP_DRAGON * 2 ) / 16 )
122 #define FMG_MG_KING ( ( MT_CAP_DRAGON * 3 ) / 16 )
123 #define FMG_MG_MT ( ( MT_CAP_DRAGON * 8 ) / 16 )
124 #define FMG_MISC ( ( MT_CAP_DRAGON * 2 ) / 8 )
125 #define FMG_CAP ( ( MT_CAP_DRAGON * 2 ) / 8 )
126 #define FMG_DROP ( ( MT_CAP_DRAGON * 2 ) / 8 )
127 #define FMG_MT ( ( MT_CAP_DRAGON * 2 ) / 8 )
128 #define FMG_MISC_KING ( ( MT_CAP_DRAGON * 2 ) / 8 )
129 #define FMG_CAP_KING ( ( MT_CAP_DRAGON * 2 ) / 8 )
131 #define HASH_REG_HIST_LEN 256
132 #define HASH_REG_MINDIFF ( ( MT_CAP_DRAGON * 1 ) / 8 )
133 #define HASH_REG_THRESHOLD ( ( MT_CAP_DRAGON * 8 ) / 8 )
135 #define FV_WINDOW 256
137 #define FV_PENALTY ( 0.2 / (double)FV_SCALE )
139 #define MPV_MAX_PV 16
141 #define TLP_MAX_THREADS 12
142 #define TLP_NUM_WORK ( TLP_MAX_THREADS * 8 )
144 #define TIME_CHECK_MIN_NODE 10000U
145 #define TIME_CHECK_MAX_NODE 100000U
147 #define SIZE_FILENAME 256
148 #define SIZE_PLAYERNAME 256
149 #define SIZE_MESSAGE 512
150 #define SIZE_CMDLINE 512
151 #define SIZE_CSALINE 512
152 #define SIZE_CMDBUFFER 512
154 #define IsMove(move) ( (move) & 0xffffffU )
155 #define MOVE_NA 0x00000000U
156 #define MOVE_PASS 0x01000000U
157 #define MOVE_PONDER_FAILED 0xfe000000U
158 #define MOVE_RESIGN 0xff000000U
159 #define MOVE_CHK_SET 0x80000000U
160 #define MOVE_CHK_CLEAR 0x40000000U
162 #define MAX_LEGAL_MOVES 700
163 #define MAX_LEGAL_EVASION 256
164 #define MOVE_LIST_LEN 16384
166 #define MAX_SIZE_SECTION 0xffff
167 #define NUM_SECTION 0x4000
169 #define MATERIAL (ptree->posi.material)
170 #define HAND_B (ptree->posi.hand_black)
171 #define HAND_W (ptree->posi.hand_white)
173 #define BB_BOCCUPY (ptree->posi.b_occupied)
174 #define BB_BTGOLD (ptree->posi.b_tgold)
175 #define BB_B_HDK (ptree->posi.b_hdk)
176 #define BB_B_BH (ptree->posi.b_bh)
177 #define BB_B_RD (ptree->posi.b_rd)
178 #define BB_BPAWN_ATK (ptree->posi.b_pawn_attacks)
179 #define BB_BPAWN (ptree->posi.b_pawn)
180 #define BB_BLANCE (ptree->posi.b_lance)
181 #define BB_BKNIGHT (ptree->posi.b_knight)
182 #define BB_BSILVER (ptree->posi.b_silver)
183 #define BB_BGOLD (ptree->posi.b_gold)
184 #define BB_BBISHOP (ptree->posi.b_bishop)
185 #define BB_BROOK (ptree->posi.b_rook)
186 #define BB_BKING (abb_mask[SQ_BKING])
187 #define BB_BPRO_PAWN (ptree->posi.b_pro_pawn)
188 #define BB_BPRO_LANCE (ptree->posi.b_pro_lance)
189 #define BB_BPRO_KNIGHT (ptree->posi.b_pro_knight)
190 #define BB_BPRO_SILVER (ptree->posi.b_pro_silver)
191 #define BB_BHORSE (ptree->posi.b_horse)
192 #define BB_BDRAGON (ptree->posi.b_dragon)
194 #define BB_WOCCUPY (ptree->posi.w_occupied)
195 #define BB_WTGOLD (ptree->posi.w_tgold)
196 #define BB_W_HDK (ptree->posi.w_hdk)
197 #define BB_W_BH (ptree->posi.w_bh)
198 #define BB_W_RD (ptree->posi.w_rd)
199 #define BB_WPAWN_ATK (ptree->posi.w_pawn_attacks)
200 #define BB_WPAWN (ptree->posi.w_pawn)
201 #define BB_WLANCE (ptree->posi.w_lance)
202 #define BB_WKNIGHT (ptree->posi.w_knight)
203 #define BB_WSILVER (ptree->posi.w_silver)
204 #define BB_WGOLD (ptree->posi.w_gold)
205 #define BB_WBISHOP (ptree->posi.w_bishop)
206 #define BB_WROOK (ptree->posi.w_rook)
207 #define BB_WKING (abb_mask[SQ_WKING])
208 #define BB_WPRO_PAWN (ptree->posi.w_pro_pawn)
209 #define BB_WPRO_LANCE (ptree->posi.w_pro_lance)
210 #define BB_WPRO_KNIGHT (ptree->posi.w_pro_knight)
211 #define BB_WPRO_SILVER (ptree->posi.w_pro_silver)
212 #define BB_WHORSE (ptree->posi.w_horse)
213 #define BB_WDRAGON (ptree->posi.w_dragon)
215 #define OCCUPIED_FILE (ptree->posi.occupied_rl90)
216 #define OCCUPIED_DIAG1 (ptree->posi.occupied_rr45)
217 #define OCCUPIED_DIAG2 (ptree->posi.occupied_rl45)
218 #define BOARD (ptree->posi.asquare)
220 #define SQ_BKING (ptree->posi.isquare_b_king)
221 #define SQ_WKING (ptree->posi.isquare_w_king)
223 #define HASH_KEY (ptree->posi.hash_key)
224 #define HASH_VALUE (ptree->sort_value[0])
225 #define MOVE_CURR (ptree->current_move[ply])
226 #define MOVE_LAST (ptree->current_move[ply-1])
228 #define NullDepth(d) ( (d) < PLY_INC*26/4 ? (d)-PLY_INC*12/4 : \
229 ( (d) <= PLY_INC*30/4 ? PLY_INC*14/4 \
230 : (d)-PLY_INC*16/4) )
232 #define LimitExtension(e,ply) if ( (e) && (ply) > 2 * iteration_depth ) { \
233 if ( (ply) < 4 * iteration_depth ) { \
234 e *= 4 * iteration_depth - (ply); \
235 e /= 2 * iteration_depth; \
238 #define Flip(turn) ((turn)^1)
239 #define Inv(sq) (nsquare-1-sq)
240 #define PcOnSq(k,i) pc_on_sq[k][(i)*((i)+3)/2]
241 #define PcPcOnSq(k,i,j) pc_on_sq[k][(i)*((i)+1)/2+(j)]
244 xxxxxxxx xxxxxxxx xxx11111 pawn
245 xxxxxxxx xxxxxxxx 111xxxxx lance
246 xxxxxxxx xxxxx111 xxxxxxxx knight
247 xxxxxxxx xx111xxx xxxxxxxx silver
248 xxxxxxx1 11xxxxxx xxxxxxxx gold
249 xxxxx11x xxxxxxxx xxxxxxxx bishop
250 xxx11xxx xxxxxxxx xxxxxxxx rook
252 #define I2HandPawn(hand) (((hand) >> 0) & 0x1f)
253 #define I2HandLance(hand) (((hand) >> 5) & 0x07)
254 #define I2HandKnight(hand) (((hand) >> 8) & 0x07)
255 #define I2HandSilver(hand) (((hand) >> 11) & 0x07)
256 #define I2HandGold(hand) (((hand) >> 14) & 0x07)
257 #define I2HandBishop(hand) (((hand) >> 17) & 0x03)
258 #define I2HandRook(hand) ((hand) >> 19)
259 #define IsHandPawn(hand) ((hand) & 0x000001f)
260 #define IsHandLance(hand) ((hand) & 0x00000e0)
261 #define IsHandKnight(hand) ((hand) & 0x0000700)
262 #define IsHandSilver(hand) ((hand) & 0x0003800)
263 #define IsHandGold(hand) ((hand) & 0x001c000)
264 #define IsHandBishop(hand) ((hand) & 0x0060000)
265 #define IsHandRook(hand) ((hand) & 0x0180000)
267 xxxxxxxx xxxxxxxx x1111111 destination
268 xxxxxxxx xx111111 1xxxxxxx starting square or drop piece+nsquare-1
269 xxxxxxxx x1xxxxxx xxxxxxxx flag for promotion
270 xxxxx111 1xxxxxxx xxxxxxxx piece to move
271 x1111xxx xxxxxxxx xxxxxxxx captured piece
273 #define To2Move(to) ((unsigned int)(to) << 0)
274 #define From2Move(from) ((unsigned int)(from) << 7)
275 #define Drop2Move(piece) ((nsquare-1+(piece)) << 7)
276 #define Drop2From(piece) (nsquare-1+(piece))
277 #define FLAG_PROMO (1U << 14)
278 #define Piece2Move(piece) ((piece) << 15)
279 #define Cap2Move(piece) ((piece) << 19)
280 #define I2To(move) (((move) >> 0) & 0x007fU)
281 #define I2From(move) (((move) >> 7) & 0x007fU)
282 #define I2FromTo(move) (((move) >> 0) & 0x3fffU)
283 #define I2IsPromote(move) ((move) & FLAG_PROMO)
284 #define I2PieceMove(move) (((move) >> 15) & 0x000fU)
285 #define UToFromToPromo(u) ( (u) & 0x7ffffU )
286 #define UToCap(u) (((u) >> 19) & 0x000fU)
287 #define From2Drop(from) ((from)-nsquare+1)
290 #define BBIni(bb) (bb).p[0] = (bb).p[1] = (bb).p[2] = 0
291 #define BBToU(bb) ((bb).p[0] | (bb).p[1] | (bb).p[2])
292 #define BBToUShift(bb) ((bb).p[0]<<2 | (bb).p[1]<<1 | (bb).p[2])
293 #define PopuCount(bb) popu_count012( bb.p[0], bb.p[1], bb.p[2] )
294 #define FirstOne(bb) first_one012( bb.p[0], bb.p[1], bb.p[2] )
295 #define LastOne(bb) last_one210( bb.p[2], bb.p[1], bb.p[0] )
297 #define BBCmp(bb1,bb2) ( (bb1).p[0] != (bb2).p[0] \
298 || (bb1).p[1] != (bb2).p[1] \
299 || (bb1).p[2] != (bb2).p[2] )
301 #define BBNot(bb,bb1) (bb).p[0] = ~(bb1).p[0], \
302 (bb).p[1] = ~(bb1).p[1], \
303 (bb).p[2] = ~(bb1).p[2]
305 #define BBOr(bb,bb1,bb2) (bb).p[0] = (bb1).p[0] | (bb2).p[0], \
306 (bb).p[1] = (bb1).p[1] | (bb2).p[1], \
307 (bb).p[2] = (bb1).p[2] | (bb2).p[2]
309 #define BBAnd(bb,bb1,bb2) (bb).p[0] = (bb1).p[0] & (bb2).p[0], \
310 (bb).p[1] = (bb1).p[1] & (bb2).p[1], \
311 (bb).p[2] = (bb1).p[2] & (bb2).p[2]
313 #define BBXor(bb,b1,b2) (bb).p[0] = (b1).p[0] ^ (b2).p[0], \
314 (bb).p[1] = (b1).p[1] ^ (b2).p[1], \
315 (bb).p[2] = (b1).p[2] ^ (b2).p[2]
317 #define BBAndOr(bb,bb1,bb2) (bb).p[0] |= (bb1).p[0] & (bb2).p[0], \
318 (bb).p[1] |= (bb1).p[1] & (bb2).p[1], \
319 (bb).p[2] |= (bb1).p[2] & (bb2).p[2]
321 #define BBNotAnd(bb,bb1) bb.p[0] &= ~bb1.p[0]; \
322 bb.p[1] &= ~bb1.p[1]; \
325 #define BBContractShift(bb1,bb2) ( ( (bb1).p[0] & (bb2).p[0] ) << 2 \
326 | ( (bb1).p[1] & (bb2).p[1] ) << 1 \
327 | ( (bb1).p[2] & (bb2).p[2] ) )
329 #define BBContract(bb1,bb2) ( ( (bb1).p[0] & (bb2).p[0] ) \
330 | ( (bb1).p[1] & (bb2).p[1] ) \
331 | ( (bb1).p[2] & (bb2).p[2] ) )
333 #define Xor(i,bb) (bb).p[0] ^= abb_mask[i].p[0], \
334 (bb).p[1] ^= abb_mask[i].p[1], \
335 (bb).p[2] ^= abb_mask[i].p[2]
337 #define XorFile(i,bb) (bb).p[0] ^= abb_mask_rl90[i].p[0], \
338 (bb).p[1] ^= abb_mask_rl90[i].p[1], \
339 (bb).p[2] ^= abb_mask_rl90[i].p[2]
341 #define XorDiag1(i,bb) (bb).p[0] ^= abb_mask_rr45[i].p[0], \
342 (bb).p[1] ^= abb_mask_rr45[i].p[1], \
343 (bb).p[2] ^= abb_mask_rr45[i].p[2]
345 #define XorDiag2(i,bb) (bb).p[0] ^= abb_mask_rl45[i].p[0], \
346 (bb).p[1] ^= abb_mask_rl45[i].p[1], \
347 (bb).p[2] ^= abb_mask_rl45[i].p[2]
349 #define SetClear(bb) (bb).p[0] ^= (bb_set_clear.p[0]), \
350 (bb).p[1] ^= (bb_set_clear.p[1]), \
351 (bb).p[2] ^= (bb_set_clear.p[2])
353 #define SetClearFile(i1,i2,bb) \
354 (bb).p[0] ^= ((abb_mask_rl90[i1].p[0])|(abb_mask_rl90[i2].p[0])), \
355 (bb).p[1] ^= ((abb_mask_rl90[i1].p[1])|(abb_mask_rl90[i2].p[1])), \
356 (bb).p[2] ^= ((abb_mask_rl90[i1].p[2])|(abb_mask_rl90[i2].p[2]))
358 #define SetClearDiag1(i1,i2,bb) \
359 (bb).p[0] ^= ((abb_mask_rr45[i1].p[0])|(abb_mask_rr45[i2].p[0])), \
360 (bb).p[1] ^= ((abb_mask_rr45[i1].p[1])|(abb_mask_rr45[i2].p[1])), \
361 (bb).p[2] ^= ((abb_mask_rr45[i1].p[2])|(abb_mask_rr45[i2].p[2]))
363 #define SetClearDiag2(i1,i2,bb) \
364 (bb).p[0] ^= ((abb_mask_rl45[i1].p[0])|(abb_mask_rl45[i2].p[0])), \
365 (bb).p[1] ^= ((abb_mask_rl45[i1].p[1])|(abb_mask_rl45[i2].p[1])), \
366 (bb).p[2] ^= ((abb_mask_rl45[i1].p[2])|(abb_mask_rl45[i2].p[2]))
368 #define AttackFile(i) (abb_file_attacks[i] \
369 [((ptree->posi.occupied_rl90.p[aslide[i].irl90]) \
370 >> aslide[i].srl90) & 0x7f])
372 #define AttackRank(i) (ai_rook_attacks_r0[i] \
373 [((ptree->posi.b_occupied.p[aslide[i].ir0] \
374 |ptree->posi.w_occupied.p[aslide[i].ir0]) \
375 >> aslide[i].sr0) & 0x7f ])
377 #define AttackDiag1(i) \
378 (abb_bishop_attacks_rr45[i] \
379 [((ptree->posi.occupied_rr45.p[aslide[i].irr45]) \
380 >> aslide[i].srr45) & 0x7f])
382 #define AttackDiag2(i) \
383 (abb_bishop_attacks_rl45[i] \
384 [((ptree->posi.occupied_rl45.p[aslide[i].irl45]) \
385 >> aslide[i].srl45) & 0x7f])
387 #define BishopAttack0(i) ( AttackDiag1(i).p[0] | AttackDiag2(i).p[0] )
388 #define BishopAttack1(i) ( AttackDiag1(i).p[1] | AttackDiag2(i).p[1] )
389 #define BishopAttack2(i) ( AttackDiag1(i).p[2] | AttackDiag2(i).p[2] )
390 #define AttackBLance(bb,i) BBAnd( bb, abb_minus_rays[i], AttackFile(i) )
391 #define AttackWLance(bb,i) BBAnd( bb, abb_plus_rays[i], AttackFile(i) )
392 #define AttackHorse(bb,i) AttackBishop(bb,i); BBOr(bb,bb,abb_king_attacks[i])
393 #define AttackDragon(bb,i) AttackRook(bb,i); BBOr(bb,bb,abb_king_attacks[i])
395 #define InCheck(turn) \
396 ( (turn) ? is_white_attacked( ptree, SQ_WKING ) \
397 : is_black_attacked( ptree, SQ_BKING ) )
399 #define MakeMove(turn,move,ply) \
400 ( (turn) ? make_move_w( ptree, move, ply ) \
401 : make_move_b( ptree, move, ply ) )
403 #define UnMakeMove(turn,move,ply) \
404 ( (turn) ? unmake_move_w( ptree, move, ply ) \
405 : unmake_move_b( ptree, move, ply ) )
407 #define IsMoveCheck( ptree, turn, move ) \
408 ( (turn) ? is_move_check_w( ptree, move ) \
409 : is_move_check_b( ptree, move ) )
411 #define GenCaptures(turn,pmove) ( (turn) ? w_gen_captures( ptree, pmove ) \
412 : b_gen_captures( ptree, pmove ) )
414 #define GenNoCaptures(turn,pmove) \
415 ( (turn) ? w_gen_nocaptures( ptree, pmove ) \
416 : b_gen_nocaptures( ptree, pmove ) )
418 #define GenDrop(turn,pmove) ( (turn) ? w_gen_drop( ptree, pmove ) \
419 : b_gen_drop( ptree, pmove ) )
421 #define GenCapNoProEx2(turn,pmove) \
422 ( (turn) ? w_gen_cap_nopro_ex2( ptree, pmove ) \
423 : b_gen_cap_nopro_ex2( ptree, pmove ) )
425 #define GenNoCapNoProEx2(turn,pmove) \
426 ( (turn) ? w_gen_nocap_nopro_ex2( ptree, pmove ) \
427 : b_gen_nocap_nopro_ex2( ptree, pmove ) )
429 #define GenEvasion(turn,pmove) \
430 ( (turn) ? w_gen_evasion( ptree, pmove ) \
431 : b_gen_evasion( ptree, pmove ) )
433 #define GenCheck(turn,pmove) \
434 ( (turn) ? w_gen_checks( ptree, pmove ) \
435 : b_gen_checks( ptree, pmove ) )
437 #define IsMateIn1Ply(turn) \
438 ( (turn) ? is_w_mate_in_1ply( ptree ) \
439 : is_b_mate_in_1ply( ptree ) )
441 #define IsDiscoverBK(from,to) \
442 idirec = (int)adirec[SQ_BKING][from], \
443 ( idirec && ( idirec!=(int)adirec[SQ_BKING][to] ) \
444 && is_pinned_on_black_king( ptree, from, idirec ) )
446 #define IsDiscoverWK(from,to) \
447 idirec = (int)adirec[SQ_WKING][from], \
448 ( idirec && ( idirec!=(int)adirec[SQ_WKING][to] ) \
449 && is_pinned_on_white_king( ptree, from, idirec ) )
450 #define IsMateWPawnDrop(ptree,to) ( BOARD[(to)+9] == king \
451 && is_mate_w_pawn_drop( ptree, to ) )
453 #define IsMateBPawnDrop(ptree,to) ( BOARD[(to)-9] == -king \
454 && is_mate_b_pawn_drop( ptree, to ) )
456 enum { b0000, b0001, b0010, b0011, b0100, b0101, b0110, b0111,
457 b1000, b1001, b1010, b1011, b1100, b1101, b1110, b1111 };
459 enum { A9 = 0, B9, C9, D9, E9, F9, G9, H9, I9,
460 A8, B8, C8, D8, E8, F8, G8, H8, I8,
461 A7, B7, C7, D7, E7, F7, G7, H7, I7,
462 A6, B6, C6, D6, E6, F6, G6, H6, I6,
463 A5, B5, C5, D5, E5, F5, G5, H5, I5,
464 A4, B4, C4, D4, E4, F4, G4, H4, I4,
465 A3, B3, C3, D3, E3, F3, G3, H3, I3,
466 A2, B2, C2, D2, E2, F2, G2, H2, I2,
467 A1, B1, C1, D1, E1, F1, G1, H1, I1 };
469 enum { promote = 8, empty = 0,
470 pawn, lance, knight, silver, gold, bishop, rook, king, pro_pawn,
471 pro_lance, pro_knight, pro_silver, piece_null, horse, dragon };
473 enum { npawn_max = 18, nlance_max = 4, nknight_max = 4, nsilver_max = 4,
474 ngold_max = 4, nbishop_max = 2, nrook_max = 2, nking_max = 2 };
476 enum { rank1 = 0, rank2, rank3, rank4, rank5, rank6, rank7, rank8, rank9 };
477 enum { file1 = 0, file2, file3, file4, file5, file6, file7, file8, file9 };
479 enum { nhand = 7, nfile = 9, nrank = 9, nsquare = 81 };
481 enum { mask_file1 = (( 1U << 18 | 1U << 9 | 1U ) << 8) };
483 enum { flag_diag1 = b0001, flag_plus = b0010 };
485 enum { score_draw = 1,
486 score_max_eval = 30000,
487 score_mate1ply = 32598,
488 score_inferior = 32599,
490 score_foul = 32600 };
492 enum { phase_hash = b0001,
493 phase_killer1 = b0001 << 1,
494 phase_killer2 = b0010 << 1,
495 phase_killer = b0011 << 1,
496 phase_cap1 = b0001 << 3,
497 phase_cap_misc = b0010 << 3,
498 phase_cap = b0011 << 3,
499 phase_history1 = b0001 << 5,
500 phase_history2 = b0010 << 5,
501 phase_history = b0011 << 5,
502 phase_misc = b0100 << 5 };
504 enum { next_move_hash = 0, next_move_capture, next_move_history2,
507 /* next_evasion_hash should be the same as next_move_hash */
508 enum { next_evasion_hash = 0, next_evasion_genall, next_evasion_misc };
510 enum { next_quies_gencap, next_quies_captures, next_quies_misc };
512 enum { no_rep = 0, four_fold_rep, perpetual_check, perpetual_check2,
513 black_superi_rep, white_superi_rep, hash_hit, prev_solution, book_hit,
514 pv_fail_high, mate_search };
516 enum { record_misc, record_eof, record_next, record_resign, record_drawn,
519 enum { black = 0, white = 1 };
521 enum { direc_misc = b0000,
522 direc_file = b0010, /* | */
523 direc_rank = b0011, /* - */
524 direc_diag1 = b0100, /* / */
525 direc_diag2 = b0101, /* \ */
529 enum { value_null = b0000,
533 flag_value_up_exact = b0001,
534 flag_value_low_exact = b0010,
535 node_do_null = b0100,
536 node_do_recap = b1000,
537 node_do_mate = b0001 << 4,
538 node_mate_threat = b0010 << 4, /* <- don't change it */
539 node_do_futile = b0100 << 4,
541 /* note: maximum bits are 8. tlp_state_node uses type unsigned char. */
543 enum { flag_from_ponder = b0001,
544 flag_refer_rest = b0010 };
546 enum { flag_time = b0001,
547 flag_history = b0010,
549 flag_detect_hang = b1000,
550 flag_rejections = b0001 << 4,
551 flag_nomake_move = b0010 << 4,
552 flag_nofmargin = b0100 << 4 };
554 /* flags represent status of root move */
555 enum { flag_searched = b0001,
556 flag_failhigh = b0010,
557 flag_faillow = b0100,
558 flag_first = b1000 };
560 enum { flag_mated = b0001,
561 flag_resigned = b0010,
563 flag_suspend = b1000,
564 mask_game_end = b1111,
565 flag_quit = b0001 << 4,
566 flag_puzzling = b0010 << 4,
567 flag_pondering = b0100 << 4,
568 flag_thinking = b1000 << 4,
569 flag_problem = b0001 << 8,
570 flag_move_now = b0010 << 8,
571 flag_quit_ponder = b0100 << 8,
572 flag_search_error = b0001 << 12,
573 flag_quiet = b0010 << 12,
574 flag_reverse = b0100 << 12,
575 flag_narrow_book = b1000 << 12,
576 flag_time_extendable = b0001 << 16,
577 flag_learning = b0010 << 16,
578 flag_nobeep = b0100 << 16,
579 flag_nostress = b1000 << 16,
580 flag_nopeek = b0001 << 20,
581 flag_noponder = b0010 << 20,
582 flag_noprompt = b0100 << 20 };
585 enum { flag_hand_pawn = 1 << 0,
586 flag_hand_lance = 1 << 5,
587 flag_hand_knight = 1 << 8,
588 flag_hand_silver = 1 << 11,
589 flag_hand_gold = 1 << 14,
590 flag_hand_bishop = 1 << 17,
591 flag_hand_rook = 1 << 19 };
593 enum { f_hand_pawn = 0,
630 kkp_hand_knight = 24,
631 kkp_hand_silver = 29,
633 kkp_hand_bishop = 39,
647 enum { pos_n = fe_end * ( fe_end + 1 ) / 2 };
649 typedef struct { unsigned int p[3]; } bitboard_t;
651 typedef struct { bitboard_t gold, silver, knight, lance; } check_table_t;
653 #if ! defined(MINIMUM)
654 typedef struct { fpos_t fpos; unsigned int games, moves, lines; } rpos_t;
656 double pawn, lance, knight, silver, gold, bishop, rook;
657 double pro_pawn, pro_lance, pro_knight, pro_silver, horse, dragon;
658 float pc_on_sq[nsquare][fe_end*(fe_end+1)/2];
659 float kkp[nsquare][nsquare][kkp_end];
663 typedef enum { mode_write, mode_read_write, mode_read } record_mode_t;
665 typedef struct { uint64_t word1, word2; } trans_entry_t;
666 typedef struct { trans_entry_t prefer, always[2]; } trans_table_t;
667 typedef struct { int count; unsigned int cnst[2], vec[RAND_N]; }rand_work_t;
671 SHARE uint64_t sibling;
675 int no1_value, no2_value;
676 unsigned int no1, no2;
679 typedef struct { unsigned int no1, no2; } killer_t;
682 union { char str_move[ MAX_ANSWER ][ 8 ]; } info;
683 char str_name1[ SIZE_PLAYERNAME ];
684 char str_name2[ SIZE_PLAYERNAME ];
686 unsigned int games, moves, lines;
690 unsigned int a[PLY_MAX];
692 unsigned char length;
697 unsigned char ir0, sr0;
698 unsigned char irl90, srl90;
699 unsigned char irl45, srl45;
700 unsigned char irr45, srr45;
706 bitboard_t b_occupied, w_occupied;
707 bitboard_t occupied_rl90, occupied_rl45, occupied_rr45;
708 bitboard_t b_hdk, w_hdk;
709 bitboard_t b_tgold, w_tgold;
710 bitboard_t b_bh, w_bh;
711 bitboard_t b_rd, w_rd;
712 bitboard_t b_pawn_attacks, w_pawn_attacks;
713 bitboard_t b_lance, w_lance;
714 bitboard_t b_knight, w_knight;
715 bitboard_t b_silver, w_silver;
716 bitboard_t b_bishop, w_bishop;
717 bitboard_t b_rook, w_rook;
718 bitboard_t b_horse, w_horse;
719 bitboard_t b_dragon, w_dragon;
720 bitboard_t b_pawn, w_pawn;
721 bitboard_t b_gold, w_gold;
722 bitboard_t b_pro_pawn, w_pro_pawn;
723 bitboard_t b_pro_lance, w_pro_lance;
724 bitboard_t b_pro_knight, w_pro_knight;
725 bitboard_t b_pro_silver, w_pro_silver;
726 unsigned int hand_black, hand_white;
728 signed char asquare[nsquare];
729 unsigned char isquare_b_king, isquare_w_king;
734 unsigned int hand_black, hand_white;
736 signed char asquare[nsquare];
741 unsigned int move, status;
745 unsigned int *move_last;
746 unsigned int move_cap1;
747 unsigned int move_cap2;
748 int phase_done, next_phase, remaining, value_cap1, value_cap2;
751 /* data: 31 1bit flag_learned */
752 /* 30 1bit is_flip */
756 unsigned int key_responsible, key_probed, key_played;
757 unsigned int hand_responsible, hand_probed, hand_played;
758 unsigned int move_played, move_responsible, move_probed, data;
759 } history_book_learn_t;
761 typedef struct tree tree_t;
764 uint64_t rep_board_list[ REP_HIST_LEN ];
765 uint64_t node_searched;
766 unsigned int *move_last[ PLY_MAX ];
767 next_move_t anext_move[ PLY_MAX ];
769 move_killer_t amove_killer[ PLY_MAX ];
770 unsigned int null_pruning_done;
771 unsigned int null_pruning_tried;
772 unsigned int check_extension_done;
773 unsigned int recap_extension_done;
774 unsigned int onerp_extension_done;
775 unsigned int neval_called;
776 unsigned int nquies_called;
777 unsigned int nfour_fold_rep;
778 unsigned int nperpetual_check;
779 unsigned int nsuperior_rep;
780 unsigned int nrep_tried;
781 unsigned int nreject_tried;
782 unsigned int nreject_done;
783 unsigned int ntrans_always_hit;
784 unsigned int ntrans_prefer_hit;
785 unsigned int ntrans_probe;
786 unsigned int ntrans_exact;
787 unsigned int ntrans_lower;
788 unsigned int ntrans_upper;
789 unsigned int ntrans_superior_hit;
790 unsigned int ntrans_inferior_hit;
791 unsigned int fail_high;
792 unsigned int fail_high_first;
793 unsigned int rep_hand_list[ REP_HIST_LEN ];
794 unsigned int amove_hash[ PLY_MAX ];
795 unsigned int amove[ MOVE_LIST_LEN ];
796 unsigned int current_move[ PLY_MAX ];
797 killer_t killers[ PLY_MAX ];
798 unsigned int hist_nmove[ PLY_MAX ];
799 unsigned int hist_move[ PLY_MAX ][ MAX_LEGAL_MOVES ];
800 int sort_value[ MAX_LEGAL_MOVES ];
801 unsigned short hist_tried[ HIST_SIZE ];
802 unsigned short hist_good[ HIST_SIZE ];
803 short save_material[ PLY_MAX ];
804 short stand_pat[ PLY_MAX+1 ];
805 unsigned char nsuc_check[ PLY_MAX+1 ];
807 struct tree *tlp_ptrees_sibling[ TLP_MAX_THREADS ];
808 struct tree *tlp_ptree_parent;
810 volatile int tlp_abort;
811 volatile int tlp_used;
812 unsigned short tlp_slot;
815 volatile unsigned char tlp_nsibling;
816 unsigned char tlp_depth;
817 unsigned char tlp_state_node;
818 unsigned char tlp_id;
825 extern SHARE unsigned int game_status;
826 extern history_book_learn_t history_book_learn[ HASH_REG_HIST_LEN ];
828 extern int npawn_box;
829 extern int nlance_box;
830 extern int nknight_box;
831 extern int nsilver_box;
832 extern int ngold_box;
833 extern int nbishop_box;
834 extern int nrook_box;
836 extern unsigned int ponder_move_list[ MAX_LEGAL_MOVES ];
837 extern unsigned int ponder_move;
838 extern int ponder_nmove;
840 extern root_move_t root_move_list[ MAX_LEGAL_MOVES ];
841 extern SHARE int root_abort;
842 extern int root_nrep;
843 extern int root_nmove;
844 extern int root_value;
845 extern int root_alpha;
846 extern int root_beta;
847 extern int root_turn;
848 extern int root_move_cap;
849 extern int root_nfail_high;
850 extern int root_nfail_low;
851 extern int resign_threshold;
852 extern int n_nobook_move;
854 extern uint64_t node_limit;
855 extern unsigned int node_per_second;
856 extern unsigned int node_next_signal;
857 extern unsigned int node_last_check;
859 extern unsigned int hash_mask;
860 extern int trans_table_age;
863 extern pv_t last_pv_save;
864 extern int last_root_value;
865 extern int last_root_value_save;
867 extern SHARE trans_table_t *ptrans_table;
868 extern trans_table_t *ptrans_table_orig;
869 extern int log2_ntrans_table;
871 extern int depth_limit;
873 extern unsigned int time_last_result;
874 extern unsigned int time_last_eff_search;
875 extern unsigned int time_last_search;
876 extern unsigned int time_last_check;
877 extern unsigned int time_turn_start;
878 extern unsigned int time_start;
879 extern unsigned int time_max_limit;
880 extern unsigned int time_limit;
881 extern unsigned int time_response;
882 extern unsigned int sec_limit;
883 extern unsigned int sec_limit_up;
884 extern unsigned int sec_limit_depth;
885 extern unsigned int sec_elapsed;
886 extern unsigned int sec_b_total;
887 extern unsigned int sec_w_total;
889 extern record_t record_problems;
890 extern record_t record_game;
891 extern FILE *pf_book;
892 extern FILE *pf_hash;
893 extern int irecord_game;
895 extern short p_value[31];
896 extern short pc_on_sq[nsquare][fe_end*(fe_end+1)/2];
897 extern short kkp[nsquare][nsquare][kkp_end];
899 extern uint64_t ehash_tbl[ EHASH_MASK + 1 ];
900 extern unsigned char hash_rejections_parent[ REJEC_MASK+1 ];
901 extern rejections_t hash_rejections[ REJEC_MASK+1 ];
902 extern rand_work_t rand_work;
903 extern slide_tbl_t aslide[ nsquare ];
904 extern bitboard_t abb_b_knight_attacks[ nsquare ];
905 extern bitboard_t abb_b_silver_attacks[ nsquare ];
906 extern bitboard_t abb_b_gold_attacks[ nsquare ];
907 extern bitboard_t abb_w_knight_attacks[ nsquare ];
908 extern bitboard_t abb_w_silver_attacks[ nsquare ];
909 extern bitboard_t abb_w_gold_attacks[ nsquare ];
910 extern bitboard_t abb_king_attacks[ nsquare ];
911 extern bitboard_t abb_obstacle[ nsquare ][ nsquare ];
912 extern bitboard_t abb_bishop_attacks_rl45[ nsquare ][ 128 ];
913 extern bitboard_t abb_bishop_attacks_rr45[ nsquare ][ 128 ];
914 extern bitboard_t abb_file_attacks[ nsquare ][ 128 ];
915 extern bitboard_t abb_mask[ nsquare ];
916 extern bitboard_t abb_mask_rl90[ nsquare ];
917 extern bitboard_t abb_mask_rl45[ nsquare ];
918 extern bitboard_t abb_mask_rr45[ nsquare ];
919 extern bitboard_t abb_plus_rays[ nsquare ];
920 extern bitboard_t abb_minus_rays[ nsquare ];
921 extern uint64_t b_pawn_rand[ nsquare ];
922 extern uint64_t b_lance_rand[ nsquare ];
923 extern uint64_t b_knight_rand[ nsquare ];
924 extern uint64_t b_silver_rand[ nsquare ];
925 extern uint64_t b_gold_rand[ nsquare ];
926 extern uint64_t b_bishop_rand[ nsquare ];
927 extern uint64_t b_rook_rand[ nsquare ];
928 extern uint64_t b_king_rand[ nsquare ];
929 extern uint64_t b_pro_pawn_rand[ nsquare ];
930 extern uint64_t b_pro_lance_rand[ nsquare ];
931 extern uint64_t b_pro_knight_rand[ nsquare ];
932 extern uint64_t b_pro_silver_rand[ nsquare ];
933 extern uint64_t b_horse_rand[ nsquare ];
934 extern uint64_t b_dragon_rand[ nsquare ];
935 extern uint64_t b_hand_pawn_rand[ npawn_max ];
936 extern uint64_t b_hand_lance_rand[ nlance_max ];
937 extern uint64_t b_hand_knight_rand[ nknight_max ];
938 extern uint64_t b_hand_silver_rand[ nsilver_max ];
939 extern uint64_t b_hand_gold_rand[ ngold_max ];
940 extern uint64_t b_hand_bishop_rand[ nbishop_max ];
941 extern uint64_t b_hand_rook_rand[ nrook_max ];
942 extern uint64_t w_pawn_rand[ nsquare ];
943 extern uint64_t w_lance_rand[ nsquare ];
944 extern uint64_t w_knight_rand[ nsquare ];
945 extern uint64_t w_silver_rand[ nsquare ];
946 extern uint64_t w_gold_rand[ nsquare ];
947 extern uint64_t w_bishop_rand[ nsquare ];
948 extern uint64_t w_rook_rand[ nsquare ];
949 extern uint64_t w_king_rand[ nsquare ];
950 extern uint64_t w_pro_pawn_rand[ nsquare ];
951 extern uint64_t w_pro_lance_rand[ nsquare ];
952 extern uint64_t w_pro_knight_rand[ nsquare ];
953 extern uint64_t w_pro_silver_rand[ nsquare ];
954 extern uint64_t w_horse_rand[ nsquare ];
955 extern uint64_t w_dragon_rand[ nsquare ];
956 extern uint64_t w_hand_pawn_rand[ npawn_max ];
957 extern uint64_t w_hand_lance_rand[ nlance_max ];
958 extern uint64_t w_hand_knight_rand[ nknight_max ];
959 extern uint64_t w_hand_silver_rand[ nsilver_max ];
960 extern uint64_t w_hand_gold_rand[ ngold_max ];
961 extern uint64_t w_hand_bishop_rand[ nbishop_max ];
962 extern uint64_t w_hand_rook_rand[ nrook_max ];
963 extern unsigned int ai_rook_attacks_r0[ nsquare ][ 128 ];
964 extern unsigned int move_evasion_pchk;
965 extern int p_value_ex[31];
966 extern int benefit2promo[15];
970 extern int easy_value;
971 extern SHARE int fmg_misc;
972 extern SHARE int fmg_cap;
973 extern SHARE int fmg_drop;
974 extern SHARE int fmg_mt;
975 extern SHARE int fmg_misc_king;
976 extern SHARE int fmg_cap_king;
977 extern int iteration_depth;
978 extern unsigned char book_section[ MAX_SIZE_SECTION+1 ];
979 extern unsigned char adirec[nsquare][nsquare];
980 extern unsigned char is_same[16][16];
981 extern char str_message[ SIZE_MESSAGE ];
982 extern char str_cmdline[ SIZE_CMDLINE ];
983 extern char str_buffer_cmdline[ SIZE_CMDBUFFER ];
984 extern const char *str_error;
986 extern const char *astr_table_piece[ 16 ];
987 extern const char *str_resign;
988 extern const char *str_repetition;
989 extern const char *str_jishogi;
990 extern const char *str_record_error;
991 extern const char *str_unexpect_eof;
992 extern const char *str_ovrflw_line;
993 extern const char *str_warning;
994 extern const char *str_on;
995 extern const char *str_off;
996 extern const char *str_book;
997 extern const char *str_hash;
998 extern const char *str_fv;
999 extern const char *str_book_error;
1000 extern const char *str_perpet_check;
1001 extern const char *str_bad_cmdline;
1002 extern const char *str_busy_think;
1003 extern const char *str_bad_record;
1004 extern const char *str_bad_board;
1005 extern const char *str_delimiters;
1006 extern const char *str_fmt_line;
1007 extern const char *str_illegal_move;
1008 extern const char *str_double_pawn;
1009 extern const char *str_mate_drppawn;
1010 extern const char *str_fopen_error;
1011 extern const char *str_game_ended;
1012 extern const char *str_io_error;
1013 extern const char *str_spaces;
1014 extern const char *str_king_hang;
1015 #if defined(CSA_LAN)
1016 extern const char *str_server_err;
1018 extern const char *str_myname;
1019 extern const char *str_version;
1020 extern const min_posi_t min_posi_no_handicap;
1021 extern const short aipos[31];
1022 extern const char ach_turn[2];
1023 extern const char ashell_h[ SHELL_H_LEN ];
1024 extern const unsigned char aifile[ nsquare ];
1025 extern const unsigned char airank[ nsquare ];
1026 extern int move_list[], move_ptr; // [HGM] undo: game history (used in proce.c and makemove.c)
1028 void pv_close( tree_t * restrict ptree, int ply, int type );
1029 void pv_copy( tree_t * restrict ptree, int ply );
1030 void set_derivative_param( void );
1031 void set_search_limit_time( int turn );
1032 void ehash_clear( void );
1033 void hash_store_pv( const tree_t * restrict ptree, unsigned int move,
1035 void check_futile_score_quies( const tree_t * restrict ptree,
1036 unsigned int move, int old_val, int new_val,
1038 void out_file( FILE *pf, const char *format, ... );
1039 void out_warning( const char *format, ... );
1040 void out_error( const char *format, ... );
1041 void show_prompt( void );
1042 void make_move_w( tree_t * restrict ptree, unsigned int move, int ply );
1043 void make_move_b( tree_t * restrict ptree, unsigned int move, int ply );
1044 void unmake_move_b( tree_t * restrict ptree, unsigned int move, int ply );
1045 void unmake_move_w( tree_t * restrict ptree, unsigned int move, int ply );
1046 void ini_rand( unsigned int s );
1047 void out_CSA( tree_t * restrict ptree, record_t *pr, unsigned int move );
1048 void out_pv( tree_t * restrict ptree, int value, int turn, unsigned int time );
1049 void hash_store( const tree_t * restrict ptree, int ply, int depth, int turn,
1050 int value_type, int value, unsigned int move,
1051 unsigned int state_node );
1052 void *memory_alloc( size_t nbytes );
1053 void unmake_move_root( tree_t * restrict ptree, unsigned int move );
1054 void add_rejections_root( tree_t * restrict ptree, unsigned int move_made );
1055 void sub_rejections_root( tree_t * restrict ptree, unsigned int move_made );
1056 void add_rejections( tree_t * restrict ptree, int turn, int ply );
1057 void sub_rejections( tree_t * restrict ptree, int turn, int ply );
1058 void adjust_time( unsigned int elapsed_new, int turn );
1059 int popu_count012( unsigned int u0, unsigned int u1, unsigned int u2 );
1060 int first_one012( unsigned int u0, unsigned int u1, unsigned int u2 );
1061 int last_one210( unsigned int u2, unsigned int u1, unsigned int u0 );
1062 int first_one01( unsigned int u0, unsigned int u1 );
1063 int first_one12( unsigned int u1, unsigned int u2 );
1064 int last_one01( unsigned int u0, unsigned int u1 );
1065 int last_one12( unsigned int u1, unsigned int u2 );
1066 int first_one1( unsigned int u1 );
1067 int first_one2( unsigned int u2 );
1068 int last_one0( unsigned int u0 );
1069 int last_one1( unsigned int u1 );
1070 int memory_free( void *p );
1071 int reset_time( unsigned int b_remain, unsigned int w_remain );
1072 int all_hash_learn_store( void );
1073 int gen_legal_moves( tree_t * restrict ptree, unsigned int *p0 );
1074 int rejections_probe( tree_t * restrict ptree, int turn, int ply );
1075 int ini( tree_t * restrict ptree );
1077 int ponder( tree_t * restrict ptree );
1078 int hash_learn( const tree_t * restrict ptree, unsigned int move, int value,
1080 int book_on( void );
1081 int book_off( void );
1082 int hash_learn_on( void );
1083 int hash_learn_off( void );
1084 int is_move_check_b( const tree_t * restrict ptree, unsigned int move );
1085 int is_move_check_w( const tree_t * restrict ptree, unsigned int move );
1086 int solve_problems( tree_t * restrict ptree, unsigned int nposition );
1087 int read_board_rep1( const char *str_line, min_posi_t *pmin_posi );
1088 int com_turn_start( tree_t * restrict ptree, int flag );
1089 int read_record( tree_t * restrict ptree, const char *str_file,
1090 unsigned int moves, int flag );
1091 int out_board( const tree_t * restrict ptree, FILE *pf, unsigned int move,
1093 int make_root_move_list( tree_t * restrict ptree, int flag );
1094 int record_wind( record_t *pr );
1095 int book_probe( tree_t * restrict ptree );
1096 int detect_repetition( tree_t * restrict ptree, int ply, int turn, int nth );
1097 int is_mate( tree_t * restrict ptree, int ply );
1098 int is_mate_w_pawn_drop( tree_t * restrict ptree, int sq_drop );
1099 int is_mate_b_pawn_drop( tree_t * restrict ptree, int sq_drop );
1100 int clear_trans_table( void );
1101 int eval_max_score( const tree_t * restrict ptree, unsigned int move,
1102 int stand_pat, int turn, int diff );
1103 int estimate_score_diff( const tree_t * restrict ptree, unsigned int move,
1105 int eval_material( const tree_t * restrict ptree );
1106 int ini_trans_table( void );
1107 int is_hand_eq_supe( unsigned int u, unsigned int uref );
1108 int is_move_valid( tree_t * restrict ptree, unsigned int move, int turn );
1109 int is_hash_move_valid( tree_t * restrict ptree, unsigned int move, int turn );
1110 int iterate( tree_t * restrict ptree, int flag );
1111 int gen_next_move( tree_t * restrict ptree, int ply, int turn );
1112 int gen_next_evasion( tree_t * restrict ptree, int ply, int turn );
1113 int ini_game( tree_t * restrict ptree, const min_posi_t *pmin_posi, int flag,
1114 const char *str_name1, const char *str_name2 );
1115 int open_history( const char *str_name1, const char *str_name2 );
1116 int next_cmdline( int is_wait );
1117 int procedure( tree_t * restrict ptree );
1118 int get_cputime( unsigned int *ptime );
1119 int get_elapsed( unsigned int *ptime );
1120 int interpret_CSA_move( tree_t * restrict ptree, unsigned int *pmove,
1122 int in_CSA( tree_t * restrict ptree, record_t *pr, unsigned int *pmove,
1124 int in_CSA_record( FILE * restrict pf, tree_t * restrict ptree );
1125 int renovate_time( int turn );
1126 int exam_tree( const tree_t * restrict ptree );
1127 int rep_check_root( tree_t * restrict ptree );
1128 int make_move_root( tree_t * restrict ptree, unsigned int move, int flag );
1129 int search_quies( tree_t * restrict ptree, int alpha, int beta, int turn,
1130 int ply, int qui_ply );
1131 int search( tree_t * restrict ptree, int alpha, int beta, int turn,
1132 int depth, int ply, unsigned int state_node );
1133 int searchr( tree_t * restrict ptree, int alpha, int beta, int turn,
1135 int evaluate( tree_t * restrict ptree, int ply, int turn );
1136 int swap( const tree_t * restrict ptree, unsigned int move, int alpha,
1137 int beta, int turn );
1138 int file_close( FILE *pf );
1139 int record_open( record_t *pr, const char *str_file,
1140 record_mode_t record_mode, const char *str_name1,
1141 const char *str_name2 );
1142 int record_close( record_t *pr );
1143 unsigned int phash( unsigned int move, int turn );
1144 unsigned int is_mate_in3ply( tree_t * restrict ptree, int turn, int ply );
1145 unsigned int is_b_mate_in_1ply( tree_t * restrict ptree );
1146 unsigned int is_w_mate_in_1ply( tree_t * restrict ptree );
1147 unsigned int hash_probe( tree_t * restrict ptree, int ply, int depth, int turn,
1148 int alpha, int beta, unsigned int state_node );
1149 unsigned int rand32( void );
1150 unsigned int is_black_attacked( const tree_t * restrict ptree, int sq );
1151 unsigned int is_white_attacked( const tree_t * restrict ptree, int sq );
1152 unsigned int is_pinned_on_black_king( const tree_t * restrict ptree,
1153 int isquare, int idirec );
1154 unsigned int is_pinned_on_white_king( const tree_t * restrict ptree,
1155 int isquare, int idirec );
1156 unsigned int *b_gen_captures( const tree_t * restrict ptree,
1157 unsigned int * restrict pmove );
1158 unsigned int *b_gen_nocaptures( const tree_t * restrict ptree,
1159 unsigned int * restrict pmove );
1160 unsigned int *b_gen_drop( tree_t * restrict ptree,
1161 unsigned int * restrict pmove );
1162 unsigned int *b_gen_evasion( tree_t *restrict ptree,
1163 unsigned int * restrict pmove );
1164 unsigned int *b_gen_checks( tree_t * restrict __ptree__,
1165 unsigned int * restrict pmove );
1166 unsigned int *b_gen_cap_nopro_ex2( const tree_t * restrict ptree,
1167 unsigned int * restrict pmove );
1168 unsigned int *b_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
1169 unsigned int * restrict pmove );
1170 unsigned int *w_gen_captures( const tree_t * restrict ptree,
1171 unsigned int * restrict pmove );
1172 unsigned int *w_gen_nocaptures( const tree_t * restrict ptree,
1173 unsigned int * restrict pmove );
1174 unsigned int *w_gen_drop( tree_t * restrict ptree,
1175 unsigned int * restrict pmove );
1176 unsigned int *w_gen_evasion( tree_t * restrict ptree,
1177 unsigned int * restrict pmove );
1178 unsigned int *w_gen_checks( tree_t * restrict __ptree__,
1179 unsigned int * restrict pmove );
1180 unsigned int *w_gen_cap_nopro_ex2( const tree_t * restrict ptree,
1181 unsigned int * restrict pmove );
1182 unsigned int *w_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
1183 unsigned int * restrict pmove );
1184 uint64_t hash_func( const tree_t * restrict ptree );
1185 uint64_t rand64( void );
1186 trans_entry_t hash_learn_store( const tree_t * restrict ptree, int depth,
1187 int value, unsigned int move );
1188 FILE *file_open( const char *str_file, const char *str_mode );
1189 bitboard_t attacks_to_piece( const tree_t * restrict ptree, int sq );
1190 bitboard_t horse_attacks( const tree_t * restrict ptree, int i );
1191 const char *str_time( unsigned int time );
1192 const char *str_time_symple( unsigned int time );
1193 const char *str_CSA_move( unsigned int move );
1194 const char *str_CSA_move_plus( tree_t * restrict ptree, unsigned int move,
1195 int ply, int turn );
1201 pv_t mpv_pv[ MPV_MAX_PV*2 + 1 ];
1205 # define SignKey(word2, word1) word2 ^= ( word1 )
1206 # define TlpEnd() tlp_end();
1207 # if ! defined(_WIN32)
1208 extern pthread_attr_t pthread_attr;
1210 # if defined(MNJ_LAN)
1211 uint64_t tlp_count_node( tree_t * restrict ptree );
1213 void tlp_yield( void );
1214 void tlp_set_abort( tree_t * restrict ptree );
1215 void lock( lock_t *plock );
1216 void unlock( lock_t *plock );
1217 void tlp_end( void );
1218 int tlp_search( tree_t * restrict ptree, int alpha, int beta, int turn,
1219 int depth, int ply, unsigned int state_node );
1220 int tlp_split( tree_t * restrict ptree );
1221 int tlp_start( void );
1222 int tlp_is_descendant( const tree_t * restrict ptree, int slot_ancestor );
1223 int lock_init( lock_t *plock );
1224 int lock_free( lock_t *plock );
1225 extern lock_t tlp_lock;
1226 extern volatile int tlp_abort;
1227 extern volatile int tlp_idle;
1228 extern volatile int tlp_num;
1230 extern int tlp_nsplit;
1231 extern int tlp_nabort;
1232 extern int tlp_nslot;
1233 extern SHARE unsigned short tlp_rejections_slot[ REJEC_MASK+1 ];
1234 extern tree_t tlp_atree_work[ TLP_NUM_WORK ];
1235 extern tree_t * volatile tlp_ptrees[ TLP_MAX_THREADS ];
1237 # define SignKey(word2, word1)
1242 #if ! defined(_WIN32)
1243 extern clock_t clk_tck;
1246 #if ! defined(NDEBUG)
1247 int exam_bb( const tree_t *ptree );
1250 #if ! ( defined(NO_STDOUT) && defined(NO_LOGGING) )
1251 # define Out( ... ) out( __VA_ARGS__ )
1252 void out( const char *format, ... );
1257 #if ! defined(NO_LOGGING)
1258 extern FILE *pf_log;
1259 extern const char *str_dir_logs;
1262 #if defined(NO_STDOUT) || defined(WIN32_PIPE)
1264 # define StdoutStress(x,y) 1
1265 # define StdoutNormal() 1
1267 # define OutBeep() out_beep()
1268 # define StdoutStress(x,y) stdout_stress(x,y)
1269 # define StdoutNormal() stdout_normal()
1270 void out_beep( void );
1271 int stdout_stress( int is_promote, int ifrom );
1272 int stdout_normal( void );
1275 #if defined(CSA_LAN) && defined(MNJ_LAN)
1276 # define ShutdownClient sckt_shutdown( sckt_mnj ); \
1277 sckt_shutdown( sckt_csa ); \
1278 sckt_mnj = sckt_csa = SCKT_NULL
1279 #elif defined(CSA_LAN)
1280 # define ShutdownClient sckt_shutdown( sckt_csa ); \
1281 sckt_csa = SCKT_NULL
1282 #elif defined(MNJ_LAN)
1283 # define ShutdownClient sckt_shutdown( sckt_mnj ); \
1284 sckt_mnj = SCKT_NULL
1286 # define ShutdownClient
1289 #if defined(CSA_LAN) || defined(MNJ_LAN)
1290 int client_next_game( tree_t * restrict ptree, const char *str_addr,
1292 sckt_t sckt_connect( const char *str_addr, int iport );
1293 int sckt_shutdown( sckt_t sd );
1294 int sckt_check( sckt_t sd );
1295 int sckt_in( sckt_t sd, char *str, int n );
1296 int sckt_out( sckt_t sd, const char *fmt, ... );
1297 extern unsigned int time_last_send;
1300 #if defined(CSA_LAN)
1301 extern int client_turn;
1302 extern int client_ngame;
1303 extern int client_max_game;
1304 extern long client_port;
1305 extern char client_str_addr[256];
1306 extern char client_str_id[256];
1307 extern char client_str_pwd[256];
1308 extern sckt_t sckt_csa;
1311 #if defined(MNJ_LAN)
1312 # define MnjOut( ... ) if ( sckt_mnj != SCKT_NULL ) \
1313 sckt_out( sckt_mnj, __VA_ARGS__ )
1314 extern short mnj_tbl[ MNJ_MASK + 1 ];
1315 extern sckt_t sckt_mnj;
1316 int mnj_reset_tbl( int sd, unsigned int seed );
1317 int analyze( tree_t * restrict ptree );
1319 unsigned int mnj_move_last;
1321 # define MnjOut( ... )
1325 #if defined(DEKUNOBOU) || defined(CSA_LAN) || defined(MNJ_LAN)
1326 const char *str_WSAError( const char *str );
1329 #if defined(DEKUNOBOU) && defined(_WIN32)
1330 # define OutDek( ... ) if ( dek_ngame ) { int i = dek_out( __VA_ARGS__ ); \
1331 if ( i < 0 ) { return i; } }
1332 const char *str_WSAError( const char *str );
1333 int dek_start( const char *str_sddr, int port_dek, int port_bnz );
1334 int dek_next_game( tree_t * restrict ptree );
1335 int dek_in( char *str, int n );
1336 int dek_out( const char *format, ... );
1337 int dek_parse( char *str, int len );
1338 int dek_check( void );
1339 extern SOCKET dek_socket_in;
1340 extern SOCKET dek_s_accept;
1341 extern u_long dek_ul_addr;
1342 extern unsigned int dek_ngame;
1343 extern unsigned int dek_lost;
1344 extern unsigned int dek_win;
1345 extern int dek_turn;
1346 extern u_short dek_ns;
1348 # define OutDek( ... )
1351 #if defined(CSASHOGI)
1352 # define OutCsaShogi( ... ) out_csashogi( __VA_ARGS__ )
1353 void out_csashogi( const char *format, ... );
1355 # define OutCsaShogi( ... )
1358 #define AttackBishop(bb,i) BBOr( bb, AttackDiag1(i), AttackDiag2(i) )
1359 #define AttackRook(bb,i) (bb) = AttackFile(i); \
1360 (bb).p[aslide[i].ir0] |= AttackRank(i)
1364 extern check_table_t b_chk_tbl[nsquare];
1365 extern check_table_t w_chk_tbl[nsquare];
1367 #if defined(DBG_EASY)
1368 extern unsigned int easy_move;
1371 #if defined(MINIMUM)
1373 # define MT_CAP_PAWN ( DPawn + DPawn )
1374 # define MT_CAP_LANCE ( DLance + DLance )
1375 # define MT_CAP_KNIGHT ( DKnight + DKnight )
1376 # define MT_CAP_SILVER ( DSilver + DSilver )
1377 # define MT_CAP_GOLD ( DGold + DGold )
1378 # define MT_CAP_BISHOP ( DBishop + DBishop )
1379 # define MT_CAP_ROOK ( DRook + DRook )
1380 # define MT_CAP_PRO_PAWN ( DProPawn + DPawn )
1381 # define MT_CAP_PRO_LANCE ( DProLance + DLance )
1382 # define MT_CAP_PRO_KNIGHT ( DProKnight + DKnight )
1383 # define MT_CAP_PRO_SILVER ( DProSilver + DSilver )
1384 # define MT_CAP_HORSE ( DHorse + DBishop )
1385 # define MT_CAP_DRAGON ( DDragon + DRook )
1386 # define MT_CAP_KING ( DKing + DKing )
1387 # define MT_PRO_PAWN ( DProPawn - DPawn )
1388 # define MT_PRO_LANCE ( DProLance - DLance )
1389 # define MT_PRO_KNIGHT ( DProKnight - DKnight )
1390 # define MT_PRO_SILVER ( DProSilver - DSilver )
1391 # define MT_PRO_BISHOP ( DHorse - DBishop )
1392 # define MT_PRO_ROOK ( DDragon - DRook )
1396 # define MT_CAP_PAWN ( p_value_ex[ 15 + pawn ] )
1397 # define MT_CAP_LANCE ( p_value_ex[ 15 + lance ] )
1398 # define MT_CAP_KNIGHT ( p_value_ex[ 15 + knight ] )
1399 # define MT_CAP_SILVER ( p_value_ex[ 15 + silver ] )
1400 # define MT_CAP_GOLD ( p_value_ex[ 15 + gold ] )
1401 # define MT_CAP_BISHOP ( p_value_ex[ 15 + bishop ] )
1402 # define MT_CAP_ROOK ( p_value_ex[ 15 + rook ] )
1403 # define MT_CAP_PRO_PAWN ( p_value_ex[ 15 + pro_pawn ] )
1404 # define MT_CAP_PRO_LANCE ( p_value_ex[ 15 + pro_lance ] )
1405 # define MT_CAP_PRO_KNIGHT ( p_value_ex[ 15 + pro_knight ] )
1406 # define MT_CAP_PRO_SILVER ( p_value_ex[ 15 + pro_silver ] )
1407 # define MT_CAP_HORSE ( p_value_ex[ 15 + horse ] )
1408 # define MT_CAP_DRAGON ( p_value_ex[ 15 + dragon ] )
1409 # define MT_CAP_KING ( DKing + DKing )
1410 # define MT_PRO_PAWN ( benefit2promo[ 7 + pawn ] )
1411 # define MT_PRO_LANCE ( benefit2promo[ 7 + lance ] )
1412 # define MT_PRO_KNIGHT ( benefit2promo[ 7 + knight ] )
1413 # define MT_PRO_SILVER ( benefit2promo[ 7 + silver ] )
1414 # define MT_PRO_BISHOP ( benefit2promo[ 7 + bishop ] )
1415 # define MT_PRO_ROOK ( benefit2promo[ 7 + rook ] )
1417 void fill_param_zero( void );
1418 void ini_param( param_t *p );
1419 void add_param( param_t *p1, const param_t *p2 );
1420 void inc_param( const tree_t * restrict ptree, param_t * restrict pd,
1422 void param_sym( param_t *p );
1423 void renovate_param( const param_t *pd );
1424 int learn( tree_t * restrict ptree, int is_ini, int nsteps,
1425 unsigned int max_games, int max_iterations,
1426 int nworker1, int nworker2 );
1427 int record_setpos( record_t *pr, const rpos_t *prpos );
1428 int record_getpos( record_t *pr, rpos_t *prpos );
1429 int record_rewind( record_t *pr );
1430 int book_create( tree_t * restrict ptree );
1431 int hash_learn_create( void );
1432 int out_param( void );
1433 double calc_penalty( void );
1435 #endif /* no MINIMUM */
1437 #if ( REP_HIST_LEN - PLY_MAX ) < 1
1438 # error "REP_HIST_LEN - PLY_MAX is too small."
1441 #if defined(CSA_LAN) && '\n' != 0x0a
1442 # error "'\n' is not the ASCII code of LF (0x0a)."
1445 #endif /* SHOGI_H */