]> git.sesse.net Git - stockfish/blob - src/position.cpp
0c81763155d078275263430b17b4a044269daeab
[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-2013 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 <cassert>
21 #include <cstring>
22 #include <iomanip>
23 #include <iostream>
24 #include <sstream>
25 #include <algorithm>
26
27 #include "bitcount.h"
28 #include "movegen.h"
29 #include "notation.h"
30 #include "position.h"
31 #include "psqtab.h"
32 #include "rkiss.h"
33 #include "thread.h"
34 #include "tt.h"
35
36 using std::string;
37 using std::cout;
38 using std::endl;
39
40 static const string PieceToChar(" PNBRQK  pnbrqk");
41
42 CACHE_LINE_ALIGNMENT
43
44 Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
45 Value PieceValue[PHASE_NB][PIECE_NB] = {
46 { VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg },
47 { VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg } };
48
49 namespace Zobrist {
50
51   Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
52   Key enpassant[FILE_NB];
53   Key castle[CASTLE_RIGHT_NB];
54   Key side;
55   Key exclusion;
56 }
57
58 Key Position::exclusion_key() const { return st->key ^ Zobrist::exclusion;}
59
60 namespace {
61
62 // min_attacker() is an helper function used by see() to locate the least
63 // valuable attacker for the side to move, remove the attacker we just found
64 // from the bitboards and scan for new X-ray attacks behind it.
65
66 template<int Pt> FORCE_INLINE
67 PieceType min_attacker(const Bitboard* bb, const Square& to, const Bitboard& stmAttackers,
68                        Bitboard& occupied, Bitboard& attackers) {
69
70   Bitboard b = stmAttackers & bb[Pt];
71
72   if (b)
73   {
74       occupied ^= b & ~(b - 1);
75
76       if (Pt == PAWN || Pt == BISHOP || Pt == QUEEN)
77           attackers |= attacks_bb<BISHOP>(to, occupied) & (bb[BISHOP] | bb[QUEEN]);
78
79       if (Pt == ROOK || Pt == QUEEN)
80           attackers |= attacks_bb<ROOK>(to, occupied) & (bb[ROOK] | bb[QUEEN]);
81
82       attackers &= occupied; // Remove the just found attacker
83
84       return (PieceType)Pt;
85   }
86   return min_attacker<Pt+1>(bb, to, stmAttackers, occupied, attackers);
87 }
88
89 template<> FORCE_INLINE
90 PieceType min_attacker<KING>(const Bitboard*, const Square&, const Bitboard&, Bitboard&, Bitboard&) {
91   return KING; // No need to update bitboards, it is the last cycle
92 }
93
94 } // namespace
95
96
97 /// CheckInfo c'tor
98
99 CheckInfo::CheckInfo(const Position& pos) {
100
101   Color them = ~pos.side_to_move();
102   ksq = pos.king_square(them);
103
104   pinned = pos.pinned_pieces();
105   dcCandidates = pos.discovered_check_candidates();
106
107   checkSq[PAWN]   = pos.attacks_from<PAWN>(ksq, them);
108   checkSq[KNIGHT] = pos.attacks_from<KNIGHT>(ksq);
109   checkSq[BISHOP] = pos.attacks_from<BISHOP>(ksq);
110   checkSq[ROOK]   = pos.attacks_from<ROOK>(ksq);
111   checkSq[QUEEN]  = checkSq[BISHOP] | checkSq[ROOK];
112   checkSq[KING]   = 0;
113 }
114
115
116 /// Position::init() initializes at startup the various arrays used to compute
117 /// hash keys and the piece square tables. The latter is a two-step operation:
118 /// First, the white halves of the tables are copied from PSQT[] tables. Second,
119 /// the black halves of the tables are initialized by flipping and changing the
120 /// sign of the white scores.
121
122 void Position::init() {
123
124   RKISS rk;
125
126   for (Color c = WHITE; c <= BLACK; c++)
127       for (PieceType pt = PAWN; pt <= KING; pt++)
128           for (Square s = SQ_A1; s <= SQ_H8; s++)
129               Zobrist::psq[c][pt][s] = rk.rand<Key>();
130
131   for (File f = FILE_A; f <= FILE_H; f++)
132       Zobrist::enpassant[f] = rk.rand<Key>();
133
134   for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++)
135   {
136       Bitboard b = cr;
137       while (b)
138       {
139           Key k = Zobrist::castle[1ULL << pop_lsb(&b)];
140           Zobrist::castle[cr] ^= k ? k : rk.rand<Key>();
141       }
142   }
143
144   Zobrist::side = rk.rand<Key>();
145   Zobrist::exclusion  = rk.rand<Key>();
146
147   for (PieceType pt = PAWN; pt <= KING; pt++)
148   {
149       PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt];
150       PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt];
151
152       Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);
153
154       for (Square s = SQ_A1; s <= SQ_H8; s++)
155       {
156          psq[WHITE][pt][ s] =  (v + PSQT[pt][s]);
157          psq[BLACK][pt][~s] = -(v + PSQT[pt][s]);
158       }
159   }
160 }
161
162
163 /// Position::operator=() creates a copy of 'pos'. We want the new born Position
164 /// object do not depend on any external data so we detach state pointer from
165 /// the source one.
166
167 Position& Position::operator=(const Position& pos) {
168
169   std::memcpy(this, &pos, sizeof(Position));
170   startState = *st;
171   st = &startState;
172   nodes = 0;
173
174   assert(pos_is_ok());
175
176   return *this;
177 }
178
179
180 /// Position::set() initializes the position object with the given FEN string.
181 /// This function is not very robust - make sure that input FENs are correct,
182 /// this is assumed to be the responsibility of the GUI.
183
184 void Position::set(const string& fenStr, bool isChess960, Thread* th) {
185 /*
186    A FEN string defines a particular position using only the ASCII character set.
187
188    A FEN string contains six fields separated by a space. The fields are:
189
190    1) Piece placement (from white's perspective). Each rank is described, starting
191       with rank 8 and ending with rank 1; within each rank, the contents of each
192       square are described from file A through file H. Following the Standard
193       Algebraic Notation (SAN), each piece is identified by a single letter taken
194       from the standard English names. White pieces are designated using upper-case
195       letters ("PNBRQK") while Black take lowercase ("pnbrqk"). Blank squares are
196       noted using digits 1 through 8 (the number of blank squares), and "/"
197       separates ranks.
198
199    2) Active color. "w" means white moves next, "b" means black.
200
201    3) Castling availability. If neither side can castle, this is "-". Otherwise,
202       this has one or more letters: "K" (White can castle kingside), "Q" (White
203       can castle queenside), "k" (Black can castle kingside), and/or "q" (Black
204       can castle queenside).
205
206    4) En passant target square (in algebraic notation). If there's no en passant
207       target square, this is "-". If a pawn has just made a 2-square move, this
208       is the position "behind" the pawn. This is recorded regardless of whether
209       there is a pawn in position to make an en passant capture.
210
211    5) Halfmove clock. This is the number of halfmoves since the last pawn advance
212       or capture. This is used to determine if a draw can be claimed under the
213       fifty-move rule.
214
215    6) Fullmove number. The number of the full move. It starts at 1, and is
216       incremented after Black's move.
217 */
218
219   char col, row, token;
220   size_t p;
221   Square sq = SQ_A8;
222   std::istringstream ss(fenStr);
223
224   clear();
225   ss >> std::noskipws;
226
227   // 1. Piece placement
228   while ((ss >> token) && !isspace(token))
229   {
230       if (isdigit(token))
231           sq += Square(token - '0'); // Advance the given number of files
232
233       else if (token == '/')
234           sq -= Square(16);
235
236       else if ((p = PieceToChar.find(token)) != string::npos)
237       {
238           put_piece(Piece(p), sq);
239           sq++;
240       }
241   }
242
243   // 2. Active color
244   ss >> token;
245   sideToMove = (token == 'w' ? WHITE : BLACK);
246   ss >> token;
247
248   // 3. Castling availability. Compatible with 3 standards: Normal FEN standard,
249   // Shredder-FEN that uses the letters of the columns on which the rooks began
250   // the game instead of KQkq and also X-FEN standard that, in case of Chess960,
251   // if an inner rook is associated with the castling right, the castling tag is
252   // replaced by the file letter of the involved rook, as for the Shredder-FEN.
253   while ((ss >> token) && !isspace(token))
254   {
255       Square rsq;
256       Color c = islower(token) ? BLACK : WHITE;
257
258       token = char(toupper(token));
259
260       if (token == 'K')
261           for (rsq = relative_square(c, SQ_H1); type_of(piece_on(rsq)) != ROOK; rsq--) {}
262
263       else if (token == 'Q')
264           for (rsq = relative_square(c, SQ_A1); type_of(piece_on(rsq)) != ROOK; rsq++) {}
265
266       else if (token >= 'A' && token <= 'H')
267           rsq = File(token - 'A') | relative_rank(c, RANK_1);
268
269       else
270           continue;
271
272       set_castle_right(c, rsq);
273   }
274
275   // 4. En passant square. Ignore if no pawn capture is possible
276   if (   ((ss >> col) && (col >= 'a' && col <= 'h'))
277       && ((ss >> row) && (row == '3' || row == '6')))
278   {
279       st->epSquare = File(col - 'a') | Rank(row - '1');
280
281       if (!(attackers_to(st->epSquare) & pieces(sideToMove, PAWN)))
282           st->epSquare = SQ_NONE;
283   }
284
285   // 5-6. Halfmove clock and fullmove number
286   ss >> std::skipws >> st->rule50 >> gamePly;
287
288   // Convert from fullmove starting from 1 to ply starting from 0,
289   // handle also common incorrect FEN with fullmove = 0.
290   gamePly = std::max(2 * (gamePly - 1), 0) + int(sideToMove == BLACK);
291
292   st->key = compute_key();
293   st->pawnKey = compute_pawn_key();
294   st->materialKey = compute_material_key();
295   st->psq = compute_psq_score();
296   st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
297   st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
298   st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
299   chess960 = isChess960;
300   thisThread = th;
301
302   assert(pos_is_ok());
303 }
304
305
306 /// Position::set_castle_right() is an helper function used to set castling
307 /// rights given the corresponding color and the rook starting square.
308
309 void Position::set_castle_right(Color c, Square rfrom) {
310
311   Square kfrom = king_square(c);
312   CastlingSide cs = kfrom < rfrom ? KING_SIDE : QUEEN_SIDE;
313   CastleRight cr = make_castle_right(c, cs);
314
315   st->castleRights |= cr;
316   castleRightsMask[kfrom] |= cr;
317   castleRightsMask[rfrom] |= cr;
318   castleRookSquare[c][cs] = rfrom;
319
320   Square kto = relative_square(c, cs == KING_SIDE ? SQ_G1 : SQ_C1);
321   Square rto = relative_square(c, cs == KING_SIDE ? SQ_F1 : SQ_D1);
322
323   for (Square s = std::min(rfrom, rto); s <= std::max(rfrom, rto); s++)
324       if (s != kfrom && s != rfrom)
325           castlePath[c][cs] |= s;
326
327   for (Square s = std::min(kfrom, kto); s <= std::max(kfrom, kto); s++)
328       if (s != kfrom && s != rfrom)
329           castlePath[c][cs] |= s;
330 }
331
332
333 /// Position::fen() returns a FEN representation of the position. In case
334 /// of Chess960 the Shredder-FEN notation is used. Mainly a debugging function.
335
336 const string Position::fen() const {
337
338   std::ostringstream ss;
339
340   for (Rank rank = RANK_8; rank >= RANK_1; rank--)
341   {
342       for (File file = FILE_A; file <= FILE_H; file++)
343       {
344           Square sq = file | rank;
345
346           if (is_empty(sq))
347           {
348               int emptyCnt = 1;
349
350               for ( ; file < FILE_H && is_empty(sq++); file++)
351                   emptyCnt++;
352
353               ss << emptyCnt;
354           }
355           else
356               ss << PieceToChar[piece_on(sq)];
357       }
358
359       if (rank > RANK_1)
360           ss << '/';
361   }
362
363   ss << (sideToMove == WHITE ? " w " : " b ");
364
365   if (can_castle(WHITE_OO))
366       ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE,  KING_SIDE)), false) : 'K');
367
368   if (can_castle(WHITE_OOO))
369       ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE)), false) : 'Q');
370
371   if (can_castle(BLACK_OO))
372       ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK,  KING_SIDE)),  true) : 'k');
373
374   if (can_castle(BLACK_OOO))
375       ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE)),  true) : 'q');
376
377   if (st->castleRights == CASTLES_NONE)
378       ss << '-';
379
380   ss << (ep_square() == SQ_NONE ? " - " : " " + square_to_string(ep_square()) + " ")
381       << st->rule50 << " " << 1 + (gamePly - int(sideToMove == BLACK)) / 2;
382
383   return ss.str();
384 }
385
386
387 /// Position::pretty() returns an ASCII representation of the position to be
388 /// printed to the standard output together with the move's san notation.
389
390 const string Position::pretty(Move move) const {
391
392   const string dottedLine =            "\n+---+---+---+---+---+---+---+---+";
393   const string twoRows =  dottedLine + "\n|   | . |   | . |   | . |   | . |"
394                         + dottedLine + "\n| . |   | . |   | . |   | . |   |";
395
396   string brd = twoRows + twoRows + twoRows + twoRows + dottedLine;
397
398   std::ostringstream ss;
399
400   if (move)
401       ss << "\nMove: " << (sideToMove == BLACK ? ".." : "")
402          << move_to_san(*const_cast<Position*>(this), move);
403
404   for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
405       if (piece_on(sq) != NO_PIECE)
406           brd[513 - 68*rank_of(sq) + 4*file_of(sq)] = PieceToChar[piece_on(sq)];
407
408   ss << brd << "\nFen: " << fen() << "\nKey: " << std::hex << std::uppercase
409      << std::setfill('0') << std::setw(16) << st->key << "\nCheckers: ";
410
411   for (Bitboard b = checkers(); b; )
412       ss << square_to_string(pop_lsb(&b)) << " ";
413
414   ss << "\nLegal moves: ";
415   for (MoveList<LEGAL> it(*this); *it; ++it)
416       ss << move_to_san(*const_cast<Position*>(this), *it) << " ";
417
418   return ss.str();
419 }
420
421
422 /// Position:hidden_checkers() returns a bitboard of all pinned / discovery check
423 /// pieces, according to the call parameters. Pinned pieces protect our king,
424 /// discovery check pieces attack the enemy king.
425
426 Bitboard Position::hidden_checkers(Square ksq, Color c) const {
427
428   Bitboard b, pinners, result = 0;
429
430   // Pinners are sliders that give check when pinned piece is removed
431   pinners = (  (pieces(  ROOK, QUEEN) & PseudoAttacks[ROOK  ][ksq])
432              | (pieces(BISHOP, QUEEN) & PseudoAttacks[BISHOP][ksq])) & pieces(c);
433
434   while (pinners)
435   {
436       b = between_bb(ksq, pop_lsb(&pinners)) & pieces();
437
438       if (!more_than_one(b))
439           result |= b & pieces(sideToMove);
440   }
441   return result;
442 }
443
444
445 /// Position::attackers_to() computes a bitboard of all pieces which attack a
446 /// given square. Slider attacks use occ bitboard as occupancy.
447
448 Bitboard Position::attackers_to(Square s, Bitboard occ) const {
449
450   return  (attacks_from<PAWN>(s, BLACK) & pieces(WHITE, PAWN))
451         | (attacks_from<PAWN>(s, WHITE) & pieces(BLACK, PAWN))
452         | (attacks_from<KNIGHT>(s)      & pieces(KNIGHT))
453         | (attacks_bb<ROOK>(s, occ)     & pieces(ROOK, QUEEN))
454         | (attacks_bb<BISHOP>(s, occ)   & pieces(BISHOP, QUEEN))
455         | (attacks_from<KING>(s)        & pieces(KING));
456 }
457
458
459 /// Position::attacks_from() computes a bitboard of all attacks of a given piece
460 /// put in a given square. Slider attacks use occ bitboard as occupancy.
461
462 Bitboard Position::attacks_from(Piece p, Square s, Bitboard occ) {
463
464   assert(is_ok(s));
465
466   switch (type_of(p))
467   {
468   case BISHOP: return attacks_bb<BISHOP>(s, occ);
469   case ROOK  : return attacks_bb<ROOK>(s, occ);
470   case QUEEN : return attacks_bb<BISHOP>(s, occ) | attacks_bb<ROOK>(s, occ);
471   default    : return StepAttacksBB[p][s];
472   }
473 }
474
475
476 /// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal
477
478 bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
479
480   assert(is_ok(m));
481   assert(pinned == pinned_pieces());
482
483   Color us = sideToMove;
484   Square from = from_sq(m);
485
486   assert(color_of(piece_moved(m)) == us);
487   assert(piece_on(king_square(us)) == make_piece(us, KING));
488
489   // En passant captures are a tricky special case. Because they are rather
490   // uncommon, we do it simply by testing whether the king is attacked after
491   // the move is made.
492   if (type_of(m) == ENPASSANT)
493   {
494       Color them = ~us;
495       Square to = to_sq(m);
496       Square capsq = to + pawn_push(them);
497       Square ksq = king_square(us);
498       Bitboard b = (pieces() ^ from ^ capsq) | to;
499
500       assert(to == ep_square());
501       assert(piece_moved(m) == make_piece(us, PAWN));
502       assert(piece_on(capsq) == make_piece(them, PAWN));
503       assert(piece_on(to) == NO_PIECE);
504
505       return   !(attacks_bb<  ROOK>(ksq, b) & pieces(them, QUEEN, ROOK))
506             && !(attacks_bb<BISHOP>(ksq, b) & pieces(them, QUEEN, BISHOP));
507   }
508
509   // If the moving piece is a king, check whether the destination
510   // square is attacked by the opponent. Castling moves are checked
511   // for legality during move generation.
512   if (type_of(piece_on(from)) == KING)
513       return type_of(m) == CASTLE || !(attackers_to(to_sq(m)) & pieces(~us));
514
515   // A non-king move is legal if and only if it is not pinned or it
516   // is moving along the ray towards or away from the king.
517   return   !pinned
518         || !(pinned & from)
519         ||  squares_aligned(from, to_sq(m), king_square(us));
520 }
521
522
523 /// Position::is_pseudo_legal() takes a random move and tests whether the move
524 /// is pseudo legal. It is used to validate moves from TT that can be corrupted
525 /// due to SMP concurrent access or hash position key aliasing.
526
527 bool Position::is_pseudo_legal(const Move m) const {
528
529   Color us = sideToMove;
530   Square from = from_sq(m);
531   Square to = to_sq(m);
532   Piece pc = piece_moved(m);
533
534   // Use a slower but simpler function for uncommon cases
535   if (type_of(m) != NORMAL)
536       return MoveList<LEGAL>(*this).contains(m);
537
538   // Is not a promotion, so promotion piece must be empty
539   if (promotion_type(m) - 2 != NO_PIECE_TYPE)
540       return false;
541
542   // If the from square is not occupied by a piece belonging to the side to
543   // move, the move is obviously not legal.
544   if (pc == NO_PIECE || color_of(pc) != us)
545       return false;
546
547   // The destination square cannot be occupied by a friendly piece
548   if (piece_on(to) != NO_PIECE && color_of(piece_on(to)) == us)
549       return false;
550
551   // Handle the special case of a pawn move
552   if (type_of(pc) == PAWN)
553   {
554       // Move direction must be compatible with pawn color
555       int direction = to - from;
556       if ((us == WHITE) != (direction > 0))
557           return false;
558
559       // We have already handled promotion moves, so destination
560       // cannot be on the 8/1th rank.
561       if (rank_of(to) == RANK_8 || rank_of(to) == RANK_1)
562           return false;
563
564       // Proceed according to the square delta between the origin and
565       // destination squares.
566       switch (direction)
567       {
568       case DELTA_NW:
569       case DELTA_NE:
570       case DELTA_SW:
571       case DELTA_SE:
572       // Capture. The destination square must be occupied by an enemy
573       // piece (en passant captures was handled earlier).
574       if (piece_on(to) == NO_PIECE || color_of(piece_on(to)) != ~us)
575           return false;
576
577       // From and to files must be one file apart, avoids a7h5
578       if (abs(file_of(from) - file_of(to)) != 1)
579           return false;
580       break;
581
582       case DELTA_N:
583       case DELTA_S:
584       // Pawn push. The destination square must be empty.
585       if (!is_empty(to))
586           return false;
587       break;
588
589       case DELTA_NN:
590       // Double white pawn push. The destination square must be on the fourth
591       // rank, and both the destination square and the square between the
592       // source and destination squares must be empty.
593       if (    rank_of(to) != RANK_4
594           || !is_empty(to)
595           || !is_empty(from + DELTA_N))
596           return false;
597       break;
598
599       case DELTA_SS:
600       // Double black pawn push. The destination square must be on the fifth
601       // rank, and both the destination square and the square between the
602       // source and destination squares must be empty.
603       if (    rank_of(to) != RANK_5
604           || !is_empty(to)
605           || !is_empty(from + DELTA_S))
606           return false;
607       break;
608
609       default:
610           return false;
611       }
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 pl_move_is_legal() relies on this. So we have to take care that the
618   // same 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 to catch
632       // as 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::move_gives_check() tests whether a pseudo-legal move gives a check
642
643 bool Position::move_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(piece_moved(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   // Direct check ?
654   if (ci.checkSq[pt] & to)
655       return true;
656
657   // Discovery check ?
658   if (ci.dcCandidates && (ci.dcCandidates & from))
659   {
660       // For pawn and king moves we need to verify also direction
661       if (   (pt != PAWN && pt != KING)
662           || !squares_aligned(from, to, king_square(~sideToMove)))
663           return true;
664   }
665
666   // Can we skip the ugly special cases ?
667   if (type_of(m) == NORMAL)
668       return false;
669
670   Color us = sideToMove;
671   Square ksq = king_square(~us);
672
673   switch (type_of(m))
674   {
675   case PROMOTION:
676       return attacks_from(Piece(promotion_type(m)), to, pieces() ^ from) & ksq;
677
678   // En passant capture with check ? We have already handled the case
679   // of direct checks and ordinary discovered check, the only case we
680   // need to handle is the unusual case of a discovered check through
681   // the captured pawn.
682   case ENPASSANT:
683   {
684       Square capsq = file_of(to) | rank_of(from);
685       Bitboard b = (pieces() ^ from ^ capsq) | to;
686
687       return  (attacks_bb<  ROOK>(ksq, b) & pieces(us, QUEEN, ROOK))
688             | (attacks_bb<BISHOP>(ksq, b) & pieces(us, QUEEN, BISHOP));
689   }
690   case CASTLE:
691   {
692       Square kfrom = from;
693       Square rfrom = to; // 'King captures the rook' notation
694       Square kto = relative_square(us, rfrom > kfrom ? SQ_G1 : SQ_C1);
695       Square rto = relative_square(us, rfrom > kfrom ? SQ_F1 : SQ_D1);
696
697       return   (PseudoAttacks[ROOK][rto] & ksq)
698             && (attacks_bb<ROOK>(rto, (pieces() ^ kfrom ^ rfrom) | rto | kto) & ksq);
699   }
700   default:
701       assert(false);
702       return false;
703   }
704 }
705
706
707 /// Position::do_move() makes a move, and saves all information necessary
708 /// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
709 /// moves should be filtered out before this function is called.
710
711 void Position::do_move(Move m, StateInfo& newSt) {
712
713   CheckInfo ci(*this);
714   do_move(m, newSt, ci, move_gives_check(m, ci));
715 }
716
717 void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveIsCheck) {
718
719   assert(is_ok(m));
720   assert(&newSt != st);
721
722   nodes++;
723   Key k = st->key;
724
725   // Copy some fields of old state to our new StateInfo object except the ones
726   // which are going to be recalculated from scratch anyway, then switch our state
727   // pointer to point to the new, ready to be updated, state.
728   std::memcpy(&newSt, st, StateCopySize64 * sizeof(uint64_t));
729
730   newSt.previous = st;
731   st = &newSt;
732
733   // Update side to move
734   k ^= Zobrist::side;
735
736   // Increment ply counters.In particular rule50 will be later reset it to zero
737   // in case of a capture or a pawn move.
738   gamePly++;
739   st->rule50++;
740   st->pliesFromNull++;
741
742   Color us = sideToMove;
743   Color them = ~us;
744   Square from = from_sq(m);
745   Square to = to_sq(m);
746   Piece pc = piece_on(from);
747   PieceType pt = type_of(pc);
748   PieceType capture = type_of(m) == ENPASSANT ? PAWN : type_of(piece_on(to));
749
750   assert(color_of(pc) == us);
751   assert(piece_on(to) == NO_PIECE || color_of(piece_on(to)) == them || type_of(m) == CASTLE);
752   assert(capture != KING);
753
754   if (type_of(m) == CASTLE)
755   {
756       assert(pc == make_piece(us, KING));
757
758       bool kingSide = to > from;
759       Square rfrom = to; // Castle is encoded as "king captures friendly rook"
760       Square rto = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
761       to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
762       capture = NO_PIECE_TYPE;
763
764       do_castle(from, to, rfrom, rto);
765
766       st->psq += psq[us][ROOK][rto] - psq[us][ROOK][rfrom];
767       k ^= Zobrist::psq[us][ROOK][rfrom] ^ Zobrist::psq[us][ROOK][rto];
768   }
769
770   if (capture)
771   {
772       Square capsq = to;
773
774       // If the captured piece is a pawn, update pawn hash key, otherwise
775       // update non-pawn material.
776       if (capture == PAWN)
777       {
778           if (type_of(m) == ENPASSANT)
779           {
780               capsq += pawn_push(them);
781
782               assert(pt == PAWN);
783               assert(to == st->epSquare);
784               assert(relative_rank(us, to) == RANK_6);
785               assert(piece_on(to) == NO_PIECE);
786               assert(piece_on(capsq) == make_piece(them, PAWN));
787
788               board[capsq] = NO_PIECE;
789           }
790
791           st->pawnKey ^= Zobrist::psq[them][PAWN][capsq];
792       }
793       else
794           st->npMaterial[them] -= PieceValue[MG][capture];
795
796       // Remove the captured piece
797       byTypeBB[ALL_PIECES] ^= capsq;
798       byTypeBB[capture] ^= capsq;
799       byColorBB[them] ^= capsq;
800
801       // Update piece list, move the last piece at index[capsq] position and
802       // shrink the list.
803       //
804       // WARNING: This is a not reversible operation. When we will reinsert the
805       // captured piece in undo_move() we will put it at the end of the list and
806       // not in its original place, it means index[] and pieceList[] are not
807       // guaranteed to be invariant to a do_move() + undo_move() sequence.
808       Square lastSquare = pieceList[them][capture][--pieceCount[them][capture]];
809       index[lastSquare] = index[capsq];
810       pieceList[them][capture][index[lastSquare]] = lastSquare;
811       pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
812
813       // Update material hash key and prefetch access to materialTable
814       k ^= Zobrist::psq[them][capture][capsq];
815       st->materialKey ^= Zobrist::psq[them][capture][pieceCount[them][capture]];
816       prefetch((char*)thisThread->materialTable[st->materialKey]);
817
818       // Update incremental scores
819       st->psq -= psq[them][capture][capsq];
820
821       // Reset rule 50 counter
822       st->rule50 = 0;
823   }
824
825   // Update hash key
826   k ^= Zobrist::psq[us][pt][from] ^ Zobrist::psq[us][pt][to];
827
828   // Reset en passant square
829   if (st->epSquare != SQ_NONE)
830   {
831       k ^= Zobrist::enpassant[file_of(st->epSquare)];
832       st->epSquare = SQ_NONE;
833   }
834
835   // Update castle rights if needed
836   if (st->castleRights && (castleRightsMask[from] | castleRightsMask[to]))
837   {
838       int cr = castleRightsMask[from] | castleRightsMask[to];
839       k ^= Zobrist::castle[st->castleRights & cr];
840       st->castleRights &= ~cr;
841   }
842
843   // Prefetch TT access as soon as we know the new hash key
844   prefetch((char*)TT.first_entry(k));
845
846   // Move the piece. The tricky Chess960 castle is handled earlier
847   if (type_of(m) != CASTLE)
848   {
849       Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
850       byTypeBB[ALL_PIECES] ^= from_to_bb;
851       byTypeBB[pt] ^= from_to_bb;
852       byColorBB[us] ^= from_to_bb;
853
854       board[from] = NO_PIECE;
855       board[to] = pc;
856
857       // Update piece lists, index[from] is not updated and becomes stale. This
858       // works as long as index[] is accessed just by known occupied squares.
859       index[to] = index[from];
860       pieceList[us][pt][index[to]] = to;
861   }
862
863   // If the moving piece is a pawn do some special extra work
864   if (pt == PAWN)
865   {
866       // Set en-passant square, only if moved pawn can be captured
867       if (   (int(to) ^ int(from)) == 16
868           && (attacks_from<PAWN>(from + pawn_push(us), us) & pieces(them, PAWN)))
869       {
870           st->epSquare = Square((from + to) / 2);
871           k ^= Zobrist::enpassant[file_of(st->epSquare)];
872       }
873
874       if (type_of(m) == PROMOTION)
875       {
876           PieceType promotion = promotion_type(m);
877
878           assert(relative_rank(us, to) == RANK_8);
879           assert(promotion >= KNIGHT && promotion <= QUEEN);
880
881           // Replace the pawn with the promoted piece
882           byTypeBB[PAWN] ^= to;
883           byTypeBB[promotion] |= to;
884           board[to] = make_piece(us, promotion);
885
886           // Update piece lists, move the last pawn at index[to] position
887           // and shrink the list. Add a new promotion piece to the list.
888           Square lastSquare = pieceList[us][PAWN][--pieceCount[us][PAWN]];
889           index[lastSquare] = index[to];
890           pieceList[us][PAWN][index[lastSquare]] = lastSquare;
891           pieceList[us][PAWN][pieceCount[us][PAWN]] = SQ_NONE;
892           index[to] = pieceCount[us][promotion];
893           pieceList[us][promotion][index[to]] = to;
894
895           // Update hash keys
896           k ^= Zobrist::psq[us][PAWN][to] ^ Zobrist::psq[us][promotion][to];
897           st->pawnKey ^= Zobrist::psq[us][PAWN][to];
898           st->materialKey ^=  Zobrist::psq[us][promotion][pieceCount[us][promotion]++]
899                             ^ Zobrist::psq[us][PAWN][pieceCount[us][PAWN]];
900
901           // Update incremental score
902           st->psq += psq[us][promotion][to] - psq[us][PAWN][to];
903
904           // Update material
905           st->npMaterial[us] += PieceValue[MG][promotion];
906       }
907
908       // Update pawn hash key and prefetch access to pawnsTable
909       st->pawnKey ^= Zobrist::psq[us][PAWN][from] ^ Zobrist::psq[us][PAWN][to];
910       prefetch((char*)thisThread->pawnsTable[st->pawnKey]);
911
912       // Reset rule 50 draw counter
913       st->rule50 = 0;
914   }
915
916   // Update incremental scores
917   st->psq += psq[us][pt][to] - psq[us][pt][from];
918
919   // Set capture piece
920   st->capturedType = capture;
921
922   // Update the key with the final value
923   st->key = k;
924
925   // Update checkers bitboard, piece must be already moved
926   st->checkersBB = 0;
927
928   if (moveIsCheck)
929   {
930       if (type_of(m) != NORMAL)
931           st->checkersBB = attackers_to(king_square(them)) & pieces(us);
932       else
933       {
934           // Direct checks
935           if (ci.checkSq[pt] & to)
936               st->checkersBB |= to;
937
938           // Discovery checks
939           if (ci.dcCandidates && (ci.dcCandidates & from))
940           {
941               if (pt != ROOK)
942                   st->checkersBB |= attacks_from<ROOK>(king_square(them)) & pieces(us, QUEEN, ROOK);
943
944               if (pt != BISHOP)
945                   st->checkersBB |= attacks_from<BISHOP>(king_square(them)) & pieces(us, QUEEN, BISHOP);
946           }
947       }
948   }
949
950   sideToMove = ~sideToMove;
951
952   assert(pos_is_ok());
953 }
954
955
956 /// Position::undo_move() unmakes a move. When it returns, the position should
957 /// be restored to exactly the same state as before the move was made.
958
959 void Position::undo_move(Move m) {
960
961   assert(is_ok(m));
962
963   sideToMove = ~sideToMove;
964
965   Color us = sideToMove;
966   Color them = ~us;
967   Square from = from_sq(m);
968   Square to = to_sq(m);
969   PieceType pt = type_of(piece_on(to));
970   PieceType capture = st->capturedType;
971
972   assert(is_empty(from) || type_of(m) == CASTLE);
973   assert(capture != KING);
974
975   if (type_of(m) == PROMOTION)
976   {
977       PieceType promotion = promotion_type(m);
978
979       assert(promotion == pt);
980       assert(relative_rank(us, to) == RANK_8);
981       assert(promotion >= KNIGHT && promotion <= QUEEN);
982
983       // Replace the promoted piece with the pawn
984       byTypeBB[promotion] ^= to;
985       byTypeBB[PAWN] |= to;
986       board[to] = make_piece(us, PAWN);
987
988       // Update piece lists, move the last promoted piece at index[to] position
989       // and shrink the list. Add a new pawn to the list.
990       Square lastSquare = pieceList[us][promotion][--pieceCount[us][promotion]];
991       index[lastSquare] = index[to];
992       pieceList[us][promotion][index[lastSquare]] = lastSquare;
993       pieceList[us][promotion][pieceCount[us][promotion]] = SQ_NONE;
994       index[to] = pieceCount[us][PAWN]++;
995       pieceList[us][PAWN][index[to]] = to;
996
997       pt = PAWN;
998   }
999
1000   if (type_of(m) == CASTLE)
1001   {
1002       bool kingSide = to > from;
1003       Square rfrom = to; // Castle is encoded as "king captures friendly rook"
1004       Square rto = relative_square(us, kingSide ? SQ_F1 : SQ_D1);
1005       to = relative_square(us, kingSide ? SQ_G1 : SQ_C1);
1006       capture = NO_PIECE_TYPE;
1007       pt = KING;
1008       do_castle(to, from, rto, rfrom);
1009   }
1010   else
1011   {
1012       // Put the piece back at the source square
1013       Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
1014       byTypeBB[ALL_PIECES] ^= from_to_bb;
1015       byTypeBB[pt] ^= from_to_bb;
1016       byColorBB[us] ^= from_to_bb;
1017
1018       board[to] = NO_PIECE;
1019       board[from] = make_piece(us, pt);
1020
1021       // Update piece lists, index[to] is not updated and becomes stale. This
1022       // works as long as index[] is accessed just by known occupied squares.
1023       index[from] = index[to];
1024       pieceList[us][pt][index[from]] = from;
1025   }
1026
1027   if (capture)
1028   {
1029       Square capsq = to;
1030
1031       if (type_of(m) == ENPASSANT)
1032       {
1033           capsq -= pawn_push(us);
1034
1035           assert(pt == PAWN);
1036           assert(to == st->previous->epSquare);
1037           assert(relative_rank(us, to) == RANK_6);
1038           assert(piece_on(capsq) == NO_PIECE);
1039       }
1040
1041       // Restore the captured piece
1042       byTypeBB[ALL_PIECES] |= capsq;
1043       byTypeBB[capture] |= capsq;
1044       byColorBB[them] |= capsq;
1045
1046       board[capsq] = make_piece(them, capture);
1047
1048       // Update piece list, add a new captured piece in capsq square
1049       index[capsq] = pieceCount[them][capture]++;
1050       pieceList[them][capture][index[capsq]] = capsq;
1051   }
1052
1053   // Finally point our state pointer back to the previous state
1054   st = st->previous;
1055   gamePly--;
1056
1057   assert(pos_is_ok());
1058 }
1059
1060
1061 /// Position::do_castle() is a helper used to do/undo a castling move. This
1062 /// is a bit tricky, especially in Chess960.
1063
1064 void Position::do_castle(Square kfrom, Square kto, Square rfrom, Square rto) {
1065
1066   Color us = sideToMove;
1067   Bitboard k_from_to_bb = SquareBB[kfrom] ^ SquareBB[kto];
1068   Bitboard r_from_to_bb = SquareBB[rfrom] ^ SquareBB[rto];
1069   byTypeBB[KING] ^= k_from_to_bb;
1070   byTypeBB[ROOK] ^= r_from_to_bb;
1071   byTypeBB[ALL_PIECES] ^= k_from_to_bb ^ r_from_to_bb;
1072   byColorBB[us] ^= k_from_to_bb ^ r_from_to_bb;
1073
1074   // Could be from == to, so first set NO_PIECE then KING and ROOK
1075   board[kfrom] = board[rfrom] = NO_PIECE;
1076   board[kto] = make_piece(us, KING);
1077   board[rto] = make_piece(us, ROOK);
1078
1079   // Could be kfrom == rto, so use a 'tmp' variable
1080   int tmp = index[kfrom];
1081   index[rto] = index[rfrom];
1082   index[kto] = tmp;
1083   pieceList[us][KING][index[kto]] = kto;
1084   pieceList[us][ROOK][index[rto]] = rto;
1085 }
1086
1087
1088 /// Position::do(undo)_null_move() is used to do(undo) a "null move": It flips
1089 /// the side to move without executing any move on the board.
1090
1091 void Position::do_null_move(StateInfo& newSt) {
1092
1093   assert(!checkers());
1094
1095   std::memcpy(&newSt, st, sizeof(StateInfo)); // Fully copy here
1096
1097   newSt.previous = st;
1098   st = &newSt;
1099
1100   if (st->epSquare != SQ_NONE)
1101   {
1102       st->key ^= Zobrist::enpassant[file_of(st->epSquare)];
1103       st->epSquare = SQ_NONE;
1104   }
1105
1106   st->key ^= Zobrist::side;
1107   prefetch((char*)TT.first_entry(st->key));
1108
1109   st->rule50++;
1110   st->pliesFromNull = 0;
1111
1112   sideToMove = ~sideToMove;
1113
1114   assert(pos_is_ok());
1115 }
1116
1117 void Position::undo_null_move() {
1118
1119   assert(!checkers());
1120
1121   st = st->previous;
1122   sideToMove = ~sideToMove;
1123 }
1124
1125
1126 /// Position::see() is a static exchange evaluator: It tries to estimate the
1127 /// material gain or loss resulting from a move. Parameter 'asymmThreshold' takes
1128 /// tempi into account. If the side who initiated the capturing sequence does the
1129 /// last capture, he loses a tempo and if the result is below 'asymmThreshold'
1130 /// the capturing sequence is considered bad.
1131
1132 int Position::see_sign(Move m) const {
1133
1134   assert(is_ok(m));
1135
1136   // Early return if SEE cannot be negative because captured piece value
1137   // is not less then capturing one. Note that king moves always return
1138   // here because king midgame value is set to 0.
1139   if (PieceValue[MG][piece_on(to_sq(m))] >= PieceValue[MG][piece_moved(m)])
1140       return 1;
1141
1142   return see(m);
1143 }
1144
1145 int Position::see(Move m, int asymmThreshold) const {
1146
1147   Square from, to;
1148   Bitboard occupied, attackers, stmAttackers;
1149   int swapList[32], slIndex = 1;
1150   PieceType captured;
1151   Color stm;
1152
1153   assert(is_ok(m));
1154
1155   from = from_sq(m);
1156   to = to_sq(m);
1157   captured = type_of(piece_on(to));
1158   occupied = pieces() ^ from;
1159
1160   // Handle en passant moves
1161   if (type_of(m) == ENPASSANT)
1162   {
1163       Square capQq = to - pawn_push(sideToMove);
1164
1165       assert(!captured);
1166       assert(type_of(piece_on(capQq)) == PAWN);
1167
1168       // Remove the captured pawn
1169       occupied ^= capQq;
1170       captured = PAWN;
1171   }
1172   else if (type_of(m) == CASTLE)
1173       // Castle moves are implemented as king capturing the rook so cannot be
1174       // handled correctly. Simply return 0 that is always the correct value
1175       // unless the rook is ends up under attack.
1176       return 0;
1177
1178   // Find all attackers to the destination square, with the moving piece
1179   // removed, but possibly an X-ray attacker added behind it.
1180   attackers = attackers_to(to, occupied);
1181
1182   // If the opponent has no attackers we are finished
1183   stm = ~color_of(piece_on(from));
1184   stmAttackers = attackers & pieces(stm);
1185   if (!stmAttackers)
1186       return PieceValue[MG][captured];
1187
1188   // The destination square is defended, which makes things rather more
1189   // difficult to compute. We proceed by building up a "swap list" containing
1190   // the material gain or loss at each stop in a sequence of captures to the
1191   // destination square, where the sides alternately capture, and always
1192   // capture with the least valuable piece. After each capture, we look for
1193   // new X-ray attacks from behind the capturing piece.
1194   swapList[0] = PieceValue[MG][captured];
1195   captured = type_of(piece_on(from));
1196
1197   do {
1198       assert(slIndex < 32);
1199
1200       // Add the new entry to the swap list
1201       swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured];
1202       slIndex++;
1203
1204       // Locate and remove the next least valuable attacker
1205       captured = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
1206       stm = ~stm;
1207       stmAttackers = attackers & pieces(stm);
1208
1209       if (captured == KING)
1210       {
1211           // Stop before processing a king capture
1212           if (stmAttackers)
1213               swapList[slIndex++] = QueenValueMg * 16;
1214
1215           break;
1216       }
1217
1218   } while (stmAttackers);
1219
1220   // If we are doing asymmetric SEE evaluation and the same side does the first
1221   // and the last capture, he loses a tempo and gain must be at least worth
1222   // 'asymmThreshold', otherwise we replace the score with a very low value,
1223   // before negamaxing.
1224   if (asymmThreshold)
1225       for (int i = 0; i < slIndex; i += 2)
1226           if (swapList[i] < asymmThreshold)
1227               swapList[i] = - QueenValueMg * 16;
1228
1229   // Having built the swap list, we negamax through it to find the best
1230   // achievable score from the point of view of the side to move.
1231   while (--slIndex)
1232       swapList[slIndex-1] = std::min(-swapList[slIndex], swapList[slIndex-1]);
1233
1234   return swapList[0];
1235 }
1236
1237
1238 /// Position::clear() erases the position object to a pristine state, with an
1239 /// empty board, white to move, and no castling rights.
1240
1241 void Position::clear() {
1242
1243   std::memset(this, 0, sizeof(Position));
1244   startState.epSquare = SQ_NONE;
1245   st = &startState;
1246
1247   for (int i = 0; i < 8; i++)
1248       for (int j = 0; j < 16; j++)
1249           pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE;
1250 }
1251
1252
1253 /// Position::put_piece() puts a piece on the given square of the board,
1254 /// updating the board array, pieces list, bitboards, and piece counts.
1255
1256 void Position::put_piece(Piece p, Square s) {
1257
1258   Color c = color_of(p);
1259   PieceType pt = type_of(p);
1260
1261   board[s] = p;
1262   index[s] = pieceCount[c][pt]++;
1263   pieceList[c][pt][index[s]] = s;
1264
1265   byTypeBB[ALL_PIECES] |= s;
1266   byTypeBB[pt] |= s;
1267   byColorBB[c] |= s;
1268 }
1269
1270
1271 /// Position::compute_key() computes the hash key of the position. The hash
1272 /// key is usually updated incrementally as moves are made and unmade, the
1273 /// compute_key() function is only used when a new position is set up, and
1274 /// to verify the correctness of the hash key when running in debug mode.
1275
1276 Key Position::compute_key() const {
1277
1278   Key k = Zobrist::castle[st->castleRights];
1279
1280   for (Bitboard b = pieces(); b; )
1281   {
1282       Square s = pop_lsb(&b);
1283       k ^= Zobrist::psq[color_of(piece_on(s))][type_of(piece_on(s))][s];
1284   }
1285
1286   if (ep_square() != SQ_NONE)
1287       k ^= Zobrist::enpassant[file_of(ep_square())];
1288
1289   if (sideToMove == BLACK)
1290       k ^= Zobrist::side;
1291
1292   return k;
1293 }
1294
1295
1296 /// Position::compute_pawn_key() computes the hash key of the position. The
1297 /// hash key is usually updated incrementally as moves are made and unmade,
1298 /// the compute_pawn_key() function is only used when a new position is set
1299 /// up, and to verify the correctness of the pawn hash key when running in
1300 /// debug mode.
1301
1302 Key Position::compute_pawn_key() const {
1303
1304   Key k = 0;
1305
1306   for (Bitboard b = pieces(PAWN); b; )
1307   {
1308       Square s = pop_lsb(&b);
1309       k ^= Zobrist::psq[color_of(piece_on(s))][PAWN][s];
1310   }
1311
1312   return k;
1313 }
1314
1315
1316 /// Position::compute_material_key() computes the hash key of the position.
1317 /// The hash key is usually updated incrementally as moves are made and unmade,
1318 /// the compute_material_key() function is only used when a new position is set
1319 /// up, and to verify the correctness of the material hash key when running in
1320 /// debug mode.
1321
1322 Key Position::compute_material_key() const {
1323
1324   Key k = 0;
1325
1326   for (Color c = WHITE; c <= BLACK; c++)
1327       for (PieceType pt = PAWN; pt <= QUEEN; pt++)
1328           for (int cnt = 0; cnt < pieceCount[c][pt]; cnt++)
1329               k ^= Zobrist::psq[c][pt][cnt];
1330
1331   return k;
1332 }
1333
1334
1335 /// Position::compute_psq_score() computes the incremental scores for the middle
1336 /// game and the endgame. These functions are used to initialize the incremental
1337 /// scores when a new position is set up, and to verify that the scores are correctly
1338 /// updated by do_move and undo_move when the program is running in debug mode.
1339 Score Position::compute_psq_score() const {
1340
1341   Score score = SCORE_ZERO;
1342
1343   for (Bitboard b = pieces(); b; )
1344   {
1345       Square s = pop_lsb(&b);
1346       Piece pc = piece_on(s);
1347       score += psq[color_of(pc)][type_of(pc)][s];
1348   }
1349
1350   return score;
1351 }
1352
1353
1354 /// Position::compute_non_pawn_material() computes the total non-pawn middle
1355 /// game material value for the given side. Material values are updated
1356 /// incrementally during the search, this function is only used while
1357 /// initializing a new Position object.
1358
1359 Value Position::compute_non_pawn_material(Color c) const {
1360
1361   Value value = VALUE_ZERO;
1362
1363   for (PieceType pt = KNIGHT; pt <= QUEEN; pt++)
1364       value += pieceCount[c][pt] * PieceValue[MG][pt];
1365
1366   return value;
1367 }
1368
1369
1370 /// Position::is_draw() tests whether the position is drawn by material,
1371 /// repetition, or the 50 moves rule. It does not detect stalemates, this
1372 /// must be done by the search.
1373 bool Position::is_draw() const {
1374
1375   // Draw by material?
1376   if (   !pieces(PAWN)
1377       && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg))
1378       return true;
1379
1380   // Draw by the 50 moves rule?
1381   if (st->rule50 > 99 && (!checkers() || MoveList<LEGAL>(*this).size()))
1382       return true;
1383
1384   // Draw by repetition?
1385   int i = 4, e = std::min(st->rule50, st->pliesFromNull);
1386
1387   if (i <= e)
1388   {
1389       StateInfo* stp = st->previous->previous;
1390
1391       do {
1392           stp = stp->previous->previous;
1393
1394           if (stp->key == st->key)
1395               return true;
1396
1397           i += 2;
1398
1399       } while (i <= e);
1400   }
1401
1402   return false;
1403 }
1404
1405
1406 /// Position::flip() flips position with the white and black sides reversed. This
1407 /// is only useful for debugging especially for finding evaluation symmetry bugs.
1408
1409 void Position::flip() {
1410
1411   const Position pos(*this);
1412
1413   clear();
1414
1415   sideToMove = ~pos.side_to_move();
1416   thisThread = pos.this_thread();
1417   nodes = pos.nodes_searched();
1418   chess960 = pos.is_chess960();
1419   gamePly = pos.game_ply();
1420
1421   for (Square s = SQ_A1; s <= SQ_H8; s++)
1422       if (!pos.is_empty(s))
1423           put_piece(Piece(pos.piece_on(s) ^ 8), ~s);
1424
1425   if (pos.can_castle(WHITE_OO))
1426       set_castle_right(BLACK, ~pos.castle_rook_square(WHITE, KING_SIDE));
1427   if (pos.can_castle(WHITE_OOO))
1428       set_castle_right(BLACK, ~pos.castle_rook_square(WHITE, QUEEN_SIDE));
1429   if (pos.can_castle(BLACK_OO))
1430       set_castle_right(WHITE, ~pos.castle_rook_square(BLACK, KING_SIDE));
1431   if (pos.can_castle(BLACK_OOO))
1432       set_castle_right(WHITE, ~pos.castle_rook_square(BLACK, QUEEN_SIDE));
1433
1434   if (pos.st->epSquare != SQ_NONE)
1435       st->epSquare = ~pos.st->epSquare;
1436
1437   st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove);
1438
1439   st->key = compute_key();
1440   st->pawnKey = compute_pawn_key();
1441   st->materialKey = compute_material_key();
1442   st->psq = compute_psq_score();
1443   st->npMaterial[WHITE] = compute_non_pawn_material(WHITE);
1444   st->npMaterial[BLACK] = compute_non_pawn_material(BLACK);
1445
1446   assert(pos_is_ok());
1447 }
1448
1449
1450 /// Position::pos_is_ok() performs some consitency checks for the position object.
1451 /// This is meant to be helpful when debugging.
1452
1453 bool Position::pos_is_ok(int* failedStep) const {
1454
1455   int dummy, *step = failedStep ? failedStep : &dummy;
1456
1457   // What features of the position should be verified?
1458   const bool all = false;
1459
1460   const bool debugBitboards       = all || false;
1461   const bool debugKingCount       = all || false;
1462   const bool debugKingCapture     = all || false;
1463   const bool debugCheckerCount    = all || false;
1464   const bool debugKey             = all || false;
1465   const bool debugMaterialKey     = all || false;
1466   const bool debugPawnKey         = all || false;
1467   const bool debugIncrementalEval = all || false;
1468   const bool debugNonPawnMaterial = all || false;
1469   const bool debugPieceCounts     = all || false;
1470   const bool debugPieceList       = all || false;
1471   const bool debugCastleSquares   = all || false;
1472
1473   *step = 1;
1474
1475   if (sideToMove != WHITE && sideToMove != BLACK)
1476       return false;
1477
1478   if ((*step)++, piece_on(king_square(WHITE)) != W_KING)
1479       return false;
1480
1481   if ((*step)++, piece_on(king_square(BLACK)) != B_KING)
1482       return false;
1483
1484   if ((*step)++, debugKingCount)
1485   {
1486       int kingCount[COLOR_NB] = {};
1487
1488       for (Square s = SQ_A1; s <= SQ_H8; s++)
1489           if (type_of(piece_on(s)) == KING)
1490               kingCount[color_of(piece_on(s))]++;
1491
1492       if (kingCount[0] != 1 || kingCount[1] != 1)
1493           return false;
1494   }
1495
1496   if ((*step)++, debugKingCapture)
1497       if (attackers_to(king_square(~sideToMove)) & pieces(sideToMove))
1498           return false;
1499
1500   if ((*step)++, debugCheckerCount && popcount<Full>(st->checkersBB) > 2)
1501       return false;
1502
1503   if ((*step)++, debugBitboards)
1504   {
1505       // The intersection of the white and black pieces must be empty
1506       if (pieces(WHITE) & pieces(BLACK))
1507           return false;
1508
1509       // The union of the white and black pieces must be equal to all
1510       // occupied squares
1511       if ((pieces(WHITE) | pieces(BLACK)) != pieces())
1512           return false;
1513
1514       // Separate piece type bitboards must have empty intersections
1515       for (PieceType p1 = PAWN; p1 <= KING; p1++)
1516           for (PieceType p2 = PAWN; p2 <= KING; p2++)
1517               if (p1 != p2 && (pieces(p1) & pieces(p2)))
1518                   return false;
1519   }
1520
1521   if ((*step)++, ep_square() != SQ_NONE && relative_rank(sideToMove, ep_square()) != RANK_6)
1522       return false;
1523
1524   if ((*step)++, debugKey && st->key != compute_key())
1525       return false;
1526
1527   if ((*step)++, debugPawnKey && st->pawnKey != compute_pawn_key())
1528       return false;
1529
1530   if ((*step)++, debugMaterialKey && st->materialKey != compute_material_key())
1531       return false;
1532
1533   if ((*step)++, debugIncrementalEval && st->psq != compute_psq_score())
1534       return false;
1535
1536   if ((*step)++, debugNonPawnMaterial)
1537       if (   st->npMaterial[WHITE] != compute_non_pawn_material(WHITE)
1538           || st->npMaterial[BLACK] != compute_non_pawn_material(BLACK))
1539           return false;
1540
1541   if ((*step)++, debugPieceCounts)
1542       for (Color c = WHITE; c <= BLACK; c++)
1543           for (PieceType pt = PAWN; pt <= KING; pt++)
1544               if (pieceCount[c][pt] != popcount<Full>(pieces(c, pt)))
1545                   return false;
1546
1547   if ((*step)++, debugPieceList)
1548       for (Color c = WHITE; c <= BLACK; c++)
1549           for (PieceType pt = PAWN; pt <= KING; pt++)
1550               for (int i = 0; i < pieceCount[c][pt]; i++)
1551                   if (   board[pieceList[c][pt][i]] != make_piece(c, pt)
1552                       || index[pieceList[c][pt][i]] != i)
1553                       return false;
1554
1555   if ((*step)++, debugCastleSquares)
1556       for (Color c = WHITE; c <= BLACK; c++)
1557           for (CastlingSide s = KING_SIDE; s <= QUEEN_SIDE; s = CastlingSide(s + 1))
1558           {
1559               CastleRight cr = make_castle_right(c, s);
1560
1561               if (!can_castle(cr))
1562                   continue;
1563
1564               if (  (castleRightsMask[king_square(c)] & cr) != cr
1565                   || piece_on(castleRookSquare[c][s]) != make_piece(c, ROOK)
1566                   || castleRightsMask[castleRookSquare[c][s]] != cr)
1567                   return false;
1568           }
1569
1570   *step = 0;
1571   return true;
1572 }