if ( depth >= 12
&& !stop
&& PVSize == 1
+ && bestValue > VALUE_MATED_IN_MAX_PLY
&& ( RootMoves.size() == 1
|| Time::now() - SearchTime > (TimeMgr.available_time() * 20) / 100))
{
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
&& ttMove == MOVE_NONE
&& (PvNode || (!inCheck && ss->staticEval + Value(256) >= beta)))
{
- Depth d = (PvNode ? depth - 2 * ONE_PLY : depth / 2);
+ Depth d = depth - 2 * ONE_PLY - (PvNode ? DEPTH_ZERO : depth / 4);
ss->skipNullMove = true;
search<PvNode ? PV : NonPV>(pos, ss, alpha, beta, d);
&& !captureOrPromotion
&& !inCheck
&& !dangerous
- && move != ttMove)
+ && move != ttMove
+ && bestValue > VALUE_MATED_IN_MAX_PLY)
{
// Move count based pruning
if ( depth < 16 * ONE_PLY
if (futilityValue < beta)
{
+ bestValue = std::max(bestValue, futilityValue);
+
if (SpNode)
+ {
splitPoint->mutex.lock();
-
+ if (bestValue > splitPoint->bestValue)
+ splitPoint->bestValue = bestValue;
+ }
continue;
}
// Prune moves with negative SEE at low depths
- if ( predictedDepth < 3 * ONE_PLY
+ if ( predictedDepth < 4 * ONE_PLY
&& pos.see_sign(move) < 0)
{
if (SpNode)
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;