1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Fully correct stealmate detection

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
This commit is contained in:
Marco Costalba 2014-05-03 12:09:56 +02:00
parent 9e8bf82350
commit a9e93fa6a5

View file

@ -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"
@ -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