if (nullValue >= VALUE_MATE_IN_MAX_PLY)
nullValue = beta;
- if (depth < 6 * ONE_PLY)
+ if (depth < 12 * ONE_PLY)
return nullValue;
// Do verification search at high depths
// but fixing this made program slightly weaker.
Depth predictedDepth = newDepth - reduction<PvNode>(depth, moveCount);
futilityValue = ss->staticEval + ss->evalMargin + futility_margin(predictedDepth, moveCount)
- + 2 * Gain[pos.piece_moved(move)][to_sq(move)];
+ + Gain[pos.piece_moved(move)][to_sq(move)];
if (futilityValue < beta)
{
continue;
}
- // Prune moves with negative or equal SEE
+ // Prune moves with negative or equal SEE.
+ // Also prune moves with positive SEE where capturing loses a tempo and SEE < beta - futilityBase.
if ( futilityBase < beta
&& depth < DEPTH_ZERO
- && pos.see(move) <= 0)
+ && pos.see_asymm(move, beta - futilityBase) <= 0)
{
bestValue = std::max(bestValue, futilityBase);
continue;