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