Rev 169 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 169 | Rev 185 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad |
4 | Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad |
5 | Copyright (C) 2015- |
5 | Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad |
6 | 6 | ||
7 | Stockfish is free software: you can redistribute it and/or modify |
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 |
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 |
9 | the Free Software Foundation, either version 3 of the License, or |
10 | (at your option) any later version. |
10 | (at your option) any later version. |
Line 29... | Line 29... | ||
29 | 29 | ||
30 | namespace { |
30 | namespace { |
31 | 31 | ||
32 | // Polynomial material imbalance parameters |
32 | // Polynomial material imbalance parameters |
33 | 33 | ||
34 |
|
34 | constexpr int QuadraticOurs[][PIECE_TYPE_NB] = { |
35 | // OUR PIECES |
35 | // OUR PIECES |
36 | // pair pawn knight bishop rook queen |
36 | // pair pawn knight bishop rook queen |
37 | { |
37 | {1438 }, // Bishop pair |
38 | { 40, |
38 | { 40, 38 }, // Pawn |
39 | { 32, 255, |
39 | { 32, 255, -62 }, // Knight OUR PIECES |
40 | { 0, 104, 4, 0 }, // Bishop |
40 | { 0, 104, 4, 0 }, // Bishop |
41 | { -26, -2, 47, 105, - |
41 | { -26, -2, 47, 105, -208 }, // Rook |
42 | {-189, 24, 117, 133, -134, - |
42 | {-189, 24, 117, 133, -134, -6 } // Queen |
43 | }; |
43 | }; |
44 | 44 | ||
45 |
|
45 | constexpr int QuadraticTheirs[][PIECE_TYPE_NB] = { |
46 | // THEIR PIECES |
46 | // THEIR PIECES |
47 | // pair pawn knight bishop rook queen |
47 | // pair pawn knight bishop rook queen |
48 | { 0 }, // Bishop pair |
48 | { 0 }, // Bishop pair |
49 | { 36, 0 }, // Pawn |
49 | { 36, 0 }, // Pawn |
50 | { 9, 63, 0 }, // Knight OUR PIECES |
50 | { 9, 63, 0 }, // Knight OUR PIECES |
Line 66... | Line 66... | ||
66 | bool is_KXK(const Position& pos, Color us) { |
66 | bool is_KXK(const Position& pos, Color us) { |
67 | return !more_than_one(pos.pieces(~us)) |
67 | return !more_than_one(pos.pieces(~us)) |
68 | && pos.non_pawn_material(us) >= RookValueMg; |
68 | && pos.non_pawn_material(us) >= RookValueMg; |
69 | } |
69 | } |
70 | 70 | ||
71 | bool |
71 | bool is_KBPsK(const Position& pos, Color us) { |
72 | return pos.non_pawn_material(us) == BishopValueMg |
72 | return pos.non_pawn_material(us) == BishopValueMg |
73 | && pos.count<BISHOP>(us) == 1 |
73 | && pos.count<BISHOP>(us) == 1 |
74 | && pos.count<PAWN >(us) >= 1; |
74 | && pos.count<PAWN >(us) >= 1; |
75 | } |
75 | } |
76 | 76 | ||
77 | bool is_KQKRPs(const Position& pos, Color us) { |
77 | bool is_KQKRPs(const Position& pos, Color us) { |
78 | return !pos.count<PAWN>(us) |
78 | return !pos.count<PAWN>(us) |
79 | && pos.non_pawn_material(us) == QueenValueMg |
79 | && pos.non_pawn_material(us) == QueenValueMg |
80 | && pos.count<QUEEN>(us) |
80 | && pos.count<QUEEN>(us) == 1 |
81 | && pos.count<ROOK>(~us) == 1 |
81 | && pos.count<ROOK>(~us) == 1 |
82 | && pos.count<PAWN>(~us) >= 1; |
82 | && pos.count<PAWN>(~us) >= 1; |
83 | } |
83 | } |
84 | 84 | ||
85 | /// imbalance() calculates the imbalance by comparing the piece count of each |
85 | /// imbalance() calculates the imbalance by comparing the piece count of each |
86 | /// piece type for both colors. |
86 | /// piece type for both colors. |
87 | template<Color Us> |
87 | template<Color Us> |
88 | int imbalance(const int pieceCount[][PIECE_TYPE_NB]) { |
88 | int imbalance(const int pieceCount[][PIECE_TYPE_NB]) { |
89 | 89 | ||
90 |
|
90 | constexpr Color Them = (Us == WHITE ? BLACK : WHITE); |
91 | 91 | ||
92 | int bonus = 0; |
92 | int bonus = 0; |
93 | 93 | ||
94 | // Second-degree polynomial material imbalance, by Tord Romstad |
94 | // Second-degree polynomial material imbalance, by Tord Romstad |
95 | for (int pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; ++pt1) |
95 | for (int pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; ++pt1) |
Line 150... | Line 150... | ||
150 | return e; |
150 | return e; |
151 | } |
151 | } |
152 | 152 | ||
153 | // OK, we didn't find any special evaluation function for the current material |
153 | // OK, we didn't find any special evaluation function for the current material |
154 | // configuration. Is there a suitable specialized scaling function? |
154 | // configuration. Is there a suitable specialized scaling function? |
155 | EndgameBase<ScaleFactor>* sf; |
155 | const EndgameBase<ScaleFactor>* sf; |
156 | 156 | ||
157 | if ((sf = pos.this_thread()->endgames.probe<ScaleFactor>(key)) != nullptr) |
157 | if ((sf = pos.this_thread()->endgames.probe<ScaleFactor>(key)) != nullptr) |
158 | { |
158 | { |
159 | e->scalingFunction[sf->strongSide] = sf; // Only strong color assigned |
159 | e->scalingFunction[sf->strongSide] = sf; // Only strong color assigned |
160 | return e; |
160 | return e; |
Line 163... | Line 163... | ||
163 | // We didn't find any specialized scaling function, so fall back on generic |
163 | // We didn't find any specialized scaling function, so fall back on generic |
164 | // ones that refer to more than one material distribution. Note that in this |
164 | // ones that refer to more than one material distribution. Note that in this |
165 | // case we don't return after setting the function. |
165 | // case we don't return after setting the function. |
166 | for (Color c = WHITE; c <= BLACK; ++c) |
166 | for (Color c = WHITE; c <= BLACK; ++c) |
167 | { |
167 | { |
168 | if ( |
168 | if (is_KBPsK(pos, c)) |
169 | e->scalingFunction[c] = &ScaleKBPsK[c]; |
169 | e->scalingFunction[c] = &ScaleKBPsK[c]; |
170 | 170 | ||
171 | else if (is_KQKRPs(pos, c)) |
171 | else if (is_KQKRPs(pos, c)) |
172 | e->scalingFunction[c] = &ScaleKQKRPs[c]; |
172 | e->scalingFunction[c] = &ScaleKQKRPs[c]; |
173 | } |
173 | } |
Line 203... | Line 203... | ||
203 | npm_b <= BishopValueMg ? 4 : 14); |
203 | npm_b <= BishopValueMg ? 4 : 14); |
204 | 204 | ||
205 | if (!pos.count<PAWN>(BLACK) && npm_b - npm_w <= BishopValueMg) |
205 | if (!pos.count<PAWN>(BLACK) && npm_b - npm_w <= BishopValueMg) |
206 | e->factor[BLACK] = uint8_t(npm_b < RookValueMg ? SCALE_FACTOR_DRAW : |
206 | e->factor[BLACK] = uint8_t(npm_b < RookValueMg ? SCALE_FACTOR_DRAW : |
207 | npm_w <= BishopValueMg ? 4 : 14); |
207 | npm_w <= BishopValueMg ? 4 : 14); |
208 | - | ||
209 | if (pos.count<PAWN>(WHITE) == 1 && npm_w - npm_b <= BishopValueMg) |
- | |
210 | e->factor[WHITE] = (uint8_t) SCALE_FACTOR_ONEPAWN; |
- | |
211 | - | ||
212 | if (pos.count<PAWN>(BLACK) == 1 && npm_b - npm_w <= BishopValueMg) |
- | |
213 | e->factor[BLACK] = (uint8_t) SCALE_FACTOR_ONEPAWN; |
- | |
214 | 208 | ||
215 | // Evaluate the material imbalance. We use PIECE_TYPE_NONE as a place holder |
209 | // Evaluate the material imbalance. We use PIECE_TYPE_NONE as a place holder |
216 | // for the bishop pair "extended piece", which allows us to be more flexible |
210 | // for the bishop pair "extended piece", which allows us to be more flexible |
217 | // in defining bishop pair bonuses. |
211 | // in defining bishop pair bonuses. |
218 | const int |
212 | const int pieceCount[COLOR_NB][PIECE_TYPE_NB] = { |
219 | { pos.count<BISHOP>(WHITE) > 1, pos.count<PAWN>(WHITE), pos.count<KNIGHT>(WHITE), |
213 | { pos.count<BISHOP>(WHITE) > 1, pos.count<PAWN>(WHITE), pos.count<KNIGHT>(WHITE), |
220 | pos.count<BISHOP>(WHITE) , pos.count<ROOK>(WHITE), pos.count<QUEEN >(WHITE) }, |
214 | pos.count<BISHOP>(WHITE) , pos.count<ROOK>(WHITE), pos.count<QUEEN >(WHITE) }, |
221 | { pos.count<BISHOP>(BLACK) > 1, pos.count<PAWN>(BLACK), pos.count<KNIGHT>(BLACK), |
215 | { pos.count<BISHOP>(BLACK) > 1, pos.count<PAWN>(BLACK), pos.count<KNIGHT>(BLACK), |
222 | pos.count<BISHOP>(BLACK) , pos.count<ROOK>(BLACK), pos.count<QUEEN >(BLACK) } }; |
216 | pos.count<BISHOP>(BLACK) , pos.count<ROOK>(BLACK), pos.count<QUEEN >(BLACK) } }; |
223 | 217 | ||
224 | e->value = int16_t((imbalance<WHITE>( |
218 | e->value = int16_t((imbalance<WHITE>(pieceCount) - imbalance<BLACK>(pieceCount)) / 16); |
225 | return e; |
219 | return e; |
226 | } |
220 | } |
227 | 221 | ||
228 | } // namespace Material |
222 | } // namespace Material |