goto moves_loop;
}
else if (excludedMove) {
- // excludeMove implies that we had a ttHit on the containing non-excluded search with ss->staticEval filled from TT
- // However static evals from the TT aren't good enough (-13 elo), presumably due to changing optimism context
- // Recalculate value with current optimism (without updating thread avgComplexity)
- ss->staticEval = eval = evaluate(pos, &complexity);
+ // Providing the hint that this node's accumulator will be used often brings significant Elo gain (13 elo)
+ Eval::NNUE::hint_common_parent_position(pos);
+ eval = ss->staticEval;
+ complexity = abs(ss->staticEval - pos.psq_eg_stm());
}
else if (ss->ttHit)
{
ss->staticEval = eval = evaluate(pos, &complexity);
else // Fall back to (semi)classical complexity for TT hits, the NNUE complexity is lost
complexity = abs(ss->staticEval - pos.psq_eg_stm());
- thisThread->complexityAverage.update(complexity);
// ttValue can be used as a better position evaluation (~7 Elo)
if ( ttValue != VALUE_NONE
else
{
ss->staticEval = eval = evaluate(pos, &complexity);
- thisThread->complexityAverage.update(complexity);
-
// Save static evaluation into transposition table
tte->save(posKey, VALUE_NONE, ss->ttPv, BOUND_NONE, DEPTH_NONE, MOVE_NONE, eval);
}
+ thisThread->complexityAverage.update(complexity);
// Use static evaluation difference to improve quiet move ordering (~4 Elo)
if (is_ok((ss-1)->currentMove) && !(ss-1)->inCheck && !priorCapture)
Value delta = beta - alpha;
+ Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta);
+
// Step 14. Pruning at shallow depth (~120 Elo). Depth conditions are important for mate finding.
if ( !rootNode
&& pos.non_pawn_material(us)
moveCountPruning = moveCount >= futility_move_count(improving, depth);
// Reduced depth of the next LMR search
- int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, delta, thisThread->rootDelta), 0);
+ int lmrDepth = std::max(newDepth - r, 0);
if ( capture
|| givesCheck)
// Step 16. Make the move
pos.do_move(move, st, givesCheck);
- Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta);
-
// Decrease reduction if position is or has been on the PV
// and node is not likely to fail low. (~3 Elo)
if ( ss->ttPv
quietsSearched, quietCount, capturesSearched, captureCount, depth);
// Bonus for prior countermove that caused the fail low
- else if ( (depth >= 5 || PvNode || bestValue < alpha - 65 * depth)
- && !priorCapture)
+ else if (!priorCapture)
{
// Extra bonuses for PV/Cut nodes or bad fail lows
- int bonus = 1 + (PvNode || cutNode) + (bestValue < alpha - 88 * depth);
+ int bonus = (depth > 4) + (PvNode || cutNode) + (bestValue < alpha - 88 * depth);
update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, stat_bonus(depth) * bonus);
}