Late Move Reduction (LMR) assumes move ordering works: if move #8 at this node is still quiet and unordered low,
it probably loses. Search at
depth ā R instead of full depth. If the reduced search fail-highs (score ℠β),
re-search at full depth ā the move might be a hidden tactic. LMR is one of the biggest node savers in modern engines.Visual
Move Index vs Search Depth
#1PV / TT movedepth D
#2Killer / good capturedepth D
#3History movedepth D
#8Late quiet movedepth Dā2
#12Late quiet movedepth Dā3
R=1ā3Typical reduction
ā„4thMove index threshold
Re-searchOn fail-high
PVSRequired framework
reduction = lmrTable[depth][moveIndex];
if (reduction > 0 && !isCapture && !givesCheck)
score = -search(depth - 1 - reduction, -alpha - 1, -alpha); // null window
else
score = -search(depth - 1, -beta, -alpha);
if (score > alpha && reduction > 0)
score = -search(depth - 1, -beta, -alpha); // full re-search
| Condition | Reduce? |
|---|---|
| First few moves / PV node | No |
| Captures & checks | No (or smaller R) |
| In check | No |
| Depth ⤠2 | No |
| Late quiet move, depth ā„ 3 | Yes ā R from table |
Implementation tips
- R depends on depth and move index ā 2D tuning table, not a constant
- Requires good move ordering (TT, killers, history) or LMR causes mistakes
- Clamped re-search prevents tactical oversights
- History/gravity bonuses increase R for historically bad moves
Related: Null Move Pruning Ā· Aspiration Windows Ā· All Blogs