Permalink
Browse files

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 <mcostalba@gmail.com>
  • Loading branch information...
1 parent 5a5dc6f commit 64d6ba2e98f29db8e853071b635ae4ebd59c24f0 @mcostalba committed Oct 7, 2009
Showing with 7 additions and 3 deletions.
  1. +6 −2 src/position.cpp
  2. +1 −1 src/position.h
View
@@ -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;
View
@@ -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];

0 comments on commit 64d6ba2

Please sign in to comment.