Skip to content

Version 7

Latest

Choose a tag to compare

@Carbecq Carbecq released this 13 Jul 16:36

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_9bnet_11bnet_13anet_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), ucinewgame clearing state without stopping an in-flight search, hash table resize during an active search.
  • get_best_thread clarified 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). ⚠️ Slower than 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