Skip to content

Repository files navigation

AteNika

AteNika

A UCI chess engine written in C++23

License: GPL v3 CI Release GitHub Release Elo

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.

Strength

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

Features

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.

Build

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/AteNika

Usage

In 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.

Development

Tests

cmake --preset tests && cmake --build --preset tests --parallel
ctest --preset tests     # everything
ctest --preset fast      # excludes perft

test.sh is the shortcut for single tests and takes a GoogleTest filter:

bash test.sh 'Board*'    # one fixture
bash test.sh -l          # list tests

The 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 positions

Format and lint

The 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 runs

CI pins clang-format 18.1.8, and a different patch level reformats the tree differently. Match it locally:

pipx install clang-format==18.1.8

Engine-vs-engine testing

Every 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.

Credits

Code and ideas

Reference

License

GPL-3.0-or-later. See LICENSE.

Releases

Used by

Contributors

Languages