ArhanPassant

Engine · version 0.9.0

Built to be measured

ArhanPassant is a UCI chess engine written in Rust. Every claim about its strength comes from games it actually played, and every new version has to beat the previous one before it ships.

Move generation

Legal moves from magic bitboards, matching 21 published perft results, up to the 706,045,033-position test.

Search

Iterative deepening with aspiration windows, principal variation search, quiescence search, a shared lock-free hash table and lazy SMP threads.

Pruning and ordering

Null-move, reverse futility, futility, late-move and static-exchange pruning; late-move reductions; singular extensions; history, continuation-history, killer and counter-move ordering.

Evaluation

A neural network (NNUE) trained on the engine's own self-play games: 512 hidden units since version 0.5. Version 0.1 used hand-written piece-square tables; every new network has to pass the gate below before it ships.

Interfaces

UCI for any chess GUI, a Rust library, and the WebAssembly build that runs on this site.

Measured strength

Against open-source engines with published CCRL Blitz ratings, at 60+0.6 seconds

≈ 3,426

95% interval 3,414 to 3,437 from 2,284 games

Each opponent's rating is read from the CCRL Blitz list, and one rating is fitted to the matches the engine scores between 20% and 80% in. At 10+0.1 seconds, 5,200 games give 3,448 (3,436 to 3,459). These are our own matches on cloud machines, not an official CCRL rating.

Too strong to rate against: Stockfish 17.1 (CCRL 3,771) 3.9%, Koivisto 9.0 (CCRL 3,632) 10.6%. An earlier measurement of version 0.7.0 against Stockfish 19's calibrated levels gave about 3,026.

OpponentCCRL BlitzWon · lost · drawnScore
Stash 37.03,41972 · 104 · 21245.9%
Ethereal 12.003,390143 · 78 · 16758.4%
Weiss 2.03,318170 · 57 · 16164.6%
Stash 34.03,315108 · 18 · 11868.4%
Laser 1.73,292122 · 26 · 9669.7%
Weiss 1.43,25579 · 11 · 5473.6%
Demolito 20213,243186 · 9 · 4986.3%
Stash 31.03,208177 · 16 · 5183.0%

The strength gate

A candidate version plays the current champion in pairs of games: same opening, colours swapped, from the UHO_4060_v4 opening book at 8+0.08 seconds. After every pair a sequential probability ratio test compares two hypotheses: the candidate is no better (0 Elo) or it is at least 5 Elo stronger.

The test stops as soon as the evidence is strong enough either way. With α = β = 0.05, a version that is no better gets through about 5% of the time, and a version that really is 5 Elo stronger passes about 95% of the time.

Checked before use

  • On 600 simulated matches with known strength: 5.0% false passes, 95.2% true passes, 50.7% at the midpoint.
  • The engine against an identical copy: exactly 0 Elo over 300 games.
  • 4× the search budget against 1×: passed after 414 games; the reverse failed after 408.

Every search change, tested

Changes to the search go through the same test: the engine with the change plays the engine without it, with the same network, on a fleet of cloud machines until the test decides. Changes that pass ship in the next version; the ones that fail are listed here too.

ChangeGamesElo (95% interval)Result
Time management: scale the soft limit by the best move's share of the search and by how long it has stayed best1,888+15.5 (+7.0 to +24.0)Passed

Use it

In a chess GUI

Build it, then add the binary as a UCI engine in Cute Chess, Arena, Banksia or En Croissant.

git clone https://github.com/arhancanli/arhanpassant
cd arhanpassant
cargo build --release
./target/release/arhanpassant bench

UCI options

Hash16Hash table size in MB (1 to 65536).
Threads1Search threads (1 to 512).
Move Overhead30Milliseconds kept in reserve per move for lag.
EvalFile<embedded>Path to a network file, or <none> for the hand-written evaluation.