Tetrarch v2
v2 -- late move reductions. Quiet moves tried late are searched shallower
with a null window, at full depth only if one raises alpha. It is the first
feature to attack the branching factor rather than assume the ordering is
already good, and that is why it paid where two others did not.
Elo | +35.07 +- 6.51 (95%)
SPRT | none -- sprt.py not built yet; fixed-N campaign
Conf | FIXED NODES 20000, Hash=256MB, classic/Teams, 111 workers
Games | N: 10000 (2500 openings x 4 rotations) score 5503.0 (55.03%)
Dist | 88, 12, 415, 39, 1002, 45, 681, 16, 202
Null | -2.64 +- 6.24 on the same harness, 10000 games
Base | vs v1
Bench | 93,846,865 perft nodes (unchanged; the bench is perft, not search)
Pins | classic d5: 83,805 -> 17,772 search nodes (21.2%)
Screened +24.53 +- 14.19 over 2000 first. Reduction table
0.75 + log(depth)*log(move)/2.25, with LMRMinDepth and LMRMinMove exposed
so the recipe is tunable without a rebuild.
Not exact -- it can miss a line the full search would find -- which is why it
needed games rather than a node count. selftest's minimax oracle turns it off
for its comparison, since the oracle would otherwise be checking plain
alpha-beta against a search deliberately allowed to differ.
Search
- LMR -- depth >= 3, after 3 moves, quiet moves only, never in check.
Mean depth at 20,000 nodes: 3.73 -> 4.25 over 40 positions.
Rejected in the same window, kept dormant with their verdicts
- History heuristic -- 16% fewer nodes at depth 7-8 and nothing at 5-6, but
the engine reaches median depth 4 at the campaign instrument. Screening it
there would have measured noise and returned a confident null about a feature
that never engaged. Not screened; gate closed before spending games. - Principal variation search -- 118.9% of baseline nodes at depth 4, 115.3%
at 5. It makes the tree BIGGER where this engine searches, because it pays a
re-search whenever a later move beats alpha. Not screened; it would lose, and
the loss would be a statement about the ordering rather than about PVS.