in material.cpp
I think that it is better if stockfish is going to get rid of this code unless stockfish evaluate stalemate positions correctly
The problem is that stockfish may evaluate drawn positions as+90
[d]K7/Q7/8/8/8/8/5p2/7k w - - 0 1 +89.04 at depth 1
[d]KN6/Q7/8/8/8/8/5p2/7k w - - 0 1 +93.17 at depth 1
Here stockfish captures the pawn with evaluation of 89.04(93.17) at depth 1 because of that code instead of having a normal evaluation with no misleading knowledge(I suspect that the misleading knowledge may push stockfish to draw winning position thanks to evaluation of +90 when without this knowledge stockfish may find something better when the opponent has pawns and it is not stalemate).
I also saw cases when stockfish got winning scores for drawn endgames
because of that bug
see the following log of stockfish
[d]8/1p4p1/2k2R1p/8/8/8/1r5r/K7 b - - 0 1
Searching: 8/1p4p1/2k2R1p/8/8/8/1r5r/K7 b - - 0 1
infinite: 1 ponder: 0 time: 0 increment: 0 moves to go: 0
1 +12.65 00:00 60 Kc5 Rf5+ Kd4
2 +12.61 00:00 178 Kd5 Rf7
3 +12.61 00:00 634 Kd5 Rf5+ Ke4 Rf7
4 +13.13 00:00 1278 Kd5 Rf5+ Ke4 Rf7 g5 Re7+ Kd4
5 +13.25 00:00 2461 Kd5 Rf5+ Ke6 Rf3 g5 Re3+ Kd5 Rd3+ Ke4
6 +13.37 00:00 4507 Kd5 Rf5+ Ke6 Rf3 g5 Re3+ Kd5 Rd3+ Ke4 Rc3
7 +14.06 00:00 15884 Kd5 Rf5+ Ke6 Rf3 g5 Re3+ Kd5 Rd3+ Ke4 Rd7 g4 Re7+
Kd5 Rd7+ Ke4
8 +14.06 00:00 22472 Kd5 Rf5+ Ke6 Rf3 g5 Re3+ Kd5 Rd3+ Ke4 Rd8 g4 Re8+
Kf3 Rf8+ Ke3 Re8+ Kd3 Rd8+ Kc4 Re8
9 +14.10 00:00 30638 Kd5 Rf5+ Ke4 Rf7 g5 Re7+ Kd5 Rd7+ Ke6 Rg7 b5 Rg8 b4
Re8+ Kd5 Rd8+ Ke4 Re8+ Kd5
10 +14.10 00:00 49686 Kd5 Rd6+ Ke5 Rd8 g5 Re8+ Kf4 Rf8+ Ke4 Re8+ Kd5 Rd8+
Ke6 Re8+ Kf7 Re5 g4 Rc5 h5
11 +84.04 00:00 173187 Kd5 Rd6+ Ke5 Rd8 Ra2+ Kb1 Rae2
12 +85.43 00:00 183695 Kd5 Rd6+ Ke5 Rd5+ Kf6 Rd6+ Ke7 Rg6 Rhg2 Rxg7+ Rxg7
Kxb2 Ke6 Kc2 Kd5 Kd3
13 +16.00 00:00 392574 Kd5 Rd6+ Ke5 Re6+ Kf5 Rf6+ Ke4 Re6+ Kd3 Re8 g5 Rd8+
Kc3 Rc8+ Kd4 Rd8+ Ke5 Re8+ Kd5 Rd8+ Ke6 Re8+ Kf7 Rb8
g4 Rh8 g3 Rh7+ Ke6 Rxb7 Rxb7
14 +14.38 00:01 658587 Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Kc3 Rc5+ Kd4 Rd5+ Ke4
Re5+ Kf3 Rf5+ Kg3 Rg5+ Kh3 Rc5 g5 Rc3+ Kg4 Ra3 h5
Rd3 h4 Rd4+ Kf5 Rd5+ Kf4
15 +14.38 00:01 664881 Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Kc3 Rc5+ Kd4 Rd5+ Ke4
Re5+ Kxe5
16 +80.44 00:02 2278K Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Ke3 Re5+ Kf3 Rf5+ Kg3 Re5
Rbe2
17 +84.08 00:02 2340K Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Ke3 Re5+ Kf3 Rf5+ Kg3
Rg5+ Kf2 Rf5+ Kg1 Rf1+ Kg2 Rf7 Re2 Rxg7+ Kh1 Rxb7
Re1+ Rb1 Rxb1+ Kxb1 Kg1 Ka1
18 +84.13 00:03 2592K Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Ke3 Re5+ Kf3 Rf5+ Kg3
Rg5+ Kf2 Rxg7 Kf3 Rf7+ Ke4 Re7+ Kd5 Rf7 Ke6 Rc7 Rbf2
Rxb7 Rf1+ Rb1 Rxb1+ Kxb1
19 +84.23 00:03 2844K Kd5 Rf5+ Kc4 Rc5+ Kd3 Rd5+ Ke3 Re5+ Kf3 Rf5+ Kg3
Rg5+ Kf2 Rxg7 Kf3 Rf7+ Ke4 Re7+ Kd5 Rf7 Ke6 Rc7 Rbf2
Rxb7 Rf1+ Rb1 Rxb1+ Kxb1 Kd5
20 +84.33 00:11 10041K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg2
21 +84.33 00:11 10126K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kxf3
22 +84.33 00:11 10163K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg2 Rg3+ Kf1 Rg1+
Kf2
23 +84.33 00:11 10229K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kxf3
24 +84.33 00:11 10791K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg2 Rf4 Re2 Rf5 Rh1+
25 +84.13 00:13 12508K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg2 Rg3+ Kf1 Rg1+
Kf2
26 +84.13 00:16 14877K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kh4 Rf4+ Kh5 Rf5+
Kg6 Rg5+ Kf6 Rg6+ Kf5 Rf6+ Kg4 Rg6+ Kf4 Rf6+ Ke3
Re6+ Kf3 Re3+ Kg4 Re4+ Kg3 Rg4+ Kf3 Rf4+ Kg2 Rg4+
Kf2 Rf4+ Kg1 Rf1+
27 +84.13 00:16 15007K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg4 Rg3+ Kf5 Rg5+
Ke4 Rg4+ Kd5 Rd4+ Ke6 Re4+ Kf6 Rf4+ Ke7 Re4+ Kf7
Re7+ Kf6 Re6+ Kf5 Rf6+ Kg4 Rg6+ Kf5 Rf6+
28 +77.08 00:20 18551K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg4 Rg3+ Kf5 Rf3+
Ke6 Re3+ Kf7 Re7+ Kg6 Rxg7+ Kf6 Rg6+ Kf5 Rg5+ Ke4
Rg4+ Kd3 Rg3+ Ke4 Rg4+
29 +77.08 00:20 18809K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg4 Rg3+ Kf4 Rg4+
Ke5 Rg5+ Ke6 Re5+ Kf7 Re7+ Kf6 Rf7+ Kg6 Rxg7+ Kf6
Rf7+ Ke6 Re7+ Kf5 Re5+ Kf6 Re6+ Kxe6
30 +77.08 00:41 37705K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg4 Rf4+ Kxf4
31 +77.08 01:10 65847K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg4 Rf4+ Kh3 Rf3+
Kh4 Rf4+ Kh5 Rf5+ Kg6 Rg5+ Kf6 Rf5+ Ke6 Re5+ Kd6
Rd5+ Ke7 Re5+ Kd8 Rd5+ Ke8 Re5+ Kf7 Re7+ Kf6 Re6+
Kf5 Rf6+ Kg4 Rg6+ Kf4 Rf6+ Ke3 Re6+ Kd4 Re4+ Kc5
Re5+ Kd6
32 +77.08 01:11 66228K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kg2 Rg3+ Kf1 Rg1+
Kf2
33 +77.09 01:21 75908K Kd5 Rf5+ Ke4 Rf4+ Kd3 Rf3+ Ke2 Re3+ Kf2 Rf3+ Kg1
Rf1+ Kg2 Rg1+ Kf2 Rf1+ Kg3 Rf3+ Kh4 Rf4+ Kh3 Rf3+
Kg4 Rg3+ Kf5 Rg5+ Ke6 Re5+ Kf7 Re7+ Kf6 Re6+ Kf5
Re5+ Kf4 Rf5+ Kg3 Rf3+
My suggestion is or to get rid of this code or to add another condition after the last line that the lone king has legal moves.
Code: Select all
template<Color Us> bool is_KXK(const Position& pos) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
return pos.non_pawn_material(Them) == VALUE_ZERO
&& pos.piece_count(Them, PAWN) == 0
&& pos.non_pawn_material(Us) >= RookValueMidgame;
}