]> git.sesse.net Git - stockfish/blob - src/position.cpp
Move game_phase() to Position
[stockfish] / src / position.cpp
1 /*
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-2014 Marco Costalba, Joona Kiiski, Tord Romstad
5
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.
10
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.
15
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/>.
18 */
19
20 #include <algorithm>
21 #include <cassert>
22 #include <cstring>
23 #include <iomanip>
24 #include <sstream>
25
26 #include "bitcount.h"
27 #include "movegen.h"
28 #include "notation.h"
29 #include "position.h"
30 #include "psqtab.h"
31 #include "rkiss.h"
32 #include "thread.h"
33 #include "tt.h"
34
35 using std::string;
36
37 static const string PieceToChar(" PNBRQK  pnbrqk");
38
39 CACHE_LINE_ALIGNMENT
40
41 Value PieceValue[PHASE_NB][PIECE_NB] = {
42 { VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg },
43 { VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg } };
44
45 static Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
46
47 namespace Zobrist {
48
49   Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
50   Key enpassant[FILE_NB];
51   Key castling[CASTLING_RIGHT_NB];
52   Key side;
53   Key exclusion;
54 }
55
56 Key Position::exclusion_key() const { return st->key ^ Zobrist::exclusion;}
57
58 namespace {
59
60 // min_attacker() is a helper function used by see() to locate the least
61 // valuable attacker for the side to move, remove the attacker we just found
62 // from the bitboards and scan for new X-ray attacks behind it.
63
64 template<int Pt> FORCE_INLINE
65 PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
66                        Bitboard& occupied, Bitboard& attackers) {
67
68   Bitboard b = stmAttackers & bb[Pt];
69   if (!b)
70       return min_attacker<Pt+1>(bb, to, stmAttackers, occupied, attackers);
71
72   occupied ^= b & ~(b - 1);
73
74   if (Pt == PAWN || Pt == BISHOP || Pt == QUEEN)
75       attackers |= attacks_bb<BISHOP>(to, occupied) & (bb[BISHOP] | bb[QUEEN]);
76
77   if (Pt == ROOK || Pt == QUEEN)
78       attackers |= attacks_bb<ROOK>(to, occupied) & (bb[ROOK] | bb[QUEEN]);
79
80   attackers &= occupied; // After X-ray that may add already processed pieces
81   return (PieceType)Pt;
82 }
83
84 template<> FORCE_INLINE
85 PieceType min_attacker<KING>(const Bitboard*, const Square&, const Bitboard&, Bitboard&, Bitboard&) {
86   return KING; // No need to update bitboards: it is the last cycle
87 }
88
89 } // namespace
90
91
92 /// CheckInfo c'tor
93
94 CheckInfo::CheckInfo(const Position& pos) {
95
96   Color them = ~pos.side_to_move();
97   ksq = pos.king_square(them);
98
99   pinned = pos.pinned_pieces(pos.side_to_move());
100   dcCandidates = pos.discovered_check_candidates();
101
102   checkSq[PAWN]   = pos.attacks_from<PAWN>(ksq, them);
103   checkSq[KNIGHT] = pos.attacks_from<KNIGHT>(ksq);
104   checkSq[BISHOP] = pos.attacks_from<BISHOP>(ksq);
105   checkSq[ROOK]   = pos.attacks_from<ROOK>(ksq);
106   checkSq[QUEEN]  = checkSq[BISHOP] | checkSq[ROOK];
107   checkSq[KING]   = 0;
108 }
109
110
111 /// Position::init() initializes at startup the various arrays used to compute
112 /// hash keys and the piece square tables. The latter is a two-step operation:
113 /// Firstly, the white halves of the tables are copied from PSQT[] tables.
114 /// Secondly, the black halves of the tables are initialized by flipping and
115 /// changing the sign of the white scores.
116
117 void Position::init() {
118
119   RKISS rk;
120
121   for (Color c = WHITE; c <= BLACK; ++c)
122       for (PieceType pt = PAWN; pt <= KING; ++pt)
123           for (Square s = SQ_A1; s <= SQ_H8; ++s)
124               Zobrist::psq[c][pt][s] = rk.rand<Key>();
125
126   for (File f = FILE_A; f <= FILE_H; ++f)
127       Zobrist::enpassant[f] = rk.rand<Key>();
128
129   for (int cf = NO_CASTLING; cf <= ANY_CASTLING; ++cf)
130   {
131       Bitboard b = cf;
132       while (b)
133       {
134           Key k = Zobrist::castling[1ULL << pop_lsb(&b)];
135           Zobrist::castling[cf] ^= k ? k : rk.rand<Key>();
136       }
137   }
138
139   Zobrist::side = rk.rand<Key>();
140   Zobrist::exclusion  = rk.rand<Key>();
141
142   for (PieceType pt = PAWN; pt <= KING; ++pt)
143   {
144       PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt];
145       PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt];
146
147       Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);
148
149       for (Square s = SQ_A1; s <= SQ_H8; ++s)
150       {
151          psq[WHITE][pt][ s] =  (v + PSQT[pt][s]);
152          psq[BLACK][pt][~s] = -(v + PSQT[pt][s]);
153       }
154   }
155 }
156
157
158 /// Position::operator=() creates a copy of 'pos'. We want the new born Position
159 /// object to not depend on any external data so we detach state pointer from
160 /// the source one.
161
162 Position& Position::operator=(const Position& pos) {
163
164   std::memcpy(this, &pos, sizeof(Position));
165   startState = *st;
166   st = &startState;
167   nodes = 0;
168
169   assert(pos_is_ok());
170
171   return *this;
172 }
173
174
175 /// Position::clear() erases the position object to a pristine state, with an
176 /// empty board, white to move, and no castling rights.
177
178 void Position::clear() {
179
180   std::memset(this, 0, sizeof(Position));
181   startState.epSquare = SQ_NONE;
182   st = &startState;
183
184   for (int i = 0; i < PIECE_TYPE_NB; ++i)
185       for (int j = 0; j < 16; ++j)
186           pieceList[WHITE][i][j] = pieceList[BLACK][i][j] = SQ_NONE;
187 }
188
189
190 /// Position::set() initializes the position object with the given FEN string.
191 /// This function is not very robust - make sure that input FENs are correct,
192 /// this is assumed to be the responsibility of the GUI.
193
194 void Position::set(const string& fenStr, bool isChess960, Thread* th) {
195 /*
196    A FEN string defines a particular position using only the ASCII character set.
197
198    A FEN string contains six fields separated by a space. The fields are:
199
200    1) Piece placement (from white's perspective). Each rank is described, starting
201       with rank 8 and ending with rank 1. Within each rank, the contents of each
202       square are described from file A through file H. Following the Standard
203       Algebraic Notation (SAN), each piece is identified by a single letter taken
204       from the standard English names. White pieces are designated using upper-case
205       letters ("PNBRQK") whilst Black uses lowercase ("pnbrqk"). Blank squares are
206       noted using digits 1 through 8 (the number of blank squares), and "/"
207       separates ranks.
208
209    2) Active color. "w" means white moves next, "b" means black.
210
211    3) Castling availability. If neither side can castle, this is "-". Otherwise,
212       this has one or more letters: "K" (White can castle kingside), "Q" (White
213       can castle queenside), "k" (Black can castle kingside), and/or "q" (Black
214       can castle queenside).
215
216    4) En passant target square (in algebraic notation). If there's no en passant
217       target square, this is "-". If a pawn has just made a 2-square move, this
218       is the position "behind" the pawn. This is recorded regardless of whether
219       there is a pawn in position to make an en passant capture.
220
221    5) Halfmove clock. This is the number of halfmoves since the last pawn advance
222       or capture. This is used to determine if a draw can be claimed under the
223       fifty-move rule.
224
225    6) Fullmove number. The number of the full move. It starts at 1, and is
226       incremented after Black's move.
227 */
228
229   unsigned char col, row, token;
230   size_t idx;
231   Square sq = SQ_A8;
232   std::istringstream ss(fenStr);
233
234   clear();
235   ss >> std::noskipws;
236
237   // 1. Piece placement
238   while ((ss >> token) && !isspace(token))
239   {
240       if (isdigit(token))
241           sq += Square(token - '0'); // Advance the given number of files
242
243       else if (token == '/')
244           sq -= Square(16);
245
246       else if ((idx = PieceToChar.find(token)) != string::npos)
247       {
248           put_piece(sq, color_of(Piece(idx)), type_of(Piece(idx)));
249           ++sq;
250       }
251   }
252
253   // 2. Active color
254   ss >> token;
255   sideToMove = (token == 'w' ? WHITE : BLACK);
256   ss >> token;
257
258   // 3. Castling availability. Compatible with 3 standards: Normal FEN standard,
259   // Shredder-FEN that uses the letters of the columns on which the rooks began
260   // the game instead of KQkq and also X-FEN standard that, in case of Chess960,
261   // if an inner rook is associated with the castling right, the castling tag is
262   // replaced by the file letter of the involved rook, as for the Shredder-FEN.
263   while ((ss >> token) && !isspace(token))
264   {
265       Square rsq;
266       Color c = islower(token) ? BLACK : WHITE;
267
268       token = char(toupper(token));
269
270       if (token == 'K')
271           for (rsq = relative_square(c, SQ_H1); type_of(piece_on(rsq)) != ROOK; --rsq) {}
272
273       else if (token == 'Q')
274           for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; ++rsq) {}
275
276       else if (token >= 'A' && token <= 'H')
277           rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1));
278
279       else
280           continue;
281
282       set_castling_right(c, rsq);
283   }
284
285   // 4. En passant square. Ignore if no pawn capture is possible
286   if (   ((ss >> col) && (col >= 'a' && col <= 'h'))
287       && ((ss >> row) && (row == '3' || row == '6')))
288   {
289       st->epSquare = make_square(File(col - 'a'), Rank(row - '1'));
290
291       if (!(attackers_to(st->epSquare) & pieces(sideToMove, PAWN)))
292           st->epSquare = SQ_NONE;
293   }
294
295   // 5-6. Halfmove clock and fullmove number
296   ss >> std::skipws >> st->rule50 >> gamePly;
297
298   // Convert from fullmove starting from 1 to ply starting from 0,
299   // handle also common incorrect FEN with fullmove = 0.
300   gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK);
301
302   chess960 = isChess960;
303   thisThread = th;
304   set_state(st);
305
306   assert(pos_is_ok());
307 }
308
309
310 /// Position::set_castling_right() is a helper function used to set castling
311 /// rights given the corresponding color and the rook starting square.
312
313 void Position::set_castling_right(Color c, Square rfrom) {
314
315   Square kfrom = king_square(c);
316   CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE;
317   CastlingRight cr = (c | cs);
318
319   st->castlingRights |= cr;
320   castlingRightsMask[kfrom] |= cr;
321   castlingRightsMask[rfrom] |= cr;
322   castlingRookSquare[cr] = rfrom;
323
324   Square kto = relative_square(c, cs == KING_SIDE ? SQ_G1 : SQ_C1);
325   Square rto = relative_square(c, cs == KING_SIDE ? SQ_F1 : SQ_D1);
326
327   for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); ++s)
328       if (s != kfrom && s != rfrom)
329           castlingPath[cr] |= s;
330
331   for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); ++s)
332       if (s != kfrom && s != rfrom)
333           castlingPath[cr] |= s;
334 }
335
336
337 /// Position::set_state() computes the hash keys of the position, and other
338 /// data that once computed is updated incrementally as moves are made.
339 /// The function is only used when a new position is set up, and to verify
340 /// the correctness of the StateInfo data when running in debug mode.
341
342 void Position::set_state(StateInfo* si) const {
343
344   si->key = si->pawnKey = si->materialKey = 0;
345   si->npMaterial[WHITE] = si->npMaterial[BLACK] = VALUE_ZERO;
346   si->psq = SCORE_ZERO;
347
348   si->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
349
350   for (Bitboard b = pieces(); b; )
351   {
352       Square s = pop_lsb(&b);
353       Piece pc = piece_on(s);
354       si->key ^= Zobrist::psq[color_of(pc)][type_of(pc)][s];
355       si->psq += psq[color_of(pc)][type_of(pc)][s];
356   }
357
358   if (ep_square() != SQ_NONE)
359       si->key ^= Zobrist::enpassant[file_of(ep_square())];
360
361   if (sideToMove == BLACK)
362       si->key ^= Zobrist::side;
363
364   si->key ^= Zobrist::castling[st->castlingRights];
365
366   for (Bitboard b = pieces(PAWN); b; )
367   {
368       Square s = pop_lsb(&b);
369       si->pawnKey ^= Zobrist::psq[color_of(piece_on(s))][PAWN][s];
370   }
371
372   for (Color c = WHITE; c <= BLACK; ++c)
373       for (PieceType pt = PAWN; pt <= KING; ++pt)
374           for (int cnt = 0; cnt < pieceCount[c][pt]; ++cnt)
375               si->materialKey ^= Zobrist::psq[c][pt][cnt];
376
377   for (Color c = WHITE; c <= BLACK; ++c)
378       for (PieceType pt = KNIGHT; pt <= QUEEN; ++pt)
379           si->npMaterial[c] += pieceCount[c][pt] * PieceValue[MG][pt];
380 }
381
382
383 /// Position::fen() returns a FEN representation of the position. In case of
384 /// Chess960 the Shredder-FEN notation is used. This is mainly a debugging function.
385
386 const string Position::fen() const {
387
388   int emptyCnt;
389   std::ostringstream ss;
390
391   for (Rank r = RANK_8; r >= RANK_1; --r)
392   {
393       for (File f = FILE_A; f <= FILE_H; ++f)
394       {
395           for (emptyCnt = 0; f <= FILE_H && empty(make_square(f, r)); ++f)
396               ++emptyCnt;
397
398           if (emptyCnt)
399               ss << emptyCnt;
400
401           if (f <= FILE_H)
402               ss << PieceToChar[piece_on(make_square(f, r))];
403       }
404
405       if (r > RANK_1)
406           ss << '/';
407   }
408
409   ss << (sideToMove == WHITE ? " w " : " b ");
410
411   if (can_castle(WHITE_OO))
412       ss << (chess960 ? to_char(file_of(castling_rook_square(WHITE |  KING_SIDE)), false) : 'K');
413
414   if (can_castle(WHITE_OOO))
415       ss << (chess960 ? to_char(file_of(castling_rook_square(WHITE | QUEEN_SIDE)), false) : 'Q');
416
417   if (can_castle(BLACK_OO))
418       ss << (chess960 ? to_char(file_of(castling_rook_square(BLACK |  KING_SIDE)),  true) : 'k');
419
420   if (can_castle(BLACK_OOO))
421       ss << (chess960 ? to_char(file_of(castling_rook_square(BLACK | QUEEN_SIDE)),  true) : 'q');
422
423   if (!can_castle(WHITE) && !can_castle(BLACK))
424       ss << '-';
425
426   ss << (ep_square() == SQ_NONE ? " - " : " " + to_string(ep_square()) + " ")
427      << st->rule50 << " " << 1 + (gamePly - (sideToMove == BLACK)) / 2;
428
429   return ss.str();
430 }
431
432
433 /// Position::pretty() returns an ASCII representation of the position to be
434 /// printed to the standard output together with the move's san notation.
435
436 const string Position::pretty(Move m) const {
437
438   std::ostringstream ss;
439
440   if (m)
441       ss << "\nMove: " << (sideToMove == BLACK ? ".." : "")
442          << move_to_san(*const_cast<Position*>(this), m);
443
444   ss << "\n +---+---+---+---+---+---+---+---+\n";
445
446   for (Rank r = RANK_8; r >= RANK_1; --r)
447   {
448       for (File f = FILE_A; f <= FILE_H; ++f)
449           ss << " | " << PieceToChar[piece_on(make_square(f, r))];
450
451       ss << " |\n +---+---+---+---+---+---+---+---+\n";
452   }
453
454   ss << "\nFen: " << fen() << "\nKey: " << std::hex << std::uppercase
455      << std::setfill('0') << std::setw(16) << st->key << "\nCheckers: ";
456
457   for (Bitboard b = checkers(); b; )
458       ss << to_string(pop_lsb(&b)) << " ";
459
460   ss << "\nLegal moves: ";
461   for (MoveList<LEGAL> it(*this); *it; ++it)
462       ss << move_to_san(*const_cast<Position*>(this), *it) << " ";
463
464   return ss.str();
465 }
466
467
468 /// Position::game_phase() calculates the game phase of the position
469
470 Phase Position::game_phase() const {
471
472   Value npm = st->npMaterial[WHITE] + st->npMaterial[BLACK];
473
474   return  npm >= MidgameLimit ? PHASE_MIDGAME
475         : npm <= EndgameLimit ? PHASE_ENDGAME
476         : Phase(((npm - EndgameLimit) * 128) / (MidgameLimit - EndgameLimit));
477 }
478
479
480 /// Position::check_blockers() returns a bitboard of all the pieces with color
481 /// 'c' that are blocking check on the king with color 'kingColor'. A piece
482 /// blocks a check if removing that piece from the board would result in a
483 /// position where the king is in check. A check blocking piece can be either a
484 /// pinned or a discovered check piece, according if its color 'c' is the same
485 /// or the opposite of 'kingColor'.
486
487 Bitboard Position::check_blockers(Color c, Color kingColor) const {
488
489   Bitboard b, pinners, result = 0;
490   Square ksq = king_square(kingColor);
491
492   // Pinners are sliders that give check when a pinned piece is removed
493   pinners = (  (pieces(  ROOK, QUEEN) & PseudoAttacks[ROOK  ][ksq])
494              | (pieces(BISHOP, QUEEN) & PseudoAttacks[BISHOP][ksq])) & pieces(~kingColor);
495
496   while (pinners)
497   {
498       b = between_bb(ksq, pop_lsb(&pinners)) & pieces();
499
500       if (!more_than_one(b))
501           result |= b & pieces(c);
502   }
503   return result;
504 }
505
506
507 /// Position::attackers_to() computes a bitboard of all pieces which attack a
508 /// given square. Slider attacks use the occ bitboard to indicate occupancy.
509
510 Bitboard Position::attackers_to(Square s, Bitboard occ) const {
511
512   return  (attacks_from<PAWN>(s, BLACK) & pieces(WHITE, PAWN))
513         | (attacks_from<PAWN>(s, WHITE) & pieces(BLACK, PAWN))
514         | (attacks_from<KNIGHT>(s)      & pieces(KNIGHT))
515         | (attacks_bb<ROOK>(s, occ)     & pieces(ROOK, QUEEN))
516         | (attacks_bb<BISHOP>(s, occ)   & pieces(BISHOP, QUEEN))
517         | (attacks_from<KING>(s)        & pieces(KING));
518 }
519
520
521 /// Position::legal() tests whether a pseudo-legal move is legal
522
523 bool Position::legal(Move m, Bitboard pinned) const {
524
525   assert(is_ok(m));
526   assert(pinned == pinned_pieces(sideToMove));
527
528   Color us = sideToMove;
529   Square from = from_sq(m);
530
531   assert(color_of(moved_piece(m)) == us);
532   assert(piece_on(king_square(us)) == make_piece(us, KING));
533
534   // En passant captures are a tricky special case. Because they are rather
535   // uncommon, we do it simply by testing whether the king is attacked after
536   // the move is made.
537   if (type_of(m) == ENPASSANT)
538   {
539       Square ksq = king_square(us);
540       Square to = to_sq(m);
541       Square capsq = to - pawn_push(us);
542       Bitboard occ = (pieces() ^ from ^ capsq) | to;
543
544       assert(to == ep_square());
545       assert(moved_piece(m) == make_piece(us, PAWN));
546       assert(piece_on(capsq) == make_piece(~us, PAWN));
547       assert(piece_on(to) == NO_PIECE);
548
549       return   !(attacks_bb<  ROOK>(ksq, occ) & pieces(~us, QUEEN, ROOK))
550             && !(attacks_bb<BISHOP>(ksq, occ) & pieces(~us, QUEEN, BISHOP));
551   }
552
553   // If the moving piece is a king, check whether the destination
554   // square is attacked by the opponent. Castling moves are checked
555   // for legality during move generation.
556   if (type_of(piece_on(from)) == KING)
557       return type_of(m) == CASTLING || !(attackers_to(to_sq(m)) & pieces(~us));
558
559   // A non-king move is legal if and only if it is not pinned or it
560   // is moving along the ray towards or away from the king.
561   return   !pinned
562         || !(pinned & from)
563         ||  aligned(from, to_sq(m), king_square(us));
564 }
565
566
567 /// Position::pseudo_legal() takes a random move and tests whether the move is
568 /// pseudo legal. It is used to validate moves from TT that can be corrupted
569 /// due to SMP concurrent access or hash position key aliasing.
570
571 bool Position::pseudo_legal(const Move m) const {
572
573   Color us = sideToMove;
574   Square from = from_sq(m);
575   Square to = to_sq(m);
576   Piece pc = moved_piece(m);
577
578   // Use a slower but simpler function for uncommon cases
579   if (type_of(m) != NORMAL)
580       return MoveList<LEGAL>(*this).contains(m);
581
582   // Is not a promotion, so promotion piece must be empty
583   if (promotion_type(m) - 2 != NO_PIECE_TYPE)
584       return false;
585
586   // If the 'from' square is not occupied by a piece belonging to the side to
587   // move, the move is obviously not legal.
588   if (pc == NO_PIECE || color_of(pc) != us)
589       return false;
590
591   // The destination square cannot be occupied by a friendly piece
592   if (pieces(us) & to)
593       return false;
594
595   // Handle the special case of a pawn move
596   if (type_of(pc) == PAWN)
597   {
598       // We have already handled promotion moves, so destination
599       // cannot be on the 8th/1st rank.
600       if (rank_of(to) == relative_rank(us, RANK_8))
601           return false;
602
603       if (   !(attacks_from<PAWN>(from, us) & pieces(~us) & to) // Not a capture
604
605           && !((from + pawn_push(us) == to) && empty(to))       // Not a single push
606
607           && !(   (from + 2 * pawn_push(us) == to)              // Not a double push
608                && (rank_of(from) == relative_rank(us, RANK_2))
609                && empty(to)
610                && empty(to - pawn_push(us))))
611           return false;
612   }
613   else if (!(attacks_from(pc, from) & to))
614       return false;
615
616   // Evasions generator already takes care to avoid some kind of illegal moves
617   // and legal() relies on this. We therefore have to take care that the same
618   // kind of moves are filtered out here.
619   if (checkers())
620   {
621       if (type_of(pc) != KING)
622       {
623           // Double check? In this case a king move is required
624           if (more_than_one(checkers()))
625               return false;
626
627           // Our move must be a blocking evasion or a capture of the checking piece
628           if (!((between_bb(lsb(checkers()), king_square(us)) | checkers()) & to))
629               return false;
630       }
631       // In case of king moves under check we have to remove king so as to catch
632       // invalid moves like b1a1 when opposite queen is on c1.
633       else if (attackers_to(to, pieces() ^ from) & pieces(~us))
634           return false;
635   }
636
637   return true;
638 }
639
640
641 /// Position::gives_check() tests whether a pseudo-legal move gives a check
642
643 bool Position::gives_check(Move m, const CheckInfo& ci) const {
644
645   assert(is_ok(m));
646   assert(ci.dcCandidates == discovered_check_candidates());
647   assert(color_of(moved_piece(m)) == sideToMove);
648
649   Square from = from_sq(m);
650   Square to = to_sq(m);
651   PieceType pt = type_of(piece_on(from));
652
653   // Is there a direct check?
654   if (ci.checkSq[pt] & to)
655       return true;
656
657   // Is there a discovered check?
658   if (   unlikely(ci.dcCandidates)
659       && (ci.dcCandidates & from)
660       && !aligned(from, to, ci.ksq))
661       return true;
662
663   switch (type_of(m))
664   {
665   case NORMAL:
666       return false;
667
668   case PROMOTION:
669       return attacks_bb(Piece(promotion_type(m)), to, pieces() ^ from) & ci.ksq;
670
671   // En passant capture with check? We have already handled the case
672   // of direct checks and ordinary discovered check, so the only case we
673   // need to handle is the unusual case of a discovered check through
674   // the captured pawn.
675   case ENPASSANT:
676   {
677       Square capsq = make_square(file_of(to), rank_of(from));
678       Bitboard b = (pieces() ^ from ^ capsq) | to;
679
680       return  (attacks_bb<  ROOK>(ci.ksq, b) & pieces(sideToMove, QUEEN, ROOK))
681             | (attacks_bb<BISHOP>(ci.ksq, b) & pieces(sideToMove, QUEEN, BISHOP));
682   }
683   case CASTLING:
684   {
685       Square kfrom = from;
686       Square rfrom = to; // Castling is encoded as 'King captures the rook'
687       Square kto = relative_square(sideToMove, rfrom > kfrom ? SQ_G1 : SQ_C1);
688       Square rto = relative_square(sideToMove, rfrom > kfrom ? SQ_F1 : SQ_D1);
689
690       return   (PseudoAttacks[ROOK][rto] & ci.ksq)
691             && (attacks_bb<ROOK>(rto, (pieces() ^ kfrom ^ rfrom) | rto | kto) & ci.ksq);
692   }
693   default:
694       assert(false);
695       return false;
696   }
697 }
698
699
700 /// Position::do_move() makes a move, and saves all information necessary
701 /// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
702 /// moves should be filtered out before this function is called.
703
704 void Position::do_move(Move m, StateInfo& newSt) {
705
706   CheckInfo ci(*this);
707   do_move(m, newSt, ci, gives_check(m, ci));
708 }
709
710 void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveIsCheck) {
711
712   assert(is_ok(m));
713   assert(&newSt != st);
714
715   ++nodes;
716   Key k = st->key;
717
718   // Copy some fields of the old state to our new StateInfo object except the
719   // ones which are going to be recalculated from scratch anyway and then switch
720   // our state pointer to point to the new (ready to be updated) state.
721   std::memcpy(&newSt, st, StateCopySize64 * sizeof(uint64_t));
722
723   newSt.previous = st;
724   st = &newSt;
725
726   // Update side to move
727   k ^= Zobrist::side;
728
729   // Increment ply counters. In particular, rule50 will be reset to zero later on
730   // in case of a capture or a pawn move.
731   ++gamePly;
732   ++st->rule50;
733   ++st->pliesFromNull;
734
735   Color us = sideToMove;
736   Color them = ~us;
737   Square from = from_sq(m);
738   Square to = to_sq(m);
739   Piece pc = piece_on(from);
740   PieceType pt = type_of(pc);
741   PieceType captured = type_of(m) == ENPASSANT ? PAWN : type_of(piece_on(to));
742
743   assert(color_of(pc) == us);
744   assert(piece_on(to) == NO_PIECE || color_of(piece_on(to)) == them || type_of(m) == CASTLING);
745   assert(captured != KING);
746
747   if (type_of(m) == CASTLING)
748   {
749       assert(pc == make_piece(us, KING));
750
751       Square rfrom, rto;
752       do_castling<true>(from, to, rfrom, rto);
753
754       captured = NO_PIECE_TYPE;
755       st->psq += psq[us][ROOK][rto] - psq[us][ROOK][rfrom];
756       k ^= Zobrist::psq[us][ROOK][rfrom] ^ Zobrist::psq[us][ROOK][rto];
757   }
758
759   if (captured)
760   {
761       Square capsq = to;
762
763       // If the captured piece is a pawn, update pawn hash key, otherwise
764       // update non-pawn material.
765       if (captured == PAWN)
766       {
767           if (type_of(m) == ENPASSANT)
768           {
769               capsq += pawn_push(them);
770
771               assert(pt == PAWN);
772               assert(to == st->epSquare);
773               assert(relative_rank(us, to) == RANK_6);
774               assert(piece_on(to) == NO_PIECE);
775               assert(piece_on(capsq) == make_piece(them, PAWN));
776
777               board[capsq] = NO_PIECE;
778           }
779
780           st->pawnKey ^= Zobrist::psq[them][PAWN][capsq];
781       }
782       else
783           st->npMaterial[them] -= PieceValue[MG][captured];
784
785       // Update board and piece lists
786       remove_piece(capsq, them, captured);
787
788       // Update material hash key and prefetch access to materialTable
789       k ^= Zobrist::psq[them][captured][capsq];
790       st->materialKey ^= Zobrist::psq[them][captured][pieceCount[them][captured]];
791       prefetch((char*)thisThread->materialTable[st->materialKey]);
792
793       // Update incremental scores
794       st->psq -= psq[them][captured][capsq];
795
796       // Reset rule 50 counter
797       st->rule50 = 0;
798   }
799
800   // Update hash key
801   k ^= Zobrist::psq[us][pt][from] ^ Zobrist::psq[us][pt][to];
802
803   // Reset en passant square
804   if (st->epSquare != SQ_NONE)
805   {
806       k ^= Zobrist::enpassant[file_of(st->epSquare)];
807       st->epSquare = SQ_NONE;
808   }
809
810   // Update castling rights if needed
811   if (st->castlingRights && (castlingRightsMask[from] | castlingRightsMask[to]))
812   {
813       int cr = castlingRightsMask[from] | castlingRightsMask[to];
814       k ^= Zobrist::castling[st->castlingRights & cr];
815       st->castlingRights &= ~cr;
816   }
817
818   // Prefetch TT access as soon as we know the new hash key
819   prefetch((char*)TT.first_entry(k));
820
821   // Move the piece. The tricky Chess960 castling is handled earlier
822   if (type_of(m) != CASTLING)
823       move_piece(from, to, us, pt);
824
825   // If the moving piece is a pawn do some special extra work
826   if (pt == PAWN)
827   {
828       // Set en-passant square if the moved pawn can be captured
829       if (   (int(to) ^ int(from)) == 16
830           && (attacks_from<PAWN>(from + pawn_push(us), us) & pieces(them, PAWN)))
831       {
832           st->epSquare = Square((from + to) / 2);
833           k ^= Zobrist::enpassant[file_of(st->epSquare)];
834       }
835
836       else if (type_of(m) == PROMOTION)
837       {
838           PieceType promotion = promotion_type(m);
839
840           assert(relative_rank(us, to) == RANK_8);
841           assert(promotion >= KNIGHT && promotion <= QUEEN);
842
843           remove_piece(to, us, PAWN);
844           put_piece(to, us, promotion);
845
846           // Update hash keys
847           k ^= Zobrist::psq[us][PAWN][to] ^ Zobrist::psq[us][promotion][to];
848           st->pawnKey ^= Zobrist::psq[us][PAWN][to];
849           st->materialKey ^=  Zobrist::psq[us][promotion][pieceCount[us][promotion]-1]
850                             ^ Zobrist::psq[us][PAWN][pieceCount[us][PAWN]];
851
852           // Update incremental score
853           st->psq += psq[us][promotion][to] - psq[us][PAWN][to];
854
855           // Update material
856           st->npMaterial[us] += PieceValue[MG][promotion];
857       }
858
859       // Update pawn hash key and prefetch access to pawnsTable
860       st->pawnKey ^= Zobrist::psq[us][PAWN][from] ^ Zobrist::psq[us][PAWN][to];
861       prefetch((char*)thisThread->pawnsTable[st->pawnKey]);
862
863       // Reset rule 50 draw counter
864       st->rule50 = 0;
865   }
866
867   // Update incremental scores
868   st->psq += psq[us][pt][to] - psq[us][pt][from];
869
870   // Set capture piece
871   st->capturedType = captured;
872
873   // Update the key with the final value
874   st->key = k;
875
876   // Update checkers bitboard: piece must be already moved due to attacks_from()
877   st->checkersBB = 0;
878
879   if (moveIsCheck)
880   {
881       if (type_of(m) != NORMAL)
882           st->checkersBB = attackers_to(king_square(them)) & pieces(us);
883       else
884       {
885           // Direct checks
886           if (ci.checkSq[pt] & to)
887               st->checkersBB |= to;
888
889           // Discovered checks
890           if (unlikely(ci.dcCandidates) && (ci.dcCandidates & from))
891           {
892               if (pt != ROOK)
893                   st->checkersBB |= attacks_from<ROOK>(king_square(them)) & pieces(us, QUEEN, ROOK);
894
895               if (pt != BISHOP)
896                   st->checkersBB |= attacks_from<BISHOP>(king_square(them)) & pieces(us, QUEEN, BISHOP);
897           }
898       }
899   }
900
901   sideToMove = ~sideToMove;
902
903   assert(pos_is_ok());
904 }
905
906
907 /// Position::undo_move() unmakes a move. When it returns, the position should
908 /// be restored to exactly the same state as before the move was made.
909
910 void Position::undo_move(Move m) {
911
912   assert(is_ok(m));
913
914   sideToMove = ~sideToMove;
915
916   Color us = sideToMove;
917   Square from = from_sq(m);
918   Square to = to_sq(m);
919   PieceType pt = type_of(piece_on(to));
920
921   assert(empty(from) || type_of(m) == CASTLING);
922   assert(st->capturedType != KING);
923
924   if (type_of(m) == PROMOTION)
925   {
926       assert(pt == promotion_type(m));
927       assert(relative_rank(us, to) == RANK_8);
928       assert(promotion_type(m) >= KNIGHT && promotion_type(m) <= QUEEN);
929
930       remove_piece(to, us, promotion_type(m));
931       put_piece(to, us, PAWN);
932       pt = PAWN;
933   }
934
935   if (type_of(m) == CASTLING)
936   {
937       Square rfrom, rto;
938       do_castling<false>(from, to, rfrom, rto);
939   }
940   else
941   {
942       move_piece(to, from, us, pt); // Put the piece back at the source square
943
944       if (st->capturedType)
945       {
946           Square capsq = to;
947
948           if (type_of(m) == ENPASSANT)
949           {
950               capsq -= pawn_push(us);
951
952               assert(pt == PAWN);
953               assert(to == st->previous->epSquare);
954               assert(relative_rank(us, to) == RANK_6);
955               assert(piece_on(capsq) == NO_PIECE);
956           }
957
958           put_piece(capsq, ~us, st->capturedType); // Restore the captured piece
959       }
960   }
961
962   // Finally point our state pointer back to the previous state
963   st = st->previous;
964   --gamePly;
965
966   assert(pos_is_ok());
967 }
968
969
970 /// Position::do_castling() is a helper used to do/undo a castling move. This
971 /// is a bit tricky, especially in Chess960.
972 template<bool Do>
973 void Position::do_castling(Square from, Square& to, Square& rfrom, Square& rto) {
974
975   bool kingSide = to > from;
976   rfrom = to; // Castling is encoded as "king captures friendly rook"
977   rto = relative_square(sideToMove, kingSide ? SQ_F1 : SQ_D1);
978   to  = relative_square(sideToMove, kingSide ? SQ_G1 : SQ_C1);
979
980   // Remove both pieces first since squares could overlap in Chess960
981   remove_piece(Do ?  from :  to, sideToMove, KING);
982   remove_piece(Do ? rfrom : rto, sideToMove, ROOK);
983   board[Do ? from : to] = board[Do ? rfrom : rto] = NO_PIECE; // Since remove_piece doesn't do it for us
984   put_piece(Do ?  to :  from, sideToMove, KING);
985   put_piece(Do ? rto : rfrom, sideToMove, ROOK);
986 }
987
988
989 /// Position::do(undo)_null_move() is used to do(undo) a "null move": It flips
990 /// the side to move without executing any move on the board.
991
992 void Position::do_null_move(StateInfo& newSt) {
993
994   assert(!checkers());
995
996   std::memcpy(&newSt, st, sizeof(StateInfo)); // Fully copy here
997
998   newSt.previous = st;
999   st = &newSt;
1000
1001   if (st->epSquare != SQ_NONE)
1002   {
1003       st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
1004       st->epSquare = SQ_NONE;
1005   }
1006
1007   st->key ^= Zobrist::side;
1008   prefetch((char*)TT.first_entry(st->key));
1009
1010   ++st->rule50;
1011   st->pliesFromNull = 0;
1012
1013   sideToMove = ~sideToMove;
1014
1015   assert(pos_is_ok());
1016 }
1017
1018 void Position::undo_null_move() {
1019
1020   assert(!checkers());
1021
1022   st = st->previous;
1023   sideToMove = ~sideToMove;
1024 }
1025
1026
1027 /// Position::see() is a static exchange evaluator: It tries to estimate the
1028 /// material gain or loss resulting from a move.
1029
1030 Value Position::see_sign(Move m) const {
1031
1032   assert(is_ok(m));
1033
1034   // Early return if SEE cannot be negative because captured piece value
1035   // is not less then capturing one. Note that king moves always return
1036   // here because king midgame value is set to 0.
1037   if (PieceValue[MG][moved_piece(m)] <= PieceValue[MG][piece_on(to_sq(m))])
1038       return VALUE_KNOWN_WIN;
1039
1040   return see(m);
1041 }
1042
1043 Value Position::see(Move m) const {
1044
1045   Square from, to;
1046   Bitboard occupied, attackers, stmAttackers;
1047   Value swapList[32];
1048   int slIndex = 1;
1049   PieceType captured;
1050   Color stm;
1051
1052   assert(is_ok(m));
1053
1054   from = from_sq(m);
1055   to = to_sq(m);
1056   swapList[0] = PieceValue[MG][piece_on(to)];
1057   stm = color_of(piece_on(from));
1058   occupied = pieces() ^ from;
1059
1060   // Castling moves are implemented as king capturing the rook so cannot be
1061   // handled correctly. Simply return 0 that is always the correct value
1062   // unless in the rare case the rook ends up under attack.
1063   if (type_of(m) == CASTLING)
1064       return VALUE_ZERO;
1065
1066   if (type_of(m) == ENPASSANT)
1067   {
1068       occupied ^= to - pawn_push(stm); // Remove the captured pawn
1069       swapList[0] = PieceValue[MG][PAWN];
1070   }
1071
1072   // Find all attackers to the destination square, with the moving piece
1073   // removed, but possibly an X-ray attacker added behind it.
1074   attackers = attackers_to(to, occupied) & occupied;
1075
1076   // If the opponent has no attackers we are finished
1077   stm = ~stm;
1078   stmAttackers = attackers & pieces(stm);
1079   if (!stmAttackers)
1080       return swapList[0];
1081
1082   // The destination square is defended, which makes things rather more
1083   // difficult to compute. We proceed by building up a "swap list" containing
1084   // the material gain or loss at each stop in a sequence of captures to the
1085   // destination square, where the sides alternately capture, and always
1086   // capture with the least valuable piece. After each capture, we look for
1087   // new X-ray attacks from behind the capturing piece.
1088   captured = type_of(piece_on(from));
1089
1090   do {
1091       assert(slIndex < 32);
1092
1093       // Add the new entry to the swap list
1094       swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured];
1095
1096       // Locate and remove the next least valuable attacker
1097       captured = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
1098
1099       // Stop before processing a king capture
1100       if (captured == KING)
1101       {
1102           if (stmAttackers == attackers)
1103               ++slIndex;
1104
1105           break;
1106       }
1107
1108       stm = ~stm;
1109       stmAttackers = attackers & pieces(stm);
1110       ++slIndex;
1111
1112   } while (stmAttackers);
1113
1114   // Having built the swap list, we negamax through it to find the best
1115   // achievable score from the point of view of the side to move.
1116   while (--slIndex)
1117       swapList[slIndex - 1] = std::min(-swapList[slIndex], swapList[slIndex - 1]);
1118
1119   return swapList[0];
1120 }
1121
1122
1123 /// Position::is_draw() tests whether the position is drawn by material, 50 moves
1124 /// rule or repetition. It does not detect stalemates.
1125
1126 bool Position::is_draw() const {
1127
1128   if (   !pieces(PAWN)
1129       && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg))
1130       return true;
1131
1132   if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
1133       return true;
1134
1135   StateInfo* stp = st;
1136   for (int i = 2, e = std::min(st->rule50, st->pliesFromNull); i <= e; i += 2)
1137   {
1138       stp = stp->previous->previous;
1139
1140       if (stp->key == st->key)
1141           return true; // Draw at first repetition
1142   }
1143
1144   return false;
1145 }
1146
1147
1148 /// Position::flip() flips position with the white and black sides reversed. This
1149 /// is only useful for debugging e.g. for finding evaluation symmetry bugs.
1150
1151 static char toggle_case(char c) {
1152   return char(islower(c) ? toupper(c) : tolower(c));
1153 }
1154
1155 void Position::flip() {
1156
1157   string f, token;
1158   std::stringstream ss(fen());
1159
1160   for (Rank r = RANK_8; r >= RANK_1; --r) // Piece placement
1161   {
1162       std::getline(ss, token, r > RANK_1 ? '/' : ' ');
1163       f.insert(0, token + (f.empty() ? " " : "/"));
1164   }
1165
1166   ss >> token; // Active color
1167   f += (token == "w" ? "B " : "W "); // Will be lowercased later
1168
1169   ss >> token; // Castling availability
1170   f += token + " ";
1171
1172   std::transform(f.begin(), f.end(), f.begin(), toggle_case);
1173
1174   ss >> token; // En passant square
1175   f += (token == "-" ? token : token.replace(1, 1, token[1] == '3' ? "6" : "3"));
1176
1177   std::getline(ss, token); // Half and full moves
1178   f += token;
1179
1180   set(f, is_chess960(), this_thread());
1181
1182   assert(pos_is_ok());
1183 }
1184
1185
1186 /// Position::pos_is_ok() performs some consistency checks for the position object.
1187 /// This is meant to be helpful when debugging.
1188
1189 bool Position::pos_is_ok(int* step) const {
1190
1191   // Which parts of the position should be verified?
1192   const bool all = false;
1193
1194   const bool testBitboards       = all || false;
1195   const bool testState           = all || false;
1196   const bool testKingCount       = all || false;
1197   const bool testKingCapture     = all || false;
1198   const bool testPieceCounts     = all || false;
1199   const bool testPieceList       = all || false;
1200   const bool testCastlingSquares = all || false;
1201
1202   if (step)
1203       *step = 1;
1204
1205   if (   (sideToMove != WHITE && sideToMove != BLACK)
1206       || piece_on(king_square(WHITE)) != W_KING
1207       || piece_on(king_square(BLACK)) != B_KING
1208       || (   ep_square() != SQ_NONE
1209           && relative_rank(sideToMove, ep_square()) != RANK_6))
1210       return false;
1211
1212   if (step && ++*step, testBitboards)
1213   {
1214       // The intersection of the white and black pieces must be empty
1215       if (pieces(WHITE) & pieces(BLACK))
1216           return false;
1217
1218       // The union of the white and black pieces must be equal to all
1219       // occupied squares
1220       if ((pieces(WHITE) | pieces(BLACK)) != pieces())
1221           return false;
1222
1223       // Separate piece type bitboards must have empty intersections
1224       for (PieceType p1 = PAWN; p1 <= KING; ++p1)
1225           for (PieceType p2 = PAWN; p2 <= KING; ++p2)
1226               if (p1 != p2 && (pieces(p1) & pieces(p2)))
1227                   return false;
1228   }
1229
1230   if (step && ++*step, testState)
1231   {
1232       StateInfo si;
1233       set_state(&si);
1234       if (   st->key != si.key
1235           || st->pawnKey != si.pawnKey
1236           || st->materialKey != si.materialKey
1237           || st->npMaterial[WHITE] != si.npMaterial[WHITE]
1238           || st->npMaterial[BLACK] != si.npMaterial[BLACK]
1239           || st->psq != si.psq
1240           || st->checkersBB != si.checkersBB)
1241           return false;
1242   }
1243
1244   if (step && ++*step, testKingCount)
1245       if (   std::count(board, board + SQUARE_NB, W_KING) != 1
1246           || std::count(board, board + SQUARE_NB, B_KING) != 1)
1247           return false;
1248
1249   if (step && ++*step, testKingCapture)
1250       if (attackers_to(king_square(~sideToMove)) & pieces(sideToMove))
1251           return false;
1252
1253   if (step && ++*step, testPieceCounts)
1254       for (Color c = WHITE; c <= BLACK; ++c)
1255           for (PieceType pt = PAWN; pt <= KING; ++pt)
1256               if (pieceCount[c][pt] != popcount<Full>(pieces(c, pt)))
1257                   return false;
1258
1259   if (step && ++*step, testPieceList)
1260       for (Color c = WHITE; c <= BLACK; ++c)
1261           for (PieceType pt = PAWN; pt <= KING; ++pt)
1262               for (int i = 0; i < pieceCount[c][pt];  ++i)
1263                   if (   board[pieceList[c][pt][i]] != make_piece(c, pt)
1264                       || index[pieceList[c][pt][i]] != i)
1265                       return false;
1266
1267   if (step && ++*step, testCastlingSquares)
1268       for (Color c = WHITE; c <= BLACK; ++c)
1269           for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
1270           {
1271               if (!can_castle(c | s))
1272                   continue;
1273
1274               if (  (castlingRightsMask[king_square(c)] & (c | s)) != (c | s)
1275                   || piece_on(castlingRookSquare[c | s]) != make_piece(c, ROOK)
1276                   || castlingRightsMask[castlingRookSquare[c | s]] != (c | s))
1277                   return false;
1278           }
1279
1280   return true;
1281 }