📄 changelog
字号:
Version 1.0 (17 Feb 96) (Chua Kong Sian) This version plays a legal game of chess. It supports all the special moves (en passant, castling and promotion/underpromotion). It uses the standard PVS search algorithm and incorporates the fail-soft alpha-beta enhancement which gives tighter alpha-beta bounds. All evaluations are only done at the end-points. Move ordering is by captures first and also history heuristics.Version 1.1 (19 Feb 96) Added in the NULL move heuristics. Currently the null move depth reduction is 2.Version 1.2 (13 Jul 96) For sort captures, a recapture is always tried before another capture of the same value. This gives slightly better pruning. Material for white & black is updated incrementally in make/unmake move. This speeded up the program significantly. Stalemates are recognized during the search and a score of 0 is returned.Version 1.3 (16 Jul 96) For null moves, if the current material+pawn value is less than alpha, then we don't try the null move test. The reason is that since our position is already so poor, when playing a null move, our score is going to be less (unless the position is zugzwang). So its not going to be a beta-cut neither is it likely to improve alpha. This appears to reduce the nodecount. Added a flag.ended variable to the flag structure. When this is true, the game has ended and typing go will produce nothing. Version 1.4 (19 Jul 96) Check for repetition in search (code currently not working). Added in transposition table code. Currently there is no rehashing done. The whole PV was returned to the top of the tree. Version 1.5 (29 Jul 96) Mate stored in the transposition table need to be offset by (+-ply). Pruning via killer moves has been improved. A new HistoryStore() is created for code dealing with history & killer. InChk and GenMoves() are no longer needed in quiesce(). All that work is the responsibility of the full-width search. Much improved pruning. The flag structure was replaced by an unsigned long. Got rid of the ExScore variable. Now all calls to Evaluate() will yield the exact score.Version 1.6 (2 Aug 96) When displaying the PV and the end is reached, see if the rest of the line can be found from the transposition table. The random number generator is taken from Knuth. FilterIllegalMoves is called to cull out illegal moves. This prunes enough branches such that it turns out to be a gain. Speeded up FilterIllegalMoves(). Converted board.ep to short rather than using a BitBoard. Also fast evaluation is done in Evaluate() rather than quiesce. Got rid of epsq variable in leaf structure; it wasn't needed as a board.ep already exists. A bug was introduced when the new random number generator was added; the top ten bits of the hashkey was being corrupted; this is now fixed. Speeded up null.c code and MakeMove() UnmakeMove() routines. Got rid of piececap in leaf{} structure; It has been integrated in the the leaf.flag variable. The leaf.f and leaf.t variable has been merged into the leaf.mv variable.Version 1.7 (5 Aug 96) A nullhashcode was added so that a null move will change the HashKey (a bad bug!). Repetition code is now working correctly. The enpassant and castling hash codes are now 64 bit hash values instead of being bits in the HashKey. A lone king evaluator is added in. This allows the program to perform elementary mates. Got rid of FilterIllegalMoves() in search. Now all pseudo-legal moves are tried; they are immediately rejected if it is determined that they are illegal. An EvaluateDraw() routine is called early in the Search() and Quiesce(); if the position is a known draw (e.g. not enough mating material), no searching is done. A KBNK() mating routine is added; this seems to be working fine.Version 1.8 (12 Aug 96) A lot of leaf struct variables are converted to int, making the program slightly faster. Search extension for pushing pawns to 7th rank. The SANMove() code is now responsible for determining if a checking move is mate and adds the '#' sign accordingly. This is much cleaner. Added passed-pawn evaluations. Fix bug in eval.c where EnemyKing was wrongly initialized. Added KingSq[] array to help King stay in the corner. Added primitive development code; if bishops and knights are on original squares, penalize. Got rid of Material() and substitute a macro MATERIAL for speed.Version 1.9 (17 Aug 96) Change the way check/recapture extensions are tested; previously check extensions only take place at <= Idepth*2. Now a total of Idepth+1 check extensions are allowed. For recapture, a total of 2 extensions are allowed. This makes the program search deeper. Fix bug whereby a promotion move (e.g. d8=Q or d8Q) was considered illegal if the opponent tried to enter it on the command line. Fixed a bug in the PVS search.Version 1.10 (29 Aug 96) KBBK with bishops of the same colour are now recognized as draws. Matescore now starts from 32767 instead of 9999. INFINITY extended to 32767. Added Ctrl-C trap so that the search will end instead of aborting the program. Originally the move returned by a hash probe is added to the history score. This is removed and the program show much improved pruning.Version 1.11 (21 Nov 97) Nulls can be toggled on/off. Worstscore[] is now initialized to -100 instead of infinity. EvaluateDraw() is called after iterative deepening is over to see if the game is a draw. New routine ScoreDev() to calculate development separately; "show eval" command will print development score. Got rid of Developed[2] global variable. Some tweaking in search.c. The decision to print '&' or '+' for a PV is now in ShowLine().Version 1.12 (27 Dec 97) When a mate in n-ply is found, the search will never go deeper than n-2 ply. Fix some bugs in search.c. Mate scores in hashtables are now always flag as EXACTSCORE, fixing some bugs in mates. At ply 1, we now don't return the hash score if it is an exact score as we need to search the rest of the moves. In ttable.c, SANMove() should not be called as GenMoves(ply) was never called. This affected the debug code. Now algebraic moves are printed rather than SANMove for ttable debug code. Fix repetition code, now gmg1.ci/42 can be solved. In iterate.c, foundPV should be set to false when a research is being done. A Hashmv variable is used to store the move return from probing the hash table. This is use for move sorting. Version 1.13 (1 Jan 98) Got rid of history.c. Killer is stored only if it is a beta cut. Fix bug in pawn eval for isolated pawns and passed pawns. Functions like ScoreDev & MATERIAL now return the score for side to move instead of score for white. This also fixed a bug in the null move condition whereby MATERIAL was only seen from white point of view when it should be from the side-to-move view. Got rid of SlowEval variable speeding up things quite a bit. GenAtaks() was NOT called in Evaluate(); this is now fixed.Note: From this point on, changes within a release are labelled as a-z. Thisis also reflected in version.cVersion 1.14 (3 Jan 98) a. Fixed bug in solve.c whereby the test for a correct solution is not correctly done (pointed out by Stuart). b. When searching for mates, eval just return MATERIAL saving time. c. Uses EPD format rather than FEN; also clean up ParseEPD; fen.c now called epd.c d. io.c renamed to output.c. Game phase is now 1-8 (opening-ending). e. In quiesce(), if a capture cannot bring the score near alpha, don't search it, speeding things up. f. If we have a rootscore much worst that our previous iteration rootscore, we continuing searching. (Fix from Stuart). g. Got rid of nxtline, bstline way of updating the PV. Instead use the method in cheops, resulting in much cleaner code. h. Got rid of savePVar[] array and all the code related to it. What its for, I can't remember. i. SortMoves() takes into account moves towards the centre. Pruning is slightly improved. j. AttackFrom() function is added. This returns the bitboard of squares attacked by a piece. Remove GenAtaks() and other code in eval.c which required the use of attack tables. k. Bug in ScoreDev() whereby an early Queen move which should be penalized isn't. Various bug fixes & tuning in eval code. l. PGNReadFromFile() is able to read the 1st game in a pgn file. m. In the null move, instead of searching with window [alpha,beta], we search with [beta-1,beta]. n. Added in a directions[][] array. This array is used in swap.c when checking for x-ray pieces. Added AddXrayPiece() routine which is used in the static evaluator. o. Got rid of foundPV variable. It isn't really necessary. p. Don't flag mate score in ttable as exact score; they aren't. q. Change some (best >= alpha) code to (best > alpha) in Search(). What was I thinking of then!?Version 1.15 (16 Jan 1998) a. Convert AlgbrMove() to return char * rather than void. b. In the quiescent search, use SwapOff() to see if a capture is futile and prune it. Removed as it wasn't working well. c. Big bonus for connected passed pawns on the 6/7th rank. Solves WAC/2 easily. d. Bug fix and clean up of code in sort.c. Results in improve capture sorting and better pruning. Got rid of DeepExtCnt; not used. e. For search extensions, limit capture to maximum of 2 and checks to maximum of Idepth, the iteration depth. f. SwapOff() wasn't working for non-captures as pointed out by Stuart. Fixed SwapOff(); appears to be okay now. Used SwapOff() in capture move ordering; seems to help a bit. g. In Search(), move the Quiesce() call before the ttable probe. Slight improvement in pruning and ttable stats are now much higher. h. Still another bug in AddXrayPiece() was fixed. i. Slight change in GenMoves() to speed it up slightly. j. Implemented pawn hash table. Achieves good increase in nps (25%). k. Added in a SquarePawnMask[] array. This is to determine if a king is able to stop a passed in a king and pawns only endgame. l. Material values of 100,350,350,550,1100. Also some optimizations in move.c. PHASE modified for new material values. m. Implemented a two-tier transposition table. Minimal gain in tree size reduction. n. Only store non-captures as killers; try killers after captures in sort. This gives more than 30% reductions in nodes searched. Also fix a bug in SortMoves(). o. Only give bonus for rook on 7th rank if enemy king is on 8th rank or there are enemy pawns on 7th rank. Other bug fixes and tuning in eval. p. Recognize and penalize backward pawns.Version 1.16 (26 Jan 98) a. Added a Mvboard[] array which returns the number of times a piece on [sq] have moved. Use it for penalizing early Q moves. b. ScoreDev() returns only development of side-to-move instead of white-black. c. Separate Search() into a SearchRoot() which is called at ply==1 and Search(). Some modifications in search. d. Added back GenAtaks() into evaluate when doing slow evaluation. Modifications in the ScoreX() routines to make use of attack tables. e. Fixed a bug in UnmakeNullMove whereby the board.ep variable wasn't correctly restored. f. Added the passed BitBoard into the pawn hash table allowing us to save the passed pawn board into the table. g. In evaluate, when one side has no mating material, make sure the score is never > 0. h. Added in Square of the pawn evaluation. Fix a bug in ScoreP whereby passed pawns information was being changed. In EvaluateDraw(), fix a bug whereby 2N vs 2N wasn't a draw. i. Fix a bug which sometimes put an illegal move in the PV. This was happening when an EXACTSCORE was returned, but the PVlen was incorrectly set. j. Lots of changes/tuning to eval.c. k. Added in an IsLegalMove() function to test if a move is legal.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -