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 |