Restore old BOUND_EXACT logic in qsearch
authorMarco Costalba <mcostalba@gmail.com>
Sun, 11 Nov 2012 10:49:02 +0000 (11:49 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 11 Nov 2012 10:52:11 +0000 (11:52 +0100)
In case a PvNode node has a static evaluation above alpha but
no available moves we want to flag the node as BOUND_EXACT,
not as BOUND_UPPER as is currently.

The behaviour was recently introduced with patch d471c49700fbe8281
of 3/10/2012

Spotted by Hongzhi Cheng.

bench: 5558464

src/search.cpp

index 3ffd8ae4c780262937f98e7f83227017b7d29c08..55d815c4b5530359e4d7dbf1269116cd7497138e 100644 (file)
@@ -1101,10 +1101,14 @@ split_point_start: // At split points actual search starts from here
     const TTEntry* tte;
     Key posKey;
     Move ttMove, move, bestMove;
-    Value bestValue, value, ttValue, futilityValue, futilityBase;
+    Value bestValue, value, ttValue, futilityValue, futilityBase, oldAlpha;
     bool givesCheck, enoughMaterial, evasionPrunable, fromNull;
     Depth ttDepth;
 
+    // To flag BOUND_EXACT a node with eval above alpha and no available moves
+    if (PvNode)
+        oldAlpha = alpha;
+
     ss->currentMove = bestMove = MOVE_NONE;
     ss->ply = (ss-1)->ply + 1;
     fromNull = (ss-1)->currentMove == MOVE_NULL;
@@ -1291,7 +1295,7 @@ split_point_start: // At split points actual search starts from here
         return mated_in(ss->ply); // Plies to mate from the root
 
     TT.store(posKey, value_to_tt(bestValue, ss->ply),
-             PvNode && bestMove != MOVE_NONE ? BOUND_EXACT : BOUND_UPPER,
+             PvNode && bestValue > oldAlpha ? BOUND_EXACT : BOUND_UPPER,
              ttDepth, bestMove, ss->staticEval, ss->evalMargin);
 
     assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);