Skip to content

Releases: jorgenhanssen/grail

Grail v2.0.1

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 10 Jun 07:25
879cce7

Highlights

  • Another round of datagen and training of the NNUE.
  • Various bug/correctness fixes and performance improvements.

Search Improvements

  • Added continuation correction.
  • Tuned correction history weights.
  • Razoring now uses the TT/search eval instead of the static eval.
  • Use the TT/search eval instead of the static eval on the search stack.
  • Skip null-move pruning when the static eval is below beta.
  • Reduce quiet moves when the TT move is a capture.

Bug Fixes / Correctness

  • Fixed an issue where futility pruning could prune the PV move at low depth (occasionally produced a wrong mate score).
  • QS was storing the corrected eval in the TT. Now stores the raw static eval to avoid double-correction.
  • No longer demote the PV move to a Cut node in the LMR re-search.
  • Null-move pruning now returns the null score instead of beta.
  • No longer store partial results from an aborted search in the TT.
  • Preserve the existing TT move when an overwrite carries no move of its own.
  • Fixed an i16 overflow in the score-drop check.

Misc

  • General cleanup and dependency updates.

Elo gain over 2.0.0 (1 thread without endgame tablebases)

STC  (10+0.1):  +30.86 ± 4.21 Elo  (10k games)
LTC  (60+0.6):  +34.28 ± 6.97 Elo (3k games)
VLTC (180+1.8): +33.11 ± 11.56 Elo (1k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v2.0.0

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 11 May 16:44
cbabed9

Time for a new version with some improvements I have made to Grail! The NNUE is now a fully self-taught network, and I thought that warranted a major bump 🎉 So here is 2.0.0:

New Features

Self-taught Evaluation

The new network has been trained from scratch over 6 generations of iterative self-play, totalling 67 million games. Previous versions used the old HCE as a bootstrap, but 2.0.0 uses knowledge derived from game outcomes.

zero-knowledge process

Syzygy Endgame Tablebases

Grail can now load Syzygy tablebases for a slight increase in strength. Configurable with the new SyzygyPath and SyzygyProbeDepth UCI options.

go nodes

Added support for the go nodes UCI command.

Search Improvements

  • History-scaled late move reductions (with continuation history)
  • Capture history reductions
  • Anti-reduction for PV moves replacing the old no-reduction guard
  • Quadratic margin on singular extensions to prevent over-extension in long check chains.

NNUE Improvements

  • Dual-perspective accumulator replacing the single STM input bit.
  • Dead-neuron pruning in the linear layers for an NPS uplift.
  • Per-neuron quantization scales in the accumulator instead of a single global scale.

Misc

  • HCE has been yeeted.
  • The NNUE UCI toggle is gone with it.
  • General cleanup and module restructuring.

Elo gain over 1.1.0 (1 thread without endgame tablebases)

STC  (10+0.1):  +97.84  ± 4.66 Elo  (10k games)
LTC  (60+0.6):  +75.03 ± 7.15 Elo (3k games)
VLTC (180+1.8): +80.27 ± 11.71 Elo (1k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.1.0

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 28 Feb 17:12
181df29

The biggest update to Grail so far!
New features, a reworked search, and a new NNUE for a roughly +270 Elo gain over 1.0.4.

New Features

Lazy SMP Threading

Grail now supports multi-threaded search via the Threads UCI option. Helper threads search at varied depths and pre-populate their results in the transposition table and correction history, seeding the main thread with data on positions it hasn't reached yet.

Elo gain for 4 threads vs 1 thread at various time controls:

4-thread Elo scaling

Multi-PV Search

New MultiPV UCI option for analyzing multiple principal variations. Useful for analysis and opening exploration where you want to see more than the top choice.

Board Display

A new d command prints the board to the terminal. Mainly useful for debugging or quick visual inspection when running the engine directly. After a search, PV from/to squares are highlighted and per-PV eval bars are shown below the board.

image

Search Improvements

  • Singular extensions with multi-cut pruning for uniquely strong moves.
  • Correction history tables for static eval adjustment.
  • Score-based aspiration window scaling.
  • Anti-reductions for tactical moves replace the old zero-reduction bypass.
  • SEE pruning extended to quiet moves.
  • Removed null move verification search.
  • Triangular PV table.
  • Unified transposition table.
  • Fractional reductions.

Move Ordering Improvements

  • Threat-based bonuses in move ordering.
  • MVV-LVA with proper LVA tiebreaking.
  • Quiet check bonus gated behind SEE to filter out junk checks.
  • Capture history updated from quiescence search.
  • New bad quiets move ordering bucket.
  • Removed killer moves.

New NNUE

New February 2026 net trained on 500M self-play positions. The training pipeline now blends eval and game outcome targets in WDL space, and uses multi-PV sampling to produce more varied training data.

Bug Fixes

  • Fixed aspiration window overflow bug for mate scores.
  • Fixed that the timer could fire during a subsequent search, causing 0000 output.
  • Pawn attack maps now include all controlled squares.
  • Removed buggy piece repetition penalty.

More technical details in #179.

Elo Improvement over 1.0.4 (1 thread)

STC  (10+0.1):  +272.51 ± 6.69 Elo  (10k games)
LTC  (60+0.6):  +271.99 ± 11.29 Elo (3k games)
VLTC (180+1.8): +257.02 ± 17.40 Elo (1k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.0.4

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 16 Jan 08:22
7c9bc60

Highlights

  • Stronger evaluation from a retrained NNUE.
  • Improved reduction logic based on more search context.
  • Uses the best move from a partially searched iteration when the hard time runs out.

Bugs

  • Avoids invalid PV lines exceeding the 50-move rule (fixes Fastchess warnings).

Misc

  • Default Move Overhead lowered to 10ms.
  • General search efficiency improvements.

Elo gain over 1.0.3

STC  (10+0.1):  +95.03 ± 5.33 Elo  (10k games)
LTC  (60+0.6):  +102.97 ± 9.16 Elo  (3k games)
VLTC (180+1.8): +109.45 ± 15.12 Elo (1k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.0.3

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 04 Jan 22:22
3ffcbcc

Highlights

  • Phase-based NNUE output buckets: 8 separate output heads selected by piece count for better phase-specific evaluation.
  • Fixed PV line truncation bug by disabling TT cutoffs in PV nodes.
  • Null-move pruning now restricted to expected Cut nodes only.

Misc

  • Removed Internal Iterative Deepening (redundant with IIR).
  • Faster NNUE encoding via bulk u64 bitboard assignment.
  • General code cleanup and performance improvements

Elo gain over 1.0.2

STC  (10+0.1):  +38.5 ± 5.3 Elo  (10k games)
LTC  (60+0.6):  +41.0 ± 9.0 Elo  (3k games)
VLTC (180+1.8): +56.8 ± 15.5 Elo (1k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.0.2

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 16 Dec 19:20
d95dbaf

Improvements

  • Reduce search depth in nodes when the transposition table doesn't have a best move (IIR).
  • Late move reductions now applied at the root level.
  • Improved move ordering when escaping from check - prioritizes king moves and cheaper pieces as blockers.
  • More aggressive pruning using transposition table upper bounds.

Elo gain over 1.0.1

STC (10+0.1): +28.9 ± 5.2 Elo (10k games)
LTC (60+1.0): +22.6 ± 10.4 Elo (2k games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.0.1

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 10 Dec 19:49
8ab6ed4

Improvements

  • Better at recognizing positions with insufficient mating material and avoids playing them for a win.
  • Puts more effort into evaluating positions with potential pawn promotions.
  • Improved time allocation for move-based time controls (e.g. 40/10).
  • The Move Overhead UCI option is now exposed (default: 20ms) to compensate for network or GUI latency.
  • Various search parameters have been refined through automated tuning.

Elo gain over 1.0.0

STC (10+0.1): +27.9 ± 5.3 Elo (10k games)
LTC (60+1.0): +19.5 Elo       (500 games)

Downloads

  • x86-64-v4: Modern CPUs with AVX-512 (2017+)
  • x86-64-v3: CPUs with AVX2 (2013+)
  • arm64: Apple Silicon

Grail v1.0.0

Choose a tag to compare

@jorgenhanssen jorgenhanssen released this 05 Dec 01:18
3e87b40

After working on it for a while, I feel my hobby chess engine is finally ready for v1.0.0. Not cutting edge, but plays a solid game.

Grail uses modern search techniques and evaluates positions using a simple NNUE trained on 500 million positions from self-play.

Development continues in my spare time, and I plan to release updates with several missing features and improvements like threading, tablebase support, and pondering. But don't worry! Grail supports all standard UCI time controls and analysis modes, so it works seamlessly with your favorite GUI for matches and analysis.