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