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 ];
1027 void pv_close( tree_t * restrict ptree, int ply, int type );
1028 void pv_copy( tree_t * restrict ptree, int ply );
1029 void set_derivative_param( void );
1030 void set_search_limit_time( int turn );
1031 void ehash_clear( void );
1032 void hash_store_pv( const tree_t * restrict ptree, unsigned int move,
1034 void check_futile_score_quies( const tree_t * restrict ptree,
1035 unsigned int move, int old_val, int new_val,
1037 void out_file( FILE *pf, const char *format, ... );
1038 void out_warning( const char *format, ... );
1039 void out_error( const char *format, ... );
1040 void show_prompt( void );
1041 void make_move_w( tree_t * restrict ptree, unsigned int move, int ply );
1042 void make_move_b( tree_t * restrict ptree, unsigned int move, int ply );
1043 void unmake_move_b( tree_t * restrict ptree, unsigned int move, int ply );
1044 void unmake_move_w( tree_t * restrict ptree, unsigned int move, int ply );
1045 void ini_rand( unsigned int s );
1046 void out_CSA( tree_t * restrict ptree, record_t *pr, unsigned int move );
1047 void out_pv( tree_t * restrict ptree, int value, int turn, unsigned int time );
1048 void hash_store( const tree_t * restrict ptree, int ply, int depth, int turn,
1049 int value_type, int value, unsigned int move,
1050 unsigned int state_node );
1051 void *memory_alloc( size_t nbytes );
1052 void unmake_move_root( tree_t * restrict ptree, unsigned int move );
1053 void add_rejections_root( tree_t * restrict ptree, unsigned int move_made );
1054 void sub_rejections_root( tree_t * restrict ptree, unsigned int move_made );
1055 void add_rejections( tree_t * restrict ptree, int turn, int ply );
1056 void sub_rejections( tree_t * restrict ptree, int turn, int ply );
1057 void adjust_time( unsigned int elapsed_new, int turn );
1058 int popu_count012( unsigned int u0, unsigned int u1, unsigned int u2 );
1059 int first_one012( unsigned int u0, unsigned int u1, unsigned int u2 );
1060 int last_one210( unsigned int u2, unsigned int u1, unsigned int u0 );
1061 int first_one01( unsigned int u0, unsigned int u1 );
1062 int first_one12( unsigned int u1, unsigned int u2 );
1063 int last_one01( unsigned int u0, unsigned int u1 );
1064 int last_one12( unsigned int u1, unsigned int u2 );
1065 int first_one1( unsigned int u1 );
1066 int first_one2( unsigned int u2 );
1067 int last_one0( unsigned int u0 );
1068 int last_one1( unsigned int u1 );
1069 int memory_free( void *p );
1070 int reset_time( unsigned int b_remain, unsigned int w_remain );
1071 int all_hash_learn_store( void );
1072 int gen_legal_moves( tree_t * restrict ptree, unsigned int *p0 );
1073 int rejections_probe( tree_t * restrict ptree, int turn, int ply );
1074 int ini( tree_t * restrict ptree );
1076 int ponder( tree_t * restrict ptree );
1077 int hash_learn( const tree_t * restrict ptree, unsigned int move, int value,
1079 int book_on( void );
1080 int book_off( void );
1081 int hash_learn_on( void );
1082 int hash_learn_off( void );
1083 int is_move_check_b( const tree_t * restrict ptree, unsigned int move );
1084 int is_move_check_w( const tree_t * restrict ptree, unsigned int move );
1085 int solve_problems( tree_t * restrict ptree, unsigned int nposition );
1086 int read_board_rep1( const char *str_line, min_posi_t *pmin_posi );
1087 int com_turn_start( tree_t * restrict ptree, int flag );
1088 int read_record( tree_t * restrict ptree, const char *str_file,
1089 unsigned int moves, int flag );
1090 int out_board( const tree_t * restrict ptree, FILE *pf, unsigned int move,
1092 int make_root_move_list( tree_t * restrict ptree, int flag );
1093 int record_wind( record_t *pr );
1094 int book_probe( tree_t * restrict ptree );
1095 int detect_repetition( tree_t * restrict ptree, int ply, int turn, int nth );
1096 int is_mate( tree_t * restrict ptree, int ply );
1097 int is_mate_w_pawn_drop( tree_t * restrict ptree, int sq_drop );
1098 int is_mate_b_pawn_drop( tree_t * restrict ptree, int sq_drop );
1099 int clear_trans_table( void );
1100 int eval_max_score( const tree_t * restrict ptree, unsigned int move,
1101 int stand_pat, int turn, int diff );
1102 int estimate_score_diff( const tree_t * restrict ptree, unsigned int move,
1104 int eval_material( const tree_t * restrict ptree );
1105 int ini_trans_table( void );
1106 int is_hand_eq_supe( unsigned int u, unsigned int uref );
1107 int is_move_valid( tree_t * restrict ptree, unsigned int move, int turn );
1108 int is_hash_move_valid( tree_t * restrict ptree, unsigned int move, int turn );
1109 int iterate( tree_t * restrict ptree, int flag );
1110 int gen_next_move( tree_t * restrict ptree, int ply, int turn );
1111 int gen_next_evasion( tree_t * restrict ptree, int ply, int turn );
1112 int ini_game( tree_t * restrict ptree, const min_posi_t *pmin_posi, int flag,
1113 const char *str_name1, const char *str_name2 );
1114 int open_history( const char *str_name1, const char *str_name2 );
1115 int next_cmdline( int is_wait );
1116 int procedure( tree_t * restrict ptree );
1117 int get_cputime( unsigned int *ptime );
1118 int get_elapsed( unsigned int *ptime );
1119 int interpret_CSA_move( tree_t * restrict ptree, unsigned int *pmove,
1121 int in_CSA( tree_t * restrict ptree, record_t *pr, unsigned int *pmove,
1123 int in_CSA_record( FILE * restrict pf, tree_t * restrict ptree );
1124 int renovate_time( int turn );
1125 int exam_tree( const tree_t * restrict ptree );
1126 int rep_check_root( tree_t * restrict ptree );
1127 int make_move_root( tree_t * restrict ptree, unsigned int move, int flag );
1128 int search_quies( tree_t * restrict ptree, int alpha, int beta, int turn,
1129 int ply, int qui_ply );
1130 int search( tree_t * restrict ptree, int alpha, int beta, int turn,
1131 int depth, int ply, unsigned int state_node );
1132 int searchr( tree_t * restrict ptree, int alpha, int beta, int turn,
1134 int evaluate( tree_t * restrict ptree, int ply, int turn );
1135 int swap( const tree_t * restrict ptree, unsigned int move, int alpha,
1136 int beta, int turn );
1137 int file_close( FILE *pf );
1138 int record_open( record_t *pr, const char *str_file,
1139 record_mode_t record_mode, const char *str_name1,
1140 const char *str_name2 );
1141 int record_close( record_t *pr );
1142 unsigned int phash( unsigned int move, int turn );
1143 unsigned int is_mate_in3ply( tree_t * restrict ptree, int turn, int ply );
1144 unsigned int is_b_mate_in_1ply( tree_t * restrict ptree );
1145 unsigned int is_w_mate_in_1ply( tree_t * restrict ptree );
1146 unsigned int hash_probe( tree_t * restrict ptree, int ply, int depth, int turn,
1147 int alpha, int beta, unsigned int state_node );
1148 unsigned int rand32( void );
1149 unsigned int is_black_attacked( const tree_t * restrict ptree, int sq );
1150 unsigned int is_white_attacked( const tree_t * restrict ptree, int sq );
1151 unsigned int is_pinned_on_black_king( const tree_t * restrict ptree,
1152 int isquare, int idirec );
1153 unsigned int is_pinned_on_white_king( const tree_t * restrict ptree,
1154 int isquare, int idirec );
1155 unsigned int *b_gen_captures( const tree_t * restrict ptree,
1156 unsigned int * restrict pmove );
1157 unsigned int *b_gen_nocaptures( const tree_t * restrict ptree,
1158 unsigned int * restrict pmove );
1159 unsigned int *b_gen_drop( tree_t * restrict ptree,
1160 unsigned int * restrict pmove );
1161 unsigned int *b_gen_evasion( tree_t *restrict ptree,
1162 unsigned int * restrict pmove );
1163 unsigned int *b_gen_checks( tree_t * restrict __ptree__,
1164 unsigned int * restrict pmove );
1165 unsigned int *b_gen_cap_nopro_ex2( const tree_t * restrict ptree,
1166 unsigned int * restrict pmove );
1167 unsigned int *b_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
1168 unsigned int * restrict pmove );
1169 unsigned int *w_gen_captures( const tree_t * restrict ptree,
1170 unsigned int * restrict pmove );
1171 unsigned int *w_gen_nocaptures( const tree_t * restrict ptree,
1172 unsigned int * restrict pmove );
1173 unsigned int *w_gen_drop( tree_t * restrict ptree,
1174 unsigned int * restrict pmove );
1175 unsigned int *w_gen_evasion( tree_t * restrict ptree,
1176 unsigned int * restrict pmove );
1177 unsigned int *w_gen_checks( tree_t * restrict __ptree__,
1178 unsigned int * restrict pmove );
1179 unsigned int *w_gen_cap_nopro_ex2( const tree_t * restrict ptree,
1180 unsigned int * restrict pmove );
1181 unsigned int *w_gen_nocap_nopro_ex2( const tree_t * restrict ptree,
1182 unsigned int * restrict pmove );
1183 uint64_t hash_func( const tree_t * restrict ptree );
1184 uint64_t rand64( void );
1185 trans_entry_t hash_learn_store( const tree_t * restrict ptree, int depth,
1186 int value, unsigned int move );
1187 FILE *file_open( const char *str_file, const char *str_mode );
1188 bitboard_t attacks_to_piece( const tree_t * restrict ptree, int sq );
1189 bitboard_t horse_attacks( const tree_t * restrict ptree, int i );
1190 const char *str_time( unsigned int time );
1191 const char *str_time_symple( unsigned int time );
1192 const char *str_CSA_move( unsigned int move );
1193 const char *str_CSA_move_plus( tree_t * restrict ptree, unsigned int move,
1194 int ply, int turn );
1200 pv_t mpv_pv[ MPV_MAX_PV*2 + 1 ];
1204 # define SignKey(word2, word1) word2 ^= ( word1 )
1205 # define TlpEnd() tlp_end();
1206 # if ! defined(_WIN32)
1207 extern pthread_attr_t pthread_attr;
1209 # if defined(MNJ_LAN)
1210 uint64_t tlp_count_node( tree_t * restrict ptree );
1212 void tlp_yield( void );
1213 void tlp_set_abort( tree_t * restrict ptree );
1214 void lock( lock_t *plock );
1215 void unlock( lock_t *plock );
1216 void tlp_end( void );
1217 int tlp_search( tree_t * restrict ptree, int alpha, int beta, int turn,
1218 int depth, int ply, unsigned int state_node );
1219 int tlp_split( tree_t * restrict ptree );
1220 int tlp_start( void );
1221 int tlp_is_descendant( const tree_t * restrict ptree, int slot_ancestor );
1222 int lock_init( lock_t *plock );
1223 int lock_free( lock_t *plock );
1224 extern lock_t tlp_lock;
1225 extern volatile int tlp_abort;
1226 extern volatile int tlp_idle;
1227 extern volatile int tlp_num;
1229 extern int tlp_nsplit;
1230 extern int tlp_nabort;
1231 extern int tlp_nslot;
1232 extern SHARE unsigned short tlp_rejections_slot[ REJEC_MASK+1 ];
1233 extern tree_t tlp_atree_work[ TLP_NUM_WORK ];
1234 extern tree_t * volatile tlp_ptrees[ TLP_MAX_THREADS ];
1236 # define SignKey(word2, word1)
1241 #if ! defined(_WIN32)
1242 extern clock_t clk_tck;
1245 #if ! defined(NDEBUG)
1246 int exam_bb( const tree_t *ptree );
1249 #if ! ( defined(NO_STDOUT) && defined(NO_LOGGING) )
1250 # define Out( ... ) out( __VA_ARGS__ )
1251 void out( const char *format, ... );
1256 #if ! defined(NO_LOGGING)
1257 extern FILE *pf_log;
1258 extern const char *str_dir_logs;
1261 #if defined(NO_STDOUT) || defined(WIN32_PIPE)
1263 # define StdoutStress(x,y) 1
1264 # define StdoutNormal() 1
1266 # define OutBeep() out_beep()
1267 # define StdoutStress(x,y) stdout_stress(x,y)
1268 # define StdoutNormal() stdout_normal()
1269 void out_beep( void );
1270 int stdout_stress( int is_promote, int ifrom );
1271 int stdout_normal( void );
1274 #if defined(CSA_LAN) && defined(MNJ_LAN)
1275 # define ShutdownClient sckt_shutdown( sckt_mnj ); \
1276 sckt_shutdown( sckt_csa ); \
1277 sckt_mnj = sckt_csa = SCKT_NULL
1278 #elif defined(CSA_LAN)
1279 # define ShutdownClient sckt_shutdown( sckt_csa ); \
1280 sckt_csa = SCKT_NULL
1281 #elif defined(MNJ_LAN)
1282 # define ShutdownClient sckt_shutdown( sckt_mnj ); \
1283 sckt_mnj = SCKT_NULL
1285 # define ShutdownClient
1288 #if defined(CSA_LAN) || defined(MNJ_LAN)
1289 int client_next_game( tree_t * restrict ptree, const char *str_addr,
1291 sckt_t sckt_connect( const char *str_addr, int iport );
1292 int sckt_shutdown( sckt_t sd );
1293 int sckt_check( sckt_t sd );
1294 int sckt_in( sckt_t sd, char *str, int n );
1295 int sckt_out( sckt_t sd, const char *fmt, ... );
1296 extern unsigned int time_last_send;
1299 #if defined(CSA_LAN)
1300 extern int client_turn;
1301 extern int client_ngame;
1302 extern int client_max_game;
1303 extern long client_port;
1304 extern char client_str_addr[256];
1305 extern char client_str_id[256];
1306 extern char client_str_pwd[256];
1307 extern sckt_t sckt_csa;
1310 #if defined(MNJ_LAN)
1311 # define MnjOut( ... ) if ( sckt_mnj != SCKT_NULL ) \
1312 sckt_out( sckt_mnj, __VA_ARGS__ )
1313 extern short mnj_tbl[ MNJ_MASK + 1 ];
1314 extern sckt_t sckt_mnj;
1315 int mnj_reset_tbl( int sd, unsigned int seed );
1316 int analyze( tree_t * restrict ptree );
1318 unsigned int mnj_move_last;
1320 # define MnjOut( ... )
1324 #if defined(DEKUNOBOU) || defined(CSA_LAN) || defined(MNJ_LAN)
1325 const char *str_WSAError( const char *str );
1328 #if defined(DEKUNOBOU) && defined(_WIN32)
1329 # define OutDek( ... ) if ( dek_ngame ) { int i = dek_out( __VA_ARGS__ ); \
1330 if ( i < 0 ) { return i; } }
1331 const char *str_WSAError( const char *str );
1332 int dek_start( const char *str_sddr, int port_dek, int port_bnz );
1333 int dek_next_game( tree_t * restrict ptree );
1334 int dek_in( char *str, int n );
1335 int dek_out( const char *format, ... );
1336 int dek_parse( char *str, int len );
1337 int dek_check( void );
1338 extern SOCKET dek_socket_in;
1339 extern SOCKET dek_s_accept;
1340 extern u_long dek_ul_addr;
1341 extern unsigned int dek_ngame;
1342 extern unsigned int dek_lost;
1343 extern unsigned int dek_win;
1344 extern int dek_turn;
1345 extern u_short dek_ns;
1347 # define OutDek( ... )
1350 #if defined(CSASHOGI)
1351 # define OutCsaShogi( ... ) out_csashogi( __VA_ARGS__ )
1352 void out_csashogi( const char *format, ... );
1354 # define OutCsaShogi( ... )
1357 #define AttackBishop(bb,i) BBOr( bb, AttackDiag1(i), AttackDiag2(i) )
1358 #define AttackRook(bb,i) (bb) = AttackFile(i); \
1359 (bb).p[aslide[i].ir0] |= AttackRank(i)
1363 extern check_table_t b_chk_tbl[nsquare];
1364 extern check_table_t w_chk_tbl[nsquare];
1366 #if defined(DBG_EASY)
1367 extern unsigned int easy_move;
1370 #if defined(MINIMUM)
1372 # define MT_CAP_PAWN ( DPawn + DPawn )
1373 # define MT_CAP_LANCE ( DLance + DLance )
1374 # define MT_CAP_KNIGHT ( DKnight + DKnight )
1375 # define MT_CAP_SILVER ( DSilver + DSilver )
1376 # define MT_CAP_GOLD ( DGold + DGold )
1377 # define MT_CAP_BISHOP ( DBishop + DBishop )
1378 # define MT_CAP_ROOK ( DRook + DRook )
1379 # define MT_CAP_PRO_PAWN ( DProPawn + DPawn )
1380 # define MT_CAP_PRO_LANCE ( DProLance + DLance )
1381 # define MT_CAP_PRO_KNIGHT ( DProKnight + DKnight )
1382 # define MT_CAP_PRO_SILVER ( DProSilver + DSilver )
1383 # define MT_CAP_HORSE ( DHorse + DBishop )
1384 # define MT_CAP_DRAGON ( DDragon + DRook )
1385 # define MT_CAP_KING ( DKing + DKing )
1386 # define MT_PRO_PAWN ( DProPawn - DPawn )
1387 # define MT_PRO_LANCE ( DProLance - DLance )
1388 # define MT_PRO_KNIGHT ( DProKnight - DKnight )
1389 # define MT_PRO_SILVER ( DProSilver - DSilver )
1390 # define MT_PRO_BISHOP ( DHorse - DBishop )
1391 # define MT_PRO_ROOK ( DDragon - DRook )
1395 # define MT_CAP_PAWN ( p_value_ex[ 15 + pawn ] )
1396 # define MT_CAP_LANCE ( p_value_ex[ 15 + lance ] )
1397 # define MT_CAP_KNIGHT ( p_value_ex[ 15 + knight ] )
1398 # define MT_CAP_SILVER ( p_value_ex[ 15 + silver ] )
1399 # define MT_CAP_GOLD ( p_value_ex[ 15 + gold ] )
1400 # define MT_CAP_BISHOP ( p_value_ex[ 15 + bishop ] )
1401 # define MT_CAP_ROOK ( p_value_ex[ 15 + rook ] )
1402 # define MT_CAP_PRO_PAWN ( p_value_ex[ 15 + pro_pawn ] )
1403 # define MT_CAP_PRO_LANCE ( p_value_ex[ 15 + pro_lance ] )
1404 # define MT_CAP_PRO_KNIGHT ( p_value_ex[ 15 + pro_knight ] )
1405 # define MT_CAP_PRO_SILVER ( p_value_ex[ 15 + pro_silver ] )
1406 # define MT_CAP_HORSE ( p_value_ex[ 15 + horse ] )
1407 # define MT_CAP_DRAGON ( p_value_ex[ 15 + dragon ] )
1408 # define MT_CAP_KING ( DKing + DKing )
1409 # define MT_PRO_PAWN ( benefit2promo[ 7 + pawn ] )
1410 # define MT_PRO_LANCE ( benefit2promo[ 7 + lance ] )
1411 # define MT_PRO_KNIGHT ( benefit2promo[ 7 + knight ] )
1412 # define MT_PRO_SILVER ( benefit2promo[ 7 + silver ] )
1413 # define MT_PRO_BISHOP ( benefit2promo[ 7 + bishop ] )
1414 # define MT_PRO_ROOK ( benefit2promo[ 7 + rook ] )
1416 void fill_param_zero( void );
1417 void ini_param( param_t *p );
1418 void add_param( param_t *p1, const param_t *p2 );
1419 void inc_param( const tree_t * restrict ptree, param_t * restrict pd,
1421 void param_sym( param_t *p );
1422 void renovate_param( const param_t *pd );
1423 int learn( tree_t * restrict ptree, int is_ini, int nsteps,
1424 unsigned int max_games, int max_iterations,
1425 int nworker1, int nworker2 );
1426 int record_setpos( record_t *pr, const rpos_t *prpos );
1427 int record_getpos( record_t *pr, rpos_t *prpos );
1428 int record_rewind( record_t *pr );
1429 int book_create( tree_t * restrict ptree );
1430 int hash_learn_create( void );
1431 int out_param( void );
1432 double calc_penalty( void );
1434 #endif /* no MINIMUM */
1436 #if ( REP_HIST_LEN - PLY_MAX ) < 1
1437 # error "REP_HIST_LEN - PLY_MAX is too small."
1440 #if defined(CSA_LAN) && '\n' != 0x0a
1441 # error "'\n' is not the ASCII code of LF (0x0a)."
1444 #endif /* SHOGI_H */