ChangeLog
=========

20240817 (release 2024-08-17) :
    - Another improvement for search parameters with OpenBench's spsa tuner
    - New network nn-bc638d5ec9-20240730.nnue
    - Introduce correction history for better static eval
    - Introduce cache (Finny tables) for faster accumulator updates
    - Double extensions for very singukar moves
    - Some fixes

20240112 (release 2024-01-12) :
    - Improved search parameters with OpenBench's spsa tuner
    - Various speed improvements by fixing and refining accumulator updates
    - Improve mate finding with and without using tablebases
    - Fix output of MultiPV mode
    - Some few search improvements
    - ARMv6 and ARMv8.2+dotprod now supported

20230918 (release 2023-09-18) :
    - Allows to play various NNUE architectures and input dimensions
    - Reads and writes LEB128 compressed network files
    - New network nn-c257b2ebf1-20230812.nnue
    - Some fixes on the training material generator
    - LMR tweak based on fails high of child nodes
    - Score output scaling based on stats processed with https://github.com/vondele/WLD_model
    - Compiles for x86-32 now

20230410 (release 2023-04-10) :
    - New option 'LimitNps' to limit speed (and strength) of the engine
    - New default network nn-fdccaaabd3-20230314.nnue
    - Fix performance problem reading big tablebase files in Linux
    - Some fixes to avoid blunders in won (TB-)endgames using many threads
    - TT access now uses a pointer to entry instead of direct read
    - Measure and log delay of engine and communication with GUI
    - Some small improvements in search (history extension, no tt move reduction)
    - perft is now 50% faster
    - Additional native x64 binary is now built avoiding even SSE2 code (for debugging purpose)
    - Support for Intel icx compiler which creates builds even faster than Clang

20221203 (release 2022-12-03) :
    - Bugfix for MultiPV which was completely broken in 20221120

20221120 (release 2022-11-20) :
    - New default network nn-5e6b321f90-20221001.nnue using a new archtitecture
    - Preserving compatibility to old networks
    - Support for (de-)compressing network files using zlib
    - Fixed a bug probing 7-men-dtz files using the wide extension
    - Prevent flooding UCI output in low depth
    - Small improvements in search (pruning, cut nodes)
    - Several fixes (crash when default net missing, multi-pv output)
    - Implemented cross-compilation fpr Android (thanks go to Archimedes)

20220813 (release 2022-08-13) :
    - Time management improvements:
        + Plays movetime mode respecting move overhead
        + More flexible time usage depending on nodes spending on best move
        + Plays very short time controls like 1+0.001 without time forfeits now
        + Better support for nodes based time control
        + Avoid getting low on time in moves/time control
    - New default network nn-b1c332ae1d-20220613.nnue
    - Improve endgame draw detection when playing withou tablebase
    - Contempt (default 0) and rating based contempt (triggered by GUI using UCI_RatingAdv)
    - Improved logging ('..._app' for appending, '..._pid' for concurrent loggin using the process id)
    - Speed improvements (1-3% on x86, > 10% on Arm/Neon)
    - Several fixes

20220223 (release 2022-02-23) :
    - Several new and improved networks by successful training (still the Nodchip/S. Vieri fork with several modifications)
        + using > 3 billion completely shuffled positions now
        + scored by iteratively improved networks
        + created by starting with several books like Stefan Pohls UHO
        + pre-testing every epoch's network, not only the loss-decreasing nets
    - New binpack encoder/decoder; full support for converstion between binpack, sfen/bin and plain
    - Fix for DFRC (double fisher random chess)
    - New -uci parameter to feed the engine with UCI commands for batch mode (use 'wait' to let search finish)
    - Use late move reduction for tactical moves
    - New UCI option 'LogFile' to log UCI communication and SDEBUG/TDEBUG output
    - Several fixes: Mates in multi-pv, cpuid detection, embedding networks, ...

2021 (release 2021-12-31) :
    - Switch to a date-based versioning
    - Better use of transposition table like saving fail high in probcut
    - Improve reductions based on hash move
    - Removed pruning of moves with bad counter history
    - Futility pruning retuned
    - Make use of bmi1 and lzcnt cpu instructions
    - Scale nnue evaluation with game phase
    - Use a per-threatened-square move history table (idea by Koivisto)
    - Some fixes for MultiPV
    - Use less time and less moves to mate
    - Implement binpack format for generating training data
    - Export network is possible now

