summaryrefslogtreecommitdiff
path: root/src/split.c
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2026-10-05 09:01:25 -0700
committerScott Gasch <[email protected]>2026-10-05 09:01:25 -0700
commit64b5d3307a7a95975f7f8c0248f3f1febedd8617 (patch)
tree993fffd62a68bec962261caf033a8f05c6370ea9 /src/split.c
parentbbdf1bda8f410df6aa9be0a38e71b7db04982198 (diff)
Continue dynamic move-ordering/LMR session: SPRT-validated at 1770+ games
Gate match vs head (st4.0) shows LLR=+2.89 approaching the H1=+2.94 bound, candidate score 0.5324 (LOWER95=0.5092, ELO=+22.6+/-16.2), candidate depth/ebf both improved (13.98 vs 13.61 avg depth, ebf 3.324 vs 3.464) with comparable nps -- consistent with real search-efficiency gains rather than noise. match_play.py gets additional instrumentation to report these stats; search.c/searchsup.c/generate.c/chess.h/eval.c carry the underlying move-ordering/LMR changes from this session's line of work. Co-Authored-By: Claude Sonnet 5 <[email protected]>
Diffstat (limited to 'src/split.c')
-rw-r--r--src/split.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/src/split.c b/src/split.c
index 22d8038..abb6a11 100644
--- a/src/split.c
+++ b/src/split.c
@@ -1094,7 +1094,11 @@ Return value:
uOrigDepth = g_SplitInfo[u].uDepth;
ctx->sSearchFlags = g_SplitInfo[u].sSearchFlags;
SCORE iEval = g_SplitInfo[u].iEval;
- SCORE iImprovement = g_SplitInfo[u].iImprovement;
+ // iImprovement (g_SplitInfo[u].iImprovement) is no longer read here
+ // -- GetLMRReduction dropped that parameter (2026-10-04, see its
+ // own routine-description comment: declared, never read in the
+ // body). Still stored into g_SplitInfo by the originating thread
+ // (search.c/searchsup.c's split setup) for any other consumer.
do
{
@@ -1185,38 +1189,50 @@ Return value:
(!IS_CAPTURE_OR_PROMOTION(mv)) &&
(!IS_CHECKING_MOVE(mv)))
{
- // 2026-10-02: GetLMRReduction now also folds in the
- // joint-table extra-reduction decision (searchsup.c),
- // which needs EstimateHangingMaterialCp's attack-table
- // snapshots -- never available here (this thread has
+ // 2026-10-04: GetLMRReduction no longer looks up the
+ // dynamic FH rate or the joint table's static
+ // prediction itself -- search.c's non-split move loop
+ // looks these up once per move and passes them in now
+ // (see its hoisted per-move lookup block). This call
+ // site has no such shared lookup to reuse, so it does
+ // its own, matching what GetLMRReduction used to do
+ // internally. EstimateHangingMaterialCp still gets
+ // all-zero attack-table snapshots -- this thread has
// no access to the originating node's Search()-local
// bbMinorAttacksSnapshot/bbRookAttacksSnapshot, same
// reason this call site never got the joint-table
- // treatment at all before today). Pass all-zero
- // arrays: EstimateHangingMaterialCp degrades safely on
- // zeros (every "attacked by X" snapshot check becomes
- // unconditionally false), the same already-accepted
- // degradation search.c's own move loop uses when ITS
- // snapshot is stale (see search.c's
+ // treatment at all before 2026-10-02. It degrades
+ // safely on zeros (every "attacked by X" snapshot
+ // check becomes unconditionally false), the same
+ // already-accepted degradation search.c's own move
+ // loop uses when ITS snapshot is stale (see search.c's
// fParentAttackTablesAreFresh). puExtraTier is NULL --
// this call site has no joint-extra-tier re-search/
// calibration instrumentation to feed.
BITBOARD bbNoMinorAttacksSnapshot[2] = { 0, 0 };
BITBOARD bbNoRookAttacksSnapshot[2] = { 0, 0 };
- INT iLMR = GetLMRReduction(iEval,
- iAlpha,
- iBeta,
- iImprovement,
- ctx,
+ ULONG uSplitLegalMoves = (g_SplitInfo[u].uAlreadyDone +
+ uMoveNum + 1);
+ ULONG uSplitFHAttempts = 0;
+ ULONG uSplitFHPctThousandths =
+ GetMoveFailHighPctThousandths(mv, &uSplitFHAttempts);
+ SCORE iSplitHangCp = EstimateHangingMaterialCp(
+ ctx, mv, uSplitLegalMoves,
+ bbNoMinorAttacksSnapshot,
+ bbNoRookAttacksSnapshot);
+ ULONG uSplitPredictedFH = _JointTablePredictedFHThousandths(
+ DepthBucket(uDepth / ONE_PLY),
+ HangCpBucket(iSplitHangCp),
+ GapCpBucket((SCORE)(iAlpha - iEval)),
+ MoveNumBucket(uSplitLegalMoves));
+ INT iLMR = GetLMRReduction(ctx,
uDepth,
- (g_SplitInfo[u].uAlreadyDone +
- uMoveNum + 1),
+ uSplitLegalMoves,
mv,
- (g_SplitInfo[u].uAlreadyDone +
- uMoveNum + 1),
iExtend,
- bbNoMinorAttacksSnapshot,
- bbNoRookAttacksSnapshot,
+ uSplitFHAttempts,
+ uSplitFHPctThousandths,
+ uSplitPredictedFH,
NULL);
if (iLMR < 0)
{