Subversion Repositories Games.Chess Giants

Rev

Rev 169 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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-2015 Marco Costalba, Joona Kiiski, Tord Romstad
  5.   Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
  6.  
  7.   Stockfish is free software: you can redistribute it and/or modify
  8.   it under the terms of the GNU General Public License as published by
  9.   the Free Software Foundation, either version 3 of the License, or
  10.   (at your option) any later version.
  11.  
  12.   Stockfish is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License
  18.   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19. */
  20.  
  21. #ifndef PAWNS_H_INCLUDED
  22. #define PAWNS_H_INCLUDED
  23.  
  24. #include "misc.h"
  25. #include "position.h"
  26. #include "types.h"
  27.  
  28. namespace Pawns {
  29.  
  30. /// Pawns::Entry contains various information about a pawn structure. A lookup
  31. /// to the pawn hash table (performed by calling the probe function) returns a
  32. /// pointer to an Entry object.
  33.  
  34. struct Entry {
  35.  
  36.   Score pawn_score(Color c) const { return scores[c]; }
  37.   Bitboard pawn_attacks(Color c) const { return pawnAttacks[c]; }
  38.   Bitboard passed_pawns(Color c) const { return passedPawns[c]; }
  39.   Bitboard pawn_attacks_span(Color c) const { return pawnAttacksSpan[c]; }
  40.   int weak_unopposed(Color c) const { return weakUnopposed[c]; }
  41.   int pawn_asymmetry() const { return asymmetry; }
  42.   int open_files() const { return openFiles; }
  43.  
  44.   int semiopen_file(Color c, File f) const {
  45.     return semiopenFiles[c] & (1 << f);
  46.   }
  47.  
  48.   int pawns_on_same_color_squares(Color c, Square s) const {
  49.     return pawnsOnSquares[c][bool(DarkSquares & s)];
  50.   }
  51.  
  52.   template<Color Us>
  53.   Score king_safety(const Position& pos) {
  54.     return  kingSquares[Us] == pos.square<KING>(Us) && castlingRights[Us] == pos.can_castle(Us)
  55.           ? kingSafety[Us] : (kingSafety[Us] = do_king_safety<Us>(pos));
  56.   }
  57.  
  58.   template<Color Us>
  59.   Score do_king_safety(const Position& pos);
  60.  
  61.   template<Color Us>
  62.   Value evaluate_shelter(const Position& pos, Square ksq);
  63.  
  64.   Key key;
  65.   Score scores[COLOR_NB];
  66.   Bitboard passedPawns[COLOR_NB];
  67.   Bitboard pawnAttacks[COLOR_NB];
  68.   Bitboard pawnAttacksSpan[COLOR_NB];
  69.   Square kingSquares[COLOR_NB];
  70.   Score kingSafety[COLOR_NB];
  71.   int weakUnopposed[COLOR_NB];
  72.   int castlingRights[COLOR_NB];
  73.   int semiopenFiles[COLOR_NB];
  74.   int pawnsOnSquares[COLOR_NB][COLOR_NB]; // [color][light/dark squares]
  75.   int asymmetry;
  76.   int openFiles;
  77. };
  78.  
  79. typedef HashTable<Entry, 16384> Table;
  80.  
  81. void init();
  82. Entry* probe(const Position& pos);
  83.  
  84. } // namespace Pawns
  85.  
  86. #endif // #ifndef PAWNS_H_INCLUDED
  87.