]> git.sesse.net Git - stockfish/blob - src/position.h
Update nodes after a do_move()
[stockfish] / src / position.h
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-2010 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
21 #if !defined(POSITION_H_INCLUDED)
22 #define POSITION_H_INCLUDED
23
24 // Disable some silly and noisy warning from MSVC compiler
25 #if defined(_MSC_VER)
26
27 // Forcing value to bool 'true' or 'false' (performance warning)
28 #pragma warning(disable: 4800)
29
30 // Conditional expression is constant
31 #pragma warning(disable: 4127)
32
33
34 #endif
35
36 ////
37 //// Includes
38 ////
39
40 #include "bitboard.h"
41 #include "color.h"
42 #include "direction.h"
43 #include "move.h"
44 #include "piece.h"
45 #include "square.h"
46 #include "value.h"
47
48
49 ////
50 //// Constants
51 ////
52
53 /// Maximum number of plies per game (220 should be enough, because the
54 /// maximum search depth is 100, and during position setup we reset the
55 /// move counter for every non-reversible move).
56 const int MaxGameLength = 220;
57
58
59 ////
60 //// Types
61 ////
62
63 /// struct checkInfo is initialized at c'tor time and keeps
64 /// info used to detect if a move gives check.
65
66 struct CheckInfo {
67
68     explicit CheckInfo(const Position&);
69
70     Bitboard dcCandidates;
71     Bitboard checkSq[8];
72     Square ksq;
73 };
74
75 /// Castle rights, encoded as bit fields
76
77 enum CastleRights {
78   CASTLES_NONE = 0,
79   WHITE_OO     = 1,
80   BLACK_OO     = 2,
81   WHITE_OOO    = 4,
82   BLACK_OOO    = 8,
83   ALL_CASTLES  = 15
84 };
85
86 /// Game phase
87 enum Phase {
88   PHASE_ENDGAME = 0,
89   PHASE_MIDGAME = 128
90 };
91
92
93 /// The StateInfo struct stores information we need to restore a Position
94 /// object to its previous state when we retract a move. Whenever a move
95 /// is made on the board (by calling Position::do_move), an StateInfo object
96 /// must be passed as a parameter.
97
98 struct StateInfo {
99   Key pawnKey, materialKey;
100   int castleRights, rule50, gamePly, pliesFromNull;
101   Square epSquare;
102   Score value;
103   Value npMaterial[2];
104
105   PieceType capturedType;
106   Key key;
107   Bitboard checkersBB;
108   StateInfo* previous;
109 };
110
111
112 /// The position data structure. A position consists of the following data:
113 ///
114 ///    * For each piece type, a bitboard representing the squares occupied
115 ///      by pieces of that type.
116 ///    * For each color, a bitboard representing the squares occupied by
117 ///      pieces of that color.
118 ///    * A bitboard of all occupied squares.
119 ///    * A bitboard of all checking pieces.
120 ///    * A 64-entry array of pieces, indexed by the squares of the board.
121 ///    * The current side to move.
122 ///    * Information about the castling rights for both sides.
123 ///    * The initial files of the kings and both pairs of rooks. This is
124 ///      used to implement the Chess960 castling rules.
125 ///    * The en passant square (which is SQ_NONE if no en passant capture is
126 ///      possible).
127 ///    * The squares of the kings for both sides.
128 ///    * Hash keys for the position itself, the current pawn structure, and
129 ///      the current material situation.
130 ///    * Hash keys for all previous positions in the game for detecting
131 ///      repetition draws.
132 ///    * A counter for detecting 50 move rule draws.
133
134 class Position {
135
136   friend class MaterialInfo;
137   friend class EndgameFunctions;
138
139   Position(); // No default or copy c'tor allowed
140   Position(const Position& pos);
141
142 public:
143   enum GamePhase {
144       MidGame,
145       EndGame
146   };
147
148   // Constructors
149   Position(const Position& pos, int threadID);
150   Position(const std::string& fen, int threadID);
151
152   // Text input/output
153   void from_fen(const std::string& fen);
154   const std::string to_fen() const;
155   void print(Move m = MOVE_NONE) const;
156
157   // Copying
158   void flipped_copy(const Position& pos);
159
160   // The piece on a given square
161   Piece piece_on(Square s) const;
162   PieceType type_of_piece_on(Square s) const;
163   Color color_of_piece_on(Square s) const;
164   bool square_is_empty(Square s) const;
165   bool square_is_occupied(Square s) const;
166   Value midgame_value_of_piece_on(Square s) const;
167   Value endgame_value_of_piece_on(Square s) const;
168
169   // Side to move
170   Color side_to_move() const;
171
172   // Bitboard representation of the position
173   Bitboard empty_squares() const;
174   Bitboard occupied_squares() const;
175   Bitboard pieces_of_color(Color c) const;
176   Bitboard pieces(PieceType pt) const;
177   Bitboard pieces(PieceType pt, Color c) const;
178   Bitboard pieces(PieceType pt1, PieceType pt2) const;
179   Bitboard pieces(PieceType pt1, PieceType pt2, Color c) const;
180
181   // Number of pieces of each color and type
182   int piece_count(Color c, PieceType pt) const;
183
184   // The en passant square
185   Square ep_square() const;
186
187   // Current king position for each color
188   Square king_square(Color c) const;
189
190   // Castling rights
191   bool can_castle_kingside(Color c) const;
192   bool can_castle_queenside(Color c) const;
193   bool can_castle(Color c) const;
194   Square initial_kr_square(Color c) const;
195   Square initial_qr_square(Color c) const;
196
197   // Bitboards for pinned pieces and discovered check candidates
198   Bitboard discovered_check_candidates(Color c) const;
199   Bitboard pinned_pieces(Color c) const;
200
201   // Checking pieces and under check information
202   Bitboard checkers() const;
203   bool is_check() const;
204
205   // Piece lists
206   Square piece_list(Color c, PieceType pt, int index) const;
207   const Square* piece_list_begin(Color c, PieceType pt) const;
208
209   // Information about attacks to or from a given square
210   Bitboard attackers_to(Square s) const;
211   Bitboard attacks_from(Piece p, Square s) const;
212   template<PieceType> Bitboard attacks_from(Square s) const;
213   template<PieceType> Bitboard attacks_from(Square s, Color c) const;
214
215   // Properties of moves
216   bool pl_move_is_legal(Move m, Bitboard pinned) const;
217   bool pl_move_is_evasion(Move m, Bitboard pinned) const;
218   bool move_is_check(Move m) const;
219   bool move_is_check(Move m, const CheckInfo& ci) const;
220   bool move_is_capture(Move m) const;
221   bool move_is_capture_or_promotion(Move m) const;
222   bool move_is_passed_pawn_push(Move m) const;
223   bool move_attacks_square(Move m, Square s) const;
224
225   // Piece captured with previous moves
226   PieceType captured_piece_type() const;
227
228   // Information about pawns
229   bool pawn_is_passed(Color c, Square s) const;
230
231   // Weak squares
232   bool square_is_weak(Square s, Color c) const;
233
234   // Doing and undoing moves
235   void detach();
236   void do_move(Move m, StateInfo& st);
237   void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
238   void undo_move(Move m);
239   void do_null_move(StateInfo& st);
240   void undo_null_move();
241
242   // Static exchange evaluation
243   int see(Square from, Square to) const;
244   int see(Move m) const;
245   int see_sign(Move m) const;
246
247   // Accessing hash keys
248   Key get_key() const;
249   Key get_exclusion_key() const;
250   Key get_pawn_key() const;
251   Key get_material_key() const;
252
253   // Incremental evaluation
254   Score value() const;
255   Value non_pawn_material(Color c) const;
256   static Score pst_delta(Piece piece, Square from, Square to);
257
258   // Game termination checks
259   bool is_mate() const;
260   bool is_draw() const;
261
262   // Check if side to move could be mated in one
263   bool has_mate_threat();
264
265   // Number of plies since the last non-reversible move
266   int rule_50_counter() const;
267
268   int startpos_ply_counter() const;
269
270   // Other properties of the position
271   bool opposite_colored_bishops() const;
272   bool has_pawn_on_7th(Color c) const;
273   bool is_chess960() const;
274
275   // Current thread ID searching on the position
276   int thread() const;
277
278   // Reset the gamePly variable to 0
279   void reset_game_ply();
280   void inc_startpos_ply_counter();
281   int64_t nodes_searched() const;
282   void set_nodes_searched(int64_t n);
283
284   // Position consistency check, for debugging
285   bool is_ok(int* failedStep = NULL) const;
286
287   // Static member functions
288   static void init_zobrist();
289   static void init_piece_square_tables();
290
291 private:
292
293   // Initialization helper functions (used while setting up a position)
294   void clear();
295   void put_piece(Piece p, Square s);
296   void allow_oo(Color c);
297   void allow_ooo(Color c);
298   bool set_castling_rights(char token);
299
300   // Helper functions for doing and undoing moves
301   void do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep);
302   void do_castle_move(Move m);
303   void undo_castle_move(Move m);
304   void find_checkers();
305
306   template<bool FindPinned>
307   Bitboard hidden_checkers(Color c) const;
308
309   // Computing hash keys from scratch (for initialization and debugging)
310   Key compute_key() const;
311   Key compute_pawn_key() const;
312   Key compute_material_key() const;
313
314   // Computing incremental evaluation scores and material counts
315   static Score pst(Color c, PieceType pt, Square s);
316   Score compute_value() const;
317   Value compute_non_pawn_material(Color c) const;
318
319   // Board
320   Piece board[64];
321
322   // Bitboards
323   Bitboard byTypeBB[8], byColorBB[2];
324
325   // Piece counts
326   int pieceCount[2][8]; // [color][pieceType]
327
328   // Piece lists
329   Square pieceList[2][8][16]; // [color][pieceType][index]
330   int index[64]; // [square]
331
332   // Other info
333   Color sideToMove;
334   Key history[MaxGameLength];
335   int castleRightsMask[64];
336   StateInfo startState;
337   File initialKFile, initialKRFile, initialQRFile;
338   bool isChess960;
339   int startPosPlyCounter;
340   int threadID;
341   int64_t nodes;
342   StateInfo* st;
343
344   // Static variables
345   static Key zobrist[2][8][64];
346   static Key zobEp[64];
347   static Key zobCastle[16];
348   static Key zobSideToMove;
349   static Score PieceSquareTable[16][64];
350   static Key zobExclusion;
351   static const Value seeValues[8];
352 };
353
354
355 ////
356 //// Inline functions
357 ////
358
359 inline int64_t Position::nodes_searched() const {
360   return nodes;
361 }
362
363 inline void Position::set_nodes_searched(int64_t n) {
364   nodes = n;
365 }
366
367 inline Piece Position::piece_on(Square s) const {
368   return board[s];
369 }
370
371 inline Color Position::color_of_piece_on(Square s) const {
372   return color_of_piece(piece_on(s));
373 }
374
375 inline PieceType Position::type_of_piece_on(Square s) const {
376   return type_of_piece(piece_on(s));
377 }
378
379 inline bool Position::square_is_empty(Square s) const {
380   return piece_on(s) == PIECE_NONE;
381 }
382
383 inline bool Position::square_is_occupied(Square s) const {
384   return !square_is_empty(s);
385 }
386
387 inline Value Position::midgame_value_of_piece_on(Square s) const {
388   return PieceValueMidgame[piece_on(s)];
389 }
390
391 inline Value Position::endgame_value_of_piece_on(Square s) const {
392   return PieceValueEndgame[piece_on(s)];
393 }
394
395 inline Color Position::side_to_move() const {
396   return sideToMove;
397 }
398
399 inline Bitboard Position::occupied_squares() const {
400   return byTypeBB[0];
401 }
402
403 inline Bitboard Position::empty_squares() const {
404   return ~(occupied_squares());
405 }
406
407 inline Bitboard Position::pieces_of_color(Color c) const {
408   return byColorBB[c];
409 }
410
411 inline Bitboard Position::pieces(PieceType pt) const {
412   return byTypeBB[pt];
413 }
414
415 inline Bitboard Position::pieces(PieceType pt, Color c) const {
416   return byTypeBB[pt] & byColorBB[c];
417 }
418
419 inline Bitboard Position::pieces(PieceType pt1, PieceType pt2) const {
420   return byTypeBB[pt1] | byTypeBB[pt2];
421 }
422
423 inline Bitboard Position::pieces(PieceType pt1, PieceType pt2, Color c) const {
424   return (byTypeBB[pt1] | byTypeBB[pt2]) & byColorBB[c];
425 }
426
427 inline int Position::piece_count(Color c, PieceType pt) const {
428   return pieceCount[c][pt];
429 }
430
431 inline Square Position::piece_list(Color c, PieceType pt, int idx) const {
432   return pieceList[c][pt][idx];
433 }
434
435 inline const Square* Position::piece_list_begin(Color c, PieceType pt) const {
436   return pieceList[c][pt];
437 }
438
439 inline Square Position::ep_square() const {
440   return st->epSquare;
441 }
442
443 inline Square Position::king_square(Color c) const {
444   return pieceList[c][KING][0];
445 }
446
447 inline bool Position::can_castle_kingside(Color side) const {
448   return st->castleRights & (1+int(side));
449 }
450
451 inline bool Position::can_castle_queenside(Color side) const {
452   return st->castleRights & (4+4*int(side));
453 }
454
455 inline bool Position::can_castle(Color side) const {
456   return can_castle_kingside(side) || can_castle_queenside(side);
457 }
458
459 inline Square Position::initial_kr_square(Color c) const {
460   return relative_square(c, make_square(initialKRFile, RANK_1));
461 }
462
463 inline Square Position::initial_qr_square(Color c) const {
464   return relative_square(c, make_square(initialQRFile, RANK_1));
465 }
466
467 template<>
468 inline Bitboard Position::attacks_from<PAWN>(Square s, Color c) const {
469   return StepAttackBB[piece_of_color_and_type(c, PAWN)][s];
470 }
471
472 template<PieceType Piece> // Knight and King and white pawns
473 inline Bitboard Position::attacks_from(Square s) const {
474   return StepAttackBB[Piece][s];
475 }
476
477 template<>
478 inline Bitboard Position::attacks_from<BISHOP>(Square s) const {
479   return bishop_attacks_bb(s, occupied_squares());
480 }
481
482 template<>
483 inline Bitboard Position::attacks_from<ROOK>(Square s) const {
484   return rook_attacks_bb(s, occupied_squares());
485 }
486
487 template<>
488 inline Bitboard Position::attacks_from<QUEEN>(Square s) const {
489   return attacks_from<ROOK>(s) | attacks_from<BISHOP>(s);
490 }
491
492 inline Bitboard Position::checkers() const {
493   return st->checkersBB;
494 }
495
496 inline bool Position::is_check() const {
497   return st->checkersBB != EmptyBoardBB;
498 }
499
500 inline bool Position::pawn_is_passed(Color c, Square s) const {
501   return !(pieces(PAWN, opposite_color(c)) & passed_pawn_mask(c, s));
502 }
503
504 inline bool Position::square_is_weak(Square s, Color c) const {
505   return !(pieces(PAWN, opposite_color(c)) & attack_span_mask(c, s));
506 }
507
508 inline Key Position::get_key() const {
509   return st->key;
510 }
511
512 inline Key Position::get_exclusion_key() const {
513   return st->key ^ zobExclusion;
514 }
515
516 inline Key Position::get_pawn_key() const {
517   return st->pawnKey;
518 }
519
520 inline Key Position::get_material_key() const {
521   return st->materialKey;
522 }
523
524 inline Score Position::pst(Color c, PieceType pt, Square s) {
525   return PieceSquareTable[piece_of_color_and_type(c, pt)][s];
526 }
527
528 inline Score Position::pst_delta(Piece piece, Square from, Square to) {
529   return PieceSquareTable[piece][to] - PieceSquareTable[piece][from];
530 }
531
532 inline Score Position::value() const {
533   return st->value;
534 }
535
536 inline Value Position::non_pawn_material(Color c) const {
537   return st->npMaterial[c];
538 }
539
540 inline bool Position::move_is_passed_pawn_push(Move m) const {
541
542   Color c = side_to_move();
543   return   piece_on(move_from(m)) == piece_of_color_and_type(c, PAWN)
544         && pawn_is_passed(c, move_to(m));
545 }
546
547 inline int Position::rule_50_counter() const {
548
549   return st->rule50;
550 }
551
552 inline int Position::startpos_ply_counter() const {
553
554   return startPosPlyCounter;
555 }
556
557 inline bool Position::opposite_colored_bishops() const {
558
559   return   piece_count(WHITE, BISHOP) == 1
560         && piece_count(BLACK, BISHOP) == 1
561         && !same_color_squares(piece_list(WHITE, BISHOP, 0), piece_list(BLACK, BISHOP, 0));
562 }
563
564 inline bool Position::has_pawn_on_7th(Color c) const {
565
566   return pieces(PAWN, c) & relative_rank_bb(c, RANK_7);
567 }
568
569 inline bool Position::is_chess960() const {
570
571   return isChess960;
572 }
573
574 inline bool Position::move_is_capture(Move m) const {
575
576   // Move must not be MOVE_NONE !
577   return (m & (3 << 15)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
578 }
579
580 inline bool Position::move_is_capture_or_promotion(Move m) const {
581
582   // Move must not be MOVE_NONE !
583   return (m & (0x1F << 12)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
584 }
585
586 inline PieceType Position::captured_piece_type() const {
587   return st->capturedType;
588 }
589
590 inline int Position::thread() const {
591   return threadID;
592 }
593
594 #endif // !defined(POSITION_H_INCLUDED)