Add stealmate detection to evaluation
authorMarco Costalba <mcostalba@gmail.com>
Sat, 3 May 2014 09:45:58 +0000 (11:45 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 3 May 2014 09:47:49 +0000 (11:47 +0200)
Currently a stealmate position is misevaluated
in a negative/positive score, this leads qsearch(),
that does not detects stealmates too, to return the
wrong score and this yields to some kind of endgames
to be completely misevaluated.

With this patch is fully fixed follwing position

7k/6p1/6B1/5K1P/8/8/8/8 w - - 0 1

Also in SMP case.

Correct root cause analysys by Ronald de Man.

bench: 8678654

src/evaluate.cpp

index c2b94b75365885d53d083ce2badfb6eacb6ebdd6..29d71ea9e0cce28078ccf4a715521d85b3f6bbac 100644 (file)
@@ -787,6 +787,12 @@ namespace {
              sf = ScaleFactor(50 * sf / SCALE_FACTOR_NORMAL);
     }
 
+    // Stealmate detection
+    Color stm = pos.side_to_move();
+    if (   (ei.attackedBy[stm][ALL_PIECES] == ei.attackedBy[stm][KING])
+        && (!(ei.attackedBy[stm][KING] & ~ei.attackedBy[~stm][ALL_PIECES])))
+        sf = SCALE_FACTOR_DRAW;
+
     // Interpolate between a middlegame and a (scaled by 'sf') endgame score
     Value v =  mg_value(score) * int(ei.mi->game_phase())
              + eg_value(score) * int(PHASE_MIDGAME - ei.mi->game_phase()) * sf / SCALE_FACTOR_NORMAL;