Fix an assert in KBK endgame
authorMarco Costalba <mcostalba@gmail.com>
Sat, 27 Jul 2013 06:22:12 +0000 (08:22 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 27 Jul 2013 06:25:45 +0000 (08:25 +0200)
The endgame king + minor vs king is erroneusly
detected as king + minor vs king + minor

Here the fix is to detect king + minor earlier,
in particular to add these trivial cases to
endgame evaluation functions.

Spotted by Reuven Peleg

bench: 4727133

src/endgame.cpp
src/endgame.h

index 4323a4209442d10601b9711018422435d3344fac..e896e778e96aa8347b3f00405c26eddf580f97f5 100644 (file)
@@ -89,7 +89,10 @@ namespace {
 
 Endgames::Endgames() {
 
+  add<KK>("KK");
   add<KPK>("KPK");
+  add<KBK>("KBK");
+  add<KNK>("KNK");
   add<KNNK>("KNNK");
   add<KBNK>("KBNK");
   add<KRKP>("KRKP");
@@ -410,17 +413,13 @@ Value Endgame<KBBKN>::operator()(const Position& pos) const {
 }
 
 
-/// K and two minors vs K and one or two minors or K and two knights against
-/// king alone are always draw.
-template<>
-Value Endgame<KmmKm>::operator()(const Position&) const {
-  return VALUE_DRAW;
-}
+/// Some cases of trivial draws
+template<> Value Endgame<KK>::operator()(const Position&) const { return VALUE_DRAW; }
+template<> Value Endgame<KBK>::operator()(const Position&) const { return VALUE_DRAW; }
+template<> Value Endgame<KNK>::operator()(const Position&) const { return VALUE_DRAW; }
+template<> Value Endgame<KNNK>::operator()(const Position&) const { return VALUE_DRAW; }
+template<> Value Endgame<KmmKm>::operator()(const Position&) const { return VALUE_DRAW; }
 
-template<>
-Value Endgame<KNNK>::operator()(const Position&) const {
-  return VALUE_DRAW;
-}
 
 /// K, bishop and one or more pawns vs K. It checks for draws with rook pawns and
 /// a bishop of the wrong color. If such a draw is detected, SCALE_FACTOR_DRAW
index 7f3ce6fba0cb3ddb1296eaf7ab66991201425806..5529eae108429e35fba55f9a1c7ec362c68c3789 100644 (file)
@@ -33,6 +33,10 @@ enum EndgameType {
 
   // Evaluation functions
 
+  KK,    // K vs K
+  KBK,   // KB vs K
+  KNK,   // KN vs K
+  KNNK,  // KNN vs K
   KXK,   // Generic "mate lone king" eval
   KBNK,  // KBN vs K
   KPK,   // KP vs K
@@ -42,7 +46,6 @@ enum EndgameType {
   KQKP,  // KQ vs KP
   KQKR,  // KQ vs KR
   KBBKN, // KBB vs KN
-  KNNK,  // KNN vs K
   KmmKm, // K and two minors vs K and one or two minors