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 MOVEPICK_H_INCLUDED
  22. #define MOVEPICK_H_INCLUDED
  23.  
  24. #include <array>
  25. #include <limits>
  26. #include <type_traits>
  27.  
  28. #include "movegen.h"
  29. #include "position.h"
  30. #include "types.h"
  31.  
  32. /// StatsEntry stores the stat table value. It is usually a number but could
  33. /// be a move or even a nested history. We use a class instead of naked value
  34. /// to directly call history update operator<<() on the entry so to use stats
  35. /// tables at caller sites as simple multi-dim arrays.
  36. template<typename T, int D>
  37. class StatsEntry {
  38.  
  39.   T entry;
  40.  
  41. public:
  42.   void operator=(const T& v) { entry = v; }
  43.   T* operator&() { return &entry; }
  44.   T* operator->() { return &entry; }
  45.   operator const T&() const { return entry; }
  46.  
  47.   void operator<<(int bonus) {
  48.     assert(abs(bonus) <= D); // Ensure range is [-D, D]
  49.     static_assert(D <= std::numeric_limits<T>::max(), "D overflows T");
  50.  
  51.     entry += bonus - entry * abs(bonus) / D;
  52.  
  53.     assert(abs(entry) <= D);
  54.   }
  55. };
  56.  
  57. /// Stats is a generic N-dimensional array used to store various statistics.
  58. /// The first template parameter T is the base type of the array, the second
  59. /// template parameter D limits the range of updates in [-D, D] when we update
  60. /// values with the << operator, while the last parameters (Size and Sizes)
  61. /// encode the dimensions of the array.
  62. template <typename T, int D, int Size, int... Sizes>
  63. struct Stats : public std::array<Stats<T, D, Sizes...>, Size>
  64. {
  65.   typedef Stats<T, D, Size, Sizes...> stats;
  66.  
  67.   void fill(const T& v) {
  68.  
  69.     // For standard-layout 'this' points to first struct member
  70.     assert(std::is_standard_layout<stats>::value);
  71.  
  72.     typedef StatsEntry<T, D> entry;
  73.     entry* p = reinterpret_cast<entry*>(this);
  74.     std::fill(p, p + sizeof(*this) / sizeof(entry), v);
  75.   }
  76. };
  77.  
  78. template <typename T, int D, int Size>
  79. struct Stats<T, D, Size> : public std::array<StatsEntry<T, D>, Size> {};
  80.  
  81. /// In stats table, D=0 means that the template parameter is not used
  82. enum StatsParams { NOT_USED = 0 };
  83.  
  84.  
  85. /// ButterflyHistory records how often quiet moves have been successful or
  86. /// unsuccessful during the current search, and is used for reduction and move
  87. /// ordering decisions. It uses 2 tables (one for each color) indexed by
  88. /// the move's from and to squares, see chessprogramming.wikispaces.com/Butterfly+Boards
  89. typedef Stats<int16_t, 10692, COLOR_NB, int(SQUARE_NB) * int(SQUARE_NB)> ButterflyHistory;
  90.  
  91. /// CounterMoveHistory stores counter moves indexed by [piece][to] of the previous
  92. /// move, see chessprogramming.wikispaces.com/Countermove+Heuristic
  93. typedef Stats<Move, NOT_USED, PIECE_NB, SQUARE_NB> CounterMoveHistory;
  94.  
  95. /// CapturePieceToHistory is addressed by a move's [piece][to][captured piece type]
  96. typedef Stats<int16_t, 10692, PIECE_NB, SQUARE_NB, PIECE_TYPE_NB> CapturePieceToHistory;
  97.  
  98. /// PieceToHistory is like ButterflyHistory but is addressed by a move's [piece][to]
  99. typedef Stats<int16_t, 29952, PIECE_NB, SQUARE_NB> PieceToHistory;
  100.  
  101. /// ContinuationHistory is the combined history of a given pair of moves, usually
  102. /// the current one given a previous one. The nested history table is based on
  103. /// PieceToHistory instead of ButterflyBoards.
  104. typedef Stats<PieceToHistory, NOT_USED, PIECE_NB, SQUARE_NB> ContinuationHistory;
  105.  
  106.  
  107. /// MovePicker class is used to pick one pseudo legal move at a time from the
  108. /// current position. The most important method is next_move(), which returns a
  109. /// new pseudo legal move each time it is called, until there are no moves left,
  110. /// when MOVE_NONE is returned. In order to improve the efficiency of the alpha
  111. /// beta algorithm, MovePicker attempts to return the moves which are most likely
  112. /// to get a cut-off first.
  113. class MovePicker {
  114.  
  115.   enum PickType { Next, Best };
  116.  
  117. public:
  118.   MovePicker(const MovePicker&) = delete;
  119.   MovePicker& operator=(const MovePicker&) = delete;
  120.   MovePicker(const Position&, Move, Value, const CapturePieceToHistory*);
  121.   MovePicker(const Position&, Move, Depth, const ButterflyHistory*,
  122.                                            const CapturePieceToHistory*,
  123.                                            const PieceToHistory**,
  124.                                            Square);
  125.   MovePicker(const Position&, Move, Depth, const ButterflyHistory*,
  126.                                            const CapturePieceToHistory*,
  127.                                            const PieceToHistory**,
  128.                                            Move,
  129.                                            Move*);
  130.   Move next_move(bool skipQuiets = false);
  131.  
  132. private:
  133.   template<PickType T, typename Pred> Move select(Pred);
  134.   template<GenType> void score();
  135.   ExtMove* begin() { return cur; }
  136.   ExtMove* end() { return endMoves; }
  137.  
  138.   const Position& pos;
  139.   const ButterflyHistory* mainHistory;
  140.   const CapturePieceToHistory* captureHistory;
  141.   const PieceToHistory** continuationHistory;
  142.   Move ttMove;
  143.   ExtMove refutations[3], *cur, *endMoves, *endBadCaptures;
  144.   int stage;
  145.   Move move;
  146.   Square recaptureSquare;
  147.   Value threshold;
  148.   Depth depth;
  149.   ExtMove moves[MAX_MOVES];
  150. };
  151.  
  152. #endif // #ifndef MOVEPICK_H_INCLUDED
  153.