I decided I don't understand anything of chess programming.
Chessnix is a UCI chess engine.
- Needs Zig 0.15.2 to compile.
- chessnix is a windows 64 bits exe for modern computers.
- chessnix_bot can be played against on lichess.org.
- Working on it, not pretending to understand anything. Waiting for Zig 0.16.
- Stronger: I hope.
- Changed: Alpha Raises Reduction LMR (instead of depth reduction) after score > alpha.
- Changed: Only update pv when pv-node. Removed update pv in qsearch.
- Changed: Time management.
- Changed: TT structure and entry replacement strategy.
- Changed: Prefetch TT for a slight speed boost.
- Changed: Some minor optimizations.
- Removed: Reward / punish moves in qsearch.
- Bug solved: Another terrible one: qsearch comparing a zero score with TT score instead of the eval.
- Bug solved: Parsing negative time.
- Stronger: ~3168 ELO on CCRL.
- Added: Slight center bias in quiet move ordering for shallow depths (experimental).
- Added: Search history pruning, history reduction.
- Added: Store raw static evaluation in TT.
- Added: Slight capture history bonus and malus in quiescence search.
- Removed: Killer moves.
- Removed: Maintaining pins of both sides. I will not code a 'perfect' SEE in the near future.
- Removed: Unused see_score function.
- Changed: Lots of tweaks in the search algorithm (history pruning + reduction, different LMR table).
- Changed: Correction history.
- Changed: History structure and calculations, especially continuation history.
- Changed: Rescaled history values.
- Changed: Moved 'ply' from position to search.
- Changed: Included a slight score correction during search using rule50.
- Changed: Bound logic when storing to TT. I think it is correct now.
- Changed: Move generation creates ExtMoves (64 bits) instead of the raw moves (16 bits), avoiding copying stuff.
- Bug solved: Terrible LMR table accessing out of bounds value resulting in god knows what.
- Bug solved: Node clearing (before enter search and on making nullmoves).
- Bug solved: Corrected 'id name' uci output.
- Stronger: ~3015 ELO on CCRL.
- Added: Chess960 support.
- Added: Staged movepicking.
- Added: Razoring.
- Added: Continuation History.
- Added: Correction History.
- Added: Internal Iterative Reduction.
- Added: CutNode reduction.
- Added: SEE pruning.
- Changed: Transposition Table with 2 entries per bucket.
- Changed: Aspiration Window strategy.
- Changed: Late Move Pruning. Using an improvement rate + depth formula.
- Changed: Late Move Reduction. Using a precomputed table now.
- Changed: Quiescence search. Does not store bestmove anymore.
- Changed: Node counting. Only incremented after doing a move.
- Changed: Finetuned search in general.
- Move generation refactor.
- Position always storing pins for both sides. For future perfect SEE.
- Bug solved: Invalid principal variation output.
- Bug solved: Bishop pair evaluation bug. The mask for white / black squares was wrong.
- Bug solved: A terrible 'get all attacks' bug affecting evaluation, SEE and move ordering.
Does not exist. This was a local bugfix for pv output.
Engine plays reasonable chess. Entered CCRL with 2842 ELO. Many many things need still to be changed, but it is time for a first version.
Engine plays terrible chess, mainly because I am not interested at all in writing an evaluation function. To be continued...
- Major number changes when the evaluation function changes.
- Minor number changes for improvements and bugfixes.
- Version 1.x 3200+ ELO.
- Version 2.x 3400+ ELO (extended evaluation tuning).
- Version 3.x 3600+ ELO (use neural network training).
- setoption name UCI_Chess960 value true -> enables chess960.
- position startpos moves e2e4 e7e5. (moves" is optional) -> sets the startposition, does the moves.
- position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 moves e2e4. (moves is optional) -> sets the fen, does the moves.
- eval -> give the static evaluation of the position.
- go depth 7 -> search position to depth 7.
- go movetime 5000 -> search position for 5000 milliseconds.
- perft 5 -> performs a perft test with subtotals per move.
- qperft 5 -> performs a perft without subtotals per move.
- bench -> performs perft speedtests on 4 positions.
- d -> draw the current position and some info.
- quit -> stop the program.
- cls -> clear the terminal.
Aron Petkovski. I used most of the tuned evaluation of an old version of Integral (3) to get me started (from chessnix 2.0 onwards I will do my own tuning). Jonthan, Janez and Colin on Discord. The people of TalkChess, Zig Forum, CCRL. The authors of the engines I used for testing: Bbc, Cheese, Chessplusplus, Colossus, Cwtch, Infrared, Integral, Lambergar, Linx, Lishex, Mess, Monty, OpenCritter, PlentyChess, Pounce, Priessnitz, Seawall, Seredina, Shallow, Shallowguess, Simbelmine, Stash, Supernova, Teki, Yakka. Some extra thanks to these people who made their engine support chess960. I also learned a lot from the source code of all these engines. Chessnix contains, besides my own inventions, a wild mix of ideas from the chess programming wiki as well as several other chess engines (Alexandria, Cwtch, Lambergar, Integral, PlentyChess, Pawnocchio, Stockfish and probably others).
I spent many years on Lemmix, the DOS Lemmings clone. So in my feeling the name had to end with "ix" as well. Later I found out a nix is a kind of water spirit. So then I added the queen water spirit logo.
I am a github noob and only use a main branch as a backup of the current state on my PC. With every release an extra zip of the source code at that moment is provided.
