Rev 108 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 108 | Rev 154 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | #include <time.h> |
35 | #include <time.h> |
36 | #include <stdio.h> |
36 | #include <stdio.h> |
37 | #include <assert.h> |
37 | #include <assert.h> |
38 | #include <stdlib.h> |
38 | #include <stdlib.h> |
39 | #include <string.h> |
39 | #include <string.h> |
40 | #if !defined(TYPES_INCLUDED) |
- | |
41 |
|
40 | #pragma once |
42 | # if !defined (UNIX) |
41 | # if !defined (UNIX) |
43 | # define RESTRICT __restrict |
42 | # define RESTRICT __restrict |
44 | # else |
43 | # else |
45 | # define RESTRICT |
44 | # define RESTRICT |
46 | # endif |
45 | # endif |
Line 67... | Line 66... | ||
67 | # endif |
66 | # endif |
68 | # if !defined(LOGDIR) |
67 | # if !defined(LOGDIR) |
69 | # define LOGDIR "." |
68 | # define LOGDIR "." |
70 | # endif |
69 | # endif |
71 | # if !defined(TBDIR) |
70 | # if !defined(TBDIR) |
72 | # define TBDIR "./ |
71 | # define TBDIR "./syzygy" |
73 | # endif |
72 | # endif |
74 | # if !defined(RCDIR) |
73 | # if !defined(RCDIR) |
75 | # define RCDIR "." |
74 | # define RCDIR "." |
76 | # endif |
75 | # endif |
77 | # include "lock.h" |
76 | # include "lock.h" |
Line 83... | Line 82... | ||
83 | # define SORT_BLOCK 4000000 |
82 | # define SORT_BLOCK 4000000 |
84 | # define LEARN_INTERVAL 10 |
83 | # define LEARN_INTERVAL 10 |
85 | # define LEARN_COUNTER_BAD -80 |
84 | # define LEARN_COUNTER_BAD -80 |
86 | # define LEARN_COUNTER_GOOD +100 |
85 | # define LEARN_COUNTER_GOOD +100 |
87 | # define MATE 32768 |
86 | # define MATE 32768 |
- | 87 | # define TBWIN 31000 |
|
88 | # define PAWN_VALUE 100 |
88 | # define PAWN_VALUE 100 |
89 | # define KNIGHT_VALUE 305 |
89 | # define KNIGHT_VALUE 305 |
90 | # define BISHOP_VALUE 305 |
90 | # define BISHOP_VALUE 305 |
91 | # define ROOK_VALUE 490 |
91 | # define ROOK_VALUE 490 |
92 | # define QUEEN_VALUE 1000 |
92 | # define QUEEN_VALUE 1000 |
93 | # define KING_VALUE 40000 |
93 | # define KING_VALUE 40000 |
- | 94 | # define FOREVER 1 |
|
94 | # if !defined(CLOCKS_PER_SEC) |
95 | # if !defined(CLOCKS_PER_SEC) |
95 | # define CLOCKS_PER_SEC 1000000 |
96 | # define CLOCKS_PER_SEC 1000000 |
96 | # endif |
97 | # endif |
97 | typedef enum { |
98 | typedef enum { |
98 | A1, B1, C1, D1, E1, F1, G1, H1, |
99 | A1, B1, C1, D1, E1, F1, G1, H1, |
Line 122... | Line 123... | ||
122 | int8_t castle[2]; |
123 | int8_t castle[2]; |
123 | uint8_t enpassant_target; |
124 | uint8_t enpassant_target; |
124 | uint8_t reversible; |
125 | uint8_t reversible; |
125 | } SEARCH_POSITION; |
126 | } SEARCH_POSITION; |
126 | typedef struct { |
127 | typedef struct { |
127 |
|
128 | uint32_t move1; |
128 |
|
129 | uint32_t move2; |
129 | } KILLER; |
130 | } KILLER; |
130 | typedef struct { |
131 | typedef struct { |
131 | uint64_t pieces[7]; |
132 | uint64_t pieces[7]; |
132 | } BB_PIECES; |
133 | } BB_PIECES; |
133 | typedef struct { |
134 | typedef struct { |
Line 223... | Line 224... | ||
223 | typedef struct tree { |
224 | typedef struct tree { |
224 | /* commonly used variables */ |
225 | /* commonly used variables */ |
225 | SEARCH_POSITION status[MAXPLY + 3]; |
226 | SEARCH_POSITION status[MAXPLY + 3]; |
226 | NEXT_MOVE next_status[MAXPLY]; |
227 | NEXT_MOVE next_status[MAXPLY]; |
227 | KILLER killers[MAXPLY]; |
228 | KILLER killers[MAXPLY]; |
- | 229 | KILLER counter_move[4096]; |
|
- | 230 | KILLER move_pair[4096]; |
|
228 | POSITION position; |
231 | POSITION position; |
229 | uint64_t save_hash_key[MAXPLY + 3]; |
232 | uint64_t save_hash_key[MAXPLY + 3]; |
230 | uint64_t save_pawn_hash_key[MAXPLY + 3]; |
233 | uint64_t save_pawn_hash_key[MAXPLY + 3]; |
231 | uint64_t rep_list[256]; |
234 | uint64_t rep_list[256]; |
232 | int curmv[MAXPLY]; |
235 | int curmv[MAXPLY]; |
Line 316... | Line 319... | ||
316 | # define EVALUATION 16 |
319 | # define EVALUATION 16 |
317 | # define ILLEGAL 0 |
320 | # define ILLEGAL 0 |
318 | # define LEGAL 1 |
321 | # define LEGAL 1 |
319 | # define IN_WINDOW 2 |
322 | # define IN_WINDOW 2 |
320 | # define FAIL_HIGH 3 |
323 | # define FAIL_HIGH 3 |
321 | #if /*defined(UNIX) &&*/ !defined(INLINEASM) // Pierre-Marie Baty -- we also use them on Windows... |
- | |
322 |
|
324 | #define PopCnt(v) __builtin_popcountll(v) |
323 |
|
325 | #define LSB(v) __builtin_ctzll(v) |
324 |
|
326 | #define MSB(v) (63 - __builtin_clzll(v)) |
325 | #endif |
- | |
326 | void AlignedMalloc(void **, |
327 | void AlignedMalloc(void **, uint64_t, size_t); |
327 | void AlignedRemalloc(void **, |
328 | void AlignedRemalloc(void **, uint64_t, size_t); |
328 | void Analyze(void); |
329 | void Analyze(void); |
329 | void Annotate(void); |
330 | void Annotate(void); |
330 | void AnnotateHeaderHTML(char *, FILE *); |
331 | void AnnotateHeaderHTML(char *, FILE *); |
331 | void AnnotateFooterHTML(FILE *); |
332 | void AnnotateFooterHTML(FILE *); |
332 | void AnnotatePositionHTML(TREE *RESTRICT, int, FILE *); |
333 | void AnnotatePositionHTML(TREE *RESTRICT, int, FILE *); |
Line 339... | Line 340... | ||
339 | uint64_t Attacked(TREE *RESTRICT, int, uint64_t); |
340 | uint64_t Attacked(TREE *RESTRICT, int, uint64_t); |
340 | uint64_t AttacksFrom(TREE *RESTRICT, int, int); |
341 | uint64_t AttacksFrom(TREE *RESTRICT, int, int); |
341 | uint64_t AttacksTo(TREE *RESTRICT, int); |
342 | uint64_t AttacksTo(TREE *RESTRICT, int); |
342 | void AutoTune(int, char **); |
343 | void AutoTune(int, char **); |
343 | int Bench(int, int); |
344 | int Bench(int, int); |
344 | int Bench_PGO(int, int); |
- | |
345 | int Book(TREE *RESTRICT, int); |
345 | int Book(TREE *RESTRICT, int); |
346 | void BookClusterIn(FILE *, int, BOOK_POSITION *); |
346 | void BookClusterIn(FILE *, int, BOOK_POSITION *); |
347 | void BookClusterOut(FILE *, int, BOOK_POSITION *); |
347 | void BookClusterOut(FILE *, int, BOOK_POSITION *); |
348 | int BookIn32(unsigned char *); |
348 | int BookIn32(unsigned char *); |
349 | float BookIn32f(unsigned char *); |
349 | float BookIn32f(unsigned char *); |
Line 380... | Line 380... | ||
380 | char *DisplayTime(unsigned); |
380 | char *DisplayTime(unsigned); |
381 | char *Display2Times(unsigned); |
381 | char *Display2Times(unsigned); |
382 | char *DisplayTimeKibitz(unsigned); |
382 | char *DisplayTimeKibitz(unsigned); |
383 | void DisplayChessMove(char *, int); |
383 | void DisplayChessMove(char *, int); |
384 | int Drawn(TREE *RESTRICT, int); |
384 | int Drawn(TREE *RESTRICT, int); |
- | 385 | int DTZtoWDL(int, int); |
|
385 | void Edit(void); |
386 | void Edit(void); |
386 | # if !defined(NOEGTB) |
- | |
387 | int EGTBProbe(TREE *RESTRICT, int, int, int *); |
- | |
388 | void EGTBPV(TREE *RESTRICT, int); |
- | |
389 | # endif |
- | |
390 | int Evaluate(TREE *RESTRICT, int, int, int, int); |
387 | int Evaluate(TREE *RESTRICT, int, int, int, int); |
391 | void EvaluateBishops(TREE *RESTRICT, int); |
388 | void EvaluateBishops(TREE *RESTRICT, int); |
392 | void EvaluateCastling(TREE *RESTRICT, int, int); |
389 | void EvaluateCastling(TREE *RESTRICT, int, int); |
393 | int EvaluateDraws(TREE *RESTRICT, int, int, int); |
390 | int EvaluateDraws(TREE *RESTRICT, int, int, int); |
394 | int EvaluateHasOpposition(int, int, int); |
391 | int EvaluateHasOpposition(int, int, int); |
Line 425... | Line 422... | ||
425 | uint64_t InitializeMagicBishop(int, uint64_t); |
422 | uint64_t InitializeMagicBishop(int, uint64_t); |
426 | uint64_t InitializeMagicRook(int, uint64_t); |
423 | uint64_t InitializeMagicRook(int, uint64_t); |
427 | uint64_t InitializeMagicOccupied(int *, int, uint64_t); |
424 | uint64_t InitializeMagicOccupied(int *, int, uint64_t); |
428 | void InitializeMasks(void); |
425 | void InitializeMasks(void); |
429 | void InitializePawnMasks(void); |
426 | void InitializePawnMasks(void); |
- | 427 | void InitializeLMP(void); |
|
430 | void |
428 | void InitializeLMR(void); |
431 | void InitializeSMP(void); |
429 | void InitializeSMP(void); |
432 | int IInitializeTb(char *); |
430 | int IInitializeTb(char *); |
433 | int InputMove(TREE *RESTRICT, int, int, int, int, char *); |
431 | int InputMove(TREE *RESTRICT, int, int, int, int, char *); |
434 | int InputMoveICS(TREE *RESTRICT, int, int, int, int, char *); |
432 | int InputMoveICS(TREE *RESTRICT, int, int, int, int, char *); |
435 | uint64_t InterposeSquares(int, int, int); |
433 | uint64_t InterposeSquares(int, int, int); |
Line 444... | Line 442... | ||
444 | void LearnBook(void); |
442 | void LearnBook(void); |
445 | int LearnFunction(int, int, int, int); |
443 | int LearnFunction(int, int, int, int); |
446 | void LearnValue(int, int); |
444 | void LearnValue(int, int); |
447 | void MakeMove(TREE *RESTRICT, int, int, int); |
445 | void MakeMove(TREE *RESTRICT, int, int, int); |
448 | void MakeMoveRoot(TREE *RESTRICT, int, int); |
446 | void MakeMoveRoot(TREE *RESTRICT, int, int); |
- | 447 | int Mated(TREE *RESTRICT, int, int); |
|
449 |
|
448 | int RootMoveEGTB(int); |
450 | int NextMove(TREE *RESTRICT, int, int, int, int); |
449 | int NextMove(TREE *RESTRICT, int, int, int, int); |
451 | int NextRootMove(TREE *RESTRICT, TREE *RESTRICT, int); |
450 | int NextRootMove(TREE *RESTRICT, TREE *RESTRICT, int); |
452 | int NextRootMoveParallel(void); |
451 | int NextRootMoveParallel(void); |
453 | void NextSort(TREE *RESTRICT, int); |
452 | void NextSort(TREE *RESTRICT, int); |
454 | int Option(TREE *RESTRICT); |
453 | int Option(TREE *RESTRICT); |
Line 459... | Line 458... | ||
459 | int ParseTime(char *); |
458 | int ParseTime(char *); |
460 | void Pass(void); |
459 | void Pass(void); |
461 | int PinnedOnKing(TREE *RESTRICT, int, int); |
460 | int PinnedOnKing(TREE *RESTRICT, int, int); |
462 | int Ponder(int); |
461 | int Ponder(int); |
463 | void Print(int, char *, ...); |
462 | void Print(int, char *, ...); |
- | 463 | int ProbeDTZ(TREE * RESTRICT tree, int ply, int wtm); |
|
464 | int HashProbe(TREE *RESTRICT, int, int, int, int, int, int*); |
464 | int HashProbe(TREE *RESTRICT, int, int, int, int, int, int*); |
465 | void HashStore(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); |
466 | void HashStorePV(TREE *RESTRICT, int, int); |
467 | int Quiesce(TREE *RESTRICT, int, int, int, int, int); |
467 | int Quiesce(TREE *RESTRICT, int, int, int, int, int); |
468 | int QuiesceEvasions(TREE *RESTRICT, int, int, int, int); |
468 | int QuiesceEvasions(TREE *RESTRICT, int, int, int, int); |
Line 487... | Line 487... | ||
487 | int SearchNull(TREE * RESTRICT, 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); |
488 | void Trace(TREE *RESTRICT, int, int, int, int, int, const char *, int, int, int); |
489 | void SetBoard(TREE *, int, char **, int); |
489 | void SetBoard(TREE *, int, char **, int); |
490 | void SetChessBitBoards(TREE *); |
490 | void SetChessBitBoards(TREE *); |
491 | void SharedFree(void *address); |
491 | void SharedFree(void *address); |
492 | void SortRootMoves( |
492 | void SortRootMoves(TREE *RESTRICT, int); |
493 | int Split(TREE *RESTRICT); |
493 | int Split(TREE *RESTRICT); |
494 | int StrCnt(char *, char); |
494 | int StrCnt(char *, char); |
495 | int SEE(TREE *RESTRICT, int, int); |
495 | int SEE(TREE *RESTRICT, int, int); |
496 | int SEEO(TREE *RESTRICT, int, int); |
496 | int SEEO(TREE *RESTRICT, int, int); |
497 | void Test(char *, FILE *, int, int); |
497 | void Test(char *, FILE *, int, int); |
Line 559... | Line 559... | ||
559 | # define BishopMobility(square, occ) *(magic_bishop_mobility_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] |
560 | # define KingAttacks(square) king_attacks[square] |
561 | # define KnightAttacks(square) knight_attacks[square] |
561 | # define KnightAttacks(square) knight_attacks[square] |
562 | # define PawnAttacks(side, square) pawn_attacks[side][square] |
562 | # define PawnAttacks(side, square) pawn_attacks[side][square] |
563 | # define Reversible(p) (tree->status[p].reversible) |
563 | # define Reversible(p) (tree->status[p].reversible) |
- | 564 | # define ReversibleMove(m) (!CaptureOrPromote(m) && Piece(m) != pawn) |
|
564 | # define RookAttacks(square, occ) *(magic_rook_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) |
565 | # define RookAttacks(square, occ) *(magic_rook_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) |
565 | # define RookMobility(square, occ) *(magic_rook_mobility_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])) |
566 | # define QueenAttacks(square, occ) (BishopAttacks(square, occ)|RookAttacks(square, occ)) |
567 | # define QueenAttacks(square, occ) (BishopAttacks(square, occ)|RookAttacks(square, occ)) |
567 | # define Rank(x) ((x)>>3) |
568 | # define Rank(x) ((x)>>3) |
568 | # define File(x) ((x)&7) |
569 | # define File(x) ((x)&7) |
Line 611... | Line 612... | ||
611 | # define PieceValues(c, p) (piece_values[c][p]) |
612 | # define PieceValues(c, p) (piece_values[c][p]) |
612 | # define TotalAllPieces (tree->position.total_all_pieces) |
613 | # define TotalAllPieces (tree->position.total_all_pieces) |
613 | # define Material (tree->position.material_evaluation) |
614 | # define Material (tree->position.material_evaluation) |
614 | # define MaterialSTM(side) ((side) ? Material : -Material) |
615 | # define MaterialSTM(side) ((side) ? Material : -Material) |
615 | # define MateScore(s) (Abs(s) > 32000) |
616 | # define MateScore(s) (Abs(s) > 32000) |
- | 617 | # define EGTBScore(s) (Abs(s) > 30000 && Abs(s) < 32000) |
|
616 | # define Castle(ply, c) (tree->status[ply].castle[c]) |
618 | # define Castle(ply, c) (tree->status[ply].castle[c]) |
617 | # define HashKey (tree->position.hash_key) |
619 | # define HashKey (tree->position.hash_key) |
618 | # define PawnHashKey (tree->position.pawn_hash_key) |
620 | # define PawnHashKey (tree->position.pawn_hash_key) |
619 | # define EnPassant(ply) (tree->status[ply].enpassant_target) |
621 | # define EnPassant(ply) (tree->status[ply].enpassant_target) |
620 | # define EnPassantTarget(ply) (EnPassant(ply) ? SetMask(EnPassant(ply)) : 0) |
622 | # define EnPassantTarget(ply) (EnPassant(ply) ? SetMask(EnPassant(ply)) : 0) |
Line 643... | Line 645... | ||
643 | tree->pv[ply-1].pathh=ph; \ |
645 | tree->pv[ply-1].pathh=ph; \ |
644 | tree->pv[ply-1].pathd=iteration;} while(0) |
646 | tree->pv[ply-1].pathd=iteration;} while(0) |
645 | # if defined(INLINEASM) |
647 | # if defined(INLINEASM) |
646 | # include "inline.h" |
648 | # include "inline.h" |
647 | # endif |
649 | # endif |
648 | #endif |
- | |
649 | /* *INDENT-ON* */ |
650 | /* *INDENT-ON* */ |