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