a work-in-progress UCI shatranj engine based on Stormphrax, with NNUE evaluation trained from zero knowledge starting with random weights
Supersedes Stormphranj
??
- 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
- _
- trained from zero knowledge with reinforcement learning from a randomly-initialised network
- BMI2 attacks in the
bmi2
build and up, 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 MiB). |
Clear Hash |
button | N/A | N/A | Clears the transposition table. |
Threads |
integer | 1 | [1, 2048] | Number of threads used to search. |
UCI_ShowWDL |
check | true |
false , true |
Whether oranj displays predicted win/draw/loss probabilities in UCI output. |
ShowCurrMove |
check | false |
false , true |
Whether oranj starts printing the move currently being searched after a short delay. |
Move Overhead |
integer | 10 | [0, 50000] | Amount of time oranj assumes to be lost to overhead when making a move (in ms). |
SoftNodes |
check | false |
false , true |
Whether oranj 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 oranj 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 oranj is neither designed for nor tested with these TCs, and is likely to perform worse than under X+Y. |
EvalFile |
string | <internal> |
any path, or <internal> |
NNUE file to use for evaluation. |
vnni512
: requires BMI2, AVX-512 and VNNI (Zen 4/Cascade Lake-SP/Rocket Lake and up)
avx512
: requires BMI2 and AVX-512 (Skylake-X, Cannon Lake)
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
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 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 oranj's purposes.
Requires Make and a competent C++20 compiler that supports LTO. GCC is not currently supported, so the usual compiler is Clang. MSVC explicitly does not work.
> 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
/vnni512
/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 oranj 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.
oranj makes use of the following libraries:
- a slightly modified version of incbin for embedding neural network files, under the Unlicense
- Zstandard for decompressing NNUE files, under GPLv2 (see COPYING)
In no particular order, these engines have been notable sources of ideas or inspiration:
oranj's networks are trained with bullet.