Subversion Repositories Games.Chess Giants

Rev

Rev 154 | Go to most recent revision | 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-2018 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 pawns_score() const { return score; }
  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 semiopen_side(Color c, File f, bool leftSide) const {
  49.     return semiopenFiles[c] & (leftSide ? (1 << f) - 1 : ~((1 << (f + 1)) - 1));
  50.   }
  51.  
  52.   int pawns_on_same_color_squares(Color c, Square s) const {
  53.     return pawnsOnSquares[c][bool(DarkSquares & s)];
  54.   }
  55.  
  56.   template<Color Us>
  57.   Score king_safety(const Position& pos, Square ksq) {
  58.     return  kingSquares[Us] == ksq && castlingRights[Us] == pos.can_castle(Us)
  59.           ? kingSafety[Us] : (kingSafety[Us] = do_king_safety<Us>(pos, ksq));
  60.   }
  61.  
  62.   template<Color Us>
  63.   Score do_king_safety(const Position& pos, Square ksq);
  64.  
  65.   template<Color Us>
  66.   Value shelter_storm(const Position& pos, Square ksq);
  67.  
  68.   Key key;
  69.   Score score;
  70.   Bitboard passedPawns[COLOR_NB];
  71.   Bitboard pawnAttacks[COLOR_NB];
  72.   Bitboard pawnAttacksSpan[COLOR_NB];
  73.   Square kingSquares[COLOR_NB];
  74.   Score kingSafety[COLOR_NB];
  75.   int weakUnopposed[COLOR_NB];
  76.   int castlingRights[COLOR_NB];
  77.   int semiopenFiles[COLOR_NB];
  78.   int pawnsOnSquares[COLOR_NB][COLOR_NB]; // [color][light/dark squares]
  79.   int asymmetry;
  80.   int openFiles;
  81. };
  82.  
  83. typedef HashTable<Entry, 16384> Table;
  84.  
  85. void init();
  86. Entry* probe(const Position& pos);
  87.  
  88. } // namespace Pawns
  89.  
  90. #endif // #ifndef PAWNS_H_INCLUDED
  91.