From: Marco Costalba Date: Wed, 7 Oct 2009 08:03:17 +0000 (+0100) Subject: Do not claim repetition after null move X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=64d6ba2e98f29db8e853071b635ae4ebd59c24f0 Do not claim repetition after null move Null moves can artificially create a repetition draw where instead there is no one. So use a second counter to reset history after a null move. Idea from Joona. After 999 games at 1+0 Mod vs Orig +238 =553 -208 51.50% 514.5/999 +10 ELO Signed-off-by: Marco Costalba --- diff --git a/src/position.cpp b/src/position.cpp index e0e9aa3a..4e9a6dc7 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -703,7 +703,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { // pointer to point to the new, ready to be updated, state. struct ReducedStateInfo { Key key, pawnKey, materialKey; - int castleRights, rule50; + int castleRights, rule50, pliesFromNull; Square epSquare; Value mgValue, egValue; Value npMaterial[2]; @@ -724,6 +724,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { // Increment the 50 moves rule draw counter. Resetting it to zero in the // case of non-reversible moves is taken care of later. st->rule50++; + st->pliesFromNull++; if (move_is_castle(m)) { @@ -1242,6 +1243,7 @@ void Position::do_null_move(StateInfo& backupSt) { backupSt.mgValue = st->mgValue; backupSt.egValue = st->egValue; backupSt.previous = st->previous; + backupSt.pliesFromNull = st->pliesFromNull; st->previous = &backupSt; // Save the current key to the history[] array, in order to be able to @@ -1258,6 +1260,7 @@ void Position::do_null_move(StateInfo& backupSt) { sideToMove = opposite_color(sideToMove); st->epSquare = SQ_NONE; st->rule50++; + st->pliesFromNull = 0; gamePly++; st->mgValue += (sideToMove == WHITE)? TempoValueMidgame : -TempoValueMidgame; @@ -1279,6 +1282,7 @@ void Position::undo_null_move() { st->mgValue = backupSt->mgValue; st->egValue = backupSt->egValue; st->previous = backupSt->previous; + st->pliesFromNull = backupSt->pliesFromNull; // Update the necessary information sideToMove = opposite_color(sideToMove); @@ -1683,7 +1687,7 @@ bool Position::is_draw() const { return true; // Draw by repetition? - for (int i = 2; i < Min(gamePly, st->rule50); i += 2) + for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2) if (history[gamePly - i] == st->key) return true; diff --git a/src/position.h b/src/position.h index 370bb1d4..606c7486 100644 --- a/src/position.h +++ b/src/position.h @@ -88,7 +88,7 @@ enum Phase { struct StateInfo { Key key, pawnKey, materialKey; - int castleRights, rule50; + int castleRights, rule50, pliesFromNull; Square epSquare; Value mgValue, egValue; Value npMaterial[2];