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.
| Opponent | CCRL Blitz | Won · lost · drawn | Score |
|---|---|---|---|
| Stash 37.0 | 3,419 | 72 · 104 · 212 | 45.9% |
| Ethereal 12.00 | 3,390 | 143 · 78 · 167 | 58.4% |
| Weiss 2.0 | 3,318 | 170 · 57 · 161 | 64.6% |
| Stash 34.0 | 3,315 | 108 · 18 · 118 | 68.4% |
| Laser 1.7 | 3,292 | 122 · 26 · 96 | 69.7% |
| Weiss 1.4 | 3,255 | 79 · 11 · 54 | 73.6% |
| Demolito 2021 | 3,243 | 186 · 9 · 49 | 86.3% |
| Stash 31.0 | 3,208 | 177 · 16 · 51 | 83.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.
| Change | Games | Elo (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 best | 1,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
| Hash | 16 | Hash table size in MB (1 to 65536). |
| Threads | 1 | Search threads (1 to 512). |
| Move Overhead | 30 | Milliseconds kept in reserve per move for lag. |
| EvalFile | <embedded> | Path to a network file, or <none> for the hand-written evaluation. |