Add XBoard protocol drivers
[bonanza.git] / shogi.h
1 #ifndef SHOGI_H
2 #define SHOGI_H
3
4 #include <stdio.h>
5 #include "param.h"
6
7 #if defined(_WIN32)
8
9 #  include <Winsock2.h>
10 #  define CONV_CDECL         __cdecl
11 #  define SCKT_NULL         INVALID_SOCKET
12 typedef SOCKET sckt_t;
13
14 #else
15
16 #  include <pthread.h>
17 #  include <sys/times.h>
18 #  define CONV_CDECL
19 #  define SCKT_NULL         -1
20 #  define SOCKET_ERROR      -1
21 typedef int sckt_t;
22
23 #endif
24
25 /* Microsoft C/C++ */
26 #if defined(_MSC_VER)
27
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 )
33
34 #  define restrict      __restrict
35 #  define strtok_r      strtok_s
36 #  define read          _read
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;
44
45 /* GNU C and Intel C/C++ on x86 and x86-64 */
46 #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
47
48 #  include <inttypes.h>
49 #  define restrict __restrict
50 typedef volatile int lock_t;
51
52 /* other targets. */
53 #else
54
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];
59
60 #endif
61
62 /*
63   #define BK_ULTRA_NARROW
64   #define BK_COM
65   #define BK_SMALL
66   #define NO_NULL_PRUNE
67   #define NO_STDOUT
68   #define DBG_EASY
69 */
70
71 #if defined(CSASHOGI)
72 #  define NO_STDOUT
73 #  if ! defined(WIN32_PIPE)
74 #    define WIN32_PIPE
75 #  endif
76 #endif
77
78 #if defined(TLP)
79 #  define SHARE volatile
80 #  define SEARCH_ABORT ( root_abort || ptree->tlp_abort )
81 #else
82 #  define SHARE
83 #  define SEARCH_ABORT root_abort
84 #endif
85
86 #define QUIES_PLY_LIMIT         7
87 #define SHELL_H_LEN             7
88 #define MAX_ANSWER              8
89 #define PLY_INC                 8
90 #define PLY_MAX                 48
91 #define RAND_N                  624
92 #define TC_NMOVE                37U
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"
98
99 #define REP_MAX_PLY             32
100 #define REP_HIST_LEN            256
101
102 #define EHASH_MASK              0x3fffffU  /* occupies 32MB */
103
104 #define MNJ_MASK                0xfffU
105
106 #define HIST_SIZE               0x4000U
107 #define HIST_INVALID            0xffffU
108 #define HIST_MAX                0x1000U
109
110 #define REJEC_MASK              0x0ffffU
111 #define REJEC_MIN_DEPTH        ( ( PLY_INC  * 5 ) )
112
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 )
117
118 #define EFUTIL_MG1             ( ( MT_CAP_DRAGON * 2 ) /  8 )
119 #define EFUTIL_MG2             ( ( MT_CAP_DRAGON * 2 ) /  8 )
120
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 )
130
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 )
134
135 #define FV_WINDOW               256
136 #define FV_SCALE                32
137 #define FV_PENALTY             ( 0.2 / (double)FV_SCALE )
138
139 #define MPV_MAX_PV              16
140
141 #define TLP_MAX_THREADS         12
142 #define TLP_NUM_WORK           ( TLP_MAX_THREADS * 8 )
143
144 #define TIME_CHECK_MIN_NODE     10000U
145 #define TIME_CHECK_MAX_NODE     100000U
146
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
153
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
161
162 #define MAX_LEGAL_MOVES         700
163 #define MAX_LEGAL_EVASION       256
164 #define MOVE_LIST_LEN           16384
165
166 #define MAX_SIZE_SECTION        0xffff
167 #define NUM_SECTION             0x4000
168
169 #define MATERIAL            (ptree->posi.material)
170 #define HAND_B              (ptree->posi.hand_black)
171 #define HAND_W              (ptree->posi.hand_white)
172
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)
193
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)
214
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)
219
220 #define SQ_BKING            (ptree->posi.isquare_b_king)
221 #define SQ_WKING            (ptree->posi.isquare_w_king)
222
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])
227
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) )
231
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;                   \
236                                 } else { e = 0; } }
237
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)]
242
243 /*
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
251  */
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)
266 /*
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
272  */
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)
288
289
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] )
296
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] )
300
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]
304
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]
308
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]
312
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]
316
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]
320
321 #define BBNotAnd(bb,bb1)         bb.p[0] &= ~bb1.p[0];                        \
322                                  bb.p[1] &= ~bb1.p[1];                        \
323                                  bb.p[2] &= ~bb1.p[2]
324
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] ) )
328
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] ) )
332
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]
336
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]
340
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]
344
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]
348
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])
352
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]))
357
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]))
362
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]))
367
368 #define AttackFile(i)  (abb_file_attacks[i]                               \
369                          [((ptree->posi.occupied_rl90.p[aslide[i].irl90]) \
370                             >> aslide[i].srl90) & 0x7f])
371
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 ])
376
377 #define AttackDiag1(i)                                         \
378           (abb_bishop_attacks_rr45[i]                        \
379             [((ptree->posi.occupied_rr45.p[aslide[i].irr45]) \
380                >> aslide[i].srr45) & 0x7f])
381
382 #define AttackDiag2(i)                                         \
383           (abb_bishop_attacks_rl45[i]                        \
384             [((ptree->posi.occupied_rl45.p[aslide[i].irl45]) \
385                >> aslide[i].srl45) & 0x7f])
386
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])
394
395 #define InCheck(turn)                                        \
396          ( (turn) ? is_white_attacked( ptree, SQ_WKING )     \
397                   : is_black_attacked( ptree, SQ_BKING ) )
398
399 #define MakeMove(turn,move,ply)                                \
400                 ( (turn) ? make_move_w( ptree, move, ply ) \
401                          : make_move_b( ptree, move, ply ) )
402
403 #define UnMakeMove(turn,move,ply)                                \
404                 ( (turn) ? unmake_move_w( ptree, move, ply ) \
405                          : unmake_move_b( ptree, move, ply ) )
406
407 #define IsMoveCheck( ptree, turn, move )                        \
408                 ( (turn) ? is_move_check_w( ptree, move )   \
409                          : is_move_check_b( ptree, move ) )
410
411 #define GenCaptures(turn,pmove) ( (turn) ? w_gen_captures( ptree, pmove )   \
412                                          : b_gen_captures( ptree, pmove ) )
413
414 #define GenNoCaptures(turn,pmove)                                             \
415                                ( (turn) ? w_gen_nocaptures( ptree, pmove )  \
416                                         : b_gen_nocaptures( ptree, pmove ) )
417
418 #define GenDrop(turn,pmove)     ( (turn) ? w_gen_drop( ptree, pmove )       \
419                                          : b_gen_drop( ptree, pmove ) )
420
421 #define GenCapNoProEx2(turn,pmove)                                 \
422                 ( (turn) ? w_gen_cap_nopro_ex2( ptree, pmove )   \
423                          : b_gen_cap_nopro_ex2( ptree, pmove ) )
424
425 #define GenNoCapNoProEx2(turn,pmove)                                \
426                 ( (turn) ? w_gen_nocap_nopro_ex2( ptree, pmove )  \
427                          : b_gen_nocap_nopro_ex2( ptree, pmove ) )
428
429 #define GenEvasion(turn,pmove)                                  \
430                 ( (turn) ? w_gen_evasion( ptree, pmove )      \
431                          : b_gen_evasion( ptree, pmove ) )
432
433 #define GenCheck(turn,pmove)                                  \
434                 ( (turn) ? w_gen_checks( ptree, pmove )      \
435                          : b_gen_checks( ptree, pmove ) )
436
437 #define IsMateIn1Ply(turn)                                    \
438                 ( (turn) ? is_w_mate_in_1ply( ptree )         \
439                          : is_b_mate_in_1ply( ptree ) )
440
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 ) )
445
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 ) )
452
453 #define IsMateBPawnDrop(ptree,to) ( BOARD[(to)-9] == -king                \
454                                      && is_mate_b_pawn_drop( ptree, to ) )
455
456 enum { b0000, b0001, b0010, b0011, b0100, b0101, b0110, b0111,
457        b1000, b1001, b1010, b1011, b1100, b1101, b1110, b1111 };
458
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 };
468
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 };
472
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 };
475
476 enum { rank1 = 0, rank2, rank3, rank4, rank5, rank6, rank7, rank8, rank9 };
477 enum { file1 = 0, file2, file3, file4, file5, file6, file7, file8, file9 };
478
479 enum { nhand = 7, nfile = 9,  nrank = 9,  nsquare = 81 };
480
481 enum { mask_file1 = (( 1U << 18 | 1U << 9 | 1U ) << 8) };
482
483 enum { flag_diag1 = b0001, flag_plus = b0010 };
484
485 enum { score_draw     =     1,
486        score_max_eval = 30000,
487        score_mate1ply = 32598,
488        score_inferior = 32599,
489        score_bound    = 32600,
490        score_foul     = 32600 };
491
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 };
503
504 enum { next_move_hash = 0,  next_move_capture,   next_move_history2,
505        next_move_misc };
506
507 /* next_evasion_hash should be the same as next_move_hash */
508 enum { next_evasion_hash = 0, next_evasion_genall, next_evasion_misc };
509
510 enum { next_quies_gencap, next_quies_captures, next_quies_misc };
511
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 };
515
516 enum { record_misc, record_eof, record_next, record_resign, record_drawn,
517        record_error };
518
519 enum { black = 0, white = 1 };
520
521 enum { direc_misc           = b0000,
522        direc_file           = b0010, /* | */
523        direc_rank           = b0011, /* - */
524        direc_diag1          = b0100, /* / */
525        direc_diag2          = b0101, /* \ */
526        flag_cross           = b0010,
527        flag_diag            = b0100 };
528
529 enum { value_null           = b0000,
530        value_upper          = b0001,
531        value_lower          = b0010,
532        value_exact          = b0011,
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,
540        state_node_end };
541 /* note: maximum bits are 8.  tlp_state_node uses type unsigned char. */
542
543 enum { flag_from_ponder     = b0001,
544        flag_refer_rest      = b0010 };
545
546 enum { flag_time            = b0001,
547        flag_history         = b0010,
548        flag_rep             = b0100,
549        flag_detect_hang     = b1000,
550        flag_rejections      = b0001 << 4,
551        flag_nomake_move     = b0010 << 4,
552        flag_nofmargin       = b0100 << 4 };
553
554 /* flags represent status of root move */
555 enum { flag_searched        = b0001,
556        flag_failhigh        = b0010,
557        flag_faillow         = b0100,
558        flag_first           = b1000 };
559
560 enum { flag_mated           = b0001,
561        flag_resigned        = b0010,
562        flag_drawn           = b0100,
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 };
583
584
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 };
592
593 enum { f_hand_pawn   =    0,
594        e_hand_pawn   =   19,
595        f_hand_lance  =   38,
596        e_hand_lance  =   43,
597        f_hand_knight =   48,
598        e_hand_knight =   53,
599        f_hand_silver =   58,
600        e_hand_silver =   63,
601        f_hand_gold   =   68,
602        e_hand_gold   =   73,
603        f_hand_bishop =   78,
604        e_hand_bishop =   81,
605        f_hand_rook   =   84,
606        e_hand_rook   =   87,
607        fe_hand_end   =   90,
608        f_pawn        =   81,
609        e_pawn        =  162,
610        f_lance       =  225,
611        e_lance       =  306,
612        f_knight      =  360,
613        e_knight      =  441,
614        f_silver      =  504,
615        e_silver      =  585,
616        f_gold        =  666,
617        e_gold        =  747,
618        f_bishop      =  828,
619        e_bishop      =  909,
620        f_horse       =  990,
621        e_horse       = 1071,
622        f_rook        = 1152,
623        e_rook        = 1233,
624        f_dragon      = 1314,
625        e_dragon      = 1395,
626        fe_end        = 1476,
627
628        kkp_hand_pawn   =   0,
629        kkp_hand_lance  =  19,
630        kkp_hand_knight =  24,
631        kkp_hand_silver =  29,
632        kkp_hand_gold   =  34,
633        kkp_hand_bishop =  39,
634        kkp_hand_rook   =  42,
635        kkp_hand_end    =  45,
636        kkp_pawn        =  36,
637        kkp_lance       = 108,
638        kkp_knight      = 171,
639        kkp_silver      = 252,
640        kkp_gold        = 333,
641        kkp_bishop      = 414,
642        kkp_horse       = 495,
643        kkp_rook        = 576,
644        kkp_dragon      = 657,
645        kkp_end         = 738 };
646
647 enum { pos_n = fe_end * ( fe_end + 1 ) / 2 };
648
649 typedef struct { unsigned int p[3]; } bitboard_t;
650
651 typedef struct { bitboard_t gold, silver, knight, lance; } check_table_t;
652
653 #if ! defined(MINIMUM)
654 typedef struct { fpos_t fpos;  unsigned int games, moves, lines; } rpos_t;
655 typedef struct {
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];
660 } param_t;
661 #endif
662
663 typedef enum { mode_write, mode_read_write, mode_read } record_mode_t;
664
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;
668
669 typedef struct {
670   uint64_t root;
671   SHARE uint64_t sibling;
672 } rejections_t;
673
674 typedef struct {
675   int no1_value, no2_value;
676   unsigned int no1, no2;
677 } move_killer_t;
678
679 typedef struct { unsigned int no1, no2; } killer_t;
680
681 typedef struct {
682   union { char str_move[ MAX_ANSWER ][ 8 ]; } info;
683   char str_name1[ SIZE_PLAYERNAME ];
684   char str_name2[ SIZE_PLAYERNAME ];
685   FILE *pf;
686   unsigned int games, moves, lines;
687 } record_t;
688
689 typedef struct {
690   unsigned int a[PLY_MAX];
691   unsigned char type;
692   unsigned char length;
693   unsigned char depth;
694 } pv_t;
695
696 typedef struct {
697   unsigned char ir0,   sr0;
698   unsigned char irl90, srl90;
699   unsigned char irl45, srl45;
700   unsigned char irr45, srr45;
701 } slide_tbl_t;
702
703
704 typedef struct {
705   uint64_t hash_key;
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;
727   int material;
728   signed char asquare[nsquare];
729   unsigned char isquare_b_king, isquare_w_king;
730 } posi_t;
731
732
733 typedef struct {
734   unsigned int hand_black, hand_white;
735   char turn_to_move;
736   signed char asquare[nsquare];
737 } min_posi_t;
738
739 typedef struct {
740   uint64_t nodes;
741   unsigned int move, status;
742 } root_move_t;
743
744 typedef struct {
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;
749 } next_move_t;
750
751 /* data: 31  1bit flag_learned */
752 /*       30  1bit is_flip      */
753 /*       15 16bit value        */
754 typedef struct {
755   uint64_t key_book;
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;
760
761 typedef struct tree tree_t;
762 struct tree {
763   posi_t posi;
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 ];
768   pv_t pv[ 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 ];
806 #if defined(TLP)
807   struct tree *tlp_ptrees_sibling[ TLP_MAX_THREADS ];
808   struct tree *tlp_ptree_parent;
809   lock_t tlp_lock;
810   volatile int tlp_abort;
811   volatile int tlp_used;
812   unsigned short tlp_slot;
813   short tlp_beta;
814   short tlp_best;
815   volatile unsigned char tlp_nsibling;
816   unsigned char tlp_depth;
817   unsigned char tlp_state_node;
818   unsigned char tlp_id;
819   char tlp_turn;
820   char tlp_ply;
821 #endif
822 };
823
824
825 extern SHARE unsigned int game_status;
826 extern history_book_learn_t history_book_learn[ HASH_REG_HIST_LEN ];
827
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;
835
836 extern unsigned int ponder_move_list[ MAX_LEGAL_MOVES ];
837 extern unsigned int ponder_move;
838 extern int ponder_nmove;
839
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;
853
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;
858
859 extern unsigned int hash_mask;
860 extern int trans_table_age;
861
862 extern pv_t last_pv;
863 extern pv_t last_pv_save;
864 extern int last_root_value;
865 extern int last_root_value_save;
866
867 extern SHARE trans_table_t *ptrans_table;
868 extern trans_table_t *ptrans_table_orig;
869 extern int log2_ntrans_table;
870
871 extern int depth_limit;
872
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;
888
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;
894
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];
898
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];
967 extern int easy_abs;
968 extern int easy_min;
969 extern int easy_max;
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;
985
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;
1017 #endif
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
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,
1033                     int turn );
1034 void check_futile_score_quies( const tree_t * restrict ptree,
1035                                unsigned int move, int old_val, int new_val,
1036                                int turn );
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 );
1075 int fin( void );
1076 int ponder( tree_t * restrict ptree );
1077 int hash_learn( const tree_t * restrict ptree, unsigned int move, int value,
1078                 int depth );
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,
1091                int flag );
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,
1103                          int turn );
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,
1120                         const char *str );
1121 int in_CSA( tree_t * restrict ptree, record_t *pr, unsigned int *pmove,
1122             int do_history );
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,
1133              int depth );
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 );
1195
1196 #if defined(MPV)
1197 int root_mpv;
1198 int mpv_num;
1199 int mpv_width;
1200 pv_t mpv_pv[ MPV_MAX_PV*2 + 1 ];
1201 #endif
1202
1203 #if defined(TLP)
1204 #  define SignKey(word2, word1) word2 ^= ( word1 )
1205 #  define TlpEnd()              tlp_end();
1206 #  if ! defined(_WIN32)
1207 extern pthread_attr_t pthread_attr;
1208 #  endif
1209 #  if defined(MNJ_LAN)
1210 uint64_t tlp_count_node( tree_t * restrict ptree );
1211 #  endif
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;
1228 extern int tlp_max;
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 ];
1235 #else /* no TLP */
1236 #  define SignKey(word2, word1)
1237 #  define TlpEnd()
1238 extern tree_t tree;
1239 #endif
1240
1241 #if ! defined(_WIN32)
1242 extern clock_t clk_tck;
1243 #endif
1244
1245 #if ! defined(NDEBUG)
1246 int exam_bb( const tree_t *ptree );
1247 #endif
1248
1249 #if ! ( defined(NO_STDOUT) && defined(NO_LOGGING) )
1250 #  define Out( ... ) out( __VA_ARGS__ )
1251 void out( const char *format, ... );
1252 #else
1253 #  define Out( ... )
1254 #endif
1255
1256 #if ! defined(NO_LOGGING)
1257 extern FILE *pf_log;
1258 extern const char *str_dir_logs;
1259 #endif
1260
1261 #if defined(NO_STDOUT) || defined(WIN32_PIPE)
1262 #  define OutBeep()
1263 #  define StdoutStress(x,y) 1
1264 #  define StdoutNormal()    1
1265 #else
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 );
1272 #endif
1273
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
1284 #else
1285 #  define ShutdownClient
1286 #endif
1287
1288 #if defined(CSA_LAN) || defined(MNJ_LAN)
1289 int client_next_game( tree_t * restrict ptree, const char *str_addr,
1290                       int iport );
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;
1297 #endif
1298
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;
1308 #endif
1309
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 );
1317 int mnj_posi_id;
1318 unsigned int mnj_move_last;
1319 #else
1320 #  define MnjOut( ... )
1321 #endif
1322
1323
1324 #if defined(DEKUNOBOU) || defined(CSA_LAN) || defined(MNJ_LAN)
1325 const char *str_WSAError( const char *str );
1326 #endif
1327
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;
1346 #else
1347 #  define OutDek( ... )
1348 #endif
1349
1350 #if defined(CSASHOGI)
1351 #  define OutCsaShogi( ... ) out_csashogi( __VA_ARGS__ )
1352 void out_csashogi( const char *format, ... );
1353 #else
1354 #  define OutCsaShogi( ... )
1355 #endif
1356
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)
1360
1361
1362
1363 extern check_table_t b_chk_tbl[nsquare];
1364 extern check_table_t w_chk_tbl[nsquare];
1365
1366 #if defined(DBG_EASY)
1367 extern unsigned int easy_move;
1368 #endif
1369
1370 #if defined(MINIMUM)
1371
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 )
1392
1393 #else
1394
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 ] )
1415
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,
1420                 double dinc );
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 );
1433
1434 #endif /* no MINIMUM */
1435
1436 #if ( REP_HIST_LEN - PLY_MAX ) < 1
1437 #  error "REP_HIST_LEN - PLY_MAX is too small."
1438 #endif
1439
1440 #if defined(CSA_LAN) && '\n' != 0x0a
1441 #  error "'\n' is not the ASCII code of LF (0x0a)."
1442 #endif
1443
1444 #endif /* SHOGI_H */