Rev 96 | Rev 169 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 96 | pmbaty | 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 MOVEPICK_H_INCLUDED | ||
| 22 | #define MOVEPICK_H_INCLUDED | ||
| 23 | |||
| 24 | #include <algorithm> // For std::max | ||
| 25 | #include <cstring>   // For std::memset | ||
| 26 | |||
| 27 | #include "movegen.h" | ||
| 28 | #include "position.h" | ||
| 29 | #include "types.h" | ||
| 30 | |||
| 31 | |||
| 32 | /// The Stats struct stores moves statistics. According to the template parameter | ||
| 33 | /// the class can store History and Countermoves. History records how often | ||
| 34 | /// different moves have been successful or unsuccessful during the current search | ||
| 35 | /// and is used for reduction and move ordering decisions. | ||
| 36 | /// Countermoves store the move that refute a previous one. Entries are stored | ||
| 37 | /// using only the moving piece and destination square, hence two moves with | ||
| 38 | /// different origin but same destination and piece will be considered identical. | ||
| 39 | template<typename T, bool CM = false> | ||
| 40 | struct Stats { | ||
| 41 | |||
| 42 | static const Value Max = Value(1 << 28); | ||
| 43 | |||
| 44 | const T* operator[](Piece pc) const { return table[pc]; } | ||
| 45 | T* operator[](Piece pc) { return table[pc]; } | ||
| 46 | void clear() { std::memset(table, 0, sizeof(table)); } | ||
| 154 | pmbaty | 47 | void update(Piece pc, Square to, Move m) { table[pc][to] = m; } | 
| 96 | pmbaty | 48 | void update(Piece pc, Square to, Value v) { | 
| 49 | |||
| 50 | if (abs(int(v)) >= 324) | ||
| 51 | return; | ||
| 52 | |||
| 154 | pmbaty | 53 | table[pc][to] -= table[pc][to] * abs(int(v)) / (CM ? 936 : 324); | 
| 54 | table[pc][to] += int(v) * 32; | ||
| 96 | pmbaty | 55 |   } | 
| 56 | |||
| 57 | private: | ||
| 58 | T table[PIECE_NB][SQUARE_NB]; | ||
| 59 | }; | ||
| 60 | |||
| 61 | typedef Stats<Move> MoveStats; | ||
| 62 | typedef Stats<Value, false> HistoryStats; | ||
| 63 | typedef Stats<Value, true> CounterMoveStats; | ||
| 64 | typedef Stats<CounterMoveStats> CounterMoveHistoryStats; | ||
| 65 | |||
| 154 | pmbaty | 66 | struct FromToStats { | 
| 96 | pmbaty | 67 | |
| 154 | pmbaty | 68 | Value get(Color c, Move m) const { return table[c][from_sq(m)][to_sq(m)]; } | 
| 69 | void clear() { std::memset(table, 0, sizeof(table)); } | ||
| 70 | void update(Color c, Move m, Value v) { | ||
| 71 | |||
| 72 | if (abs(int(v)) >= 324) | ||
| 73 | return; | ||
| 74 | |||
| 75 | Square from = from_sq(m); | ||
| 76 | Square to = to_sq(m); | ||
| 77 | |||
| 78 | table[c][from][to] -= table[c][from][to] * abs(int(v)) / 324; | ||
| 79 | table[c][from][to] += int(v) * 32; | ||
| 80 |   } | ||
| 81 | |||
| 82 | private: | ||
| 83 | Value table[COLOR_NB][SQUARE_NB][SQUARE_NB]; | ||
| 84 | }; | ||
| 85 | |||
| 86 | |||
| 96 | pmbaty | 87 | /// MovePicker class is used to pick one pseudo legal move at a time from the | 
| 88 | /// current position. The most important method is next_move(), which returns a | ||
| 89 | /// new pseudo legal move each time it is called, until there are no moves left, | ||
| 90 | /// when MOVE_NONE is returned. In order to improve the efficiency of the alpha | ||
| 91 | /// beta algorithm, MovePicker attempts to return the moves which are most likely | ||
| 92 | /// to get a cut-off first. | ||
| 154 | pmbaty | 93 | namespace Search { struct Stack; } | 
| 96 | pmbaty | 94 | |
| 95 | class MovePicker { | ||
| 96 | public: | ||
| 97 | MovePicker(const MovePicker&) = delete; | ||
| 98 | MovePicker& operator=(const MovePicker&) = delete; | ||
| 99 | |||
| 154 | pmbaty | 100 | MovePicker(const Position&, Move, Value); | 
| 101 | MovePicker(const Position&, Move, Depth, Square); | ||
| 102 | MovePicker(const Position&, Move, Depth, Search::Stack*); | ||
| 96 | pmbaty | 103 | |
| 104 | Move next_move(); | ||
| 105 | |||
| 106 | private: | ||
| 107 | template<GenType> void score(); | ||
| 154 | pmbaty | 108 | ExtMove* begin() { return cur; } | 
| 96 | pmbaty | 109 | ExtMove* end() { return endMoves; } | 
| 110 | |||
| 111 | const Position& pos; | ||
| 154 | pmbaty | 112 | const Search::Stack* ss; | 
| 96 | pmbaty | 113 |   Move countermove; | 
| 114 |   Depth depth; | ||
| 115 |   Move ttMove; | ||
| 116 |   Square recaptureSquare; | ||
| 117 |   Value threshold; | ||
| 118 | int stage; | ||
| 154 | pmbaty | 119 | ExtMove *cur, *endMoves, *endBadCaptures; | 
| 120 | ExtMove moves[MAX_MOVES]; | ||
| 96 | pmbaty | 121 | }; | 
| 122 | |||
| 123 | #endif // #ifndef MOVEPICK_H_INCLUDED |