Releases: lynx-chess/Lynx
v1.5.1
v1.5.0
- π Add Futility pruning (FP) (#733)
- π LMR: allow when in check (#702)
- π LMR: reduce more if there's a TT move and a capture (#706)
- π Move RFP before NMP (#732)
- π SPSA search parameters tuning (#730, #764)
- βοΈ Remove double pawns penalty [proper SPRT pawn eval] (#746)
- βοΈ Index bishop mobility bonus by attacks count (#758)
- βοΈ Index rook mobility bonus by attacks count exluding own pieces (#768)
- βοΈ Add knight mobility bonus and index it by attacks count excluding own pieces (#775)
- βοΈ Take only pawns into account for king shield (#789)
- βοΈ Add king virtual mobility indexed by mobility count (#785)
- βοΈ Use some Stoofvlees quiet data for eval tuning (#710)
- β‘ Improve search logic (#725)
- β‘ Use optimized method to check if a move was valid (#716)
- β‘ Use a
StringBuilder
to generate UCIinfo
command (#805) - β‘ Remove option to disable TT (#720)
- β‘ Remove manual piece count during static eval (#698)
- β‘ Simplify
TaperedEvaluationTermByRank
(#757) - β‘ Simplify
TaperedEvaluationTermByCount
(#767) - β‘ Simplify Aspiration windows (#802)
- π Fix index out of range exception on max depth (#708)
- π Detect threefold repetition on
pvNode
(#796) - π Fix
Game.MakeMove
behavior on invalid moves (#804)
Non strength-winning changes:
- Add ponder support (#772)
- Generate UCI options for search parameters dynamically (#734)
- Normalize mobility values (#788)
Full Changelog: v1.4.0...v1.5.0
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