Stormphrax
UCI chess engine, with NNUE trained from zero knowledge
Install / Use
/learn @Ciekce/StormphraxREADME
Stormphrax
[![License][license-badge]][license-link]
[![GitHub release (latest by date)][release-badge]][release-link]
[![Commits since latest release][commits-badge]][commits-link]
![LGBTQ+ friendly][lgbtqp-badge] ![trans rights][trans-rights-badge]
</div>A work-in-progress UCI chess and [chess960] engine, with NNUE evaluation trained from zero knowledge starting with random weights.
The Stormphrax project prides itself on using self-generated training data for its networks, and will never use data generated by a third party. This repo contains no LLM-generated code.
This project is a continuation of my HCE engine [Polaris].
Strength
At the time of writing, Stormphrax 7.0.0 is the strongest standard chess and Chess960 engine in the UK, and the 4th strongest Chess960 engine in the world.
If this is no longer true, it is likely to have been overtaken by the excellent [Viridithas].
| Version | [SP-CC UHO-Top15][spcc] | [CCRL 40/15][ccrl-4015] | [CCRL Blitz][ccrl-blitz] | [CCRL 40/2 FRC][ccrl-402-frc] | [CEGT 40/4][cegt-404] | [CEGT 40/20][cegt-4020] | [MCERL] | |:-------------:|:-----------------------:|:-----------------------:|:------------------------:|:-----------------------------:|:---------------------:|:-----------------------:|:-------:| | [7.0.0][sp7] | 3682 (11th) | 3584 (tied 9th-10th) | 3718 (10th) | 4010 (4th) | - | - | - | | [6.0.0][sp6] | 3621 | 3560 | 3680 | 3967 | 3566 | 3529 | - | | [5.0.0][sp5] | - | 3506 | 3622 | 3870 | 3501 | 3461 | - | | [4.1.0][sp41] | - | 3488 | 3585 | 3812 | - | 3432 | - | | [4.0.0][sp4] | - | 3474 | 3565 | 3782 | 3440 | 3419 | 3542 | | [3.0.0][sp3] | - | 3407 | 3492 | 3697 | - | 3354 | 3495 | | [2.0.0][sp2] | - | 3397 | 3483 | 3676 | 3339 | - | 3482 | | [1.0.0][sp1] | - | 3317 | 3374 | 3523 | 3235 | - | 3346 |
Features
- standard PVS with quiescence search and iterative deepening
- aspiration windows
- futility pruning
- history
- capture history
- 1-ply continuation history (countermove history)
- 2-ply continuation history (follow-up history)
- 4-ply continuation history
- correction history
- pawn
- non-pawn
- major
- continuation
- history pruning
- internal iterative reduction
- killers (1 per ply)
- late move reductions
- late move pruning
- mate distance pruning
- multicut
- nullmove pruning
- reverse futility pruning
- probcut
- SEE move ordering and pruning
- singular extensions
- double extensions
- triple extensions
- various negative extensions
- Syzygy tablebase support
- NNUE
- (704x16hm->1792)x2->(16x2->32->1)x8 architecture
- trained from zero knowledge with reinforcement learning from a randomly-initialised network
- BMI2 attacks in the
avx2-bmi2build and up, otherwise fancy black magicpext/pdepfor rookspextfor bishops
- lazy SMP
- static contempt
To-do
- make it stronger uwu
UCI options
| Name | Type | Default value | Valid values | Description |
|:------------------------------|:-------:|:-------------:|:-------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Hash | integer | 64 | [1, 67108864] | Memory allocated to the transposition table (in MiB). |
| Clear Hash | button | N/A | N/A | Clears the transposition table. |
| Threads | integer | 1 | [1, 2048] | Number of threads used to search. |
| MultiPV | integer | 1 | [1, 256] | Number of lines to search at once. |
| UCI_Chess960 | check | false | false, true | Whether Stormphrax plays Chess960 instead of standard chess. |
| UCI_ShowWDL | check | true | false, true | Whether Stormphrax displays predicted win/draw/loss probabilities in UCI output. |
| ShowCurrMove | check | false | false, true | Whether Stormphrax starts printing the move currently being searched after a short delay. |
| Move Overhead | integer | 10 | [0, 50000] | Amount of time Stormphrax assumes to be lost to overhead when making a move (in ms). |
| SoftNodes | check | false | false, true | Whether Stormphrax will finish the current depth after hitting the node limit when sent go nodes. |
| SoftNodeHardLimitMultiplier | integer | 1678 | [1, 5000] | With SoftNodes enabled, the multiplier applied to the go nodes limit after which Stormphrax will abort the search anyway. |
| EnableWeirdTCs | check | false | false, true | Whether unusual time controls (movestogo != 0, or increment = 0) are enabled. Enabling this option means you recognise that Stormphrax is neither designed for nor tested with these TCs, and is likely to perform worse than under X+Y. |
| SyzygyPath | string | <empty> | any path, or <empty> | Location of Syzygy tablebases to probe during search. |
| SyzygyProbeDepth | spin | 1 | [1, 255] | Minimum depth to probe Syzygy tablebases at. |
| SyzygyProbeLimit | spin | 7 | [0, 7] | Maximum number of pieces on the board to probe Syzygy tablebases with. |
| EvalFile | string | <internal> | any path, or <internal> | NNUE file to use for evaluation. |
Builds
avx512: requires BMI2 and AVX-512 (Zen 4/Ice Lake/Cascade Lake-SP/Rocket Lake and up)
avx2-bmi2: requires BMI2 and AVX2 and assumes fast pext and pdep (i.e. no Bulldozer, Piledriver, Steamroller, Excavator, Zen 1, Zen+ or Zen 2)
avx2: requires BMI and AVX2 - primarily useful for pre-Zen 3 AMD CPUs back to Excavator
If in doubt, compare the avx2-bmi2 and avx2 binaries and pick the one that's faster. BMI2 will always be faster on Intel CPUs.
Alternatively, build the makefile target native for a binary tuned for your specif
