From: Marco Costalba Date: Sat, 3 May 2014 09:45:58 +0000 (+0200) Subject: Add stealmate detection to evaluation X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=9e8bf82350002b826e40581100dbbcd1d65c796e;hp=dc87ec72586d090ceb81fd0600f36f55993e3e1a 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 --- 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;