summaryrefslogtreecommitdiff
path: root/src/generate.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/generate.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/generate.c')
-rw-r--r--src/generate.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/generate.c b/src/generate.c
index dd9fba5..f41a3b6 100644
--- a/src/generate.c
+++ b/src/generate.c
@@ -4215,9 +4215,20 @@ Return value:
#ifdef DEBUG
else
{
+ // 2026-10-04: no longer subtracts VALUE_KING here.
+ // That made this capture's stored iValue differ
+ // between DEBUG and release builds for no checked
+ // reason (the ASSERT it fed was tautological --
+ // already true by construction, this being the
+ // else of `s >= 0` above) -- a silent landmine:
+ // ComputeMoveScore/DecodeMoveValueEstimate's
+ // MOVE_SCORING_NORMAL case trusts this value
+ // directly for a losing capture (MIN0(iRawValue)),
+ // so a DEBUG build fed EstimateHangingMaterialCp a
+ // ~VALUE_KING-inflated "hang" estimate for an
+ // ordinary losing capture, release builds never
+ // saw it. The real check is the bound just above.
ASSERT((s & STRIP_OFF_FLAGS) > -VALUE_KING);
- s -= VALUE_KING;
- ASSERT(s < 0);
}
#endif
}
@@ -4441,11 +4452,18 @@ Return value:
#ifdef DEBUG
else
{
- // Losing capture
+ // Losing capture. No `s -= VALUE_KING` here --
+ // same landmine, same fix as _ScoreAllMoves' twin
+ // of this block (2026-10-04): currently harmless in
+ // practice (DecodeMoveValueEstimate's
+ // MOVE_SCORING_ESCAPE case recomputes a capture's
+ // value straight from mv.pCaptured/mv.pMoved rather
+ // than trusting iValue), but there's no reason for
+ // this capture's stored iValue to differ between
+ // DEBUG and release builds when nothing checks the
+ // difference.
ASSERT(!IS_KING(mv.pMoved));
ASSERT((s & STRIP_OFF_FLAGS) > -VALUE_KING);
- s -= VALUE_KING;
- ASSERT(s < 0);
}
#endif
}