Fix material key for King
authorMarco Costalba <mcostalba@gmail.com>
Sun, 16 Feb 2014 10:37:29 +0000 (11:37 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 16 Feb 2014 10:51:30 +0000 (11:51 +0100)
Currently king has no material key associated because
it can never happen to find a legal position without
both kings, so there is no need to keep track of it.

The consequence is that a position with only the two
kings has material key set at zero and if the material
hash table is empty any entry will match and this is
wrong.

Normally bug is hidden becuase the checking for a draw
with pos.is_draw() is done earlier than evaluate() call,
so that we never check in gameplay the material key of a
position with two kings.

Nevertheless the bug is there and can be reproduced setting
at startup a position with only two kings and typing
'eval' from prompt.

The fix is very simple: add a random key also for the king.

Also fixed the condition in material.cpp to avoid asserting
when a 'just 2 kings' postion is evaluated.

No functional change.

src/material.cpp
src/position.cpp

index b6e239644eefb3c24bcdd861bfe3a675b466d81b..89147352ffe8b62c310a3dd2679806f7cb8fc6f8 100644 (file)
@@ -192,7 +192,7 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) {
   Value npm_w = pos.non_pawn_material(WHITE);
   Value npm_b = pos.non_pawn_material(BLACK);
 
-  if (npm_w + npm_b == VALUE_ZERO)
+  if (npm_w + npm_b == VALUE_ZERO && pos.pieces(PAWN))
   {
       if (!pos.count<PAWN>(BLACK))
       {
index 6f8747635772aa930a604025bd5b0c95a67dbbc2..72681e8d694e68d4c2f709dccf9a54b560aafa06 100644 (file)
@@ -1176,7 +1176,7 @@ Key Position::compute_material_key() const {
   Key k = 0;
 
   for (Color c = WHITE; c <= BLACK; ++c)
-      for (PieceType pt = PAWN; pt <= QUEEN; ++pt)
+      for (PieceType pt = PAWN; pt <= KING; ++pt)
           for (int cnt = 0; cnt < pieceCount[c][pt]; ++cnt)
               k ^= Zobrist::psq[c][pt][cnt];