AteNika plays chess over UCI with no graphical interface of its own, and has no dependencies beyond GoogleTest for the test build.
Briefly about the name. AteNika are the names of two ancient Greek goddesses Athena, who was the patroness of wisdom, strategy, justice and war defense, and Nika (or Nike), which is literally translated from Greek "Victory", she was the ancient Greek goddess of victory and triumph.
More detailed in CCI AteNika Rate. Full history in matches/LADDER.md.
| Version | Published | STC 8.0+0.08s | LTC 60.0+0.60s | VLTC 2m24s+1.12s |
|---|---|---|---|---|
| 0.7.0 | 2026-09-20 | 2728 | 3090 | 3139 |
| 0.6.0 | 2026-09-13 | 2674 | 3005 | 3078 |
| 0.5.0 | 2026-09-02 | 2040 | 2317 | 2350 |
Board and move generation: bitboards with magic sliding attacks, make/unmake against a history stack, incremental Zobrist hashing, and pin-aware legal move generation.
Search: fail-soft negamax with a triangular PV table, aspiration windows, and a transposition table with depth-preferred replacement and a generation counter. Pruning and reductions: late move reductions with history-based relief, reverse futility, futility, internal iterative reduction, and adaptive null-move R. Move ordering uses the TT move, MVV-LVA, killers and butterfly history with gravity aging. Quiescence generates captures only, plus check evasions, filtered by SEE and delta pruning. Time management runs separate soft and hard limits with best-move stability and score-drop detection.
Evaluation: material and piece-square tables, passed and isolated pawns, rooks and queens on open and semi-open files, bishop pair, and insufficient material detection.
Requires a C++23 compiler (GCC 14+, Clang 18+, MSVC 19.39+) and CMake 3.25+. Linux and Windows are built and tested on every PR.
cmake --preset release
cmake --build --preset release
./build/release/AteNikaIn addition to the UCI interface, the engine also has one Hash option, the transposition table size in MB.
A few non-UCI commands are available for development:
| command | what it does |
|---|---|
d |
print the current position |
eval |
static evaluation of the current position |
bench |
fixed position set at fixed depth, reported as one node count |
perft [divide] <n> |
node counts, divide matching Stockfish's go perft format |
state |
internal state of the current position |
help |
list every command |
bench is the behaviour fingerprint: any change meant to preserve behaviour must
leave its node count bit-identical.
cmake --preset tests && cmake --build --preset tests --parallel
ctest --preset tests # everything
ctest --preset fast # excludes perfttest.sh is the shortcut for single tests and takes a GoogleTest filter:
bash test.sh 'Board*' # one fixture
bash test.sh -l # list testsThe verify preset is the same suite with the Zobrist key and the NNUE
accumulator recomputed after every make():
cmake --preset verify && cmake --build --preset verify --parallel
ctest --preset verify
printf 'bench\nquit\n' | ./build/verify/AteNika # the same, over more positionsThe equivalent of cargo fmt + cargo clippy. Needs clang-format and
clang-tidy:
bash check.sh # reformat in place, then lint
bash check.sh -n # report only, what CI runsCI pins clang-format 18.1.8, and a different patch level reformats the tree differently. Match it locally:
pipx install clang-format==18.1.8Every change that alters what the engine plays is accepted or rejected by SPRT, never by intuition. The tooling lives in matches/; binaries, opponents and opening books are not tracked and must be set up locally.
Code and ideas
- Shallow Blue — heavily, in the early stages
- Stockfish
- Stash-bot — the reference ladder for testing
Reference
GPL-3.0-or-later. See LICENSE.
