TT.refresh(tte);
ss->currentMove = ttMove; // Can be MOVE_NONE
+ // Update killers, history, and counter move on TT hit
if ( ttValue >= beta
&& ttMove
&& !pos.capture_or_promotion(ttMove)
{
ss->killers[1] = ss->killers[0];
ss->killers[0] = ttMove;
+
+ Value bonus = Value(int(depth) * int(depth));
+ History.update(pos.moved_piece(ttMove), to_sq(ttMove), bonus);
+
+ if (is_ok((ss-1)->currentMove))
+ {
+ Square prevMoveSq = to_sq((ss-1)->currentMove);
+ Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, ttMove);
+ }
}
return ttValue;
}
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d, true);
+ // Research at intermediate depth if reduction is very high
+ if (value > alpha && ss->reduction >= 4 * ONE_PLY)
+ {
+ Depth d2 = std::max(newDepth - 2 * ONE_PLY, ONE_PLY);
+ value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d2, true);
+ }
+
doFullDepthSearch = (value > alpha && ss->reduction != DEPTH_ZERO);
ss->reduction = DEPTH_ZERO;
}