a work-in-progress UCI chess and chess960 engine, with NNUE evaluation trained from zero knowledge starting with random weights
this project is a continuation of my HCE engine Polaris
Version | CCRL 40/15 | CCRL Blitz | CCRL 40/2 FRC | CEGT 40/4 | MCERL |
---|---|---|---|---|---|
4.1.0 | 3484 | - | 3812 | - | - |
4.0.0 | 3475 | 3565 | 3781 | 3442 | 3542 |
3.0.0 | 3407 | 3491 | 3696 | - | 3495 |
2.0.0 | 3397 | 3481 | 3675 | 3339 | 3482 |
1.0.0 | 3317 | 3374 | 3543 | 3235 | 3346 |
- standard PVS with quiescence search and iterative deepening
- aspiration windows
- check extensions
- countermoves
- futility pruning
- history
- capture history
- 1-ply continuation history (countermove history)
- 2-ply continuation history (follow-up history)
- 4-ply continuation history
- internal iterative reduction
- killers (1 per ply)
- late move reductions
- late move pruning
- mate distance pruning
- multicut
- nullmove pruning
- reverse futility pruning
- SEE move ordering and pruning
- singular extensions
- double extensions
- triple extensions
- various negative extensions
- Syzygy tablebase support
- NNUE
- (768x8->1024)x2->1x8 architecture
- trained from zero knowledge with reinforcement learning from a randomly-initialised network
- BMI2 attacks in the
bmi2
build, otherwise fancy black magicpext
/pdep
for rookspext
for bishops
- lazy SMP
- static contempt
- make it stronger uwu
Name | Type | Default value | Valid values | Description |
---|---|---|---|---|
Hash | integer | 64 | [1, 131072] | Memory allocated to the transposition table (in MB). |
Clear Hash | button | N/A | N/A | Clears the transposition table. |
Threads | integer | 1 | [1, 2048] | Number of threads used to search. |
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. |
Move Overhead | integer | 10 | [0, 50000] | Amount of time Stormphrax assumes to be lost to overhead when making a move (in ms). |
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. |
avx512
: requires AVX-512 (Zen 4, Skylake-X)
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
sse41-popcnt
: needs SSE 4.1 and popcnt
- for older x64 CPUs
Alternatively, build the makefile target native
for a binary tuned for your specific CPU (see below)
- If you have an AMD Zen 1 (Ryzen x 1xxx), Zen+ (Ryzen x 2xxx) or Zen 2 (Ryzen x 3xxx) CPU, use the
avx2
build even though your CPU supports BMI2. These CPUs implement the BMI2 instructionspext
andpdep
in microcode, which makes them unusably slow for Stormphrax's purposes.
Requires Make and a competent C++20 compiler that optionally supports LTO. GCC is not currently supported, so the usual compiler is Clang.
> make <BUILD> CXX=<COMPILER>
- replace
<COMPILER>
with your preferred compiler - for example,clang++
oricpx
- if not specified, the compiler defaults to
clang++
- if not specified, the compiler defaults to
- replace
<BUILD>
with the binary you wish to build -native
/avx512
/avx2-bmi2
/avx2
/sse41-popcnt
- if not specified, the default build is
native
- if not specified, the default build is
- if you wish, you can have Stormphrax include the current git commit hash in its UCI version string - pass
COMMIT_HASH=on
By default, the makefile builds binaries with profile-guided optimisation (PGO). To disable this, pass PGO=off
. When using Clang with PGO enabled, llvm-profdata
must be in your PATH.
Stormphrax uses Fathom for tablebase probing, licensed under the MIT license, and a slightly modified version of incbin for embedding neural network files, under the Unlicense.
Stormphrax is tested on this OpenBench instance - thanks to all the people there, SP would be much weaker without your support :3
In no particular order, these engines have been notable sources of ideas or inspiration:
Stormphrax's current networks are trained with bullet. Previous networks were trained with Marlinflow.
The name "Stormphrax" is a reference to the excellent Edge Chronicles :)