Releases: lynx-chess/Lynx
v1.4.0
- 🔍 Improve RFP (#652)
- 🔍 Avoid doing TT cutoffs on PV nodes (#653)
- 🔍 Use TT score as positional eval for pruning (#692)
- ⚖ Tweak pawnless endgames evaluation (#693)
- ⌛ Tweak time management (#664, #665, #667, #668, #671, #677, #691)
- ⚡ Stop checking for two/threefold repetition and 50 moves draws in QSearch (#673)
- ⚡ Refactor
Update50movesRule()
method (#678) - ⚡ Reimplement repetition detection (#679)
- ⚡ Prefetch TT entry in NegaMax search (#681)
- ⚡ Remove
Position.StaticEval()
heap allocations (#683) - ⚡ Force GC collection at the end of
Engine
constructor and afterucinewgame
(#685) - ⚡ Use packed evaluation (#697)
- 🐛 Clear history on
newgame
(#649) - 🐛 Fix long input
position
commands parsing (#650) - 🐛 Fix engine stall when depth over 100 is reached during search (#651)
- 🐛 Don't search with fixed depth when cutechess provides 0s to move (#654)
- 🐛 Prevent illegal moves when low in time (#657)
- 🐛 Error when searching at max depth (#670)
Non strength-winning changes:
- Add
fen
UCI command (#688 - Increase max TT size from 1GB to 8GB (#669)
- 🐛 Fix behavior of consecutive
go
commands (#655)
Full Changelog: v1.3.0...v1.4.0
v1.3.0
- 🔍 Add basic (quiet) history malus/penalty (#610)
- 🔍 Add capture history (#634)
- 🔍 Update (quiet) history moves only in beta cutoffs (#608)
- 🔍 Stop clearing quiet history (#637)
- 🔍 Take quiet history into consideration for LMR (#613)
- ⚡ Refactor move encoding methods and stop encoding special move flags individually (#622)
- ⚡ Store captured pieces as part of the move (#604)
- ⚡ Use jagged arrays (
[][]
) instead of multidimensional ones ([,]
) (#605, #606, #607) - ⚡ Simplify triple repetition detection logic, removing some branching (#623)
- ⚡ Make
Piece
an integer enum (#603)
Full Changelog: v1.2.0...v1.3.0
v1.2.0
- 🔍 Prune SEE bad captures in QSearch (#558)
- 🔍 Reduce SEE bad captures in regular search (#564, #571)
- 🔍 Use spsa tuned search values (#543, #553)
- ⚖️ Add rook mobility to eval (#539)
- 🧬 Improve move generation: hardcode castling moves and a few calculated variables (#541)
- 🧬 Implement SEE and order bad captures after killers but before quiet moves (#554)
- ⚡ Reduce TT entry size to 8 bytes (#544)
- ⚡ Optimize
go
command parsing (#545) - ⚡ Split
MoveGenerator.GenerateAllMoves
andMoveGenerator.GenerateCaptures
to avoid branching (#549) - ⚡ Set search thread as high priority (#546)
- ⚡ SEE micro-optimizations (#566)
- ⚡ Use stack-allocated span for movegen (#551, #596)
- ⚡ Optimize
PositionHash
(#582) - ⚡ Optimize castling and en-passant moves Zobrist hashing (#577)
- ⚡ Replace
EnPassantCaptureSquares
dictionary with equivalent array (#578) - ⚡ Optimize FEN parsing (#581)
- ⚡ Attempt to initialize
MoveGenerator
andGoCommand
asap (#576) - 🐛 Fix engine crash due to a negative calculated time to move (#555)
- 🐛 Add support for negative
wtime
andbtime
(#556) - 🐛 Enable
InvariantGlobalization
and fix crash in some Linux scenarios (#575)
Non strength-winning changes:
- Add option to run
bench
at different depths (#537)
Full Changelog: v1.1.0...v1.2.0
v1.1.0
- 🔍 Add Internal Iterative Reduction (IIR) (#507)
- 🔍 Add basic LMP (#512)
- 🔍 Improve TT replacement scheme: add required conditions for always replace (#526)
- 🔍 Add third killer move (#517, #525)
- 🔍 Use new history bonus formula based on Sirius and Berserk one (#527)
- 🔍 In case of 'fake' ponder-hit, research from depth 1 (#467)
- ⚖ Re-tune eval using some Stash data (#515)
- ⚡ Avoid PEXT array initialization when PEXT isn't supported (#516)
Full Changelog: v1.0.1...v1.1.0
v1.0.1
Non strength-winning changes:
-
🐛 Clamp static evaluation within +- checkmate limits, preventing illegal moves (and erratic behavior in general) in positions with too much material on one side (#510).
We're talking about positions here such as
QQQQQQQQ/QQQQQQQQ/QQQQQQQQ/QQQQQQQQ/QQQQQQQQ/QQQQQQQQ/QPPPPPPP/K6k b - - 0 1
, which will never happen in a real game but can be artificially set up (i.e. in lichess), so no strength change is expected in regular engine games.
Full Changelog: v1.0.0...v1.0.1
v1.0.0
Getting out from ZeroVer club now that these two conditions are met:
- Lynx has basically reached feature-parity with BBC, engine outcome of
BitBoard Chess Engine in C
YouTube playlist that helped me the most during the initial phases of Lynx development. - .NET 8 GA has been released and therefore Lynx no longer relies on pre-release SDK or library versions.
- 🔍 Rewrite NMP (#479, #482, #492, #493, #494)
- 🔍 In case of 'ponder-hit', research last depth (#466)
- 🔍 Don't clear TT move if no best move is provided: keep old one II (#478)
- ⚖ Use PSQTs tuned without explicit piece values (#425)
- ⚡ Incremental move sorting (#477)
- ⚡ Avoid checking lack of material in static evaluation when the phase is high enough (#490)
Full Changelog: v0.19.0...v1.0.0
v0.19.0
- 🔍 Tune LMR reduction (#452)
- 🔍 PVS-LMR logic improvement (#456)
- 🔍 Implement TT in quiescence search (#308)
- 🔍 Don't clear TT move if no best move is provided: keep old one (#462)
- ⌛ Check
_searchCancellationTokenSource
in qsearch as well (#454) - 🐛 Avoid storing the same move duplicated in both killer moves (#458)
- 🐛 Ensure no search depth 0 happens after a 'ponder hit' (#465)
Non-strength winning chnages:
- 🐛 Fix
ucinewgame
command when followed bygo
command (#455)
Full Changelog: v0.18.0...v0.19.0
v0.18.0
- ⚖ Tune PSQT (#414, #415, #417)
- 🔍 Add razoring (#429)
- 🔍 Add soft cap history moves score (#442)
- 🔍 Revisit and improve Aspiration Windows (#437)
- ⚡ Implement PEXT bitboards for bishop and rook attacks (#451)
- 🐛 Fix evaluation when checkmate is delivered at the same time 50 moves rule apply (#453)
- 🐛 Fix move ordering at high depths/LTC (#448, indirectly #442)
- 🐛 Avoid re-searches in IDDFS (#439)
Non-strength winning changes:
- ⚖ Normalize eval and add
UCI_ShowWDL
option (#421, #422) - 🧹 Remove
UseOnlineTablebaseInSearch
from UCI (#441)
Full Changelog: v0.17.0...v0.18.0
v0.17.0
-
⚖ Add full PSQT and tapered evaluation (#379)
-
⚖ Add tapered bishop pair bonus (higher in endgames) (#390)
-
🔍 Add Reverse Futility Pruning (RFP) (#382)
-
🔍 If there's a single legal move, make it immediately (#401)
-
⌛ Add basic time management when
MovesToGo
are provided (#409) -
⚡ Various .NET related perf improvements around .NET 8 new capabilities:
-
🐛 Fix
UCI_EngineAbout
string (#408)
Non-strength winning changes:
- Add
printsettings
option to print runtime settingsConfiguration.EngineSettings
(#391) - Re-Add hashfull in last UCI
info
command using an approx value (#394) - Consolidate apple silicon binaries into
osx-arm64
one, addlinux-musl-x64
support (#412)
Full Changelog: v0.16.0...v0.17.0
v0.16.0
- Use standard
depth
concept inNegaMax
method (#377) - ⚡ Remove UCI
hashfull
command for performance reasons (#342) - ⚡ Force TT array to have a power of two length (#349)
- ⚡ TT entry
struct
alignment (#352) - ⚡ Remove explicit hardware intrinsics usage (#343)
- ⚡ Optimize divisions by power of two (#350)
- ⚡ Avoid opposite side offset calculation (#345)
- ⚡ Add
MoveGenerator.CanGenerateAtLeastAValidMove
(#360) - ⚡ Remove
MoveGenerator
methods fromPosition
(extra indirection) (#367) - ⚡ Check sliding pieces attacks last in
IsSquaredAttacked
(#369) - 🐛 Fix
IndexOutOfRangeException
whenply >= MaxDepth
(#348) - 🐛 Check maxDepth when
btime wtime
orMoveTime
go commands are provided (#361)
Non strength-winning changes:
- Make executables self-contained, without the need of
appsettings.json
(#362) - Parse cli arguments and use them as UCI commands (#370)
- Add warning when invalid fen parsed (#357)
- Remove non ascii char from standard output (#373)
- Add OpenBench support (#339, #372)
- Add Mnps to
perft
anddivide
outputs (#351) - 🐛 Fix perft
divide
(#347)
Full Changelog: v0.15.0...v0.16.0