New version chess engine: Lynx 1.7.0 (Windows, MacOS, Linux)
Lynx it's written in C# (.NET 6). UCI protocol is needed.
Chess Engines Diary Rating CEDR=2890
Lynx release artifacts are self-contained and require no dependencies to be run.
However, you can also choose to build Lynx yourself.
Requirements
NET 6 SDK. You can find instructions about how to install it in yo
v.1.7.0
🔍 Search
Regular search: fail hard -> fail soft (#1039, #1040, #1041)
QSearch: fail hard -> fail soft (#1052)
Fail soft TT cutoffs (#1044)
Remove pvNode condition for first move full search (#1045)
History pruning: quiet history (#972)
Improve queen promotion with capture move ordering (#1061)
Make TranspositionTableElement.Key an ushort instead of a short (#1070)
SPSA 2024-10-1 (#1074)
⚖️ Evaluation
Enemy king related PSQTs (#924)
Friendly and enemy king distance to passed pawn (#955)
Passed pawns: bonus for not enemy pieces ahead (#998, #1008)
Pawn phalanx (#1009, #1010)
Bishop penalty: same color pawns (#1022)
Bishop penalty: blocked central pawns (#1029)
Checks (#1027)
Mobility: exclude squares attacked by opponent's pawn (#958)
Add 50 moves rule scaling, down to 50% of the score (#965)
Improve endgame scaling with pawn count (#928)
Bucketed passed pawns (#945)
Index queen mobility bonus by attacks count excluding own pieces (#774)
Tuning: use some Ethereal FRC data (#916)
Tuning: tune at 5k epochs (50k epochs -> 10k epochs -> 5k) epochs (#1031)
⌛ Time management
Use expected moves to go (#996)
⚡ Speedups
Move Move serialization to Writer thread (#999)
Add a Board array to Position to track where pieces are indexed by square (#849)
Remove good old _isFollowingPV and _isScoringPV (#1034)
Make TaperedEvaluationTerm an integer I (#935)
Add PSQT class to store PackedPSQT (#939)
Flatten PSQTs [][][][] (#927)
Flatten capture history (#870)
Pin 1 dimension arrays (#953)
Pin attack-related arrays (#985)
Reverse killer moves arrays (#861)
Replace Chebyshev distance calculation with lookup table (double array) (#957)
Refactor additional evaluations: pass piece side (#963)
Speedup InfoCommand.SearchResultInfo (#984)
Make SearchResult.Moves an array and optimize its population (#986)
Refactor Game.PositionHashHistory into a private array (#991)
Remove Position.MakeMoveCalculatingCapturedPiece, using Position.Board instead (#1021)
Only update PV table on PV nodes (#1042)
🧠 Memory usage (!)
Remove unnecessary, initial TT initializations (#989)
Allocate TT only once, clearing it afterwards on ucinewgame (#990)
Avoid static readonly flat array initial allocations for inline arrays (#948)
Use ArrayPool to reduce recurrent allocations (#983)
Stop generating logs/log-∗.log files by default (#1004)
Cache Move.UCIString results in a Dictionary(#1001)
Optimize go command parsing (#1005)
Remove unused props from SearchResult and re-order the ones left (#1006)
🐛 Bug fixes
Don't prune moves in regular search while being checkmated (#1060)
Prevent negative checkmate scores from being lower than EvaluationConstants.MinEval (#1063)
Non-strength winning changes:
Relevant for testers:
By default log files are no longer generated under logs/ dir unless warnings or errors happen (#1004)
Lynx process' memory usage won't skyrocket to twice the expected (TT) value anymore, as it could briefly happen in the past, providing there was such memory available for it.
Simplify appsettings.json (#1075)
Relevant for developers that consume the NuGet package:
Lynx allocates way less than before when searching, which implies much lower GC pressure.
You have control now of UCI info and bestmove string allocations if you're using Searcher class to interact with the engine, since now the channel doesn't send the information pre-serialized (details below).
API changes:
Channel<string> -> Channel<object>, you're now expected to invoke .ToString() on whatever comes from the channel to print it. Alternatively, you can just consume it by checking object types (they are either strings, Lynx.Model.SearchResult or Lynx.UCI.Commands.Engine.BestMoveCommand) (#999)
Remove Position(Position, Move) constructors, now you're forced to use MakeMove/UnMakeMove methods (#976)
Remove parameterless Game constructor, a fen or a parsing result is always required now (tip: Constants.InitialPositionFEN can be used) (#980)
Make Position.UniqueIdentifier an ulong instead of a long (#1078)
Lynx 1.5.1 - Individual statistics
Odonata 0.9.0 | 1/10 | -8 | 10 Games |
Beast 15 MPV | 1/8 | -6 | 8 Games |
Caissa 1.19 | 0.5/8 | -7 | 8 Games |
HypnoS 220624 | 0/8 | -8 | 8 Games |
Kookaburra 3.00 | 0/7 | -7 | 7 Games |
Bread Engine 0.0.5 | 5/6 | +4 | 6 Games |
Javelin 2.0.0 | 3/6 | +0 | 6 Games |
Inanis 1.3.0 | 2/6 | -2 | 6 Games |
Alexandria 7.0.0 | 0/6 | -6 | 6 Games |
Stockfish 20240623 | 0/6 | -6 | 6 Games |
Dodecahedron 0.0.1.2 JA | 4/4 | +4 | 4 Games |
Heimdall 0.1 | 4/4 | +4 | 4 Games |
Drosophila 1.6 JA | 4/4 | +4 | 4 Games |
Sloth 1.9 | 4/4 | +4 | 4 Games |
JigSaw 5.8 | 1/4 | -2 | 4 Games |
Lambergar 0.6.0 | 1/4 | -2 | 4 Games |
Deep Ripper -1 | 0.5/4 | -3 | 4 Games |
Clover 6.2 | 0.5/4 | -3 | 4 Games |
Mayhem 8.3 | 0.5/4 | -3 | 4 Games |
Motor 0.6.0 | 0/4 | -4 | 4 Games |
SF-PRO 14.06.2024 | 0/4 | -4 | 4 Games |
---
Lynx 1.7.0 download github:https://github.com/lynx-chess/Lynx/releases/
Comments
Post a Comment