2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4 Copyright (C) 2008-2012 Marco Costalba, Joona Kiiski, Tord Romstad
6 Stockfish is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 Stockfish is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
39 Key Position::zobrist[2][8][64];
40 Key Position::zobEp[8];
41 Key Position::zobCastle[16];
42 Key Position::zobSideToMove;
43 Key Position::zobExclusion;
45 Score Position::pieceSquareTable[16][64];
47 // Material values arrays, indexed by Piece
48 const Value PieceValueMidgame[17] = {
50 PawnValueMidgame, KnightValueMidgame, BishopValueMidgame,
51 RookValueMidgame, QueenValueMidgame,
52 VALUE_ZERO, VALUE_ZERO, VALUE_ZERO,
53 PawnValueMidgame, KnightValueMidgame, BishopValueMidgame,
54 RookValueMidgame, QueenValueMidgame
57 const Value PieceValueEndgame[17] = {
59 PawnValueEndgame, KnightValueEndgame, BishopValueEndgame,
60 RookValueEndgame, QueenValueEndgame,
61 VALUE_ZERO, VALUE_ZERO, VALUE_ZERO,
62 PawnValueEndgame, KnightValueEndgame, BishopValueEndgame,
63 RookValueEndgame, QueenValueEndgame
66 // To convert a Piece to and from a FEN char
67 static const string PieceToChar(" PNBRQK pnbrqk");
72 CheckInfo::CheckInfo(const Position& pos) {
74 Color them = ~pos.side_to_move();
75 ksq = pos.king_square(them);
77 pinned = pos.pinned_pieces();
78 dcCandidates = pos.discovered_check_candidates();
80 checkSq[PAWN] = pos.attacks_from<PAWN>(ksq, them);
81 checkSq[KNIGHT] = pos.attacks_from<KNIGHT>(ksq);
82 checkSq[BISHOP] = pos.attacks_from<BISHOP>(ksq);
83 checkSq[ROOK] = pos.attacks_from<ROOK>(ksq);
84 checkSq[QUEEN] = checkSq[BISHOP] | checkSq[ROOK];
89 /// Position::operator=() creates a copy of 'pos'. We want the new born Position
90 /// object do not depend on any external data so we detach state pointer from
93 Position& Position::operator=(const Position& pos) {
95 memcpy(this, &pos, sizeof(Position));
106 /// Position::from_fen() initializes the position object with the given FEN
107 /// string. This function is not very robust - make sure that input FENs are
108 /// correct (this is assumed to be the responsibility of the GUI).
110 void Position::from_fen(const string& fenStr, bool isChess960, Thread* th) {
112 A FEN string defines a particular position using only the ASCII character set.
114 A FEN string contains six fields separated by a space. The fields are:
116 1) Piece placement (from white's perspective). Each rank is described, starting
117 with rank 8 and ending with rank 1; within each rank, the contents of each
118 square are described from file A through file H. Following the Standard
119 Algebraic Notation (SAN), each piece is identified by a single letter taken
120 from the standard English names. White pieces are designated using upper-case
121 letters ("PNBRQK") while Black take lowercase ("pnbrqk"). Blank squares are
122 noted using digits 1 through 8 (the number of blank squares), and "/"
125 2) Active color. "w" means white moves next, "b" means black.
127 3) Castling availability. If neither side can castle, this is "-". Otherwise,
128 this has one or more letters: "K" (White can castle kingside), "Q" (White
129 can castle queenside), "k" (Black can castle kingside), and/or "q" (Black
130 can castle queenside).
132 4) En passant target square (in algebraic notation). If there's no en passant
133 target square, this is "-". If a pawn has just made a 2-square move, this
134 is the position "behind" the pawn. This is recorded regardless of whether
135 there is a pawn in position to make an en passant capture.
137 5) Halfmove clock. This is the number of halfmoves since the last pawn advance
138 or capture. This is used to determine if a draw can be claimed under the
141 6) Fullmove number. The number of the full move. It starts at 1, and is
142 incremented after Black's move.
145 char col, row, token;
148 std::istringstream fen(fenStr);
151 fen >> std::noskipws;
153 // 1. Piece placement
154 while ((fen >> token) && !isspace(token))
157 sq += Square(token - '0'); // Advance the given number of files
159 else if (token == '/')
162 else if ((p = PieceToChar.find(token)) != string::npos)
164 put_piece(Piece(p), sq);
171 sideToMove = (token == 'w' ? WHITE : BLACK);
174 // 3. Castling availability. Compatible with 3 standards: Normal FEN standard,
175 // Shredder-FEN that uses the letters of the columns on which the rooks began
176 // the game instead of KQkq and also X-FEN standard that, in case of Chess960,
177 // if an inner rook is associated with the castling right, the castling tag is
178 // replaced by the file letter of the involved rook, as for the Shredder-FEN.
179 while ((fen >> token) && !isspace(token))
182 Color c = islower(token) ? BLACK : WHITE;
184 token = char(toupper(token));
187 for (rsq = relative_square(c, SQ_H1); type_of(piece_on(rsq)) != ROOK; rsq--) {}
189 else if (token == 'Q')
190 for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; rsq++) {}
192 else if (token >= 'A' && token <= 'H')
193 rsq = File(token - 'A') | relative_rank(c, RANK_1);
198 set_castle_right(c, rsq);
201 // 4. En passant square. Ignore if no pawn capture is possible
202 if ( ((fen >> col) && (col >= 'a' && col <= 'h'))
203 && ((fen >> row) && (row == '3' || row == '6')))
205 st->epSquare = File(col - 'a') | Rank(row - '1');
207 if (!(attackers_to(st->epSquare) & pieces(sideToMove, PAWN)))
208 st->epSquare = SQ_NONE;
211 // 5-6. Halfmove clock and fullmove number
212 fen >> std::skipws >> st->rule50 >> startPosPly;
214 // Convert from fullmove starting from 1 to ply starting from 0,
215 // handle also common incorrect FEN with fullmove = 0.
216 startPosPly = std::max(2 * (startPosPly - 1), 0) + int(sideToMove == BLACK);
218 st->key = compute_key();
219 st->pawnKey = compute_pawn_key();
220 st->materialKey = compute_material_key();
221 st->psqScore = compute_psq_score();
222 st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
223 st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
224 st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
225 chess960 = isChess960;
232 /// Position::set_castle_right() is an helper function used to set castling
233 /// rights given the corresponding color and the rook starting square.
235 void Position::set_castle_right(Color c, Square rfrom) {
237 Square kfrom = king_square(c);
238 CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE;
239 CastleRight cr = make_castle_right(c, cs);
241 st->castleRights |= cr;
242 castleRightsMask[kfrom] |= cr;
243 castleRightsMask[rfrom] |= cr;
244 castleRookSquare[c][cs] = rfrom;
246 Square kto = relative_square(c, cs == KING_SIDE ? SQ_G1 : SQ_C1);
247 Square rto = relative_square(c, cs == KING_SIDE ? SQ_F1 : SQ_D1);
249 for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); s++)
250 if (s != kfrom && s != rfrom)
251 castlePath[c][cs] |= s;
253 for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); s++)
254 if (s != kfrom && s != rfrom)
255 castlePath[c][cs] |= s;
259 /// Position::to_fen() returns a FEN representation of the position. In case
260 /// of Chess960 the Shredder-FEN notation is used. Mainly a debugging function.
262 const string Position::to_fen() const {
264 std::ostringstream fen;
268 for (Rank rank = RANK_8; rank >= RANK_1; rank--)
272 for (File file = FILE_A; file <= FILE_H; file++)
285 fen << PieceToChar[piece_on(sq)];
296 fen << (sideToMove == WHITE ? " w " : " b ");
298 if (can_castle(WHITE_OO))
299 fen << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, KING_SIDE))))) : 'K');
301 if (can_castle(WHITE_OOO))
302 fen << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE))))) : 'Q');
304 if (can_castle(BLACK_OO))
305 fen << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, KING_SIDE))) : 'k');
307 if (can_castle(BLACK_OOO))
308 fen << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE))) : 'q');
310 if (st->castleRights == CASTLES_NONE)
313 fen << (ep_square() == SQ_NONE ? " - " : " " + square_to_string(ep_square()) + " ")
314 << st->rule50 << " " << 1 + (startPosPly - int(sideToMove == BLACK)) / 2;
320 /// Position::print() prints an ASCII representation of the position to
321 /// the standard output. If a move is given then also the san is printed.
323 void Position::print(Move move) const {
325 const string dottedLine = "\n+---+---+---+---+---+---+---+---+";
326 const string twoRows = dottedLine + "\n| | . | | . | | . | | . |"
327 + dottedLine + "\n| . | | . | | . | | . | |";
329 string brd = twoRows + twoRows + twoRows + twoRows + dottedLine;
334 cout << "\nMove is: " << (sideToMove == BLACK ? ".." : "") << move_to_san(p, move);
337 for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
338 if (piece_on(sq) != NO_PIECE)
339 brd[513 - 68*rank_of(sq) + 4*file_of(sq)] = PieceToChar[piece_on(sq)];
341 cout << brd << "\nFen is: " << to_fen() << "\nKey is: " << st->key << endl;
345 /// Position:hidden_checkers<>() returns a bitboard of all pinned (against the
346 /// king) pieces for the given color. Or, when template parameter FindPinned is
347 /// false, the function return the pieces of the given color candidate for a
348 /// discovery check against the enemy king.
349 template<bool FindPinned>
350 Bitboard Position::hidden_checkers() const {
352 // Pinned pieces protect our king, dicovery checks attack the enemy king
353 Bitboard b, result = 0;
354 Bitboard pinners = pieces(FindPinned ? ~sideToMove : sideToMove);
355 Square ksq = king_square(FindPinned ? sideToMove : ~sideToMove);
357 // Pinners are sliders, that give check when candidate pinned is removed
358 pinners &= (pieces(ROOK, QUEEN) & PseudoAttacks[ROOK][ksq])
359 | (pieces(BISHOP, QUEEN) & PseudoAttacks[BISHOP][ksq]);
363 b = between_bb(ksq, pop_lsb(&pinners)) & pieces();
365 if (b && !more_than_one(b) && (b & pieces(sideToMove)))
371 // Explicit template instantiations
372 template Bitboard Position::hidden_checkers<true>() const;
373 template Bitboard Position::hidden_checkers<false>() const;
376 /// Position::attackers_to() computes a bitboard of all pieces which attack a
377 /// given square. Slider attacks use occ bitboard as occupancy.
379 Bitboard Position::attackers_to(Square s, Bitboard occ) const {
381 return (attacks_from<PAWN>(s, BLACK) & pieces(WHITE, PAWN))
382 | (attacks_from<PAWN>(s, WHITE) & pieces(BLACK, PAWN))
383 | (attacks_from<KNIGHT>(s) & pieces(KNIGHT))
384 | (attacks_bb<ROOK>(s, occ) & pieces(ROOK, QUEEN))
385 | (attacks_bb<BISHOP>(s, occ) & pieces(BISHOP, QUEEN))
386 | (attacks_from<KING>(s) & pieces(KING));
390 /// Position::attacks_from() computes a bitboard of all attacks of a given piece
391 /// put in a given square. Slider attacks use occ bitboard as occupancy.
393 Bitboard Position::attacks_from(Piece p, Square s, Bitboard occ) {
399 case BISHOP: return attacks_bb<BISHOP>(s, occ);
400 case ROOK : return attacks_bb<ROOK>(s, occ);
401 case QUEEN : return attacks_bb<BISHOP>(s, occ) | attacks_bb<ROOK>(s, occ);
402 default : return StepAttacksBB[p][s];
407 /// Position::move_attacks_square() tests whether a move from the current
408 /// position attacks a given square.
410 bool Position::move_attacks_square(Move m, Square s) const {
416 Square from = from_sq(m);
417 Square to = to_sq(m);
418 Piece piece = piece_moved(m);
420 assert(!is_empty(from));
422 // Update occupancy as if the piece is moving
423 occ = pieces() ^ from ^ to;
425 // The piece moved in 'to' attacks the square 's' ?
426 if (attacks_from(piece, to, occ) & s)
429 // Scan for possible X-ray attackers behind the moved piece
430 xray = (attacks_bb< ROOK>(s, occ) & pieces(color_of(piece), QUEEN, ROOK))
431 | (attacks_bb<BISHOP>(s, occ) & pieces(color_of(piece), QUEEN, BISHOP));
433 // Verify attackers are triggered by our move and not already existing
434 return xray && (xray ^ (xray & attacks_from<QUEEN>(s)));
438 /// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal
440 bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
443 assert(pinned == pinned_pieces());
445 Color us = sideToMove;
446 Square from = from_sq(m);
448 assert(color_of(piece_moved(m)) == us);
449 assert(piece_on(king_square(us)) == make_piece(us, KING));
451 // En passant captures are a tricky special case. Because they are rather
452 // uncommon, we do it simply by testing whether the king is attacked after
454 if (type_of(m) == ENPASSANT)
457 Square to = to_sq(m);
458 Square capsq = to + pawn_push(them);
459 Square ksq = king_square(us);
460 Bitboard b = (pieces() ^ from ^ capsq) | to;
462 assert(to == ep_square());
463 assert(piece_moved(m) == make_piece(us, PAWN));
464 assert(piece_on(capsq) == make_piece(them, PAWN));
465 assert(piece_on(to) == NO_PIECE);
467 return !(attacks_bb< ROOK>(ksq, b) & pieces(them, QUEEN, ROOK))
468 && !(attacks_bb<BISHOP>(ksq, b) & pieces(them, QUEEN, BISHOP));
471 // If the moving piece is a king, check whether the destination
472 // square is attacked by the opponent. Castling moves are checked
473 // for legality during move generation.
474 if (type_of(piece_on(from)) == KING)
475 return type_of(m) == CASTLE || !(attackers_to(to_sq(m)) & pieces(~us));
477 // A non-king move is legal if and only if it is not pinned or it
478 // is moving along the ray towards or away from the king.
481 || squares_aligned(from, to_sq(m), king_square(us));
485 /// Position::move_is_legal() takes a random move and tests whether the move
486 /// is legal. This version is not very fast and should be used only in non
487 /// time-critical paths.
489 bool Position::move_is_legal(const Move m) const {
491 for (MoveList<LEGAL> ml(*this); !ml.end(); ++ml)
499 /// Position::is_pseudo_legal() takes a random move and tests whether the move
500 /// is pseudo legal. It is used to validate moves from TT that can be corrupted
501 /// due to SMP concurrent access or hash position key aliasing.
503 bool Position::is_pseudo_legal(const Move m) const {
505 Color us = sideToMove;
506 Color them = ~sideToMove;
507 Square from = from_sq(m);
508 Square to = to_sq(m);
509 Piece pc = piece_moved(m);
511 // Use a slower but simpler function for uncommon cases
512 if (type_of(m) != NORMAL)
513 return move_is_legal(m);
515 // Is not a promotion, so promotion piece must be empty
516 if (promotion_type(m) - 2 != NO_PIECE_TYPE)
519 // If the from square is not occupied by a piece belonging to the side to
520 // move, the move is obviously not legal.
521 if (pc == NO_PIECE || color_of(pc) != us)
524 // The destination square cannot be occupied by a friendly piece
525 if (color_of(piece_on(to)) == us)
528 // Handle the special case of a pawn move
529 if (type_of(pc) == PAWN)
531 // Move direction must be compatible with pawn color
532 int direction = to - from;
533 if ((us == WHITE) != (direction > 0))
536 // We have already handled promotion moves, so destination
537 // cannot be on the 8/1th rank.
538 if (rank_of(to) == RANK_8 || rank_of(to) == RANK_1)
541 // Proceed according to the square delta between the origin and
542 // destination squares.
549 // Capture. The destination square must be occupied by an enemy
550 // piece (en passant captures was handled earlier).
551 if (color_of(piece_on(to)) != them)
554 // From and to files must be one file apart, avoids a7h5
555 if (abs(file_of(from) - file_of(to)) != 1)
561 // Pawn push. The destination square must be empty.
567 // Double white pawn push. The destination square must be on the fourth
568 // rank, and both the destination square and the square between the
569 // source and destination squares must be empty.
570 if ( rank_of(to) != RANK_4
572 || !is_empty(from + DELTA_N))
577 // Double black pawn push. The destination square must be on the fifth
578 // rank, and both the destination square and the square between the
579 // source and destination squares must be empty.
580 if ( rank_of(to) != RANK_5
582 || !is_empty(from + DELTA_S))
590 else if (!(attacks_from(pc, from) & to))
593 // Evasions generator already takes care to avoid some kind of illegal moves
594 // and pl_move_is_legal() relies on this. So we have to take care that the
595 // same kind of moves are filtered out here.
598 if (type_of(pc) != KING)
600 Bitboard b = checkers();
601 Square checksq = pop_lsb(&b);
603 if (b) // double check ? In this case a king move is required
606 // Our move must be a blocking evasion or a capture of the checking piece
607 if (!((between_bb(checksq, king_square(us)) | checkers()) & to))
610 // In case of king moves under check we have to remove king so to catch
611 // as invalid moves like b1a1 when opposite queen is on c1.
612 else if (attackers_to(to, pieces() ^ from) & pieces(~us))
620 /// Position::move_gives_check() tests whether a pseudo-legal move gives a check
622 bool Position::move_gives_check(Move m, const CheckInfo& ci) const {
625 assert(ci.dcCandidates == discovered_check_candidates());
626 assert(color_of(piece_moved(m)) == sideToMove);
628 Square from = from_sq(m);
629 Square to = to_sq(m);
630 PieceType pt = type_of(piece_on(from));
633 if (ci.checkSq[pt] & to)
637 if (ci.dcCandidates && (ci.dcCandidates & from))
639 // For pawn and king moves we need to verify also direction
640 if ( (pt != PAWN && pt != KING)
641 || !squares_aligned(from, to, king_square(~sideToMove)))
645 // Can we skip the ugly special cases ?
646 if (type_of(m) == NORMAL)
649 Color us = sideToMove;
650 Square ksq = king_square(~us);
652 // Promotion with check ?
653 if (type_of(m) == PROMOTION)
654 return attacks_from(Piece(promotion_type(m)), to, pieces() ^ from) & ksq;
656 // En passant capture with check ? We have already handled the case
657 // of direct checks and ordinary discovered check, the only case we
658 // need to handle is the unusual case of a discovered check through
659 // the captured pawn.
660 if (type_of(m) == ENPASSANT)
662 Square capsq = file_of(to) | rank_of(from);
663 Bitboard b = (pieces() ^ from ^ capsq) | to;
665 return (attacks_bb< ROOK>(ksq, b) & pieces(us, QUEEN, ROOK))
666 | (attacks_bb<BISHOP>(ksq, b) & pieces(us, QUEEN, BISHOP));
669 // Castling with check ?
670 if (type_of(m) == CASTLE)
673 Square rfrom = to; // 'King captures the rook' notation
674 Square kto = relative_square(us, rfrom > kfrom ? SQ_G1 : SQ_C1);
675 Square rto = relative_square(us, rfrom > kfrom ? SQ_F1 : SQ_D1);
676 Bitboard b = (pieces() ^ kfrom ^ rfrom) | rto | kto;
678 return attacks_bb<ROOK>(rto, b) & ksq;
685 /// Position::do_move() makes a move, and saves all information necessary
686 /// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
687 /// moves should be filtered out before this function is called.
689 void Position::do_move(Move m, StateInfo& newSt) {
692 do_move(m, newSt, ci, move_gives_check(m, ci));
695 void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveIsCheck) {
698 assert(&newSt != st);
703 // Copy some fields of old state to our new StateInfo object except the ones
704 // which are recalculated from scratch anyway, then switch our state pointer
705 // to point to the new, ready to be updated, state.
706 memcpy(&newSt, st, sizeof(ReducedStateInfo));
711 // Update side to move
714 // Increment the 50 moves rule draw counter. Resetting it to zero in the
715 // case of a capture or a pawn move is taken care of later.
719 if (type_of(m) == CASTLE)
722 do_castle_move<true>(m);
726 Color us = sideToMove;
728 Square from = from_sq(m);
729 Square to = to_sq(m);
730 Piece piece = piece_on(from);
731 PieceType pt = type_of(piece);
732 PieceType capture = type_of(m) == ENPASSANT ? PAWN : type_of(piece_on(to));
734 assert(color_of(piece) == us);
735 assert(color_of(piece_on(to)) != us);
736 assert(capture != KING);
742 // If the captured piece is a pawn, update pawn hash key, otherwise
743 // update non-pawn material.
746 if (type_of(m) == ENPASSANT)
748 capsq += pawn_push(them);
751 assert(to == st->epSquare);
752 assert(relative_rank(us, to) == RANK_6);
753 assert(piece_on(to) == NO_PIECE);
754 assert(piece_on(capsq) == make_piece(them, PAWN));
756 board[capsq] = NO_PIECE;
759 st->pawnKey ^= zobrist[them][PAWN][capsq];
762 st->npMaterial[them] -= PieceValueMidgame[capture];
764 // Remove the captured piece
765 byTypeBB[ALL_PIECES] ^= capsq;
766 byTypeBB[capture] ^= capsq;
767 byColorBB[them] ^= capsq;
769 // Update piece list, move the last piece at index[capsq] position and
772 // WARNING: This is a not revresible operation. When we will reinsert the
773 // captured piece in undo_move() we will put it at the end of the list and
774 // not in its original place, it means index[] and pieceList[] are not
775 // guaranteed to be invariant to a do_move() + undo_move() sequence.
776 Square lastSquare = pieceList[them][capture][--pieceCount[them][capture]];
777 index[lastSquare] = index[capsq];
778 pieceList[them][capture][index[lastSquare]] = lastSquare;
779 pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
782 k ^= zobrist[them][capture][capsq];
783 st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
785 // Update incremental scores
786 st->psqScore -= pieceSquareTable[make_piece(them, capture)][capsq];
788 // Reset rule 50 counter
793 k ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
795 // Reset en passant square
796 if (st->epSquare != SQ_NONE)
798 k ^= zobEp[file_of(st->epSquare)];
799 st->epSquare = SQ_NONE;
802 // Update castle rights if needed
803 if (st->castleRights && (castleRightsMask[from] | castleRightsMask[to]))
805 int cr = castleRightsMask[from] | castleRightsMask[to];
806 k ^= zobCastle[st->castleRights & cr];
807 st->castleRights &= ~cr;
810 // Prefetch TT access as soon as we know key is updated
811 prefetch((char*)TT.first_entry(k));
814 Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
815 byTypeBB[ALL_PIECES] ^= from_to_bb;
816 byTypeBB[pt] ^= from_to_bb;
817 byColorBB[us] ^= from_to_bb;
819 board[to] = board[from];
820 board[from] = NO_PIECE;
822 // Update piece lists, index[from] is not updated and becomes stale. This
823 // works as long as index[] is accessed just by known occupied squares.
824 index[to] = index[from];
825 pieceList[us][pt][index[to]] = to;
827 // If the moving piece is a pawn do some special extra work
830 // Set en-passant square, only if moved pawn can be captured
831 if ( (int(to) ^ int(from)) == 16
832 && (attacks_from<PAWN>(from + pawn_push(us), us) & pieces(them, PAWN)))
834 st->epSquare = Square((from + to) / 2);
835 k ^= zobEp[file_of(st->epSquare)];
838 if (type_of(m) == PROMOTION)
840 PieceType promotion = promotion_type(m);
842 assert(relative_rank(us, to) == RANK_8);
843 assert(promotion >= KNIGHT && promotion <= QUEEN);
845 // Replace the pawn with the promoted piece
846 byTypeBB[PAWN] ^= to;
847 byTypeBB[promotion] |= to;
848 board[to] = make_piece(us, promotion);
850 // Update piece lists, move the last pawn at index[to] position
851 // and shrink the list. Add a new promotion piece to the list.
852 Square lastSquare = pieceList[us][PAWN][--pieceCount[us][PAWN]];
853 index[lastSquare] = index[to];
854 pieceList[us][PAWN][index[lastSquare]] = lastSquare;
855 pieceList[us][PAWN][pieceCount[us][PAWN]] = SQ_NONE;
856 index[to] = pieceCount[us][promotion];
857 pieceList[us][promotion][index[to]] = to;
860 k ^= zobrist[us][PAWN][to] ^ zobrist[us][promotion][to];
861 st->pawnKey ^= zobrist[us][PAWN][to];
862 st->materialKey ^= zobrist[us][promotion][pieceCount[us][promotion]++]
863 ^ zobrist[us][PAWN][pieceCount[us][PAWN]];
865 // Update incremental score
866 st->psqScore += pieceSquareTable[make_piece(us, promotion)][to]
867 - pieceSquareTable[make_piece(us, PAWN)][to];
870 st->npMaterial[us] += PieceValueMidgame[promotion];
873 // Update pawn hash key
874 st->pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to];
876 // Reset rule 50 draw counter
880 // Prefetch pawn and material hash tables
881 prefetch((char*)thisThread->pawnTable.entries[st->pawnKey]);
882 prefetch((char*)thisThread->materialTable.entries[st->materialKey]);
884 // Update incremental scores
885 st->psqScore += psq_delta(piece, from, to);
888 st->capturedType = capture;
890 // Update the key with the final value
893 // Update checkers bitboard, piece must be already moved
898 if (type_of(m) != NORMAL)
899 st->checkersBB = attackers_to(king_square(them)) & pieces(us);
903 if (ci.checkSq[pt] & to)
904 st->checkersBB |= to;
907 if (ci.dcCandidates && (ci.dcCandidates & from))
910 st->checkersBB |= attacks_from<ROOK>(king_square(them)) & pieces(us, QUEEN, ROOK);
913 st->checkersBB |= attacks_from<BISHOP>(king_square(them)) & pieces(us, QUEEN, BISHOP);
918 sideToMove = ~sideToMove;
924 /// Position::undo_move() unmakes a move. When it returns, the position should
925 /// be restored to exactly the same state as before the move was made.
927 void Position::undo_move(Move m) {
931 sideToMove = ~sideToMove;
933 if (type_of(m) == CASTLE)
935 do_castle_move<false>(m);
939 Color us = sideToMove;
941 Square from = from_sq(m);
942 Square to = to_sq(m);
943 Piece piece = piece_on(to);
944 PieceType pt = type_of(piece);
945 PieceType capture = st->capturedType;
947 assert(is_empty(from));
948 assert(color_of(piece) == us);
949 assert(capture != KING);
951 if (type_of(m) == PROMOTION)
953 PieceType promotion = promotion_type(m);
955 assert(promotion == pt);
956 assert(relative_rank(us, to) == RANK_8);
957 assert(promotion >= KNIGHT && promotion <= QUEEN);
959 // Replace the promoted piece with the pawn
960 byTypeBB[promotion] ^= to;
961 byTypeBB[PAWN] |= to;
962 board[to] = make_piece(us, PAWN);
964 // Update piece lists, move the last promoted piece at index[to] position
965 // and shrink the list. Add a new pawn to the list.
966 Square lastSquare = pieceList[us][promotion][--pieceCount[us][promotion]];
967 index[lastSquare] = index[to];
968 pieceList[us][promotion][index[lastSquare]] = lastSquare;
969 pieceList[us][promotion][pieceCount[us][promotion]] = SQ_NONE;
970 index[to] = pieceCount[us][PAWN]++;
971 pieceList[us][PAWN][index[to]] = to;
976 // Put the piece back at the source square
977 Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
978 byTypeBB[ALL_PIECES] ^= from_to_bb;
979 byTypeBB[pt] ^= from_to_bb;
980 byColorBB[us] ^= from_to_bb;
982 board[from] = board[to];
983 board[to] = NO_PIECE;
985 // Update piece lists, index[to] is not updated and becomes stale. This
986 // works as long as index[] is accessed just by known occupied squares.
987 index[from] = index[to];
988 pieceList[us][pt][index[from]] = from;
994 if (type_of(m) == ENPASSANT)
996 capsq -= pawn_push(us);
999 assert(to == st->previous->epSquare);
1000 assert(relative_rank(us, to) == RANK_6);
1001 assert(piece_on(capsq) == NO_PIECE);
1004 // Restore the captured piece
1005 byTypeBB[ALL_PIECES] |= capsq;
1006 byTypeBB[capture] |= capsq;
1007 byColorBB[them] |= capsq;
1009 board[capsq] = make_piece(them, capture);
1011 // Update piece list, add a new captured piece in capsq square
1012 index[capsq] = pieceCount[them][capture]++;
1013 pieceList[them][capture][index[capsq]] = capsq;
1016 // Finally point our state pointer back to the previous state
1019 assert(pos_is_ok());
1023 /// Position::do_castle_move() is a private method used to do/undo a castling
1024 /// move. Note that castling moves are encoded as "king captures friendly rook"
1025 /// moves, for instance white short castling in a non-Chess960 game is encoded
1028 void Position::do_castle_move(Move m) {
1031 assert(type_of(m) == CASTLE);
1033 Square kto, kfrom, rfrom, rto, kAfter, rAfter;
1035 Color us = sideToMove;
1036 Square kBefore = from_sq(m);
1037 Square rBefore = to_sq(m);
1039 // Find after-castle squares for king and rook
1040 if (rBefore > kBefore) // O-O
1042 kAfter = relative_square(us, SQ_G1);
1043 rAfter = relative_square(us, SQ_F1);
1047 kAfter = relative_square(us, SQ_C1);
1048 rAfter = relative_square(us, SQ_D1);
1051 kfrom = Do ? kBefore : kAfter;
1052 rfrom = Do ? rBefore : rAfter;
1054 kto = Do ? kAfter : kBefore;
1055 rto = Do ? rAfter : rBefore;
1057 assert(piece_on(kfrom) == make_piece(us, KING));
1058 assert(piece_on(rfrom) == make_piece(us, ROOK));
1060 // Move the pieces, with some care; in chess960 could be kto == rfrom
1061 Bitboard k_from_to_bb = SquareBB[kfrom] ^ SquareBB[kto];
1062 Bitboard r_from_to_bb = SquareBB[rfrom] ^ SquareBB[rto];
1063 byTypeBB[KING] ^= k_from_to_bb;
1064 byTypeBB[ROOK] ^= r_from_to_bb;
1065 byTypeBB[ALL_PIECES] ^= k_from_to_bb ^ r_from_to_bb;
1066 byColorBB[us] ^= k_from_to_bb ^ r_from_to_bb;
1069 Piece king = make_piece(us, KING);
1070 Piece rook = make_piece(us, ROOK);
1071 board[kfrom] = board[rfrom] = NO_PIECE;
1075 // Update piece lists
1076 pieceList[us][KING][index[kfrom]] = kto;
1077 pieceList[us][ROOK][index[rfrom]] = rto;
1078 int tmp = index[rfrom]; // In Chess960 could be kto == rfrom
1079 index[kto] = index[kfrom];
1084 // Reset capture field
1085 st->capturedType = NO_PIECE_TYPE;
1087 // Update incremental scores
1088 st->psqScore += psq_delta(king, kfrom, kto);
1089 st->psqScore += psq_delta(rook, rfrom, rto);
1092 st->key ^= zobrist[us][KING][kfrom] ^ zobrist[us][KING][kto];
1093 st->key ^= zobrist[us][ROOK][rfrom] ^ zobrist[us][ROOK][rto];
1095 // Clear en passant square
1096 if (st->epSquare != SQ_NONE)
1098 st->key ^= zobEp[file_of(st->epSquare)];
1099 st->epSquare = SQ_NONE;
1102 // Update castling rights
1103 st->key ^= zobCastle[st->castleRights & castleRightsMask[kfrom]];
1104 st->castleRights &= ~castleRightsMask[kfrom];
1106 // Update checkers BB
1107 st->checkersBB = attackers_to(king_square(~us)) & pieces(us);
1109 sideToMove = ~sideToMove;
1112 // Undo: point our state pointer back to the previous state
1115 assert(pos_is_ok());
1119 /// Position::do_null_move() is used to do/undo a "null move": It flips the side
1120 /// to move and updates the hash key without executing any move on the board.
1122 void Position::do_null_move(StateInfo& backupSt) {
1124 assert(!in_check());
1126 // Back up the information necessary to undo the null move to the supplied
1127 // StateInfo object. Note that differently from normal case here backupSt
1128 // is actually used as a backup storage not as the new state. This reduces
1129 // the number of fields to be copied.
1130 StateInfo* src = Do ? st : &backupSt;
1131 StateInfo* dst = Do ? &backupSt : st;
1133 dst->key = src->key;
1134 dst->epSquare = src->epSquare;
1135 dst->psqScore = src->psqScore;
1136 dst->rule50 = src->rule50;
1137 dst->pliesFromNull = src->pliesFromNull;
1139 sideToMove = ~sideToMove;
1143 if (st->epSquare != SQ_NONE)
1144 st->key ^= zobEp[file_of(st->epSquare)];
1146 st->key ^= zobSideToMove;
1147 prefetch((char*)TT.first_entry(st->key));
1149 st->epSquare = SQ_NONE;
1151 st->pliesFromNull = 0;
1154 assert(pos_is_ok());
1157 // Explicit template instantiations
1158 template void Position::do_null_move<false>(StateInfo& backupSt);
1159 template void Position::do_null_move<true>(StateInfo& backupSt);
1162 /// Position::see() is a static exchange evaluator: It tries to estimate the
1163 /// material gain or loss resulting from a move. There are three versions of
1164 /// this function: One which takes a destination square as input, one takes a
1165 /// move, and one which takes a 'from' and a 'to' square. The function does
1166 /// not yet understand promotions captures.
1168 int Position::see_sign(Move m) const {
1172 // Early return if SEE cannot be negative because captured piece value
1173 // is not less then capturing one. Note that king moves always return
1174 // here because king midgame value is set to 0.
1175 if (PieceValueMidgame[piece_on(to_sq(m))] >= PieceValueMidgame[piece_moved(m)])
1181 int Position::see(Move m) const {
1184 Bitboard occ, attackers, stmAttackers, b;
1185 int swapList[32], slIndex = 1;
1186 PieceType capturedType, pt;
1191 // As castle moves are implemented as capturing the rook, they have
1192 // SEE == RookValueMidgame most of the times (unless the rook is under
1194 if (type_of(m) == CASTLE)
1199 capturedType = type_of(piece_on(to));
1202 // Handle en passant moves
1203 if (type_of(m) == ENPASSANT)
1205 Square capQq = to - pawn_push(sideToMove);
1207 assert(!capturedType);
1208 assert(type_of(piece_on(capQq)) == PAWN);
1210 // Remove the captured pawn
1212 capturedType = PAWN;
1215 // Find all attackers to the destination square, with the moving piece
1216 // removed, but possibly an X-ray attacker added behind it.
1218 attackers = attackers_to(to, occ);
1220 // If the opponent has no attackers we are finished
1221 stm = ~color_of(piece_on(from));
1222 stmAttackers = attackers & pieces(stm);
1224 return PieceValueMidgame[capturedType];
1226 // The destination square is defended, which makes things rather more
1227 // difficult to compute. We proceed by building up a "swap list" containing
1228 // the material gain or loss at each stop in a sequence of captures to the
1229 // destination square, where the sides alternately capture, and always
1230 // capture with the least valuable piece. After each capture, we look for
1231 // new X-ray attacks from behind the capturing piece.
1232 swapList[0] = PieceValueMidgame[capturedType];
1233 capturedType = type_of(piece_on(from));
1236 // Locate the least valuable attacker for the side to move. The loop
1237 // below looks like it is potentially infinite, but it isn't. We know
1238 // that the side to move still has at least one attacker left.
1239 for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++)
1242 // Remove the attacker we just found from the 'occupied' bitboard,
1243 // and scan for new X-ray attacks behind the attacker.
1244 b = stmAttackers & pieces(pt);
1245 occ ^= (b & (~b + 1));
1246 attackers |= (attacks_bb<ROOK>(to, occ) & pieces(ROOK, QUEEN))
1247 | (attacks_bb<BISHOP>(to, occ) & pieces(BISHOP, QUEEN));
1249 attackers &= occ; // Cut out pieces we've already done
1251 // Add the new entry to the swap list
1252 assert(slIndex < 32);
1253 swapList[slIndex] = -swapList[slIndex - 1] + PieceValueMidgame[capturedType];
1256 // Remember the value of the capturing piece, and change the side to
1257 // move before beginning the next iteration.
1260 stmAttackers = attackers & pieces(stm);
1262 // Stop before processing a king capture
1263 if (capturedType == KING && stmAttackers)
1265 assert(slIndex < 32);
1266 swapList[slIndex++] = QueenValueMidgame*10;
1269 } while (stmAttackers);
1271 // Having built the swap list, we negamax through it to find the best
1272 // achievable score from the point of view of the side to move.
1274 swapList[slIndex-1] = std::min(-swapList[slIndex], swapList[slIndex-1]);
1280 /// Position::clear() erases the position object to a pristine state, with an
1281 /// empty board, white to move, and no castling rights.
1283 void Position::clear() {
1285 memset(this, 0, sizeof(Position));
1286 startState.epSquare = SQ_NONE;
1289 for (int i = 0; i < 8; i++)
1290 for (int j = 0; j < 16; j++)
1291 pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE;
1293 for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
1294 board[sq] = NO_PIECE;
1298 /// Position::put_piece() puts a piece on the given square of the board,
1299 /// updating the board array, pieces list, bitboards, and piece counts.
1301 void Position::put_piece(Piece p, Square s) {
1303 Color c = color_of(p);
1304 PieceType pt = type_of(p);
1307 index[s] = pieceCount[c][pt]++;
1308 pieceList[c][pt][index[s]] = s;
1310 byTypeBB[ALL_PIECES] |= s;
1316 /// Position::compute_key() computes the hash key of the position. The hash
1317 /// key is usually updated incrementally as moves are made and unmade, the
1318 /// compute_key() function is only used when a new position is set up, and
1319 /// to verify the correctness of the hash key when running in debug mode.
1321 Key Position::compute_key() const {
1323 Key k = zobCastle[st->castleRights];
1325 for (Bitboard b = pieces(); b; )
1327 Square s = pop_lsb(&b);
1328 k ^= zobrist[color_of(piece_on(s))][type_of(piece_on(s))][s];
1331 if (ep_square() != SQ_NONE)
1332 k ^= zobEp[file_of(ep_square())];
1334 if (sideToMove == BLACK)
1341 /// Position::compute_pawn_key() computes the hash key of the position. The
1342 /// hash key is usually updated incrementally as moves are made and unmade,
1343 /// the compute_pawn_key() function is only used when a new position is set
1344 /// up, and to verify the correctness of the pawn hash key when running in
1347 Key Position::compute_pawn_key() const {
1351 for (Bitboard b = pieces(PAWN); b; )
1353 Square s = pop_lsb(&b);
1354 k ^= zobrist[color_of(piece_on(s))][PAWN][s];
1361 /// Position::compute_material_key() computes the hash key of the position.
1362 /// The hash key is usually updated incrementally as moves are made and unmade,
1363 /// the compute_material_key() function is only used when a new position is set
1364 /// up, and to verify the correctness of the material hash key when running in
1367 Key Position::compute_material_key() const {
1371 for (Color c = WHITE; c <= BLACK; c++)
1372 for (PieceType pt = PAWN; pt <= QUEEN; pt++)
1373 for (int cnt = 0; cnt < piece_count(c, pt); cnt++)
1374 k ^= zobrist[c][pt][cnt];
1380 /// Position::compute_psq_score() computes the incremental scores for the middle
1381 /// game and the endgame. These functions are used to initialize the incremental
1382 /// scores when a new position is set up, and to verify that the scores are correctly
1383 /// updated by do_move and undo_move when the program is running in debug mode.
1384 Score Position::compute_psq_score() const {
1386 Score score = SCORE_ZERO;
1388 for (Bitboard b = pieces(); b; )
1390 Square s = pop_lsb(&b);
1391 score += pieceSquareTable[piece_on(s)][s];
1398 /// Position::compute_non_pawn_material() computes the total non-pawn middle
1399 /// game material value for the given side. Material values are updated
1400 /// incrementally during the search, this function is only used while
1401 /// initializing a new Position object.
1403 Value Position::compute_non_pawn_material(Color c) const {
1405 Value value = VALUE_ZERO;
1407 for (PieceType pt = KNIGHT; pt <= QUEEN; pt++)
1408 value += piece_count(c, pt) * PieceValueMidgame[pt];
1414 /// Position::is_draw() tests whether the position is drawn by material,
1415 /// repetition, or the 50 moves rule. It does not detect stalemates, this
1416 /// must be done by the search.
1417 template<bool SkipRepetition>
1418 bool Position::is_draw() const {
1420 // Draw by material?
1422 && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMidgame))
1425 // Draw by the 50 moves rule?
1426 if (st->rule50 > 99 && (!in_check() || MoveList<LEGAL>(*this).size()))
1429 // Draw by repetition?
1430 if (!SkipRepetition)
1432 int i = 4, e = std::min(st->rule50, st->pliesFromNull);
1436 StateInfo* stp = st->previous->previous;
1439 stp = stp->previous->previous;
1441 if (stp->key == st->key)
1453 // Explicit template instantiations
1454 template bool Position::is_draw<false>() const;
1455 template bool Position::is_draw<true>() const;
1458 /// Position::init() is a static member function which initializes at startup
1459 /// the various arrays used to compute hash keys and the piece square tables.
1460 /// The latter is a two-step operation: First, the white halves of the tables
1461 /// are copied from PSQT[] tables. Second, the black halves of the tables are
1462 /// initialized by flipping and changing the sign of the white scores.
1464 void Position::init() {
1468 for (Color c = WHITE; c <= BLACK; c++)
1469 for (PieceType pt = PAWN; pt <= KING; pt++)
1470 for (Square s = SQ_A1; s <= SQ_H8; s++)
1471 zobrist[c][pt][s] = rk.rand<Key>();
1473 for (File f = FILE_A; f <= FILE_H; f++)
1474 zobEp[f] = rk.rand<Key>();
1476 for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++)
1481 Key k = zobCastle[1ULL << pop_lsb(&b)];
1482 zobCastle[cr] ^= k ? k : rk.rand<Key>();
1486 zobSideToMove = rk.rand<Key>();
1487 zobExclusion = rk.rand<Key>();
1489 for (PieceType pt = PAWN; pt <= KING; pt++)
1491 Score v = make_score(PieceValueMidgame[pt], PieceValueEndgame[pt]);
1493 for (Square s = SQ_A1; s <= SQ_H8; s++)
1495 pieceSquareTable[make_piece(WHITE, pt)][ s] = (v + PSQT[pt][s]);
1496 pieceSquareTable[make_piece(BLACK, pt)][~s] = -(v + PSQT[pt][s]);
1502 /// Position::flip() flips position with the white and black sides reversed. This
1503 /// is only useful for debugging especially for finding evaluation symmetry bugs.
1505 void Position::flip() {
1507 const Position pos(*this);
1511 sideToMove = ~pos.side_to_move();
1512 thisThread = pos.this_thread();
1513 nodes = pos.nodes_searched();
1514 chess960 = pos.is_chess960();
1515 startPosPly = pos.startpos_ply_counter();
1517 for (Square s = SQ_A1; s <= SQ_H8; s++)
1518 if (!pos.is_empty(s))
1519 put_piece(Piece(pos.piece_on(s) ^ 8), ~s);
1521 if (pos.can_castle(WHITE_OO))
1522 set_castle_right(BLACK, ~pos.castle_rook_square(WHITE, KING_SIDE));
1523 if (pos.can_castle(WHITE_OOO))
1524 set_castle_right(BLACK, ~pos.castle_rook_square(WHITE, QUEEN_SIDE));
1525 if (pos.can_castle(BLACK_OO))
1526 set_castle_right(WHITE, ~pos.castle_rook_square(BLACK, KING_SIDE));
1527 if (pos.can_castle(BLACK_OOO))
1528 set_castle_right(WHITE, ~pos.castle_rook_square(BLACK, QUEEN_SIDE));
1530 if (pos.st->epSquare != SQ_NONE)
1531 st->epSquare = ~pos.st->epSquare;
1533 st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
1535 st->key = compute_key();
1536 st->pawnKey = compute_pawn_key();
1537 st->materialKey = compute_material_key();
1538 st->psqScore = compute_psq_score();
1539 st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
1540 st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
1542 assert(pos_is_ok());
1546 /// Position::pos_is_ok() performs some consitency checks for the position object.
1547 /// This is meant to be helpful when debugging.
1549 bool Position::pos_is_ok(int* failedStep) const {
1551 int dummy, *step = failedStep ? failedStep : &dummy;
1553 // What features of the position should be verified?
1554 const bool all = false;
1556 const bool debugBitboards = all || false;
1557 const bool debugKingCount = all || false;
1558 const bool debugKingCapture = all || false;
1559 const bool debugCheckerCount = all || false;
1560 const bool debugKey = all || false;
1561 const bool debugMaterialKey = all || false;
1562 const bool debugPawnKey = all || false;
1563 const bool debugIncrementalEval = all || false;
1564 const bool debugNonPawnMaterial = all || false;
1565 const bool debugPieceCounts = all || false;
1566 const bool debugPieceList = all || false;
1567 const bool debugCastleSquares = all || false;
1571 if (sideToMove != WHITE && sideToMove != BLACK)
1574 if ((*step)++, piece_on(king_square(WHITE)) != W_KING)
1577 if ((*step)++, piece_on(king_square(BLACK)) != B_KING)
1580 if ((*step)++, debugKingCount)
1582 int kingCount[2] = {};
1584 for (Square s = SQ_A1; s <= SQ_H8; s++)
1585 if (type_of(piece_on(s)) == KING)
1586 kingCount[color_of(piece_on(s))]++;
1588 if (kingCount[0] != 1 || kingCount[1] != 1)
1592 if ((*step)++, debugKingCapture)
1593 if (attackers_to(king_square(~sideToMove)) & pieces(sideToMove))
1596 if ((*step)++, debugCheckerCount && popcount<Full>(st->checkersBB) > 2)
1599 if ((*step)++, debugBitboards)
1601 // The intersection of the white and black pieces must be empty
1602 if (pieces(WHITE) & pieces(BLACK))
1605 // The union of the white and black pieces must be equal to all
1607 if ((pieces(WHITE) | pieces(BLACK)) != pieces())
1610 // Separate piece type bitboards must have empty intersections
1611 for (PieceType p1 = PAWN; p1 <= KING; p1++)
1612 for (PieceType p2 = PAWN; p2 <= KING; p2++)
1613 if (p1 != p2 && (pieces(p1) & pieces(p2)))
1617 if ((*step)++, ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6)
1620 if ((*step)++, debugKey && st->key != compute_key())
1623 if ((*step)++, debugPawnKey && st->pawnKey != compute_pawn_key())
1626 if ((*step)++, debugMaterialKey && st->materialKey != compute_material_key())
1629 if ((*step)++, debugIncrementalEval && st->psqScore != compute_psq_score())
1632 if ((*step)++, debugNonPawnMaterial)
1634 if ( st->npMaterial[WHITE] != compute_non_pawn_material(WHITE)
1635 || st->npMaterial[BLACK] != compute_non_pawn_material(BLACK))
1639 if ((*step)++, debugPieceCounts)
1640 for (Color c = WHITE; c <= BLACK; c++)
1641 for (PieceType pt = PAWN; pt <= KING; pt++)
1642 if (pieceCount[c][pt] != popcount<Full>(pieces(c, pt)))
1645 if ((*step)++, debugPieceList)
1646 for (Color c = WHITE; c <= BLACK; c++)
1647 for (PieceType pt = PAWN; pt <= KING; pt++)
1648 for (int i = 0; i < pieceCount[c][pt]; i++)
1650 if (piece_on(piece_list(c, pt)[i]) != make_piece(c, pt))
1653 if (index[piece_list(c, pt)[i]] != i)
1657 if ((*step)++, debugCastleSquares)
1658 for (Color c = WHITE; c <= BLACK; c++)
1659 for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
1661 CastleRight cr = make_castle_right(c, s);
1663 if (!can_castle(cr))
1666 if ((castleRightsMask[king_square(c)] & cr) != cr)
1669 if ( piece_on(castleRookSquare[c][s]) != make_piece(c, ROOK)
1670 || castleRightsMask[castleRookSquare[c][s]] != cr)