2.2 (release 2021-07-07) :
    - New default network created with trainingdata from 2.1 and lambda 0.4
    - Some speed improvements
    - Fixed segfaults when GUI stops unexpected
    - Makefile supports more platforms now including x86-64-AVX512 and ARM64
    - Implemented penalty for FRC "cornered blocked bishop"
    - 'go searchmoves' is supported now
    - Supports polyglot opening books via UCI options BookFile, BookDepth, BookBestMove

2.1 (release 2021-04-14) :
    - New default network created with trainingdata from 2.0.1 using better depth and fixed gensfen code
    - Expose last NNUE layer and scaling factor to UCI options via EVALOPTIONS and tuned scaling with Kiudee tools
    - NNUE updates slightly faster by using differential updates up to the costs of a full update if possible
    - Better / faster mating by avoiding stupid sacs in TB positions and disabling some pruning when mate was discovered
    - Don't display full PV when this line is already refuted in a fail low or fail high
    - UCI option NnueNetPath uses "Default" for the current net to avoid GUIs reconfiguration with a network change
    - Faster sorting of quiet moves
    - Some fixes in the Makefile e.g. for MacOS
    - Fixed SSSE3 detection
    - Makefile can create binary for SSE2+POPCNT now (e.g. for AMD Phenom II)

2.0.1 (release 2021-02-03) :
    - Fixed KBNvK endgame.

2.0 (release 2021-01-27) :
    - Improved / fixed futility pruning
    - Added support for large pages in Windows
    - Improved speed of NNUE evaluation	
    - Switch to handcrafted evaluation for positions with onesided psq
    - Trained a new net based on Rubi evaluation using last net
    - Improved gensfen: Book support, more parameters
    - Fix for native msys2 compilation
    - SDEBUG fixes

