]> git.sesse.net Git - stockfish/blob - src/position.cpp
Introduce pawn structure based history
[stockfish] / src / position.cpp
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
4
5   Stockfish is free software: you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   Stockfish is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "position.h"
20
21 #include <algorithm>
22 #include <atomic>
23 #include <cassert>
24 #include <cctype>
25 #include <cstddef>
26 #include <cstring>
27 #include <initializer_list>
28 #include <iomanip>
29 #include <iostream>
30 #include <sstream>
31 #include <string_view>
32 #include <utility>
33
34 #include "bitboard.h"
35 #include "misc.h"
36 #include "movegen.h"
37 #include "nnue/nnue_common.h"
38 #include "syzygy/tbprobe.h"
39 #include "thread.h"
40 #include "tt.h"
41 #include "uci.h"
42
43 using std::string;
44
45 namespace Stockfish {
46
47 namespace Zobrist {
48
49 Key psq[PIECE_NB][SQUARE_NB];
50 Key enpassant[FILE_NB];
51 Key castling[CASTLING_RIGHT_NB];
52 Key side, noPawns;
53 }
54
55 namespace {
56
57 constexpr std::string_view PieceToChar(" PNBRQK  pnbrqk");
58
59 constexpr Piece Pieces[] = {W_PAWN, W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, W_KING,
60                             B_PAWN, B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, B_KING};
61 }  // namespace
62
63
64 // Returns an ASCII representation of the position
65 std::ostream& operator<<(std::ostream& os, const Position& pos) {
66
67     os << "\n +---+---+---+---+---+---+---+---+\n";
68
69     for (Rank r = RANK_8; r >= RANK_1; --r)
70     {
71         for (File f = FILE_A; f <= FILE_H; ++f)
72             os << " | " << PieceToChar[pos.piece_on(make_square(f, r))];
73
74         os << " | " << (1 + r) << "\n +---+---+---+---+---+---+---+---+\n";
75     }
76
77     os << "   a   b   c   d   e   f   g   h\n"
78        << "\nFen: " << pos.fen() << "\nKey: " << std::hex << std::uppercase << std::setfill('0')
79        << std::setw(16) << pos.key() << std::setfill(' ') << std::dec << "\nCheckers: ";
80
81     for (Bitboard b = pos.checkers(); b;)
82         os << UCI::square(pop_lsb(b)) << " ";
83
84     if (int(Tablebases::MaxCardinality) >= popcount(pos.pieces()) && !pos.can_castle(ANY_CASTLING))
85     {
86         StateInfo st;
87         ASSERT_ALIGNED(&st, Eval::NNUE::CacheLineSize);
88
89         Position p;
90         p.set(pos.fen(), pos.is_chess960(), &st, pos.this_thread());
91         Tablebases::ProbeState s1, s2;
92         Tablebases::WDLScore   wdl = Tablebases::probe_wdl(p, &s1);
93         int                    dtz = Tablebases::probe_dtz(p, &s2);
94         os << "\nTablebases WDL: " << std::setw(4) << wdl << " (" << s1 << ")"
95            << "\nTablebases DTZ: " << std::setw(4) << dtz << " (" << s2 << ")";
96     }
97
98     return os;
99 }
100
101
102 // Implements Marcel van Kervinck's cuckoo algorithm to detect repetition of positions
103 // for 3-fold repetition draws. The algorithm uses two hash tables with Zobrist hashes
104 // to allow fast detection of recurring positions. For details see:
105 // http://web.archive.org/web/20201107002606/https://marcelk.net/2013-04-06/paper/upcoming-rep-v2.pdf
106
107 // First and second hash functions for indexing the cuckoo tables
108 inline int H1(Key h) { return h & 0x1fff; }
109 inline int H2(Key h) { return (h >> 16) & 0x1fff; }
110
111 // Cuckoo tables with Zobrist hashes of valid reversible moves, and the moves themselves
112 Key  cuckoo[8192];
113 Move cuckooMove[8192];
114
115
116 // Initializes at startup the various arrays used to compute hash keys
117 void Position::init() {
118
119     PRNG rng(1070372);
120
121     for (Piece pc : Pieces)
122         for (Square s = SQ_A1; s <= SQ_H8; ++s)
123             Zobrist::psq[pc][s] = rng.rand<Key>();
124
125     for (File f = FILE_A; f <= FILE_H; ++f)
126         Zobrist::enpassant[f] = rng.rand<Key>();
127
128     for (int cr = NO_CASTLING; cr <= ANY_CASTLING; ++cr)
129         Zobrist::castling[cr] = rng.rand<Key>();
130
131     Zobrist::side    = rng.rand<Key>();
132     Zobrist::noPawns = rng.rand<Key>();
133
134     // Prepare the cuckoo tables
135     std::memset(cuckoo, 0, sizeof(cuckoo));
136     std::memset(cuckooMove, 0, sizeof(cuckooMove));
137     [[maybe_unused]] int count = 0;
138     for (Piece pc : Pieces)
139         for (Square s1 = SQ_A1; s1 <= SQ_H8; ++s1)
140             for (Square s2 = Square(s1 + 1); s2 <= SQ_H8; ++s2)
141                 if ((type_of(pc) != PAWN) && (attacks_bb(type_of(pc), s1, 0) & s2))
142                 {
143                     Move move = make_move(s1, s2);
144                     Key  key  = Zobrist::psq[pc][s1] ^ Zobrist::psq[pc][s2] ^ Zobrist::side;
145                     int  i    = H1(key);
146                     while (true)
147                     {
148                         std::swap(cuckoo[i], key);
149                         std::swap(cuckooMove[i], move);
150                         if (move == MOVE_NONE)  // Arrived at empty slot?
151                             break;
152                         i = (i == H1(key)) ? H2(key) : H1(key);  // Push victim to alternative slot
153                     }
154                     count++;
155                 }
156     assert(count == 3668);
157 }
158
159
160 // Initializes the position object with the given FEN string.
161 // This function is not very robust - make sure that input FENs are correct,
162 // this is assumed to be the responsibility of the GUI.
163 Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Thread* th) {
164     /*
165    A FEN string defines a particular position using only the ASCII character set.
166
167    A FEN string contains six fields separated by a space. The fields are:
168
169    1) Piece placement (from white's perspective). Each rank is described, starting
170       with rank 8 and ending with rank 1. Within each rank, the contents of each
171       square are described from file A through file H. Following the Standard
172       Algebraic Notation (SAN), each piece is identified by a single letter taken
173       from the standard English names. White pieces are designated using upper-case
174       letters ("PNBRQK") whilst Black uses lowercase ("pnbrqk"). Blank squares are
175       noted using digits 1 through 8 (the number of blank squares), and "/"
176       separates ranks.
177
178    2) Active color. "w" means white moves next, "b" means black.
179
180    3) Castling availability. If neither side can castle, this is "-". Otherwise,
181       this has one or more letters: "K" (White can castle kingside), "Q" (White
182       can castle queenside), "k" (Black can castle kingside), and/or "q" (Black
183       can castle queenside).
184
185    4) En passant target square (in algebraic notation). If there's no en passant
186       target square, this is "-". If a pawn has just made a 2-square move, this
187       is the position "behind" the pawn. Following X-FEN standard, this is recorded
188       only if there is a pawn in position to make an en passant capture, and if
189       there really is a pawn that might have advanced two squares.
190
191    5) Halfmove clock. This is the number of halfmoves since the last pawn advance
192       or capture. This is used to determine if a draw can be claimed under the
193       fifty-move rule.
194
195    6) Fullmove number. The number of the full move. It starts at 1, and is
196       incremented after Black's move.
197 */
198
199     unsigned char      col, row, token;
200     size_t             idx;
201     Square             sq = SQ_A8;
202     std::istringstream ss(fenStr);
203
204     std::memset(this, 0, sizeof(Position));
205     std::memset(si, 0, sizeof(StateInfo));
206     st = si;
207
208     ss >> std::noskipws;
209
210     // 1. Piece placement
211     while ((ss >> token) && !isspace(token))
212     {
213         if (isdigit(token))
214             sq += (token - '0') * EAST;  // Advance the given number of files
215
216         else if (token == '/')
217             sq += 2 * SOUTH;
218
219         else if ((idx = PieceToChar.find(token)) != string::npos)
220         {
221             put_piece(Piece(idx), sq);
222             ++sq;
223         }
224     }
225
226     // 2. Active color
227     ss >> token;
228     sideToMove = (token == 'w' ? WHITE : BLACK);
229     ss >> token;
230
231     // 3. Castling availability. Compatible with 3 standards: Normal FEN standard,
232     // Shredder-FEN that uses the letters of the columns on which the rooks began
233     // the game instead of KQkq and also X-FEN standard that, in case of Chess960,
234     // if an inner rook is associated with the castling right, the castling tag is
235     // replaced by the file letter of the involved rook, as for the Shredder-FEN.
236     while ((ss >> token) && !isspace(token))
237     {
238         Square rsq;
239         Color  c    = islower(token) ? BLACK : WHITE;
240         Piece  rook = make_piece(c, ROOK);
241
242         token = char(toupper(token));
243
244         if (token == 'K')
245             for (rsq = relative_square(c, SQ_H1); piece_on(rsq) != rook; --rsq)
246             {}
247
248         else if (token == 'Q')
249             for (rsq = relative_square(c, SQ_A1); piece_on(rsq) != rook; ++rsq)
250             {}
251
252         else if (token >= 'A' && token <= 'H')
253             rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1));
254
255         else
256             continue;
257
258         set_castling_right(c, rsq);
259     }
260
261     // 4. En passant square.
262     // Ignore if square is invalid or not on side to move relative rank 6.
263     bool enpassant = false;
264
265     if (((ss >> col) && (col >= 'a' && col <= 'h'))
266         && ((ss >> row) && (row == (sideToMove == WHITE ? '6' : '3'))))
267     {
268         st->epSquare = make_square(File(col - 'a'), Rank(row - '1'));
269
270         // En passant square will be considered only if
271         // a) side to move have a pawn threatening epSquare
272         // b) there is an enemy pawn in front of epSquare
273         // c) there is no piece on epSquare or behind epSquare
274         enpassant = pawn_attacks_bb(~sideToMove, st->epSquare) & pieces(sideToMove, PAWN)
275                  && (pieces(~sideToMove, PAWN) & (st->epSquare + pawn_push(~sideToMove)))
276                  && !(pieces() & (st->epSquare | (st->epSquare + pawn_push(sideToMove))));
277     }
278
279     if (!enpassant)
280         st->epSquare = SQ_NONE;
281
282     // 5-6. Halfmove clock and fullmove number
283     ss >> std::skipws >> st->rule50 >> gamePly;
284
285     // Convert from fullmove starting from 1 to gamePly starting from 0,
286     // handle also common incorrect FEN with fullmove = 0.
287     gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
288
289     chess960   = isChess960;
290     thisThread = th;
291     set_state();
292
293     assert(pos_is_ok());
294
295     return *this;
296 }
297
298
299 // Helper function used to set castling
300 // rights given the corresponding color and the rook starting square.
301 void Position::set_castling_right(Color c, Square rfrom) {
302
303     Square         kfrom = square<KING>(c);
304     CastlingRights cr    = c & (kfrom < rfrom ? KING_SIDE : QUEEN_SIDE);
305
306     st->castlingRights |= cr;
307     castlingRightsMask[kfrom] |= cr;
308     castlingRightsMask[rfrom] |= cr;
309     castlingRookSquare[cr] = rfrom;
310
311     Square kto = relative_square(c, cr & KING_SIDE ? SQ_G1 : SQ_C1);
312     Square rto = relative_square(c, cr & KING_SIDE ? SQ_F1 : SQ_D1);
313
314     castlingPath[cr] = (between_bb(rfrom, rto) | between_bb(kfrom, kto)) & ~(kfrom | rfrom);
315 }
316
317
318 // Sets king attacks to detect if a move gives check
319 void Position::set_check_info() const {
320
321     update_slider_blockers(WHITE);
322     update_slider_blockers(BLACK);
323
324     Square ksq = square<KING>(~sideToMove);
325
326     st->checkSquares[PAWN]   = pawn_attacks_bb(~sideToMove, ksq);
327     st->checkSquares[KNIGHT] = attacks_bb<KNIGHT>(ksq);
328     st->checkSquares[BISHOP] = attacks_bb<BISHOP>(ksq, pieces());
329     st->checkSquares[ROOK]   = attacks_bb<ROOK>(ksq, pieces());
330     st->checkSquares[QUEEN]  = st->checkSquares[BISHOP] | st->checkSquares[ROOK];
331     st->checkSquares[KING]   = 0;
332 }
333
334
335 // Computes the hash keys of the position, and other
336 // data that once computed is updated incrementally as moves are made.
337 // The function is only used when a new position is set up
338 void Position::set_state() const {
339
340     st->key = st->materialKey  = 0;
341     st->pawnKey                = Zobrist::noPawns;
342     st->nonPawnMaterial[WHITE] = st->nonPawnMaterial[BLACK] = VALUE_ZERO;
343     st->checkersBB = attackers_to(square<KING>(sideToMove)) & pieces(~sideToMove);
344
345     set_check_info();
346
347     for (Bitboard b = pieces(); b;)
348     {
349         Square s  = pop_lsb(b);
350         Piece  pc = piece_on(s);
351         st->key ^= Zobrist::psq[pc][s];
352
353         if (type_of(pc) == PAWN)
354             st->pawnKey ^= Zobrist::psq[pc][s];
355
356         else if (type_of(pc) != KING)
357             st->nonPawnMaterial[color_of(pc)] += PieceValue[pc];
358     }
359
360     if (st->epSquare != SQ_NONE)
361         st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
362
363     if (sideToMove == BLACK)
364         st->key ^= Zobrist::side;
365
366     st->key ^= Zobrist::castling[st->castlingRights];
367
368     for (Piece pc : Pieces)
369         for (int cnt = 0; cnt < pieceCount[pc]; ++cnt)
370             st->materialKey ^= Zobrist::psq[pc][cnt];
371 }
372
373
374 // Overload to initialize the position object with
375 // the given endgame code string like "KBPKN". It is mainly a helper to
376 // get the material key out of an endgame code.
377 Position& Position::set(const string& code, Color c, StateInfo* si) {
378
379     assert(code[0] == 'K');
380
381     string sides[] = {code.substr(code.find('K', 1)),                                // Weak
382                       code.substr(0, std::min(code.find('v'), code.find('K', 1)))};  // Strong
383
384     assert(sides[0].length() > 0 && sides[0].length() < 8);
385     assert(sides[1].length() > 0 && sides[1].length() < 8);
386
387     std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower);
388
389     string fenStr = "8/" + sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/" + sides[1]
390                   + char(8 - sides[1].length() + '0') + "/8 w - - 0 10";
391
392     return set(fenStr, false, si, nullptr);
393 }
394
395
396 // Returns a FEN representation of the position. In case of
397 // Chess960 the Shredder-FEN notation is used. This is mainly a debugging function.
398 string Position::fen() const {
399
400     int                emptyCnt;
401     std::ostringstream ss;
402
403     for (Rank r = RANK_8; r >= RANK_1; --r)
404     {
405         for (File f = FILE_A; f <= FILE_H; ++f)
406         {
407             for (emptyCnt = 0; f <= FILE_H && empty(make_square(f, r)); ++f)
408                 ++emptyCnt;
409
410             if (emptyCnt)
411                 ss << emptyCnt;
412
413             if (f <= FILE_H)
414                 ss << PieceToChar[piece_on(make_square(f, r))];
415         }
416
417         if (r > RANK_1)
418             ss << '/';
419     }
420
421     ss << (sideToMove == WHITE ? " w " : " b ");
422
423     if (can_castle(WHITE_OO))
424         ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE_OO))) : 'K');
425
426     if (can_castle(WHITE_OOO))
427         ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE_OOO))) : 'Q');
428
429     if (can_castle(BLACK_OO))
430         ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK_OO))) : 'k');
431
432     if (can_castle(BLACK_OOO))
433         ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK_OOO))) : 'q');
434
435     if (!can_castle(ANY_CASTLING))
436         ss << '-';
437
438     ss << (ep_square() == SQ_NONE ? " - " : " " + UCI::square(ep_square()) + " ") << st->rule50
439        << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
440
441     return ss.str();
442 }
443
444 // Calculates st->blockersForKing[c] and st->pinners[~c],
445 // which store respectively the pieces preventing king of color c from being in check
446 // and the slider pieces of color ~c pinning pieces of color c to the king.
447 void Position::update_slider_blockers(Color c) const {
448
449     Square ksq = square<KING>(c);
450
451     st->blockersForKing[c] = 0;
452     st->pinners[~c]        = 0;
453
454     // Snipers are sliders that attack 's' when a piece and other snipers are removed
455     Bitboard snipers = ((attacks_bb<ROOK>(ksq) & pieces(QUEEN, ROOK))
456                         | (attacks_bb<BISHOP>(ksq) & pieces(QUEEN, BISHOP)))
457                      & pieces(~c);
458     Bitboard occupancy = pieces() ^ snipers;
459
460     while (snipers)
461     {
462         Square   sniperSq = pop_lsb(snipers);
463         Bitboard b        = between_bb(ksq, sniperSq) & occupancy;
464
465         if (b && !more_than_one(b))
466         {
467             st->blockersForKing[c] |= b;
468             if (b & pieces(c))
469                 st->pinners[~c] |= sniperSq;
470         }
471     }
472 }
473
474
475 // Computes a bitboard of all pieces which attack a
476 // given square. Slider attacks use the occupied bitboard to indicate occupancy.
477 Bitboard Position::attackers_to(Square s, Bitboard occupied) const {
478
479     return (pawn_attacks_bb(BLACK, s) & pieces(WHITE, PAWN))
480          | (pawn_attacks_bb(WHITE, s) & pieces(BLACK, PAWN))
481          | (attacks_bb<KNIGHT>(s) & pieces(KNIGHT))
482          | (attacks_bb<ROOK>(s, occupied) & pieces(ROOK, QUEEN))
483          | (attacks_bb<BISHOP>(s, occupied) & pieces(BISHOP, QUEEN))
484          | (attacks_bb<KING>(s) & pieces(KING));
485 }
486
487
488 // Tests whether a pseudo-legal move is legal
489 bool Position::legal(Move m) const {
490
491     assert(is_ok(m));
492
493     Color  us   = sideToMove;
494     Square from = from_sq(m);
495     Square to   = to_sq(m);
496
497     assert(color_of(moved_piece(m)) == us);
498     assert(piece_on(square<KING>(us)) == make_piece(us, KING));
499
500     // En passant captures are a tricky special case. Because they are rather
501     // uncommon, we do it simply by testing whether the king is attacked after
502     // the move is made.
503     if (type_of(m) == EN_PASSANT)
504     {
505         Square   ksq      = square<KING>(us);
506         Square   capsq    = to - pawn_push(us);
507         Bitboard occupied = (pieces() ^ from ^ capsq) | to;
508
509         assert(to == ep_square());
510         assert(moved_piece(m) == make_piece(us, PAWN));
511         assert(piece_on(capsq) == make_piece(~us, PAWN));
512         assert(piece_on(to) == NO_PIECE);
513
514         return !(attacks_bb<ROOK>(ksq, occupied) & pieces(~us, QUEEN, ROOK))
515             && !(attacks_bb<BISHOP>(ksq, occupied) & pieces(~us, QUEEN, BISHOP));
516     }
517
518     // Castling moves generation does not check if the castling path is clear of
519     // enemy attacks, it is delayed at a later time: now!
520     if (type_of(m) == CASTLING)
521     {
522         // After castling, the rook and king final positions are the same in
523         // Chess960 as they would be in standard chess.
524         to             = relative_square(us, to > from ? SQ_G1 : SQ_C1);
525         Direction step = to > from ? WEST : EAST;
526
527         for (Square s = to; s != from; s += step)
528             if (attackers_to(s) & pieces(~us))
529                 return false;
530
531         // In case of Chess960, verify if the Rook blocks some checks.
532         // For instance an enemy queen in SQ_A1 when castling rook is in SQ_B1.
533         return !chess960 || !(blockers_for_king(us) & to_sq(m));
534     }
535
536     // If the moving piece is a king, check whether the destination square is
537     // attacked by the opponent.
538     if (type_of(piece_on(from)) == KING)
539         return !(attackers_to(to, pieces() ^ from) & pieces(~us));
540
541     // A non-king move is legal if and only if it is not pinned or it
542     // is moving along the ray towards or away from the king.
543     return !(blockers_for_king(us) & from) || aligned(from, to, square<KING>(us));
544 }
545
546
547 // Takes a random move and tests whether the move is
548 // pseudo-legal. It is used to validate moves from TT that can be corrupted
549 // due to SMP concurrent access or hash position key aliasing.
550 bool Position::pseudo_legal(const Move m) const {
551
552     Color  us   = sideToMove;
553     Square from = from_sq(m);
554     Square to   = to_sq(m);
555     Piece  pc   = moved_piece(m);
556
557     // Use a slower but simpler function for uncommon cases
558     // yet we skip the legality check of MoveList<LEGAL>().
559     if (type_of(m) != NORMAL)
560         return checkers() ? MoveList<EVASIONS>(*this).contains(m)
561                           : MoveList<NON_EVASIONS>(*this).contains(m);
562
563     // Is not a promotion, so the promotion piece must be empty
564     assert(promotion_type(m) - KNIGHT == NO_PIECE_TYPE);
565
566     // If the 'from' square is not occupied by a piece belonging to the side to
567     // move, the move is obviously not legal.
568     if (pc == NO_PIECE || color_of(pc) != us)
569         return false;
570
571     // The destination square cannot be occupied by a friendly piece
572     if (pieces(us) & to)
573         return false;
574
575     // Handle the special case of a pawn move
576     if (type_of(pc) == PAWN)
577     {
578         // We have already handled promotion moves, so destination
579         // cannot be on the 8th/1st rank.
580         if ((Rank8BB | Rank1BB) & to)
581             return false;
582
583         if (!(pawn_attacks_bb(us, from) & pieces(~us) & to)  // Not a capture
584             && !((from + pawn_push(us) == to) && empty(to))  // Not a single push
585             && !((from + 2 * pawn_push(us) == to)            // Not a double push
586                  && (relative_rank(us, from) == RANK_2) && empty(to) && empty(to - pawn_push(us))))
587             return false;
588     }
589     else if (!(attacks_bb(type_of(pc), from, pieces()) & to))
590         return false;
591
592     // Evasions generator already takes care to avoid some kind of illegal moves
593     // and legal() relies on this. We therefore have to take care that the same
594     // kind of moves are filtered out here.
595     if (checkers())
596     {
597         if (type_of(pc) != KING)
598         {
599             // Double check? In this case, a king move is required
600             if (more_than_one(checkers()))
601                 return false;
602
603             // Our move must be a blocking interposition or a capture of the checking piece
604             if (!(between_bb(square<KING>(us), lsb(checkers())) & to))
605                 return false;
606         }
607         // In case of king moves under check we have to remove the king so as to catch
608         // invalid moves like b1a1 when opposite queen is on c1.
609         else if (attackers_to(to, pieces() ^ from) & pieces(~us))
610             return false;
611     }
612
613     return true;
614 }
615
616
617 // Tests whether a pseudo-legal move gives a check
618 bool Position::gives_check(Move m) const {
619
620     assert(is_ok(m));
621     assert(color_of(moved_piece(m)) == sideToMove);
622
623     Square from = from_sq(m);
624     Square to   = to_sq(m);
625
626     // Is there a direct check?
627     if (check_squares(type_of(piece_on(from))) & to)
628         return true;
629
630     // Is there a discovered check?
631     if (blockers_for_king(~sideToMove) & from)
632         return !aligned(from, to, square<KING>(~sideToMove)) || type_of(m) == CASTLING;
633
634     switch (type_of(m))
635     {
636     case NORMAL :
637         return false;
638
639     case PROMOTION :
640         return attacks_bb(promotion_type(m), to, pieces() ^ from) & square<KING>(~sideToMove);
641
642     // En passant capture with check? We have already handled the case
643     // of direct checks and ordinary discovered check, so the only case we
644     // need to handle is the unusual case of a discovered check through
645     // the captured pawn.
646     case EN_PASSANT : {
647         Square   capsq = make_square(file_of(to), rank_of(from));
648         Bitboard b     = (pieces() ^ from ^ capsq) | to;
649
650         return (attacks_bb<ROOK>(square<KING>(~sideToMove), b) & pieces(sideToMove, QUEEN, ROOK))
651              | (attacks_bb<BISHOP>(square<KING>(~sideToMove), b)
652                 & pieces(sideToMove, QUEEN, BISHOP));
653     }
654     default :  //CASTLING
655     {
656         // Castling is encoded as 'king captures the rook'
657         Square rto = relative_square(sideToMove, to > from ? SQ_F1 : SQ_D1);
658
659         return check_squares(ROOK) & rto;
660     }
661     }
662 }
663
664
665 // Makes a move, and saves all information necessary
666 // to a StateInfo object. The move is assumed to be legal. Pseudo-legal
667 // moves should be filtered out before this function is called.
668 void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
669
670     assert(is_ok(m));
671     assert(&newSt != st);
672
673     thisThread->nodes.fetch_add(1, std::memory_order_relaxed);
674     Key k = st->key ^ Zobrist::side;
675
676     // Copy some fields of the old state to our new StateInfo object except the
677     // ones which are going to be recalculated from scratch anyway and then switch
678     // our state pointer to point to the new (ready to be updated) state.
679     std::memcpy(&newSt, st, offsetof(StateInfo, key));
680     newSt.previous = st;
681     st             = &newSt;
682
683     // Increment ply counters. In particular, rule50 will be reset to zero later on
684     // in case of a capture or a pawn move.
685     ++gamePly;
686     ++st->rule50;
687     ++st->pliesFromNull;
688
689     // Used by NNUE
690     st->accumulator.computed[WHITE] = false;
691     st->accumulator.computed[BLACK] = false;
692     auto& dp                        = st->dirtyPiece;
693     dp.dirty_num                    = 1;
694
695     Color  us       = sideToMove;
696     Color  them     = ~us;
697     Square from     = from_sq(m);
698     Square to       = to_sq(m);
699     Piece  pc       = piece_on(from);
700     Piece  captured = type_of(m) == EN_PASSANT ? make_piece(them, PAWN) : piece_on(to);
701
702     assert(color_of(pc) == us);
703     assert(captured == NO_PIECE || color_of(captured) == (type_of(m) != CASTLING ? them : us));
704     assert(type_of(captured) != KING);
705
706     if (type_of(m) == CASTLING)
707     {
708         assert(pc == make_piece(us, KING));
709         assert(captured == make_piece(us, ROOK));
710
711         Square rfrom, rto;
712         do_castling<true>(us, from, to, rfrom, rto);
713
714         k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto];
715         captured = NO_PIECE;
716     }
717
718     if (captured)
719     {
720         Square capsq = to;
721
722         // If the captured piece is a pawn, update pawn hash key, otherwise
723         // update non-pawn material.
724         if (type_of(captured) == PAWN)
725         {
726             if (type_of(m) == EN_PASSANT)
727             {
728                 capsq -= pawn_push(us);
729
730                 assert(pc == make_piece(us, PAWN));
731                 assert(to == st->epSquare);
732                 assert(relative_rank(us, to) == RANK_6);
733                 assert(piece_on(to) == NO_PIECE);
734                 assert(piece_on(capsq) == make_piece(them, PAWN));
735             }
736
737             st->pawnKey ^= Zobrist::psq[captured][capsq];
738         }
739         else
740             st->nonPawnMaterial[them] -= PieceValue[captured];
741
742         dp.dirty_num = 2;  // 1 piece moved, 1 piece captured
743         dp.piece[1]  = captured;
744         dp.from[1]   = capsq;
745         dp.to[1]     = SQ_NONE;
746
747         // Update board and piece lists
748         remove_piece(capsq);
749
750         // Update material hash key and prefetch access to materialTable
751         k ^= Zobrist::psq[captured][capsq];
752         st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]];
753
754         // Reset rule 50 counter
755         st->rule50 = 0;
756     }
757
758     // Update hash key
759     k ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
760
761     // Reset en passant square
762     if (st->epSquare != SQ_NONE)
763     {
764         k ^= Zobrist::enpassant[file_of(st->epSquare)];
765         st->epSquare = SQ_NONE;
766     }
767
768     // Update castling rights if needed
769     if (st->castlingRights && (castlingRightsMask[from] | castlingRightsMask[to]))
770     {
771         k ^= Zobrist::castling[st->castlingRights];
772         st->castlingRights &= ~(castlingRightsMask[from] | castlingRightsMask[to]);
773         k ^= Zobrist::castling[st->castlingRights];
774     }
775
776     // Move the piece. The tricky Chess960 castling is handled earlier
777     if (type_of(m) != CASTLING)
778     {
779         dp.piece[0] = pc;
780         dp.from[0]  = from;
781         dp.to[0]    = to;
782
783         move_piece(from, to);
784     }
785
786     // If the moving piece is a pawn do some special extra work
787     if (type_of(pc) == PAWN)
788     {
789         // Set en passant square if the moved pawn can be captured
790         if ((int(to) ^ int(from)) == 16
791             && (pawn_attacks_bb(us, to - pawn_push(us)) & pieces(them, PAWN)))
792         {
793             st->epSquare = to - pawn_push(us);
794             k ^= Zobrist::enpassant[file_of(st->epSquare)];
795         }
796
797         else if (type_of(m) == PROMOTION)
798         {
799             Piece promotion = make_piece(us, promotion_type(m));
800
801             assert(relative_rank(us, to) == RANK_8);
802             assert(type_of(promotion) >= KNIGHT && type_of(promotion) <= QUEEN);
803
804             remove_piece(to);
805             put_piece(promotion, to);
806
807             // Promoting pawn to SQ_NONE, promoted piece from SQ_NONE
808             dp.to[0]               = SQ_NONE;
809             dp.piece[dp.dirty_num] = promotion;
810             dp.from[dp.dirty_num]  = SQ_NONE;
811             dp.to[dp.dirty_num]    = to;
812             dp.dirty_num++;
813
814             // Update hash keys
815             k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[promotion][to];
816             st->pawnKey ^= Zobrist::psq[pc][to];
817             st->materialKey ^=
818               Zobrist::psq[promotion][pieceCount[promotion] - 1] ^ Zobrist::psq[pc][pieceCount[pc]];
819
820             // Update material
821             st->nonPawnMaterial[us] += PieceValue[promotion];
822         }
823
824         // Update pawn hash key
825         st->pawnKey ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
826
827         // Reset rule 50 draw counter
828         st->rule50 = 0;
829     }
830
831     // Set capture piece
832     st->capturedPiece = captured;
833
834     // Update the key with the final value
835     st->key = k;
836
837     // Calculate checkers bitboard (if move gives check)
838     st->checkersBB = givesCheck ? attackers_to(square<KING>(them)) & pieces(us) : 0;
839
840     sideToMove = ~sideToMove;
841
842     // Update king attacks used for fast check detection
843     set_check_info();
844
845     // Calculate the repetition info. It is the ply distance from the previous
846     // occurrence of the same position, negative in the 3-fold case, or zero
847     // if the position was not repeated.
848     st->repetition = 0;
849     int end        = std::min(st->rule50, st->pliesFromNull);
850     if (end >= 4)
851     {
852         StateInfo* stp = st->previous->previous;
853         for (int i = 4; i <= end; i += 2)
854         {
855             stp = stp->previous->previous;
856             if (stp->key == st->key)
857             {
858                 st->repetition = stp->repetition ? -i : i;
859                 break;
860             }
861         }
862     }
863
864     assert(pos_is_ok());
865 }
866
867
868 // Unmakes a move. When it returns, the position should
869 // be restored to exactly the same state as before the move was made.
870 void Position::undo_move(Move m) {
871
872     assert(is_ok(m));
873
874     sideToMove = ~sideToMove;
875
876     Color  us   = sideToMove;
877     Square from = from_sq(m);
878     Square to   = to_sq(m);
879     Piece  pc   = piece_on(to);
880
881     assert(empty(from) || type_of(m) == CASTLING);
882     assert(type_of(st->capturedPiece) != KING);
883
884     if (type_of(m) == PROMOTION)
885     {
886         assert(relative_rank(us, to) == RANK_8);
887         assert(type_of(pc) == promotion_type(m));
888         assert(type_of(pc) >= KNIGHT && type_of(pc) <= QUEEN);
889
890         remove_piece(to);
891         pc = make_piece(us, PAWN);
892         put_piece(pc, to);
893     }
894
895     if (type_of(m) == CASTLING)
896     {
897         Square rfrom, rto;
898         do_castling<false>(us, from, to, rfrom, rto);
899     }
900     else
901     {
902         move_piece(to, from);  // Put the piece back at the source square
903
904         if (st->capturedPiece)
905         {
906             Square capsq = to;
907
908             if (type_of(m) == EN_PASSANT)
909             {
910                 capsq -= pawn_push(us);
911
912                 assert(type_of(pc) == PAWN);
913                 assert(to == st->previous->epSquare);
914                 assert(relative_rank(us, to) == RANK_6);
915                 assert(piece_on(capsq) == NO_PIECE);
916                 assert(st->capturedPiece == make_piece(~us, PAWN));
917             }
918
919             put_piece(st->capturedPiece, capsq);  // Restore the captured piece
920         }
921     }
922
923     // Finally point our state pointer back to the previous state
924     st = st->previous;
925     --gamePly;
926
927     assert(pos_is_ok());
928 }
929
930
931 // Helper used to do/undo a castling move. This
932 // is a bit tricky in Chess960 where from/to squares can overlap.
933 template<bool Do>
934 void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
935
936     bool kingSide = to > from;
937     rfrom         = to;  // Castling is encoded as "king captures friendly rook"
938     rto           = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
939     to            = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
940
941     if (Do)
942     {
943         auto& dp     = st->dirtyPiece;
944         dp.piece[0]  = make_piece(us, KING);
945         dp.from[0]   = from;
946         dp.to[0]     = to;
947         dp.piece[1]  = make_piece(us, ROOK);
948         dp.from[1]   = rfrom;
949         dp.to[1]     = rto;
950         dp.dirty_num = 2;
951     }
952
953     // Remove both pieces first since squares could overlap in Chess960
954     remove_piece(Do ? from : to);
955     remove_piece(Do ? rfrom : rto);
956     board[Do ? from : to] = board[Do ? rfrom : rto] =
957       NO_PIECE;  // remove_piece does not do this for us
958     put_piece(make_piece(us, KING), Do ? to : from);
959     put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
960 }
961
962
963 // Used to do a "null move": it flips
964 // the side to move without executing any move on the board.
965 void Position::do_null_move(StateInfo& newSt) {
966
967     assert(!checkers());
968     assert(&newSt != st);
969
970     std::memcpy(&newSt, st, offsetof(StateInfo, accumulator));
971
972     newSt.previous = st;
973     st             = &newSt;
974
975     st->dirtyPiece.dirty_num        = 0;
976     st->dirtyPiece.piece[0]         = NO_PIECE;  // Avoid checks in UpdateAccumulator()
977     st->accumulator.computed[WHITE] = false;
978     st->accumulator.computed[BLACK] = false;
979
980     if (st->epSquare != SQ_NONE)
981     {
982         st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
983         st->epSquare = SQ_NONE;
984     }
985
986     st->key ^= Zobrist::side;
987     ++st->rule50;
988     prefetch(TT.first_entry(key()));
989
990     st->pliesFromNull = 0;
991
992     sideToMove = ~sideToMove;
993
994     set_check_info();
995
996     st->repetition = 0;
997
998     assert(pos_is_ok());
999 }
1000
1001
1002 // Must be used to undo a "null move"
1003 void Position::undo_null_move() {
1004
1005     assert(!checkers());
1006
1007     st         = st->previous;
1008     sideToMove = ~sideToMove;
1009 }
1010
1011
1012 // Computes the new hash key after the given move. Needed
1013 // for speculative prefetch. It doesn't recognize special moves like castling,
1014 // en passant and promotions.
1015 Key Position::key_after(Move m) const {
1016
1017     Square from     = from_sq(m);
1018     Square to       = to_sq(m);
1019     Piece  pc       = piece_on(from);
1020     Piece  captured = piece_on(to);
1021     Key    k        = st->key ^ Zobrist::side;
1022
1023     if (captured)
1024         k ^= Zobrist::psq[captured][to];
1025
1026     k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[pc][from];
1027
1028     return (captured || type_of(pc) == PAWN) ? k : adjust_key50<true>(k);
1029 }
1030
1031
1032 // Tests if the SEE (Static Exchange Evaluation)
1033 // value of move is greater or equal to the given threshold. We'll use an
1034 // algorithm similar to alpha-beta pruning with a null window.
1035 bool Position::see_ge(Move m, Value threshold) const {
1036
1037     assert(is_ok(m));
1038
1039     // Only deal with normal moves, assume others pass a simple SEE
1040     if (type_of(m) != NORMAL)
1041         return VALUE_ZERO >= threshold;
1042
1043     Square from = from_sq(m), to = to_sq(m);
1044
1045     int swap = PieceValue[piece_on(to)] - threshold;
1046     if (swap < 0)
1047         return false;
1048
1049     swap = PieceValue[piece_on(from)] - swap;
1050     if (swap <= 0)
1051         return true;
1052
1053     assert(color_of(piece_on(from)) == sideToMove);
1054     Bitboard occupied  = pieces() ^ from ^ to;  // xoring to is important for pinned piece logic
1055     Color    stm       = sideToMove;
1056     Bitboard attackers = attackers_to(to, occupied);
1057     Bitboard stmAttackers, bb;
1058     int      res = 1;
1059
1060     while (true)
1061     {
1062         stm = ~stm;
1063         attackers &= occupied;
1064
1065         // If stm has no more attackers then give up: stm loses
1066         if (!(stmAttackers = attackers & pieces(stm)))
1067             break;
1068
1069         // Don't allow pinned pieces to attack as long as there are
1070         // pinners on their original square.
1071         if (pinners(~stm) & occupied)
1072         {
1073             stmAttackers &= ~blockers_for_king(stm);
1074
1075             if (!stmAttackers)
1076                 break;
1077         }
1078
1079         res ^= 1;
1080
1081         // Locate and remove the next least valuable attacker, and add to
1082         // the bitboard 'attackers' any X-ray attackers behind it.
1083         if ((bb = stmAttackers & pieces(PAWN)))
1084         {
1085             if ((swap = PawnValue - swap) < res)
1086                 break;
1087             occupied ^= least_significant_square_bb(bb);
1088
1089             attackers |= attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN);
1090         }
1091
1092         else if ((bb = stmAttackers & pieces(KNIGHT)))
1093         {
1094             if ((swap = KnightValue - swap) < res)
1095                 break;
1096             occupied ^= least_significant_square_bb(bb);
1097         }
1098
1099         else if ((bb = stmAttackers & pieces(BISHOP)))
1100         {
1101             if ((swap = BishopValue - swap) < res)
1102                 break;
1103             occupied ^= least_significant_square_bb(bb);
1104
1105             attackers |= attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN);
1106         }
1107
1108         else if ((bb = stmAttackers & pieces(ROOK)))
1109         {
1110             if ((swap = RookValue - swap) < res)
1111                 break;
1112             occupied ^= least_significant_square_bb(bb);
1113
1114             attackers |= attacks_bb<ROOK>(to, occupied) & pieces(ROOK, QUEEN);
1115         }
1116
1117         else if ((bb = stmAttackers & pieces(QUEEN)))
1118         {
1119             if ((swap = QueenValue - swap) < res)
1120                 break;
1121             occupied ^= least_significant_square_bb(bb);
1122
1123             attackers |= (attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN))
1124                        | (attacks_bb<ROOK>(to, occupied) & pieces(ROOK, QUEEN));
1125         }
1126
1127         else  // KING
1128               // If we "capture" with the king but the opponent still has attackers,
1129               // reverse the result.
1130             return (attackers & ~pieces(stm)) ? res ^ 1 : res;
1131     }
1132
1133     return bool(res);
1134 }
1135
1136 // Tests whether the position is drawn by 50-move rule
1137 // or by repetition. It does not detect stalemates.
1138 bool Position::is_draw(int ply) const {
1139
1140     if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
1141         return true;
1142
1143     // Return a draw score if a position repeats once earlier but strictly
1144     // after the root, or repeats twice before or at the root.
1145     return st->repetition && st->repetition < ply;
1146 }
1147
1148
1149 // Tests whether there has been at least one repetition
1150 // of positions since the last capture or pawn move.
1151 bool Position::has_repeated() const {
1152
1153     StateInfo* stc = st;
1154     int        end = std::min(st->rule50, st->pliesFromNull);
1155     while (end-- >= 4)
1156     {
1157         if (stc->repetition)
1158             return true;
1159
1160         stc = stc->previous;
1161     }
1162     return false;
1163 }
1164
1165
1166 // Tests if the position has a move which draws by repetition,
1167 // or an earlier position has a move that directly reaches the current position.
1168 bool Position::has_game_cycle(int ply) const {
1169
1170     int j;
1171
1172     int end = std::min(st->rule50, st->pliesFromNull);
1173
1174     if (end < 3)
1175         return false;
1176
1177     Key        originalKey = st->key;
1178     StateInfo* stp         = st->previous;
1179
1180     for (int i = 3; i <= end; i += 2)
1181     {
1182         stp = stp->previous->previous;
1183
1184         Key moveKey = originalKey ^ stp->key;
1185         if ((j = H1(moveKey), cuckoo[j] == moveKey) || (j = H2(moveKey), cuckoo[j] == moveKey))
1186         {
1187             Move   move = cuckooMove[j];
1188             Square s1   = from_sq(move);
1189             Square s2   = to_sq(move);
1190
1191             if (!((between_bb(s1, s2) ^ s2) & pieces()))
1192             {
1193                 if (ply > i)
1194                     return true;
1195
1196                 // For nodes before or at the root, check that the move is a
1197                 // repetition rather than a move to the current position.
1198                 // In the cuckoo table, both moves Rc1c5 and Rc5c1 are stored in
1199                 // the same location, so we have to select which square to check.
1200                 if (color_of(piece_on(empty(s1) ? s2 : s1)) != side_to_move())
1201                     continue;
1202
1203                 // For repetitions before or at the root, require one more
1204                 if (stp->repetition)
1205                     return true;
1206             }
1207         }
1208     }
1209     return false;
1210 }
1211
1212
1213 // Flips position with the white and black sides reversed. This
1214 // is only useful for debugging e.g. for finding evaluation symmetry bugs.
1215 void Position::flip() {
1216
1217     string            f, token;
1218     std::stringstream ss(fen());
1219
1220     for (Rank r = RANK_8; r >= RANK_1; --r)  // Piece placement
1221     {
1222         std::getline(ss, token, r > RANK_1 ? '/' : ' ');
1223         f.insert(0, token + (f.empty() ? " " : "/"));
1224     }
1225
1226     ss >> token;                        // Active color
1227     f += (token == "w" ? "B " : "W ");  // Will be lowercased later
1228
1229     ss >> token;  // Castling availability
1230     f += token + " ";
1231
1232     std::transform(f.begin(), f.end(), f.begin(),
1233                    [](char c) { return char(islower(c) ? toupper(c) : tolower(c)); });
1234
1235     ss >> token;  // En passant square
1236     f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3"));
1237
1238     std::getline(ss, token);  // Half and full moves
1239     f += token;
1240
1241     set(f, is_chess960(), st, this_thread());
1242
1243     assert(pos_is_ok());
1244 }
1245
1246
1247 // Performs some consistency checks for the
1248 // position object and raise an assert if something wrong is detected.
1249 // This is meant to be helpful when debugging.
1250 bool Position::pos_is_ok() const {
1251
1252     constexpr bool Fast = true;  // Quick (default) or full check?
1253
1254     if ((sideToMove != WHITE && sideToMove != BLACK) || piece_on(square<KING>(WHITE)) != W_KING
1255         || piece_on(square<KING>(BLACK)) != B_KING
1256         || (ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6))
1257         assert(0 && "pos_is_ok: Default");
1258
1259     if (Fast)
1260         return true;
1261
1262     if (pieceCount[W_KING] != 1 || pieceCount[B_KING] != 1
1263         || attackers_to(square<KING>(~sideToMove)) & pieces(sideToMove))
1264         assert(0 && "pos_is_ok: Kings");
1265
1266     if ((pieces(PAWN) & (Rank1BB | Rank8BB)) || pieceCount[W_PAWN] > 8 || pieceCount[B_PAWN] > 8)
1267         assert(0 && "pos_is_ok: Pawns");
1268
1269     if ((pieces(WHITE) & pieces(BLACK)) || (pieces(WHITE) | pieces(BLACK)) != pieces()
1270         || popcount(pieces(WHITE)) > 16 || popcount(pieces(BLACK)) > 16)
1271         assert(0 && "pos_is_ok: Bitboards");
1272
1273     for (PieceType p1 = PAWN; p1 <= KING; ++p1)
1274         for (PieceType p2 = PAWN; p2 <= KING; ++p2)
1275             if (p1 != p2 && (pieces(p1) & pieces(p2)))
1276                 assert(0 && "pos_is_ok: Bitboards");
1277
1278
1279     for (Piece pc : Pieces)
1280         if (pieceCount[pc] != popcount(pieces(color_of(pc), type_of(pc)))
1281             || pieceCount[pc] != std::count(board, board + SQUARE_NB, pc))
1282             assert(0 && "pos_is_ok: Pieces");
1283
1284     for (Color c : {WHITE, BLACK})
1285         for (CastlingRights cr : {c & KING_SIDE, c & QUEEN_SIDE})
1286         {
1287             if (!can_castle(cr))
1288                 continue;
1289
1290             if (piece_on(castlingRookSquare[cr]) != make_piece(c, ROOK)
1291                 || castlingRightsMask[castlingRookSquare[cr]] != cr
1292                 || (castlingRightsMask[square<KING>(c)] & cr) != cr)
1293                 assert(0 && "pos_is_ok: Castling");
1294         }
1295
1296     return true;
1297 }
1298
1299 }  // namespace Stockfish