Skip to content

Commit

Permalink
Introduce Fractional LMR
Browse files Browse the repository at this point in the history
Tuning Run (90k Games):
https://tests.stockfishchess.org/tests/view/67202b1c86d5ee47d953d442

Passed STC:
LLR: 2.94 (-2.94,2.94) <0.00,2.00>
Total: 241024 W: 62616 L: 62001 D: 116407
Ptnml(0-2): 716, 28231, 62015, 28822, 728
https://tests.stockfishchess.org/tests/view/6725196786d5ee47d953d9f2

Passed LTC:
LLR: 2.95 (-2.94,2.94) <0.50,2.50>
Total: 92532 W: 23678 L: 23246 D: 45608
Ptnml(0-2): 45, 9981, 25797, 10383, 60
https://tests.stockfishchess.org/tests/view/6727d3cb86d5ee47d953db9d

closes #5667

Bench: 1066071
  • Loading branch information
xu-shawn authored and Disservin committed Nov 13, 2024
1 parent f77bac3 commit cc5c67c
Showing 1 changed file with 13 additions and 12 deletions.
25 changes: 13 additions & 12 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ Value Search::Worker::search(
mp.skip_quiet_moves();

// Reduced depth of the next LMR search
int lmrDepth = newDepth - r;
int lmrDepth = newDepth - r / 1024;

if (capture || givesCheck)
{
Expand Down Expand Up @@ -1156,36 +1156,36 @@ Value Search::Worker::search(

// Decrease reduction if position is or has been on the PV (~7 Elo)
if (ss->ttPv)
r -= 1 + (ttData.value > alpha) + (ttData.depth >= depth);
r -= 1024 + (ttData.value > alpha) * 1024 + (ttData.depth >= depth) * 1024;

// Decrease reduction for PvNodes (~0 Elo on STC, ~2 Elo on LTC)
if (PvNode)
r--;
r -= 1024;

// These reduction adjustments have no proven non-linear scaling

// Increase reduction for cut nodes (~4 Elo)
if (cutNode)
r += 2 - (ttData.depth >= depth && ss->ttPv);
r += 2518 - (ttData.depth >= depth && ss->ttPv) * 991;

// Increase reduction if ttMove is a capture but the current move is not a capture (~3 Elo)
if (ttCapture && !capture)
r += 1 + (depth < 8);
r += 1043 + (depth < 8) * 999;

// Increase reduction if next ply has a lot of fail high (~5 Elo)
if ((ss + 1)->cutoffCnt > 3)
r += 1 + allNode;
r += 938 + allNode * 960;

// For first picked move (ttMove) reduce reduction (~3 Elo)
else if (move == ttData.move)
r -= 2;
r -= 1879;

ss->statScore = 2 * thisThread->mainHistory[us][move.from_to()]
+ (*contHist[0])[movedPiece][move.to_sq()]
+ (*contHist[1])[movedPiece][move.to_sq()] - 4410;

// Decrease/increase reduction for moves with a good/bad history (~8 Elo)
r -= ss->statScore / 11016;
r -= ss->statScore * 1287 / 16384;

// Step 17. Late moves reduction / extension (LMR, ~117 Elo)
if (depth >= 2 && moveCount > 1)
Expand All @@ -1195,7 +1195,7 @@ Value Search::Worker::search(
// beyond the first move depth.
// To prevent problems when the max value is less than the min value,
// std::clamp has been replaced by a more robust implementation.
Depth d = std::max(1, std::min(newDepth - r, newDepth + !allNode));
Depth d = std::max(1, std::min(newDepth - r / 1024, newDepth + !allNode));

value = -search<NonPV>(pos, ss + 1, -(alpha + 1), -alpha, d, true);

Expand Down Expand Up @@ -1223,10 +1223,11 @@ Value Search::Worker::search(
{
// Increase reduction if ttMove is not present (~6 Elo)
if (!ttData.move)
r += 2;
r += 2037;

// Note that if expected reduction is high, we reduce search depth by 1 here (~9 Elo)
value = -search<NonPV>(pos, ss + 1, -(alpha + 1), -alpha, newDepth - (r > 3), !cutNode);
value =
-search<NonPV>(pos, ss + 1, -(alpha + 1), -alpha, newDepth - (r > 2983), !cutNode);
}

// For PV nodes only, do a full PV search on the first move or after a fail high,
Expand Down Expand Up @@ -1700,7 +1701,7 @@ Value Search::Worker::qsearch(Position& pos, Stack* ss, Value alpha, Value beta)

Depth Search::Worker::reduction(bool i, Depth d, int mn, int delta) const {
int reductionScale = reductions[d] * reductions[mn];
return (reductionScale + 1239 - delta * 795 / rootDelta) / 1024 + (!i && reductionScale > 1341);
return (reductionScale + 1239 - delta * 795 / rootDelta) + (!i && reductionScale > 1341) * 1135;
}

// elapsed() returns the time elapsed since the search started. If the
Expand Down

0 comments on commit cc5c67c

Please sign in to comment.