2024-01-12: Texel 1.11 (ELO: +63) Neural network improvements: - Fewer non-incremental updates of the first layer state. - Implement quantization aware training. - Better GPU utilization by using separate data loading threads. - Efficiently handle training data that is too large to fit in RAM. - Train a new network based on new training data evaluated by Texel 1.10. - Optionally use AVX-512 instructions. Other: - Re-calibrate UCI_Elo for NNUE. - Fix a null-move verification problem. - Update GoogleTest code to version 1.14 to fix warnings when using new CMake versions. - Add state to the Square class, i.e. make it contain the square number. 2023-09-25: Texel 1.10 (ELO: +173) Speed up evaluation: - More handwritten code using compiler intrinsics. - Switch from gcc to clang for Windows compiles. - Cache-line align data for more efficient SIMD load/store. - Avoid "horizontal adds" in matrix multiplication by re-arranging weight data ahead of time. Better neural network: - Train a new network based on new training data evaluated by Texel 1.09. - Use both search scores and game results when generating training data. - Compute quantized validation error during training. - Set unused layer 1 weights to 0 during training, to reduce compressed network size. - Print weight/bias statistics during net quantization, to make it possible to see if quantization parameters are reasonable. - Permute the quantized net for more efficient sparse handling of the outputs from the first layer. Compilation fixes: - Fix Visual Studio debug compilation. - Fix cygwin/msys2 compilation problems. - Better SIMD support for 32-bit CPUs. Other: - Add source code for "syncengine" program. - Allow MultiPV mode also when playing games. - Re-introduce evaluation score reduction when the half-move clock is large. No strength improvement but avoids shuffling moves in some situations. 2023-07-30: Texel 1.09 (ELO: +252) - Implement NNUE evaluation. 2023-06-10: Texel 1.08 New features: - Allow arbitrary hash table sizes up to 1TiB of memory. - Add "contempt" UCI parameter. - Add automatic contempt depending on opponent name. - Add support for 7 man Syzygy tablebases. - Add "runcmd" Windows program. Useful for GUIs that don't allow specifying command line arguments to the engine. Bug fixes: - Fix crash in Windows NUMA/CPU discovery code. - Fixed rare crash when running in cluster mode. - Changed default "ponder" UCI option value to false. Time management: - More dynamic time management. - Better time allocation for ponder on games. Search: - Use depth-dependent singular extension threshold. - Add tempo bonus. Reduced strength: - Add MaxNPS UCI parameter. - Make reduced strength work for Threads > 1. - Add UCI_LimitStrength and UCI_Elo support, range -625 - 2540. Infrastructure: - Use CMake instead of a handwritten Makefile. - Use Google Test framework instead of CUTE. texelutil: - Use C++ threads instead of OpenMP. - Build texelutil with reduced functionality even if Armadillo and GSL libraries are not found. - Add a reverse move generator, "texelutil revmoves". - Improve "texelutil proofgame" for random positions. - Add "texelutil rndfen" to generate random positions. Documentation: - Document how to estimate number of legal chess positions. - Document the Texel tablebase probing algorithm. 2017-09-30: Texel 1.07 (ELO: +35) Search: - More aggressive LMR in expected CUT nodes. - Don't use history and killer heuristics for captures. - Prevent q-search explosion in pathological cases. - Allow LMR for checking moves with negative SEE value. - Don't do internal iterative deepening when in check. - Don't do razoring when in check. - Don't check extend SEE<0 moves at depth<=3. - More LMR/LMP reduction if the evaluation score is worse than it was two plies ago. Idea from stockfish. - More aggressive reverse futility parameters. - In hash replacement, prefer a deep bound over a shallow exact entry if the depth difference is larger than 3. - Use history score to control LMR reductions. Parallel search: - Parallel search algorithm changed to hybrid lazy SMP / ABDADA. - Removed code that on NUMA avoids probing the TT at depth 0 for nodes > 0. Evaluation: - Removed the piece trade bonus. - Implemented fortress detection for KQvsKRM+pawns endgames. - Added endgame correction for KQKNNNN which is generally won by the knights. Speed: - Support for large and huge page allocations for the transposition table. - Added alpha/beta pruning to the SEE function. - Added support for sliding move generation using the PEXT BMI2 machine code instruction. Other: - Include "hashfull" information in UCI output. - Added UCI option to control whether the transposition table is aged when starting a new search in analysis mode. 2016-07-10: Texel 1.06 (ELO: +56) Search: - Don't use ply-2 killers for move ordering. - Be more restrictive when extending losing (SEE<0) checks. - Don't do check extensions for moves that are reduced by LMR. - Don't do singular extensions if the unextended score is a mate score. - Don't do LMR for the first 2 pseudo-legal moves. - More aggressive LMR. - More aggressive null move searches. - Don't resolve a known loss score bound if there are other moves that are potentially not losing. Parallel search: - Allow a helper thread that fails high to interrupt the master thread. - Changed MIN_SPLIT_DEPTH from 10 to 7 to make better use of multiple threads in short time control games. - Changed maximum number of search threads to 512. - Added support for windows NUMA systems having more than 64 cores. Evaluation: - Evaluation term to encourage "pawn breaks". - Bonus for "latent" pawn attacks on enemy minor and major pieces. - Bonus for safe queen contact checks. - Only treat pawns on rank 2 and 3 as backwards pawns. - King safety bonus for pieces (except bishops) on the same side of the board as the king. - Parameter tuning. Endgame: - More patterns for fortress detection in bishop endings. - On-demand tablebase generation for 4-men pawn-less positions. - Knowledge about KRKBNN endgame, which is generally a draw. - Better evaluation of KRBNKRB endgame. - Larger evaluation score in KRRMKRR endgames - Improved 50 move draw handling for TB probes. Speed: - Reduced TB probe overhead. - Implemented a small (512KB) per-thread evaluation hash table. - Removed support for fractional depth. - Made the transposition table 4-way set associative. Other: - Removed "64-bit" from the engine name. 64 bit is now considered standard. - UCI option to disable null moves. - Made "BufferTime" a UCI parameter to control time handling safety margin. - Don't start a new search iteration if it is unlikely that it can finish before the allocated thinking time is up. - In analysis mode, don't age transposition table entries when starting a new search. 2015-01-24: Texel 1.05 (ELO: +57) - Added support for Gaviota and Syzygy tablebases. - Improved the built in opening book. - Implemented UCI option "Clear Hash". - Optimization for NUMA hardware. - Earlier transposition table prefetch. - Added evaluation of "semi-trapped" rooks. - Removed the guarded passed pawn evaluation. - Don't rely on the transposition table to communicate search results from helper to master thread. - Use more time early in sudden death and increment games. - Smaller delta in aspiration window loop. - Optimized history heuristic update formula. - Improved fortress detection for bishop and pawns vs pawns. - Detection of "16 pawn fortress positions". - Added bonus for pieces protected by pawns. - Fixed incorrect draw scores in multipv mode. - Made piece square tables have left/right asymmetry. - Detection of KQKRP fortress positions. - Disabled LMP in PV nodes. - Only do check extension for negative SEE moves if the remaining depth is small. - Implemented singular extensions. - More aggressive LMR. - Fixed makefile to make multi-threaded search work for Android. 2014-05-29: Texel 1.04 (ELO: +72) - Added separate queen piece square tables for middle game and endgame. - Added recognition of some drawn endgames involving bishops and pawns. - Added evaluation corrections for QvsRR, QvsRM, RvsM, RvsMM. - Made bishop pair bonus depend on number of opponent minor pieces. - Added more evaluation terms for pawns (own and opponent) in front of the king. - Added evaluation terms for king assisting passed pawns. - Made king endgame piece square table contain 32 parameters. - Made the isolated and doubled pawn penalties file dependent. - Added file dependent passed pawn bonus. - Only use the protected passed pawn bonus when the non-pawn material is balanced. - Improved knight mobility evaluation. - Added bonus for a piece blocking an opponent passed pawn. - Added non-linear king safety and tuned other king safety parameters. - Improved KRKP evaluation. - Added evaluation of connected passed pawns. - Added drawishness factor to rook endgame evaluation, based on white/black pawn asymmetry. - Added endgame corrections for KRPKM. - Added square-dependent bonus for pawns protecting/attacking other pawns. - Added bonus for minor pieces protecting the king. - Added penalty for semi-backward pawns. - Reduce evaluation score when the halfmove clock is large. - Added bonus for rook behind passed pawn. - Optimized razor margins and delta pruning margin using CLOP. - Improved the built in opening book. 2014-01-19: Texel 1.03 (ELO: +112) - Multi-threaded (SMP) search. - Remove moves before the last zeroing move from the repetition history list before starting search. - Removed bogus transposition table store in Search::iterativeDeepening(). - Disable aspiration window logic when searching for a faster mate. - Added null move verification search. - Prefetch entries from the main transposition table. - Bonus for candidate passed pawns. - Skip move ordering after enough moves to trigger LMP have been searched. - Implemented pawn storm bonus for opposite castling positions. - Removed the Botvinnik-Markoff extension. - More aggressive LMR. - Added knowledge for KBpKB, KNpKB, KBpKN and KNpK endgames. - Store endgame flag in material hash table. - Optimized lots of evaluation function parameters. - More consistent evaluation of different classes of pawnless endgames. KQK, KRK, KQKM, KBBK, KBNK, KQKR, KQKMM, KMMKM (M = B or N). - MultiPV-support. - Mate distance pruning. - Evaluation correction for 7 knights vs 3 queens. - Display engine evaluation using "info string" when starting search in analysis mode. - Changed internal parameter handling to make it easier to switch between UCI parameters and compile-time constants. 2013-06-08: Texel 1.02 (ELO: m=99 s=4.7) - Fixed KNNpK evaluation bug. - Fixed infinite loop when engine received EOF on standard input. - Only do one check in q-search. - Speeded up and improved the search tree log file analyzer. - Remember history information between searches. - Remember best move (for LMR threat detection) also when there is a transposition table hit or when going into q-search on the next ply. - Cache line aligned the main transposition table and the pawn hash table. - Use cache-optimized magic bitboard constants. - Handle stalemate in kqkp endings with pawn on a2/h2 and king on a1/h1. - Detect illegal moves before playing them. Makes code look nicer. - Reduce aspiration window from 20cp to 15cp. - Gradually widen aspiration window after fail high/low at root. - Store stale-mate scores in transposition table. - Don't do LMP if best move so far is negative mate score. - Smaller razor margin at depth <= 1. - Support for SSE4.2 and POPCOUNT. - Added knight mobility evaluation. - Added KRPKR end game evaluation based on table base statistics. - Use different bishop piece square table in the end game. - Some speed optimizations. - Fixed castle bonus asymmetry. - Use an incrementally updated material identifier to simplify end game classification. - When ordering root moves, use accumulated node counts instead of just last ply counts. - Added evaluation term for bad bishops. - Rescale history counters before starting a search, so that they adapt faster to the new situation, but still remember information from the previous search. - Use a material hash table with material score and interpolation factors for other evaluation terms. - Added evaluation term for redundancy of major pieces. - Made history aging symmetric with respect to success/failure. - Implemented knight outpost evaluation. - Optimized pawn structure, major piece redundancy and knight outpost weights using CLOP. - Disabled late move pruning in late end games. - Fixed crash if EOF is received on standard input while engine is thinking. - Better time management in "ponder on" games with increment. - When only one legal move is available, think slightly longer than 2 ply. 2012-03-24: Texel 1.01 - Ported from Java to C++. About twice as fast as a result. - Made node counters 64-bit to avoid overflow in long searches. - Fixed handling of UCI "searchmoves" command. - Added evaluation term to avoid walking into wrong corner in KRKB endings. - Implemented reverse futility pruning. - Implemented late move pruning. - Made strength setting between 0% and 10% even weaker. 0% now plays random legal moves and 10% corresponds to the old 0% setting. - Replaced cuckoo hashing with a more cache-friendly alternative. - Try harder not to lose on time in really short time control games. - Implemented passed pawn race evaluation. - Increased passed pawn bonus for pawns on rank 6 and 7. 2011-10-24: Version 1.12 (ELO: m=61 s=1.6) - Don't use aspiration window when mate score has been found. - Optimized the legal move generator. This has minimal effect on playing strength, but improves perft speed a lot. - Added bishop back rank penalty. - Don't LMR reduce captures more than one ply. - Avoid array index out of bounds exception if the engine is asked to search a position where there are no legal moves. - Optimized piece values using CLOP. - Store razoring results in the transposition table. - Use SEE sign and MVV/LVA to order moves in non-q-search nodes. - Try equal captures before non-captures in non-q-search nodes. - Update killer moves when a transposition table hit gives a beta cutoff. - Implemented signSEE function that can be used when only the sign of SEE is needed. - Ignore squares attacked by enemy pawns when computing mobility. - Added evaluation of KRKP end games, based on statistics gathered from EGTB information. - Skip null-move search if the static score is below beta. - Update hash entry "generation" value after a transposition table hit. - Optimized bishop pair bonus using CLOP. - Optimized futility margins using CLOP. 2011-06-12: Version 1.11 (ELO: m=47 s=4.8) - Do extended futility pruning also on depth 4. - Implemented razoring. - Added support for fractional ply extensions. - Use MVV/LVA ordering (but SEE pruning) in the q-search. - Some speed optimizations. - Use IID also at non-PV nodes. - Made aspiration window a bit smaller. - More aggressive futility pruning. - Increase beta in two steps when a root move fails high. - More accurate evaluation of end games with insufficient mating material. 2011-04-23: Version 1.10 (ELO: m=13 s=2.9) - More aggressive futility pruning. - Increased passed pawn bonus a little. - Added small penalty for non-developed bishops. - Implemented adjustable playing strength. 2011-03-16: Version 1.09 - Speeded up the SEE function by using bitboard techniques. - Use a lookup table to speed up castle bonus calculations. - Implemented specialized move generator function for check evasions. - Some speed optimizations. - Implemented specialized make/unmake move functions used by SEE. - Allow more time to resolve fail lows at the root. - Bug fix. Reset en passant square when making a null move. - Don't allow too much time to resolve a fail low if too close to the next time control. - Stop searching immediately after a ponder hit if only one legal move. - Store successful null-move prunings in the transposition table. - Give extra bonus to passed pawns if enemy king is outside "the square". - Only try two hash slots when inserting in the transposition table. - Try harder to keep PV nodes in the transposition table. - Use a hash table to speed up king safety evaluation. - Adjusted the knight piece square tables. - Added code to dump the search tree to a binary file, and code to browse and search the dump file. 2011-01-30: Version 1.08 - Modified the bishop piece square table. - Added penalty for bishop trapped behind pawn on a2/a7/h2/h7. - Added isolated pawn penalty. - Fixed race condition in UCI mode with quick ponder misses. - Added backward pawn penalty. - Modified the history heuristic calculations. 2011-01-18: Version 1.07 - Speed optimizations. - Only apply the "drawish factor" for opposite colored bishops if the non-pawn material is balanced. - Added evaluation of KQKP end games. - Added evaluation term for two rooks on the 7th rank. - Implemented delta pruning in the q-search. - Improved reduction logic. Don't allow reduction of hash moves and killer moves, but allow larger reductions for other moves. - Fixed bug related to stalemate traps and the 50-move rule. - Allow null moves and LMR also in PV nodes. - Don't do futility pruning and LMR for passed pawn pushes to the 6th and 7th ranks. - Added bonus in end games for having king close to opponents passed pawn promotions squares. - Don't allow null moves when side to move doesn't have pawns. This fixes problems in KQKR end games. - Extend the search one ply when going into a pawn end game. - Reduced queen mobility bonus. - Increased the passed pawn bonus and made it non-linear. - King safety adjustment. - Added a threat bonus evaluation term. - Penalize unmoved d/e pawns. - Undo LMR if the threat move slides through the LMR move "from square". Idea from Stockfish. - Ponder even if there is only one valid move. - Allow LMR also at the root. 2010-12-31: Version 1.06 - Speed optimizations. - Implemented non-linear mobility scores. - Fixed bad interaction of futility pruning/hashing/fail soft. - Tweaked rook piece square table a little. - Order root moves according to search tree size on previous ply. - Don't trust mate scores from null move searches. - Increased the bishop pair bonus. - Tweaked king safety a bit. - Removed mate threat extension. - Only extend recaptures if the recapture is reasonable according to SEE. - Use a built-in bitbase for KPK evaluation. - Reduced the aspiration window to 25 centipawns. - Prune checking moves with negative SEE score in q-search. - Allow reductions and pruning of losing (according to SEE) captures. - Added end game evaluation of rook pawn and wrong-colored bishop. - Added penalty for rook trapped behind non-castled king. - Don't allow double null moves. - Allow null move search to go directly into q-search. - More depth reduction in IID at large depths. - Implemented null move threat detection, to be able to undo unsafe LMR reductions. Idea from Stockfish. - Don't overwrite a transposition table hash entry with inferior information for the same position. Could happen in IID. - Added evaluation of unstoppable passed pawns in pawn end games. - Include attacked squares close to the king in king safety evaluation. - Implemented magic bitboard move generator. - Use bitboard techniques for evaluation. - Created specialized move generator functions to generate checks. - Correctly handle pseudo-legal but not legal en passant squares. 2010-07-04: Version 1.05 - Speed optimizations. - Avoid dynamic memory allocations during search. - Don't do mate threat extensions too deep down in the search tree. Fixes search tree explosion in WAC 21. - Incremental update of material scores. - Created specialized move generator functions to generate captures. - Created a function givesCheck that decides if making a move gives check to the opponent. - Implemented a pawn hash table. - Store static evaluation scores in the transposition table. - If there is only one legal move at the root, make that move immediately. 2010-06-12: Version 1.04