Zangdar 7 — since 6.1.1
This release covers roughly 5 months of development (Feb–Jul 2026): a substantial rework of the search (pruning, reductions, extensions, move ordering), multiple NNUE cycles retraining of the network, and significant hardening of the multi-threaded infrastructure. Each change below was individually validated by SPRT before being merged — the exact cumulative Elo isn't a simple sum of the individual results (gains overlap and interact), but the net direction across this many validated increments is solidly positive.
Search
- Null Move Pruning: reduction modulated by a tactical flag (6.16), then a hindsight extension triggered when the null move fails well below beta (6.27).
- LMR (Late Move Reduction): post-hoc correction of the parent's reduction using the parent→child eval drift (6.26).
- Refined pruning: history-weighted SEE pruning (6.17), history pruning with
skipQuiets(6.18), corrplexity-modulated RFP/SNMP (6.13), QS futility pruning with a safety clamp (6.20). - Move ordering: capture history indexed by threats (6.15), history updates extended to quiescence (6.11).
- Correction History: gravity-style update formula (6.19.0), tables compacted to 16-bit (6.19.1).
- Time management: new time manager (6.14).
- Syzygy: root probing now plays the DTZ-optimal move directly (6.7.6).
NNUE network
- King buckets 5 → 8 (6.10), then 8 → 16 (6.33) — current architecture
(768×16kb → 1024)×2 → 1×8ob, SCReLU, horizontally-mirrored buckets, factorized weights. - New network in Zangdar 7 (
net_20a_1000): retrained from scratch on the entire combined-and-interleaved data corpus (~10.7 billion positions, spanning every past engine generation), at full learning rate. - Several iterative bootstrap cycles over the project's history: each new engine generation regenerated training data with more accurate labels for the next network (networks
net_9b→net_11b→net_13a→net_20a). - Widening the hidden layer (1024→1280) and adding dense layers were both tried and found neutral or too costly on this hardware, then abandoned — the real levers turned out to be input capacity (buckets) and full-corpus from-scratch retraining, not hidden-layer width.
Infrastructure / multi-thread robustness
- Cross-thread voting for best-move selection in Lazy SMP (6.31), Stockfish-style weighted votes.
- Fixes for races and crashes: unhandled double-
go(6.12.0),ucinewgameclearing state without stopping an in-flight search, hash table resize during an active search. get_best_threadclarified and hardened; internal encodings hardened (move fields, piece-indexed tables).- SPSA tuning support (via OpenBench) and datagen infrastructure for NNUE training.
Precompiled binaries
New in v7: Linux and ARM64 binaries are now provided alongside Windows.
All binaries are PGO-optimised and statically linked — no Visual C++ or
MinGW runtime on Windows, no glibc/libstdc++ version requirement on Linux.
Download and run (on Linux: chmod +x first).
| Platform | Builds |
|---|---|
| Windows x86-64 | sse2, avx2, bmi2, avx512 |
| Linux x86-64 | sse2, avx2, bmi2 |
| Linux ARM64 (aarch64) | arm64 |
Pick the binary matching your CPU; when in doubt, avx2 covers the vast
majority of modern machines.
| Build | Target CPU |
|---|---|
sse2 |
Pre-2013 x86-64 without AVX, and VMs that expose no AVX. Requires POPCNT (Intel Nehalem 2008+, AMD K10+). |
avx2 |
The 2013+ standard: Intel Haswell+ and every AMD Zen. Best default. |
bmi2 |
Intel Haswell+ and AMD Zen 3+ only (hardware PEXT). avx2 on Zen 1/2, whose PEXT is microcoded. |
avx512 |
Intel Skylake-X/Cascade Lake, Ice Lake+, Tiger Lake+; AMD Zen 4/5. Windows only — on Linux, build from source. |
arm64 |
ARMv8-A: Raspberry Pi 4/5, Ampere, AWS Graviton, Apple Silicon under Linux. |
File names follow Zangdar-<version>-<arch>-<compiler>[-static]-pgo[.exe]; only
the <arch> part matters when choosing.
macOS is not shipped — build from source, see the README.
Results against Zangdar 6.1.1
STC
Results of Zangdar-7 vs Zangdar-6.1.1 (10+0.1, 1t, 128MB, UHO_Lichess_4852_v1.epd):
Elo: 104.87 +/- 11.53, nElo: 208.10 +/- 21.53
LOS: 100.00 %, DrawRatio: 33.40 %, PairsRatio: 9.41
Games: 1000, Wins: 406, Losses: 113, Draws: 481, Points: 646.5 (64.65 %)
Ptnml(0-2): [1, 31, 167, 276, 25], WL/DD Ratio: 0.92