Releases: maelic13/rarog
Release list
Rarog 2.2.0
Rarog 2.2.0 fits the engine's evaluation to data. Phase 3 rebuilt the eval as a
fully parameterised, trace-instrumented function (every term seeded inert, so the
rewrite was bench-identical), and Phase 4 then fit that enlarged eval to a 2.19M-position
self-play set — a staged offline Texel tune, each stage SPRT-gated. This is the single
largest strength jump in the project so far.
Against an external field, Rarog 2.2.0 plays roughly +240 Elo stronger than 2.1.0,
placing it at approximately 3000 CCRL.
Added
- King-danger evaluation — a single danger accumulator (attacker units, safe checks,
weak king-ring, king flank, pawnless flank, queen relief) feeding a non-linear
danger→score curve. - Threat evaluation v2 — per-victim threat-by-minor/rook tables, a refined
weakly-defended-piece term (which retired the old flat hanging penalty), safe-pawn-push
threats, and weak-piece / restricted-square terms. - Per-count mobility tables for knight/bishop/rook/queen, replacing the flat per-move bonus.
- Expanded pawn-structure & passed-pawn evaluation — rank-scaled connected pawns,
supported / free-stop / safe-stop / candidate passers, blocked-passer and ideal-blockader
terms, plus assorted positional terms (outposts, rook files/7th, bishop long-diagonal,
space, king-centrality danger). - Material-imbalance evaluation — symmetric per-piece-pair quadratic.
- Exact endgame knowledge — a KPK bitbase plus scale-factor handling for known
drawish/won material (KBNK mating drive, wrong-corner bishop, opposite-coloured bishops,
bare-rook and insufficient-material draws). - Eval cache + lazy-eval fast path — a whole-position cache and a fast path that skips
the expensive positional terms when the material+PST margin is already decisive. - Offline Texel-tuning tooling under
tools/texel-tuner/andtools/texel/.
Changed
- Material values and piece-square tables refit against the now-complete term set
(classical piece ratios preserved). - The
benchfingerprint changed as eval behaviour changed.
Binaries
Use the most advanced asset your CPU supports (pext for BMI2/PEXT CPUs, avx2 for
x86-64-v3, plain x86-64 for maximum compatibility, arm64 for ARM). Binaries are built
with portable CPU targets and attached automatically below.
Full changelog: v2.1.0...v2.2.0
Rarog 2.1.0
The release focuses on a repo-contained SPRT/SPSA testing
harness and a long sequence of individually gated search-tuning and
robustness fixes. The single largest change is a Stockfish-style
time-management rewrite that fixed a movetime budget bug — by far the
dominant contributor to the cumulative strength gain.
Highlights
- Time management rewrite (+81 Elo, confirmed by SPRT): fixed a bug where
a small movetime budget (e.g. 100 ms/move) collapsed search to depth 1
because the move-overhead subtraction could reduce the budget to ~1 ms.
Clock-mode budgeting now follows Stockfish's structure (optimum/maximum
scaling, falling-eval / best-move-instability / effort-factor stopping). - Time-safety valve: eliminated clock-mode time forfeits at fast time
controls (28 forfeits in a ~2,200-game gauntlet → 0), without regressing
normal-time allocation. Re-confirmed across two independent test harnesses. - Search tuning, each independently SPRT-confirmed: quiescence TT-bound
stand-pat refinement (+6.5 Elo), per-move quiet futility pruning (+8 Elo),
a harness-corrected LMR retune (+4 Elo), and an SPSA-tuned pruning/margin
pass (+6 Elo). - New repo-local testing/tuning harness: fastchess-based SPRT, SPSA via
weather-factory, PGO test-build scripts — all repo-contained, no
machine-global paths. - Minor robustness/perf cleanup: shrunk a hot-path struct, removed a
per-call board allocation, removed a provably-dead search arm.
Evaluated and rejected (for transparency)
Several speculative ports were tried and did not survive SPRT testing, so
they were reverted rather than shipped: a ProbCut port (−24.5 Elo), history
persistence across searches (−12.4 Elo), a singular-extension
double-extension cap (inconclusive), and an LMR "do-deeper" re-search margin
(−1.4 Elo).
Full changelog: see CHANGELOG.md
Rarog 2.0.2
Rarog 2.0.2 is a tournament-stability patch release.
Fixed
- Fixed a rare quiescence-search panic that could occur when a deep tactical/check sequence reached the final fixed search-stack slot.
- This crash could prevent Rarog from reporting
bestmove; some GUIs, including Little Blitzer, could then classify the event as an illegal move even though no illegal move was actually produced.
Added
- Added a direct regression test for the quiescence maximum-ply guard.
- Added regression coverage for the two Little Blitzer artifact positions that verifies Rarog returns legal root moves.
Rarog 2.0.1
Patch release focused on search strength, time management, and release build reliability.
Added
- Added Internal Iterative Reduction for PV nodes when no usable transposition-table move is available.
- Added TT PV-node tracking so pruning and reductions can treat PV-touched nodes more carefully.
- Added history-based capture pruning for losing captures.
- Added negative capture-history updates for good captures searched before a beta cutoff.
- Added correction-history updates for Lower and Upper bound nodes, not only Exact/PV nodes.
- Added a light simple logo asset alongside the dark variant.
- Added regression coverage for short
movetimesearches, long endgame searches, and long reversible games.
Changed
- Improved aspiration windows with exponential widening after fail-high or fail-low results.
- Increased correction-history table size from 16k to 64k entries.
- Unified capture-history beta-cutoff bonus with the quiet-history bonus formula.
- Extended singular extensions to depth 4 and above.
- Extended quiet-history pruning to depth 7.
- Improved LMR re-search node-type handling.
- Parallelized transposition-table clear operations.
- Increased engine and search worker thread stack sizes to avoid stack overflow in deeper tactical/endgame searches.
- Improved time management by avoiding a new iteration when the previous iteration suggests it may overrun the hard time limit.
- Hardened PGO release training with bench timeouts and child-process cleanup.
Fixed
- Fixed short fixed-time searches so
go movetime 100completes at least depth 1 before returningbestmove. - Fixed a long-game board-history limit by restoring dynamically growing move history.
- Fixed TT PV flag handling so PV status is not incorrectly preserved across overwritten entries.
- Fixed release PGO training so a stuck or incomplete bench run fails cleanly instead of hanging.
Rarog 2.0.0
This is the first release under the new Rarog name.
The engine was previously released as Lynx through version 1.4.3. It has been renamed to avoid confusion with an existing chess engine. Old Lynx releases remain available historically; new releases will use the Rarog name going forward.
Changed
- Renamed the engine from Lynx to Rarog.
- Updated the UCI engine identity to
Rarog 2.0.0. - Updated executable names and release asset names to use
rarog. - Updated Cargo package metadata, repository links, README, changelog, tests, and build helpers.
- Renamed the internal PEXT build cfg from
lynx_pexttorarog_pext.
Compatibility Note
If you had Lynx configured in a chess GUI, add this release as a new UCI engine using the new Rarog executable. Existing Lynx binaries and old release assets are unchanged.
Lynx 1.4.3
Patch release with a small retained search update and release-build polish.
Changed
- Raised the ProbCut margin from
beta + 160tobeta + 180. - Relaxed late-move pruning thresholds so deeper late quiet moves are pruned less aggressively.
- Improved capture move ordering by using full SEE values for profitable captures instead of only threshold SEE.
- Renamed PGO build outputs to include
-pgobefore the executable suffix, so PGO and non-PGO builds can coexist intarget/dist.
Build Notes
PGO remains available through local xtask builds:
cargo xtask build --arch avx2 --pgo
cargo xtask build --arch pext --pgoPGO training remains bench-only.
Lynx 1.4.2
Lynx 1.4.2 is a release-build and CPU-target update. It adds a dedicated BMI2/PEXT x86-64 build, switches release asset generation to a cross-platform Rust xtask, adds optional PGO release builds, and removes the incomplete UCI MultiPV path.
The single-PV search and handcrafted evaluation behavior remain aligned with 1.4.1.
Added
- Added a dedicated
pextx86-64 release asset for CPUs with BMI2/PEXT support. - Added compile-time PEXT sliding-piece attack tables.
- Added a runtime BMI2 check for PEXT builds, so unsupported CPUs get a clear error instead of an illegal-instruction crash.
- Added cross-platform release builds through
cargo xtask build --arch <x86-64|avx2|pext|arm64>. - Added optional PGO builds through
cargo xtask build --arch <asset> --pgo.
Changed
- Replaced AVX-512 release assets with BMI2/PEXT assets.
- GitHub release assets are now built through
cargo xtask build. - Compacted PEXT slider metadata so PEXT builds no longer carry unused magic-bitboard fields.
- Documented PGO and asset-selection guidance in the README.
Removed
- Removed UCI
MultiPVsupport and the sequential MultiPV root-search path. This was incomplete analysis functionality and is not needed for normal tournament play.
Asset Guide
Use the most advanced binary your CPU supports:
| Asset suffix | Use when |
|---|---|
x86-64 |
Most compatible Intel/AMD 64-bit build. |
avx2 |
Intel/AMD CPU supports x86-64-v3/AVX2. |
pext |
Intel/AMD CPU supports BMI2/PEXT. Benchmark against avx2 on your CPU. |
arm64 |
ARM64 Linux, Windows on ARM, or Apple Silicon macOS. |
If unsure, use x86-64 for Intel/AMD systems or arm64 for ARM systems.
Lynx 1.4.1
This is the first public 1.4-series release. It includes the unreleased 1.4.0 TT/hash-move safety work together with 1.4.1 search hotpath and move-ordering improvements.
Highlights
- Hardened TT/hash move handling so stale, aliased, or corrupted TT moves cannot enter search or emitted PVs.
- Added validated TT-first move picking.
- Improved UCI ponder support with TT-derived ponder fallback.
- Reduced overhead in search hotpaths after the TT safety work.
- Improved quiet move ordering with direct-check bonuses and expanded low-ply history.
Fixed
- Fixed malformed TT/hash moves being accepted as searchable moves.
- Fixed illegal PV risk from stale or corrupted TT moves, including SMP/hash-aliasing cases.
- Fixed validation of impossible moves, wrong-side moves, friendly-occupied destinations, malformed king moves, and malformed special-move encodings before
make_move. - Fixed fast legal validation for recaptures that remove a checking piece, such as
...gxf6afterNxf6+.
Search And Move Ordering
- Reworked move picking to emit a validated TT move first.
- Skipped duplicate generated moves after the TT move has already been emitted.
- Added a direct-check ordering bonus for quiet checking moves.
- Expanded low-ply quiet history from 4 plies to 8 plies.
- Skipped duplicate TT capture scoring in staged move picking.
- Batched Lazy SMP shared node accounting so threaded search avoids aggregate atomic node increments on every node while still reporting exact final totals.
Ponder And PV Safety
- Added TT-derived ponder fallback from the child position when the searched PV does not already contain a ponder move.
- Ensured TT moves are canonicalized and legally validated before use in search, quiescence, PV construction, or ponder fallback.
- Added PV replay safety coverage for tournament-derived malformed TT/hash-move positions at
Threads=1andThreads=8.
Tests And Validation
- Added board-level pseudo-legal and legal move validation APIs for raw UCI or TT-shaped moves.
- Added board benchmark coverage for direct legal move validation.
- Added regression tests for:
- friendly-occupied king moves
- impossible king movement
- malformed tournament-derived TT moves
- pseudo-legal pinned moves
- TT-first move picking
- TT-derived ponder fallback
- direct-check quiet move ordering
- expanded 8-ply low-ply history boundaries
- UCI PV replay legality with one and eight search threads
Lynx 1.3.4
Patch release focused on completing UCI ponder behavior and Lazy SMP threaded search semantics.
Fixed
- Fixed
ponderhithandling so converting a ponder search to a normal search preserves elapsed thinking time instead of restarting the search clock. - Fixed threaded search accounting so UCI
nodes,tbhits, stop, quit, andponderhitstate are shared across the main and helper threads rather than being reported or limited from the main thread alone.
Changed
- Enabled threaded search for node-limited and
MultiPVsearches. - Reworked parallel best-result selection to use weighted helper votes, with decisive scores, PV availability, depth, score, and the main thread used as tie-breakers.
Lynx 1.3.3
Patch release focused on UCI tournament compatibility, protocol diagnostics, and illegal-move prevention.
Added
- Added UCI
go perft Nsupport for counting legal leaf nodes from the current position. - Added advertised UCI
Ponderoption. - Added process-level UCI regression tests that launch the engine binary and verify protocol behavior.
Changed
- Invalid
positioncommands now report a clear critical UCI error and exit instead of continuing from the previous board state. - Unknown UCI commands and unknown options now print explicit diagnostics.
- Empty
gonow starts an unbounded search until a limit or control command stops it. - UCI coordinate move parsing now accepts uppercase square text such as
E2E4. setoptionnow waits for an active search to finish before applying engine configuration.
Fixed
- Fixed compatibility with tournament managers that emit non-standard fullmove number
0in FEN by normalizing it to fullmove1. - Fixed root draw positions, including fifty-move claim and dead-material positions, so Lynx still returns a legal move when legal moves exist.
bestmove 0000is now reserved for positions with no legal moves.