I am not a systematic person and don't normally record everything changes I make on the program. Below are some changes that are worth noting. I rarely keep old codes either, except for backup before major changes or experiments.
| Versions | Dates | Modifications |
| 2.5.11 2.5.11p |
Sep 2003 | King safety values are now cached. Disabled "stdout" buffering. Fixed bug in automatic EGTB generation. Fixed bug in material only / mating hash table probing. Implemented C versions of the assembly codes. Verbose mode enabled when in "Fritz" mode. Added compilation option for using pure C/C++ code. Added compilation option for using less memory for internal hash tables. New benchmarking code. Now works on all supported variants and can select which benchmark to run. Moved some pawn structure related evaluations into the pawn structure hashing code where they belong. Added simple passed pawn evaluation during middlegame phase. Automatic EGTB generation is now outputs the partial solutions every 4 iterations so if the machine crashed before completion, the data generated by previous iterations are not lost. Automatic EGTB generation now packs the generated solution files then moves then to the correct EGTB directories without human intervention. Fixed a filename selection bug when auto saving an ICS game. Some evaluation function tuning. |
| 2.5.12 | Oct 2003 | Rewrote the EGTB generation codes. KKFChess now generates EGTBs very much faster. The saving of partial
EGTBs during creation is no longer necessary. Added compilation option to allow the creation of 16 or 32-bit data size versions. The former uses less memory and is slower during benchmarking but is about the same speed as the 32-bit during game analysis. Added code to adjust the evaluation score when a hashed value is a "Mate/lose in X" to resolve a problem of increasing mating score when going back and forth on the same position during analysis. Added a set of compression/decompression routines. Opening books and EGTB probing codes are modified to use compressed files if available. New benchmark item for testing the compression/decompression speed. Added a set of specialised compression/decompression routines to partner the first set. Compression/decompression are now done in two passes which had yielded better compression. |
| 2.5.13 | Oct 2003 | Had a couple of unitialised variable for atomic chess' search routine. This had caused the search not to search to
fail all the time - causing ISearch() to fail also. This is now rectified. Also new codes are added to save the game for
debugging if ISeach() fails too many times. Corrected a spelling mistake on "exisits". Added command options in "egtbcomp" and "egtbdecomp" to allow specifying patterns and piece counts with it. Also these commands now displays the file being processed if verbose mode is on. Changed the book loading code so that if an index file is present, the opening book is not read into memory whatever the size. Also, removed the skipping limit for creating index files so that a "dummy" index file can be created. Found an assembly instruction bug in the 32-bit Nalimov EGTB probing code, one of the scaling was by 2 instead of by 4. Corrected typos and errors in the CSS file. Clean up the EGTB generation code, it is now much easier to follow. Also changed the progress display and the termination condition. Added the missing colour exchanged probing for the cached 2-piece tables for suicide chess. Can now read a compressed opening index file also. Note that a compressed index file will very likely to be larger than the uncompressed one since the data have little or no pattern. Corrected a bug when a non-numeric value was entered as the new hash table size from console mode. Added support for 16-bit valued EGTB records. EGTB generator will output either 8-bit or 16-bit EGTB files depending on the range of data generated. The data size is automatically identified by the probing routines. Added codes for 5-piece EGTB generation and probes. Only limited tests were performed hence it is still in beta stage. Added command option for "egtbgen" to automatically compress the EGTB file(s) after generation. Changed the EGTB file header to include statistical information. This may be used later to allow the program to steer the game into a highly winnable endgame. |
| 2.3.14 (Not released) |
Oct 2003 |
Corrected the home page's server name that had ".com" missing. Corrected an assembly instruction error from "mov bx,SSS" to "mov SSS,bx" that affects EGTB probe results for "KKFmx" and "KKFx" versions. Added file-symmetry EGTB probing. EGTB file sizes are now halved. EGTB generations can now use temporary files (cached) instead of having the whole work buffer in memory. This is mainly for creating 5-piece tables but works with any number of pieces. Tested okay with 3 and 4-piece generation and should be okay for 5-piece (testing). Added checksum to the EGTB files and changed the version. Added command "egtbconv" to convert V2.5.13 EGTB files into new ones. Added new configuration item "UseTempFile" to force the use of temporary files during EGTB generations. Tidied up the layout of the configuration file. Changed the hash probing and storing codes. Re-enabled the mating hash table for normal and crazyhouse. The EGTB temporary file cache size is now configurable via a configuration item or at the command prompt. Storage of the game record is now dynamic. Displaying of move made by the engine in console mode now follows the user selected notation instead of always SAN. Improved the speed of the 2nd decompressor by decoding 2 instructions (4-bits) at a time. Added code to search the opening book file if no index file is present. This makes an index file optional. Added code to create and use indexing block on compressed files. Also added commands and configuration item to control this indexing feature. Made the compression blocking size user selectable. Forced memory allocation of positional and pawn structure hash tables to allocate number of entries that are divisible by 4. This is required as the memory clearing routines assumed that they are - had caused memory corruptions for values not divisible by 4. Added code to check other "must be divisible by N" constants during program startup. The '&' book move marker were not functioning correctly. This was due to the fact that when the book moves are sorted (before merging), the correct game sequence was lost. Since statistic clearing is game position dependent, this had cause incorrect results. The game number is now include during sorting comparison and a new internal book record format is used. This only affects internal data and not the created book file. Enabled king safety hashing for atomic and crazyhouse. Modified evaluation functions for atomic and crazyhouse. |
| 2.6.0 | Nov 2003 |
Added support for "losers" chess. This means new engine code, EGTB solver and other bits and pieces. Modified the evaluation function of suicide chess. Made the learning hash table size user configurable. Added the ability to write out the Zobrist hash table to a data file after initialization and read it back during program start up. This speeds up the initialization process as the Zobrist table generation takes the longer time. Exporting the Zobrist hash table also paves the way for separating the opening book creator but I have no plans to do so yet. Added the ability for the engine to play the specified colour automatically without the need of a "go" command every time. Added a new help file to use in console mode. Updated some commands and added new ones. Re-introduced the output of the partial solution file when generating EGTBs. Not that the program crashed during EGTB generation but I sometimes need to stop the generation and don't want start the generation all over again, especially when I'm in iteration 10's and 20's. This partial solution file enabled for >=4 piece EGTB generations and is transparent to the user. Tested on in-memory and temporary file EGTB generation though enabled for >=4 man (temporary file) mode. Colour highlighting is added and the board is displayed in colour if highlighting is enabled. Added configuration for losers chess' piece values. Configuration items can now accept both "Yes" and "On", "No" and "Off" for enabling or disabling options respectively. Material balancing is not performed if either side as an advanced passed pawn. This is due to the lost game played in Chess War IV. Allows user to interrupt opening book generation, opening book merging, EGTB generation and engine search (console mode) by pressing the space bar. Increased killer moves from 2 to 3 and added killer aging. The engine will try younger killer moves first. A repeating killer will keep that move young. Corrected a check evasion move generation bug. Had used the wrong direction table for a bishop blocking move. Removed a race condition when the "edit" command is received. Originally, the "edit" sub-commands were meant to be handled by the main thread but the input thread is already waiting for another command thus the edit board routine cannot access the input channel since it has been locked by the input thread. By moving reading of the edit sub-commands back into the input thread and making it mode aware, the problem was resolved. Added an alternative legal move checking routine that checks the direction exposed against the king by a moving piece. This is not useful for king moves nor check evasions but for other moves it can speed up the legal move checking. Re-coded the positional and mating hash probing/storing routines. Both hashed keys now contains the side to move so no need for separate black and white tables. Positional hash table is now interleaved - odd keyed entries are always replaced but the even keyed entries are depth based. Changed the structure definition of a move and modified all codes that uses this new structure. This was a speed improvement exercise. Made the search extension modifiable from within the console. Added a "search retraction" for non-PV lines. This causes the program to search less deep for non-principle lines. Added code to limit the size of PGN tags to avoid a buffer overrun. Added support for processing EPD files. Added support for book file commands in a book file list. Added shell program execution and scripting capabilities. Changed the evaluation of passed pawns and material balance. New king safety and pawn structure evaluation. Implemented aging for positional hash table. |
| 2.6.0 | Dec 2003 |
General tuning of evaluation function for regular chess - new
code to handle passed pawn races. Added 2 more cases of positional draws for normal chess - special positions in KP vs K and K vs KP endings. Add UCI support. Internal iteration is now selectable by user. |
| 2.6.1 | Dec 2003 |
Corrected the error for displaying the razoring option setting
- the internal iteration setting was displayed instead. Fixed the problem of closing an invalid file handle when EGTB generation is interrupted with the space bar. Changed the search windows during multiple PV's searches. Changed the evaluation function of suicide chess - penalty for having too few pieces. Changed the evaluation function of crazyhouse chess - increased weight on king safety. Added caching of recently used EGTB files for those with lots of memory. |
| 2.6.1 | Jan 2004 |
Corrected the handling of parsing PGN files that had the
"Variant" tag after the "FEN" tag. When the
"Variant" is encountered, the last "FEN" string is used to
reinitialize the board instead of starting at the initial position - which was
wrong. Modified king safety code. Corrected typo when performing 3 fold repetition checks - it now correctly checks the side to move as well. Generate code tidying up and optimization. Experimenting with the idea that the opening book can be used to guide the search. At present only positions arising form a marked good or bad moves ("!" or "?" postfixed moves) are treated as if read from the hash tables. The return scores are fixed at +100 and -100 at present. I may improve this later to use the win/lost ratio already present each book record to order the moves or cut-off branches. EGTB files caching now works with compressed files also. Corrected some typos in the HTML help files. Bug correction for atomic chess - wrong value returned by search function, checking for illegal king moves and wrong "insufficient material" draw message. An oversight on using MoveExposesKing() in atomic chess! It does not work with this variant because it is legal to expose the king to checks in some situations. The logic for checking for user abort was inverted! This had caused a lot more user abort checks (almost 10000 times more) then intended. Corrected wrong default value for non-PV extension configuration item. New caching method for EGTB generation using a temporary file. The caching is similar to the recently used EGTB files caching scheme but with read/write abilities. Fixed the problem of not seeking to the correct file position with fseek() - using _lseeki64() instead. Rewrote the code for using temporary file in EGTB generation. Fixed the wrong signs given to scores when black passed pawns are evaluated. Evaluation functions tuning for normal chess. Changed the checking of castling rights specified in a FEN string to be optional. Also added code to automatically correct the castling rights based on the positions of the kings and rooks. Add extension item for piece sacrifice on a square next to enemy king. Reduced the frequencies of EGTB probes for suicide, atomic and losers chess. |
| 2.6.2 | Feb 2004 |
Added code to detect a mate when the last
move met the 50th move draw rule but gave also gave a checkmate (or wins) - it is now
recognized as a win instead of a draw. Corrected a mis-spelt "SacrificeExt", which was written to the configuration file as "SacrficeExt". No impact on engine strength since the default value was used instead. Added code to detect and correct configuration file by making changes to the configuration file itself instead of overriding the incorrect values. Corrected an error that book moves were not used when the opponent had made a predicted move - a check is now made just before switching from ponder to think mode so that positions with book moves will ignore the predicted PV lines and starts the search from scratch, looking at book moves first in the new search. Killer moves from +2 and +4 plys deeper are now checked as if they are normal killers. Added code to detect move sequences where both sides are moving only one of their pieces - it is used to detect perpetual checks or move sequences. Tidy up the search routine (normal chess) to make one less call to "IsInCheck()". Changed the way "perpetual" moves are detected - a counter is now updated by MakeMove() if the move satisfies the "perpetual" criteria. However the evaluation function does not take this into account yet. |
| 2.6.2 | Mar 2004 |
Modified the offering of draws when playing on an ICS server -
the engine sends a continuous stream of "offer draw" when it
encounters a positional draw position at root. The positional draw detection code for atomic chess incorrectly identified pawns only positions with no passed pawns as draws. This is in correct since potential passed pawns makes the position unstable. Changes were made so that pawns only positions are only considered as draws if there are no passed pawns and all the white pawns are on the same file as the black pawns. Moves that explodes a checking piece was not displayed in the PV. Rewrote the part that checks an atomic chess move is legal or not - kills own king is illegal, kills enemy king is legal and exploding a checking piece is also legal. Added the "perft" command - not for move generator validation but for performance benchmarking. Only implemented for regular chess but can be extended to other variants - need to add codes to detect the different "checkmated" positions. Successfully modified the code to compile on RedHat 8! It is actually easier than I had expected. Works with XBoard also but XBoard seems to be less stable than Winboard. Redhat 8 is running in a virtual machine - no repartitioning of the hard disks! Correct the directory making codes for "mkdirs" command; not all EGTB subdirectories were created. Added more conditional codes to handle the differences between running on Windows and running on Linux, the most troublesome ones are the directory separators, the console colours and the emulation of the _sleep() function. No assembly code support for Linux version yet. Disabled the update maximum positional score code - can search deeper with no side-effects so far. Killer moves from +6 plys are checked as if they are normal killers. Changed the 3-fold repetition draw offer to a draw claim. This removes the problem of making an illegal move after making a draw offer at a drawn position at root - no moves were searched so there is no best move. Disabled the updating of the MaxPosScore. The margins that are set at root are now slightly higher. Non-PV extensions are now not considered for the first few plys. Enabled EGTB probing during quiescent search. Separate the PawnsOnlyEval() into PawnsOnlyEval() and RealPawnsOnlyEval(). This makes the code simpler and handles some pawns only positions better and faster. |
| 2.6.2 | Apr 2004 |
Tuning of evaluation functions and piece square tables. Null moves are now verified before cut-off - the verification is a non-null move search which means it is more or less an internal iteration as well. Separated the old "Pawns only" phase into "Near pawns only" and "Real pawns only" and updated the hash table info and game phase text to handle these phases. Modified the EGTB probing codes in quiescent searches. Verified null search and the null depth is now settable via UCI, the configuration file or from the console. Modified the output from the "-v" command line argument. Updated the help text also. |
| 2.6.3 | May 2004 |
Correct a bug that incorrectly disables the use of the opening
book if the book is too large to fit into memory and there was no indexing
file. Learned files now has version control. The merged hash table probing function had messed up the hashing of the positional learning since I only changed the hash function in the write but not the read part. Changed the counter display when merging book files to show the number of records read and written. Added a small delay before the engine thread calls ISearch() to allow commands to be processed in between iterations. Changed the verifying null search. It now performs a D-N+3 null search after a D-N one. Added a secondary king safety hash table to cache some of the calculations. Reduced the number of EGTB probes. Selective root is now disabled if a mating line is found - helps to find shorter mating lines. Added a third king safety hash table for castling. The null search is now verified with a D-N+1 null-search. NullDepth of 5 was causing the program to miss some moves. A default and maximum value of 4 is now imposed which seems to suit this algorithm. Added code (one line) to allow a startup script to be read before any commands are accepted at the console. Modified the opening book initialization codes to check for a book file in the current directory if the expected book file is not found. This can simplify the installation process if only one variant if is played. Reduced the pawn promotion race scores by half so that the possibility of winning a pawn promotion race is not as good as an actual one found during search. Verified null move search is now a permanent feature. The null depth is now fixed at 2. FireFly 1.0.0 is born out of a conditional compilation of KKFChess but with it's own (simple) evaluation functions. FireFly has less commands, only plays normal chess and has virtually no configuration, except for EGTB path and hash table sizes. FireFly uses KKFChess' book but with a different name. Fixed a time extension bug when the engine is given more than 30 seconds to think. Correct the pawn attack mask for finding outposts. |
| Money | Don't we all need some money at some point in life? |
| It's own GUI / ICS interface | Can be a built-in interface or an external program like Winboard. Don't seem to have the need for one since I don't want to reinvent Winboard at present. |
| Testing on a 486. | I think I have a Pentium MMX somewhere but I never owned a 486. |
| True 64-bit assembly code. | I need an Athlon 64 and rewrite more routines in assembly - it may not be faster than the compiler generated ones but it will be fun. |
| Multi-processor support | Need some major changes. |
| Losers opening book | Need a good loser opening book. |
| Crazyhouse opening book | Need a good crazyhouse opening book. |
| New time control code | Can do better than allocate equal time for each move. |
| Finding more ways to use the opening book to guide the search. | Looking into it, need to do some maths to find an acceptable formula for influencing the search. |