Sync static null conditions with real one
authorMarco Costalba <mcostalba@gmail.com>
Mon, 22 Mar 2010 07:52:04 +0000 (08:52 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 28 Mar 2010 10:53:16 +0000 (11:53 +0100)
Almost no functional change, but it seems more
in line with the meaning of static null pruning.

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

index a383385c8665d2bbfbbbe49d20b8fa0a0e34be9f..92d2eda61d188b007a9cc4f42e7cbb41c196bbee 100644 (file)
@@ -1368,11 +1368,13 @@ namespace {
 
     // Step 7. Static null move pruning
     // We're betting that the opponent doesn't have a move that will reduce
-    // the score by more than fuility_margin(depth) if we do a null move.
-    if (  !isCheck
-        && allowNullmove
-        && depth < RazorDepth
-        && refinedValue - futility_margin(depth, 0) >= beta)
+    // the score by more than futility_margin(depth) if we do a null move.
+    if (    allowNullmove
+        &&  depth < RazorDepth
+        && !isCheck
+        && !value_is_mate(beta)
+        &&  ok_to_do_nullmove(pos)
+        &&  refinedValue >= beta + futility_margin(depth, 0))
         return refinedValue - futility_margin(depth, 0);
 
     // Step 8. Null move search with verification search
@@ -1388,8 +1390,6 @@ namespace {
     {
         ss[ply].currentMove = MOVE_NULL;
 
-        pos.do_null_move(st);
-
         // Null move dynamic reduction based on depth
         int R = 3 + (depth >= 5 * OnePly ? depth / 8 : 0);
 
@@ -1397,6 +1397,8 @@ namespace {
         if (refinedValue - beta > PawnValueMidgame)
             R++;
 
+        pos.do_null_move(st);
+
         nullValue = -search(pos, ss, -(beta-1), depth-R*OnePly, ply+1, false, threadID);
 
         pos.undo_null_move();