]> git.sesse.net Git - stockfish/blob - src/position.cpp
Fix compilation after recent merge.
[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 the given endgame code string
375 // like "KBPKN". It's mainly a helper to get the material key out of an endgame code.
376 Position& Position::set(const string& code, Color c, StateInfo* si) {
377
378     assert(code[0] == 'K');
379
380     string sides[] = {code.substr(code.find('K', 1)),                                // Weak
381                       code.substr(0, std::min(code.find('v'), code.find('K', 1)))};  // Strong
382
383     assert(sides[0].length() > 0 && sides[0].length() < 8);
384     assert(sides[1].length() > 0 && sides[1].length() < 8);
385
386     std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower);
387
388     string fenStr = "8/" + sides[0] + char(8 - sides[0].length() + '0') + "/8/8/8/8/" + sides[1]
389                   + char(8 - sides[1].length() + '0') + "/8 w - - 0 10";
390
391     return set(fenStr, false, si, nullptr);
392 }
393
394
395 // Returns a FEN representation of the position. In case of
396 // Chess960 the Shredder-FEN notation is used. This is mainly a debugging function.
397 string Position::fen() const {
398
399     int                emptyCnt;
400     std::ostringstream ss;
401
402     for (Rank r = RANK_8; r >= RANK_1; --r)
403     {
404         for (File f = FILE_A; f <= FILE_H; ++f)
405         {
406             for (emptyCnt = 0; f <= FILE_H && empty(make_square(f, r)); ++f)
407                 ++emptyCnt;
408
409             if (emptyCnt)
410                 ss << emptyCnt;
411
412             if (f <= FILE_H)
413                 ss << PieceToChar[piece_on(make_square(f, r))];
414         }
415
416         if (r > RANK_1)
417             ss << '/';
418     }
419
420     ss << (sideToMove == WHITE ? " w " : " b ");
421
422     if (can_castle(WHITE_OO))
423         ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE_OO))) : 'K');
424
425     if (can_castle(WHITE_OOO))
426         ss << (chess960 ? char('A' + file_of(castling_rook_square(WHITE_OOO))) : 'Q');
427
428     if (can_castle(BLACK_OO))
429         ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK_OO))) : 'k');
430
431     if (can_castle(BLACK_OOO))
432         ss << (chess960 ? char('a' + file_of(castling_rook_square(BLACK_OOO))) : 'q');
433
434     if (!can_castle(ANY_CASTLING))
435         ss << '-';
436
437     ss << (ep_square() == SQ_NONE ? " - " : " " + UCI::square(ep_square()) + " ") << st->rule50
438        << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
439
440     return ss.str();
441 }
442
443 // Calculates st->blockersForKing[c] and st->pinners[~c],
444 // which store respectively the pieces preventing king of color c from being in check
445 // and the slider pieces of color ~c pinning pieces of color c to the king.
446 void Position::update_slider_blockers(Color c) const {
447
448     Square ksq = square<KING>(c);
449
450     st->blockersForKing[c] = 0;
451     st->pinners[~c]        = 0;
452
453     // Snipers are sliders that attack 's' when a piece and other snipers are removed
454     Bitboard snipers = ((attacks_bb<ROOK>(ksq) & pieces(QUEEN, ROOK))
455                         | (attacks_bb<BISHOP>(ksq) & pieces(QUEEN, BISHOP)))
456                      & pieces(~c);
457     Bitboard occupancy = pieces() ^ snipers;
458
459     while (snipers)
460     {
461         Square   sniperSq = pop_lsb(snipers);
462         Bitboard b        = between_bb(ksq, sniperSq) & occupancy;
463
464         if (b && !more_than_one(b))
465         {
466             st->blockersForKing[c] |= b;
467             if (b & pieces(c))
468                 st->pinners[~c] |= sniperSq;
469         }
470     }
471 }
472
473
474 // Computes a bitboard of all pieces which attack a given square.
475 // Slider attacks use the occupied bitboard to indicate occupancy.
476 Bitboard Position::attackers_to(Square s, Bitboard occupied) const {
477
478     return (pawn_attacks_bb(BLACK, s) & pieces(WHITE, PAWN))
479          | (pawn_attacks_bb(WHITE, s) & pieces(BLACK, PAWN))
480          | (attacks_bb<KNIGHT>(s) & pieces(KNIGHT))
481          | (attacks_bb<ROOK>(s, occupied) & pieces(ROOK, QUEEN))
482          | (attacks_bb<BISHOP>(s, occupied) & pieces(BISHOP, QUEEN))
483          | (attacks_bb<KING>(s) & pieces(KING));
484 }
485
486
487 // Tests whether a pseudo-legal move is legal
488 bool Position::legal(Move m) const {
489
490     assert(is_ok(m));
491
492     Color  us   = sideToMove;
493     Square from = from_sq(m);
494     Square to   = to_sq(m);
495
496     assert(color_of(moved_piece(m)) == us);
497     assert(piece_on(square<KING>(us)) == make_piece(us, KING));
498
499     // En passant captures are a tricky special case. Because they are rather
500     // uncommon, we do it simply by testing whether the king is attacked after
501     // the move is made.
502     if (type_of(m) == EN_PASSANT)
503     {
504         Square   ksq      = square<KING>(us);
505         Square   capsq    = to - pawn_push(us);
506         Bitboard occupied = (pieces() ^ from ^ capsq) | to;
507
508         assert(to == ep_square());
509         assert(moved_piece(m) == make_piece(us, PAWN));
510         assert(piece_on(capsq) == make_piece(~us, PAWN));
511         assert(piece_on(to) == NO_PIECE);
512
513         return !(attacks_bb<ROOK>(ksq, occupied) & pieces(~us, QUEEN, ROOK))
514             && !(attacks_bb<BISHOP>(ksq, occupied) & pieces(~us, QUEEN, BISHOP));
515     }
516
517     // Castling moves generation does not check if the castling path is clear of
518     // enemy attacks, it is delayed at a later time: now!
519     if (type_of(m) == CASTLING)
520     {
521         // After castling, the rook and king final positions are the same in
522         // Chess960 as they would be in standard chess.
523         to             = relative_square(us, to > from ? SQ_G1 : SQ_C1);
524         Direction step = to > from ? WEST : EAST;
525
526         for (Square s = to; s != from; s += step)
527             if (attackers_to(s) & pieces(~us))
528                 return false;
529
530         // In case of Chess960, verify if the Rook blocks some checks.
531         // For instance an enemy queen in SQ_A1 when castling rook is in SQ_B1.
532         return !chess960 || !(blockers_for_king(us) & to_sq(m));
533     }
534
535     // If the moving piece is a king, check whether the destination square is
536     // attacked by the opponent.
537     if (type_of(piece_on(from)) == KING)
538         return !(attackers_to(to, pieces() ^ from) & pieces(~us));
539
540     // A non-king move is legal if and only if it is not pinned or it
541     // is moving along the ray towards or away from the king.
542     return !(blockers_for_king(us) & from) || aligned(from, to, square<KING>(us));
543 }
544
545
546 // Takes a random move and tests whether the move is
547 // pseudo-legal. It is used to validate moves from TT that can be corrupted
548 // due to SMP concurrent access or hash position key aliasing.
549 bool Position::pseudo_legal(const Move m) const {
550
551     Color  us   = sideToMove;
552     Square from = from_sq(m);
553     Square to   = to_sq(m);
554     Piece  pc   = moved_piece(m);
555
556     // Use a slower but simpler function for uncommon cases
557     // yet we skip the legality check of MoveList<LEGAL>().
558     if (type_of(m) != NORMAL)
559         return checkers() ? MoveList<EVASIONS>(*this).contains(m)
560                           : MoveList<NON_EVASIONS>(*this).contains(m);
561
562     // Is not a promotion, so the promotion piece must be empty
563     assert(promotion_type(m) - KNIGHT == NO_PIECE_TYPE);
564
565     // If the 'from' square is not occupied by a piece belonging to the side to
566     // move, the move is obviously not legal.
567     if (pc == NO_PIECE || color_of(pc) != us)
568         return false;
569
570     // The destination square cannot be occupied by a friendly piece
571     if (pieces(us) & to)
572         return false;
573
574     // Handle the special case of a pawn move
575     if (type_of(pc) == PAWN)
576     {
577         // We have already handled promotion moves, so destination cannot be on the 8th/1st rank
578         if ((Rank8BB | Rank1BB) & to)
579             return false;
580
581         if (!(pawn_attacks_bb(us, from) & pieces(~us) & to)  // Not a capture
582             && !((from + pawn_push(us) == to) && empty(to))  // Not a single push
583             && !((from + 2 * pawn_push(us) == to)            // Not a double push
584                  && (relative_rank(us, from) == RANK_2) && empty(to) && empty(to - pawn_push(us))))
585             return false;
586     }
587     else if (!(attacks_bb(type_of(pc), from, pieces()) & to))
588         return false;
589
590     // Evasions generator already takes care to avoid some kind of illegal moves
591     // and legal() relies on this. We therefore have to take care that the same
592     // kind of moves are filtered out here.
593     if (checkers())
594     {
595         if (type_of(pc) != KING)
596         {
597             // Double check? In this case, a king move is required
598             if (more_than_one(checkers()))
599                 return false;
600
601             // Our move must be a blocking interposition or a capture of the checking piece
602             if (!(between_bb(square<KING>(us), lsb(checkers())) & to))
603                 return false;
604         }
605         // In case of king moves under check we have to remove the king so as to catch
606         // invalid moves like b1a1 when opposite queen is on c1.
607         else if (attackers_to(to, pieces() ^ from) & pieces(~us))
608             return false;
609     }
610
611     return true;
612 }
613
614
615 // Tests whether a pseudo-legal move gives a check
616 bool Position::gives_check(Move m) const {
617
618     assert(is_ok(m));
619     assert(color_of(moved_piece(m)) == sideToMove);
620
621     Square from = from_sq(m);
622     Square to   = to_sq(m);
623
624     // Is there a direct check?
625     if (check_squares(type_of(piece_on(from))) & to)
626         return true;
627
628     // Is there a discovered check?
629     if (blockers_for_king(~sideToMove) & from)
630         return !aligned(from, to, square<KING>(~sideToMove)) || type_of(m) == CASTLING;
631
632     switch (type_of(m))
633     {
634     case NORMAL :
635         return false;
636
637     case PROMOTION :
638         return attacks_bb(promotion_type(m), to, pieces() ^ from) & square<KING>(~sideToMove);
639
640     // En passant capture with check? We have already handled the case of direct
641     // checks and ordinary discovered check, so the only case we need to handle
642     // is the unusual case of a discovered check through the captured pawn.
643     case EN_PASSANT : {
644         Square   capsq = make_square(file_of(to), rank_of(from));
645         Bitboard b     = (pieces() ^ from ^ capsq) | to;
646
647         return (attacks_bb<ROOK>(square<KING>(~sideToMove), b) & pieces(sideToMove, QUEEN, ROOK))
648              | (attacks_bb<BISHOP>(square<KING>(~sideToMove), b)
649                 & pieces(sideToMove, QUEEN, BISHOP));
650     }
651     default :  //CASTLING
652     {
653         // Castling is encoded as 'king captures the rook'
654         Square rto = relative_square(sideToMove, to > from ? SQ_F1 : SQ_D1);
655
656         return check_squares(ROOK) & rto;
657     }
658     }
659 }
660
661
662 // Makes a move, and saves all information necessary
663 // to a StateInfo object. The move is assumed to be legal. Pseudo-legal
664 // moves should be filtered out before this function is called.
665 void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
666
667     assert(is_ok(m));
668     assert(&newSt != st);
669
670     thisThread->nodes.fetch_add(1, std::memory_order_relaxed);
671     Key k = st->key ^ Zobrist::side;
672
673     // Copy some fields of the old state to our new StateInfo object except the
674     // ones which are going to be recalculated from scratch anyway and then switch
675     // our state pointer to point to the new (ready to be updated) state.
676     std::memcpy(&newSt, st, offsetof(StateInfo, key));
677     newSt.previous = st;
678     st             = &newSt;
679
680     // Increment ply counters. In particular, rule50 will be reset to zero later on
681     // in case of a capture or a pawn move.
682     ++gamePly;
683     ++st->rule50;
684     ++st->pliesFromNull;
685
686     // Used by NNUE
687     st->accumulator.computed[WHITE] = false;
688     st->accumulator.computed[BLACK] = false;
689     auto& dp                        = st->dirtyPiece;
690     dp.dirty_num                    = 1;
691
692     Color  us       = sideToMove;
693     Color  them     = ~us;
694     Square from     = from_sq(m);
695     Square to       = to_sq(m);
696     Piece  pc       = piece_on(from);
697     Piece  captured = type_of(m) == EN_PASSANT ? make_piece(them, PAWN) : piece_on(to);
698
699     assert(color_of(pc) == us);
700     assert(captured == NO_PIECE || color_of(captured) == (type_of(m) != CASTLING ? them : us));
701     assert(type_of(captured) != KING);
702
703     if (type_of(m) == CASTLING)
704     {
705         assert(pc == make_piece(us, KING));
706         assert(captured == make_piece(us, ROOK));
707
708         Square rfrom, rto;
709         do_castling<true>(us, from, to, rfrom, rto);
710
711         k ^= Zobrist::psq[captured][rfrom] ^ Zobrist::psq[captured][rto];
712         captured = NO_PIECE;
713     }
714
715     if (captured)
716     {
717         Square capsq = to;
718
719         // If the captured piece is a pawn, update pawn hash key, otherwise
720         // update non-pawn material.
721         if (type_of(captured) == PAWN)
722         {
723             if (type_of(m) == EN_PASSANT)
724             {
725                 capsq -= pawn_push(us);
726
727                 assert(pc == make_piece(us, PAWN));
728                 assert(to == st->epSquare);
729                 assert(relative_rank(us, to) == RANK_6);
730                 assert(piece_on(to) == NO_PIECE);
731                 assert(piece_on(capsq) == make_piece(them, PAWN));
732             }
733
734             st->pawnKey ^= Zobrist::psq[captured][capsq];
735         }
736         else
737             st->nonPawnMaterial[them] -= PieceValue[captured];
738
739         dp.dirty_num = 2;  // 1 piece moved, 1 piece captured
740         dp.piece[1]  = captured;
741         dp.from[1]   = capsq;
742         dp.to[1]     = SQ_NONE;
743
744         // Update board and piece lists
745         remove_piece(capsq);
746
747         // Update material hash key and prefetch access to materialTable
748         k ^= Zobrist::psq[captured][capsq];
749         st->materialKey ^= Zobrist::psq[captured][pieceCount[captured]];
750
751         // Reset rule 50 counter
752         st->rule50 = 0;
753     }
754
755     // Update hash key
756     k ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
757
758     // Reset en passant square
759     if (st->epSquare != SQ_NONE)
760     {
761         k ^= Zobrist::enpassant[file_of(st->epSquare)];
762         st->epSquare = SQ_NONE;
763     }
764
765     // Update castling rights if needed
766     if (st->castlingRights && (castlingRightsMask[from] | castlingRightsMask[to]))
767     {
768         k ^= Zobrist::castling[st->castlingRights];
769         st->castlingRights &= ~(castlingRightsMask[from] | castlingRightsMask[to]);
770         k ^= Zobrist::castling[st->castlingRights];
771     }
772
773     // Move the piece. The tricky Chess960 castling is handled earlier
774     if (type_of(m) != CASTLING)
775     {
776         dp.piece[0] = pc;
777         dp.from[0]  = from;
778         dp.to[0]    = to;
779
780         move_piece(from, to);
781     }
782
783     // If the moving piece is a pawn do some special extra work
784     if (type_of(pc) == PAWN)
785     {
786         // Set en passant square if the moved pawn can be captured
787         if ((int(to) ^ int(from)) == 16
788             && (pawn_attacks_bb(us, to - pawn_push(us)) & pieces(them, PAWN)))
789         {
790             st->epSquare = to - pawn_push(us);
791             k ^= Zobrist::enpassant[file_of(st->epSquare)];
792         }
793
794         else if (type_of(m) == PROMOTION)
795         {
796             Piece promotion = make_piece(us, promotion_type(m));
797
798             assert(relative_rank(us, to) == RANK_8);
799             assert(type_of(promotion) >= KNIGHT && type_of(promotion) <= QUEEN);
800
801             remove_piece(to);
802             put_piece(promotion, to);
803
804             // Promoting pawn to SQ_NONE, promoted piece from SQ_NONE
805             dp.to[0]               = SQ_NONE;
806             dp.piece[dp.dirty_num] = promotion;
807             dp.from[dp.dirty_num]  = SQ_NONE;
808             dp.to[dp.dirty_num]    = to;
809             dp.dirty_num++;
810
811             // Update hash keys
812             k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[promotion][to];
813             st->pawnKey ^= Zobrist::psq[pc][to];
814             st->materialKey ^=
815               Zobrist::psq[promotion][pieceCount[promotion] - 1] ^ Zobrist::psq[pc][pieceCount[pc]];
816
817             // Update material
818             st->nonPawnMaterial[us] += PieceValue[promotion];
819         }
820
821         // Update pawn hash key
822         st->pawnKey ^= Zobrist::psq[pc][from] ^ Zobrist::psq[pc][to];
823
824         // Reset rule 50 draw counter
825         st->rule50 = 0;
826     }
827
828     // Set capture piece
829     st->capturedPiece = captured;
830
831     // Update the key with the final value
832     st->key = k;
833
834     // Calculate checkers bitboard (if move gives check)
835     st->checkersBB = givesCheck ? attackers_to(square<KING>(them)) & pieces(us) : 0;
836
837     sideToMove = ~sideToMove;
838
839     // Update king attacks used for fast check detection
840     set_check_info();
841
842     // Calculate the repetition info. It is the ply distance from the previous
843     // occurrence of the same position, negative in the 3-fold case, or zero
844     // if the position was not repeated.
845     st->repetition = 0;
846     int end        = std::min(st->rule50, st->pliesFromNull);
847     if (end >= 4)
848     {
849         StateInfo* stp = st->previous->previous;
850         for (int i = 4; i <= end; i += 2)
851         {
852             stp = stp->previous->previous;
853             if (stp->key == st->key)
854             {
855                 st->repetition = stp->repetition ? -i : i;
856                 break;
857             }
858         }
859     }
860
861     assert(pos_is_ok());
862 }
863
864
865 // Unmakes a move. When it returns, the position should
866 // be restored to exactly the same state as before the move was made.
867 void Position::undo_move(Move m) {
868
869     assert(is_ok(m));
870
871     sideToMove = ~sideToMove;
872
873     Color  us   = sideToMove;
874     Square from = from_sq(m);
875     Square to   = to_sq(m);
876     Piece  pc   = piece_on(to);
877
878     assert(empty(from) || type_of(m) == CASTLING);
879     assert(type_of(st->capturedPiece) != KING);
880
881     if (type_of(m) == PROMOTION)
882     {
883         assert(relative_rank(us, to) == RANK_8);
884         assert(type_of(pc) == promotion_type(m));
885         assert(type_of(pc) >= KNIGHT && type_of(pc) <= QUEEN);
886
887         remove_piece(to);
888         pc = make_piece(us, PAWN);
889         put_piece(pc, to);
890     }
891
892     if (type_of(m) == CASTLING)
893     {
894         Square rfrom, rto;
895         do_castling<false>(us, from, to, rfrom, rto);
896     }
897     else
898     {
899         move_piece(to, from);  // Put the piece back at the source square
900
901         if (st->capturedPiece)
902         {
903             Square capsq = to;
904
905             if (type_of(m) == EN_PASSANT)
906             {
907                 capsq -= pawn_push(us);
908
909                 assert(type_of(pc) == PAWN);
910                 assert(to == st->previous->epSquare);
911                 assert(relative_rank(us, to) == RANK_6);
912                 assert(piece_on(capsq) == NO_PIECE);
913                 assert(st->capturedPiece == make_piece(~us, PAWN));
914             }
915
916             put_piece(st->capturedPiece, capsq);  // Restore the captured piece
917         }
918     }
919
920     // Finally point our state pointer back to the previous state
921     st = st->previous;
922     --gamePly;
923
924     assert(pos_is_ok());
925 }
926
927
928 // Helper used to do/undo a castling move. This is a bit
929 // tricky in Chess960 where from/to squares can overlap.
930 template<bool Do>
931 void Position::do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto) {
932
933     bool kingSide = to > from;
934     rfrom         = to;  // Castling is encoded as "king captures friendly rook"
935     rto           = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
936     to            = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
937
938     if (Do)
939     {
940         auto& dp     = st->dirtyPiece;
941         dp.piece[0]  = make_piece(us, KING);
942         dp.from[0]   = from;
943         dp.to[0]     = to;
944         dp.piece[1]  = make_piece(us, ROOK);
945         dp.from[1]   = rfrom;
946         dp.to[1]     = rto;
947         dp.dirty_num = 2;
948     }
949
950     // Remove both pieces first since squares could overlap in Chess960
951     remove_piece(Do ? from : to);
952     remove_piece(Do ? rfrom : rto);
953     board[Do ? from : to] = board[Do ? rfrom : rto] =
954       NO_PIECE;  // remove_piece does not do this for us
955     put_piece(make_piece(us, KING), Do ? to : from);
956     put_piece(make_piece(us, ROOK), Do ? rto : rfrom);
957 }
958
959
960 // Used to do a "null move": it flips
961 // the side to move without executing any move on the board.
962 void Position::do_null_move(StateInfo& newSt) {
963
964     assert(!checkers());
965     assert(&newSt != st);
966
967     std::memcpy(&newSt, st, offsetof(StateInfo, accumulator));
968
969     newSt.previous = st;
970     st             = &newSt;
971
972     st->dirtyPiece.dirty_num        = 0;
973     st->dirtyPiece.piece[0]         = NO_PIECE;  // Avoid checks in UpdateAccumulator()
974     st->accumulator.computed[WHITE] = false;
975     st->accumulator.computed[BLACK] = false;
976
977     if (st->epSquare != SQ_NONE)
978     {
979         st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
980         st->epSquare = SQ_NONE;
981     }
982
983     st->key ^= Zobrist::side;
984     ++st->rule50;
985     prefetch(TT.first_entry(key()));
986
987     st->pliesFromNull = 0;
988
989     sideToMove = ~sideToMove;
990
991     set_check_info();
992
993     st->repetition = 0;
994
995     assert(pos_is_ok());
996 }
997
998
999 // Must be used to undo a "null move"
1000 void Position::undo_null_move() {
1001
1002     assert(!checkers());
1003
1004     st         = st->previous;
1005     sideToMove = ~sideToMove;
1006 }
1007
1008
1009 // Computes the new hash key after the given move. Needed
1010 // for speculative prefetch. It doesn't recognize special moves like castling,
1011 // en passant and promotions.
1012 Key Position::key_after(Move m) const {
1013
1014     Square from     = from_sq(m);
1015     Square to       = to_sq(m);
1016     Piece  pc       = piece_on(from);
1017     Piece  captured = piece_on(to);
1018     Key    k        = st->key ^ Zobrist::side;
1019
1020     if (captured)
1021         k ^= Zobrist::psq[captured][to];
1022
1023     k ^= Zobrist::psq[pc][to] ^ Zobrist::psq[pc][from];
1024
1025     return (captured || type_of(pc) == PAWN) ? k : adjust_key50<true>(k);
1026 }
1027
1028
1029 // Tests if the SEE (Static Exchange Evaluation)
1030 // value of move is greater or equal to the given threshold. We'll use an
1031 // algorithm similar to alpha-beta pruning with a null window.
1032 bool Position::see_ge(Move m, Value threshold) const {
1033
1034     assert(is_ok(m));
1035
1036     // Only deal with normal moves, assume others pass a simple SEE
1037     if (type_of(m) != NORMAL)
1038         return VALUE_ZERO >= threshold;
1039
1040     Square from = from_sq(m), to = to_sq(m);
1041
1042     int swap = PieceValue[piece_on(to)] - threshold;
1043     if (swap < 0)
1044         return false;
1045
1046     swap = PieceValue[piece_on(from)] - swap;
1047     if (swap <= 0)
1048         return true;
1049
1050     assert(color_of(piece_on(from)) == sideToMove);
1051     Bitboard occupied  = pieces() ^ from ^ to;  // xoring to is important for pinned piece logic
1052     Color    stm       = sideToMove;
1053     Bitboard attackers = attackers_to(to, occupied);
1054     Bitboard stmAttackers, bb;
1055     int      res = 1;
1056
1057     while (true)
1058     {
1059         stm = ~stm;
1060         attackers &= occupied;
1061
1062         // If stm has no more attackers then give up: stm loses
1063         if (!(stmAttackers = attackers & pieces(stm)))
1064             break;
1065
1066         // Don't allow pinned pieces to attack as long as there are
1067         // pinners on their original square.
1068         if (pinners(~stm) & occupied)
1069         {
1070             stmAttackers &= ~blockers_for_king(stm);
1071
1072             if (!stmAttackers)
1073                 break;
1074         }
1075
1076         res ^= 1;
1077
1078         // Locate and remove the next least valuable attacker, and add to
1079         // the bitboard 'attackers' any X-ray attackers behind it.
1080         if ((bb = stmAttackers & pieces(PAWN)))
1081         {
1082             if ((swap = PawnValue - swap) < res)
1083                 break;
1084             occupied ^= least_significant_square_bb(bb);
1085
1086             attackers |= attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN);
1087         }
1088
1089         else if ((bb = stmAttackers & pieces(KNIGHT)))
1090         {
1091             if ((swap = KnightValue - swap) < res)
1092                 break;
1093             occupied ^= least_significant_square_bb(bb);
1094         }
1095
1096         else if ((bb = stmAttackers & pieces(BISHOP)))
1097         {
1098             if ((swap = BishopValue - swap) < res)
1099                 break;
1100             occupied ^= least_significant_square_bb(bb);
1101
1102             attackers |= attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN);
1103         }
1104
1105         else if ((bb = stmAttackers & pieces(ROOK)))
1106         {
1107             if ((swap = RookValue - swap) < res)
1108                 break;
1109             occupied ^= least_significant_square_bb(bb);
1110
1111             attackers |= attacks_bb<ROOK>(to, occupied) & pieces(ROOK, QUEEN);
1112         }
1113
1114         else if ((bb = stmAttackers & pieces(QUEEN)))
1115         {
1116             if ((swap = QueenValue - swap) < res)
1117                 break;
1118             occupied ^= least_significant_square_bb(bb);
1119
1120             attackers |= (attacks_bb<BISHOP>(to, occupied) & pieces(BISHOP, QUEEN))
1121                        | (attacks_bb<ROOK>(to, occupied) & pieces(ROOK, QUEEN));
1122         }
1123
1124         else  // KING
1125               // If we "capture" with the king but the opponent still has attackers,
1126               // reverse the result.
1127             return (attackers & ~pieces(stm)) ? res ^ 1 : res;
1128     }
1129
1130     return bool(res);
1131 }
1132
1133 // Tests whether the position is drawn by 50-move rule
1134 // or by repetition. It does not detect stalemates.
1135 bool Position::is_draw(int ply) const {
1136
1137     if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
1138         return true;
1139
1140     // Return a draw score if a position repeats once earlier but strictly
1141     // after the root, or repeats twice before or at the root.
1142     return st->repetition && st->repetition < ply;
1143 }
1144
1145
1146 // Tests whether there has been at least one repetition
1147 // of positions since the last capture or pawn move.
1148 bool Position::has_repeated() const {
1149
1150     StateInfo* stc = st;
1151     int        end = std::min(st->rule50, st->pliesFromNull);
1152     while (end-- >= 4)
1153     {
1154         if (stc->repetition)
1155             return true;
1156
1157         stc = stc->previous;
1158     }
1159     return false;
1160 }
1161
1162
1163 // Tests if the position has a move which draws by repetition,
1164 // or an earlier position has a move that directly reaches the current position.
1165 bool Position::has_game_cycle(int ply) const {
1166
1167     int j;
1168
1169     int end = std::min(st->rule50, st->pliesFromNull);
1170
1171     if (end < 3)
1172         return false;
1173
1174     Key        originalKey = st->key;
1175     StateInfo* stp         = st->previous;
1176
1177     for (int i = 3; i <= end; i += 2)
1178     {
1179         stp = stp->previous->previous;
1180
1181         Key moveKey = originalKey ^ stp->key;
1182         if ((j = H1(moveKey), cuckoo[j] == moveKey) || (j = H2(moveKey), cuckoo[j] == moveKey))
1183         {
1184             Move   move = cuckooMove[j];
1185             Square s1   = from_sq(move);
1186             Square s2   = to_sq(move);
1187
1188             if (!((between_bb(s1, s2) ^ s2) & pieces()))
1189             {
1190                 if (ply > i)
1191                     return true;
1192
1193                 // For nodes before or at the root, check that the move is a
1194                 // repetition rather than a move to the current position.
1195                 // In the cuckoo table, both moves Rc1c5 and Rc5c1 are stored in
1196                 // the same location, so we have to select which square to check.
1197                 if (color_of(piece_on(empty(s1) ? s2 : s1)) != side_to_move())
1198                     continue;
1199
1200                 // For repetitions before or at the root, require one more
1201                 if (stp->repetition)
1202                     return true;
1203             }
1204         }
1205     }
1206     return false;
1207 }
1208
1209
1210 // Flips position with the white and black sides reversed. This
1211 // is only useful for debugging e.g. for finding evaluation symmetry bugs.
1212 void Position::flip() {
1213
1214     string            f, token;
1215     std::stringstream ss(fen());
1216
1217     for (Rank r = RANK_8; r >= RANK_1; --r)  // Piece placement
1218     {
1219         std::getline(ss, token, r > RANK_1 ? '/' : ' ');
1220         f.insert(0, token + (f.empty() ? " " : "/"));
1221     }
1222
1223     ss >> token;                        // Active color
1224     f += (token == "w" ? "B " : "W ");  // Will be lowercased later
1225
1226     ss >> token;  // Castling availability
1227     f += token + " ";
1228
1229     std::transform(f.begin(), f.end(), f.begin(),
1230                    [](char c) { return char(islower(c) ? toupper(c) : tolower(c)); });
1231
1232     ss >> token;  // En passant square
1233     f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3"));
1234
1235     std::getline(ss, token);  // Half and full moves
1236     f += token;
1237
1238     set(f, is_chess960(), st, this_thread());
1239
1240     assert(pos_is_ok());
1241 }
1242
1243
1244 // Performs some consistency checks for the position object
1245 // and raise an assert if something wrong is detected.
1246 // This is meant to be helpful when debugging.
1247 bool Position::pos_is_ok() const {
1248
1249     constexpr bool Fast = true;  // Quick (default) or full check?
1250
1251     if ((sideToMove != WHITE && sideToMove != BLACK) || piece_on(square<KING>(WHITE)) != W_KING
1252         || piece_on(square<KING>(BLACK)) != B_KING
1253         || (ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6))
1254         assert(0 && "pos_is_ok: Default");
1255
1256     if (Fast)
1257         return true;
1258
1259     if (pieceCount[W_KING] != 1 || pieceCount[B_KING] != 1
1260         || attackers_to(square<KING>(~sideToMove)) & pieces(sideToMove))
1261         assert(0 && "pos_is_ok: Kings");
1262
1263     if ((pieces(PAWN) & (Rank1BB | Rank8BB)) || pieceCount[W_PAWN] > 8 || pieceCount[B_PAWN] > 8)
1264         assert(0 && "pos_is_ok: Pawns");
1265
1266     if ((pieces(WHITE) & pieces(BLACK)) || (pieces(WHITE) | pieces(BLACK)) != pieces()
1267         || popcount(pieces(WHITE)) > 16 || popcount(pieces(BLACK)) > 16)
1268         assert(0 && "pos_is_ok: Bitboards");
1269
1270     for (PieceType p1 = PAWN; p1 <= KING; ++p1)
1271         for (PieceType p2 = PAWN; p2 <= KING; ++p2)
1272             if (p1 != p2 && (pieces(p1) & pieces(p2)))
1273                 assert(0 && "pos_is_ok: Bitboards");
1274
1275
1276     for (Piece pc : Pieces)
1277         if (pieceCount[pc] != popcount(pieces(color_of(pc), type_of(pc)))
1278             || pieceCount[pc] != std::count(board, board + SQUARE_NB, pc))
1279             assert(0 && "pos_is_ok: Pieces");
1280
1281     for (Color c : {WHITE, BLACK})
1282         for (CastlingRights cr : {c & KING_SIDE, c & QUEEN_SIDE})
1283         {
1284             if (!can_castle(cr))
1285                 continue;
1286
1287             if (piece_on(castlingRookSquare[cr]) != make_piece(c, ROOK)
1288                 || castlingRightsMask[castlingRookSquare[cr]] != cr
1289                 || (castlingRightsMask[square<KING>(c)] & cr) != cr)
1290                 assert(0 && "pos_is_ok: Castling");
1291         }
1292
1293     return true;
1294 }
1295
1296 }  // namespace Stockfish