Skip to content

Commit

Permalink
Fully correct stealmate detection
Browse files Browse the repository at this point in the history
In the (rare) cases when the two conditions
are true, then fully check again with a slow
but correct MoveList<LEGAL>(pos).size().

This is able to detect false positives like
this one:

8/8/8/Q7/5k1p/5P2/4KP2/8 b - - 0 17

When we have a possible simple pawn push that
is not stored in attacks[] array. Because the
third condition triggers very rarely, even if
it is slow, it does not alters in a measurable
way the average speed of the engine.

bench: 8678654
  • Loading branch information
mcostalba committed May 3, 2014
1 parent 9e8bf82 commit a9e93fa
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/evaluate.cpp
Expand Up @@ -17,10 +17,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <algorithm>
#include <cassert>
#include <iomanip>
#include <sstream>
#include <algorithm>

#include "bitcount.h"
#include "evaluate.h"
Expand Down Expand Up @@ -790,7 +790,8 @@ namespace {
// 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])))
&& (!(ei.attackedBy[stm][KING] & ~ei.attackedBy[~stm][ALL_PIECES]))
&& !MoveList<LEGAL>(pos).size())
sf = SCALE_FACTOR_DRAW;

// Interpolate between a middlegame and a (scaled by 'sf') endgame score
Expand Down

0 comments on commit a9e93fa

Please sign in to comment.