Skip to content

Releases: lynx-chess/Lynx

v1.4.0

21 Mar 11:38
Compare
Choose a tag to compare
  • 🔍 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 after ucinewgame (#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

04 Feb 22:17
Compare
Choose a tag to compare
  • 🔍 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

11 Jan 14:52
Compare
Choose a tag to compare
  • 🔍 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 and MoveGenerator.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 and GoCommand asap (#576)
  • 🐛 Fix engine crash due to a negative calculated time to move (#555)
  • 🐛 Add support for negative wtime and btime (#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

14 Dec 00:49
Compare
Choose a tag to compare
  • 🔍 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

20 Nov 09:48
Compare
Choose a tag to compare

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

16 Nov 12:16
Compare
Choose a tag to compare

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

27 Oct 09:22
Compare
Choose a tag to compare
  • 🔍 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 by go command (#455)

Full Changelog: v0.18.0...v0.19.0

v0.18.0

21 Oct 17:00
Compare
Choose a tag to compare
  • ⚖ 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

19 Sep 10:18
Compare
Choose a tag to compare
  • ⚖ 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:

    • Improve position UCI command parsing (#410, #405), improve position
    • Improve other commands parsing (#411)
    • Use FrozenDictionarys where possible (#403)
    • Use C#12 collection literals (#393)
  • 🐛 Fix UCI_EngineAbout string (#408)

Non-strength winning changes:

  • Add printsettings option to print runtime settings Configuration.EngineSettings (#391)
  • Re-Add hashfull in last UCI info command using an approx value (#394)
  • Consolidate apple silicon binaries into osx-arm64 one, add linux-musl-x64 support (#412)

Full Changelog: v0.16.0...v0.17.0

v0.16.0

26 Aug 21:02
Compare
Choose a tag to compare
  • Use standard depth concept in NegaMax 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 from Position (extra indirection) (#367)
  • ⚡ Check sliding pieces attacks last in IsSquaredAttacked (#369)
  • 🐛 Fix IndexOutOfRangeException when ply >= MaxDepth (#348)
  • 🐛 Check maxDepth when btime wtime or MoveTime 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 and divide outputs (#351)
  • 🐛 Fix perft divide (#347)

Full Changelog: v0.15.0...v0.16.0