I've been reading this forum for years while working on my engine, and I think it's finally at a point where it's worth posting about.
Elephant Gambit is a UCI chess engine written in C++20. It started because I was frustrated with how bad I am at chess and figured I'd let the computer do it for me. It has since become more of an obsession, and a place to write the kind of C++ I don't get to write at work. Its predecessor, Gambit, got its first commit back in 2017.
Download: https://github.com/looak/elephant/releases/tag/0.15.2
Windows and Linux binaries, statically linked, built for x86-64, x86-64-v2 and x86-64-v3. GPL-3.0.
What's in it
- Bitboards with magic bitboard sliders, staged legal move generation
- Negamax alpha-beta with PVS, iterative deepening, aspiration windows, transposition table
- Quiescence search with delta and SEE pruning, check extensions
- Null move pruning (with verification), LMR, LMP, IIR, reverse futility and futility pruning
- Move ordering: TT/PV move, MVV-LVA, killers, history, losing captures by SEE after quiets
- PeSTO evaluation, tapered and incrementally updated, plus mop-up for won endgames
- Time management with soft and hard limits, increment aware, configurable move overhead
- Pondering (go ponder / ponderhit)
- Single threaded for now, Lazy SMP is next
I ran a gauntlet against six engines from the CCRL Blitz list, 200 games each: 2m+1s, fastchess, 8moves_v3 book, on a Ryzen 9 5950X under Fedora. It was played with 0.15.1; 0.15.2 only fixes pondering.
Code: Select all
Opponent CCRL Games W D L Score Elo
Barbarossa 2465 200 141 30 29 78.0% +220
Tantabus 2556 200 114 55 31 70.8% +153
WyldChess 2603 200 73 64 63 52.5% +17
Blunder 8.5.5 2663 200 81 67 52 57.2% +51
Fatalii 2735 200 74 58 68 51.5% +10
byte-knight 2863 200 25 73 102 30.8% -141
For context, v0.11.0 was sitting in the low 2000s on Lichess. Most of the gain since then came in the last couple of weeks, once I found a transposition table bug where captured pieces were XOR'd out of the Zobrist key twice, which meant positions after a capture hashed as if the capture never happened. Fixing that was worth about +320 in self-play, and it turned out the broken TT had made a couple of pruning features look bad enough that I'd removed them. Putting those back, plus PeSTO and the futility work, accounts for most of the rest. Everything is tested with SPRT on a local OpenBench instance.
As mentioned, it also plays on Lichess as https://lichess.org/@/elephantgambitengine
If any of the CCRL testers are interested in including it, I'd be grateful. Bug reports, odd behavior, or anything that looks wrong in a GUI, please let me know.
Thanks to the Engine Programming and OpenBench Discords, who have been very generous with their help, and to chessprogramming.org and this forum, which I've leaned on more than I can count.
Alex