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