Workaround a bug in Position::has_mate_threat()
authorMarco Costalba <mcostalba@gmail.com>
Sun, 30 Aug 2009 18:12:08 +0000 (19:12 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 30 Aug 2009 19:10:09 +0000 (20:10 +0100)
It seems that pos.has_mate_threat() changes the position !

So that calling MovePicker c'tor before or after the
has_mate_threat() call changes the things !

Bug was unhidden by previous patch that makes MovePicker c'tor
to generate, score and sort good captures under some circumstances.

Because scoring the captures is position dependent it seems that
the moves returned by MovePicker are different when c'tor is
called before has_mate_threat()

Of course this is only a workaround because the real bug is still
hidden :-(

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index 0c5ead46754c20411fe6ab3de99953dceb884524..12259bafb6f595f5c05c5bba550367aa6b4f866c 100644 (file)
@@ -1091,16 +1091,16 @@ namespace {
 
     // Initialize a MovePicker object for the current position, and prepare
     // to search all moves
-    MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
-
     Move move, movesSearched[256];
     int moveCount = 0;
     Value value, bestValue = -VALUE_INFINITE;
-    Bitboard dcCandidates = mp.discovered_check_candidates();
     Color us = pos.side_to_move();
     bool isCheck = pos.is_check();
     bool mateThreat = pos.has_mate_threat(opposite_color(us));
 
+    MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
+    Bitboard dcCandidates = mp.discovered_check_candidates();
+
     // Loop through all legal moves until no moves remain or a beta cutoff
     // occurs.
     while (   alpha < beta