Rev 108 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
33 | pmbaty | 1 | /* |
2 | ******************************************************************************* |
||
3 | * * |
||
4 | * configuration information: the following variables need to be set to * |
||
5 | * indicate the machine configuration/capabilities. * |
||
6 | * * |
||
7 | * UNIX: define this if the program is being run on a unix-based system, * |
||
8 | * which causes the executable to use unix-specific runtime utilities. * |
||
9 | * * |
||
10 | * CPUS=N: this sets up data structures to the appropriate size to support * |
||
11 | * up to N simultaneous search engines. note that you can set this to a * |
||
12 | * value larger than the max processors you currently have, because the mt=n * |
||
13 | * command (added to the command line or your crafty.rc/.craftyrc file) will * |
||
14 | * control how many threads are actually spawned. * |
||
15 | * * |
||
16 | ******************************************************************************* |
||
17 | */ |
||
18 | /* *INDENT-OFF* */ |
||
19 | |||
20 | #if defined(AFFINITY) |
||
21 | # define _GNU_SOURCE |
||
22 | # include <sched.h> |
||
23 | #endif |
||
24 | #if defined(UNIX) |
||
25 | # define _GNU_SOURCE |
||
26 | # if (CPUS > 1) |
||
27 | # include <pthread.h> |
||
28 | # endif |
||
29 | # include <unistd.h> |
||
30 | # include <sys/types.h> |
||
108 | pmbaty | 31 | # include <sys/stat.h> |
33 | pmbaty | 32 | #endif |
33 | #include <stdint.h> |
||
34 | #include <inttypes.h> |
||
35 | #include <time.h> |
||
36 | #include <stdio.h> |
||
37 | #include <assert.h> |
||
38 | #include <stdlib.h> |
||
39 | #include <string.h> |
||
154 | pmbaty | 40 | #pragma once |
33 | pmbaty | 41 | # if !defined (UNIX) |
42 | # define RESTRICT __restrict |
||
43 | # else |
||
44 | # define RESTRICT |
||
45 | # endif |
||
46 | # if !defined(CPUS) |
||
47 | # define CPUS 1 |
||
48 | # endif |
||
49 | # if !defined(UNIX) |
||
50 | # include <windows.h> |
||
51 | # include <process.h> |
||
52 | # endif |
||
53 | # define CDECL |
||
54 | # define STDCALL |
||
55 | /* Provide reasonable defaults for UNIX systems. */ |
||
56 | # if !defined(UNIX) |
||
57 | # undef STDCALL |
||
58 | # define STDCALL __stdcall |
||
59 | # ifdef VC_INLINE32 |
||
60 | # undef CDECL |
||
61 | # define CDECL __cdecl |
||
62 | # endif |
||
63 | # endif |
||
64 | # if !defined(BOOKDIR) |
||
108 | pmbaty | 65 | # define BOOKDIR "." |
33 | pmbaty | 66 | # endif |
67 | # if !defined(LOGDIR) |
||
108 | pmbaty | 68 | # define LOGDIR "." |
33 | pmbaty | 69 | # endif |
70 | # if !defined(TBDIR) |
||
154 | pmbaty | 71 | # define TBDIR "./syzygy" |
33 | pmbaty | 72 | # endif |
73 | # if !defined(RCDIR) |
||
108 | pmbaty | 74 | # define RCDIR "." |
33 | pmbaty | 75 | # endif |
76 | # include "lock.h" |
||
77 | # define MAXPLY 129 |
||
108 | pmbaty | 78 | # define MAX_TC_NODES 3000000 |
79 | # define MAX_BLOCKS 64 * CPUS |
||
33 | pmbaty | 80 | # define BOOK_CLUSTER_SIZE 8000 |
81 | # define MERGE_BLOCK 1000 |
||
82 | # define SORT_BLOCK 4000000 |
||
83 | # define LEARN_INTERVAL 10 |
||
84 | # define LEARN_COUNTER_BAD -80 |
||
85 | # define LEARN_COUNTER_GOOD +100 |
||
86 | # define MATE 32768 |
||
154 | pmbaty | 87 | # define TBWIN 31000 |
33 | pmbaty | 88 | # define PAWN_VALUE 100 |
108 | pmbaty | 89 | # define KNIGHT_VALUE 305 |
90 | # define BISHOP_VALUE 305 |
||
91 | # define ROOK_VALUE 490 |
||
92 | # define QUEEN_VALUE 1000 |
||
33 | pmbaty | 93 | # define KING_VALUE 40000 |
154 | pmbaty | 94 | # define FOREVER 1 |
33 | pmbaty | 95 | # if !defined(CLOCKS_PER_SEC) |
96 | # define CLOCKS_PER_SEC 1000000 |
||
97 | # endif |
||
98 | typedef enum { |
||
99 | A1, B1, C1, D1, E1, F1, G1, H1, |
||
100 | A2, B2, C2, D2, E2, F2, G2, H2, |
||
101 | A3, B3, C3, D3, E3, F3, G3, H3, |
||
102 | A4, B4, C4, D4, E4, F4, G4, H4, |
||
103 | A5, B5, C5, D5, E5, F5, G5, H5, |
||
104 | A6, B6, C6, D6, E6, F6, G6, H6, |
||
105 | A7, B7, C7, D7, E7, F7, G7, H7, |
||
106 | A8, B8, C8, D8, E8, F8, G8, H8, |
||
107 | BAD_SQUARE |
||
108 | } squares; |
||
109 | typedef enum { FILEA, FILEB, FILEC, FILED, FILEE, FILEF, FILEG, FILEH } files; |
||
110 | typedef enum { RANK1, RANK2, RANK3, RANK4, RANK5, RANK6, RANK7, RANK8 } ranks; |
||
111 | typedef enum { empty = 0, occupied = 0, pawn = 1, knight = 2, bishop = 3, |
||
112 | rook = 4, queen = 5, king = 6 |
||
113 | } PIECE; |
||
114 | typedef enum { black = 0, white = 1 } COLOR; |
||
115 | typedef enum { mg = 0, eg = 1 } PHASE; |
||
116 | typedef enum { empty_v = 0, pawn_v = 1, knight_v = 3, |
||
108 | pmbaty | 117 | bishop_v = 3, rook_v = 5, queen_v = 9, king_v = 99 |
33 | pmbaty | 118 | } PIECE_V; |
108 | pmbaty | 119 | typedef enum { serial = 0, parallel = 1} SEARCH_MODE; |
33 | pmbaty | 120 | typedef enum { think = 1, puzzle = 2, book = 3, annotate = 4 } SEARCH_TYPE; |
121 | typedef enum { normal_mode, tournament_mode } PLAYING_MODE; |
||
122 | typedef struct { |
||
123 | int8_t castle[2]; |
||
124 | uint8_t enpassant_target; |
||
125 | uint8_t reversible; |
||
126 | } SEARCH_POSITION; |
||
127 | typedef struct { |
||
154 | pmbaty | 128 | uint32_t move1; |
129 | uint32_t move2; |
||
33 | pmbaty | 130 | } KILLER; |
131 | typedef struct { |
||
132 | uint64_t pieces[7]; |
||
133 | } BB_PIECES; |
||
134 | typedef struct { |
||
135 | BB_PIECES color[2]; |
||
136 | uint64_t hash_key; |
||
137 | uint64_t pawn_hash_key; |
||
138 | int material_evaluation; |
||
139 | int kingsq[2]; |
||
140 | int8_t board[64]; |
||
141 | char pieces[2][7]; |
||
142 | char total_all_pieces; |
||
143 | } POSITION; |
||
144 | typedef struct { |
||
145 | uint64_t word1; |
||
146 | uint64_t word2; |
||
147 | } HASH_ENTRY; |
||
148 | typedef struct { |
||
149 | uint64_t key; |
||
108 | pmbaty | 150 | int32_t score_mg, score_eg; |
33 | pmbaty | 151 | unsigned char defects_k[2]; |
108 | pmbaty | 152 | unsigned char defects_m[2]; |
33 | pmbaty | 153 | unsigned char defects_q[2]; |
154 | unsigned char passed[2]; |
||
155 | } PAWN_HASH_ENTRY; |
||
156 | typedef struct { |
||
108 | pmbaty | 157 | uint64_t entry[3]; |
33 | pmbaty | 158 | } PXOR; |
159 | typedef struct { |
||
160 | int path[MAXPLY]; |
||
161 | int pathh; |
||
162 | int pathl; |
||
163 | int pathd; |
||
164 | int pathv; |
||
165 | } PATH; |
||
166 | typedef struct { |
||
167 | uint64_t path_sig; |
||
168 | int hash_pathl; |
||
169 | int hash_path_age; |
||
170 | int hash_path_moves[MAXPLY]; |
||
171 | } HPATH_ENTRY; |
||
172 | typedef struct { |
||
173 | int phase; |
||
108 | pmbaty | 174 | int order; |
33 | pmbaty | 175 | int remaining; |
108 | pmbaty | 176 | unsigned *last; |
177 | unsigned done[10]; |
||
178 | unsigned *exclude; |
||
33 | pmbaty | 179 | } NEXT_MOVE; |
108 | pmbaty | 180 | /* |
181 | root_move.status: |
||
182 | |||
183 | xxx1 = failed low this iteration |
||
184 | xx1x = failed high this iteration |
||
185 | x1xx = don't search in parallel or reduce |
||
186 | 1xxx = move has been searched |
||
187 | */ |
||
33 | pmbaty | 188 | typedef struct { |
189 | int move; |
||
108 | pmbaty | 190 | unsigned status; |
33 | pmbaty | 191 | int bm_age; |
108 | pmbaty | 192 | PATH path; |
33 | pmbaty | 193 | } ROOT_MOVE; |
194 | # if !defined(UNIX) |
||
195 | # pragma pack(4) |
||
196 | # endif |
||
197 | typedef struct { |
||
198 | uint64_t position; |
||
108 | pmbaty | 199 | unsigned status_played; |
33 | pmbaty | 200 | float learn; |
201 | } BOOK_POSITION; |
||
202 | # if !defined(UNIX) |
||
203 | # pragma pack() |
||
204 | # endif |
||
205 | typedef struct { |
||
206 | unsigned char position[8]; |
||
207 | unsigned char status; |
||
208 | unsigned char percent_play; |
||
209 | } BB_POSITION; |
||
210 | struct personality_term { |
||
211 | char *description; |
||
212 | int type; |
||
213 | int size; |
||
108 | pmbaty | 214 | void *value; |
33 | pmbaty | 215 | }; |
108 | pmbaty | 216 | struct autotune { |
217 | unsigned int min; |
||
218 | unsigned int max; |
||
219 | unsigned int increment; |
||
220 | char description[64]; |
||
221 | char command[16]; |
||
222 | unsigned int *parameter; |
||
223 | }; |
||
224 | typedef struct tree { |
||
225 | /* commonly used variables */ |
||
226 | SEARCH_POSITION status[MAXPLY + 3]; |
||
227 | NEXT_MOVE next_status[MAXPLY]; |
||
228 | KILLER killers[MAXPLY]; |
||
154 | pmbaty | 229 | KILLER counter_move[4096]; |
230 | KILLER move_pair[4096]; |
||
33 | pmbaty | 231 | POSITION position; |
232 | uint64_t save_hash_key[MAXPLY + 3]; |
||
233 | uint64_t save_pawn_hash_key[MAXPLY + 3]; |
||
234 | uint64_t rep_list[256]; |
||
235 | int curmv[MAXPLY]; |
||
108 | pmbaty | 236 | int phase[MAXPLY]; |
33 | pmbaty | 237 | int hash_move[MAXPLY]; |
108 | pmbaty | 238 | unsigned *last[MAXPLY]; |
239 | unsigned move_list[5120]; |
||
240 | PATH pv[MAXPLY]; |
||
241 | /* variables used by Evaluate() */ |
||
242 | PAWN_HASH_ENTRY pawn_score; |
||
33 | pmbaty | 243 | int tropism[2]; |
244 | int dangerous[2]; |
||
108 | pmbaty | 245 | uint64_t all_pawns; |
33 | pmbaty | 246 | int score_mg, score_eg; |
108 | pmbaty | 247 | /* statistical counters */ |
248 | uint64_t nodes_searched; |
||
249 | uint64_t fail_highs; |
||
250 | uint64_t fail_high_first_move; |
||
251 | uint64_t evaluations; |
||
252 | uint64_t egtb_probes; |
||
253 | uint64_t egtb_hits; |
||
254 | uint64_t extensions_done; |
||
255 | uint64_t qchecks_done; |
||
256 | uint64_t moves_fpruned; |
||
257 | uint64_t moves_mpruned; |
||
258 | uint64_t LMR_done[16]; |
||
259 | uint64_t null_done[16]; |
||
260 | /* thread stuff */ |
||
33 | pmbaty | 261 | lock_t lock; |
262 | int thread_id; |
||
108 | pmbaty | 263 | volatile int joinable; |
264 | volatile int joined; |
||
33 | pmbaty | 265 | volatile int stop; |
266 | volatile int nprocs; |
||
267 | int alpha; |
||
268 | int beta; |
||
269 | volatile int value; |
||
108 | pmbaty | 270 | int wtm; |
33 | pmbaty | 271 | int depth; |
272 | int ply; |
||
108 | pmbaty | 273 | int in_check; |
274 | int *searched; |
||
33 | pmbaty | 275 | int cutmove; |
108 | pmbaty | 276 | struct tree *volatile siblings[CPUS], *parent; |
277 | /* rarely accessed */ |
||
278 | char root_move_text[16]; |
||
279 | char remaining_moves_text[16]; |
||
280 | } TREE; |
||
281 | typedef struct thread { |
||
282 | TREE *tree; |
||
283 | uint64_t blocks; |
||
284 | uint64_t max_blocks; |
||
285 | unsigned int idle; |
||
286 | volatile unsigned int terminate; |
||
287 | char filler[40]; |
||
288 | } THREAD; |
||
33 | pmbaty | 289 | /* |
290 | DO NOT modify these. these are constants, used in multiple modules. |
||
291 | modification may corrupt the search in any number of ways, all bad. |
||
292 | */ |
||
108 | pmbaty | 293 | # define WORTHLESS 0 |
294 | # define UPPER 1 |
||
295 | # define LOWER 2 |
||
296 | # define EXACT 3 |
||
297 | # define HASH_MISS 0 |
||
298 | # define HASH_HIT 1 |
||
299 | # define AVOID_NULL_MOVE 2 |
||
300 | # define NO_NULL 0 |
||
301 | # define DO_NULL 1 |
||
302 | # define NONE 0 |
||
303 | # define NULL_MOVE 1 |
||
304 | # define DO_NOT_REDUCE 1 |
||
305 | # define HASH 2 |
||
306 | # define GENERATE_CAPTURES 3 |
||
307 | # define CAPTURES 4 |
||
308 | # define KILLER1 5 |
||
309 | # define KILLER2 6 |
||
310 | # define KILLER3 7 |
||
311 | # define KILLER4 8 |
||
312 | # define COUNTER_MOVE1 9 |
||
313 | # define COUNTER_MOVE2 10 |
||
314 | # define MOVE_PAIR1 11 |
||
315 | # define MOVE_PAIR2 12 |
||
316 | # define GENERATE_QUIET 13 |
||
317 | # define HISTORY 14 |
||
318 | # define REMAINING 15 |
||
319 | # define EVALUATION 16 |
||
320 | # define ILLEGAL 0 |
||
321 | # define LEGAL 1 |
||
322 | # define IN_WINDOW 2 |
||
323 | # define FAIL_HIGH 3 |
||
154 | pmbaty | 324 | #define PopCnt(v) __builtin_popcountll(v) |
325 | #define LSB(v) __builtin_ctzll(v) |
||
326 | #define MSB(v) (63 - __builtin_clzll(v)) |
||
327 | void AlignedMalloc(void **, uint64_t, size_t); |
||
328 | void AlignedRemalloc(void **, uint64_t, size_t); |
||
33 | pmbaty | 329 | void Analyze(void); |
330 | void Annotate(void); |
||
331 | void AnnotateHeaderHTML(char *, FILE *); |
||
332 | void AnnotateFooterHTML(FILE *); |
||
333 | void AnnotatePositionHTML(TREE *RESTRICT, int, FILE *); |
||
334 | char *AnnotateVtoNAG(int, int, int, int); |
||
335 | void AnnotateHeaderTeX(FILE *); |
||
336 | void AnnotateFooterTeX(FILE *); |
||
337 | void AnnotatePositionTeX(TREE *, int, FILE *); |
||
108 | pmbaty | 338 | uint64_t atoiKMB(char *); |
33 | pmbaty | 339 | int Attacks(TREE *RESTRICT, int, int); |
108 | pmbaty | 340 | uint64_t Attacked(TREE *RESTRICT, int, uint64_t); |
33 | pmbaty | 341 | uint64_t AttacksFrom(TREE *RESTRICT, int, int); |
342 | uint64_t AttacksTo(TREE *RESTRICT, int); |
||
108 | pmbaty | 343 | void AutoTune(int, char **); |
344 | int Bench(int, int); |
||
345 | int Book(TREE *RESTRICT, int); |
||
33 | pmbaty | 346 | void BookClusterIn(FILE *, int, BOOK_POSITION *); |
347 | void BookClusterOut(FILE *, int, BOOK_POSITION *); |
||
348 | int BookIn32(unsigned char *); |
||
349 | float BookIn32f(unsigned char *); |
||
350 | uint64_t BookIn64(unsigned char *); |
||
351 | int BookMask(char *); |
||
352 | unsigned char *BookOut32(int); |
||
353 | unsigned char *BookOut32f(float); |
||
354 | unsigned char *BookOut64(uint64_t); |
||
355 | int BookPonderMove(TREE *RESTRICT, int); |
||
108 | pmbaty | 356 | void Bookup(TREE *RESTRICT, int, char **); |
33 | pmbaty | 357 | void BookSort(BB_POSITION *, int, int); |
108 | pmbaty | 358 | int BookupCompare(const void *, const void *); |
359 | BB_POSITION BookupNextPosition(int, int); |
||
33 | pmbaty | 360 | int CheckInput(void); |
361 | void ClearHashTableScores(void); |
||
362 | int ComputeDifficulty(int, int); |
||
108 | pmbaty | 363 | void CopyFromParent(TREE *RESTRICT); |
33 | pmbaty | 364 | void CopyToParent(TREE *RESTRICT, TREE *RESTRICT, int); |
365 | void CraftyExit(int); |
||
366 | void DisplayArray(int *, int); |
||
367 | void DisplayArrayX2(int *, int *, int); |
||
368 | void DisplayBitBoard(uint64_t); |
||
369 | void Display2BitBoards(uint64_t, uint64_t); |
||
370 | void DisplayChessBoard(FILE *, POSITION); |
||
371 | char *DisplayEvaluation(int, int); |
||
372 | char *DisplayEvaluationKibitz(int, int); |
||
373 | void DisplayFT(int, int, int); |
||
108 | pmbaty | 374 | char *DisplayHHMM(unsigned); |
375 | char *DisplayHHMMSS(unsigned); |
||
376 | char *DisplayKMB(uint64_t, int); |
||
377 | void DisplayFail(TREE *RESTRICT, int, int, int, int, int, int, int); |
||
378 | char *DisplayPath(TREE *RESTRICT, int, PATH *); |
||
379 | void DisplayPV(TREE *RESTRICT, int, int, int, PATH *, int); |
||
380 | char *DisplayTime(unsigned); |
||
381 | char *Display2Times(unsigned); |
||
382 | char *DisplayTimeKibitz(unsigned); |
||
33 | pmbaty | 383 | void DisplayChessMove(char *, int); |
384 | int Drawn(TREE *RESTRICT, int); |
||
154 | pmbaty | 385 | int DTZtoWDL(int, int); |
33 | pmbaty | 386 | void Edit(void); |
387 | int Evaluate(TREE *RESTRICT, int, int, int, int); |
||
388 | void EvaluateBishops(TREE *RESTRICT, int); |
||
108 | pmbaty | 389 | void EvaluateCastling(TREE *RESTRICT, int, int); |
33 | pmbaty | 390 | int EvaluateDraws(TREE *RESTRICT, int, int, int); |
391 | int EvaluateHasOpposition(int, int, int); |
||
108 | pmbaty | 392 | void EvaluateKing(TREE *RESTRICT, int, int); |
393 | int EvaluateKingsFile(TREE * RESTRICT, int, int, int); |
||
33 | pmbaty | 394 | void EvaluateKnights(TREE *RESTRICT, int); |
395 | void EvaluateMate(TREE *RESTRICT, int); |
||
396 | void EvaluateMaterial(TREE *RESTRICT, int); |
||
397 | void EvaluatePassedPawns(TREE *RESTRICT, int, int); |
||
398 | void EvaluatePassedPawnRaces(TREE *RESTRICT, int); |
||
399 | void EvaluatePawns(TREE *RESTRICT, int); |
||
400 | void EvaluateQueens(TREE *RESTRICT, int); |
||
401 | void EvaluateRooks(TREE *RESTRICT, int); |
||
402 | int EvaluateWinningChances(TREE *RESTRICT, int, int); |
||
403 | void EVTest(char *); |
||
404 | int Exclude(TREE *RESTRICT, int, int); |
||
405 | int FindBlockID(TREE *RESTRICT); |
||
406 | char *FormatPV(TREE *RESTRICT, int, PATH); |
||
407 | int FTbSetCacheSize(void *, unsigned long); |
||
408 | int GameOver(int); |
||
108 | pmbaty | 409 | unsigned *GenerateCaptures(TREE *RESTRICT, int, int, unsigned *); |
410 | unsigned *GenerateCheckEvasions(TREE *RESTRICT, int, int, unsigned *); |
||
411 | unsigned *GenerateChecks(TREE *RESTRICT, int, unsigned *); |
||
412 | unsigned *GenerateNoncaptures(TREE *RESTRICT, int, int, unsigned *); |
||
413 | TREE *GetBlock(TREE *, int); |
||
33 | pmbaty | 414 | void Initialize(void); |
415 | void InitializeAttackBoards(void); |
||
416 | void InitializeChessBoard(TREE *); |
||
417 | int InitializeGetLogID(); |
||
108 | pmbaty | 418 | void InitializeHashTables(int); |
33 | pmbaty | 419 | void InitializeKillers(void); |
420 | void InitializeKingSafety(void); |
||
421 | void InitializeMagic(void); |
||
422 | uint64_t InitializeMagicBishop(int, uint64_t); |
||
423 | uint64_t InitializeMagicRook(int, uint64_t); |
||
424 | uint64_t InitializeMagicOccupied(int *, int, uint64_t); |
||
425 | void InitializeMasks(void); |
||
426 | void InitializePawnMasks(void); |
||
154 | pmbaty | 427 | void InitializeLMP(void); |
428 | void InitializeLMR(void); |
||
33 | pmbaty | 429 | void InitializeSMP(void); |
108 | pmbaty | 430 | int IInitializeTb(char *); |
431 | int InputMove(TREE *RESTRICT, int, int, int, int, char *); |
||
432 | int InputMoveICS(TREE *RESTRICT, int, int, int, int, char *); |
||
33 | pmbaty | 433 | uint64_t InterposeSquares(int, int, int); |
434 | void Interrupt(int); |
||
435 | int InvalidPosition(TREE *RESTRICT); |
||
436 | int Iterate(int, int, int); |
||
108 | pmbaty | 437 | int Join(int64_t); |
33 | pmbaty | 438 | void Kibitz(int, int, int, int, int, uint64_t, int, int, char *); |
108 | pmbaty | 439 | void History(TREE *RESTRICT, int, int, int, int, int*); |
33 | pmbaty | 440 | int KingPawnSquare(int, int, int, int); |
441 | int LearnAdjust(int); |
||
442 | void LearnBook(void); |
||
443 | int LearnFunction(int, int, int, int); |
||
444 | void LearnValue(int, int); |
||
445 | void MakeMove(TREE *RESTRICT, int, int, int); |
||
446 | void MakeMoveRoot(TREE *RESTRICT, int, int); |
||
154 | pmbaty | 447 | int Mated(TREE *RESTRICT, int, int); |
448 | int RootMoveEGTB(int); |
||
108 | pmbaty | 449 | int NextMove(TREE *RESTRICT, int, int, int, int); |
33 | pmbaty | 450 | int NextRootMove(TREE *RESTRICT, TREE *RESTRICT, int); |
451 | int NextRootMoveParallel(void); |
||
108 | pmbaty | 452 | void NextSort(TREE *RESTRICT, int); |
33 | pmbaty | 453 | int Option(TREE *RESTRICT); |
454 | int OptionMatch(char *, char *); |
||
455 | void OptionPerft(TREE *RESTRICT, int, int, int); |
||
108 | pmbaty | 456 | void Output(TREE *RESTRICT); |
33 | pmbaty | 457 | char *OutputMove(TREE *RESTRICT, int, int, int); |
458 | int ParseTime(char *); |
||
459 | void Pass(void); |
||
460 | int PinnedOnKing(TREE *RESTRICT, int, int); |
||
461 | int Ponder(int); |
||
462 | void Print(int, char *, ...); |
||
154 | pmbaty | 463 | int ProbeDTZ(TREE * RESTRICT tree, int ply, int wtm); |
108 | pmbaty | 464 | int HashProbe(TREE *RESTRICT, int, int, int, int, int, int*); |
465 | void HashStore(TREE *RESTRICT, int, int, int, int, int, int); |
||
466 | void HashStorePV(TREE *RESTRICT, int, int); |
||
33 | pmbaty | 467 | int Quiesce(TREE *RESTRICT, int, int, int, int, int); |
468 | int QuiesceEvasions(TREE *RESTRICT, int, int, int, int); |
||
108 | pmbaty | 469 | unsigned Random32(void); |
33 | pmbaty | 470 | uint64_t Random64(void); |
108 | pmbaty | 471 | int Read(int, char *); |
33 | pmbaty | 472 | int ReadChessMove(TREE *RESTRICT, FILE *, int, int); |
473 | void ReadClear(void); |
||
108 | pmbaty | 474 | unsigned ReadClock(void); |
33 | pmbaty | 475 | int ReadPGN(FILE *, int); |
476 | int ReadNextMove(TREE *RESTRICT, char *, int, int); |
||
477 | int ReadParse(char *, char *args[], char *); |
||
478 | int ReadInput(void); |
||
479 | int Repeat(TREE *RESTRICT, int); |
||
108 | pmbaty | 480 | int Repeat3x(TREE *RESTRICT); |
33 | pmbaty | 481 | void ResignOrDraw(TREE *RESTRICT, int); |
482 | void RestoreGame(void); |
||
483 | void RootMoveList(int); |
||
108 | pmbaty | 484 | int Search(TREE *RESTRICT, int, int, int, int, int, int, int); |
485 | int SearchMove(TREE *RESTRICT, int, int, int, int, int, int, int, int, int); |
||
486 | int SearchMoveList(TREE *RESTRICT, int, int, int, int, int, int *, int, int, int); |
||
487 | int SearchNull(TREE * RESTRICT, int, int, int, int); |
||
488 | void Trace(TREE *RESTRICT, int, int, int, int, int, const char *, int, int, int); |
||
33 | pmbaty | 489 | void SetBoard(TREE *, int, char **, int); |
490 | void SetChessBitBoards(TREE *); |
||
491 | void SharedFree(void *address); |
||
154 | pmbaty | 492 | void SortRootMoves(TREE *RESTRICT, int); |
108 | pmbaty | 493 | int Split(TREE *RESTRICT); |
33 | pmbaty | 494 | int StrCnt(char *, char); |
108 | pmbaty | 495 | int SEE(TREE *RESTRICT, int, int); |
496 | int SEEO(TREE *RESTRICT, int, int); |
||
497 | void Test(char *, FILE *, int, int); |
||
498 | void TestEPD(char *, FILE *, int, int); |
||
499 | void ThreadAffinity(int); |
||
33 | pmbaty | 500 | void *STDCALL ThreadInit(void *); |
501 | # if !defined(UNIX) |
||
502 | void ThreadMalloc(int64_t); |
||
503 | # endif |
||
108 | pmbaty | 504 | int ThreadSplit(TREE *RESTRICT, int, int, int, int, int); |
33 | pmbaty | 505 | void ThreadStop(TREE *RESTRICT); |
108 | pmbaty | 506 | void ThreadTrace(TREE * RESTRICT, int, int); |
507 | int ThreadWait(int, TREE *RESTRICT); |
||
508 | int Threat(TREE *, int, int, int, int); |
||
33 | pmbaty | 509 | void TimeAdjust(int, int); |
510 | int TimeCheck(TREE *RESTRICT, int); |
||
511 | void TimeSet(int); |
||
512 | void UnmakeMove(TREE *RESTRICT, int, int, int); |
||
513 | int ValidMove(TREE *RESTRICT, int, int, int); |
||
514 | int VerifyMove(TREE *RESTRICT, int, int, int); |
||
515 | void ValidatePosition(TREE *RESTRICT, int, int, char *); |
||
108 | pmbaty | 516 | void WaitForAllThreadsInitialized(void); |
33 | pmbaty | 517 | # if !defined(UNIX) |
518 | extern void *WinMallocInterleaved(size_t, int); |
||
519 | extern void WinFreeInterleaved(void *, size_t); |
||
108 | pmbaty | 520 | # define MallocInterleaved(cBytes, cThreads) \ |
521 | WinMallocInterleaved(cBytes, cThreads) |
||
522 | # define FreeInterleaved(pMemory, cBytes) \ |
||
523 | WinFreeInterleaved(pMemory, cBytes) |
||
33 | pmbaty | 524 | # else |
525 | # if defined(NUMA) |
||
526 | # define MallocInterleaved(cBytes, cThreads) numa_alloc_interleaved(cBytes) |
||
108 | pmbaty | 527 | # define FreeInterleaved(pMemory, cBytes) numa_free(pMemory, 1) |
33 | pmbaty | 528 | # else |
529 | # define MallocInterleaved(cBytes, cThreads) malloc(cBytes) |
||
108 | pmbaty | 530 | # define FreeInterleaved(pMemory, cBytes) free(pMemory) |
33 | pmbaty | 531 | # endif |
532 | # endif |
||
533 | # define Abs(a) (((a) > 0) ? (a) : -(a)) |
||
534 | # define Max(a,b) (((a) > (b)) ? (a) : (b)) |
||
535 | # define Min(a,b) (((a) < (b)) ? (a) : (b)) |
||
108 | pmbaty | 536 | # define Sign(a) ((a) < 0 ? -1 : +1) |
33 | pmbaty | 537 | # define FileDistance(a,b) abs(File(a) - File(b)) |
538 | # define RankDistance(a,b) abs(Rank(a) - Rank(b)) |
||
539 | # define Distance(a,b) Max(FileDistance(a,b), RankDistance(a,b)) |
||
108 | pmbaty | 540 | # define DrawScore(side) (draw_score[side]) |
33 | pmbaty | 541 | # define PopCnt8Bit(a) (pop_cnt_8bit[a]) |
542 | # define MSB8Bit(a) (msb_8bit[a]) |
||
543 | # define LSB8Bit(a) (lsb_8bit[a]) |
||
108 | pmbaty | 544 | # define HistoryIndex(side, m) ((side << 9) + (Piece(m) << 6) + To(m)) |
33 | pmbaty | 545 | /* |
108 | pmbaty | 546 | side = side to move |
547 | mptr = pointer into move list |
||
548 | m = bit vector of to squares to unpack |
||
549 | t = pre-computed from + moving piece |
||
33 | pmbaty | 550 | */ |
108 | pmbaty | 551 | # define Extract(side, mptr, m, t) \ |
552 | for ( ; m ; Clear(to, m)) { \ |
||
553 | to = MostAdvanced(side, m); \ |
||
554 | *mptr++ = t | (to << 6) | (Abs(PcOnSq(to)) << 15); \ |
||
33 | pmbaty | 555 | } |
556 | # define Check(side) Attacks(tree, Flip(side), KingSQ(side)) |
||
557 | # define Attack(from,to) (!(intervening[from][to] & OccupiedSquares)) |
||
558 | # define BishopAttacks(square, occ) *(magic_bishop_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) |
||
559 | # define BishopMobility(square, occ) *(magic_bishop_mobility_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) |
||
560 | # define KingAttacks(square) king_attacks[square] |
||
561 | # define KnightAttacks(square) knight_attacks[square] |
||
562 | # define PawnAttacks(side, square) pawn_attacks[side][square] |
||
563 | # define Reversible(p) (tree->status[p].reversible) |
||
154 | pmbaty | 564 | # define ReversibleMove(m) (!CaptureOrPromote(m) && Piece(m) != pawn) |
33 | pmbaty | 565 | # define RookAttacks(square, occ) *(magic_rook_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) |
566 | # define RookMobility(square, occ) *(magic_rook_mobility_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) |
||
567 | # define QueenAttacks(square, occ) (BishopAttacks(square, occ)|RookAttacks(square, occ)) |
||
108 | pmbaty | 568 | # define Rank(x) ((x)>>3) |
569 | # define File(x) ((x)&7) |
||
570 | # define Flip(x) ((x)^1) |
||
571 | # define MostAdvanced(side, squares) ((side) ? MSB(squares) : LSB(squares)) |
||
572 | # define LeastAdvanced(side, squares) ((side) ? LSB(squares) : MSB(squares)) |
||
33 | pmbaty | 573 | # define MinMax(side, v1, v2) ((side) ? Min((v1), (v2)) : Max((v1), (v2))) |
574 | # define InFront(side, k, p) ((side) ? k > p : k < p) |
||
575 | # define Behind(side, k, p) ((side) ? k < p : k > p) |
||
108 | pmbaty | 576 | # define Passed(sq, wtm) (!(mask_passed[wtm][sq] & Pawns(Flip(wtm)))) |
33 | pmbaty | 577 | # define RankAttacks(a) (RookAttacks(a, OccupiedSquares) & rank_mask[Rank(a)]) |
578 | # define FileAttacks(a) (RookAttacks(a, OccupiedSquares) & file_mask[File(a)]) |
||
579 | # define Diaga1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus9dir[a] | minus9dir[a])) |
||
580 | # define Diagh1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus7dir[a] | minus7dir[a])) |
||
581 | # define InterposeSquares(kingsq, checksq) intervening[kingsq][checksq] |
||
582 | /* |
||
583 | the following macros are used to extract the pieces of a move that are |
||
584 | kept compressed into the rightmost 21 bits of a simple integer. |
||
585 | */ |
||
586 | # define From(a) ((a) & 63) |
||
587 | # define To(a) (((a)>>6) & 63) |
||
588 | # define Piece(a) (((a)>>12) & 7) |
||
589 | # define Captured(a) (((a)>>15) & 7) |
||
590 | # define Promote(a) (((a)>>18) & 7) |
||
108 | pmbaty | 591 | # define Move(a) (a & 0x1fffff) |
592 | # define SortV(a) (a >> 21) |
||
33 | pmbaty | 593 | # define CaptureOrPromote(a) (((a)>>15) & 63) |
108 | pmbaty | 594 | # define PawnPush(c, a) (Piece(a) == pawn && \ |
595 | rankflip[c][Rank(To(a))] >= RANK6 \ |
||
596 | && !(mask_passed[c][To(a)] & \ |
||
597 | Pawns(Flip(c)))) |
||
598 | # define CastleMove(c, a) (Piece(a) == king && Abs(File(To(a)) - \ |
||
599 | File(From(a))) > 1) |
||
600 | # define SetMask(a) (set_mask[a]) |
||
601 | # define ClearMask(a) (clear_mask[a]) |
||
602 | # define Pawns(c) (tree->position.color[c].pieces[pawn]) |
||
603 | # define Knights(c) (tree->position.color[c].pieces[knight]) |
||
604 | # define Bishops(c) (tree->position.color[c].pieces[bishop]) |
||
605 | # define Rooks(c) (tree->position.color[c].pieces[rook]) |
||
606 | # define Queens(c) (tree->position.color[c].pieces[queen]) |
||
607 | # define Kings(c) (tree->position.color[c].pieces[king]) |
||
608 | # define KingSQ(c) (tree->position.kingsq[c]) |
||
609 | # define Occupied(c) (tree->position.color[c].pieces[occupied]) |
||
610 | # define Pieces(c, p) (tree->position.color[c].pieces[p]) |
||
611 | # define TotalPieces(c, p) (tree->position.pieces[c][p]) |
||
612 | # define PieceValues(c, p) (piece_values[c][p]) |
||
613 | # define TotalAllPieces (tree->position.total_all_pieces) |
||
614 | # define Material (tree->position.material_evaluation) |
||
615 | # define MaterialSTM(side) ((side) ? Material : -Material) |
||
616 | # define MateScore(s) (Abs(s) > 32000) |
||
154 | pmbaty | 617 | # define EGTBScore(s) (Abs(s) > 30000 && Abs(s) < 32000) |
108 | pmbaty | 618 | # define Castle(ply, c) (tree->status[ply].castle[c]) |
619 | # define HashKey (tree->position.hash_key) |
||
620 | # define PawnHashKey (tree->position.pawn_hash_key) |
||
621 | # define EnPassant(ply) (tree->status[ply].enpassant_target) |
||
622 | # define EnPassantTarget(ply) (EnPassant(ply) ? SetMask(EnPassant(ply)) : 0) |
||
623 | # define PcOnSq(sq) (tree->position.board[sq]) |
||
624 | # define OccupiedSquares (Occupied(white) | Occupied(black)) |
||
625 | # define Color(square) (square_color[square] ? dark_squares : ~dark_squares) |
||
626 | # define SideToMove(c) ((c) ? "White" : "Black") |
||
33 | pmbaty | 627 | /* |
628 | the following macros are used to Set and Clear a specific bit in the |
||
629 | second argument. this is done to make the code more readable, rather |
||
630 | than to make it faster. |
||
631 | */ |
||
632 | # define ClearSet(a,b) b=((a) ^ (b)) |
||
633 | # define Clear(a,b) b=ClearMask(a) & (b) |
||
634 | # define Set(a,b) b=SetMask(a) | (b) |
||
635 | /* |
||
636 | the following macros are used to update the hash signatures. |
||
637 | */ |
||
638 | # define Hash(stm,piece,square) (HashKey^=randoms[stm][piece][square]) |
||
639 | # define HashP(stm,square) (PawnHashKey^=randoms[stm][pawn][square]) |
||
640 | # define HashCastle(stm,direction) (HashKey^=castle_random[stm][direction]) |
||
641 | # define HashEP(sq) (HashKey^=enpassant_random[sq]) |
||
108 | pmbaty | 642 | # define SavePV(tree,ply,ph) do { \ |
643 | tree->pv[ply-1].path[ply-1]=tree->curmv[ply-1]; \ |
||
644 | tree->pv[ply-1].pathl=ply; \ |
||
645 | tree->pv[ply-1].pathh=ph; \ |
||
646 | tree->pv[ply-1].pathd=iteration;} while(0) |
||
33 | pmbaty | 647 | # if defined(INLINEASM) |
648 | # include "inline.h" |
||
649 | # endif |
||
650 | /* *INDENT-ON* */ |