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);
moveIsCheck = pos.move_is_check(move, ci);
captureOrPromotion = pos.move_is_capture_or_promotion(move);
- movesSearched[moveCount++] = ss[ply].currentMove = move;
+ movesSearched[moveCount++] = move;
// Decide the new search depth
ext = extension(pos, move, true, captureOrPromotion, moveIsCheck, singleReply, mateThreat, &dangerous);
+
+ // Only move extension
+ if ( moveCount == 1
+ && ext < OnePly
+ && depth >= 4 * 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, Max(Min(depth / 2, depth - 4 * OnePly), OnePly), ply, false, threadID, tte->move());
+ if (excValue < ttValue - OnlyMoveMargin)
+ ext = OnePly;
+ }
+ }
+
newDepth = depth - OnePly + ext;
+ // Update current move
+ ss[ply].currentMove = move;
+
// Make and search the move
pos.do_move(move, st, ci, moveIsCheck);
moveIsCheck = pos.move_is_check(move, ci);
captureOrPromotion = pos.move_is_capture_or_promotion(move);
- movesSearched[moveCount++] = ss[ply].currentMove = move;
+ movesSearched[moveCount++] = move;
// 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 >= 4 * 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, Max(Min(depth / 2, depth - 4 * OnePly), OnePly), ply, false, threadID, tte->move());
+ if (excValue < ttValue - OnlyMoveMargin)
+ ext = (depth >= 8 * OnePly)? OnePly : ext + OnePly / 2;
+ }
+ }
+
newDepth = depth - OnePly + ext;
+ // Update current move
+ ss[ply].currentMove = move;
+
// Futility pruning
if ( useFutilityPruning
&& !dangerous