Only move extension based on exclusion search
authorJoona Kiiski <joona.kiiski@gmail.com>
Sat, 21 Nov 2009 13:22:52 +0000 (15:22 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 23 Nov 2009 20:00:13 +0000 (21:00 +0100)
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index 98bf24a828e7174e48d4687785b7579b81e3406f..d0ddbd55045639a4e0a0ea87b8d46753c015bb83 100644 (file)
@@ -172,6 +172,9 @@ namespace {
   const bool PruneDefendingMoves = false;
   const bool PruneBlockingMoves  = false;
 
   const bool PruneDefendingMoves = false;
   const bool PruneBlockingMoves  = false;
 
+  // Only move margin
+  const Value OnlyMoveMargin = Value(100);
+
   // Margins for futility pruning in the quiescence search, and at frontier
   // and near frontier nodes.
   const Value FutilityMarginQS = Value(0x80);
   // Margins for futility pruning in the quiescence search, and at frontier
   // and near frontier nodes.
   const Value FutilityMarginQS = Value(0x80);
@@ -1136,6 +1139,25 @@ namespace {
 
       // Decide the new search depth
       ext = extension(pos, move, true, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
 
       // Decide the new search depth
       ext = extension(pos, move, true, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
+
+      // Only move extension
+      if (   moveCount == 1
+          && ext < OnePly
+          && depth >= 8 * OnePly
+          && tte
+          && (tte->type() & VALUE_TYPE_LOWER)
+          && tte->move() != MOVE_NONE
+          && tte->depth() >= depth - 3 * OnePly)
+      {
+          Value ttValue = value_from_tt(tte->value(), ply);
+          if (abs(ttValue) < VALUE_KNOWN_WIN)
+          {
+              Value excValue = search(pos, ss, ttValue - OnlyMoveMargin, depth / 2, ply, false, threadID, tte->move());
+              if (excValue < ttValue - OnlyMoveMargin)
+                  ext = OnePly;
+          }
+      }
+
       newDepth = depth - OnePly + ext;
 
       // Make and search the move
       newDepth = depth - OnePly + ext;
 
       // Make and search the move
@@ -1416,6 +1438,26 @@ namespace {
 
       // Decide the new search depth
       ext = extension(pos, move, false, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
 
       // Decide the new search depth
       ext = extension(pos, move, false, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
+
+      // Only move extension
+      if (   forbiddenMove == MOVE_NONE
+          && moveCount == 1
+          && ext < OnePly
+          && depth >= 8 * OnePly
+          && tte
+          && (tte->type() & VALUE_TYPE_LOWER)
+          && tte->move() != MOVE_NONE
+          && tte->depth() >= depth - 3 * OnePly)
+      {
+          Value ttValue = value_from_tt(tte->value(), ply);
+          if (abs(ttValue) < VALUE_KNOWN_WIN)
+          {
+              Value excValue = search(pos, ss, ttValue - OnlyMoveMargin, depth / 2, ply, false, threadID, tte->move());
+              if (excValue < ttValue - OnlyMoveMargin)
+                  ext = OnePly;
+          }
+      }
+
       newDepth = depth - OnePly + ext;
 
       // Futility pruning
       newDepth = depth - OnePly + ext;
 
       // Futility pruning