X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=18be2ec6928df5c695eed3e2cd09af7b46897461;hp=2b44ef329f33dca4e3eb7bda87533f2b67d5ad40;hb=12e79be91039796299187ba1b2f1559552642ea4;hpb=0c1f119069bf915b85126159d4865c4bcc532239 diff --git a/src/position.h b/src/position.h index 2b44ef32..18be2ec6 100644 --- a/src/position.h +++ b/src/position.h @@ -2,7 +2,7 @@ Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad - Copyright (C) 2015-2017 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad + Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,6 @@ struct StateInfo { int castlingRights; int rule50; int pliesFromNull; - Score psq; Square epSquare; // Not copied when making a move (will be recomputed anyhow) @@ -52,11 +51,14 @@ struct StateInfo { Piece capturedPiece; StateInfo* previous; Bitboard blockersForKing[COLOR_NB]; - Bitboard pinnersForKing[COLOR_NB]; + Bitboard pinners[COLOR_NB]; Bitboard checkSquares[PIECE_TYPE_NB]; }; -// In a std::deque references to elements are unaffected upon resizing +/// A list to keep track of the position states along the setup moves (from the +/// start position to the position just before the search starts). Needed by +/// 'draw by repetition' detection. Use a std::deque because pointers to +/// elements are not invalidated upon list resizing. typedef std::unique_ptr> StateListPtr; @@ -102,8 +104,7 @@ public: // Checking Bitboard checkers() const; - Bitboard discovered_check_candidates() const; - Bitboard pinned_pieces(Color c) const; + Bitboard blockers_for_king(Color c) const; Bitboard check_squares(PieceType pt) const; // Attacks to/from a given square @@ -136,7 +137,7 @@ public: void undo_null_move(); // Static Exchange Evaluation - bool see_ge(Move m, Value value = VALUE_ZERO) const; + bool see_ge(Move m, Value threshold = VALUE_ZERO) const; // Accessing hash keys Key key() const; @@ -146,19 +147,19 @@ public: // Other properties of the position Color side_to_move() const; - Phase game_phase() const; int game_ply() const; bool is_chess960() const; Thread* this_thread() const; - uint64_t nodes_searched() const; bool is_draw(int ply) const; + bool has_game_cycle(int ply) const; + bool has_repeated() const; int rule50_count() const; Score psq_score() const; Value non_pawn_material(Color c) const; Value non_pawn_material() const; // Position consistency check, for debugging - bool pos_is_ok(int* failedStep = nullptr) const; + bool pos_is_ok() const; void flip(); private: @@ -184,14 +185,18 @@ private: int castlingRightsMask[SQUARE_NB]; Square castlingRookSquare[CASTLING_RIGHT_NB]; Bitboard castlingPath[CASTLING_RIGHT_NB]; - uint64_t nodes; int gamePly; Color sideToMove; + Score psq; Thread* thisThread; StateInfo* st; bool chess960; }; +namespace PSQT { + extern Score psq[PIECE_NB][SQUARE_NB]; +} + extern std::ostream& operator<<(std::ostream& os, const Position& pos); inline Color Position::side_to_move() const { @@ -296,12 +301,8 @@ inline Bitboard Position::checkers() const { return st->checkersBB; } -inline Bitboard Position::discovered_check_candidates() const { - return st->blockersForKing[~sideToMove] & pieces(sideToMove); -} - -inline Bitboard Position::pinned_pieces(Color c) const { - return st->blockersForKing[c] & pieces(c); +inline Bitboard Position::blockers_for_king(Color c) const { + return st->blockersForKing[c]; } inline Bitboard Position::check_squares(PieceType pt) const { @@ -330,7 +331,7 @@ inline Key Position::material_key() const { } inline Score Position::psq_score() const { - return st->psq; + return psq; } inline Value Position::non_pawn_material(Color c) const { @@ -349,10 +350,6 @@ inline int Position::rule50_count() const { return st->rule50; } -inline uint64_t Position::nodes_searched() const { - return nodes; -} - inline bool Position::opposite_bishops() const { return pieceCount[W_BISHOP] == 1 && pieceCount[B_BISHOP] == 1 @@ -391,6 +388,7 @@ inline void Position::put_piece(Piece pc, Square s) { index[s] = pieceCount[pc]++; pieceList[pc][index[s]] = s; pieceCount[make_piece(color_of(pc), ALL_PIECES)]++; + psq += PSQT::psq[pc][s]; } inline void Position::remove_piece(Piece pc, Square s) { @@ -408,20 +406,22 @@ inline void Position::remove_piece(Piece pc, Square s) { pieceList[pc][index[lastSquare]] = lastSquare; pieceList[pc][pieceCount[pc]] = SQ_NONE; pieceCount[make_piece(color_of(pc), ALL_PIECES)]--; + psq -= PSQT::psq[pc][s]; } inline void Position::move_piece(Piece pc, Square from, Square to) { // index[from] is not updated and becomes stale. This works as long as index[] // is accessed just by known occupied squares. - Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to]; - byTypeBB[ALL_PIECES] ^= from_to_bb; - byTypeBB[type_of(pc)] ^= from_to_bb; - byColorBB[color_of(pc)] ^= from_to_bb; + Bitboard fromTo = SquareBB[from] ^ SquareBB[to]; + byTypeBB[ALL_PIECES] ^= fromTo; + byTypeBB[type_of(pc)] ^= fromTo; + byColorBB[color_of(pc)] ^= fromTo; board[from] = NO_PIECE; board[to] = pc; index[to] = index[from]; pieceList[pc][index[to]] = to; + psq += PSQT::psq[pc][to] - PSQT::psq[pc][from]; } inline void Position::do_move(Move m, StateInfo& newSt) {