]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Cleanup steps 12, 14
[stockfish] / src / search.cpp
index d2e3cd32caef87b97a523d53708532de0c9a0c71..f3e9c15d58776c8b79ae5e1565469763ab3bfd50 100644 (file)
@@ -181,33 +181,48 @@ namespace {
   // search when the static evaluation is at most IIDMargin below beta.
   const Value IIDMargin = Value(0x100);
 
-  // Search depth at iteration 1
-  const Depth InitialDepth = OnePly;
+  // Step 11. Decide the new search depth
 
-  // Easy move margin. An easy move candidate must be at least this much
-  // better than the second best move.
-  const Value EasyMoveMargin = Value(0x200);
+  // Extensions. Configurable UCI options.
+  // Array index 0 is used at non-PV nodes, index 1 at PV nodes.
+  Depth CheckExtension[2], SingleEvasionExtension[2], PawnPushTo7thExtension[2];
+  Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2];
+
+  const Depth SingularExtensionDepthAtPVNodes = 6 * OnePly;
+  const Depth SingularExtensionDepthAtNonPVNodes = 8 * OnePly;
 
-  // If the TT move is at least SingleReplyMargin better then the
+  // If the TT move is at least SingularExtensionMargin better then the
   // remaining ones we will extend it.
-  const Value SingleReplyMargin = Value(0x20);
+  const Value SingularExtensionMargin = Value(0x20);
+
+  // Step 12. Futility pruning
+
+  const Value FutilityMarginQS = Value(0x80);
+
+  // Futility lookup tables (initialized at startup) and their getter functions
+  int32_t FutilityMarginsMatrix[14][64]; // [depth][moveNumber]
+  int FutilityMoveCountArray[32]; // [depth]
+
+  inline Value futility_margin(Depth d, int mn) { return Value(d < 7*OnePly ? FutilityMarginsMatrix[Max(d, 0)][Min(mn, 63)] : 2 * VALUE_INFINITE); }
+  inline int futility_move_count(Depth d) { return d < 16*OnePly ? FutilityMoveCountArray[d] : 512; }
 
-  /// Lookup tables initialized at startup
+  // Step 14. Reduced search
 
-  // Reduction lookup tables and their getter functions
+  // Reduction lookup tables (initialized at startup) and their getter functions
   int8_t    PVReductionMatrix[64][64]; // [depth][moveNumber]
   int8_t NonPVReductionMatrix[64][64]; // [depth][moveNumber]
 
   inline Depth    pv_reduction(Depth d, int mn) { return (Depth)    PVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; }
   inline Depth nonpv_reduction(Depth d, int mn) { return (Depth) NonPVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; }
 
-  // Futility lookup tables and their getter functions
-  const Value FutilityMarginQS = Value(0x80);
-  int32_t FutilityMarginsMatrix[14][64]; // [depth][moveNumber]
-  int FutilityMoveCountArray[32]; // [depth]
 
-  inline Value futility_margin(Depth d, int mn) { return Value(d < 7*OnePly ? FutilityMarginsMatrix[Max(d, 0)][Min(mn, 63)] : 2 * VALUE_INFINITE); }
-  inline int futility_move_count(Depth d) { return d < 16*OnePly ? FutilityMoveCountArray[d] : 512; }
+
+  // Search depth at iteration 1
+  const Depth InitialDepth = OnePly;
+
+  // Easy move margin. An easy move candidate must be at least this much
+  // better than the second best move.
+  const Value EasyMoveMargin = Value(0x200);
 
   /// Variables initialized by UCI options
 
@@ -220,10 +235,6 @@ namespace {
   const Value LSNValue = value_from_centipawns(200);
   bool loseOnTime = false;
 
-  // Extensions. Array index 0 is used at non-PV nodes, index 1 at PV nodes.
-  Depth CheckExtension[2], SingleEvasionExtension[2], PawnPushTo7thExtension[2];
-  Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2];
-
   // Iteration counters
   int Iteration;
 
@@ -1133,7 +1144,7 @@ namespace {
       // Singular extension search. We extend the TT move if its value is much better than
       // its siblings. To verify this we do a reduced search on all the other moves but the
       // ttMove, if result is lower then ttValue minus a margin then we extend ttMove.
-      if (   depth >= 6 * OnePly
+      if (   depth >= SingularExtensionDepthAtPVNodes
           && tte
           && move == tte->move()
           && ext < OnePly
@@ -1144,9 +1155,9 @@ namespace {
 
           if (abs(ttValue) < VALUE_KNOWN_WIN)
           {
-              Value excValue = search(pos, ss, ttValue - SingleReplyMargin, depth / 2, ply, false, threadID, move);
+              Value excValue = search(pos, ss, ttValue - SingularExtensionMargin, depth / 2, ply, false, threadID, move);
 
-              if (excValue < ttValue - SingleReplyMargin)
+              if (excValue < ttValue - SingularExtensionMargin)
                   ext = OnePly;
           }
       }
@@ -1446,7 +1457,7 @@ namespace {
       // Singular extension search. We extend the TT move if its value is much better than
       // its siblings. To verify this we do a reduced search on all the other moves but the
       // ttMove, if result is lower then ttValue minus a margin then we extend ttMove.
-      if (   depth >= 8 * OnePly
+      if (   depth >= SingularExtensionDepthAtNonPVNodes
           && tte
           && move == tte->move()
           && !excludedMove // Do not allow recursive single-reply search
@@ -1458,9 +1469,9 @@ namespace {
 
           if (abs(ttValue) < VALUE_KNOWN_WIN)
           {
-              Value excValue = search(pos, ss, ttValue - SingleReplyMargin, depth / 2, ply, false, threadID, move);
+              Value excValue = search(pos, ss, ttValue - SingularExtensionMargin, depth / 2, ply, false, threadID, move);
 
-              if (excValue < ttValue - SingleReplyMargin)
+              if (excValue < ttValue - SingularExtensionMargin)
                   ext = OnePly;
           }
       }
@@ -1484,7 +1495,7 @@ namespace {
               continue;
 
           // Value based pruning
-          Depth predictedDepth = newDepth - nonpv_reduction(depth, moveCount); //FIXME: We are ignoring condition: depth >= 3*OnePly, BUG??
+          Depth predictedDepth = newDepth - nonpv_reduction(depth, moveCount); // We illogically ignore reduction condition depth >= 3*OnePly
           futilityValueScaled =  ss[ply].eval + futility_margin(predictedDepth, moveCount)
                                + H.gain(pos.piece_on(move_from(move)), move_to(move)) + 45;