for (int d = 1; d < 64; ++d)
for (int mc = 1; mc < 64; ++mc)
{
- double r = log(d) * log(mc) / 2;
+ double r = log(d) * log(mc) / 1.95;
Reductions[NonPV][imp][d][mc] = int(std::round(r));
Reductions[PV][imp][d][mc] = std::max(Reductions[NonPV][imp][d][mc] - 1, 0);
Depth extension, newDepth;
Value bestValue, value, ttValue, eval;
bool ttHit, inCheck, givesCheck, singularExtensionNode, improving;
- bool captureOrPromotion, doFullDepthSearch, moveCountPruning;
+ bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets;
Piece moved_piece;
int moveCount, quietCount;
&& !excludedMove // Recursive singular search is not allowed
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY;
+ skipQuiets = false;
// Step 11. Loop through moves
// Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
- while ((move = mp.next_move()) != MOVE_NONE)
+ while ((move = mp.next_move(skipQuiets)) != MOVE_NONE)
{
assert(is_ok(move));
moveCountPruning = depth < 16 * ONE_PLY
&& moveCount >= FutilityMoveCounts[improving][depth / ONE_PLY];
- // Step 12. Extensions
- // Extend checks
- if ( givesCheck
- && !moveCountPruning
- && pos.see_ge(move, VALUE_ZERO))
- extension = ONE_PLY;
+ // Step 12. Singular and Gives Check Extensions
// 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
// ttValue minus a margin then we extend the ttMove.
if ( singularExtensionNode
&& move == ttMove
- && !extension
&& pos.legal(move))
{
Value rBeta = std::max(ttValue - 2 * depth / ONE_PLY, -VALUE_MATE);
if (value < rBeta)
extension = ONE_PLY;
}
+ else if ( givesCheck
+ && !moveCountPruning
+ && pos.see_ge(move, VALUE_ZERO))
+ extension = ONE_PLY;
// Calculate new depth for this move
newDepth = depth - ONE_PLY + extension;
&& (!pos.advanced_pawn_push(move) || pos.non_pawn_material() >= 5000))
{
// Move count based pruning
- if (moveCountPruning)
+ if (moveCountPruning) {
+ skipQuiets = true;
continue;
+ }
// Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction<PvNode>(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY;