Skip to content

Luna CE v3.1.4

Choose a tag to compare

@Spunc595 Spunc595 released this 15 Sep 19:46
· 92 commits to main since this release

What's in this release

Three commits since v3.1.3, none of which had been released as a tagged/published build before now.

New since v3.1.3 was tagged

  • go nodes N no longer hangs on long forced-capture sequences. check_time() (the node/time budget check) was only ever called from negamax, never from quiescence. A long chain of forced captures — common in endgames — can recurse entirely inside quiescence without returning to negamax, so the budget was never re-checked. Under go nodes N specifically (no external clock, unlike self-play under a GUI/wrapper, which has its own game clock and was never affected) this could block a worker for 30+ minutes on a single position. Fix: check_time() is now also checked at the top of quiescence, using the same bail-out already used in negamax.
  • setoption name UseNNUE value false now actually forces classical evaluation, even with a network embedded in the binary. There was previously no way to really disable NNUE at runtime. Verified the toggle changes the evaluation, not just the reported option value (126cp → -50cp → 126cp on the same position).

Fixed in this release

  • Removed a leftover [cite: 16] marker in movegen.rs — a leftover artifact from AI-assisted editing, flagged in a July TalkChess code review and still present two months later. A CI check now fails the build if one reappears (grep -rn "\[cite" src/).
  • Fixed the transposition table's generational aging. The replacement policy compared the TT's generation counter against itself — nothing ever advanced it after construction, so the generation-based branch could never fire and aging silently did nothing while the README claimed otherwise. TranspositionTable::new_search() now advances the counter once per go command; covered by two new unit tests (a shallow store is now correctly accepted across a generation boundary; the counter wraps past 255 back to 1, never to 0, which is what an empty slot decodes to).
  • Added attribution for Jim Ablett's AVX2 (x86_64) and NEON (AArch64) SIMD kernels for NNUE inference, contributed on the TalkChess forum along with cross-platform release binaries. Previously credited nowhere in the repository despite the code being in active use.
  • Zero compiler warnings (was 1: two TTEntry fields, key and generation, were constructed on every table read but never consumed by any caller — removed).

Which network is embedded, and its license

The network baked into this binary (resources/net.bin) is akimbo's network by Jamie Whiting, used under the MIT License (full notice in the repository's README, Acknowledgments section) — unchanged from v3.1.3. It is not self-trained.

Luna also has its own from-scratch, self-trained NNUE lineage (gen1, gen2, ...), bootstrapped entirely from the engine's own search with no external label source. Its full provenance, TCEC-compliance declaration, and measurements live in the luna-nnue repository. That line isn't the one embedded by default yet: its playing strength hasn't been measured against akimbo's, and switching the shipped default ahead of having that number would mean picking it by assumption rather than by measurement.

Verified before tagging

  • Full workspace test suite: green.
  • perft(5) from the start position and perft(4) from Kiwipete: both match the known-correct node counts.
  • Clean build from a fresh checkout, no manual steps.
  • The attached binaries were built from a separate, pristine git worktree checked out at the v3.1.4 tag (8b219b4), not from a working directory — confirmed zero diff between that worktree and the tag before building.
  • The Windows binary was tested standalone: copied alone into an empty folder (no companion files) on the build machine and run from there — UCI handshake, id name Luna CE v3.1.4, the embedded network loading, and go depth 10 returning a legal move (e2e4 from the start position) all confirmed working with nothing else present.

Assets

  • luna-ce-v3.1.4-windows-x64.exe — statically linked (+crt-static): no VCRUNTIME140.dll/MSVCP140.dll dependency, so it runs without the Visual C++ Redistributable installed. Built for a generic x86-64 baseline (not tuned to the build machine's specific CPU), with runtime AVX2 detection deciding the NNUE inference path at startup — safe to run on any 64-bit Windows machine.
  • luna-ce-v3.1.4-android-arm64 — cross-compiled for Android (aarch64), same toolchain (NDK r27d) as prior releases.

No Linux binary this time — cross-compiling to x86_64-unknown-linux-gnu/musl from this Windows build machine would need a cross-linker toolchain (or Docker) not currently set up here. Left for a follow-up rather than shipped untested.