From 9e8bf82350002b826e40581100dbbcd1d65c796e Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 3 May 2014 11:45:58 +0200 Subject: [PATCH] Add stealmate detection to evaluation 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 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index c2b94b75..29d71ea9 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -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; -- 2.39.2