Retire all extensions (but checks) for non-PV nodes
authorMarco Costalba <mcostalba@gmail.com>
Wed, 7 Dec 2011 06:45:44 +0000 (07:45 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 7 Dec 2011 06:49:24 +0000 (07:49 +0100)
It seems we don't have any added value. Note that the
moves that were used to be extended are still flagged
as dangerous so to avoid at least pruning them.

After 9555 games
Mod vs Orig 1562 - 1540 - 6453 ELO +0 (+- 4)

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

index 3cae0e3fa2095c10ab08378cb142a3be37cc68cf..d1504e323e779671ddf2e1a88e1034132793769b 100644 (file)
@@ -95,8 +95,6 @@ namespace {
   const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 };
   inline bool piece_is_slider(Piece p) { return Slidings[p]; }
 
-  // Step 6. Razoring
-
   // Maximum depth for razoring
   const Depth RazorDepth = 4 * ONE_PLY;
 
@@ -106,8 +104,6 @@ namespace {
   // Maximum depth for use of dynamic threat detection when null move fails low
   const Depth ThreatDepth = 5 * ONE_PLY;
 
-  // Step 9. Internal iterative deepening
-
   // Minimum depth for use of internal iterative deepening
   const Depth IIDDepth[] = { 8 * ONE_PLY, 5 * ONE_PLY };
 
@@ -115,19 +111,9 @@ namespace {
   // when the static evaluation is bigger then beta - IIDMargin.
   const Value IIDMargin = Value(0x100);
 
-  // Step 11. Decide the new search depth
-
-  // Extensions. Array index 0 is used for non-PV nodes, index 1 for PV nodes
-  const Depth CheckExtension[]         = { ONE_PLY / 2, ONE_PLY / 1 };
-  const Depth PawnEndgameExtension[]   = { ONE_PLY / 1, ONE_PLY / 1 };
-  const Depth PawnPushTo7thExtension[] = { ONE_PLY / 2, ONE_PLY / 2 };
-  const Depth PassedPawnExtension[]    = {  DEPTH_ZERO, ONE_PLY / 2 };
-
   // Minimum depth for use of singular extension
   const Depth SingularExtensionDepth[] = { 8 * ONE_PLY, 6 * ONE_PLY };
 
-  // Step 12. Futility pruning
-
   // Futility margin for quiescence search
   const Value FutilityMarginQS = Value(0x80);
 
@@ -146,8 +132,6 @@ namespace {
     return d < 16 * ONE_PLY ? FutilityMoveCounts[d] : MAX_MOVES;
   }
 
-  // Step 14. Reduced search
-
   // Reduction lookup tables (initialized at startup) and their access function
   int8_t Reductions[2][64][64]; // [pv][depth][moveNumber]
 
@@ -248,49 +232,28 @@ namespace {
     return os;
   }
 
-  // extension() decides whether a move should be searched with normal depth,
-  // or with extended depth. Certain classes of moves (checking moves, in
-  // particular) are searched with bigger depth than ordinary moves and in
-  // any case are marked as 'dangerous'. Note that also if a move is not
-  // extended, as example because the corresponding UCI option is set to zero,
-  // the move is marked as 'dangerous' so, at least, we avoid to prune it.
-  template <bool PvNode>
-  FORCE_INLINE Depth extension(const Position& pos, Move m, bool captureOrPromotion,
-                               bool moveIsCheck, bool* dangerous) {
-    assert(m != MOVE_NONE);
-
-    Depth result = DEPTH_ZERO;
-    *dangerous = moveIsCheck;
-
-    if (moveIsCheck && pos.see_sign(m) >= 0)
-        result += CheckExtension[PvNode];
+  // is_dangerous() checks whether a move belongs to some classes of known
+  // 'dangerous' moves so that we avoid to prune it.
+  FORCE_INLINE bool is_dangerous(const Position& pos, Move m, bool captureOrPromotion) {
 
+    // Test for a pawn pushed to 7th or a passed pawn move
     if (type_of(pos.piece_on(move_from(m))) == PAWN)
     {
         Color c = pos.side_to_move();
-        if (relative_rank(c, move_to(m)) == RANK_7)
-        {
-            result += PawnPushTo7thExtension[PvNode];
-            *dangerous = true;
-        }
-        if (pos.pawn_is_passed(c, move_to(m)))
-        {
-            result += PassedPawnExtension[PvNode];
-            *dangerous = true;
-        }
+        if (   relative_rank(c, move_to(m)) == RANK_7
+            || pos.pawn_is_passed(c, move_to(m)))
+            return true;
     }
 
+    // Test for a capture that triggers a pawn endgame
     if (   captureOrPromotion
         && type_of(pos.piece_on(move_to(m))) != PAWN
         && (  pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
             - PieceValueMidgame[pos.piece_on(move_to(m))] == VALUE_ZERO)
         && !is_special(m))
-    {
-        result += PawnEndgameExtension[PvNode];
-        *dangerous = true;
-    }
+        return true;
 
-    return std::min(result, ONE_PLY);
+    return false;
   }
 
 } // namespace
@@ -1032,11 +995,17 @@ split_point_start: // At split points actual search starts from here
       }
 
       isPvMove = (PvNode && moveCount <= 1);
-      givesCheck = pos.move_gives_check(move, ci);
       captureOrPromotion = pos.is_capture_or_promotion(move);
+      givesCheck = pos.move_gives_check(move, ci);
+      dangerous = givesCheck || is_dangerous(pos, move, captureOrPromotion);
+      ext = DEPTH_ZERO;
+
+      // Step 12. Extend checks and, in PV nodes, also dangerous moves
+      if (PvNode && dangerous)
+          ext = ONE_PLY;
 
-      // Step 12. Decide the new search depth
-      ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
+      else if (givesCheck && pos.see_sign(move) >= 0)
+          ext = PvNode ? ONE_PLY : ONE_PLY / 2;
 
       // Singular extension search. If all moves but one fail low on a search of
       // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
@@ -1044,9 +1013,9 @@ split_point_start: // At split points actual search starts from here
       // on all the other moves but the ttMove, if result is lower than ttValue minus
       // a margin then we extend ttMove.
       if (   singularExtensionNode
+          && !ext
           && move == ttMove
-          && pos.pl_move_is_legal(move, ci.pinned)
-          && ext < ONE_PLY)
+          && pos.pl_move_is_legal(move, ci.pinned))
       {
           Value ttValue = value_from_tt(tte->value(), ss->ply);