1.9 (release 2020-11-25) :
    - Implement NNUE evaluation code (standard SF flip and mirror format are supported)
    - Trained a net based on Rubi handcrafted evaluation and some data based on first-iteration net
    - Texel tuner has some more options now and an interactive interface
    - Support for search parameters exposed to UCI options (#define SEARCHOPTIONS)
    - Tuned LMP parameters using the kiudee tuning tools
    - Don't initialize bestscore with the positions static evaluation
    - Implemented history heuristic for tactical moves to support move ordering and reduction
    - Evaluation: Penalty for bad rooks without castle right
    - Small fix in the endgame scaling
    - Fix in MultiPV mode

1.8 (release 2020-08-15) :
    - New BMI2 binary using the pext instruction for slider attacks
    - Some tests and warnings if the hardware matches the binary to avoid bad performance and crashed by not supported cpu instructions
    - Evaluation of discovered attacks against queen
    - Evaluation of discovered slider attacks against king area
    - Improved evaluation of (un-)opposed isolated/backward pawns
    - Small evaluation fix for FRC
    - History extension with dynamic update of threshold to avoid depth explosion
    - Tweak on the probcut pruning
    - Small tweak on the time management using different time depending on ponder hit
    - Small tweak/simplifiction in the aspiration window handling
    - Small tweak on history aging
    - Tweak on null move pruning returning beta instead of score of null move search
    - Speed optimizations by better memory alignment
    - Compiler flag to expose eval parameters as UCI options usefull for MEA/NICE testing
    - Improved search debug
    - Fix for extreme positions like the "9-queens"
    - Finally fixed the "stuck at depth 1" problem that should have been fixed in 1.7.1 but wasn't

1.7.3 (no-release 2020-05-11 for TCEC S18) :
    - Added FRC/Chess960 (playing quite bad for now)
    - Faster move generation esp. pawn moves
    - Evaluate backward and isolated pawns with respect to their file (idea by Ed Schröder)
    - Make pawn hash aligned to cache line

1.7.2 (release 2020-04-27) :
    - Fixed a bug in the test for ep capture moves being legal
    - Fix for Android compilation

1.7.1 (release 2020-04-20) :
    - Fixes a bug that in some rare cases lets the root search get stuck at depth 1 with a failing low move from the tt

1.7 (release 2020-04-19) :
    - moveGivesCheck handles discovered checks now
    - Several fixes in the PVS logic (was unchanged since 0.4 release and quite buggy)
    - Added evaluation for minors protected behind pawns, bishop center control and knight outposts
    - Fix for the (rare) bug regarding undetected 3-fold in or following root move
    - Introduce some basic endgame evaluation interface; so far only used for the KBNvK endgame
    - Support for Clang compiler now in the general Makefile
    - Several fixes regarding the UCI interface (nps overflow, wrong scores at fail high/low)
    - Several improvements in the tuner (e.g. correlation of parameters)
    - Some improvements for transposition table (save in qsearch, aligned allocation, support for Linux huge pages, 16bit hash signature)
    - New search debugging code (enabled via SDEBUG)
    - Gerate epd with special endgame positions via new parameter '-generate'
    - Moved time management to main search thread and removed the time management thread
    - Fixed a bug in the evaluation of potential passed pawns
    - Do not reset history stats at every search but only at ucinewgame
    - Don't return tt value at PV node
    - Avoid null moves in pawn endgames, extend capture moves that lead to pawn endgames (solves some bad endgames played by 1.6)

1.6.1.1 (release 2020-01-11 for TCEC S17) :
    - King danger eval tuned

1.6.1 (release 2020-01-11) :
    - Statistic for several search features enabled via STATISTICS
    - Some lmr tweaks based on analyzing this statistics
    - Fixed some bugs in the tuner and retuned several parts of evaluation parameters
    - Evaluate complexity of endgames (idea by SF and several other engines)
    - OpenBench compatibility
    - Simplification in repetition detection
    - Fix in 50-moves detection
    - Bench mode can be run on epd files and test for bestmove detection
    - Enginetest mode can print static evaluation now for comparison

1.6 (release 2019-10-15) :
    - Support for 7-men Syzygy tablebase
    - Improved time management and fixed a related bug causing time violations in some special positions
    - Faster evaluation after null move
    - Removed old and obsolete repetition hash table
    - Reintroduce counter move as third preferred quiet move
    - Evaluate penalty for pawns on same color as bishop
    - Evaluate bonus for rook on rank 7
    - Retune psq parameters with lichess quiet position set
    - Prune quiet moves with bad counter move history
    - Fix for ponder mode not switching to better ponder move sometimes
    - Added parameter for depth used in bench mode
    - Change TB scores to make TCEC GUI not read it as mate score
    - Avoid complete sorting of movelist, just loop for best remaining move
    - Fix voting of best thread, bug was probably introduced with the time management fix
    - Switched to Clang compiler for Windows releases using lto and profiling

1.5 (release 2019-06-27) :
    - Replaced the (sometimes wrong) pv reading from hash table with a real pv table
    - Texel-tuning: Ignore parameters with too few positions in tuning set
    - Replaced "nullmoveallowed" with a verification search
    - Use more granular bonus for connected pawns respecting the number of supporting pawns
    - Evaluate a penalty for pieces pinned to the king
    - Evaluate king support for friendly passed pawn and defense against opponents passed pawn
    - Some small improvements for king danger evaluation
    - Implement aging of moves history bonus
    - Implement "go nodes"
    - Increase general late move reduction and decrease it depending on the moves history
    - Use values read from tt in quiescence search
    - Some speed improvements by removing piece and color loops using template functions
    - Speed improvements by calculating only differential psq in playMove()

1.4 (release 2019-04-27) :
    - Evaluate potentially passing pawns
    - Improved king danger evaluation by a quadratic evaluation term and adapted texel tuner for that
    - Improved speed of by preallocating static memory for all move lists of all plies
    - Improved speed by leaving QUIETSTATE directly in lmr
    - Fixed a (rare but heavy) bug in TB rootmove selection under time preasure
    - Introduced counter move history
    - Introduced razoring
    - Fixed ordering of moves escaping from null move refutation target (didn't work at all before). 
    - Thread limit now at 128
    - New parameters -ppg (positions per gane) and -quietonly for extraction of fen positions from pgn
    - Improved memory usage of texel tuner
    - Fix: Don't use move from hash as best root move if the hash value fails low

1.3.1 (release 2019-02-27 for TCEC) :
    - Make moveoverhead relative to number of threads
    - Don't reallocate hash when number of threads is changed
    - Leave out exchanges with neutral see in qsearch

1.3 (release 2019-02-10) :
    - Finally Lazy SMP is implemented based on the ideas of many common AB engines
    - Changed order of nullmove and (reverse) futility pruning
    - Exclude moves that give check from futility pruning
    - Introduced simple probcut
    - Increase reduction for moves with bad history
    - Introduced a scaled evaluation for drawish endgame material
    - Evaluate pieces that can give check
    - Fixed a "by one" bug in the 50-moves rule handling
    - Implemented movelist for check evasion

1.2.1 (release 2018-12-14) :
    - Some fixes preventing rootsearch playing a move that fails low and wasn't in pv

1.2 (not released 2018-12-10) :
    - Evaluate hanging pieces
    - Evaluate mobility of pieces more fine grained
    - Evaluate passed pawns more fine grained
    - Added extension for singular moves
    - History heuristic: Added penalty for quiet moves that don't fail high and finally switched from piece-destination to butterfly history table
    - Improved debugging code in search
    - Added "position improved" detection and made reduction and futility pruning depend on it
    - Imroved null move search respecting static evaluation and increasing depth reduction
    - Introduced late move pruning, also depending on "position improved" flag
    - Tweaked futility pruning margins
    - Tweaked time management to spend more time if best root move changed

1.1 (release 2018-10-01) :
    - Every evaluation parameter is tapered now
    - Introduced attackedBy information and used them for pawn attacks and pawn push threats
    - Added kind of pawn storm evaluation
    - Turned pawn hash into a "pawn and king" hash
    - Completely rewritten the evaluation and the tuning mode not calling the qsearch all the time but only the evaluation term
    - Tuned all the parameters with game material from Laser (provided by AGE, thanks for that)
    - Improved and fixed ponder mode
    - Added selective depth information in UCI output
    - Introduced bucket system for the transposition table
    - Internal iterative deepening in PV node if hash move is missing
    - New more general SEE code used for pruning moves with bad SEE
    - Switched to a staged move generation seperating tactical from silent moves
    - Fixed bug in repetition detection: Drawing in winning position by perpetual check shouldn't happen to often
    - Some minor fixes and cleanups regarding futility pruning and move stack

1.0 (release 2018-08-04) :
    - Cleanup: Removed board88 and rotating botboard code
    - Refinement of aspiration window
    - Retuned evaluation parameters based on new test games texeltune-09-bal.pgn and finally texeltune-10.pgn
    - More agressive delta pruning in qsearch
    - Fix: Increase history heuristic value only for cutoff move (not for moves that just raises alpha)
    - Fix: Killer moves where taken from wrong ply
    - Seperated move creation in tactical and quiet moves to gain some speed
    - Code consolitation in rootsearch e.g. lmr

0.9 (release 2018-05-28) :
    - Implemented Syzygy tablebase probing
    - Fixed bug with wrong depth stored in TT after a unreduced research
    - Improved LMR from simple "one depth reduction after move 3" to a reduction depending on depth an move number
    - Fixed quiescience search: Doesn't evaluate patscore when in check
    - Evaluation: Added some king danger via attack units
    - Move order: Moves that escape from null move refutation capture get a higher score
    - Added four more positions for benchmarking as this got too fast

0.8.1 (release 2018-03-24) :
    - Implemented ponder mode (works if ponder move can be read from tt)
    - Implemented / fixed "suddendeath without increment" timecontrol

0.8 (release 2018-03-14) :
    - Fast move after depth 4 for singular root move
    - Extended and reverse futility pruning up to depth 3
    - Added mobility for rook/queen and retuned with fresh games pgn
    - Seperate evaluation for semi- and open file bonus for rooks; excluding the queen now
    - Null move pruning improved: prune even in later game phase and with variable depth reduction
    - Improved tuning: Can create and read fen+moves files now which is 5x faster

0.7 (release 2018-01-19) :
    - Introduced small tempo value for evaluation
    - Implemented MultiPV mode for analysis
    - Fixed bug that writes wrong values of incomplete/interrupted search to hash (responsible(?) for blunder in game 65 of Graham div 9)
    - use additional move buffer in calculation of remeaining time in move/time mode
 
0.7 (release 2018-01-06, Pre-Release for Graham division 9 tournament) :
    - Texel-Tuning!!! Implemented a tuner and tuned all the evaluation parameters which gains about 150 ELO. Thanks to Peter Österlund.
    - Improved search:
        + futility pruning implemented with margin 130
        + delta pruning implemented
        + quiescience search now handles promotion moves
        + fixed bug in SEE (missing pawn attacks) and retuned
    - Total score against 0.6 (4000 games in 10+0.1, 2moves_v1 book): 214.97ELO +/- 11.33
 
0.6 (release 2017-11-26) :
    - Store best move in transposition table even for beta cutoff which is important for move ordering
    - New magic bitboard implementation about 24 % faster than rotating bitboards (still compilable via define)
    - Switched to fail soft environment
    - Fixed a bug where pv move value gets overwritten by killer history value which results in bad move order and sometimes even worse bestmove
    - Simplified/fixed quiescence search (again)
    - Introduced LMR (quite simple right now)
    - Improved sudden death time management again; ELO in 10+0.1 is now almost equal to 40/10
    - Improved evaluation of pawns now using a pawn hash (only used in Bitboard version)

0.5 (release 2017-09-29):
    - Moved undo data from chessmove struct to a static stack which speeds up playing moves
    - More speed by making engine, position, tables global instead of passing them by parameters
    - Better evaluation: Ballanced pawn / minors, diagonal mobility, progress of passed pawns
    - Improved time management, especially sudden death mode
    - Avoids wrong best move from last search when under time pressure
    - Really disabled all the debug code if DEBUG is not defined
    - First Linux release.

0.4 (release 2017-08-04):
    - First rotating bitboard version (choose by #define BITBOARD); 0x88 board still available
    - Use 2^x for transposition size and & instead of % which make accessing the TP a lot faster
    - Some fixes in the pawn evaulation (got different scores for white and black before)
    - Added test for symmetric position evaluation (new parameter - dotests substitutes - hashtest)
    - Fixed timemode "time/inc for whole match"
    - Testrepetition() stops searching at halfmovecounter reset now
    - Search improvement by adding aspiration windows and principal variation search

0.3 (release 2017-06-05) :
    - Now really fixed en passant hashing (code got lost somehow before releasing 0.2.1)
    - New evaluation using phase triggered value tables and some pawn specials
    - Function 'getMoves' now returns pseudo legal moves to avoid time consuming play/unplay
    - Both of these changes leads to speed improvement ~40 % compared to 0.2.1
    - Improved quiscense serach although this might not be the end of story
    - Implemented simple heuristic for insufficient material
    - Improved time management for tournament mode and switched to QueryPerformanceCounter API
    - Fixed memory leaks
    - Removed undotest flag
    - Implemented benchmark mode
    - Some fixes in uci option handling

0.2.1 (release 2017-03-28):
    - Tuned attack detection, move generation, SEE, play/unplay to get more speed out of it; perft shows ~10 % better performance
    - Added history heuristic for move ordering; improvement visible in wacnew/199 where next depth is reached in half time compared to 0.2
    - Implemented 50-moves rule
    - Fixed bug in en passant hashing
    - Fixed bug: ENGINESTOPSOON did not take move of last iteration
    - Improved testengine mode (compare mode, avoid moves, exit flags)

0.2 (release 2017-03-19):
    - Improved use of transposition table which is not reset anymore and can deal with alpha and beta bound entries
    - Alphabeta now uses a quiscence based on SEE evaluation for captures to go
    - Null move pruning added
    - Move ordering now uses killer moves
    - Simplified unplay to just reset the old values stored by play procedure instead of emulating the reverse play
    - Function 'getPositionValue' changed to some simple rules:
        + prefer central fields for knight and bishop
        + prefer open files for rook and queen
        + prefer border positions for king in the beginning to force castles
        + pawns: prefer central pawns, penalty for double pawns, move forward in endgame

0.1 (release 2017-02-24):
    - 0x88 board representation with (hopefully) bugfree move generation and play/unplay
    - Alpha-beta-search implemented with pv move ordering and some 'prefer captures' heuristic
    - Basic implementation of transposition table; not yet very powerfull as it is cannot deal with non-exact values and is reset after every iterative seach
    - getPositionValue: expensive but quite strong position evaluation bases on counting dominated fields
    - Basic UCI protocol implementation so that it can play tournaments in Arena
    - perft implemented
    - testengine mode for bulk testing of EPD files
