diff options
| author | Scott Gasch <[email protected]> | 2026-10-05 09:01:25 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2026-10-05 09:01:25 -0700 |
| commit | 64b5d3307a7a95975f7f8c0248f3f1febedd8617 (patch) | |
| tree | 993fffd62a68bec962261caf033a8f05c6370ea9 /src/split.c | |
| parent | bbdf1bda8f410df6aa9be0a38e71b7db04982198 (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.c | 60 |
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) { |
