Subversion Repositories Games.Chess Giants

Rev

Rev 33 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "chess.h"
  2. #include "data.h"
  3. #if defined(UNIX)
  4. #  include <unistd.h>
  5. #  include <pwd.h>
  6. #  include <sys/types.h>
  7. #endif
  8. #include <signal.h>
  9. /* last modified 02/24/14 */
  10. /*
  11.  *******************************************************************************
  12.  *                                                                             *
  13.  *  Crafty, copyright 1996-2015 by Robert M. Hyatt, Ph.D., Associate Professor *
  14.  *  of Computer and Information Sciences, University of Alabama at Birmingham. *
  15.  *                                                                             *
  16.  *  Crafty is a team project consisting of the following members.  These are   *
  17.  *  the people involved in the continuing development of this program, there   *
  18.  *  are no particular members responsible for any specific aspect of Crafty,   *
  19.  *  although R. Hyatt wrote 99%+ of the existing code, excepting the Magic .   *
  20.  *  move stuff by Pradu Kaanan, egtb.cpp written by Eugene Nalimov, and the    *
  21.  *  epd stuff written by S. Edwards.                                           *
  22.  *                                                                             *
  23.  *     Robert Hyatt, University of Alabama at Birmingham.                      *
  24.  *     Mike Byrne, Pen Argyl, PA.                                              *
  25.  *     Tracy Riegle, Hershey, PA.                                              *
  26.  *     Peter Skinner, Edmonton, AB  Canada.                                    *
  27.  *                                                                             *
  28.  *  All rights reserved.  No part of this program may be reproduced in any     *
  29.  *  form or by any means, for other than your personal use, without the        *
  30.  *  express written permission of the authors.  This program may not be used   *
  31.  *  in whole, nor in part, to enter any computer chess competition without     *
  32.  *  written permission from the authors.  Such permission will include the     *
  33.  *  requirement that the program be entered under the name "Crafty" so that    *
  34.  *  the program's ancestry will be known.                                      *
  35.  *                                                                             *
  36.  *  Copies of the source must contain the original copyright notice intact.    *
  37.  *                                                                             *
  38.  *  Any changes made to this software must also be made public to comply with  *
  39.  *  the original intent of this software distribution project.  These          *
  40.  *  restrictions apply whether the distribution is being done for free or as   *
  41.  *  part or all of a commercial product.  The authors retain sole ownership    *
  42.  *  and copyright on this program except for 'personal use' explained below.   *
  43.  *                                                                             *
  44.  *  Personal use includes any use you make of the program yourself, either by  *
  45.  *  playing games with it yourself, or allowing others to play it on your      *
  46.  *  machine,  and requires that if others use the program, it must be clearly  *
  47.  *  identified as "Crafty" to anyone playing it (on a chess server as one      *
  48.  *  example).  Personal use does not allow anyone to enter this into a chess   *
  49.  *  tournament where other program authors are invited to participate.  IE you *
  50.  *  can do your own local tournament, with Crafty + other programs, since this *
  51.  *  is for your personal enjoyment.  But you may not enter Crafty into an      *
  52.  *  event where it will be in competition with other programs/programmers      *
  53.  *  without permission as stated previously.                                   *
  54.  *                                                                             *
  55.  *  Crafty is the "son" (direct descendent) of Cray Blitz.  it is designed     *
  56.  *  totally around the bit-board data structure for reasons of speed of ex-    *
  57.  *  ecution, ease of adding new knowledge, and a *significantly* cleaner       *
  58.  *  overall design.  it is written totally in ANSI C with some few UNIX system *
  59.  *  calls required for I/O, etc.                                               *
  60.  *                                                                             *
  61.  *  main() is the driver for the chess program.  Its primary function is to    *
  62.  *  cycle between asking the user for a move and calling for a tree search     *
  63.  *  to produce a move for the program.  After accepting an input string from   *
  64.  *  the user, this string is first passed to Option() which checks to see if   *
  65.  *  it is a command to the program.  If Option() returns a non-zero result,    *
  66.  *  the input was a command and was executed, otherwise the input should be    *
  67.  *  passed to input() for conversion to the internal move format.              *
  68.  *                                                                             *
  69.  *  The following diagram shows how bit numbers / squares match up in Crafty's *
  70.  *  bitboard arrays.  Note that bit zero (LSB) corresponds to square A, which  *
  71.  *  makes this a mental challenge to take a 64 bit value and visualize it as   *
  72.  *  chess board, since the files are reversed.  This was done for the          *
  73.  *  following reasons:  (1) bit 0 needs to be the LSB, and bit 63 needs to be  *
  74.  *  the MSB so that the Intel BSF/BSR instructions return the proper square    *
  75.  *  number without any remapping.  (2) the lower 3 bits (file number) are now  *
  76.  *  0 for A, 1 for B, ..., 7 for H.  The upper 3 bits (rank number) are then   *
  77.  *  0 for rank 1, 1 for rank 2, ..., 7 for rank 8.                             *
  78.  *                                                                             *
  79.  *  A8 B8 C8 D8 E8 F8 G8 H8                                                    *
  80.  *  A7 B7 C7 D7 E7 F7 G7 H7                                                    *
  81.  *  A6 B6 C6 D6 E6 F6 G6 H6                                                    *
  82.  *  A5 B5 C5 D5 E5 F5 G5 H5                                                    *
  83.  *  A4 B4 C4 D4 E4 F4 G4 H4                                                    *
  84.  *  A3 B3 C3 D3 E3 F3 G3 H3                                                    *
  85.  *  A2 B2 C2 D2 E2 F2 G2 H2                                                    *
  86.  *  A1 B1 C1 D1 E1 F1 G1 H1                                                    *
  87.  *                                                                             *
  88.  *  56 57 58 59 60 61 62 63                                                    *
  89.  *  48 49 50 51 52 53 54 55                                                    *
  90.  *  40 41 42 43 44 45 46 47                                                    *
  91.  *  32 33 34 35 36 37 38 39                                                    *
  92.  *  24 25 26 27 28 29 30 31                                                    *
  93.  *  16 17 18 19 20 21 22 23                                                    *
  94.  *   8  9 10 11 12 13 14 15                                                    *
  95.  *   0  1  2  3  4  5  6  7                                                    *
  96.  *                                                                             *
  97.  *  version  description                                                       *
  98.  *                                                                             *
  99.  *    1.0    First version of the bit-board program to play a legitimate game  *
  100.  *           even though significant features are missing:  transposition      *
  101.  *           table, sophisticated scoring, etc.                                *
  102.  *                                                                             *
  103.  *    1.1    Added the minimal window search.  At each ply in the tree, the    *
  104.  *           first branch is searched with the normal alpha/beta window, while *
  105.  *           remaining nodes are searched with value/value+1 which was         *
  106.  *           returned from searching the first branch.  If such a search       *
  107.  *           returns the upper bound, this position is once again searched     *
  108.  *           with the normal window.                                           *
  109.  *                                                                             *
  110.  *    1.2    Added the classic null-move search.  The program searches the     *
  111.  *           sub-tree below the null move (typically) one play shallower than  *
  112.  *           the normal search, saving a lot of time.                          *
  113.  *                                                                             *
  114.  *    1.3    Added the transposition table support.  This also includes the    *
  115.  *           code in Iterate() necessary to propagate the principal variation  *
  116.  *           from one iteration to the next to improve move ordering.          *
  117.  *                                                                             *
  118.  *    1.4    Modified the transposition table to use three tables, one for 64  *
  119.  *           bits of white entry, one for 64 bits of black entry, and one with *
  120.  *           the remaining 32 bits of white and black entry combined into one  *
  121.  *           64 bit word.  Eliminated the "bit fields" since they seemed to be *
  122.  *           erratic on most compilers and made portability nearly impossible. *
  123.  *                                                                             *
  124.  *    1.5    Pawn scoring added.  This required three additions to the code:   *
  125.  *           (1) InitializePawnMasks() which produces the necessary masks to   *
  126.  *           let us efficiently detect isolated, backward, passed, etc. pawns; *
  127.  *           (2) a pawn hash table to store recently computed pawn scores so   *
  128.  *           it won't be too expensive to do complex analysis;  (3) Evaluate() *
  129.  *           now evaluates pawns if the current pawn position is not in the    *
  130.  *           pawn hash table.                                                  *
  131.  *                                                                             *
  132.  *    1.6    Piece scoring added, although it is not yet complete.  Also, the  *
  133.  *           search now uses the familiar zero-width window search for all but *
  134.  *           the first move at the root, in order to reduce the size of the    *
  135.  *           tree to a nearly optimal size.  This means that a move that is    *
  136.  *           only one point better than the first move will "fail high" and    *
  137.  *           have to be re-searched a second time to get the true value.  If   *
  138.  *           the new best move is significantly better, it may have to be      *
  139.  *           searched a third time to increase the window enough to return the *
  140.  *           score.                                                            *
  141.  *                                                                             *
  142.  *    1.7    Replaced the old "killer" move ordering heuristic with the newer  *
  143.  *           "history" ordering heuristic.   This version uses the 12-bit key  *
  144.  *           formed by <from><to> to index into the history table.             *
  145.  *                                                                             *
  146.  *    1.8    Added pondering for both PC and UNIX-based machines.  Also other  *
  147.  *           improvements include the old Cray Blitz algorithm that takes the  *
  148.  *           P.V. returned by the tree search, and "extends" it by looking up  *
  149.  *           positions in the transposition table, which improves move         *
  150.  *           ordering significantly.  Repetitions are now handled correctly.   *
  151.  *                                                                             *
  152.  *    1.9    Added an opening book with flags to control which moves are       *
  153.  *           selected for play.  The book maintenance code is stubbed directly *
  154.  *           into the program, so that no additional executables are needed.   *
  155.  *                                                                             *
  156.  *    1.10   Added king safety + hashing (as done in the old Cray Blitz).      *
  157.  *           Nothing novel other than the use of bit-masks to speed up some of *
  158.  *           the tests.                                                        *
  159.  *                                                                             *
  160.  *    1.11   Additional evaluation knowledge plus log_file so that program     *
  161.  *           saves a record of the game statistics for later analysis.  Added  *
  162.  *           the "annotate" command to make the program analyze a game or part *
  163.  *           of a game for testing/debugging.                                  *
  164.  *                                                                             *
  165.  *    1.12   Added ICS (Internet Chess Server) support for Xboard support so   *
  166.  *           that Crafty can play on ICS in an automated manner.  Added new    *
  167.  *           commands to be compatible with Xboard.  Crafty also has a new     *
  168.  *           command-line interface that allows options to be entered on the   *
  169.  *           command-line directly, ie:  "crafty alarm=off verbose=2" will     *
  170.  *           start the program, set the move alarm off, and set verbose to     *
  171.  *           2.  This allows an "alias" to easily customize the program.       *
  172.  *                                                                             *
  173.  *    1.13   Added time-control logic to the program.  It now monitors how     *
  174.  *           much time both it and its opponent uses when thinking about a     *
  175.  *           move to make.  When pondering, it only times itself from the      *
  176.  *           point that a move is actually entered.                            *
  177.  *                                                                             *
  178.  *    1.14   Added the piece/square tables to the program to move static       *
  179.  *           scoring to the root of the tree since it never changes (things    *
  180.  *           like centralization of pieces, etc.)  also some minor tuning of   *
  181.  *           numbers to bring positional score "swings" down some.             *
  182.  *                                                                             *
  183.  *    1.15   Added edit so that positions can be altered (and so ICS games     *
  184.  *           can be resumed after they are adjourned).  Also added a "force"   *
  185.  *           command to force the program to play a different move than the    *
  186.  *           search selected.  Search timing allocation slightly altered to    *
  187.  *           improve ICS performance.                                          *
  188.  *                                                                             *
  189.  *    1.16   Significant adjustments to evaluation weights to bring positional *
  190.  *           scores down to below a pawn for "normal" positions.  Some small   *
  191.  *           "tweaks" to king safety as well to keep the king safer.           *
  192.  *                                                                             *
  193.  *    1.17   Added "development" evaluation routine to encourage development   *
  194.  *           and castling before starting on any tactical "sorties."  Also     *
  195.  *           repaired many "bugs" in evaluation routines.                      *
  196.  *                                                                             *
  197.  *    1.18   Added the famous Cray Blitz "square of the king" passed pawn      *
  198.  *           evaluation routine.  This will evaluate positions where one       *
  199.  *           side has passed pawns and the other side has no pieces, to see    *
  200.  *           if the pawn can outrun the defending king and promote.  Note that *
  201.  *           this is ridiculously fast because it only requires one AND        *
  202.  *           to declare that a pawn can't be caught!                           *
  203.  *                                                                             *
  204.  *    2.0    initial version preparing for search extension additions.  This   *
  205.  *           version has a new "next_evasion()" routine that is called when    *
  206.  *           the king is in check.  It generates sensible (nearly all are      *
  207.  *           legal) moves which include capturing the checking piece (if there *
  208.  *           is only one), moving the king (but not along the checking ray),   *
  209.  *           and interpositions that block the checking ray (if there is only  *
  210.  *           one checking piece.                                               *
  211.  *                                                                             *
  212.  *    2.1    Search is now broken down into three cleanly-defined phases:      *
  213.  *           (1) basic full-width search [Search()]; (2) extended tactical     *
  214.  *           search [extend()] which includes winning/even captures and then   *
  215.  *           passed pawn pushes to the 6th or 7th rank (if the pawn pushes     *
  216.  *           are safe);  (3) normal quiescence search [Quiesce()] which only   *
  217.  *           includes captures that appear to gain material.                   *
  218.  *                                                                             *
  219.  *    2.2    King safety code re-written and cleaned up.  Crafty was giving    *
  220.  *           multiple penalties which was causing the king safety score to be  *
  221.  *           extremely large (and unstable.)  Now, if it finds something wrong *
  222.  *           with king safety, it only penalizes a weakness once.              *
  223.  *                                                                             *
  224.  *    2.3    King safety code modified further, penalties were significant     *
  225.  *           enough to cause search anomolies.  Modified rook scoring to avoid *
  226.  *           having the rook trapped in the corner when the king is forced to  *
  227.  *           move rather than castle, and to keep the rook in a position to be *
  228.  *           able to reach open files in one move, which avoids getting them   *
  229.  *           into awkward positions where they become almost worthless.        *
  230.  *                                                                             *
  231.  *    2.4    King safety code completely rewritten.  It now analyzes "defects" *
  232.  *           in the king safety field and counts them as appropriate.  These   *
  233.  *           defects are then summed up and used as an index into a vector of  *
  234.  *           of values that turns them into a score in a non-linear fashion.   *
  235.  *           Increasing defects quickly "ramp up" the score to about 1/3+ of   *
  236.  *           a pawn, then additional faults slowly increase the penalty.       *
  237.  *                                                                             *
  238.  *    2.5    First check extensions added.  In the extension search (stage     *
  239.  *           between full-width and captures-only, up to two checking moves    *
  240.  *           can be included, if there are checks in the full-width part of    *
  241.  *           the search.  If only one check occurs in the full-width, then     *
  242.  *           only one check will be included in the extension phase of the     *
  243.  *           selective search.                                                 *
  244.  *                                                                             *
  245.  *    2.6    Evaluation modifications attempting to cure Crafty's frantic      *
  246.  *           effort to develop all its pieces without giving a lot of regard   *
  247.  *           to the resulting position until after the pieces are out.         *
  248.  *                                                                             *
  249.  *    2.7    New evaluation code to handle the "outside passed pawn" concept.  *
  250.  *           Crafty now understands that a passed pawn on the side away from   *
  251.  *           the rest of the pawns is a winning advantage due to decoying the  *
  252.  *           king away from the pawns to prevent the passer from promoting.    *
  253.  *           The advantage increases as material is removed from the board.    *
  254.  *                                                                             *
  255.  *    3.0    The 3.* series of versions will primarily be performance en-      *
  256.  *           hancements.  The first version (3.0) has a highly modified        *
  257.  *           version of MakeMove() that tries to do no unnecessary work.  It   *
  258.  *           is about 25% faster than old version of MakeMove() which makes    *
  259.  *           Crafty roughly 10% faster.  Also calls to Mask() have been        *
  260.  *           replaced by constants (which are replaced by calls to Mask() on   *
  261.  *           the Crays for speed) to eliminate function calls.                 *
  262.  *                                                                             *
  263.  *    3.1    Significantly modified king safety again, to better detect and    *
  264.  *           react to king-side attacks.  Crafty now uses the recursive null-  *
  265.  *           move search to depth-2 instead of depth-1, which results in       *
  266.  *           slightly improved speed.                                          *
  267.  *                                                                             *
  268.  *    3.2    Null-move restored to depth-1.  Depth-2 proved unsafe as Crafty   *
  269.  *           was overlooking tactical moves, particularly against itself,      *
  270.  *           which lost several "won" games.                                   *
  271.  *                                                                             *
  272.  *    3.3    Additional king-safety work.  Crafty now uses the king-safety     *
  273.  *           evaluation routines to compare king safety for both sides.  If    *
  274.  *           one side is "in distress" pieces are attracted to that king in    *
  275.  *           "big hurry" to either attack or defend.                           *
  276.  *                                                                             *
  277.  *    3.4    "Threat extensions" added.  Simply, this is a null-move search    *
  278.  *           used to determine if a move is good only because it is a horizon  *
  279.  *           effect type move.  We do a null move search after a move fails    *
  280.  *           high anywhere in the tree.  The window is normally lowered by 1.5 *
  281.  *           pawns, the idea being that if the fail-high move happens in a     *
  282.  *           position that fails "really low" with a null move, then this move *
  283.  *           might be a horizon move.  To test this, re-search this move with  *
  284.  *           the depth increased by one.                                       *
  285.  *                                                                             *
  286.  *    3.5    50-move rule implemented.  A count of moves since the last pawn   *
  287.  *           move or capture is kept as part of the position[] structure.  It  *
  288.  *           is updated by MakeMove().  When this number reaches 100 (which    *
  289.  *           in plies is 50 moves) Repeat() will return the draw indication    *
  290.  *           immediately, just as though the position was a repetition draw.   *
  291.  *                                                                             *
  292.  *    3.6    Search extensions cleaned up to avoid excessive extensions which  *
  293.  *           produced some wild variations, but which was also slowing things  *
  294.  *           down excessively.                                                 *
  295.  *                                                                             *
  296.  *    3.7    Endgame strategy added.  Two specifics: KBN vs K has a piece/sq   *
  297.  *           table that will drive the losing king to the correct corner.  For *
  298.  *           positions with no pawns, scoring is altered to drive the losing   *
  299.  *           king to the edge and corner for mating purposes.                  *
  300.  *                                                                             *
  301.  *    3.8    Hashing strategy modified.  Crafty now stores search value or     *
  302.  *           bound, *and* positional evaluation in the transposition table.    *
  303.  *           This avoids about 10-15% of the "long" evaluations during the     *
  304.  *           middlegame, and avoids >75% of them in endgames.                  *
  305.  *                                                                             *
  306.  *    4.0    Evaluation units changed to "millipawns" where a pawn is now      *
  307.  *           1000 rather than the prior 100 units.  This provides more         *
  308.  *           "resolution" in the evaluation and will let Crafty have large     *
  309.  *           positional bonuses for significant things, without having the     *
  310.  *           small positional advantages add up and cause problems.  V3.8      *
  311.  *           exhibited a propensity to "sac the exchange" frequently because   *
  312.  *           of this.  It is hoped that this is a thing of the past now.       *
  313.  *           Also, the "one legal reply to check" algorithm is now being used. *
  314.  *           In short, if one side has only one legal reply to a checking move *
  315.  *           then the other side is free to check again on the next ply. this  *
  316.  *           only applies in the "extension" search, and allows some checks    *
  317.  *           that extend() would normally not follow.                          *
  318.  *                                                                             *
  319.  *    4.1    Extension search modified.  It now "tracks" the basic iteration   *
  320.  *           search depth up to some user-set limit (default=6).  For shallow  *
  321.  *           depths, this speeds things up, while at deeper depths it lets the *
  322.  *           program analyze forcing moves somewhat deeper.                    *
  323.  *                                                                             *
  324.  *    4.2    Extension search modified.  Fixed a problem where successive      *
  325.  *           passed-pawn pushes were not extended correctly by extend() code.  *
  326.  *           Threat-extension margin was wrong after changing the value of a   *
  327.  *           pawn to 1000, it is now back to 1.5 pawns.                        *
  328.  *                                                                             *
  329.  *    4.3    Hash scoring "repaired."  As the piece/square tables changed, the *
  330.  *           transposition table (positional evaluation component) along with  *
  331.  *           the pawn and king-safety hash tables prevented the changes from   *
  332.  *           affecting the score, since the hashed scores were based on the    *
  333.  *           old piece/square table values.  Now, when any piece/square table  *
  334.  *           is modified, the affected hash tables are cleared of evaluation   *
  335.  *           information.                                                      *
  336.  *                                                                             *
  337.  *    4.4    Piece/square tables simplified, king tropism scoring moved to     *
  338.  *           Evaluate() where it is computed dynamically now as it should be.  *
  339.  *                                                                             *
  340.  *    4.5    Book move selection algorithm replaced.  Crafty now counts the    *
  341.  *           number of times each book move was played as the book file is     *
  342.  *           created.  Since these moves come (typically) from GM games, the   *
  343.  *           more frequently a move appears, the more likely it is to lead to  *
  344.  *           a sound position.  Crafty then enumerates all possible book moves *
  345.  *           for the current position, computes a probability distribution for *
  346.  *           each move so that Crafty will select a move proportional to the   *
  347.  *           number of times it was played in GM games (for example, if e4 was *
  348.  *           played 55% of the time, then Crafty will play e4 55% of the time) *
  349.  *           although the special case of moves played too infrequently is     *
  350.  *           handled by letting the operator set a minimum threshold (say 5)   *
  351.  *           Crafty won't play moves that are not popular (or are outright     *
  352.  *           blunders as the case may be.)  Pushing a passed pawn to the 7th   *
  353.  *           rank in the basic search [Search() module] now extends the search *
  354.  *           by two plies unless we have extended this ply already (usually a  *
  355.  *           check evasion) or unless we have extended the whole line to more  *
  356.  *           than twice the nominal iteration depth.                           *
  357.  *                                                                             *
  358.  *    5.0    Selective search extensions removed.  With the extensions now in  *
  359.  *           the basic full-width search, these became more a waste of time    *
  360.  *           than anything useful, and removing them simplifies things quite   *
  361.  *           a bit.                                                            *
  362.  *                                                                             *
  363.  *    5.1    Pondering logic now has a "puzzling" feature that is used when    *
  364.  *           the search has no move to ponder.  It does a short search to find *
  365.  *           a move and then ponders that move, permanently eliminating the    *
  366.  *           "idle" time when it has nothing to ponder.                        *
  367.  *                                                                             *
  368.  *    5.2    Evaluation terms scaled down to prevent positional scores from    *
  369.  *           reaching the point that sacrificing material to avoid simple      *
  370.  *           positional difficulties begins to look attractive.                *
  371.  *                                                                             *
  372.  *    5.3    Performance improvement produced by avoiding calls to MakeMove()  *
  373.  *           when the attack information is not needed.  Since the first test  *
  374.  *           done in Quiesce() is to see if the material score is so bad that  *
  375.  *           a normal evaluation and/or further search is futile, this test    *
  376.  *           has been moved to inside the loop *before* Quiesce() is           *
  377.  *           recursively called, avoiding the MakeMove() work only to          *
  378.  *           discover that the resulting position won't be searched further.   *
  379.  *                                                                             *
  380.  *    5.4    New SEE() function that now understands indirect attacks through  *
  381.  *           the primary attacking piece(s).  This corrects a lot of sloppy    *
  382.  *           move ordering as well as make the "futility" cutoffs added in     *
  383.  *           in version 5.3 much more reliable.                                *
  384.  *                                                                             *
  385.  *    5.5    Checks are now back in the quiescence search.  Crafty now stores  *
  386.  *           a negative "draft" in the transposition table rather than forcing *
  387.  *           any depth < 0 to be zero.  The null-move search now searches the  *
  388.  *           null-move to depth-1 (R=1) rather than depth-2 (R=2) which seemed *
  389.  *           to cause some tactical oversights in the search.                  *
  390.  *                                                                             *
  391.  *    5.6    Improved move ordering by using the old "killer move" idea.  An   *
  392.  *           additional advantage is that the killers can be tried before      *
  393.  *           generating any moves (after the captures.)  Quiescence now only   *
  394.  *           includes "safe" checks (using SEE() to determine if it is a safe  *
  395.  *           checking move.                                                    *
  396.  *                                                                             *
  397.  *    5.7    King safety now "hates" a pawn at b3/g3 (white) or b6/g6 (black)  *
  398.  *           to try and avoid the resulting mate threats.                      *
  399.  *                                                                             *
  400.  *    5.8    EvaluateOutsidePassedPawns() fixed to correctly evaluate those    *
  401.  *           positions where both sides have outside passed pawns.  Before     *
  402.  *           this fix, it only evaluated positions where one side had a passed *
  403.  *           pawn, which overlooked those won/lost positions where both sides  *
  404.  *           have passed pawns but one is "distant" or "outside" the other.    *
  405.  *                                                                             *
  406.  *    5.9    Removed "futility" forward pruning.  Exhaustive testing has       *
  407.  *           proved that this causes significant tactical oversights.          *
  408.  *                                                                             *
  409.  *    5.10   Added code to handle king and pawn vs king, which understands     *
  410.  *           the cases where the pawn can't outrun the king, but has to be     *
  411.  *           assisted along by the king.                                       *
  412.  *                                                                             *
  413.  *    5.11   Two king-safety changes.  (1) The program's king safety score is  *
  414.  *           now "doubled" to make it much less likely that it will try to win *
  415.  *           a pawn but destroy it's king-side.  (2) The attack threshold has  *
  416.  *           been lowered which is used to key the program that it is now      *
  417.  *           necessary to move pieces to defend the king-side, in an effort to *
  418.  *           protect a king-side that is deemed somewhat unsafe.               *
  419.  *                                                                             *
  420.  *    5.12   Improved null-move code by computing the Knuth/Moore node type    *
  421.  *           and then only trying null-moves at type 2 nodes.  This has        *
  422.  *           resulted in a 2x speedup in test positions.                       *
  423.  *                                                                             *
  424.  *    5.13   Optimization to avoid doing a call to MakeMove() if it can be     *
  425.  *           avoided by noting that the move is not good enough to bring the   *
  426.  *           score up to an acceptable level.                                  *
  427.  *                                                                             *
  428.  *    5.14   Artificially isolated pawns recognized now, so that Crafty won't  *
  429.  *           push a pawn so far it can't be defended.  Also, the bonus for a   *
  430.  *           outside passed pawn was nearly doubled.                           *
  431.  *                                                                             *
  432.  *    5.15   Passed pawns supported by a king, or connected passed pawns now   *
  433.  *           get a large bonus as they advance.  Minor fix to the ICC resume   *
  434.  *           feature to try to avoid losing games on time.                     *
  435.  *                                                                             *
  436.  *    6.0    Converted to rotated bitboards to make attack generation *much*   *
  437.  *           faster.  MakeMove() now can look up the attack bit vectors        *
  438.  *           rather than computing them which is significantly faster.         *
  439.  *                                                                             *
  440.  *    6.1    Added a "hung piece" term to Evaluate() which penalizes the side  *
  441.  *           to move if a piece is attacked by a lesser piece, or a piece is   *
  442.  *           attacked and not defended at all.  Additionally, a new scoring    *
  443.  *           term was added to detect a weak back rank (where the king does    *
  444.  *           not attack an empty square on the 2nd rank, and there are no      *
  445.  *           horizontally sliding pieces [rook or queen] on the first rank to  *
  446.  *           guard against back-rank mates.                                    *
  447.  *                                                                             *
  448.  *    6.2    Modified the "futility" cutoff to (a) emulate the way the program *
  449.  *           normally searches, but avoiding MakeMove() calls when possible,   *
  450.  *           and (2) not searching a move near the horizon if the material     *
  451.  *           score is hopeless.                                                *
  452.  *                                                                             *
  453.  *    6.3    Null-move code moved from NextMove() directly into Search().      *
  454.  *           this results is a "cleaner" implementation, as well as fixing an  *
  455.  *           error in the node type, caused by Search() thinking that after    *
  456.  *           the first move tried fails to cause a cutoff, that suddenly this  *
  457.  *           node is a type=3 node (Knuth and Moore).  This bug would then     *
  458.  *           introduce null-moves into later nodes that are a waste of time.   *
  459.  *                                                                             *
  460.  *    6.4    Pawn scoring modified.  Passed pawns were scored low enough that  *
  461.  *           Crafty would let the opponent create one in the endgame (as long  *
  462.  *           as it wasn't an "outside" passed pawn).  This required adjusting  *
  463.  *           isolated pawns as well.  All "weak" pawns (pawns on open files    *
  464.  *           that aren't defended by a pawn) are not penalized so much if      *
  465.  *           there aren't any rooks/queens to attack on the file.              *
  466.  *                                                                             *
  467.  *    7.0    Removed the to.attack and from.attack bitboards.  These are now   *
  468.  *           computed as needed, using the rotated bitboards.  Hung piece      *
  469.  *           stuff removed due to lack of any verified benefit.                *
  470.  *                                                                             *
  471.  *    7.1    Modified next.c and nextc.c so that they check "mvv_lva_ordering" *
  472.  *           to determine which capture ordering strategy to use.  Note that   *
  473.  *           setting this to "1" (default at present) disables the forward     *
  474.  *           pruning in quiescence search that wants to cull losing captures.  *
  475.  *                                                                             *
  476.  *    7.2    Major clean-up of MakeMove() using macros to make it easier to    *
  477.  *           read and understand.  Ditto for other modules as well.  Fixed a   *
  478.  *           bug in Evaluate() where bishop scoring failed in endgame          *
  479.  *           situations, and discouraged king centralization.                  *
  480.  *                                                                             *
  481.  *    7.3    Evaluate() is no longer called if material is too far outside the *
  482.  *           current alpha/beta window.  The time-consuming part of Evaluate() *
  483.  *           is no longer done if the major scoring contributors in Evaluate() *
  484.  *           haven't pulled the score within the alpha/beta window, and the    *
  485.  *           remainder of Evaluate() can't possible accomplish this either.    *
  486.  *           Gross error in EvaluatePawns() fixed, which would "forget" all    *
  487.  *           of the pawn scoring done up to the point where doubled white      *
  488.  *           pawns were found.  Error was xx=+ rather than xx+=, which had     *
  489.  *           an extremely harmful effect on pawn structure evaluation.         *
  490.  *                                                                             *
  491.  *    7.4    Performance improvements produced by elimination of bit-fields.   *
  492.  *           This was accomplished by hand-coding the necessary ANDs, ORs, and *
  493.  *           SHIFTs necessary to accomplish the same thing, only faster.       *
  494.  *                                                                             *
  495.  *    7.5    Repetition code modified.  It could store at replist[-1] which    *
  496.  *           clobbered the long long word just in front of this array.         *
  497.  *                                                                             *
  498.  *    7.6    Null move search now searches with R=2, unless within 3 plies     *
  499.  *           of the quiescence search, then it searches nulls with R=1.        *
  500.  *                                                                             *
  501.  *    8.0    Re-vamp of evaluation, bringing scores back down so that Crafty   *
  502.  *           will stop sacrificing the exchange, or a piece for two pawns just *
  503.  *           it thinks it has lots of positional compensation.  The next few   *
  504.  *           versions are going to be tuning or coding modifications to eval.  *
  505.  *                                                                             *
  506.  *    8.1    Futility() re-written to be more efficient, as well as to stop    *
  507.  *           tossing moves out based on the +/- 2 pawn window, which was too   *
  508.  *           speculative.  It still saves roughly 20% in speed over the same   *
  509.  *           searches without futility, but seems to have *no* harmful effects *
  510.  *           in tests run to date.                                             *
  511.  *                                                                             *
  512.  *    8.2    Futility() removed once and for all.  Since MakeMove() is so      *
  513.  *           fast after the new attack generation algorithm, this was actually *
  514.  *           slower than not using it.                                         *
  515.  *                                                                             *
  516.  *    8.3    EvaluatePawns() weak pawn analysis bug fixed.  Other minor        *
  517.  *           performance enhancements and cleanup.                             *
  518.  *                                                                             *
  519.  *    8.4    Dynamic "king tropism" evaluation term now used, which varies     *
  520.  *           based on how exposed the target king is.  The more exposed, the   *
  521.  *           larger the bonus for placing pieces near the king.  New "analyze" *
  522.  *           feature that complements the "annotate" feature that Crafty has   *
  523.  *           had for a while.  Annotate is used to play over moves that are    *
  524.  *           either in the current game history, or have been read in using    *
  525.  *           the "read <filename>" command.  Analyze, on the other hand, will  *
  526.  *           immediately begin searching the current position.  Each time the  *
  527.  *           operator enters a move, it will make that move on the board, and  *
  528.  *           then search the resulting position for the other side.  In effect *
  529.  *           this gives a running commentary on a "game in progress".  These   *
  530.  *           moves can be pumped into Crafty in many ways so that "on the fly" *
  531.  *           analysis of a game-in-progress is possible.                       *
  532.  *                                                                             *
  533.  *    8.5    More cleanup.  Pawn promotions were searched twice, thanks to the *
  534.  *           killer moves, although often they resulted in no search overhead  *
  535.  *           due to transposition table hits the second time around.  Other    *
  536.  *           minor fixes, including one serious "undefined variable" in        *
  537.  *           Evaluate() that caused grief in endings.                          *
  538.  *                                                                             *
  539.  *    8.6    New book file structure.  It is no longer necessary to enter the  *
  540.  *           "number of records" as Crafty now uses a new compressed hashing   *
  541.  *           technique so that the book has no empty space in it, and the size *
  542.  *           is computed "on the fly" producing a smaller book without the     *
  543.  *           user having to compute the size.  Tweaks to Evaluate() to cure    *
  544.  *           minor irritating habits.                                          *
  545.  *                                                                             *
  546.  *    8.7    Repaired optimization made in null-move search, that forgot to    *
  547.  *           clear "EnPassant_Target".  A double pawn push, followed by a null *
  548.  *           left the side on move "very confused" and would let it play an    *
  549.  *           illegal enpassant capture in the tree. Sort.<n> files are now     *
  550.  *           removed after book.bin is created.  Also, minor change to book    *
  551.  *           format makes it incompatible with older book versions, but also   *
  552.  *           allows book lines to be as long as desired, and the book size to  *
  553.  *           reach any reasonable size.  Dynamic king tropism replaced by a    *
  554.  *           dynamic computation, but with a static king tropism score, rather *
  555.  *           than a score based on king exposure.  There was simply too much   *
  556.  *           interaction, although this may prove workable later.              *
  557.  *                                                                             *
  558.  *    8.8    Tweaks to passed pawn scoring.  Scores were too low, making       *
  559.  *           Crafty "ignore" them too much.                                    *
  560.  *                                                                             *
  561.  *    8.9    Internal iterative deepening is now used in those rare positions  *
  562.  *           where a PV node has no hash move to search.  This does a shallow  *
  563.  *           search to depth-2 to find a good move for ordering.               *
  564.  *                                                                             *
  565.  *    8.10   Internal interative deepening modified to handle cases where lots *
  566.  *           of tactics make the deepening search fail high or low, and        *
  567.  *           occasionally end up with no move to try.  This produced a "bad    *
  568.  *           move from hash table" error.                                      *
  569.  *                                                                             *
  570.  *    8.11   Minor bug in internal iterative deepening fixed.  Also, macros    *
  571.  *           for accessing the "position" data structure are now used to make  *
  572.  *           things a little more readable.                                    *
  573.  *                                                                             *
  574.  *    8.12   Fixed minor bugs in quiescence checks, which let Crafty include   *
  575.  *           more checks than intended (default quiescence_checks=2, but the   *
  576.  *           comparison was <= before including a check, which made it include *
  577.  *           three.  Additionally, a hashed check was *always* tried, even if  *
  578.  *           quiescence_checks had already been satisfied.  Pawn scoring also  *
  579.  *           had a bug, in that there was a "crack" between opening and middle *
  580.  *           game, where Crafty would conclude that it was in an endgame, and  *
  581.  *           adjust the pawn advance scores accordingly, sometimes causing an  *
  582.  *           odd a4/a5/etc move "out of the blue."  Minor bug in next_capture  *
  583.  *           was pruning even exchanges very early in quiescence search.  That *
  584.  *           has now been removed, so only losing exchanges are pruned.        *
  585.  *                                                                             *
  586.  *    8.13   NextCapture() now *always* tries checking moves if the move at    *
  587.  *           the previous ply was a null-move.  This avoids letting the null   *
  588.  *           move hide some serious mating threats.  A minor bug where Crafty  *
  589.  *           could draw by repetition after announcing a mate.  This was a     *
  590.  *           result of finding a mate score in hash table, and, after the      *
  591.  *           search iteration completed, the mate score would terminate the    *
  592.  *           search completely.  Now, the search won't terminate until it      *
  593.  *           finds a mate shorter than the previous search did.  Minor eval    *
  594.  *           tweaks and bugfixes as well.                                      *
  595.  *                                                                             *
  596.  *    8.14   Checks after null moves discontinued.  Worked in some cases, but, *
  597.  *           in general made the tree larger for nothing.  Eval tweaks to stop *
  598.  *           sacs that resulted in connected passed pawns, often at the        *
  599.  *           expense of a minor piece for a pawn or two, which usually lost.   *
  600.  *           Mobility coeffecient increased for all pieces.  Asymmetric king   *
  601.  *           safety discontinued.  King safety for both sides is now equally   *
  602.  *           important.  King safety is now also proportional to the number of *
  603.  *           pieces the other side has, so that a disrupted king-side will     *
  604.  *           encourage trading pieces to reduce attacking chances.             *
  605.  *                                                                             *
  606.  *    8.15   Weak pawn scoring modified further.  The changes are designed to  *
  607.  *           cause Crafty to keep pawns "mobile" where they can advance,       *
  608.  *           rather than letting them become blocked or locked.                *
  609.  *                                                                             *
  610.  *    8.16   Still more weak pawn modifications.  In addition, there is no     *
  611.  *           "rook on half-open file" any longer.  If there are only enemy     *
  612.  *           pawns on the file, and the most advanced one is weak, then the    *
  613.  *           file is treated as though it were open.  Technical error in the   *
  614.  *           EvaluateDevelopment() code that caused screwey evaluations is     *
  615.  *           fixed, making Crafty more likely to castle.  :)  Book() now       *
  616.  *           verifies that the current position is in book, before trying any  *
  617.  *           moves to see if the resulting positions are in book.  This avoids *
  618.  *           something like e4 e5 Bb5 a6 Nf3 from causing Crafty to play Nc6   *
  619.  *           which takes it back into book, rather than axb5 winning a piece.  *
  620.  *           This will occasionally backfire and prevent Crafty from trans-    *
  621.  *           posing back into book, but seems safer at present.                *
  622.  *                                                                             *
  623.  *    8.17   Piece values changed somewhat, to avoid Crafty's propensity to    *
  624.  *           make unfavorable trades.  An example:  Crafty is faced with the   *
  625.  *           loss of a pawn.  Instead, it trades the queen for a rook and      *
  626.  *           bishop, which used to be the same as losing a pawn.  This is not  *
  627.  *           so good, and often would result in a slow loss.  This version     *
  628.  *           also implements several "user-supplied" patches to make Crafty    *
  629.  *           compile cleanly on various machines.  In addition, you no longer  *
  630.  *           have to continually modify types.h for different configurations.  *
  631.  *           the Makefile now supplies a -D<target> to the compiler.  You need *
  632.  *           to edit Makefile and set "target" to the appropriate value from   *
  633.  *           the list provided.  Then, when getting a new version, save your   *
  634.  *           Makefile, extract the new source, copy in your makefile and you   *
  635.  *           will be ready, except for those rare occasions where I add a new  *
  636.  *           source module.  Other changes are performance tweaks.  One is a   *
  637.  *           simple trick to order captures while avoiding SEE() if possible.  *
  638.  *           If the captured piece is more valuable than the capturing piece,  *
  639.  *           we can simply use the difference (pessimistic value) rather than  *
  640.  *           calling SEE() since this pessimistic value is still > 0.  Other   *
  641.  *           tweaks to the various Next_*() routines to avoid a little un-     *
  642.  *           necessary work.                                                   *
  643.  *                                                                             *
  644.  *    8.18   Book move selection algorithm changed.  Note that this is highly  *
  645.  *           speculative, but when best book play is selected, Crafty will     *
  646.  *           use the books.bin file as always.  If there is no move in books,  *
  647.  *           Crafty reverts to book.bin, but now finds all known book moves    *
  648.  *           and puts them into the root move list.  It then does a fairly     *
  649.  *           short search, only considering these moves, and it will play the  *
  650.  *           best one so long as the evaluation is acceptable.  If not, it     *
  651.  *           simply returns as though there was no book move, and executes a   *
  652.  *           search as it normally would.  The book hashing algorithm was also *
  653.  *           modified so that the 64-bit hash key is slightly different from   *
  654.  *           the real hash key.  In effect, the upper 16 bits are only set as  *
  655.  *           a result of the side-not-to-move's pieces.  This means that for a *
  656.  *           given position, all the book moves will be in the same "cluster"  *
  657.  *           which makes the book dramatically faster, since one seek and read *
  658.  *           produces all the possible book moves (plus some others too, since *
  659.  *           the upper 16 bits are not unique enough.)  A significant speed    *
  660.  *           improvement is noticable, particularly with a 60mb opening book.  *
  661.  *           Crafty now understands (if that's the right word) that endings    *
  662.  *           with bishops of opposite colors are to be avoided.  When such an  *
  663.  *           ending is encountered, the total score is simply divided by two   *
  664.  *           to make the ending look more drawish.                             *
  665.  *                                                                             *
  666.  *    8.19   Book selection algorithm further modified, so that the result of  *
  667.  *           each game in the GM database is known.  Now Crafty will not play  *
  668.  *           a move from book, if all games were lost by the side on move,     *
  669.  *           hopefully avoiding many blunders.  Crafty now understands how to  *
  670.  *           attack if both players castle on opposite sides, by encouraging   *
  671.  *           pawn advances against the kings.  Other minor modifications to    *
  672.  *           the eval values.                                                  *
  673.  *                                                                             *
  674.  *    8.20   PVS search finally implemented fully.  Problems several months    *
  675.  *           ago prevented doing the PVS search along the PV itself.  This is  *
  676.  *           therefore quite a bit faster, now that it's fully implemented and *
  677.  *           working properly.  Elapsed time code modified so that Crafty now  *
  678.  *           uses gettimeofday() to get fractions of a second elapsed time.    *
  679.  *           Slight modification time allocation algorithm to avoid using too  *
  680.  *           much time early in the game.                                      *
  681.  *                                                                             *
  682.  *    8.21   Courtesy of Mark Bromley, Crafty may run significantly faster on  *
  683.  *           your machine.  There are some options in the Makefile that will   *
  684.  *           eliminate many of the large attack computation long longs, which  *
  685.  *           helps prevent cache thrashing.  On some machines this will be     *
  686.  *           slower, on others 20% (or maybe more) faster.  You'll have to     *
  687.  *           try -DCOMPACT_ATTACKS, and if that's faster, then it's time to    *
  688.  *           try -DUSE_SPLIT_SHIFTS which may help even more.  Finally, if you *
  689.  *           are running on a supersparc processor, you can use the fastattack *
  690.  *           assembly module fastattack.s and get another big boost.  (Attack  *
  691.  *           function is largest compute user in Crafty at present.) Serious   *
  692.  *           search problem fixed.  It turns out that Crafty uses the hash     *
  693.  *           table to pass PV moves from one iteration to the next, but for    *
  694.  *           moves at the root of the tree the hash table has no effect, so a  *
  695.  *           special case was added to RootMoveList to check the list of moves *
  696.  *           and if one matches the PV move, move it to the front of the list. *
  697.  *           This turned out to be critical because after completing a search, *
  698.  *           (say to 9 plies) Crafty makes its move, then chops the first two  *
  699.  *           moves off of the PV and then passes that to iterate to start a    *
  700.  *           search.  This search starts at lastdepth-1 (8 in this case) since *
  701.  *           the n-2 search was already done.  The "bug" showed up however, in *
  702.  *           that RootMoveList() was not checking for the PV move correctly,   *
  703.  *           which meant the root moves were ordered by static eval and static *
  704.  *           exchange evaluation.  Normally not a serious problem, just that   *
  705.  *           move ordering is not so good.  However, suppose that the opponent *
  706.  *           takes a real long time to make a move (say 30 seconds) so that    *
  707.  *           Crafty completes a 10 ply search.  It then starts the next search *
  708.  *           at depth=9, but with the wrong move first.  If the target time is *
  709.  *           not large enough to let it resolve this wrong move and get to the *
  710.  *           other moves on the list, Crafty is "confused" into playing this   *
  711.  *           move knowing absolutely nothing about it.  The result is that it  *
  712.  *           can play a blunder easily.  The circumstances leading to this are *
  713.  *           not common, but in a 60 move game, once is enough.  PV was pretty *
  714.  *           well mis-handled in carrying moves from one search to another     *
  715.  *           (not from one iteration to another, but from one complete search  *
  716.  *           to another) and has been fixed.  A cute glitch concerning storing *
  717.  *           PV from one iteration to another was also fixed, where the score  *
  718.  *           stored was confusing the following search.                        *
  719.  *                                                                             *
  720.  *    8.22   EPD support (courtesy of Steven Edwards [thanks]) is now standard *
  721.  *           in Crafty.  For porting, I'll provide a small test run which can  *
  722.  *           be used to validate Crafty once it's been compiled.               *
  723.  *                                                                             *
  724.  *    8.23   Cleanup/speedup in hashing.  ProbeTransRef() and StoreTransRef()  *
  725.  *           now carefully cast the boolean operations to the most efficient   *
  726.  *           size to avoid 64bit operations when only the right 32 bits are    *
  727.  *           significant. Repeat() code completely re-written to maintain two  *
  728.  *           repetition lists, one for each side.  Quiesce() now handles the   *
  729.  *           repetition check a little different, being careful to not call it *
  730.  *           when it's unimportant, but calling it when repetitions are        *
  731.  *           possible.                                                         *
  732.  *                                                                             *
  733.  *    8.24   Tweaks for king tropism to encourage pieces to collect near the   *
  734.  *           king, or to encourage driving them away when being attacked.  A   *
  735.  *           modification to Evaluate() to address the problem where Crafty    *
  736.  *           is forced to play Kf1 or Kf8, blocking the rook in and getting    *
  737.  *           into tactical difficulties as a result.  Book problem fixed where *
  738.  *           Bookup was attempting to group moves with a common ancestor       *
  739.  *           position together.  Unfortunately, captures were separated from   *
  740.  *           this group, meaning capture moves in the book could never be      *
  741.  *           played.  If a capture was the only move in book, it sort of       *
  742.  *           worked because Crafty would drop out of book (not finding the     *
  743.  *           capture) and then the search would "save" it.  However, if there  *
  744.  *           was a non-capture alternative, it would be forced to play it,     *
  745.  *           making it play gambits, and, often, bad ones.  Tablebase support  *
  746.  *           is now in.  The tablebase files can be downloaded from the ftp    *
  747.  *           machine at chess.onenet.net, pub/chess/TB.  Currently, Steven     *
  748.  *           Edwards has all interesting 4 piece endings done.  To make this   *
  749.  *           work, compile with -DTABLEBASES, and create a TB directory where  *
  750.  *           Crafty is run, and locate the tablebase files in that directory.  *
  751.  *           If you are running under UNIX, TB can be a symbolic or hard link  *
  752.  *           to a directory anywhere you want.                                 *
  753.  *                                                                             *
  754.  *    8.25   Minor repair on draw by repetition.  Modified how books.bin was   *
  755.  *           being used.  Now, a move in books.bin has its flags merged with   *
  756.  *           the corresponding move from book.bin, but if the move does not    *
  757.  *           exist in book.bin, it is still kept as a book move.  Repetitions  *
  758.  *           are now counted as a draw if they occur two times, period.  The   *
  759.  *           last approach was causing problems due to hashing, since the hash *
  760.  *           approach used in Crafty is fairly efficient and frequently will   *
  761.  *           carry scores across several searches.  This resulted in Crafty    *
  762.  *           stumbling into a draw by repetition without knowing.  The con-    *
  763.  *           figuration switch HAS-64BITS has been cleaned up and should be    *
  764.  *           set for any 64bit architecture now, not just for Cray machines.   *
  765.  *                                                                             *
  766.  *    8.26   New search extension added, the well-known "one legal response to *
  767.  *           check" idea.  If there's only one legal move when in check, we    *
  768.  *           extend two plies rather than one, since this is a very forcing    *
  769.  *           move.  Also, when one side has less than a rook, and the other    *
  770.  *           has passed pawns, pushing these pawns to the 6th or 7th rank      *
  771.  *           will extend the search one ply, where in normal positions, we     *
  772.  *           only extend when a pawn reaches the 7th rank.                     *
  773.  *                                                                             *
  774.  *    9.0    Minor constraint added to most extensions:  we no longer extend   *
  775.  *           if the side on move is either significantly ahead or behind,      *
  776.  *           depending on the extension.  For example, getting out of check    *
  777.  *           won't extend if the side on move is a rook behind, since it's     *
  778.  *           already lost anyway.  We don't extend on passed pawn pushes if    *
  779.  *           the side on move is ahead a rook, since he's already winning.     *
  780.  *           minor adjustments for efficiency as well.  The next few versions  *
  781.  *           in this series will have module names in these comments           *
  782.  *           indicating which modules have been "cleaned" up.  This is an      *
  783.  *           effort at optimizing, although it is currently directed at a line *
  784.  *           by line analysis within modules, rather than major changes that   *
  785.  *           effect more global ideas.  This type of optimization will come at *
  786.  *           a later point in time.                                            *
  787.  *                                                                             *
  788.  *    9.1    NextMove(), NextCapture() and NextEvasion() were re-structured    *
  789.  *           to eliminate unnecessary testing and speed them up significantly. *
  790.  *           EvaluateTrades() was completely removed, since Crafty already has *
  791.  *           positional scores that encourage/discourage trading based on the  *
  792.  *           status of the game.  EvaluateTempo() was evaluated to be a        *
  793.  *           failure and was removed completely.                               *
  794.  *                                                                             *
  795.  *    9.2    Quiesce()) and Search() were modified to be more efficient.  In   *
  796.  *           addition, the null-move search was relaxed so that it always does *
  797.  *           a search to depth-R, even if close to the end of the tree.        *
  798.  *                                                                             *
  799.  *    9.3    Check() is no longer used to make sure a position is legal after  *
  800.  *           MakeMove() called, but before Search() is called recursively.  We *
  801.  *           now use the same approach as Cray Blitz, we make a move and then  *
  802.  *           capture the king at the next ply to prove the position is not a   *
  803.  *           valid move.  If the side-on-move is already in check, we use      *
  804.  *           NextEvasion() which only generates legal moves anyway, so this    *
  805.  *           basically eliminates 1/2 of the calls to Check(), a big win.      *
  806.  *           This resulted in modifications to Search(), Quiesce(), and        *
  807.  *           QuiesceFull().  Connected passed pawns on 6th-7th no longer       *
  808.  *           trigger search extensions.  Solved some problems like Win at      *
  809.  *           Chess #2, but overall was a loser.                                *
  810.  *                                                                             *
  811.  *    9.4    Lookup now checks the transposition table entry and then informs  *
  812.  *           Search() when it appears that a null move is useless.  This is    *
  813.  *           found when the draft is too low to use the position, but it is at *
  814.  *           least as deep as a null-move search would go, and the position    *
  815.  *           did not cause a fail-high when it was stored.  King-safety was    *
  816.  *           modified again.  The issue here is which king should attract the  *
  817.  *           pieces, and for several months the answer has been the king that  *
  818.  *           is most exposed attracts *all* pieces.  This has been changed to  *
  819.  *           always attract one side's pieces to the other king.  Crafty's     *
  820.  *           asymmetric king-safety was making it overly-defensive, even when  *
  821.  *           the opponent's king was more exposed.  This should cure that and  *
  822.  *           result in more aggressive play.                                   *
  823.  *                                                                             *
  824.  *    9.5    "Vestigial code" (left over from who-knows-when) removed from     *
  825.  *           Evaluate().  This code used an undefined variable when there was  *
  826.  *           no bishop or knight left on the board, and could add in a penalty *
  827.  *           on random occasions.  Quiescence checks removed completely to see *
  828.  *           how this works, since checks extend the normal search significant *
  829.  *           amounts in any case.  QuiesceFull() removed and merged into       *
  830.  *           Quiesce() which is faster and smaller.  First impression: faster, *
  831.  *           simpler, better.  The benefit of no quiescence checks is that the *
  832.  *           exhaustive search goes deeper to find positional gains, rather    *
  833.  *           than following checks excessively.  No noticable loss in tactical *
  834.  *           strength (so far).                                                *
  835.  *                                                                             *
  836.  *    9.6    legal move test re-inserted in Search() since null-moves could    *
  837.  *           make it overlook the fact that a move was illegal.  New assembly  *
  838.  *           code for X86 improves performance about 1/3, very similarly to    *
  839.  *           the results obtained with the sparc-20 assembly code.  This was   *
  840.  *           contributed by Eugene Nalimov and is a welcome addition.          *
  841.  *                                                                             *
  842.  *    9.7    Optimizations continuing.  Minor bug in pawn evaluation repaired. *
  843.  *           Crafty looked at most advanced white pawn, but least-advanced     *
  844.  *           black pawn on a file when doing its weak pawn evaluation.  The    *
  845.  *           history heuristic was slightly broken, in that it was supposed to *
  846.  *           be incrementing the history count by depth*depth, but this was    *
  847.  *           somehow changed to 7*depth, which was not as good.  Assembly      *
  848.  *           language interface fixed to cleanly make Crafty on all target     *
  849.  *           architectures.                                                    *
  850.  *                                                                             *
  851.  *    9.8    The first change was to borrow a time-allocation idea from Cray   *
  852.  *           Blitz.  Essentially, when Crafty notices it has used the normal   *
  853.  *           time allotment, rather than exiting the search immediately, it    *
  854.  *           will wait until it selects the next move at the root of the tree. *
  855.  *           The intent of this is that if it has started searching a move     *
  856.  *           that is going to be better than the best found so far, this will  *
  857.  *           take more time, while a worse move will fail low quickly.  Crafty *
  858.  *           simply spends more time to give this move a chance to fail high   *
  859.  *           or else quickly fail low.  A fairly serious bug, that's been      *
  860.  *           around for a long time, has finally been found/fixed.  In simple  *
  861.  *           terms, if the "noise" level was set too high, it could make       *
  862.  *           Crafty actually play a bad move.  The more likely effect was to   *
  863.  *           see "bad move hashed" messages and the first few lines of output  *
  864.  *           from the search often looked funny.  The bug was "noise" was used *
  865.  *           as a limit, until that many nodes had been searched, no output    *
  866.  *           would be produced.  Unfortunately, on a fail-high condition, the  *
  867.  *           same code that produced the "++  Nh5" message also placed the     *
  868.  *           fail-high move in the PV.  Failing to do this meant that the      *
  869.  *           search could fail high, but not play the move it found.  Most     *
  870.  *           often this happened in very fast games, or near the end of long   *
  871.  *           zero-increment games.  It now always saves this move as it should *
  872.  *           regardless of whether it prints the message or not.               *
  873.  *                                                                             *
  874.  *    9.9    Interface to Xboard changed from -ics to -xboard, so that -ics    *
  875.  *           can be used with the custom interface.  Additional code to        *
  876.  *           communicate with custom interface added.  Search() extensions are *
  877.  *           restricted so that there can not be more than one extension at a  *
  878.  *           node, rather than the two or (on occasion) more of the last       *
  879.  *           version.                                                          *
  880.  *                                                                             *
  881.  *    9.10   Converted to Ken Thompson's "Belle" hash table algorithm.  Simply *
  882.  *           put, each side has two tables, one that has entries replaced on a *
  883.  *           depth-priority only, the other is an "always replace" table, but  *
  884.  *           is twice as big.  This allows "deep" entries to be kept along     *
  885.  *           with entries close to search point.  Basically, when the depth-   *
  886.  *           priority table gets a position stored in it, the displaced        *
  887.  *           position is moved to the always-replace table.  If the position   *
  888.  *           can not replace the depth-priority entry, it always overwrites    *
  889.  *           the other always-replace entry.  However, a position is never put *
  890.  *           in both tables at the same time.                                  *
  891.  *                                                                             *
  892.  *    9.11   Bug in Search() that could result in the "draft" being recorded   *
  893.  *           incorrectly in the hash table.  Caused by passing depth, which    *
  894.  *           could be one or two plies more than it should be due to the last  *
  895.  *           move extending the search.  Repeat() completely removed from      *
  896.  *           Quiesce() since only capture moves are included, and it's         *
  897.  *           impossible to repeat a position once a capture has been made.     *
  898.  *                                                                             *
  899.  *    9.12   optimizations: history.c, other minor modifications.              *
  900.  *                                                                             *
  901.  *    9.13   EvaluatePawns() modified significantly to simplify and be more    *
  902.  *           accurate as well.  Pawns on open files are now not directly       *
  903.  *           penalized if they are weak, rather the penalty is added when the  *
  904.  *           rooks are evaluated.  Pawn hashing modified to add more info to   *
  905.  *           the data that is hashed.  King safety scores toned down almost    *
  906.  *           50% although it is still asymmetric.                              *
  907.  *                                                                             *
  908.  *    9.14   EvaluatePawns() modified further so that it now does the same     *
  909.  *           computations for king safety as the old EvaluateKingSafety*()     *
  910.  *           modules did, only it produces four values, two for each king,     *
  911.  *           for each side of the board (king or queen-side).  This is now     *
  912.  *           hashed with the rest of the pawn scoring, resulting in less       *
  913.  *           hashing and computation, and more hits for king-safety too.  King *
  914.  *           safety modified further.  Asymmetric scoring was accidentally     *
  915.  *           disabled several versions ago, this is now enabled again.         *
  916.  *                                                                             *
  917.  *    9.15   Evaluate() now attempts to recognize the case where a knight is   *
  918.  *           trapped on one of the four corner squares, much like a bishop     *
  919.  *           trapped at a2/a7/h2/h7.  If a knight is on a corner square, and   *
  920.  *           neither of the two potential flight squares are safe (checked by  *
  921.  *           SEE()) then a large penalty is given.  This was done to avoid     *
  922.  *           positions where Crafty would give up a piece to fork the king and *
  923.  *           rook at (say) c7, and pick up the rook at a8 and think it was an  *
  924.  *           exchange ahead, when often the knight was trapped and it was      *
  925.  *           two pieces for a rook and pawn (or worse.)  Two timing bugs fixed *
  926.  *           in this version:  (1) nodes_per_second was getting clobbered at   *
  927.  *           the end of iterate, which would then corrupt the value stored in  *
  928.  *           nodes_between_time_checks and occasionally make Crafty not check  *
  929.  *           the time very often and use more time than intended; (2) the      *
  930.  *           "don't stop searching after time is out, until the current move   *
  931.  *           at the root of the tree has been searched" also would let Crafty  *
  932.  *           use time unnecessarily.                                           *
  933.  *                                                                             *
  934.  *    9.16   Significant changes to the way MakeMove() operates.  Rather than  *
  935.  *           copying the large position[ply] structure around, the piece       *
  936.  *           location bitmaps and the array of which piece is on which square  *
  937.  *           are now simple global variables.  This means that there is now an *
  938.  *           UnmakeMove() function that must be used to restore these after a  *
  939.  *           a move has been made.  The benefit is that we avoid copying 10    *
  940.  *           bitmaps for piece locations when typically only one is changed,   *
  941.  *           Ditto for the which piece is on which square array which is 64    *
  942.  *           bytes long.  The result is much less memory traffic, with the     *
  943.  *           probability that the bitmaps now stay in cache all the time. The  *
  944.  *           EvaluatePawns() code now has an exponential-type penalty for      *
  945.  *           isolated pawns, but it penalizes the difference between white and *
  946.  *           black isolated pawns in this manner.  King evaluation now         *
  947.  *           evaluates cases where the king moves toward one of the rooks and  *
  948.  *           traps it in either corner.                                        *
  949.  *                                                                             *
  950.  *    9.17   Xboard compatibility version!  Now supports, so far as I know,    *
  951.  *           the complete xboard interface, including hint, show thinking,     *
  952.  *           taking back moves, "move now" and so forth.  Additionally, Crafty *
  953.  *           now works with standard xboard.  Notice that this means that a    *
  954.  *           ^C (interrupt) will no long terminate Crafty, because xboard uses *
  955.  *           this to implement the "move now" facility.  This should also      *
  956.  *           work with winboard and allow pondering, since there is now a      *
  957.  *           special windows version of CheckInput() that knows how to check   *
  958.  *           Win95 or WinNT pipes when talking with winboard.                  *
  959.  *                                                                             *
  960.  *    9.18   Xboard compatibility update.  "force" (gnu) mode was broken, so   *
  961.  *           that reading in a PGN file (via xboard) would break.  Now, Crafty *
  962.  *           can track the game perfectly as xboard reads the moves in.  King  *
  963.  *           safety modified to discourage g3/g6 type moves without the bishop *
  964.  *           to defend the weak squares.  Significant other changes to the     *
  965.  *           Evaluate() procedure and its derivatives.  Very nasty trans/ref   *
  966.  *           bug fixed.  Been there since transposition tables added.  When    *
  967.  *           storing a mate score, it has to be adjusted since it's backed up  *
  968.  *           as "mate in n plies from root" but when storing, it must be saved *
  969.  *           as "mate in n plies from current position".  Trivial, really, but *
  970.  *           I overlooked one important fact:  mate scores can also be upper   *
  971.  *           or lower search bounds, and I was correcting them in the same way *
  972.  *           which is an error.  The effect was that Crafty would often find a *
  973.  *           mate in 2, fail high on a move that should not fail high, and end *
  974.  *           up making a move that would mate in 3.  In particularly bad cases *
  975.  *           this would make the search oscillate back and forth and draw a    *
  976.  *           won position.  The fix was to only adjust the score if it's a     *
  977.  *           score, not if it's a bound.  The "age" field of the trans/ref     *
  978.  *           table was expanded to 3 bits.  Iterate now increments a counter   *
  979.  *           modulo 8, and this counter is stored in the 3 ID bits of the      *
  980.  *           trans/ref table.  If they are == the transposition_id counter,    *
  981.  *           we know that this is a position stored during the current search. *
  982.  *           If not, it's an "old" position.  This avoids the necessity of     *
  983.  *           stepping through each entry in the trans/ref table (at the begin- *
  984.  *           ning of a search) to set the age bit.  Much faster in blitz games *
  985.  *           as stepping through the trans/ref table, entry by entry, would    *
  986.  *           blow out cache.  This idea was borrowed from Cray Blitz, which    *
  987.  *           used this same technique for many years.                          *
  988.  *                                                                             *
  989.  *    9.19   New evaluation code for passed pawns.  Crafty now gives a large   *
  990.  *           bonus for two or more connected passed pawns, once they reach the *
  991.  *           sixth rank, when the opponent has less than a queen remaining.    *
  992.  *           this will probably be tuned as experience produces the special    *
  993.  *           cases that "break" it.  Such things as the king too far away or   *
  994.  *           the amount of enemy material left might be used to further im-    *
  995.  *           prove the evaluation.                                             *
  996.  *                                                                             *
  997.  *    9.20   Bug in SetBoard() fixed.  Validity checks for castling status and *
  998.  *           en passant status was broken for castle status.  It was checking  *
  999.  *           the wrong rook to match castling status, and would therefore not  *
  1000.  *           accept some valid positions, including #8 in Win At Chess suite.  *
  1001.  *           Minor repetition bug fixed, where Crafty would recognize that a   *
  1002.  *           three-fold repetition had occurred, but would not claim it when   *
  1003.  *           playing on a chess server.  Crafty now does not immediately re-   *
  1004.  *           search the first move when it fails low.  Rather, it behaves like *
  1005.  *           Cray Blitz, and searches all moves.  If all fail low, Crafty will *
  1006.  *           then relax (lower) alpha and search the complete list again.      *
  1007.  *           This is a simple gamble that there is another move that will      *
  1008.  *           "save the day" so that we avoid the overhead of finding out just  *
  1009.  *           how bad the first move is, only to have more overhead when a good *
  1010.  *           move fails high.  Minor repetition bug fixed.  When running test  *
  1011.  *           suites of problems, SetBoard() neglected to put the starting      *
  1012.  *           position in the repetition list, which would occasionally waste   *
  1013.  *           time.  One notable case was Win At Chess #8, where Crafty would   *
  1014.  *           find Nf7+ Kg8 Nh6+ Kh8 (repeating the original position) followed *
  1015.  *           by Rf7 (the correct move, but 4 tempi behind.)  Display() bug     *
  1016.  *           fixed.  Crafty now displays the current board position, rather    *
  1017.  *           than the position that has been modified by a search in progress. *
  1018.  *           Castling evaluation modified including a bug in the black side    *
  1019.  *           that would tend to make Crafty not castle queen-side as black if  *
  1020.  *           the king-side was shredded.  Minor bug in Book(). If the book was *
  1021.  *           turned off (which is done automatically when using the test com-  *
  1022.  *           mand since several of the Win At Chess positions are from games   *
  1023.  *           in Crafty's large opening book) Book() would still try to read    *
  1024.  *           the file and then use the data from the uninitialized buffer.     *
  1025.  *           This would, on occasion, cause Crafty to crash in the middle of   *
  1026.  *           a test suite run.                                                 *
  1027.  *                                                                             *
  1028.  *    9.21   Castling evaluation has been significantly modified to handle the *
  1029.  *           following three cases better:                                     *
  1030.  *           (a) One side can castle at the root of the tree, but can not      *
  1031.  *           castle at a tip position.  If the move that gave up the right to  *
  1032.  *           castle was *not* a castle move, penalize the score.               *
  1033.  *           (b) One side can castle short or long at the root, but has al-    *
  1034.  *           ready castled by the time the search reaches a tip position.      *
  1035.  *           Here the goal is to make sure the player castled to the "better"  *
  1036.  *           side by comparing king safety where the king really is, to king   *
  1037.  *           safety had the king castled to the other side.  If the latter is  *
  1038.  *           "safer" then penalize the current position by the "difference"    *
  1039.  *           in king safety to encourage that side to delay castling.  This is *
  1040.  *           a problem when Crafty can castle kingside *now*, but the kingside *
  1041.  *           has been disrupted somehow.  If the search is not deep enough to  *
  1042.  *           see clearing out the queenside and castling long, then it will    *
  1043.  *           often castle short rather than not castle at all.  This fix will  *
  1044.  *           make it delay, develop the queenside, and castle to a safer king  *
  1045.  *           shelter, unless tactics force it to castle short.                 *
  1046.  *           (c) One side can castle short or long at the root, but can only   *
  1047.  *           castle one way at a tip position, because a rook has been moved.  *
  1048.  *           If the remaining castle option is worse than castling to the side *
  1049.  *           where the rook was moved, then we penalize the rook move to keep  *
  1050.  *           castling to that side open as an option.                          *
  1051.  *                                                                             *
  1052.  *    9.22   More castling evaluation changes, to tune how/when Crafty chooses *
  1053.  *           to castle.  Bugs in Option() where certain commands could be ex-  *
  1054.  *           ecuted while a search was in progress.  If these commands did     *
  1055.  *           anything to the board position, It would break Crafty badly.      *
  1056.  *           All that was needed was to check for an active search before some *
  1057.  *           commands were attempted, and if a search was in progress, return  *
  1058.  *           to abort the search then re-try the command.  When playing games  *
  1059.  *           with computers (primarily a chess-server consideration) Crafty is *
  1060.  *           now defaulting to "book random 0" to use a short search to help   *
  1061.  *           avoid some ugly book lines on occasion.  In this version, *all*   *
  1062.  *           positional scores were divided by 2 to reduce the liklihood that  *
  1063.  *           Crafty would sacrifice material and make up the loss with some    *
  1064.  *           sort of positional gain that was often only temporary.  Note that *
  1065.  *           king safety scores were not reduced while doing this.  New book   *
  1066.  *           random options:  0=search, 1=most popular move, 2=move that       *
  1067.  *           produces best positional value, 3=choose from most frequently     *
  1068.  *           played moves, 4=emulate GM frequency of move selection, 5=use     *
  1069.  *           sqrt() on frequencies to give more randomness, 6=random.  For     *
  1070.  *           now, computers get book_random=1, while GM's now get 4 (same as   *
  1071.  *           before), everyone else gets 5.  Until now, there has been no      *
  1072.  *           penalty for doubled/tripled pawns.  It now exists.  Also, if the  *
  1073.  *           king stands on E1/E8, then the king-side king safety term is used *
  1074.  *           to discourage disrupting the king-side pawns before castling.     *
  1075.  *           Crafty now has a start-up initialization file (as most Unix       *
  1076.  *           programs do).  This file is named ".craftyrc" if the macro UNIX   *
  1077.  *           is defined, otherwise a "dossy" filename "crafty.rc" is used.     *
  1078.  *           Crafty opens this file and executes every command in it as though *
  1079.  *           they were typed by the operator.  The last command *must* be      *
  1080.  *           "exit" to revert input back to STDIN.                             *
  1081.  *                                                                             *
  1082.  *    9.23   More evaluation tuning, including the complete removal of the     *
  1083.  *           mobility term for rooks/queens.  Since rooks already have lots    *
  1084.  *           of scoring terms like open files, connected, etc, mobility is     *
  1085.  *           redundant at times and often misleading.  The queen's mobility    *
  1086.  *           is so variable it is nearly like introducing a few random points  *
  1087.  *           at various places in the search.  Minor Xboard compatibility bug  *
  1088.  *           fixed where you could not load a game file, then have Crafty play *
  1089.  *           by clicking the "machine white" or "machine black" options.       *
  1090.  *                                                                             *
  1091.  *    9.24   Minor bug in Quiesce() repaired.  When several mate-in-1 moves    *
  1092.  *           were available at the root, Crafty always took the last one,      *
  1093.  *           which was often an under-promotion to a rook rather than to a     *
  1094.  *           queen.  It looked silly and has been fixed so that it will play   *
  1095.  *           the first mate-in-1, not the last.  RootMoveList() went to great  *
  1096.  *           pains to make sure that promotion to queen occurs before rook.    *
  1097.  *           Bug in EvaluateOutsidePassedPawns() would fail to recognize that  *
  1098.  *           one side had an outside passer, unless both sides had at least    *
  1099.  *           one passer, which failed on most cases seen in real games.        *
  1100.  *           Minor "tweak" to move ordering.  GenerateMoves() now uses the     *
  1101.  *           LSB() function to enumerate white moves, while still using MSB()  *
  1102.  *           for black moves.  This has the effect of moving pieces toward     *
  1103.  *           your opponent before moving them away.  A severe oversight        *
  1104.  *           regarding the use of "!" (as in wtm=!wtm) was found and corrected *
  1105.  *           to speed things up some.  !wtm was replaced by wtm^1 (actually,   *
  1106.  *           a macro Flip(wtm) is used to make it more readable) which         *
  1107.  *           resulted in significant speedup on the sparc, but a more modest   *
  1108.  *           improvement on the pentium.                                       *
  1109.  *                                                                             *
  1110.  *    9.25   Minor bug in Book() fixed where it was possible for Crafty to     *
  1111.  *           play a book move that was hardly ever played.  Minor change to    *
  1112.  *           time utilization to use a little more time "up front".  Tuned     *
  1113.  *           piece/square tables to improve development some.  Saw Crafty lose *
  1114.  *           an occasional game because (for example) the bishop at c1 or c8   *
  1115.  *           had not moved, but the king had already castled, which turned the *
  1116.  *           EvaluateDevelopment() module "off".  first[ply] removed, since it *
  1117.  *           was redundant with last[ply-1].  The original intent was to save  *
  1118.  *           a subscript math operation, but the compilers are quite good with *
  1119.  *           the "strength-reduction" optimization, making referencing a value *
  1120.  *           by first[ply] or last[ply-1] exactly the same number of cycles.   *
  1121.  *           Passed pawn scores increased.  The reduction done to reduce all   *
  1122.  *           scores seemed to make Crafty less attentive to passed pawns and   *
  1123.  *           the threats they incur.  Minor bug in Book() fixed, the variable  *
  1124.  *           min_percent_played was inoperative due to incorrect test on the   *
  1125.  *           book_status[n] value.  Pawn rams now scored a little differently, *
  1126.  *           so that pawn rams on Crafty's side of the board are much worse    *
  1127.  *           than rams elsewhere.  This avoids positional binds where, for ex- *
  1128.  *           ample Crafty would like black with pawns at e6 d5 c6, white with  *
  1129.  *           pawns at e5 and c5.  Black has a protected passed pawn at d5 for  *
  1130.  *           sure, but the cramp makes it easy for white to attack black, and  *
  1131.  *           makes it difficult for black to defend because the black pawns    *
  1132.  *           block the position badly.  King safety tweaked up about 30%, due  *
  1133.  *           to using nearly symmetrical scoring, the values had gotten too    *
  1134.  *           small and were not overriding minor positional things.            *
  1135.  *                                                                             *
  1136.  *    9.26   Minor bug fixes in time allocation.  This mainly affects Crafty   *
  1137.  *           as it plays on a chess server.  The problem is, simply, that the  *
  1138.  *           current internal timing resolution is 1/10 of a second, kept in   *
  1139.  *           an integer variable.  .5 seconds is stored as 5, for example.     *
  1140.  *           This became a problem when the target time for a search dropped   *
  1141.  *           below .3 seconds, because the "easy move" code would terminate    *
  1142.  *           the search after 1/3 of the target time elapsed if there were no  *
  1143.  *           fail lows or PV changes.  Unfortunately, 2 divided by 3 (.2 secs  *
  1144.  *           /3) is "zero" which would let the search quickly exit, possibly   *
  1145.  *           without producing a PV with a move for Crafty to play.  Crafty    *
  1146.  *           would play the first PV move anyway, which was likely the PV move *
  1147.  *           from the last search.  This would corrupt the board information,  *
  1148.  *           often produce the error "illegal move" when the opponent tried to *
  1149.  *           move, or, on occasion, blow Crafty up.  On a chess server, Crafty *
  1150.  *           would simply flag and lose.  After this fix, I played several     *
  1151.  *           hundred games with a time control of 100 moves in 1 second and    *
  1152.  *           there were no failures.  Before the fix, this time control could  *
  1153.  *           not result in a single completed game.  If you don't run Crafty   *
  1154.  *           on a chess server, this version is not important, probably. a     *
  1155.  *           minor fix for move input, so that moves like e2e4 will always be  *
  1156.  *           accepted, where before they would sometimes be flagged as errors. *
  1157.  *                                                                             *
  1158.  *    9.27   This version has an interesting modification to NextCapture().    *
  1159.  *           Quiesce() now passes alpha to NextCapture() and if a capture      *
  1160.  *           appears to win material, but doesn't bring the score up to the    *
  1161.  *           value of alpha, the capture is ignored.  In effect, if we are so  *
  1162.  *           far behind that a capture still leaves us below alpha, then there *
  1163.  *           is nothing to gain by searching the capture because our opponent  *
  1164.  *           can simply stand pat at the next ply leaving the score very bad.  *
  1165.  *           One exception is if the previous ply was in check, we simply look *
  1166.  *           for any safe-looking capture just in case it leads to mate.  Bad  *
  1167.  *           book bug with book random=1 or 2 fixed (this is set when playing  *
  1168.  *           a computer).  This bug would cause Crafty to play an illegal move *
  1169.  *           and bust wide open with illegal move errors, bad move hashed, and *
  1170.  *           other things.  Book randomness also quite a bit better now.       *
  1171.  *                                                                             *
  1172.  *    9.28   Piece/square table added for rooks.  Primary purpose is to dis-   *
  1173.  *           courage rooks moving to the edge of the board but in front of     *
  1174.  *           pawns, where it is easy to trap it.  Crafty now understands the   *
  1175.  *           concept of blockading a passed pawn to prevent it from advancing. *
  1176.  *           it always understood that advancing one was good, which would     *
  1177.  *           tend to encourage blockading, but it would also often ignore the  *
  1178.  *           pawn and let it advance a little here, a little there, until it   *
  1179.  *           suddenly realized that it was a real problem.  The command to set *
  1180.  *           the size of the hash table has been modified.  This command is    *
  1181.  *           now "hash n", "hash nK" or "hash nM" to set the hash table to one *
  1182.  *           of bytes, Kbytes, or Mbytes.  Note that if the size is not an     *
  1183.  *           exact multiple of what Crafty needs, it silently reduces the size *
  1184.  *           to an optimum value as close to the suggested size as possible.   *
  1185.  *           Trade bonus/penalty is now back in, after having been removed     *
  1186.  *           when the new UnmakeMove() code was added.  Crafty tries to trade  *
  1187.  *           pawns but not pieces when behind, and tries to trade pieces but   *
  1188.  *           not pawns when ahead.  EvaluateDraws() now understands that rook  *
  1189.  *           pawns + the wrong bishop is a draw.  Minor adjustment to the      *
  1190.  *           quiescence-search pruning introduced in 9.27, to avoid excluding  *
  1191.  *           captures that didn't lose material, but looked bad because the    *
  1192.  *           positional score was low.  Slightly increased the values of the   *
  1193.  *           pieces relative to that of a pawn to discourage the tendency to   *
  1194.  *           trade a piece for two or three pawns plus some positional plusses *
  1195.  *           that often would slowly vanish.  Null-move search modified to try *
  1196.  *           null-moves, even after captures.  This seems to hurt some prob-   *
  1197.  *           lem positions, but speeds up others significantly.  Seems better  *
  1198.  *           but needs close watching.  EvaluateDraws() call moved to the top  *
  1199.  *           of Evaluate() to check for absolute draws first.  Quiesce() now   *
  1200.  *           always calls Evaluate() which checks for draws before trying the  *
  1201.  *           early exit tests to make sure that draws are picked up first.     *
  1202.  *           EvaluateDraws() substantially re-written to get rid of lots of    *
  1203.  *           unnecessary instructions, and to also detect RP+B of wrong color  *
  1204.  *           even if the losing side has a pawn of its own.  Crafty would      *
  1205.  *           often refuse to capture that last pawn to avoid reaching an end-  *
  1206.  *           game it knew was drawn.                                           *
  1207.  *                                                                             *
  1208.  *    9.29   New time.c as contributed by Mike Byrne.  Basically makes Crafty  *
  1209.  *           use more time up front, which is a method of anticipating that    *
  1210.  *           Crafty will predict/ponder pretty well and save time later on     *
  1211.  *           anyway.  InCheck() is never called in Quiesce() now.  As a        *
  1212.  *           result, Crafty won't recognize mates in the q-search.  This has   *
  1213.  *           speeded the code up with no visible penalty, other than it will   *
  1214.  *           occasionally find a win of material rather than a mate score, but *
  1215.  *           this has not affected the problem suite results in a measurable   *
  1216.  *           way, other than Crafty is now about 10% faster in average type    *
  1217.  *           position, and much faster in others.  The latest epd code from    *
  1218.  *           Steven Edwards is a part of this version, which includes updated  *
  1219.  *           tablebase access code.                                            *
  1220.  *                                                                             *
  1221.  *   10.0    New time.c with a "monitoring feature" that has two distinct      *
  1222.  *           functions:  (1) monitor Crafty's time remaining and if it is too  *
  1223.  *           far behind the opponent, force it to speed up, or if it is well   *
  1224.  *           ahead on time, slow down some;  (2) if opponent starts moving     *
  1225.  *           quickly, Crafty will speed up as well to avoid getting too far    *
  1226.  *           behind.  EvaluateDraws() modified to detect that if one side has  *
  1227.  *           insufficient material to win, the score can never favor that side *
  1228.  *           which will make Crafty avoid trading into an ending where it has  *
  1229.  *           KNN vs KB for example, where KNN seems to be ahead.               *
  1230.  *                                                                             *
  1231.  *   10.1    New book.c.  Crafty now counts wins, losses and draws for each    *
  1232.  *           possible book move and can use these to play a move that had a    *
  1233.  *           high percentage of wins, vs the old approach of playing a move    *
  1234.  *           just because it was played a lot in the past.                     *
  1235.  *                                                                             *
  1236.  *   10.2    Evaluation tuning.  Rook on 7th, connected rooks on 7th, etc.,    *
  1237.  *           are now more valuable.  Crafty was mistakenly evaluating this     *
  1238.  *           too weakly.  Book() changed so that the list of moves is first    *
  1239.  *           sorted based on winning percentages, but then, after selecting    *
  1240.  *           the sub-set of this group, the list is re-sorted based on the     *
  1241.  *           raw total games won so that the most popular opening is still the *
  1242.  *           most likely to be played.                                         *
  1243.  *                                                                             *
  1244.  *   10.3    Timer resolution changed to 1/100th of a second units, with all   *
  1245.  *           timing variables conforming to this, so that it is unnecessary    *
  1246.  *           to multiply by some constant to convert one type of timing info   *
  1247.  *           to the standard resolution.  Bug in evaluate.c fixed.  Trapped    *
  1248.  *           rook (rook at h1, king at g1 for example) code had a bad sub-     *
  1249.  *           script that caused erroneous detection of a trapped rook when     *
  1250.  *           there was none.                                                   *
  1251.  *                                                                             *
  1252.  *   10.4    Quiesce() no longer checks for time exceeded, nor does it do any  *
  1253.  *           hashing whatsoever, which makes it significantly faster, while    *
  1254.  *           making the trees only marginally bigger.                          *
  1255.  *                                                                             *
  1256.  *   10.5    Quiesce() now calls GenerateCaptures() to generate capture moves. *
  1257.  *           This new move generator module is significantly faster, which     *
  1258.  *           speeds the quiescence search up somewhat.                         *
  1259.  *                                                                             *
  1260.  *   10.6    CastleStatus is now handled slightly differently.  The right two  *
  1261.  *           bits still indicate whether or not that side can castle to either *
  1262.  *           side, and 0 -> no castling at all, but now, <0 means that no      *
  1263.  *           castling can be done, and that castling rights were lost by       *
  1264.  *           making a move that was not castling.  This helps in Evaluate()    *
  1265.  *           by eliminating a loop to see if one side castled normally or had  *
  1266.  *           to give up the right to castle for another (bad) reason.  This is *
  1267.  *           simply an efficiency issue, and doesn't affect play or anything   *
  1268.  *           at all other than to make the search faster.                      *
  1269.  *                                                                             *
  1270.  *   10.7    NextMove() now doesn't try history moves forever, rather it will  *
  1271.  *           try the five most popular history moves and if it hasn't gotten a *
  1272.  *           cutoff by then, simply tries the rest of the moves without the    *
  1273.  *           history testing, which is much faster.                            *
  1274.  *                                                                             *
  1275.  *   10.8    Book() now "puzzles" differently.  In puzzling, it is trying to   *
  1276.  *           find a move for the opponent.  Since a book move by the opponent  *
  1277.  *           will produce an instant move, puzzle now enumerates the set of    *
  1278.  *           legal opponent moves, and from this set, removes the set of known *
  1279.  *           book moves and then does a quick search to choose the best.  We   *
  1280.  *           then ponder this move just in case the opponent drops out of book *
  1281.  *           and uses a normal search to find a move.  Crafty now penalizes    *
  1282.  *           a pawn that advances, leaving its neighbors behind where both     *
  1283.  *           the advancing pawn, and the ones being left behind become weaker. *
  1284.  *           the opening phase of the game has been modified to "stay active"  *
  1285.  *           until all minor pieces are developed and Crafty has castled, to   *
  1286.  *           keep EvaluateDevelopment() active monitoring development.  Minor  *
  1287.  *           change to DrawScore() so that when playing a computer, it will    *
  1288.  *           return "default_draw_score" under all circumstances rather than   *
  1289.  *           adjusting this downward, which makes Crafty accept positional     *
  1290.  *           weaknesses rather than repeat a position.                         *
  1291.  *                                                                             *
  1292.  *   10.9    Evaluate() now handles king safety slightly differently, and      *
  1293.  *           increases the penalty for an exposed king quite a bit when there  *
  1294.  *           is lots of material present, but scales this increase down as the *
  1295.  *           material comes off.  This seems to help when attacking or getting *
  1296.  *           attacked.  Since Quiesce() no longer probes the hash table, the   *
  1297.  *           idea of storing static evaluations there became worthless and was *
  1298.  *           burning cycles that were wasted.  This has been removed. Check    *
  1299.  *           extensions relaxed slightly so that if ply is < iteration+10 it   *
  1300.  *           will allow the extension.  Old limit was 2*iteration.  Connected  *
  1301.  *           passed pawns on 6th now evaluated differently.  They get a 1 pawn *
  1302.  *           bonus, then if material is less than a queen, another 1 pawn      *
  1303.  *           bonus, and if not greater than a rook is left, and the king can't *
  1304.  *           reach the queening square of either of the two pawns, 3 more      *
  1305.  *           more pawns are added in for the equivalent of + a rook.           *
  1306.  *                                                                             *
  1307.  *   10.10   Evaluate() modified.  King safety was slightly broken, in that    *
  1308.  *           an uncastled king did not get a penalty for open center files.    *
  1309.  *           new evaluation term for controlling the "absolute 7th rank", a    *
  1310.  *           concept from "My System".                                         *
  1311.  *                                                                             *
  1312.  *   10.11   Lazy evaluation implemented.  Now as the Evaluate() code is ex-   *
  1313.  *           ecuted, Crafty will "bail out" when it becomes obvious that the   *
  1314.  *           remainder of the evaluation can't bring the score back inside the *
  1315.  *           alpha/beta window, saving time.                                   *
  1316.  *                                                                             *
  1317.  *   10.12   More Jakarta time control commands added so operator can set the  *
  1318.  *           time accurately if something crashes, and so the operator can set *
  1319.  *           a "cushion" to compensate for operator inattention.  "Easy" is    *
  1320.  *           more carefully qualified to be a recapture, or else a move that   *
  1321.  *           preserves the score, rather than one that appears to win material *
  1322.  *           as was done in the past.  King safety tweaked a little so that if *
  1323.  *           one side gives up the right to castle, and could castle to a safe *
  1324.  *           position, the penalty for giving up the right is substantially    *
  1325.  *           larger than before.  A minor bug also made it more likely for     *
  1326.  *           black to give up the right to castle than for white.              *
  1327.  *                                                                             *
  1328.  *   10.13   Modifications to Book() so that when using "book random 0" mode   *
  1329.  *           (planned for Jakarta) and the search value indicates that we are  *
  1330.  *           losing a pawn, we return "out of book" to search *all* the moves, *
  1331.  *           Not just the moves that are "in book."  This hopefully avoids     *
  1332.  *           some book lines that lose (gambit) material unsoundly.            *
  1333.  *                                                                             *
  1334.  *   10.14   Final timing modifications.  Puzzling/booking searches now take   *
  1335.  *           1/30th of the normal time, rather than 1/10th.  New command       *
  1336.  *           "mode=tournament" makes Crafty assess DRAW as "0" and also makes  *
  1337.  *           it prompt the operator for time corrections as required by WMCCC  *
  1338.  *           rules.                                                            *
  1339.  *                                                                             *
  1340.  *   10.15   Evaluate() tuning to reduce development bonuses, which were able  *
  1341.  *           to overwhelm other scores and lead to poor positions.             *
  1342.  *                                                                             *
  1343.  *   10.16   "Lazy" (early exit) caused some problems in Evaluate() since so   *
  1344.  *           many scores are very large.  Scaled this back significantly and   *
  1345.  *           also EvaluateOutsidePassedPawns() could double the score if one   *
  1346.  *           side had passers on both sides.  This was fixed.                  *
  1347.  *                                                                             *
  1348.  *   10.17   Crafty's Book() facility has been significantly modified to be    *
  1349.  *           more understandable.  book random <n> has the following options:  *
  1350.  *           (0) do a search on set of book moves; (1) choose from moves that  *
  1351.  *           are played most frequently; (2) choose from moves with best win   *
  1352.  *           ratio; (3) choose from moves with best static evaluation; and     *
  1353.  *           (4) choose completely randomly.  book width <n> can be used to    *
  1354.  *           control how large the "set" of moves will be, with the moves in   *
  1355.  *           the "set" being the best (according to the criteria chosen) from  *
  1356.  *           the known book moves.  Minor tweak to Search() so that it extends *
  1357.  *           passed pawn pushes to the 6th or 7th rank if the move is safe,    *
  1358.  *           and this is an endgame.                                           *
  1359.  *                                                                             *
  1360.  *   10.18   New annotate command produces a much nicer analysis file and also *
  1361.  *           lets you exert control over what has to happen to trigger a com-  *
  1362.  *           ment among other things.  AKA Crafty/Jakarta version.             *
  1363.  *                                                                             *
  1364.  *   11.1    Fractional depth allows fractional ply increments.  The reso-     *
  1365.  *           lution is 1/4 of a ply, so all of the older "depth++" lines now   *
  1366.  *           read depth+=PLY, where #define PLY 4 is used everywhere.  This    *
  1367.  *           gives added flexibility in that some things can increment the     *
  1368.  *           depth by < 1 ply, so that it takes two such things before the     *
  1369.  *           search actually extends one ply deeper.  Crafty now has full PGN  *
  1370.  *           support.  A series of pgn commands (pgn Event 14th WMCCC) allow   *
  1371.  *           the PGN tags to be defined, when Crafty reads or annotates a PGN  *
  1372.  *           file it reads and parses the headers and will display the info    *
  1373.  *           in the annotation (.can) file or in the file you specify when you *
  1374.  *           execute a "savegame <filename>" command.                          *
  1375.  *                                                                             *
  1376.  *   11.2    Fractional ply increments now implemented.  11.1 added the basic  *
  1377.  *           fractional ply extension capabilities, but this version now uses  *
  1378.  *           them in Search().  There are several fractional ply extensions    *
  1379.  *           being used, all are #defined in types.h to make playing with them *
  1380.  *           somewhat easier.  One advantage is that now all extensions are    *
  1381.  *           3/4 of a ply, which means the first time any extension is hit, it *
  1382.  *           has no effect, but the next three extensions will result in an    *
  1383.  *           additional ply, followed by another ply where the extension does  *
  1384.  *           nothing, followed by ...  This allowed me to remove the limit on  *
  1385.  *           how deep in the tree the extensions were allowed, and also seems  *
  1386.  *           to not extend as much unless there's "something" going on.  When  *
  1387.  *           the position gets interesting, these kick in.  Asymmetric king    *
  1388.  *           safety is back in.  Crafty's king safety is a little more im-     *
  1389.  *           portant than the opponent's now to help avoid getting its king-   *
  1390.  *           side shredded to win a pawn.  A new term, ROOK_ON_7TH_WITH_PAWN   *
  1391.  *           to help Crafty understand how dangerous a rook on the 7th is if   *
  1392.  *           it is supported by a pawn.  It is difficult to drive off and the  *
  1393.  *           pawn provides additional threats as well.                         *
  1394.  *                                                                             *
  1395.  *   11.3    King safety modifications.  One fairly serious bug is that Crafty *
  1396.  *           considered that king safety became unimportant when the total     *
  1397.  *           pieces dropped below 16 material points.  Note that this was      *
  1398.  *           pieces only, not pieces and pawns, which left plenty of material  *
  1399.  *           on the board to attack with.  As a result, Crafty would often     *
  1400.  *           allow its king-side to be weakened because it was either in an    *
  1401.  *           endgame, or close to an endgame.  *Incorrectly*, it turns out. :) *
  1402.  *           Going back to a very old Crafty idea, king tropism is now tied to *
  1403.  *           how exposed each king is, with pieces being attracted to the most *
  1404.  *           exposed king for attack/defense.                                  *
  1405.  *                                                                             *
  1406.  *   11.4    Tuning on outside passed pawn code.  Values were not large enough *
  1407.  *           and didn't emphasize how strong such a pawn is.  General passed   *
  1408.  *           pawn value increased as well.  Minor bug in edit that would let   *
  1409.  *           Crafty flag in some wild games was fixed.  Basically, edit has no *
  1410.  *           way to know if castling is legal, and has to assume if a rook and *
  1411.  *           king are on the original squares, castling is o.k.  For wild2     *
  1412.  *           games in particular, this can fail because castling is illegal    *
  1413.  *           (by the rules for wild 2) while it might be that rooks and king   *
  1414.  *           are randomly configured to make it look possible.  Crafty would   *
  1415.  *           then try o-o or o-o-o and flag when the move was rejected as      *
  1416.  *           illegal.  richard Lloyd suggested a speed-up for the annotate     *
  1417.  *           command which I'm using temporarily.  Crafty now searches all     *
  1418.  *           legal moves in a position, and if the best move matches the game  *
  1419.  *           move, the second search of just the move played is not needed.  I *
  1420.  *           was searching just the game move first, which was a waste of time *
  1421.  *           in many positions.  I'll resume this later, because I want to see *
  1422.  *           these values:  (1) score for move actually played; (2) score for  *
  1423.  *           the rest of the moves only, not including the move actually       *
  1424.  *           played, to see how often a player finds a move that is the *only* *
  1425.  *           good move in a position.                                          *
  1426.  *                                                                             *
  1427.  *   11.5    More fractional ply extension tuning.  A few positions could blow *
  1428.  *           up the search and go well beyond 63 plies, the max that Crafty    *
  1429.  *           can handle.  Now, extensions are limited to no more than one ply  *
  1430.  *           of extensions for every ply of search.  Note that "in check" is   *
  1431.  *           extended on the checking move ply, not on the out of check ply,   *
  1432.  *           so that one-reply-to-check still extends further.  Minor changes  *
  1433.  *           to time.c to further help on long fast games.  Another important  *
  1434.  *           timing bug repaired.  If Crafty started an iteration, and failed  *
  1435.  *           high on the first move, it would not terminate the search until   *
  1436.  *           this move was resolved and a score returned.  This could waste a  *
  1437.  *           lot of time in already won positions.  Interesting bug in the     *
  1438.  *           capture search pruning fixed.  At times, a piece would be hung,   *
  1439.  *           but the qsearch would refuse to try the capture because it would  *
  1440.  *           not bring the score back to above alpha.  Unfortunately, taking   *
  1441.  *           the piece could let passed pawns race in undisturbed which would  *
  1442.  *           affect the score.  This pruning is turned off when there are not  *
  1443.  *           at least two pieces left on the board.  Another bug in the move   *
  1444.  *           generator produced pawn promotions twice, once when captures were *
  1445.  *           generated, then again when the rest of the moves are produced.    *
  1446.  *           this was also repaired.  Small book now will work.  The Bookup()  *
  1447.  *           code now assumes white *and* black won in the absence of a valid  *
  1448.  *           PGN Result tag, so that the small book will work correctly.       *
  1449.  *                                                                             *
  1450.  *   11.6    Modifications to time allocation in a further attempt to make     *
  1451.  *           Crafty speed up if time gets short, to avoid flagging.  It is now *
  1452.  *           *very* difficult to flag this thing.  :)  Minor evaluation tweaks *
  1453.  *           and a fix to Quiesce() to speed it up again after a couple of bad *
  1454.  *           fixes slowed things down.                                         *
  1455.  *                                                                             *
  1456.  *   11.7    Minor modification to Evaluate().  Rooks behind a passed pawn are *
  1457.  *           good, but two rooks behind the pawn don't help if the pawn is     *
  1458.  *           blockaded and can't move, unless the two rooks are not the same   *
  1459.  *           color as the pawn.                                                *
  1460.  *                                                                             *
  1461.  *   11.8    First stage of "book learning" implemented.  Crafty monitors the  *
  1462.  *           search evaluation for the first 10 moves out of book.  It then    *
  1463.  *           computes a "learn value" if it thinks this set of values shows    *
  1464.  *           that the book line played was very good or very bad.  This value  *
  1465.  *           is added to a "learn count" for each move in the set of book      *
  1466.  *           moves it played, with the last move getting the full learn value, *
  1467.  *           and moves closer to the start of the game getting a smaller       *
  1468.  *           percentage.  (See learn.c for more details).  These values are    *
  1469.  *           used by Book() to help in selecting/avoiding book lines.  Crafty  *
  1470.  *           produces a "book.lrn" file that synthesizes this information into *
  1471.  *           a portable format that will be used by other Crafty programs,     *
  1472.  *           once the necessary code is added later on.                        *
  1473.  *                                                                             *
  1474.  *   11.9    An age-old problem caused by null-move searching was eliminated   *
  1475.  *           in this version.  Often the null-move can cause a move to fail    *
  1476.  *           high when it should not, but then the move will fail low on the   *
  1477.  *           re-search when beta is relaxed.  This would, on occasion, result  *
  1478.  *           in Crafty playing a bad move for no reason.  Now, if a fail high  *
  1479.  *           is followed by a fail-low, the fail high condition is ignored.    *
  1480.  *           This can be wrong, but with null-move pruning, it can also be     *
  1481.  *           even "more wrong" to accept a fail high move after it fails low   *
  1482.  *           due to a null-move failure, than it would be right to accept the  *
  1483.  *           fail high/fail low that is caused by trans/ref table anomalies.   *
  1484.  *                                                                             *
  1485.  *   11.10   Crafty is now using the Kent, et. al, "razoring" algorithm, which *
  1486.  *           simply eliminates the last ply of full-width searching and goes   *
  1487.  *           directly to the capture search if the move before the last full-  *
  1488.  *           width ply is uninteresting, and the Material eval is 1.5 pawns    *
  1489.  *           below alpha.  It's a "modest futility" idea that doesn't give up  *
  1490.  *           on the uninteresting move, but only tries captures after the move *
  1491.  *           is played in the tree.  Net result is 20-30% average faster times *
  1492.  *           to reach the same depth.  Minor mod to book.lrn to include Black, *
  1493.  *           White and Date PGN tags just for reference.  Next learning mod is *
  1494.  *           another "book random n" option, n=3.  This will use the "learned" *
  1495.  *           score to order book moves, *if* any of them are > 0.  What this   *
  1496.  *           does is to encourage Crafty to follow opening lines that have     *
  1497.  *           been good, even if the learn count hasn't reached the current     *
  1498.  *           threshold of 1,000.  This makes learning "activate" faster.  This *
  1499.  *           has one hole in it, in that once Crafty learns that one move has  *
  1500.  *           produced a positive learn value, it will keep playing that move   *
  1501.  *           (since no others will yet have a positive value) until it finally *
  1502.  *           loses enough to take the learn value below zero.  This will be    *
  1503.  *           taken care of in the next version, hopefully.                     *
  1504.  *                                                                             *
  1505.  *   11.11   New "book random 4" mode that simply takes *all* learning scores  *
  1506.  *           for the set of legal book moves, translates them so that the      *
  1507.  *           worst value is +1 (by adding -Min(all_scores)+1 to every learn    *
  1508.  *           value) and then squaring the result.  This encourages Crafty to   *
  1509.  *           follow book lines that it has learned to be good, while still     *
  1510.  *           letting it try openings that it has not yet tried (learn value    *
  1511.  *           =0) and even lets it try (albeit rarely) moves that it has        *
  1512.  *           learned to be bad.  Minor evaluation tweaking for king placement  *
  1513.  *           in endgames to encourage penetration in the center rather than on *
  1514.  *           a wing where the king might get too far from the "action."        *
  1515.  *                                                                             *
  1516.  *   11.12   LearnFunction() now keeps positional score, rather than using a   *
  1517.  *           constant value for scores < PAWN_VALUE, to improve learning       *
  1518.  *           accuracy.  Book learn <filename> [clear] command implemented to   *
  1519.  *           import learning files from other Crafty programs.                 *
  1520.  *                                                                             *
  1521.  *   11.13   Endgame threshold lowered to the other side having a queen or     *
  1522.  *           less (9) rather than (13) points.  Queen+bishop can be very       *
  1523.  *           dangerous to the king for example, or two rooks and a bishop.     *
  1524.  *           Learning "curve" modified.  It was accidentally left in a sort    *
  1525.  *           of "geometric" shape, with the last move getting the full learn   *
  1526.  *           value, the next one back getting 1/2, the next 1/3, etc.  Now     *
  1527.  *           it is uniformly distributed from front to back.  If there are 20  *
  1528.  *           moves, the last gets the full value, the next gets 19/20, etc..   *
  1529.  *           Also the "percentage played" was hosed and is fixed.              *
  1530.  *                                                                             *
  1531.  *   11.14   Minor modification to book learn 4 code so that when you start    *
  1532.  *           off with *no* learned data, Book() won't exclude moves from the   *
  1533.  *           possible set of opening moves just because one was not played     *
  1534.  *           very often.  Due to the lack of "ordering" info in this case, it  *
  1535.  *           would often discover the second or third move in the list had not *
  1536.  *           been played very often and cull the rest of the list thinking it  *
  1537.  *           was ordered by the number of times it was played.  This code      *
  1538.  *           contains all of Frank's xboard patches so that analyze mode and   *
  1539.  *           so forth works cleanly.  A new book random option <5> modifies    *
  1540.  *           the probability of playing a move by letting the popularity of a  *
  1541.  *           move affect the learned-value sorting algorithm somewhat. Minor   *
  1542.  *           adjustment in pawn ram asymmetric term to simply count rams and   *
  1543.  *           not be too concerned about which half of the board they are on.   *
  1544.  *           adjustment to weak pawn code.  Also increased bonus for king      *
  1545.  *           tropism to attract pieces toward enemy king to improve attacking. *
  1546.  *           code that detects drawn K+RP+wrong bishop had a bug in that on    *
  1547.  *           occasion, the defending king might not be able to reach the       *
  1548.  *           queening square before the opposing king blocks it out.  This     *
  1549.  *           would let some positions look like draws when they were not. King *
  1550.  *           safety now uses square(7-distance(piece,king)) as one multiplier  *
  1551.  *           to really encourage pieces to get closer to the king.  In cases   *
  1552.  *           whre one king is exposed, all pieces are attracted to that king   *
  1553.  *           to attack or defend.   This is turned off during the opening.     *
  1554.  *           minor 50-move rule draw change to fix a bug, in that the game is  *
  1555.  *           not necessarily a draw after 50 moves by both sides, because one  *
  1556.  *           side might be mated by the 50th move by the other side.  This     *
  1557.  *           occurred in a game Crafty vs Ferret, and now works correctly.     *
  1558.  *                                                                             *
  1559.  *   11.15   Modified LearnBook() so that when Crafty terminates, or resigns,  *
  1560.  *           or sees a mate, it will force LearnBook() to execute the learning *
  1561.  *           analysis even if 10 moves have not been made sine leaving the     *
  1562.  *           book.  Crafty now trusts large positive evals less when learning  *
  1563.  *           about an opening, since such evals are often the result of the    *
  1564.  *           opponent's blunder, rather than a really  good opening line.      *
  1565.  *           second learning stage implemented.  Crafty maintains a permanent  *
  1566.  *           hash file that it uses to store positions where the search value  *
  1567.  *           (at the root of the tree) suddenly drop, and then it "seeds" the  *
  1568.  *           real transposition table with these values at the start of each   *
  1569.  *           of each search so that information is available earlier the next  *
  1570.  *           time this game is played.  Position.bin has the raw binary data   *
  1571.  *           this uses, while position.lrn has the "importable" data.  New     *
  1572.  *           import <filename> [clear] command imports all learning data now,  *
  1573.  *           eliminating the old book learn command.  LearnFunction() modified *
  1574.  *           to handle "trusted" values (negative scores, because we are sure  *
  1575.  *           that Crafty won't make an outright blunder very often) and        *
  1576.  *           "untrusted" values (positive values often caused by the opponent  *
  1577.  *           hanging a piece.  Trusted values are scaled up if the opponent is *
  1578.  *           weaker than Crafty since a weaker opponent forcing a negative     *
  1579.  *           eval means the position must really be bad, and are scaled down   *
  1580.  *           somewhat if the opponent is stronger than Crafty (from the rating *
  1581.  *           information from ICC or the operator using the rating command.)   *
  1582.  *           Untrusted values are scaled down harshly, unless the opponent is  *
  1583.  *           much stronger than Crafty, since it is unlikely such an opponent  *
  1584.  *           would really blunder, while weaker opponents drastically scale    *
  1585.  *           untrusted value (which is positive, remember) down.  minor depth  *
  1586.  *           problem fixed in learning code.  The depth used in LearnFunction  *
  1587.  *           was not the depth for the search that produced the "learn value"  *
  1588.  *           the LearnBook() chooses, it was the depth for the search last     *
  1589.  *           done.  Now, in addition to the 10 last search values, I store the *
  1590.  *           depth for each as well.  When a particular search value is used   *
  1591.  *           to "learn", the corresponding (correct) depth is also now used.   *
  1592.  *           These learn values are now limited to +6000/-6000 because in one  *
  1593.  *           book line, Crafty discovered it was getting mated in 2 moves at   *
  1594.  *           the end of the book line which was 30 moves deep.  If you try to  *
  1595.  *           distribute a "mate score" as the learned value, it will instantly *
  1596.  *           make every move for the last 26 moves look too bad to play.  This *
  1597.  *           is not desirable, rather the last few moves should be unplayable, *
  1598.  *           but other moves further back should be o.k.  Another bug that let *
  1599.  *           Crafty overlook the above mate also fixed.  The search value was  *
  1600.  *           not correct if Crafty got mated, which would avoid learning in    *
  1601.  *           that case.  This has been fixed, although it was obviously a rare *
  1602.  *           problem anyway.  Minor draw bug fixed, where Crafty would offer   *
  1603.  *           a draw when time was way low, caused by the resolution change a   *
  1604.  *           few months back, and also it would offer a draw after the         *
  1605.  *           opponent moved, even if he made a blunder.  It now only offers a  *
  1606.  *           draw after moving to make sure it's reasonable.  Crafty now won't *
  1607.  *           resign if there is a deep mate, such as a mate in 10+, because we *
  1608.  *           want to be sure that the opponent can demonstrate making progress *
  1609.  *           before we toss in the towel.  LearnBook() now learns on all games *
  1610.  *           played.  The old algorithm had a serious problem in that negative *
  1611.  *           scores were trusted fully, positive scores were treated with low  *
  1612.  *           confidence, and scores near zero were ignored totally.  The net   *
  1613.  *           result was that learning values became more and more negative as  *
  1614.  *           games were played.  Now equal positions are also factored in to   *
  1615.  *           the learning equation to help pull some of these negative values  *
  1616.  *           back up.  Book() now excludes moves that have not been played     *
  1617.  *           many times (if there is at least one move that has) for book      *
  1618.  *           random = 2, 3 and 4.  This stops some of the silly moves.         *
  1619.  *           position learning is turned off after 15 moves have passed since  *
  1620.  *           leaving book, to avoid learning things that won't be useful at a  *
  1621.  *           later time.  Hashing changed slightly to include "permanent"      *
  1622.  *           entries so that the learned stuff can be copied into the hash     *
  1623.  *           table with some confidence that it will stay there long enough to *
  1624.  *           be used.                                                          *
  1625.  *                                                                             *
  1626.  *   11.16   King tropism toned down a little to not be quite so intent on     *
  1627.  *           closeness to the kings, so that other positional ideas don't get  *
  1628.  *           "lost" in the eval.  Back to normal piece values (1,3,3,5,9) for  *
  1629.  *           a while.  Optimizations in Quiesce() speeded things up about 2%.  *
  1630.  *           Pawns pushed toward the king are not so valuable any more so that *
  1631.  *           Crafty won't prefer to hold on to them rather than trading to     *
  1632.  *           open a file(s) on the enemy king.  BookLearn() call was moved in  *
  1633.  *           Resign() so that it first learns, then resigns, so that it won't  *
  1634.  *           get zapped by a SIGTERM right in the middle of learning when      *
  1635.  *           xboard realizes the game is over.  Edit/setboard logic modified   *
  1636.  *           so that it is now possible to back up, and move forward in a game *
  1637.  *           that was set up via these commands.                               *
  1638.  *                                                                             *
  1639.  *   11.17   EvaluatePawns() modified to eliminate "loose pawn" penalty which  *
  1640.  *           was not particularly effective and produced pawn scores that were *
  1641.  *           sometimes misleading.  Several optimizations dealing with cache   *
  1642.  *           efficiency, primarily changing int's to signed char's so that     *
  1643.  *           multiple values fit into a cache line together, to eliminate some *
  1644.  *           cache thrashing.  PopCnt() no longer used to recognize that we    *
  1645.  *           have reached an endgame database, there's now a counter for the   *
  1646.  *           total number of pieces on the board, as it's much faster to inc   *
  1647.  *           and dec that value rather than count 1 bits.  Tweaks to MakeMove  *
  1648.  *           and UnmakeMove to make things a couple of percent faster, but a   *
  1649.  *           whole lot cleaner.  Ditto for SEE and Quiesce.  More speed, and   *
  1650.  *           cleaner code.  Outside passed pawn scored scaled down except when *
  1651.  *           the opponent has no pieces at all.  "Lazy eval" cleaned up.  We   *
  1652.  *           now have two early exits, one before king safety and one after    *
  1653.  *           king safety.  There are two saved values so we have an idea of    *
  1654.  *           how large the positional scores have gotten to make this work.    *
  1655.  *           Bug in passed pawn code was evaluating black passed pawns as less *
  1656.  *           valuable than white.  Fixed and passed pawn scores increased      *
  1657.  *           slightly.  Isolated pawn scoring modified so the penalty is pro-  *
  1658.  *           portional to the number of isolani each side has, rather than the *
  1659.  *           old approach of penalizing the "excess" isolani one side has over *
  1660.  *           the other side.  Seems to be more accurate, but we'll see.  Fixed *
  1661.  *           a rather gross bug in ValidateMove() related to the way castling  *
  1662.  *           status not only indicates whether castling is legal or not, but   *
  1663.  *           if it's not, whether that side castled or move the king/rooks.    *
  1664.  *           this let ValidateMove() fail to correctly detect that a castling  *
  1665.  *           move from the hash table might be invalid, which could wreck the  *
  1666.  *           search easily.  This was an oversight from the new status code.   *
  1667.  *           Serious book bug fixed.  Bookup() was not counting wins and       *
  1668.  *           losses correctly, a bug introduced to make small.pgn work. Minor  *
  1669.  *           bug in the "trapped bishop" (a2/h2/a7/h7) code fixed.  Minor bug  *
  1670.  *           in SEE() also fixed (early exit that was not safe in rare cases.) *
  1671.  *                                                                             *
  1672.  *   11.18   EvaluatePawns() modified to recognize that if there are two white *
  1673.  *           pawns "rammed" by black pawns at (say) c4/c5 and e4/e5, then any  *
  1674.  *           pawns on the d-file are also effectively rammed as well since     *
  1675.  *           there is no hope for advancing it.  Auto232 automatic play code   *
  1676.  *           seems to be working, finally.  The problem was Crafty delayed     *
  1677.  *           echoing the move back to auto232, if the predicted move was the   *
  1678.  *           move played by the opponent.  Auto232 gave Crafty 3 seconds and   *
  1679.  *           then said "too late, you must be hung."  Outpost knight scoring   *
  1680.  *           modified to produce scores between 0 and .2 pawns.  A knight was  *
  1681.  *           getting too valuable, which caused some confusion in the scoring. *
  1682.  *                                                                             *
  1683.  *   11.19   Slight reduction in the value of passed pawns, as they were       *
  1684.  *           getting pretty large.  Cleaned up annotate.c to get rid of code   *
  1685.  *           that didn't work out.  Annotate now gives the PV for the move     *
  1686.  *           actually played as well as the move Crafty suggests is best.      *
  1687.  *           Crafty now has a reasonable "trade" bonus that kicks in when it   *
  1688.  *           has 20 points of material (or less) and is ahead or behind at     *
  1689.  *           least 2 pawns.  This trade bonus ranges from 0 to 1000 (one pawn) *
  1690.  *           and encourages the side that is winning to trade, while the side  *
  1691.  *           that is losing is encouraged to avoid trades.  More minor tweaks  *
  1692.  *           for auto232 including trying a delay of 100ms before sending      *
  1693.  *           a move.  New annotate command gives the option to get more than   *
  1694.  *           one suggested best move displayed, as well as fixes a few bugs    *
  1695.  *           in the older code.  Fix to bishop + wrong rook pawn code to also  *
  1696.  *           recognize the RP + no pieces is just as bad if the king can reach *
  1697.  *           the queening square first.                                        *
  1698.  *                                                                             *
  1699.  *   11.20   Cleanup to annotate command.  It now won't predict that one side  *
  1700.  *           will follow a book line that only resulted in losses.  Also a     *
  1701.  *           couple of glitches in annotate where it was possible for a move   *
  1702.  *           to take an exhorbitant amount of time if the best move was a      *
  1703.  *           book move, but there were no other possible book moves.  The      *
  1704.  *           trade bonus now includes trade pawns if behind, but not if ahead  *
  1705.  *           as well as now considering being ahead or behind only one pawn    *
  1706.  *           rather than the two pawns used previously in 11.19.               *
  1707.  *                                                                             *
  1708.  *   11.21   Additional bug fix in annotate command that would fail if there   *
  1709.  *           was only one legal move to search.  Passed pawn values now have   *
  1710.  *           an added evaluation component based on material on the board, so  *
  1711.  *           that they become more valuable as material is traded.             *
  1712.  *                                                                             *
  1713.  *   11.22   Test command modified.  Test <filename> [N] (where N is optional  *
  1714.  *           and defaults to 99) will terminate a test position after N con-   *
  1715.  *           secutive iterations have had the correct solution.  Bug in        *
  1716.  *           Quiesce() fixed, which would incorrectly prune (or fail to prune) *
  1717.  *           some captures, due to using "Material" which is computed with     *
  1718.  *           respect to white-to-move.  This was fixed many versions ago, but  *
  1719.  *           the fix was somehow lost.  Fix to EvaluateDraws that mistakenly   *
  1720.  *           declared some endings drawn when there were rookpawns on both     *
  1721.  *           sides of the board, and the king could get in front of one. Minor *
  1722.  *           fix to Repeat() that was checking one too many entries.  No       *
  1723.  *           harmful effect other than one extra iteration in the loop that    *
  1724.  *           would make "purify/purity" fail as well as slow things down 1% or *
  1725.  *           so.                                                               *
  1726.  *                                                                             *
  1727.  *   11.23   logpath=, bookpath= and tbpath= command line options added to     *
  1728.  *           direct logs, books and tb files to the indicated path.  These     *
  1729.  *           only work as command line options, and can't be used in normal    *
  1730.  *           places since the files are already opened and in use.  A bug in   *
  1731.  *           Evaluate() would call EvaluatePawns() when there were no pawns,   *
  1732.  *           breaking things on many systems.                                  *
  1733.  *                                                                             *
  1734.  *   12.0    Rewrite of Input/Output routines.  Crafty no longer relies on the *
  1735.  *           C library buffered I/O routine scanf() for input.  This made it   *
  1736.  *           basically impossible to determine when to read data from the key- *
  1737.  *           board, which made xboard/winboard difficult to interface with.    *
  1738.  *           Now Crafty does its own I/O using read(), which is actually much  *
  1739.  *           cleaner and easier.  Minor bug where a fail high in very short    *
  1740.  *           time controls might not get played...                             *
  1741.  *                                                                             *
  1742.  *   12.1    Clean-up of Main().  The code had gotten so obtuse with the       *
  1743.  *           pondering call, plus handling Option() plus move input, that it   *
  1744.  *           was nearly impossible to follow.  It is now *much* cleaner and    *
  1745.  *           easier to understand/follow.                                      *
  1746.  *                                                                             *
  1747.  *   12.2    Continued cleanup of I/O, particularly the way main() is          *
  1748.  *           structured, to make it more understandable.  Rewritten time.c     *
  1749.  *           to make it more readable and understandable, not to mention       *
  1750.  *           easier to modify.  Fixed a timing problem where Crafty could be   *
  1751.  *           pondering, and the predicted move is made followed immediately by *
  1752.  *           "force", caused when the opponent makes a move and loses on time, *
  1753.  *           or makes a move and resigns.  This would leave the engine state   *
  1754.  *           somewhat confused, and would result in the "new" command not      *
  1755.  *           reinitializing things at all, which would hang Crafty on xboard   *
  1756.  *           or winboard.                                                      *
  1757.  *                                                                             *
  1758.  *   12.3    Modified piece values somewhat to increase their worth relative   *
  1759.  *           to a pawn, to try to stop the tendency to sac a piece for 3 pawns *
  1760.  *           and get into trouble for doing so.  Minor fixes in NewGame() that *
  1761.  *           caused odd problems, such as learning positions after 1. e4.  The *
  1762.  *           position.lrn/.bin files were growing faster than they should.     *
  1763.  *           Other minor tweaks to fix a few broken commands in Option().      *
  1764.  *           Slight reduction in trade bonus to match slightly less valuable   *
  1765.  *           pawns.                                                            *
  1766.  *                                                                             *
  1767.  *   12.4    Added ABSearch() macro, which makes Search() much easier to read  *
  1768.  *           by doing the test to call Search() or Quiesce() in the macro      *
  1769.  *           where it is hidden from sight.  Bugs in the way the log files     *
  1770.  *           were closed and then used caused crashed with log=off.            *
  1771.  *                                                                             *
  1772.  *   12.5    Development bonus for central pawns added to combat the h4/a3     *
  1773.  *           sort of openings that would get Crafty into trouble.  It now will *
  1774.  *           try to seize the center if the opponent dallies around.           *
  1775.  *                                                                             *
  1776.  *   12.6    Bug in EvaluateDraws() that would erroneously decide that a KNP   *
  1777.  *           vs K was drawn if the pawn was a rook pawn and the king could get *
  1778.  *           in front of it, which was wrong.  Another minor bug would use     *
  1779.  *           EvaluateMate() when only a simple exchange ahead, which would     *
  1780.  *           result in sometimes giving up a pawn to reach such a position.    *
  1781.  *           Minor bug in SetBoard() would incorrectly reset many important    *
  1782.  *           game state variables if the initial position was set to anything  *
  1783.  *           other than the normal starting position, such as wild 7.  This    *
  1784.  *           would make learning add odd PV's to the .lrn file.  Development   *
  1785.  *           bonus modified to penalize moving the queen before minor pieces,  *
  1786.  *           and not moving minor pieces at all.  It is now possible to build  *
  1787.  *           a "wild 7" book, by first typing "wild 7", and then typing the    *
  1788.  *           normal book create command.  Crafty will remember to reset to the *
  1789.  *           "wild 7" position at the start of each book line.  Note that it   *
  1790.  *           is not possible to have both wild 7 book lines *and* regular book *
  1791.  *           lines in the same book.                                           *
  1792.  *                                                                             *
  1793.  *   12.7    Failsoft added, so that scores can now be returned outside the    *
  1794.  *           alpha/beta window.  Minor null-move threat detection added where  *
  1795.  *           a mate in 1 score, returned by a null-move search, causes a one   *
  1796.  *           ply search extension, since a mate in one is a serious threat.    *
  1797.  *           razoring is now disabled if there is *any* sort of extension in   *
  1798.  *           the search preceeding the point where razoring would be applied,  *
  1799.  *           to avoid razoring taking away one ply from a search that was ex-  *
  1800.  *           tended (for good reasons) earlier.  Fail-soft discarded, due to   *
  1801.  *           no advantages at all, and a slight slowdown in speed.  Rewrite of *
  1802.  *           pawn hashing, plus a rewrite of the weak pawn scoring code to     *
  1803.  *           make it significantly more accurate, while going a little slower  *
  1804.  *           (but since hashing hits 99% of the time, the slower speed is not  *
  1805.  *           noticable at all.)  Evaluation tweaking as well.                  *
  1806.  *                                                                             *
  1807.  *   12.8    Continued work on weak pawn analysis, as well as a few minor      *
  1808.  *           changes to clean the code up.                                     *
  1809.  *                                                                             *
  1810.  *   13.0    Preparation for the Paris WMCCC version starts here.  First new   *
  1811.  *           thing is the blocked pawn evaluation code.  This recognizes when  *
  1812.  *           a pawn is immobolized and when a pawn has lever potential, but    *
  1813.  *           is disabled if playing a computer opponent.  Passed pawn scoring  *
  1814.  *           modified to eliminate duplicate bonuses that were added in        *
  1815.  *           EvaluatePawns as well as EvaluatePassedPawns.  Trade bonus code   *
  1816.  *           rewritten to reflect trades made based on the material when the   *
  1817.  *           search begins.  This means that some things have to be cleared in *
  1818.  *           the hash table after a capture is really made on the board, but   *
  1819.  *           prevents the eval from looking so odd near the end of a game.     *
  1820.  *           minor bug with book random 0 fixed.  If there was only one book   *
  1821.  *           move, the search could blow up.                                   *
  1822.  *                                                                             *
  1823.  *   13.1    All positional scores reduced by 1/4, in an attempt to balance    *
  1824.  *           things a little better.  Also more modifications to the weak and  *
  1825.  *           blocked pawn code.  Added evaluation code to help with KRP vs KR, *
  1826.  *           so that the pawn won't be advanced too far before the king comes  *
  1827.  *           to its aid.  Ditto for defending, it knows that once the king is  *
  1828.  *           in front of the pawn, it is a draw.                               *
  1829.  *                                                                             *
  1830.  *   13.2    Blocked pawn scoring changed slightly to not check too far to see *
  1831.  *           if a pawn can advance.  Also pawns on center squares are weighted *
  1832.  *           more heavily to encourage keeping them there, or trying to get    *
  1833.  *           rid of them if the opponent has some there.  Discovered that      *
  1834.  *           somehow, the two lines of code that add in bonuses for passed     *
  1835.  *           pawns were deleted as I cleaned up and moved code around.  These  *
  1836.  *           were reinserted (missing from 13.0 on).                           *
  1837.  *                                                                             *
  1838.  *   13.3    Modified tablebase code to support 5 piece endings.  There is now *
  1839.  *           a configuration option (see Makefile) to specify 3, 4 or 5 piece  *
  1840.  *           endgame databases.  More evaluation tuning.                       *
  1841.  *                                                                             *
  1842.  *   13.4    Modified null-move search.  If there is more than a rook left for *
  1843.  *           the side on move, null is always tried, as before.  If there is   *
  1844.  *           a rook or less left, the null move is only tried within 5 plies   *
  1845.  *           of the leaf positions, so that as the search progresses deeper,   *
  1846.  *           null-move errors are at least moved away from the root.  Many     *
  1847.  *           evaluation changes, particularly to king safety and evaluating    *
  1848.  *           castling to one side while the other side is safer.  Also it now  *
  1849.  *           handles pre-castled positions better.                             *
  1850.  *                                                                             *
  1851.  *   13.5    "From-to" display patch from Jason added.  This shows the from    *
  1852.  *           and to squares on a small diagram, oriented to whether Crafty is  *
  1853.  *           playing black or white.  The intent is to minimize operator       *
  1854.  *           errors when playing black and the board coordinates are reversed. *
  1855.  *           More eval changes.                                                *
  1856.  *                                                                             *
  1857.  *   13.6    Weak pawns on open files now add value to the opponent's rooks    *
  1858.  *           since they are the pieces that will primarily use an open file to *
  1859.  *           attack a weak pawn.                                               *
  1860.  *                                                                             *
  1861.  *   13.7    Minor eval tweaks, plus fixes for the CR/LF file reading problems *
  1862.  *           in windows NT.                                                    *
  1863.  *                                                                             *
  1864.  *   13.8    Adjustments to book.c, primarily preventing Crafty from playing   *
  1865.  *           lines that had very few games in the file, because those are      *
  1866.  *           often quite weak players.  Minor fix to InputMoves() so that a    *
  1867.  *           move like bxc3 can *never* be interpreted as a bishop move.  A    *
  1868.  *           bishop move must use an uppercase B, as in Bxc3.  Bug in the      *
  1869.  *           king safety for white only was not checking for open opponent     *
  1870.  *           files on the king correctly.                                      *
  1871.  *                                                                             *
  1872.  *   13.9    Minor adjustment to time allocation to allow "operator time" to   *
  1873.  *           affect time per move.  This is set by "operator <n>" where <n> is *
  1874.  *           time in seconds per move that should be "reserved" to allow the   *
  1875.  *           operator some typing/bookkeeping time.  New command "book         *
  1876.  *           trigger <n>" added so that in tournament mode, when choosing a    *
  1877.  *           book line, Crafty will revert to book random 0 if the least       *
  1878.  *           popular move was played fewer times than <n>.  This is an attempt *
  1879.  *           to avoid trusting narrow book lines too much while still allowing *
  1880.  *           adequate randomness.  If the least frequently played move in the  *
  1881.  *           set of book moves was played fewer times than this, then a search *
  1882.  *           over all the book moves is done.  If the best one doesn't look    *
  1883.  *           so hot, Crafty drops out of book and searches *all* legal moves   *
  1884.  *           instead.                                                          *
  1885.  *                                                                             *
  1886.  *   13.10   Minor adjustments.  This is the gold Paris version that is going  *
  1887.  *           with Jason.  Any changes made during the event will be included   *
  1888.  *           in the next version.                                              *
  1889.  *                                                                             *
  1890.  *   14.0    Major eval modification to return to centipawn evaluation, rather *
  1891.  *           then millipawns.  This reduces the resolution, but makes it a lot *
  1892.  *           easier to understand evaluation changes.  Significant eval mods   *
  1893.  *           regarding king safety and large positional bonuses, where the ad- *
  1894.  *           vantage is not pretty solid.  Note that old book learning will    *
  1895.  *           not work now, since the evals are wrong.  Old position learning   *
  1896.  *           must be deleted completely.  See the read.me file for details on  *
  1897.  *           what must be done about book learning results.  New egtb=n option *
  1898.  *           to replace the older -DTABLEBASES=n Makefile option, so that the  *
  1899.  *           tablebases can be enabled or disabled without recompiling.        *
  1900.  *                                                                             *
  1901.  *   14.1    Glitch in EvaluateDevelopment() was producing some grossly large  *
  1902.  *           positional scores.  Also there were problems with where the       *
  1903.  *           PreEvaluate() procedure were called, so that it could be called   *
  1904.  *           *after* doing RootMoveslist(), but before starting a search.  This*
  1905.  *           caused minor problems with hashing scores.  One case was that it  *
  1906.  *           was possible for a "test suite" to produce slightly different     *
  1907.  *           scores than the same position run in normal mode.  This has been  *
  1908.  *           corrected.  St=n command now supports fractional times to .01     *
  1909.  *           second resolution.                                                *
  1910.  *                                                                             *
  1911.  *   14.2    MATE reduced to 32768, which makes all scores now fit into 16     *
  1912.  *           bits.  Added code to EvaluatePawns() to detect the Stonewall      *
  1913.  *           pawn formation and not like it as black.  Also it detects a       *
  1914.  *           reversed Stonewall formation (for black) and doesn't like it as   *
  1915.  *           white.  EvaluateOutsidePassedPawns() removed.  Functionality is   *
  1916.  *           incorporated in EvaluatePawns() and is hashed, which speeds the   *
  1917.  *           evaluation up a bit.  King safety is now fully symmetric and is   *
  1918.  *           folded into individual piece scoring to encourage pieces to       *
  1919.  *           attack an unsafe king.                                            *
  1920.  *                                                                             *
  1921.  *   14.3    Minor adjustments to the king safety code for detecting attacks   *
  1922.  *           initiated by pushing kingside pawns.  Flip/flop commands added to *
  1923.  *           mirror the board either horizontally or vertically to check for   *
  1924.  *           symmetry bugs in the evaluation.  Other eval tuning changes.      *
  1925.  *                                                                             *
  1926.  *   14.4    Queen value increased to stop trading queen for two rooks.  Book  *
  1927.  *           learning slightly modified to react quicker.  Also scores are now *
  1928.  *           stored in the book file as floats to get rid of an annoying trun- *
  1929.  *           cation problem that was dragging scores toward zero.  The book    *
  1930.  *           file now has a "version" so that old book versions won't cause    *
  1931.  *           problems due to incorrect formats.  Null-move mated threat ex-    *
  1932.  *           tension was modified.  If null-move search fails high, I fail     *
  1933.  *           high as always, if it fails low, and it says I get mated in N     *
  1934.  *           moves, I extend all moves at this ply, since something is going   *
  1935.  *           on.  I also carry this threat extension into the hash table since *
  1936.  *           a hash entry can say "don't do null move, it will fail low."  I   *
  1937.  *           now have a flag that says not only will null-move fail low, it    *
  1938.  *           fails to "mated in N" so this ply needs extending even without a  *
  1939.  *           null-move search to tell it so.  Book learning greatly modified   *
  1940.  *           in the way it "distributes" the learned values, in an effort to   *
  1941.  *           make learning happen faster.  I now construct a sort of "tree"    *
  1942.  *           so I know how many book alternatives Crafty had at each move it   *
  1943.  *           at each book move it played.  I then assign the whole learn value *
  1944.  *           to all moves below the last book move where there was a choice,   *
  1945.  *           and also assign the whole learn value to the move where there     *
  1946.  *           was a choice.  I then divide the learn value by the number of     *
  1947.  *           choices and assign this to each book move (working backward once  *
  1948.  *           again) until the next point where there were choices.  This makes *
  1949.  *           sure that if there is a choice, and it is bad, it won't be played *
  1950.  *           again, even if this choice was at move 2, and the remainder of    *
  1951.  *           the book line was completely forced.  All in an effort to learn   *
  1952.  *           more quickly.                                                     *
  1953.  *                                                                             *
  1954.  *   14.5    annotate bug fixed where if there was only one legal move, the    *
  1955.  *           annotation would stop with no warning.  Bookup() now produces a   *
  1956.  *           more useful error message, giving the exact line number in the    *
  1957.  *           input file where the error occurred, to make fixing them easier.  *
  1958.  *           If you are playing without a book.bin, 14.4 would crash in the    *
  1959.  *           book learning code.  This is now caught and avoided.  Bookup()    *
  1960.  *           now knows how to skip analysis in PGN files, so you can use such  *
  1961.  *           files to create your opening book, without having problems.  It   *
  1962.  *           understands that nesting () {} characters "hides" the stuff in-   *
  1963.  *           side them, as well as accepting non-standard PGN comments that    *
  1964.  *           are inside [].  Annotate() now will annotate a PGN file with      *
  1965.  *           multiple games, although it will use the same options for all of  *
  1966.  *           the games.  PGN headers are preserved in the .can file.  Annotate *
  1967.  *           now will recognize the first move in a comment (move) or {move}   *
  1968.  *           and will search that move and give analysis for it in addition to *
  1969.  *           the normal output.                                                *
  1970.  *                                                                             *
  1971.  *   14.6    Minor change to book random 4 (use learned value.)  if all the    *
  1972.  *           learned values are 0, then use the book random 3 option instead.  *
  1973.  *           Bug in 50-move counter fixed.  Learn() could cause this to be set *
  1974.  *           to a value that didn't really reflect the 50-move status, and     *
  1975.  *           cause games to be drawn when they should not be.  Modified the    *
  1976.  *           "Mercilous" attack code to recognize a new variation he worked    *
  1977.  *           out that sacrifices a N, R and B for a mating attack.  No more.   *
  1978.  *                                                                             *
  1979.  *   14.7    "Verbose" command removed and replaced by a new "display" command *
  1980.  *           that sets display options.  Use "help display" for more info on   *
  1981.  *           how this works.  The "mercilous" attack scoring is only turned on *
  1982.  *           when playing "mercilous".  But there is a new "special" list that *
  1983.  *           you can add players too if you want, and this special scoring is  *
  1984.  *           turned on for them as well.                                       *
  1985.  *                                                                             *
  1986.  *   14.8    New scoring term to penalize unbalanced trades.  IE if Crafty has *
  1987.  *           to lose a pawn, it would often trade a knight for two pawns in-   *
  1988.  *           stead, which is actually worse.  This new term prevents this sort *
  1989.  *           of trades.                                                        *
  1990.  *                                                                             *
  1991.  *   14.9    "Mercilous" attack code modified to handle a new wrinkle he (and  *
  1992.  *           one other player) found.                                          *
  1993.  *                                                                             *
  1994.  *   14.10   New "bench" command runs a test and gives a benchmark comparison  *
  1995.  *           for Crafty and compares this to a P6/200 base machine.  Minor bug *
  1996.  *           disabled the "dynamic draw score" and fixed it at zero, even if   *
  1997.  *           the opponent was much weaker (rating) or behind on time.  Also    *
  1998.  *           draw_score was not reset to 0 at start of each new game, possibly *
  1999.  *           leaving it at +.20 after playing a higher-rated opponent.         *
  2000.  *                                                                             *
  2001.  *   14.11   Release to make mercilous attack detection code the default, to   *
  2002.  *           prevent the rash of mercilous attacks on the chess servers.       *
  2003.  *                                                                             *
  2004.  *   14.12   Modified tuning of evaluation.  Scores were reduced in the past,  *
  2005.  *           to discourage the piece for two pawns sort of trades, but since   *
  2006.  *           this was basically solved in 14.8, scores are going "back up".    *
  2007.  *           Particularly passed pawn scores.  Crafty now accepts draw offers  *
  2008.  *           if the last search result was <= the current result returned by   *
  2009.  *           DrawScore().  It also honors draw requests via xboard when        *
  2010.  *           against a human opponent as well, and will flag the game as over. *
  2011.  *           Minor modification to annotate.c to display move numbers in the   *
  2012.  *           PV's to match the PV output format used everywhere else in        *
  2013.  *           Crafty.  A new type of learning, based on results, has been added *
  2014.  *           and is optional (learn=7 now enables every type of learning.)     *
  2015.  *           this type of learning uses the win/lose game result to flag an    *
  2016.  *           opening that leads to a lost game as "never" play again.  The     *
  2017.  *           book move selection logic has been modified.  There are four com- *
  2018.  *           ponents used in choosing book moves:  frequency of play; win/lose *
  2019.  *           ratio; static evaluation; and learned score.  There are four      *
  2020.  *           weights that can be modified with the bookw command, that control *
  2021.  *           how these 4 values are used to choose book moves.  Each weight is *
  2022.  *           a floating point value between 0 and 1, and controls how much the *
  2023.  *           corresponding term factors in to move selection.                  *
  2024.  *                                                                             *
  2025.  *   14.13   Fixed a book parsing bug that now requires a [Site "xxx"] tag in  *
  2026.  *           any book file between lines for the "minplay" option of book      *
  2027.  *           create to work properly.                                          *
  2028.  *                                                                             *
  2029.  *   15.0    This is the first version to support a parallel search using      *
  2030.  *           multiple processors on a shared-memory machinel.  This version    *
  2031.  *           uses the "PVS" algorithm (Principal Variation Search) that is an  *
  2032.  *           early form of "Young Brothers Wait".  This is not the final       *
  2033.  *           search algorithm that will be used, but it is relatively easy to  *
  2034.  *           implement, so that the massive data structure changes can be de-  *
  2035.  *           bugged before getting too fancy.  The major performance problem   *
  2036.  *           with this approach is that all processors work together at a node *
  2037.  *           and when one finishes, it has to wait until all others finish     *
  2038.  *           before it can start doing anything more.  This adds up to a       *
  2039.  *           significant amount of time and really prevents good speedups on   *
  2040.  *           multiprocessor machines.  This restriction will be eliminanted in *
  2041.  *           future versions, but it makes debugging much simpler for the      *
  2042.  *           first version.  After much agonizing, I finally chose to write my *
  2043.  *           own "spinlock" macros to avoid using the pthread_mutex_lock stuff *
  2044.  *           that is terribly inefficient due to its trying to be cute and     *
  2045.  *           yield the processor rather than spinning, when the lock is al-    *
  2046.  *           ready set.  i'd rather spin than context-switch.                  *
  2047.  *                                                                             *
  2048.  *   15.1    This version actually unleashes the full design of the parallel   *
  2049.  *           search, which lets threads split away from the "pack" when        *
  2050.  *           they become idle, and they may then jump in and help another      *
  2051.  *           busy thread.  This eliminates the significant delays that         *
  2052.  *           occur near the end of a search at a given ply.  Now as those pro- *
  2053.  *           cessors drop out of the search at that ply, they are reused at    *
  2054.  *           other locations in the tree without any significant delays.       *
  2055.  *                                                                             *
  2056.  *   15.2    WinNT support added.  Also fixed a small bug in Interrupt() that  *
  2057.  *           could let it exit with "busy" set so that it would ignore all     *
  2058.  *           input from that point forward, hanging the game up.  Added a new  *
  2059.  *           "draw accept" and "draw decline" option to enable/disable Crafty  *
  2060.  *           accepting draw offers if it is even or behind.  Turned on by      *
  2061.  *           an IM/GM opponent automatically.  Thread pools now being used to  *
  2062.  *           avoid the overhead of creating/destroying threads at a high rate  *
  2063.  *           rate of speed.  It is now quite easy to keep N processors busy.   *
  2064.  *                                                                             *
  2065.  *   15.3    CPU time accounting modified to correctly measure the actual time *
  2066.  *           spent in a parallel search, as well as to modify the way Crafty   *
  2067.  *           handles time management in an SMP environment.  A couple of bugs  *
  2068.  *           fixed in book.c, affecting which moves were played.  Also veri-   *
  2069.  *           fied that this version will play any ! move in books.bin, even if *
  2070.  *           it was not played in the games used to build the main book.bin    *
  2071.  *           file.                                                             *
  2072.  *                                                                             *
  2073.  *   15.4    This version will terminate threads once the root position is in  *
  2074.  *           a database, to avoid burning cpu cycles that are not useful.  A   *
  2075.  *           flag "done" is part of each thread block now.  When a thread goes *
  2076.  *           to select another move to search, and there are no more left, it  *
  2077.  *           sets "done" in the parent task thread block so that no other pro- *
  2078.  *           cessors will attempt to "join the party" at that block since no   *
  2079.  *           work remains to be done.  Book selection logic modified so that   *
  2080.  *           frequency data is "squared" to improve probabilities.  Also, the  *
  2081.  *           frequency data is used to cull moves, in that if a move was not   *
  2082.  *           played 1/10th of the number of times that the "most popular" move *
  2083.  *           was played, then that move is eliminated from consideration.      *
  2084.  *                                                                             *
  2085.  *   15.5    Changes to "volatile" variables to enhance compiler optimization  *
  2086.  *           in places where it is safe.  Added a function ThreadStop() that   *
  2087.  *           works better at stopping threads when a fail high condition       *
  2088.  *           occurs at any nodes.  It always stopped all sibling threads at    *
  2089.  *           the node in question, but failed to stop threads that might be    *
  2090.  *           working somewhere below the fail-high node.  ThreadStop() will    *
  2091.  *           recursively call itself to stop all of those threads. Significant *
  2092.  *           increase in king centralization (endgame) scoring to encourage    *
  2093.  *           the king to come out and fight rather than stay back and get      *
  2094.  *           squeezed to death.  Minor change to queen/king tropism to only    *
  2095.  *           conside the file distance, not ranks also.  Bug in interrupt.c    *
  2096.  *           fixed.  This bug would, on very rare occasion, let Crafty read in *
  2097.  *           a move, but another thread could read on top of this and lose the *
  2098.  *           move.  Xboard would then watch the game end with a <flag>.        *
  2099.  *                                                                             *
  2100.  *   15.6    Ugly repetition draw bug (SMP only) fixed.  I carefully copied    *
  2101.  *           the repetition list from parent to child, but also copied the     *
  2102.  *           repetition list pointer...  which remained pointing at the parent *
  2103.  *           repetition list.  Which failed, of course.                        *
  2104.  *                                                                             *
  2105.  *   15.7    Problem in passing PV's back up the search fixed.  The old bug of *
  2106.  *           a fail high/fail low was not completely handled, so that if the   *
  2107.  *           *last* move on a search failed high, then low, the PV could be    *
  2108.  *           broken or wrong, causing Crafty to make the wrong move, or else   *
  2109.  *           break something when the bogus PV was used.  Piece/square tables  *
  2110.  *           now only have the _w version initialized in data.c, to eliminate  *
  2111.  *           the second copy which often caused errors.  Initialize() now will *
  2112.  *           copy the _w tables to the _b tables (reflected of course.)        *
  2113.  *                                                                             *
  2114.  *   15.8    trade bonus modified to not kick in until one side is two pawns   *
  2115.  *           ahead or behind, so that trading toward a draw is not so common.  *
  2116.  *           Fixed a whisper bug that would cause Crafty to whisper nonsense   *
  2117.  *           if it left book, then got back in book.  It also now whispers the *
  2118.  *           book move it played, rather than the move it would play if the    *
  2119.  *           opponent played the expected book move, which was confusing.      *
  2120.  *                                                                             *
  2121.  *   15.9    Bug in positions with one legal move would abort the search after *
  2122.  *           a 4 ply search, as it should, but it was possible that the result *
  2123.  *           from the aborted search could be "kept" which would often make    *
  2124.  *           Crafty just "sit and wait" and flag on a chess server.            *
  2125.  *                                                                             *
  2126.  *   15.10   Fixed "draw" command to reject draw offers if opponent has < ten  *
  2127.  *           seconds left and no increment is being used.  Fixed glitch in     *
  2128.  *           LearnResult() that would crash Crafty if no book was being used,  *
  2129.  *           and it decides to resign.  Modified trade bonus code to eliminate *
  2130.  *           a hashing inconsistency.  Minor glitch in "show thinking" would   *
  2131.  *           show bad value if score was mate.  Added Tim Mann's new xboard/   *
  2132.  *           winboard "result" command and modified the output from Crafty to  *
  2133.  *           tell xboard when a game is over, using the new result format that *
  2134.  *           Tim now expects.  Note that this is xboard 3.6.9, and earlier     *
  2135.  *           versions will *not* work correctly (ok on servers, but not when   *
  2136.  *           you play yourself) as the game won't end correctly due to the     *
  2137.  *           change in game-end message format between the engine and xboard.  *
  2138.  *                                                                             *
  2139.  *   15.11   Modified SMP code to not start a parallel search at a node until  *
  2140.  *           "N" (N=2 at present) moves have been search.  N was 1, and when   *
  2141.  *           move ordering breaks down the size of the tree gets larger.  This *
  2142.  *           controls that much better.  Fixed an ugly learning bug.  If the   *
  2143.  *           last move actually in the game history was legal for the other    *
  2144.  *           side, after playing it for the correct side, it could be played   *
  2145.  *           a second time, which would break things after learning was done.  *
  2146.  *           An example was Rxd4 for white, where black can respond with Rxd4. *
  2147.  *           Changes for the new 3.6.10 xboard/winboard are also included as   *
  2148.  *           well as a fix to get book moves displayed in analysis window as   *
  2149.  *           it used to be done.                                               *
  2150.  *                                                                             *
  2151.  *   15.12   "The" SMP repetition bug was finally found and fixed.  CopyToSMP  *
  2152.  *           was setting the thread-specific rephead_* variable *wrong* which  *
  2153.  *           broke so many things it was not funny.  Evaluation tuning in this *
  2154.  *           version as well to try to "center" values in a range of -X to +X  *
  2155.  *           rather than 0 to 2X.  Trade bonus had a bug in the pawn part that *
  2156.  *           not only encouraged trading pawns when it should be doing the     *
  2157.  *           opposite, but the way it was written actually made it look bad to *
  2158.  *           win a pawn.  More minor xboard/winboard compatibility bugs fixed  *
  2159.  *           so that games end when they should.  DrawScore() had a quirk that *
  2160.  *           caused some problems, in that it didn't know what to do with non- *
  2161.  *           zero draw scores, and could return a value with the wrong sign at *
  2162.  *           times.  It is now passed a flag, "Crafty_is_white" to fix this.   *
  2163.  *           Modification so that Crafty can handle the "FEN" PGN tag and set  *
  2164.  *           the board to the correct position when it is found.  Xboard       *
  2165.  *           options "hard" and "easy" now enable and disable pondering.       *
  2166.  *                                                                             *
  2167.  *   15.13   Modification to "bad trade" code to avoid any sort of unbalanced  *
  2168.  *           trades, like knight/bishop for 2-3 pawns, or two pieces for a     *
  2169.  *           rook and pawn.  More new xboard/winboard fixes for Illegal move   *
  2170.  *           messages and other engine interface changes made recently.  Minor *
  2171.  *           change to null move search, to always search with the alpha/beta  *
  2172.  *           window of (beta-1,beta) rather than (alpha,beta), which is very   *
  2173.  *           slightly more efficient.                                          *
  2174.  *                                                                             *
  2175.  *   15.14   Rewrite of ReadPGN() to correctly handle nesting of various sorts *
  2176.  *           of comments.  This will now correctly parse wall.pgn, except for  *
  2177.  *           promotion moves with no promotion piece specified.  The book      *
  2178.  *           create code also now correctly reports when you run out of disk   *
  2179.  *           space and this should work under any system to let you know when  *
  2180.  *           you run out of space.                                             *
  2181.  *                                                                             *
  2182.  *   15.15   Major modifications to Book() and Bookup().  Bookup() now needs   *
  2183.  *           1/2 the temp space to build a book that it used to need (even     *
  2184.  *           less under windows).  Also, a book position is now 16 bytes in-   *
  2185.  *           stead of 20 (or 24 under windows) further reducing the space      *
  2186.  *           requirements.  The "win/lose/draw" counts are no longer absolute, *
  2187.  *           rather they are relative so they can be stored in one byte. A new *
  2188.  *           method for setting "!" moves in books.bin is included in this     *
  2189.  *           version.  For any move in the input file used to make books.bin,  *
  2190.  *           you can add a {play nn%} string, which says to play this move nn% *
  2191.  *           of the time, regardless of how frequently it was played in the    *
  2192.  *           big book file.  For example, e4 {play 50%} says to play e4 50% of *
  2193.  *           the time.  Note two things here:  (1) If the percentages for all  *
  2194.  *           of white's first moves add up to a number > 100, then the         *
  2195.  *           percentage played is taken as is, but all will be treated as if   *
  2196.  *           they sum to 100 (ie if there are three first moves, each with a   *
  2197.  *           percentage of 50%, they will behave as though they are all 33%    *
  2198.  *           moves).  (2) For any moves not marked with a % (assuming at least *
  2199.  *           one move *is* marked with a percent) then such moves will use the *
  2200.  *           remaining percentage left over applied to them equally. Note that *
  2201.  *           using the % *and* the ! flags together slightly changes things,   *
  2202.  *           because normally only the set of ! moves will be considered, and  *
  2203.  *           within that set, any with % specified will have that percent used *
  2204.  *           as expected.  But if you have some moves with !, then a percent   *
  2205.  *           on any of the *other* moves won't do a thing, because only the !  *
  2206.  *           moves will be included in the set to choose from.                 *
  2207.  *                                                                             *
  2208.  *   15.16   Bug in the king tropism code, particularly for white pieces that  *
  2209.  *           want to be close to the black king, fixed in this version.  New   *
  2210.  *           History() function that handles all history/killer cases, rather  *
  2211.  *           than the old 2-function approach.  Ugly Repeat() bug fixed in     *
  2212.  *           CopyToChild().  This was not copying the complete replist due to  *
  2213.  *           a ply>>2 rather than ply>>1 counter.                              *
  2214.  *                                                                             *
  2215.  *   15.17   Adjustments to "aggressiveness" to slightly tone it down.  Minor  *
  2216.  *           fix to avoid the odd case of whispering one move and playing an-  *
  2217.  *           other, caused by a fail-high/fail-low overwriting the pv[1] stuff *
  2218.  *           and then Iterate() printing that rather than pv[0] which is the   *
  2219.  *           correct one.  New LegalMove() function that strengthens the test  *
  2220.  *           for legality at the root, so that it is impossible to ponder a    *
  2221.  *           move that looks legal, but isn't.  Modifications to king safety   *
  2222.  *           to better handle half-open files around the king as well as open  *
  2223.  *           files.  EGTB "swindler" added.  If the position is drawn at the   *
  2224.  *           root of the tree, then all losing moves are excluded from the     *
  2225.  *           move list and the remainder are searched normally with the EGTB   *
  2226.  *           databases disabled, in an effort to give the opponent a chance to *
  2227.  *           go wrong and lose.  Fixed "mode tournament" and "book random 0"   *
  2228.  *           so that they will work correctly with xboard/winboard, and can    *
  2229.  *           even be used to play bullet games on a server if desired. Minor   *
  2230.  *           fix to attempt to work around a non-standard I/O problem on the   *
  2231.  *           Macintosh platform dealing with '\r' as a record terminator       *
  2232.  *           rather than the industry/POSIX-standard \n terminator character.  *
  2233.  *                                                                             *
  2234.  *   15.18   Fix to the "material balance" evaluation term so that it will not *
  2235.  *           like two pieces for a rook (plus pawn) nor will it like trading a *
  2236.  *           piece for multiple pawns.  A rather gross bug in the repetition   *
  2237.  *           code (dealing with 50 move rule) could overwrite random places in *
  2238.  *           memory when the 50 move rule approached, because the arrays were  *
  2239.  *           not long enough to hold 50 moves, plus allow the search to go     *
  2240.  *           beyond the 50-move rule (which is legal and optional) and then    *
  2241.  *           output moves (which uses ply=65 data structures).  This let the   *
  2242.  *           repetition (50-move-rule part) overwrite things by storing well   *
  2243.  *           beyond the end of the repetition list for either side.  Minor fix *
  2244.  *           to EGTB "swindle" code.  It now only tries the searches if it is  *
  2245.  *           the side with swindling chances.  Ie it is pointless to try for   *
  2246.  *           a swindle in KRP vs KR if you don't have the P.  :)  Some very    *
  2247.  *           substantial changes to evaluate.c to get things back into some    *
  2248.  *           form of synch with each other.                                    *
  2249.  *                                                                             *
  2250.  *   15.19   More evaluation changes.  Slight change to the Lock() facility    *
  2251.  *           as it is used to lock the hash table.  Modifications to the book  *
  2252.  *           selection logic so that any move in books.bin that is not in the  *
  2253.  *           regular book.bin file still can be played, and will be played if  *
  2254.  *           it has a {play xxx%} or ! option.  New option added to the book   *
  2255.  *           create command to allow the creation of a better book.  This      *
  2256.  *           option lets you specify a percentage that says "exclude a book    *
  2257.  *           move it if didn't win xx% as many games as it lost.  IE, if the   *
  2258.  *           book move has 100 losses, and you use 50% for the new option, the *
  2259.  *           move will only be included if there are at least 50 wins.  This   *
  2260.  *           allows culling lines that only lost, for example.  New bad trade  *
  2261.  *           scoring that is simpler.  If one side has one extra minor piece   *
  2262.  *           and major pieces are equal, the other side has traded a minor for *
  2263.  *           pawns and made a mistake.  If major pieces are not matched, and   *
  2264.  *           one side has two or more extra minors, we have seen either a rook *
  2265.  *           for two minor pieces (bad) or a queen for three minor pieces (bad *
  2266.  *           also).  Horrible bug in initializing min_thread_depth, which is   *
  2267.  *           supposed to control thrashing.  The SMP search won't split the    *
  2268.  *           tree within "min_thread_depth" of the leaf positions.  Due to a   *
  2269.  *           gross bug, however, this was initialized to "2", and would have   *
  2270.  *           been the right value except that a ply in Crafty is 4.  The       *
  2271.  *           mtmin command that adjusts this correctly multiplied it by 4,     *
  2272.  *           but in data.c, it was left at "2" which lets the search split way *
  2273.  *           too deeply and can cause thrashing.  It now correctly defaults to *
  2274.  *           120 (2*PLY) as planned.  Crafty now *only* supports               *
  2275.  *           winboard/xboard 4.0 or higher, by sending the string "move xxx"   *
  2276.  *           to indicate its move.  This was done to eliminate older xboard    *
  2277.  *           versions that had some incompatibilities with Crafty that were    *
  2278.  *           causing lots of questions/problems.  Xboard 4.0 works perfectly   *
  2279.  *           and is the only recommended GUI now.                              *
  2280.  *                                                                             *
  2281.  *   15.20   New evaluation term to ensure that pawns are put on squares of    *
  2282.  *           the opposite color as the bishop in endings where one side only   *
  2283.  *           has a single bishop.  Another new evaluation term to favor        *
  2284.  *           bishops over knights in endings with pawns on both sides of the   *
  2285.  *           board.  Search extensions now constrained so that when doing an   *
  2286.  *           N-ply search, the first 2N plies can extend normally, but beyond  *
  2287.  *           that the extensions are reduced by one-half.  This eliminates a   *
  2288.  *           few tree explosions that wasted lots of time but didn't produce   *
  2289.  *           any useful results.  This version solves 299/300 of the Win at    *
  2290.  *           Chess positions on a single-cpu pentium pro 200mhz machine now.   *
  2291.  *           New evaluation term to reward "pawn duos" (two pawns side by side *
  2292.  *           which gives them the most flexibility in advancing.  A change to  *
  2293.  *           the bishops of opposite color to not just consider B vs B drawish *
  2294.  *           when the B's are on opposite colors, but to also consider other   *
  2295.  *           positons like RB vs RB drawish with opposite B's.                 *
  2296.  *                                                                             *
  2297.  *   16.0    Hash functions renamed to ProbeTransRef() and StoreTransRef().    *
  2298.  *           The store functions (2) were combined to eliminate some duplicate *
  2299.  *           code and shrink the cache footprint a bit.  Adjustment to "losing *
  2300.  *           the right to castle" so that the penalty is much less if this is  *
  2301.  *           done when trading queens, since a king in the center becomes less *
  2302.  *           of a problem there. Several eval tweaks.  Support for Eugene      *
  2303.  *           Nalimov's new endgame databases that reduce the size by 50%.      *
  2304.  *           Added a new cache=xxx command to set the tablebase cache (more    *
  2305.  *           memory means less I/O of course).  The "egtb" command now has two *
  2306.  *           uses.  If you enter egtb=0, you can disable tablebases for        *
  2307.  *           testing.  Otherwise, you just add "egtb" to your command line or  *
  2308.  *           .craftyrc file and Crafty automatically recognizes the files that *
  2309.  *           are present and sets up to probe them properly.  Added an eval    *
  2310.  *           term to catch a closed position with pawns at e4/d3/c4 and then   *
  2311.  *           avoiding the temptation to castle into an attack.  Most of the    *
  2312.  *           evaluation discontinuities have been removed, using the two new   *
  2313.  *           macros ScaleToMaterial() and InverseScaleToMaterial().  Scale()   *
  2314.  *           is used to reduce scores as material is removed from the board,   *
  2315.  *           while InverseScale() is used to increase the score as material    *
  2316.  *           is removed.  This removed a few ugly effects of things happening  *
  2317.  *           right around the EG_MAT threshold.                                *
  2318.  *                                                                             *
  2319.  *   16.1    Bug in EGTBProbe() which used the wrong variable to access the    *
  2320.  *           enpassant target square was fixed.  The cache=x command now       *
  2321.  *           checks for a failed malloc() and reverts to the default cache     *
  2322.  *           size to avoid crashes.  Major eval tuning changes.  Cache bug     *
  2323.  *           would do an extra malloc() and if it is done after the "egtb"     *
  2324.  *           command it would crash.  Analyze mode now turns off the "swindle" *
  2325.  *           mode.                                                             *
  2326.  *                                                                             *
  2327.  *   16.2    More evaluation changes, specifically to bring king safety down   *
  2328.  *           to reasonable levels.  Support for the DGT electronic chess board *
  2329.  *           is now included (but only works in text mode, not in conjunction  *
  2330.  *           with xboard/winboard yet.  Fix to StoreTransRef() that corrected  *
  2331.  *           a problem with moving an entry from tablea to tableb, but to the  *
  2332.  *           wrong address 50% of the time (thanks to J. Wesley Cleveland).    *
  2333.  *                                                                             *
  2334.  *   16.3    Performance tweaks plus a few evaluation changes.  An oversight   *
  2335.  *           would let Crafty play a move like exd5 when cxd5 was playable.    *
  2336.  *           IE it didn't follow the general rule "capture toward the center." *
  2337.  *           this has been fixed.  King safety ramped up just a bit.           *
  2338.  *                                                                             *
  2339.  *   16.4    Search extension fixed.  One-reply was being triggered when there *
  2340.  *           was only one capture to look at as well, which was wrong.  Minor  *
  2341.  *           fix to king safety in Evaluate().  Adjustments to preeval to fix  *
  2342.  *           some "space" problems caused by not wanting to advance pawns at   *
  2343.  *           all, plus some piece/square pawn values that were too large near  *
  2344.  *           the opponent's king position.  New swindle on*off command allows  *
  2345.  *           the user to disable "swindle mode" so that Crafty will report     *
  2346.  *           tablebase draws as draws.  Swindle mode is now disabled auto-     *
  2347.  *           matically in analysis or annotate modes.  DrawScore() now returns *
  2348.  *           a draw score that is not nearly so negative when playing humans.  *
  2349.  *           The score was a bit large (-.66 and -.33) so that this could tend *
  2350.  *           to force Crafty into losing rather than drawn positions at times. *
  2351.  *           EGTB probe code now monitors how the probes are affecting the nps *
  2352.  *           and modifies the probe depth to control this.  IE it adjusts the  *
  2353.  *           max depth of probes to attempt to keep the NPS at around 50% or   *
  2354.  *           thereabouts of the nominal NPS rate.  Fixed a nasty bug in the    *
  2355.  *           EGTB 'throttle' code.  It was possible that the EGTB_mindepth     *
  2356.  *           could get set to something more than 4 plies, then the next       *
  2357.  *           search starts off already in a tablebase ending, but with this    *
  2358.  *           probe limit, it wouldn't probe yet Iterate() would terminate the  *
  2359.  *           search after a couple of plies.  And the move chosen could draw.  *
  2360.  *           New code submitted by George Barrett, which adds a new command    *
  2361.  *           "html on".  Using this will cause the annotate command to produce *
  2362.  *           a game.html file (rather than game.can) which includes nice board *
  2363.  *           displays (bitmapped images) everywhere Crafty suggests a          *
  2364.  *           different move.  You will need to download the bitmaps directory  *
  2365.  *           files to make this work.  Note that html on enables this or you   *
  2366.  *           will get normal annotation output in the .can file.  Final        *
  2367.  *           hashing changes made.  Now crafty has only two hash tables, the   *
  2368.  *           'depth preferred' and 'always store' tables, but not one for each *
  2369.  *           side.                                                             *
  2370.  *                                                                             *
  2371.  *   16.5    Minor glitch in internal iterative deepening code (in search.c)   *
  2372.  *           could sometimes produce an invalid move.  Crafty now probes the   *
  2373.  *           hash table to find the best move which works in all cases.        *
  2374.  *           Interesting tablebase bug fixed.  By probing at ply=2, the        *
  2375.  *           search could overlook a repetition/50 move draw, and turn a won   *
  2376.  *           position into a draw.  Crafty now only probes at ply > 2, to      *
  2377.  *           let the Repeat() function have a chance.  Added code by Dan       *
  2378.  *           Corbitt to add environment variables for the tablebases, books,   *
  2379.  *           logfiles and the .craftyrc file paths.  The environment variables *
  2380.  *           CRAFTY_TB_PATH, CRAFTY_BOOK_PATH, CRAFTY_LOG_PATH and             *
  2381.  *           CRAFTY_RC_PATH should point to where these files are located and  *
  2382.  *           offer an alternative to specifying them on the command line.      *
  2383.  *           Final version of the EGTB code is included in this version.  This *
  2384.  *           allows Crafty to use either compressed (using Andrew Kadatch's    *
  2385.  *           compressor, _not_ zip or gzip) or non-compressed tablebases.  It  *
  2386.  *           will use non-compressed files when available, and will also use   *
  2387.  *           compressed files that are available so long as there is no non-   *
  2388.  *           compressed version of the same file.  It is allowable to mix and  *
  2389.  *           match as you see fit, but with all of the files compressed, the   *
  2390.  *           savings is tremendous, roughly a factor of 5 in space reduction.  *
  2391.  *                                                                             *
  2392.  *   16.6    Major rewrite of king-safety pawn shelter code to emphasize open  *
  2393.  *           files (and half-open files) moreso than just pawns that have been *
  2394.  *           moved.  Dynamic EGTB probe depth removed.  This caused far too    *
  2395.  *           many search inconsistencies.  A fairly serious SMP bug that could *
  2396.  *           produce a few hash glitches was found.  Rewrite of the 'king-     *
  2397.  *           tropism' code completed.  Now the pieces that are 'crowding' the  *
  2398.  *           king get a bigger bonus if there are more of them.  Ie it is more *
  2399.  *           than twice as good if we have two pieces close to the king, while *
  2400.  *           before this was purely 'linear'.  Minor fix to book.c to cure an  *
  2401.  *           annotate command bug that would produce odd output in multi-game  *
  2402.  *           PGN files.                                                        *
  2403.  *                                                                             *
  2404.  *   16.7    Minor bug in 'book create' command would produce wrong line num-  *
  2405.  *           bers if you used two book create commands without restarting      *
  2406.  *           Crafty between uses.  Replaced "ls" command with a !cmd shell     *
  2407.  *           escape to allow _any_ command to be executed by a shell. Change   *
  2408.  *           to bishop scoring to avoid a bonus for a bishop pair _and_ a good *
  2409.  *           bishop sitting at g2/g7/etc to fill a pawn hole.  If the bishop   *
  2410.  *           fills that hole, the bishop pair score is reduced by 1/2 to avoid *
  2411.  *           scores getting too large.  Another ugly SMP bug fixed.  It was    *
  2412.  *           for the CopyFromSMP() function to fail because Search() put the   *
  2413.  *           _wrong_ value into tree->value.  The "don't castle into an unsafe *
  2414.  *           king position" code was scaled up a bit as it wasn't quite up to  *
  2415.  *           detecting all cases of this problem.  The parallel search has     *
  2416.  *           been modified so that it can now split the tree at the root, as   *
  2417.  *           well as at deeper nodes.  This has improved the parallel search   *
  2418.  *           efficiency noticably while also making the code a bit more        *
  2419.  *           complex.  This uses an an adaptive algorithm that pays close      *
  2420.  *           attention to the node count for each root move.  If one (or more) *
  2421.  *           moves below the best move have high node counts (indicating that  *
  2422.  *           these moves might become new 'best' moves) then these moves are   *
  2423.  *           flagged as "don't search in parallel" so that all such moves are  *
  2424.  *           searched one by one, using all processors so that a new best move *
  2425.  *           if found faster.  Positional scores were scaled back 50% and the  *
  2426.  *           king safety code was again modified to incorporate pawn storms,   *
  2427.  *           which was intentionally ignored in the last major revision.  Many *
  2428.  *           other scoring terms have been modified as well to attempt to      *
  2429.  *           bring the scores back closer to something reasonable.             *
  2430.  *                                                                             *
  2431.  *   16.8    Bug in evaluate.c (improper editing) broke the scoring for white  *
  2432.  *           rooks on open files (among other things.)  New twist on null-     *
  2433.  *           move search...  Crafty now uses R=3 near the root of the tree,    *
  2434.  *           and R=2 near the top.  It also uses null-move so long as there is *
  2435.  *           a single piece on the board, but when material drops to a rook or *
  2436.  *           less, null move is turned off and only used in the last 7 plies   *
  2437.  *           to push the zugzwang errors far enough off that they can be       *
  2438.  *           avoided, hopefully.                                               *
  2439.  *                                                                             *
  2440.  *   16.9    Tuning to king safety.  King in center of board was way too high  *
  2441.  *           which made the bonus for castling way too big.  More fine-tuning  *
  2442.  *           on the new 'tropism' code (that tries to coordinate piece attacks *
  2443.  *           on the king).  It understands closeness and (now) open files for  *
  2444.  *           the rooks/queens.  Modified blocked center pawn code so that an   *
  2445.  *           'outpost' in front of an unmoved D/E pawn is made even stronger   *
  2446.  *           since it restrains that pawn and cramps the opponent.             *
  2447.  *                                                                             *
  2448.  *   16.10   All scores are back to 16.6 values except for king safety, as     *
  2449.  *           these values played well.  King safety is quite a bit different   *
  2450.  *           and now has two fine-tuning paramaters that can be set in the     *
  2451.  *           crafty.rc file (try help ksafety for more details, or see the new *
  2452.  *           crafty.doc for more details.  Suffice it to say that you can now  *
  2453.  *           tune it to be aggressive or passive as you wish.                  *
  2454.  *                                                                             *
  2455.  *   16.11   Adjustment to king safety asymmetry to make Crafty a bit more     *
  2456.  *           cautious about starting a king-side attack.  New "ksafe tropism"  *
  2457.  *           command allows the tropism scores (pulling pieces toward opponent *
  2458.  *           king) to be adjusted up or down (up is more aggressive).          *
  2459.  *                                                                             *
  2460.  *   16.12   evaluation adjustment options changed.  The new command to modify *
  2461.  *           this stuff is "evaluation option value".  For example, to change  *
  2462.  *           the asymmetry scoring for king safety, you now use "evaluation    *
  2463.  *           asymmetry 120".  See "help evaluation" for more details.  There   *
  2464.  *           is a new "bscale" option to adjust the scores for 'blocked' type  *
  2465.  *           positions, and I added a new "blockers_list" so that players that *
  2466.  *           continually try to lock things up to get easy draws can be better *
  2467.  *           handled automatically.  The command is "list B +name".  There are *
  2468.  *           other adjustable evaluation scaling parameters now (again, use    *
  2469.  *           "help evaluation" to see the options.)                            *
  2470.  *                                                                             *
  2471.  *   16.13   Bug in Evaluate() fixed.  King safety could produce impossibly    *
  2472.  *           large scores due to negative subscript values.  Minor change to   *
  2473.  *           root.c to allow partial tablebase sets while avoiding the ugly    *
  2474.  *           potential draw problem.  This was supplied by Tim Hoooebeek and   *
  2475.  *           seems to work ok for those wanting to have files like kpk with-   *
  2476.  *           out the corresponding promotion files.                            *
  2477.  *                                                                             *
  2478.  *   16.14   Bug in Evaluate() fixed.  King safety could produce impossibly    *
  2479.  *           large scores due to a subscript two (2) larger than expected for  *
  2480.  *           max values.  A couple of other minor tweaks to rook on 7th as     *
  2481.  *           well.  Setboard now validates enpassant target square to be sure  *
  2482.  *           that an enpassant capture is physically possible, and that the    *
  2483.  *           target square is on the right rank with pawns in the right place. *
  2484.  *                                                                             *
  2485.  *   16.15   Bug in EGTBProbe() usage fixed.  It was possible to call this     *
  2486.  *           function before tablebases were initialized, or when there were   *
  2487.  *           more than 3 pieces on one side, which would break a subscript.    *
  2488.  *                                                                             *
  2489.  *   16.16   Changes to the way EvaluatePassedPawn() works.  It now does a     *
  2490.  *           reasonable job of penalizing blockaded passed pawns.  Also a bug  *
  2491.  *           in king scoring used a variable set from the previous call to the *
  2492.  *           Evaluate() procedure, which could produce bizarre effects.  A few *
  2493.  *           minor eval glitches that caused asymmetric scores unintentionally *
  2494.  *           were removed.                                                     *
  2495.  *                                                                             *
  2496.  *   16.17   Minor "hole" in SMP code fixed.  It was possible that a move      *
  2497.  *           displayed as the best in Output() would not get played.           *
  2498.  *           Very subtle timing issue dealing with the search timing out and   *
  2499.  *           forgetting to copy the best move back to the right data area.     *
  2500.  *           Minor fixes to the modified -USE_ATTACK_FUNCTIONS option that     *
  2501.  *           was broken when the And()/Or()/ShiftX() macros were replaced by   *
  2502.  *           their direct bitwise operator replacements.                       *
  2503.  *                                                                             *
  2504.  *   16.18   Adjustments to king tropism scoring terms (these attract pieces   *
  2505.  *           toward the opponent king in a coordinated way).  The scoring term *
  2506.  *           that kept the queen from going to the opposite side of the board  *
  2507.  *           was not working well which would also cause attacking problems.   *
  2508.  *           Razoring code has been disabled, as it neither helps or hurts on  *
  2509.  *           tactical tests, and it creates a few hashing problems that are    *
  2510.  *           annoying.  Bug in StoreTransRefPV() that would store the PV into  *
  2511.  *           the hash table, but possibly in the wrong table entry, which      *
  2512.  *           could stuff a bad move in a hash entry, or overwrite a key entry  *
  2513.  *           that could have been useful later.  Book random 0 was slightly    *
  2514.  *           wrong as it could not ignore book moves if the search said that   *
  2515.  *           the score was bad.  Also the search would not time-out properly   *
  2516.  *           on a forced move, it would use the entire time alotted which was  *
  2517.  *           a big waste of time when there was only one legal move to make.   *
  2518.  *           A very interesting bug was found in storing mate bounds in the    *
  2519.  *           hash table, one I had not heard of before.  Another change to     *
  2520.  *           Iterate() to make it avoid exiting as soon as a mate is found, so *
  2521.  *           that it can find the shortest mate possible.                      *
  2522.  *                                                                             *
  2523.  *   16.19   Savepos now pads each rank to 8 characters so that programs that  *
  2524.  *           don't handle abbreviated FEN will be able to parse Crafty's FEN   *
  2525.  *           output without problems.  Threads are no longer started and       *
  2526.  *           stopped before after searches that seem to not need multiple      *
  2527.  *           threads (such as when the starting position is in the databases   *
  2528.  *           or whatever) because in fast games, it can start and stop them    *
  2529.  *           after each search, due to puzzling for a ponder move, and this is *
  2530.  *           simply to inefficient to deal with, and burning the extra cpus is *
  2531.  *           only bad if the machine is used for other purposes.  And when the *
  2532.  *           machine is not dedicated to chess only, the SMP search is very    *
  2533.  *           poor anyway.  New lockless hashing (written by Tim Mann) added    *
  2534.  *           to improve SMP performance.  New eval term that handles various   *
  2535.  *           types of candidate passed pawns, most commonly the result of a    *
  2536.  *           position where one side has an offside majority that later turns  *
  2537.  *           into an outside passed pawn.  New EGTBPV() procedure added.  This *
  2538.  *           code will print the entire PV of a tablebase mating line.  If it  *
  2539.  *           given an option of ! (command is "egtb !") it will add a ! to any *
  2540.  *           move where there is only one optimal choice.  Crafty will now     *
  2541.  *           automatically display the EGTB PV if you give it a setboard FEN   *
  2542.  *           command, or if you just give it a raw FEN string (the setboard    *
  2543.  *           command is now optional except in test suites).  This version now *
  2544.  *           supports the 6 piece database files.  To include this support,    *
  2545.  *           you need to -DEGTB6 when compiling everything.  The majority code *
  2546.  *           has been temporarily removed so that this version can be released *
  2547.  *           to get the 6 piece ending stuff out.                              *
  2548.  *                                                                             *
  2549.  *   17.0    Connected passed pawn scoring modified so that connected passers  *
  2550.  *           don't get any sort of bonus, except for those cases where the     *
  2551.  *           opponent has a rook or more.  This will avoid liking positions    *
  2552.  *           where Crafty has two connected passers on the d/e files, and the  *
  2553.  *           opponent has passers on the b/g files.  The split passers win if  *
  2554.  *           all pieces are traded, while the connected passers are better     *
  2555.  *           when pieces are present.  A new scoring term evaluates the        *
  2556.  *           "split" passers similar to outside passers, this at the request   *
  2557.  *           (make that demand) of GM Roman Dzindzichashvili. Book() now finds *
  2558.  *           the most popular move as the move to ponder.  This eliminated all *
  2559.  *           'puzzling' searches which result in clearing the hash tables two  *
  2560.  *           times for every book move, which can slow it down when a large    *
  2561.  *           hash table is used.  New book option for playing against computer *
  2562.  *           opponents was written for this version.  Crafty now supports two  *
  2563.  *           "books.bin" type files, books.bin and bookc.bin (the bookc create *
  2564.  *           command can be used to make bookc.bin).  Bookc will only be used  *
  2565.  *           when Crafty is playing a computer.  This is supplied by xboard or *
  2566.  *           winboard when playing on a server, or can be included int the     *
  2567.  *           crafty.rc/.craftyrc file when playing directly.  Bookc.bin will   *
  2568.  *           be used when playing a computer only, and should be used to avoid *
  2569.  *           unsound lines that are fine against humans, but not against other *
  2570.  *           computers.  If you don't use a bookc.bin, it will use the normal  *
  2571.  *           books.bin as always.  If you use both, it will only use bookc.bin *
  2572.  *           in games that have been started and then given the 'computer'     *
  2573.  *           command.  Minor adjustment to EGTB probe code so that it will     *
  2574.  *           always probe TBs at ply=2 (if the right number of pieces are on   *
  2575.  *           the board) but won't probe beyond ply=2 unless the move at the    *
  2576.  *           previous ply was a capture/promotion and the total pieces drops   *
  2577.  *           into the proper range for TB probes.  This makes the 6 piece      *
  2578.  *           files far more efficient as before it would continuously probe    *
  2579.  *           after reaching 6 piece endings, even if it didn't have the right  *
  2580.  *           file.  now after the capture that takes us to a 6 piece ending    *
  2581.  *           we probe one time...  and if there is no hit we don't probe at    *
  2582.  *           the next node (or any successors) unless there is another capture *
  2583.  *           or promotion that might take us to a database we have.  The book  *
  2584.  *           (binary) format has once again been modified, meaning that to use *
  2585.  *           16.20 and beyond the book.bin/books.bin files must be re-built    *
  2586.  *           from the raw PGN input.  This new format includes an entry for    *
  2587.  *           the CAP project score, so that deep searches can be used to guide *
  2588.  *           opening book lines.  A new weight (bookw CAP) controls how much   *
  2589.  *           this affects book move ordering/selection.  A new import command  *
  2590.  *           will take the raw CAPS data and merge it into the book.bin after  *
  2591.  *           the file has been built.  Serious bug in SetBoard() would leave   *
  2592.  *           old EP status set in test suites.  This has been fixed.  Outpost  *
  2593.  *           knight code was modified so that a knight in a hole is good, a    *
  2594.  *           knight in a hole supported by a pawn is better, supported by two  *
  2595.  *           pawns is still better, and if the opponent has no knights or a    *
  2596.  *           bishop that can attack this knight it is even better.  The out-   *
  2597.  *           post bonus for a bishop was removed.  A pretty serious parallel   *
  2598.  *           search bug surfaced.  In non-parallel searches, Crafty _always_   *
  2599.  *           completed the current ply=1 move after the time limit is reached, *
  2600.  *           just to be sure that this move isn't going to become a new best   *
  2601.  *           move.  However, when parallel searching, this was broken, and at  *
  2602.  *           the moment time runs out, the search would be stopped if the      *
  2603.  *           parallel split was done at the root of the tree, which means that *
  2604.  *           where the search would normally find a new best move, it would    *
  2605.  *           not.  This has been fixed.  New "store <val>" command can be used *
  2606.  *           to make "position learning" remember the current position and the *
  2607.  *           score (val) you supply.  This is useful in analyze mode to move   *
  2608.  *           into the game, then let Crafty know that the current position is  *
  2609.  *           either lost or won (with a specific score).                       *
  2610.  *                                                                             *
  2611.  *   17.1    Book structure fixed, since compilers can't quite agree on how    *
  2612.  *           structures ought to be aligned, for reasons not clear to me.  A   *
  2613.  *           serious eval bug that could produce gross scores when one side    *
  2614.  *           had two queens was fixed.                                         *
  2615.  *                                                                             *
  2616.  *   17.2    Isolated pawn scoring tweaked a bit, plus a couple of bugs in the *
  2617.  *           way EvaluateDevelopment() was called were fixed.                  *
  2618.  *                                                                             *
  2619.  *   17.3    Passed pawn scores increased somewhat to improve endgame play.    *
  2620.  *                                                                             *
  2621.  *   17.4    Minor bug with "black" command (extra line from unknown origin)   *
  2622.  *           would make "black" command fail to do anything.  Minor tweaks to  *
  2623.  *           passed pawn scoring again...  And a slight performance improve-   *
  2624.  *           ment in how EvaluateKingSafety() is called.  Code for "bk"        *
  2625.  *           from xboard was somehow lost.  It now provides a book hint.       *
  2626.  *                                                                             *
  2627.  *   17.5    Rewrite of outside passed pawn/pawn majority code.  It is now     *
  2628.  *           much faster by using pre-computed bitmaps to recognize the right  *
  2629.  *           patterns.                                                         *
  2630.  *                                                                             *
  2631.  *   17.6    Minor fix in interrupt.c, which screwed up handling some commands *
  2632.  *           while pondering.  Minor fix to score for weak back rank.  Score   *
  2633.  *           was in units of 'defects' but should have been in units of        *
  2634.  *           "centipawns".   Minor bug in "drawn.c" could mis-classify some    *
  2635.  *           positions as drawn when they were not.                            *
  2636.  *                                                                             *
  2637.  *   17.7    Repair to DrawScore() logic to stop the occasional backward sign  *
  2638.  *           that could create some funny-looking scores (-20 and +20 for      *
  2639.  *           example).  Minor fix to majority code to recognize the advantage  *
  2640.  *           of having a majority when the opponent has no passers or majority *
  2641.  *           even if the candidate in the majority is not an 'outside' passer  *
  2642.  *           candidate.  Minor change to passed pawns so that a protected      *
  2643.  *           passed pawn is not considered a winning advantage if the          *
  2644.  *           opponent has two or more passed pawns.  But in input_status       *
  2645.  *           would cause an infinite loop if you reset a game to a position    *
  2646.  *           that was in book, after searching a position that was not in      *
  2647.  *           the book.  Bug in position learning fixed also.  This was caused  *
  2648.  *           by the new hashing scheme Tim Mann introduced to avoid locking    *
  2649.  *           the hash table.  I completed the changes he suggested, but forgot *
  2650.  *           about how it might affect the position learning since it is also  *
  2651.  *           hash-based.  Needless to say, I broke it quite nicely, thank you. *
  2652.  *                                                                             *
  2653.  *   17.8    This is the version used in the first ICC computer chess          *
  2654.  *           tournament.  Crafty won with a score of 7.0/8.0 which included    *
  2655.  *           only 2 draws and no losses.  Changes are minimal except for a few *
  2656.  *           non-engine syntax changes to eliminate warnings and fix a bad bug *
  2657.  *           in 'bench.c' that would crash if there was no books.bin file.     *
  2658.  *                                                                             *
  2659.  *   17.9    LearnPosition() called with wrong arguments from main() which     *
  2660.  *           effectively disabled position learning.  This was broken in 17.7  *
  2661.  *           but is now fixed.                                                 *
  2662.  *                                                                             *
  2663.  *   17.10   Minor change to "threat" extension now only extends if the null-  *
  2664.  *           move search returns "mated in 1" and not "mated in N".  This      *
  2665.  *           tends to shrink the trees a bit with no noticable effect in       *
  2666.  *           tactical strength.  EvaluatePawns() was not doing a reasonable    *
  2667.  *           job of recognizing blocked pawns and candidate passers.  It did   *
  2668.  *           not do well in recognizing that the pawn supporting a candidate   *
  2669.  *           could not advance far enough to help make a real passed pawn.     *
  2670.  *           Minor change to Repeat() to not count two-fold repeats as draws   *
  2671.  *           in the first two plies, which prevents some odd-looking repeats   *
  2672.  *           at the expense of a little inefficiency.  Ugly repetition bug     *
  2673.  *           fixed.  Rephead was off by one for whatever side Crafty was       *
  2674.  *           playing which would screw up repetition detection in some cases.  *
  2675.  *           Minor bug in main() that would report stalemate on some mates     *
  2676.  *           when the ponder score was forgotten.                              *
  2677.  *                                                                             *
  2678.  *   17.11   Fail high/low logic changed to move the ++ output into Iterate()  *
  2679.  *           where the -- output was already located.  (This was done for      *
  2680.  *           consistecy only, it was not a problem.  New function to detect    *
  2681.  *           draws RepetitionCheckBook() was added to count two-fold repeats   *
  2682.  *           as draws while in book.  This lets Crafty search to see if it     *
  2683.  *           wants tht draw or not, rather than just repeating blindly.  Minor *
  2684.  *           bug in "go"/"move" command fixed.  The command did not work if    *
  2685.  *           the engine was pondering.  Minor change to Evaluate() that makes  *
  2686.  *           BAD_TRADE code more acurate.  Minor change to pawn majority code  *
  2687.  *           to fix two bugs.  White pawns on g2/h2 with black pawn on h7 was  *
  2688.  *           not seen as a majority (outside candidate passer) but moving the  *
  2689.  *           black pawn to g7 made it work fine.   Also if both sides had an   *
  2690.  *           equal number of pawns (black pawn at a7/b7, white pawns at b2/c2  *
  2691.  *           the code would not notice black had an outside passer candidate   *
  2692.  *           since pawns were 'equal' in number.                               *
  2693.  *                                                                             *
  2694.  *   17.12   Bookup() will now create a book with all sorts of games in it, so *
  2695.  *           long as the various games have the FEN string to properly set the *
  2696.  *           initial chess board position.                                     *
  2697.  *                                                                             *
  2698.  *   17.13   Endgame evaluation problem fixed.  King scoring now dynamically   *
  2699.  *           chooses the right piece/square table depending on which side of   *
  2700.  *           the board has pawns, rather than using root pre-processing which  *
  2701.  *           could make some gross errors.  Glitch with majorities would make  *
  2702.  *           an "inside majority candidate" offset a real outside passed pawn  *
  2703.  *           even if the candidate would not be outside.  A suggestion by      *
  2704.  *           Blass Uri (CCC) was added.  This adds .01 to tablebase scores if  *
  2705.  *           the side on move is ahead in material, and -.01 if the side on    *
  2706.  *           move is behind in material (only for drawn positions.)  the       *
  2707.  *           intent is to favor positions where you are ahead in material      *
  2708.  *           rather than even in material, which gives 'swindle mode' a chance *
  2709.  *           to work.  Bug in EvaluateDraws() would mis-categorize some B+RP   *
  2710.  *           (wrong bishop) as drawn, even if the losing king could not make   *
  2711.  *           it to the corner square in time.                                  *
  2712.  *                                                                             *
  2713.  *   17.14   Another endgame evaluation problem fixed.  The outside passed     *
  2714.  *           pawn code worked well, up until the point the pawn had to be      *
  2715.  *           given up to decoy the other side's king away from the remainder   *
  2716.  *           of the pawns.  Crafty now understands the king being closer to    *
  2717.  *           the pawns than the enemy king, and therefore transitions from     *
  2718.  *           outside passer to won king-pawn ending much cleaner.  New command *
  2719.  *           "selective" as requested by S. Lim, which allows the user to      *
  2720.  *           set the min/max null move R values (default=2/3).  They can be    *
  2721.  *           set to 0 which disables null-move totally, or they can be set     *
  2722.  *           larger than the default for testing.  Minor changes to init.c     *
  2723.  *           sent by Eugene Nalimov to handle 64 bit pointer declarations for  *
  2724.  *           win64 executable compilation.  NetBSD changes included along with *
  2725.  *           a new Makefile that requires no editing to use for any known      *
  2726.  *           configuration ("make help" will explain how to use it).  This was *
  2727.  *           submitted by Johnny Lam.  Serious changes to the outside passed   *
  2728.  *           pawn code.  The evaluator now understands that outside passers    *
  2729.  *           on _both_ sides of the board is basically winning.  Same goes for *
  2730.  *           candidate passers.                                                *
  2731.  *                                                                             *
  2732.  *   18.0    Bug in EvaluateDraws() could incorrectly decide that if one side  *
  2733.  *           had only rook pawns in a king/pawn ending, the ending was a draw. *
  2734.  *           Even if the other side had pawns all over the board.  Passed pawn *
  2735.  *           scores increased a bit.  Minor change to "bad trade" code to turn *
  2736.  *           off in endings.  S list removed.  The trojan horse check is now   *
  2737.  *           automatically enabled when the key position is recognized at the  *
  2738.  *           root of the tree.  It is disabled once the key position is no     *
  2739.  *           longer seen at the root.  Bug in Bookup() would break if a FEN    *
  2740.  *           string was included in a game used for input.  SetBoard() was     *
  2741.  *           setting castling status incorrectly.  Internal iterative          *
  2742.  *           deepening bug could (on very rare occasions) cause Crafty to try  *
  2743.  *           to search an illegal move that would bomb the search.  This       *
  2744.  *           version fully supports the new xboard protocol version 2.  One    *
  2745.  *           other major change is that the eval is now consistently displayed *
  2746.  *           as +=good for white, -=good for black.  In the log file.  In the  *
  2747.  *           console output window.  And when whispering/kibitzing on a chess  *
  2748.  *           server.  This should eliminate _all_ confusion about the values   *
  2749.  *           that are displayed as there are now no exceptions to the above    *
  2750.  *           policy of any kind.  Book() was changed so that if it notices     *
  2751.  *           that the opponent has a "stonewall pattern" set up (IE Crafty     *
  2752.  *           is black, has a pawn at e7 or e6, and the opponent has pawns at   *
  2753.  *           d4/f4) then it won't play a castle move from book.  It will do a  *
  2754.  *           normal search instead and let the evaluation guide it on whether  *
  2755.  *           to castle or not (generally it won't unless it is forced).        *
  2756.  *                                                                             *
  2757.  *   18.1    Easy move code broken, so that no move ever appeared to be "easy" *
  2758.  *           even if it was the only possible recapture move to make.  A minor *
  2759.  *           problem in analysis mode dealing with pawn promotions was fixed.  *
  2760.  *           It was possible for a move like h8=Q to be rejected even though   *
  2761.  *           it was perfectly legal.                                           *
  2762.  *                                                                             *
  2763.  *   18.2    Minor bug in analyze mode would break the "h" command when black  *
  2764.  *           was on move, and show one less move for either side that had      *
  2765.  *           actually been played in the game.  Another bug also reversed the  *
  2766.  *           sign of a score whispered in analysis mode.  Recapture extension  *
  2767.  *           is disabled by default.  To turn it on, it is necessary to use    *
  2768.  *           -DRECAPTURE when compiling search.c and option.c.  LearnBook()    *
  2769.  *           has been modified to 'speed up' learning.  See the comments in    *
  2770.  *           that module to see how it was changed.  LearnResult() has been    *
  2771.  *           removed.  LearnBook() is now used to do the same thing, except    *
  2772.  *           that a good (or bad) score is used.                               *
  2773.  *                                                                             *
  2774.  *   18.3    Minor bug in "avoid_null_move" test used R=2 for the test rather  *
  2775.  *           than testing R=2/3 as the real null-move search uses.  The kibitz *
  2776.  *           for "Hello from Crafty Vx.xx" has been moved so that it works     *
  2777.  *           with the new xboard/winboard 4.2.2 versions.  Book learning was   *
  2778.  *           badly broken in the previous version and has been fixed/tested.   *
  2779.  *                                                                             *
  2780.  *   18.4    Recapture extension was left in SearchParallel() by mistake.      *
  2781.  *           This has now been protected by a #ifdef just like it was in       *
  2782.  *           Search().  Bug in Repeat() was causing problems in SMP versions.  *
  2783.  *           The entire repetition list code was modified to clean this up.    *
  2784.  *           The problem was most noticable on things like fine #70.  Bug in   *
  2785.  *           LearnImportBook() confused the learn value sign, due to the other *
  2786.  *           changes to make +=white all the time.  Opposite bishop scoring    *
  2787.  *           has been beefed up a bit to avoid these drawish endings.          *
  2788.  *                                                                             *
  2789.  *   18.5    Minor change to RootMove() to use Quiesce() rather than the more  *
  2790.  *           complicated way it was ordering with Evaluate()/EnPrise().  This  *
  2791.  *           is no faster, but it is simpler and eliminated the need for the   *
  2792.  *           EnPrise() function totally, making the code a bit smaller.  Bug   *
  2793.  *           in EvaluateDraws() would let it think that the bishop+wrong rook  *
  2794.  *           pawn endings were winnable if both kings were very close to the   *
  2795.  *           queening square, even with the wrong bishop.                      *
  2796.  *                                                                             *
  2797.  *   18.6    "New" no longer produces a new log.nnn/game.nnn file if no moves  *
  2798.  *           have actually been played.  Minor change to rook scoring gives a  *
  2799.  *           penalty when a rook has no horizontal (rank) mobility, to avoid   *
  2800.  *           moves like Ra2 protecting the pawn on b2, etc.  Glitch in the     *
  2801.  *           code that initializes is_outside[][] and is_outside_c[][] could   *
  2802.  *           cause missed outside pawn cases to happen.  This has been there   *
  2803.  *           a long time.                                                      *
  2804.  *                                                                             *
  2805.  *   18.7    BOOK_CLUSTER_SIZE increased to 2000 to handle making really large *
  2806.  *           books.  A book made without this change could produce clusters    *
  2807.  *           that would cause memory overwrites.                               *
  2808.  *                                                                             *
  2809.  *   18.8    Recapture extension turned back on for a while.  Changes to the   *
  2810.  *           evaluation code, particularly EvaluatePawns() to make it more     *
  2811.  *           efficient and accurate.  IE it was possible for an isolated pawn  *
  2812.  *           to be penalized for being isolated, weak, and blocked, which made *
  2813.  *           little sense.                                                     *
  2814.  *                                                                             *
  2815.  *   18.9    Book() modified to increase the responsiveness of book learning.  *
  2816.  *           The new code, plus the default weights for the book parameters    *
  2817.  *           now make Crafty learn very aggressively and repeat good opening   *
  2818.  *           lines and avoid bad ones.                                         *
  2819.  *                                                                             *
  2820.  *   18.10   Minor bug in book.c would let Crafty play lines that were very    *
  2821.  *           rarely played even though there were others that had been played  *
  2822.  *           far more times and were more reliable.  King safety scores ramped *
  2823.  *           up a bit and made more "responsive".                              *
  2824.  *                                                                             *
  2825.  *   18.11   Minor bug in EvaluateDevelopment() found by Bruce Moreland.  The  *
  2826.  *           pawn ram code is now disabled when playing a computer, although   *
  2827.  *           the normal 'blocked pawn' code is always active.  Bug in the code *
  2828.  *           that penalizes a rook with no horizontal mobility was fixed.  If  *
  2829.  *           the first rook scored had horizontal mobility, the second rook    *
  2830.  *           appeared to have this mobility as well, which was wrong.  Pawn    *
  2831.  *           hash statistics were wrong on longer searches due to an int       *
  2832.  *           overflow on a multiply and divide calculation.  This has been     *
  2833.  *           re-ordered to avoid the overflow.  For unknown reasons, epd       *
  2834.  *           support was disabled.  It is now enabled as it should be.  Some   *
  2835.  *           strange adjustements to root_alpha/root_beta were removed from    *
  2836.  *           searchr.c.  They were probably left-over from some sort of test.  *
  2837.  *                                                                             *
  2838.  *   18.12   Bug in EvaluateDraws() fixed to not call KBB vs KN a draw if the  *
  2839.  *           correct tablebase is not available.  Bishop pair scores now vary  *
  2840.  *           depending on how many pawns are left on the board.  A pair is not *
  2841.  *           worth a lot if there are 7-8 pawns left as most diagonals will be *
  2842.  *           blocked by pawns.  Test() modified so that it will now run using  *
  2843.  *           an EPD test suite with am/bm and id tags.  The old testfile for-  *
  2844.  *           mat will continue to work for a while, but Test() now notices the *
  2845.  *           EPD format and processes it correctly.  A new way of handling the *
  2846.  *           search extensions is in place.  With the old approach, one ply    *
  2847.  *           could not extend more than one full ply.  With the new approach,  *
  2848.  *           borrowed from Deep Blue, two consecutive plies can not extend     *
  2849.  *           more than two plies total.  It averages out to be the same, of    *
  2850.  *           course, but the effect is a bit different.  Now it is possible    *
  2851.  *           for a check and recapture to be applied at the same ply, where    *
  2852.  *           they could not before (since a check was already a full one-ply   *
  2853.  *           extension).  Whether this is better or not is not clear yet, but  *
  2854.  *           it is worth careful analysis.  EvaluateDraws() has been replaced  *
  2855.  *           by EvaluateWinner().  This function returns an indicator that     *
  2856.  *           specifices whether white, black, both or neither can win in the   *
  2857.  *           present position.                                                 *
  2858.  *                                                                             *
  2859.  *   18.13   Deep Blue extension limit removed and restored to one ply of      *
  2860.  *           extension per ply of search.  Pruning in q-search fixed so that   *
  2861.  *           a capture will be considered if it takes the total material on    *
  2862.  *           the board down to a bishop or less for the opponent, as that can  *
  2863.  *           greatly influence the evaluation with the EvaluateWinner() code.  *
  2864.  *           As the 50 move rule draws near, the hash table scores are marked  *
  2865.  *           as invalid every 5 moves so that hashing can't hide potential     *
  2866.  *           50-move-rule draws.  Lazy evaluation code modified to be more     *
  2867.  *           conservative, since in endgames the positional score can be a     *
  2868.  *           large change.  EvaluatePassedPawnRaces() fixed so that if one     *
  2869.  *           side has two pawns that are far enough apart, it will recognize   *
  2870.  *           that even though the king is "in the square" of either, it can't  *
  2871.  *           always stay in the square of one if it has to capture the other.  *
  2872.  *           Pawn hash signature restored to 64 bits after testing proved that *
  2873.  *           32 was producing an unacceptable number of collisions.  Search    *
  2874.  *           node counter is now 64 bits as well to avoid overflows.  Bug in   *
  2875.  *           the outside passed pawn code fixed (bad mask).                    *
  2876.  *                                                                             *
  2877.  *   18.14   Minor bug in ResignOrDraw() code caused Crafty to not offer draws *
  2878.  *           although it would accept them when appropriate.  Rook vs Minor    *
  2879.  *           is now evaluated as "neither side can win" an oversight in the    *
  2880.  *           EvaluateWinner() code.  Minor bug in ResignOrDraw() would fail to *
  2881.  *           offer draws due to the +0.01/-0.01 draw scores returned by the    *
  2882.  *           EGTB probe code.                                                  *
  2883.  *                                                                             *
  2884.  *   18.15   Change in endgame draw recognition to handle the case where one   *
  2885.  *           side appears to be in a lost ending but is stalemated.  The code  *
  2886.  *           now evaluates such positions as "DrawScore()" instead.  The code  *
  2887.  *           to accept/decline draws has been modified.  When a draw offer is  *
  2888.  *           received, a global variable "draw_offer_pending" is set to 1.     *
  2889.  *           When the search for a move for Crafty terminates, Crafty then     *
  2890.  *           uses this value to decide whether to accept or decline the draw.  *
  2891.  *           This means that the accept/decline won't happen until _after_ the *
  2892.  *           search has a chance to see if something good is happening that    *
  2893.  *           should cause the draw to be declined, closing a timing hole that  *
  2894.  *           used to exist that let a few "suspects" get away with draws that  *
  2895.  *           should not have happened (ie Crafty has - scores for a long time, *
  2896.  *           the opponent suddenly fails low and sees he is losing and offers  *
  2897.  *           a draw quickly.  Crafty would accept before doing a search and    *
  2898.  *           noticing that it was suddenly winning.)  minor evaluation change  *
  2899.  *           to notice that K+B+right RP vs K+B is not necessarily won if the  *
  2900.  *           weaker side has a bishop of the right color.                      *
  2901.  *                                                                             *
  2902.  *   19.0    Significant change to the search extension limits.  First, the    *
  2903.  *           limit of no more than 1 ply of extensions per ply has been tossed *
  2904.  *           out.  Now, any number of extensions are allowed in the first N    *
  2905.  *           plies, where N=iteration_depth of the current iteration.  After   *
  2906.  *           the first N plies, extensions are reduced by 50% for the next N   *
  2907.  *           plies.  They are then reduced by another 50% for the next N plies *
  2908.  *           and then completely disabled after that.  IE for a 12 ply search, *
  2909.  *           all extensions (even > one ply) are allowed for the first 12      *
  2910.  *           plies, then the extensions are reduced by 1/2 for the next 12     *
  2911.  *           plies, then by 1/4 for the next 12 plies, then turned off from    *
  2912.  *           that point forward.  Minor tweak (suggested by GCP) to reduce the *
  2913.  *           time limit by 1/4 for ponder=off games was done in time.c.  Fix   *
  2914.  *           to EvaluateWinner() to correctly realize that KR[BN] vs KRR is a  *
  2915.  *           draw for the KRR side if it doesn't have at least a pawn left.    *
  2916.  *           Minor bug in RejectBookMove() would reject all moves if the op-   *
  2917.  *           ponent had a stonewall-type pawn set-up.  It was supposed to only *
  2918.  *           reject castling into the attack.  Minor change to code in the     *
  2919.  *           EvaluateMaterial() function to lower the penalty for sacrificing  *
  2920.  *           the exchange.  it was considered just as bad as trading a rook    *
  2921.  *           for two pawns which was wrong.  Change to hashing code so that we *
  2922.  *           can now determine that a hash entry came from the EGTB so that    *
  2923.  *           PVs are displayed with <EGTB> when appropriate, not <EGTB> if it  *
  2924.  *           originally came from the EGTB but later <HT> when it was picked   *
  2925.  *           up from the hash table instead.  Minor changes to search/searchmp *
  2926.  *           to make them identical in "look" where possible, for consistency  *
  2927.  *           in source reading if nothing else.  If the first argument on the  *
  2928.  *           command-line is "xboard" or if the environment variable           *
  2929.  *           "CRAFTY_XBOARD" is set, Crafty sends a "feature done=0" command   *
  2930.  *           to tell xboard it has not yet initialized things.  Significant    *
  2931.  *           changes to EvaluateWinner() to recognize new cases of draws such  *
  2932.  *           as Q+minor+nopawns vs Q+pawns as unwinnable by the Q+minor side.  *
  2933.  *           Other cases were fixed/improved as well.                          *
  2934.  *                                                                             *
  2935.  *   19.1    Changes to the outside passed pawn and outside candidate pawn     *
  2936.  *           code to more correctly recognize when one side has a simple end-  *
  2937.  *           game position that is easy to win.  Futility pruning and razoring *
  2938.  *           (Jeremiah Penery) was added.  To endable it, you will need to add *
  2939.  *           -DFUTILITY to the Makefile options, otherwise it is disabled by   *
  2940.  *           default.  EvaluateWinner() had a bug dealing with KR vs KN or     *
  2941.  *           KRR vs KRN(B) that has been fixed.                                *
  2942.  *                                                                             *
  2943.  *   19.2    CCT-5 version 01/20/03.                                           *
  2944.  *           Changes to the LimitExtensions() macro.  The extensions are now   *
  2945.  *           a bit more aggressive, but after 2*iteration_depth, then they     *
  2946.  *           taper off smoothly so that by the time the depth reaches          *
  2947.  *           4*iteration_depth, the extensions are cut to zero.  Fixed bug in  *
  2948.  *           EvaluatePawns() that missed candidate passed pawns so that the    *
  2949.  *           new endgame stuff didn't work completely.  Change to hash.c to    *
  2950.  *           combine the two hash tables into one so that the two probed       *
  2951.  *           entries are adjacent in memory to be more cache friendly.  A bug  *
  2952.  *           in moving a replaced entry from depth-preferred to always-store   *
  2953.  *           caused the moved entry to go to the wrong address which would     *
  2954.  *           make it impossible to match later.  New hash table layout is more *
  2955.  *           cache-friendly by putting one entry from depth-preferred table    *
  2956.  *           with two entries from always-store, so that they often end up in  *
  2957.  *           the same cache-line.                                              *
  2958.  *                                                                             *
  2959.  *   19.3    Change to EvaluateMaterial to realize that a rook for five pawns  *
  2960.  *           is also likely a "bad trade."  Adaptive hash table size code was  *
  2961.  *           added so that the hash size is set automatically based on the     *
  2962.  *           estimated NPS and time per move values for a specific "level"     *
  2963.  *           command setting.  Repeat() rewritten.  The old code had an        *
  2964.  *           unexplained bug that would overlook repetitions in a parallel     *
  2965.  *           search in rare cases.  The old cold was complex enough that it    *
  2966.  *           was time to rewrite it and simplify it significantly.             *
  2967.  *                                                                             *
  2968.  *   19.4    Initial depth "seed" value changed to iteration_depth + 1/2 ply,  *
  2969.  *           so that fractional extensions kick in earlier rather than deeper  *
  2970.  *           in the search.  This performs _much_ better in tactical tests     *
  2971.  *           such as WAC and similar suites.  Minor book fix for a bug that    *
  2972.  *           could cause a crash with book=off in xboard/winboard.             *
  2973.  *                                                                             *
  2974.  *   19.5    Default draw score set to 1, because endgame table draws can be   *
  2975.  *           0, -.01 or +.01, which translates to -1, 0 or 1 in real scores    *
  2976.  *           inside Crafty.  +1 means a draw where white has extra material    *
  2977.  *           and that would break accepting draws with such a score.  A few    *
  2978.  *           NUMA-related changes.  One global variable was made thread-       *
  2979.  *           private to avoid cache thrashing.  Split blocks are now allocated *
  2980.  *           by each individual processor to make them local to the specific   *
  2981.  *           processor so that access is much faster.  CopyToSMP() now tries   *
  2982.  *           to allocate a block for a thread based on the thread's ID so that *
  2983.  *           the split block will be in that thread's local memory.  A few     *
  2984.  *           other NUMA-related changes to help scaling on NUMA machines.      *
  2985.  *                                                                             *
  2986.  *   19.6    New egtb.cpp module that cuts decompression indices memory by 50% *
  2987.  *           with no harmful side-effects.  Fixes to NUMA code to make SMP and *
  2988.  *           non-SMP windows compiles go cleanly.                              *
  2989.  *                                                                             *
  2990.  *   19.7    Changes to draw code so that Crafty will first claim a draw and   *
  2991.  *           then play the move, to avoid any confusion in whether the draw    *
  2992.  *           was made according to FIDE rules or not.  Minor bug in evaluate() *
  2993.  *           dealing with candidate passed pawns fixed.  A few additions to    *
  2994.  *           support my AMD Opteron inline assembly for MSB(), LSB()           *
  2995.  *           and PopCnt() procedures.                                          *
  2996.  *                                                                             *
  2997.  *   19.8    Changes to lock.h to (a) eliminate NT/alpha, since Microsoft no   *
  2998.  *           longer supports the alpha, which makes lock.h much more readable. *
  2999.  *           CLONE is no longer an option either, further simplyfying the .h   *
  3000.  *           files.  New mode option "match" which sets an aggressive learning *
  3001.  *           mode, which is now the default.  The old learning mode can be set *
  3002.  *           by using the command "mode normal".  Memory leak in new windows   *
  3003.  *           NUMA code fixed by Eugene Nalimov.  AMD fix to make the history   *
  3004.  *           counts thread-local rather than global (to avoid excessive cache  *
  3005.  *           invalidate traffic).                                              *
  3006.  *                                                                             *
  3007.  *   19.9    Two new pieces of code submitted by Alexander Wagner.  The first  *
  3008.  *           adds speech to Crafty for unix users.  /opt/chess/sounds needs to *
  3009.  *           exist and the common/sounds.tar.gz file needs to be untarred in   *
  3010.  *           directory.  "Speech on*off" controls it.  A new annotatet command *
  3011.  *           outputs the annotated file in LaTeX format for those that prefer  *
  3012.  *           that platform.  Lots of source reformatting to make indenting and *
  3013.  *           other things more consistent, using the unix "indent" utility.    *
  3014.  *           Singular extension (simplistic approach) has been added and needs *
  3015.  *           -DSINGULAR to activate it.  Once it has been compiled in, you can *
  3016.  *           turn it on/off by setting the singular extension depth using the  *
  3017.  *           ext command.  Default is on if you compile it in.  Ext/sing=0     *
  3018.  *           disable it.  Changes to non-COMPACT_ATTACKS code to shrink the    *
  3019.  *           array sizes.  This was done primarily for the Opteron where the   *
  3020.  *           COMPACT_ATTACKS stuff was a bit slower than the direct look-up    *
  3021.  *           approach.  This change reduced the table sizes by 75%.  A small   *
  3022.  *           change to Evaluate() to better handle the 50-move draw problem.   *
  3023.  *           What used to happen was when the counter hit 100 (100 plies since *
  3024.  *           last capture or pawn push) the score just dumped to DrawScore()   *
  3025.  *           instantly.  It was possible that by the time the draw was seen,   *
  3026.  *           it was too late to do anything to avoid it without wrecking the   *
  3027.  *           position.  what happens now is that once the 50-move counter      *
  3028.  *           reaches 80 plies (40 moves by both sides with no pawn push or     *
  3029.  *           capture) the score starts dropping toward DrawScore() no matter   *
  3030.  *           which side is winning.  Dave Slate called this a "weariness       *
  3031.  *           factor" in that after playing 40 moves with no progress, the      *
  3032.  *           evaluation shows that the program is getting "weary".  The idea   *
  3033.  *           is that the score starts to slip over the last 10 moves by each   *
  3034.  *           side to that if either can do something to reset the counter,     *
  3035.  *           they will do it sooner rather than later.                         *
  3036.  *                                                                             *
  3037.  *   19.10   A fix to the EvaluateWinner() code to recognize that while KRB vs *
  3038.  *           KR can not normally be won by the KRB side, we require that the   *
  3039.  *           KR side not be trapped on the edge of the board, where it can be  *
  3040.  *           mated.  FUTILITY code put back in.  19.9 will be the SE version   *
  3041.  *           for those wanting to play with it.  New "learn" command option to *
  3042.  *           allow the user to set the position learning parameters that are   *
  3043.  *           used to trigger position learning and disable position learning   *
  3044.  *           after the game is already lost.  The command syntax is as follows *
  3045.  *           "learn trigger cutoff" and are expressed as fractions of a pawn   *
  3046.  *           with a decimel point.  The default is learn .33 -2.0 which says   *
  3047.  *           to do position learning when the score drops 1/3 of a pawn, but   *
  3048.  *           turn it off after the score reaches -2.00 as the game is already  *
  3049.  *           lost and learning won't help at this point.  This is the CCT-6    *
  3050.  *           version exactly as played in the CCT-6 tournament.                *
  3051.  *                                                                             *
  3052.  *   19.11   A fix to the Annotate() code that could, in certain cases, fail   *
  3053.  *           to display N moves when asked.  This happened when there were     *
  3054.  *           fewer than N moves total, and on occasion it would not display    *
  3055.  *           all the moves that were possible, omitting the last one.  Fix to  *
  3056.  *           egtb.cpp to correctly set 16 bit index mode for a few of the      *
  3057.  *           recent 6-piece tables.                                            *
  3058.  *                                                                             *
  3059.  *   19.12   Fix to allocating split blocks that did not let all blocks get    *
  3060.  *           used, which would produce slow-downs on large parallel boxes      *
  3061.  *           (cpus > 8-16).  Change to fail-high/fail-low window adjustment.   *
  3062.  *           I now use the old Cray Blitz approach ("Using time wisely -       *
  3063.  *           revisited", JICCA) where a fail-high (or low) now adjusts the     *
  3064.  *           root alpha or beta bound by 1 pawn on the first fail, another two *
  3065.  *           pawns on the second failure, and finally relaxes the bound to     *
  3066.  *           +/- infinity on the third fail for the same move.  This speeds up *
  3067.  *           searching many fail-high/fail-low conditions, although it will    *
  3068.  *           occasionally cause the search to take a bit longer.               *
  3069.  *                                                                             *
  3070.  *   19.13   Fix to evaluating split passed pawns.  Code is cleaner and is not *
  3071.  *           applied if the opposing side has any pieces at all since a piece  *
  3072.  *           and the king can stop both.  New egtb.cpp that opens the tables   *
  3073.  *           approximately 20-25% faster is included in this version (code by  *
  3074.  *           Eugene Nalimov of course).                                        *
  3075.  *                                                                             *
  3076.  *   19.14   New "eval" command (eval list and eval help to start) allow a     *
  3077.  *           user to modify all internal evaluation values via commands that   *
  3078.  *           may be entered directly or via the .craftyrc/crafty.rc init file. *
  3079.  *           This was mainly done for the automated evaluation tuning project  *
  3080.  *           I am working on with Anthony Cozzie, but it will be useful for    *
  3081.  *           merging Mike Byrne's "personality" stuff as well.  New command    *
  3082.  *           "personality load/save <filename>" which saves eval and search    *
  3083.  *           parameters to create new personalities that can be loaded at any  *
  3084.  *           time.  "Crafty.cpf" is the "default" personality file that is     *
  3085.  *           used at start-up if it exists.  Evaluation tuning changes based   *
  3086.  *           on some results from the new annealing code, although all of the  *
  3087.  *           annealed values are not yet fully understood nor utilized yet.    *
  3088.  *           LearnBook() is now used to learn good and bad game results.  IE   *
  3089.  *           if Crafty wins with a particular opening, it will remember it as  *
  3090.  *           good and try it again, in addition to the previous method that    *
  3091.  *           would remember bad openings and avoid them.  It also now handles  *
  3092.  *           draws as well which can make slightly bad openings appear better. *
  3093.  *           Minor change to SMP code to eliminate the possibility of a shared *
  3094.  *           variable getting overwritten unintentionally.  Several changes to *
  3095.  *           evaluation weights and evaluation code as testing for the WCCC    *
  3096.  *           continues.  New "help" command uses a file "crafty.hlp" which now *
  3097.  *           contains all the help information.  This makes the help info      *
  3098.  *           easier to maintain and gets rid of a bunch of printf()s in the    *
  3099.  *           Option() source (option.c).  Rewrite of the "list" code.  Crafty  *
  3100.  *           now supports six lists, AK (auto-kibitz), B (blocker), C (comp),  *
  3101.  *           GM, IM and SP (special player).  The SP list has two extra items  *
  3102.  *           that can be specified to go with a player's name, namely a book   *
  3103.  *           filename (to replace the normal books.bin, but not book.bin) and  *
  3104.  *           a personality file that will be loaded each time this particular  *
  3105.  *           named opponent plays.  The format is available in the new help    *
  3106.  *           facility.  Bug fix for outside passed pawn code that would cause  *
  3107.  *           an outside passer to appear to be a winning advantage even if the *
  3108.  *           opponent has a protected passer, which easily negates the outside *
  3109.  *           passer's threat.                                                  *
  3110.  *                                                                             *
  3111.  *   19.15   Fix to outside passed pawn code that requires pawns on both sides *
  3112.  *           of the board for the side with an "outside passer" or "outside    *
  3113.  *           candidate" to avoid some bizarre evaluations. Sel 0/0 now works   *
  3114.  *           without crashing Crafty.  This would fail in previous versions as *
  3115.  *           the hash signature would be modified but not restored.  Slightly  *
  3116.  *           more conservative limit on using null-move search to head off a   *
  3117.  *           few notable zugzwang problems was added.  Fix to time control     *
  3118.  *           code to remove a hole that could cause a divide-by-zero at a time *
  3119.  *           control boundary.  Stonewall detection removed completely as it   *
  3120.  *           appears to be no longer needed.  Rook scoring changed to better   *
  3121.  *           evaluate "open files" by measuring mobility on them.  Complete    *
  3122.  *           removal of Phase() (phase.c) and references to the opening,       *
  3123.  *           middlegame and endgame phases as they were no longer referenced   *
  3124.  *           anywhere in the code.                                             *
  3125.  *                                                                             *
  3126.  *   19.16   Fix to "Trojan code" to eliminate the time limit exclusion since  *
  3127.  *           many users still have old and slow hardware, and the time limit   *
  3128.  *           was not set correctly when PreEvaluate() was called anyway.  The  *
  3129.  *           code to display fail-high/fail-low information was cleaned up so  *
  3130.  *           that the +1 or +3 now makes sense from the black side where the   *
  3131.  *           score is really going down (good for black) rather than showing   *
  3132.  *           a +3 fail high (when Crafty is black) and the score is really     *
  3133.  *           going to drop (get better for black).  Now the fail-high-fail-low *
  3134.  *           +/- sign is also relative to +=good for white like the scores     *
  3135.  *           have been for years.  Adjustments to pawn evaluation terms to     *
  3136.  *           improve the scoring balance.  "New" now terminates parallel       *
  3137.  *           threads (they will be re-started when needed) so that we don't    *
  3138.  *           burn CPU time when not actually playing a game.                   *
  3139.  *                                                                             *
  3140.  *   19.17   Changes to pawn evaluation to limit positional scores that could  *
  3141.  *           get a bit out of sane boundaries in some positions.               *
  3142.  *                                                                             *
  3143.  *   19.18   ProbeTransRef() no longer adjusts alpha/beta bounds if the entry  *
  3144.  *           is not good enough to terminate the search here.  This has helped *
  3145.  *           speed things up (reduced size of tree) over many test positions   *
  3146.  *           so either it was buggy or not worthwhile.  Regardless, it is now  *
  3147.  *           'gone'.  Connected passed pawns now scored as a simple pair of    *
  3148.  *           pawns that are better as they are advanced, the old connected     *
  3149.  *           passed pawns on the 6th rank special code has been removed.       *
  3150.  *                                                                             *
  3151.  *   19.19   Repeat3x() had a bug that would cause it to miss a draw claim on  *
  3152.  *           the 50th move, often making a strange (losing) move that would    *
  3153.  *           not lose if the draw is was claimed, but which would cause a loss *
  3154.  *           if the draw was not claimed because the piece might be instantly  *
  3155.  *           captured if the opponent can play a move.                         *
  3156.  *                                                                             *
  3157.  *   19.20   Bug in the EvaluateMaterial() (bad trade) code that would not     *
  3158.  *           penalize a single piece vs 3 pawns properly.  Now the penalty is  *
  3159.  *           added in unless the side with the piece has nothing else to go    *
  3160.  *           with it at all (no pawns or other pieces).  Pawn scoring changed, *
  3161.  *           doubled pawns were scored too badly because the penalties were    *
  3162.  *           added twice (as expected) but they were set as if they were just  *
  3163.  *           added once.  Eval command also had a bug in displaying the pawn   *
  3164.  *           evaluation parameters.  Move input changed to accept pawn         *
  3165.  *           promotions of the form a8Q (this is needed as ChessBase violates  *
  3166.  *           the PGN/SAN standard that mandates a8=Q as the proper syntax for  *
  3167.  *           pawn promotions.)  annoying glitch in epdglue.c that would        *
  3168.  *           produce the wrong score for positions with exactly one legal move *
  3169.  *           was fixed.  New InvalidPosition() function verifies that FEN      *
  3170.  *           setup positions are reasonable, without extra pawns or too many   *
  3171.  *           pieces total, etc.  Passed pawn to 7th search extension removed,  *
  3172.  *           mate threat extension tuned down to 1/2 ply.  Bug in SetBoard()   *
  3173.  *           fixed.  This bug made it impossible to import many epd records    *
  3174.  *           due to incorrectly handling the wtm flag.  This was introduced in *
  3175.  *           the recent changes to disallow certain types of illegal positions *
  3176.  *           that were impossible (more than 9 queens of one color, etc.) new  *
  3177.  *           eval term for space added.  This simply counts the number of      *
  3178.  *           squares on each rank attacked by pawns, and then multiplies by a  *
  3179.  *           constant that scales the attacks so that attacking ranks on the   *
  3180.  *           opponent's side of the board is more valuable than attacking      *
  3181.  *           squares on our side of the board and vice-versa.  Significant     *
  3182.  *           coding changes for the unix parallel search.  POSIX threads are   *
  3183.  *           gone, due to too many differences between vendor's implementation *
  3184.  *           details.  Crafty now uses SYSV shared memory to share the search  *
  3185.  *           data (this is exactly the same parallel search approach always    *
  3186.  *           used, but with a completely different implementation) and fork()  *
  3187.  *           to spawn processes for each CPU.  It simply became too much work  *
  3188.  *           to figure out what each vendor was doing about CPU time, how      *
  3189.  *           threads were scheduled, plus debug thread library implementations *
  3190.  *           that were often buggy.  There are no performance benefits to this *
  3191.  *           approach other than falling back to features found in all Unix    *
  3192.  *           implementations.  New NUMA changes to make sure that the local    *
  3193.  *           thread "blocks" are actually allocated on the NUMA node where     *
  3194.  *           the process actually runs, rather than on a remote node that      *
  3195.  *           will cause extra memory latency for often-used memory data.  Bug  *
  3196.  *           in EvaluatePawns() caused the outside passer / outside            *
  3197.  *           candidate bonus to be triggered when the opponent has a simple    *
  3198.  *           protected passed pawn.  Since the decoy value is nil with a       *
  3199.  *           protected passer (we can't take the supporing pawn or the passer  *
  3200.  *           will run) the outside candidate or passer doesn't help.  Bug in   *
  3201.  *           king safety caused pieces to be attracted to the opponent's king, *
  3202.  *           even in simple endgames, inflating/deflating the score for a      *
  3203.  *           feature that was pointless.  (2005 WCCC final version).           *
  3204.  *                                                                             *
  3205.  *   20.0    First in a new series.  First change is to produce an endian-     *
  3206.  *           independent opening book.  The format has not changed so that old *
  3207.  *           book.bin/books.bin files will work fine, but they may now be      *
  3208.  *           freely between big-endian and little-endian architectures.  This  *
  3209.  *           makes the binary format compatible between a PC and a Sun or HP   *
  3210.  *           box, for example, so that just one book.bin file is needed.       *
  3211.  *                                                                             *
  3212.  *   20.1    First step toward a complete redesign of the evaluation code in   *
  3213.  *           Evaluate() (evaluate.c).  This first set of changes are mainly    *
  3214.  *           restructuring related, an attempt to collect the various bits of  *
  3215.  *           evaluation code that are related to a common theme (i.e. All      *
  3216.  *           bishop scoring, all passed pawn scoring, etc) are not contained   *
  3217.  *           in one routine, with a sensible name.  This makes it much easier  *
  3218.  *           to find evaluation code and modify it, without having bits and    *
  3219.  *           pieces scattered all over the place.  Perhaps the most signifi-   *
  3220.  *           cant is that the current evaluation has dropped the asymmetric    *
  3221.  *           king safety, and later the asymmetric blocked pawn code will go   *
  3222.  *           as well.  To do this, I did have to make some changes in terms    *
  3223.  *           of the "tropism" code.  The basic idea is that white's "tropism"  *
  3224.  *           bonus in incremented for each white piece that attacks the black  *
  3225.  *           king, but it is also decrement for each black piece that attacks  *
  3226.  *           the black king, so that a defender offsets an attacker.  This has *
  3227.  *           certainly changed the "personality" of how it plays.  It is now   *
  3228.  *           far more aggressive, and further changes planned for the future   *
  3229.  *           will hopefully improve on this change.  It is playing quite a bit *
  3230.  *           better, but whether this aggressiveness is "over the top" remains *
  3231.  *           to be seen.  Fix to "won kp ending" logic.  If one king is closer *
  3232.  *           to the opponent's "average pawn square" than the other, by at     *
  3233.  *           least 2 moves, then that side is credited as having a won k+p     *
  3234.  *           ending. New code for time allocation testing added.  A new        *
  3235.  *           "timebook <factor> <moves>" command that says use "factor" extra  *
  3236.  *           time (factor is expressed as a percent, 100 means use 100% extra  *
  3237.  *           time) tapered off for "moves" out of book.  For example,          *
  3238.  *           "timebook 100 10" says use 100% extra time on first non-book move *
  3239.  *           followed by 90% extra on the next move, 80% on the next, until    *
  3240.  *           after 10 moves we are back to the normal time average.            *
  3241.  *                                                                             *
  3242.  *   20.2    Significant evaluation changes to try to limit positional scores  *
  3243.  *           so that new tuning can be accomplished.  In particular, the king  *
  3244.  *           safety code has been greatly simplified, now having two separate  *
  3245.  *           components, one for pawn structure, one for piece tropism.  A new *
  3246.  *           SearchControl() procedure now handles all the search extensions   *
  3247.  *           in one centralized place, shared by normal and parallel search    *
  3248.  *           code.  The plan is that eventually this piece of code will also   *
  3249.  *           be able to recommend search reductions as well as extensions to   *
  3250.  *           speed the tree traversal process significantly with a form of     *
  3251.  *           of forward pruning that is commonly called "search reductions".   *
  3252.  *                                                                             *
  3253.  *   20.3    Search reduction code added.  Part of this dates back to 1997     *
  3254.  *           when Bruce Moreland and I played with the idea of reducing the    *
  3255.  *           depth on the last part of the move list when it seemed to become  *
  3256.  *           fairly certain that no fail-high was going to happen.  That was a *
  3257.  *           big search speed improvement, but also risky.  Recently, several  *
  3258.  *           started to do this again, except they added one fairly useful     *
  3259.  *           constraint, that the "history value" for a specific move has to   *
  3260.  *           be below some threshold before a reduction can happen.  The idea  *
  3261.  *           is that we don't want to reduce the depth of moves that have      *
  3262.  *           failed high in the past, because they might fail high again if    *
  3263.  *           they are not reduced too much.  Tord Romstad suggested an         *
  3264.  *           additional improvement, namely that if a reduced move does fail   *
  3265.  *           high, re-search with the proper (non-reduced) depth to verify     *
  3266.  *           that it will fail high there as well.  All of this is included    *
  3267.  *           in version 20.3, but the values (reduction amount, history        *
  3268.  *           threshold, min depth to do a reduction) need serious testing and  *
  3269.  *           tuning.  The current values are simply "legal" but hardly could   *
  3270.  *           be considered optimal without substantial testing.  New code to   *
  3271.  *           "age" history counters added.  After each iteration, this code    *
  3272.  *           divides each counter by 2, to scale the values back, so that      *
  3273.  *           moves that are no longer causing fail highs will have a history   *
  3274.  *           value that won't prevent reduction pruning.  The "minimum depth"  *
  3275.  *           value indicates how much search to leave after doing a reduction  *
  3276.  *           in the tree.  A value of 1 ply guarantees that after a reduction  *
  3277.  *           is done, there will always be one full-width ply of search done   *
  3278.  *           after such reductions to avoid gross tactical oversights.  Tuning *
  3279.  *           to extensions to reduce the tree size.  The recapture extension   *
  3280.  *           has been completely removed, while the check extension has been   *
  3281.  *           left at 1.0 as in the past.  The mate threat and one-legal-reply  *
  3282.  *           extensions are now both set to .75 after extensive testing.  This *
  3283.  *           is the CCT8 version of Crafty.                                    *
  3284.  *                                                                             *
  3285.  *   20.4    History counters changed.  There is now one large history[8192]   *
  3286.  *           array to simplify indexing.  More importantly, these values are   *
  3287.  *           now limited to a max value of 32000.  During the update process,  *
  3288.  *           if any value reaches that limit, all values are divided by 2 to   *
  3289.  *           prevent deep searches from producing very large history values    *
  3290.  *           which would essentially disable late move reductions based on the *
  3291.  *           big history values.  The reduce/history=n command now uses values *
  3292.  *           0 <= n <= 100.  A value of 100 will cause all non-tactical moves  *
  3293.  *           to be reduced (most aggressive) while a value of 0 will result in *
  3294.  *           no moves being reduced (most conservative).  The value, loosely   *
  3295.  *           interpreted, means "reduce if a move fails high < n% of the time  *
  3296.  *           when at least one move fails high in a search."  the default is   *
  3297.  *           currently 50%, but further testing is needed.                     *
  3298.  *                                                                             *
  3299.  *   20.5    Old "mask" code removed and replaced by constants, since this is  *
  3300.  *           never intended to run on a Cray specifically any longer.  Change  *
  3301.  *           to "won king and pawn ending" to make it more accurate, this code *
  3302.  *           is used when there are nothing but pawns left, all on one side of *
  3303.  *           board, and one king is closer to a capturable pawn than the other *
  3304.  *           king is.  This is intended to help in outside passed pawn games   *
  3305.  *           where one side has to eventually give up the outside passer to    *
  3306.  *           decoy the opposing king away from the rest of the pawns.  New     *
  3307.  *           king safety now factors in king pawn shelter and opponent piece   *
  3308.  *           tropism into one score, but the score is now an arithmetic        *
  3309.  *           value that goes up more quickly as both indices increase, to do a *
  3310.  *           more accurate evaluation of safety and attacking chances.  Change *
  3311.  *           to bishop mobility, which now goes in units of 2 rather than 1,   *
  3312.  *           to increase the value of mobility somewhat.  Also mobility is now *
  3313.  *           'centered' in that it is computed as (squares - 6) * 2, to keep   *
  3314.  *           the bishop value from going way over its normal range with these  *
  3315.  *           new and somewhat larger numbers.                                  *
  3316.  *                                                                             *
  3317.  *   20.6    New eval code to look for bishops that are blocked in the forward *
  3318.  *           direction by friendly pawns.  That basically turns a bishop into  *
  3319.  *           a "tall pawn" since movement in the critical direction is not     *
  3320.  *           possible.                                                         *
  3321.  *                                                                             *
  3322.  *   20.7    Manually tuned kinf_safety[][] array values.  Modified the new    *
  3323.  *           bishop code to only consider the "long diagonal" if the bishop    *
  3324.  *           is in either 9-square corner on its own side of the board, so     *
  3325.  *           that the short diagonal being open won't offset the long          *
  3326.  *           diagonal that is blocked.  Bishop-pair bonus is now adjusted by   *
  3327.  *           how open or closed the center is.  If 3 of the four center pawns  *
  3328.  *           are gone, the center is open and the bishop pair bonus is set to  *
  3329.  *           the max.  If the four center pawns are locked (e4/e5/d5/d6 for    *
  3330.  *           example) then the bishop pair bonus is eliminated.  if the center *
  3331.  *           is somewhere in the middle of those extremes, then the bishop     *
  3332.  *           pair bonus is present but reduced.  Castling now is a bit more    *
  3333.  *           intelligent.  If a side has not castled, then moving either rook  *
  3334.  *           receives a penalty, where moving the king or the last unmoved     *
  3335.  *           rook receives a larger penalty.  If the king has not castled, its *
  3336.  *           'safety' score is based on the most safe position of the possible *
  3337.  *           options.  If neither rook has moved, then the score is based on   *
  3338.  *           the safest of the three locations, either in the center where it  *
  3339.  *           is, or on the safest wing.  If uncastled, this safaty is always   *
  3340.  *           reduced a bit to encourage castling before it becomes too late to *
  3341.  *           do so.  This was done to avoid a problem where the queen rook had *
  3342.  *           been moved, Crafty had not castled, and it pushed the kingside    *
  3343.  *           pawns making it unsafe to castle there, leaving the center as the *
  3344.  *           best place, yet had it not pushed the kingside pawns, castling    *
  3345.  *           would have been a better alternative.   Two new 16 word vectors,  *
  3346.  *           safety_vector[]/tropism_vectorp[] are used to set the edge values *
  3347.  *           for the king_safetyp[][] array.  Interior values are filled in    *
  3348.  *           based on these two vectors, making it much easier to tweak the    *
  3349.  *           king safety scores without pulling your hair out.                 *
  3350.  *                                                                             *
  3351.  *   20.8    When queens come off, the previous version cut the tropism scores *
  3352.  *           and pawn shelter scores by 1/2 each, which had the effect of      *
  3353.  *           dropping the overall score by 75% (the score is a geometric       *
  3354.  *           computation).  The safety/tropism values are now dropped, but by  *
  3355.  *           a smaller amount, since bishops + rooks + knights are still a     *
  3356.  *           dangerous threat.                                                 *
  3357.  *                                                                             *
  3358.  *   20.9    Simple lazy eval (Mike Byrne) added.  This simply avoids the more *
  3359.  *           expensive piece evaluations if the pawn scoring and material      *
  3360.  *           leave the score well outside the alpha/beta search window.  Looks *
  3361.  *           like a 20% speed improvement in general.                          *
  3362.  *                                                                             *
  3363.  *   20.10   Change to king safety pawn structure.  Open files around the king *
  3364.  *           are dangerous, but the h/g (or b/a) files are more dangerous than *
  3365.  *           the f-e-d-c files since they are much harder to defend against    *
  3366.  *           with the castled king in the way.  Modified the way the king      *
  3367.  *           safety matrix is computed so that at the tropism/pawnstructure    *
  3368.  *           values are more sane.  It currently will get the same value for   *
  3369.  *           array indices of 5,0, 4,1, 3,2, 2,3, 1,4, or 0,5, which is better *
  3370.  *           than what it was doing.  I plan to tweak this more later to make  *
  3371.  *           3,2 or 2,3 worse than 4,1 or 1,4 and 0,5 or 5,0, as the latter    *
  3372.  *           mean "unsafe king but no piece pressure" or "piece pressure but   *
  3373.  *           king pawn shelter is safe" whereas the middle values mean both    *
  3374.  *           components of an attack are present, unsafe king position and the *
  3375.  *           pieces are closing in.                                            *
  3376.  *                                                                             *
  3377.  *   20.11   Minor fix to late move reduction code.  Turns out it is possible  *
  3378.  *           to reach the block of code if (first_move) { } with status set to *
  3379.  *           REMAINING_MOVES (this means no captures, no killer, no hash move, *
  3380.  *           no history move, etc).  That would let me try a reduction, and if *
  3381.  *           it failed high, we would use that score as-is.  We now re-search  *
  3382.  *           a fail-high here just like we did in the other block of code so   *
  3383.  *           that a fail-high on a reduction search is never trusted.          *
  3384.  *                                                                             *
  3385.  *   20.12   Further modifications to king safety initialization code to try   *
  3386.  *           scale back the values a bit to control score limits.              *
  3387.  *                                                                             *
  3388.  *   20.13   Fix to bench.c to remove two file closes that would wreck the     *
  3389.  *           program after the bench command was finished.  Also the           *
  3390.  *           SMP-time-to-ply measurement was removed since it had no meaning.  *
  3391.  *           Old FUTILITY code re-inserted along with an extension limit       *
  3392.  *           modification by Mike Byrne to avoid limiting the search extension *
  3393.  *           on one-reply extensions only.  New lock.h submitted by Andreas    *
  3394.  *           Guettinger to support spinlocks on the PPC architecture (Linux).  *
  3395.  *           Some -D configuration options were changed so that none are       *
  3396.  *           needed to compile the "standard" Crafty.  Futility is normally on *
  3397.  *           now, and -DNOFUTILITY is required to compile it out.  The new     *
  3398.  *           Makefile gives the configuration options, but the only ones that  *
  3399.  *           would normally need setting are the SMP and CPUS= options if you  *
  3400.  *           have a SMP platform.                                              *
  3401.  *                                                                             *
  3402.  *   20.14   Fix to EvaluateWinningChances() to correctly evaluate KRP vs KR   *
  3403.  *           type endings.  Previously this was done in the wrong place and    *
  3404.  *           the score would favor the side with the pawn significantly, where *
  3405.  *           the score is now zero.  Minor bugfix to code that detects that an *
  3406.  *           illegal position has been set up.  It caught every possible       *
  3407.  *           problem except for positions with a king (or kings) missing.      *
  3408.  *                                                                             *
  3409.  *   20.15   Change to how Crafty chooses where to split.  Previously, there   *
  3410.  *           was a min remaining depth limit to prevent Crafty from trying to  *
  3411.  *           split too close to the frontier nodes.  Now that is specified as  *
  3412.  *           a percentage of the nominal search depth.  For example, the       *
  3413.  *           default value is 50%, which says that on a 16 ply search, we can  *
  3414.  *           split if at least 8 plies of search are left.  This provides      *
  3415.  *           better split overhead than a simple limit that doesn't take the   *
  3416.  *           actual search depth into consideration.  History data arranged to *
  3417.  *           be more cache friendly.  The three values for a common history    *
  3418.  *           index value are now stored in adjacent memory words to take       *
  3419.  *           advantage of pre-fetching within a cache line.  Additional        *
  3420.  *           tuning of the king safety matrix.                                 *
  3421.  *                                                                             *
  3422.  *   20.16   Evaluation of knights, bishops, rooks, queens and kings is now    *
  3423.  *           done on a 1000 point scale, then the sum is divided by 10.  This  *
  3424.  *           allows us to use the same hashing mechanism, but with finer       *
  3425.  *           tuning precision.  Minor queen eval tweak for 7th rank position.  *
  3426.  *                                                                             *
  3427.  *   20.17   New book learning, with a simplified book system.  The export     *
  3428.  *           files (book.lrn, position.lrn) no longer are created/used, the    *
  3429.  *           learn mechanism no longer touches the real chess board which      *
  3430.  *           could cause problems in certain xboard/winboard timing            *
  3431.  *           situations.  One major learning change is that we now only learn  *
  3432.  *           things from "Crafty's perspective".  That is, if Crafty loses a   *
  3433.  *           game as black, it won't think that opening is good when it plays  *
  3434.  *           white since it might well not understand how to win using that    *
  3435.  *           particular opening.  It will only "learn" on the actual moves it  *
  3436.  *           plays in a game.  Old "history heuristic" removed.  Testing       *
  3437.  *           showed that the LMR idea produced better results without the      *
  3438.  *           history ordering, since now more moves are reduced, but moves     *
  3439.  *           with good history values don't get reduced.                       *
  3440.  *                                                                             *
  3441.  *   21.0    Finally did the bit-renumbering task so that bit 0 = LSB = A1,    *
  3442.  *           to eliminate the 63-n translation to the numbering scheme used    *
  3443.  *           on the Cray architecture.  For all bit operations now, LSB=0,     *
  3444.  *           MSB=7, 15, 31 or 63 depending on the data size.  A few minor      *
  3445.  *           bugs were fixed along the way as these changes were debugged.     *
  3446.  *           Minor bug in EvaluateKings() where it tested for a "won ending"   *
  3447.  *           and used a test that was too aggressive.  This test did not get   *
  3448.  *           things quite right when the two kings were very close together    *
  3449.  *           and "opposition" prevented one king from moving closer to the     *
  3450.  *           pawns.                                                            *
  3451.  *                                                                             *
  3452.  *   21.1    New piece scoring from Tracy, which changes the way pieces are    *
  3453.  *           scored based on squares they attack.                              *
  3454.  *                                                                             *
  3455.  *   21.2    The scores are now scaled better for the transition from middle-  *
  3456.  *           game to end-game.  Passed pawn scores climb as material is        *
  3457.  *           removed from the board, to prevent them from overwhelming the     *
  3458.  *           middlegame king safety scores.  We do exactly the same scaling on *
  3459.  *           king-safety scores, but they are scaled downward as material is   *
  3460.  *           removed so that they "phase out" as the endgame is reached.       *
  3461.  *           Weak pawn code changed to more accurately identify weak pawns.    *
  3462.  *           These are totaled and then used to index a scoring array that     *
  3463.  *           penalizes the number of weak pawns on each side.  Pawn islands    *
  3464.  *           are now recognized and each side is penalized according to the    *
  3465.  *           number of islands he has, more being worse.                       *
  3466.  *                                                                             *
  3467.  *   21.3    "Magic" move generation is now used, which eliminates the rotated *
  3468.  *           bitboard approach completely.  Not a significant speed change,    *
  3469.  *           but it is far simpler overall.  Original code by Pradu Kannan as  *
  3470.  *           posted on CCC/Winboard forums, modified to work with Crafty.      *
  3471.  *                                                                             *
  3472.  *   21.4    Misc eval changes.  More king safety changes to include a tropism *
  3473.  *           distance of 1 for bishops or rooks that can slide to intercept    *
  3474.  *           any square surrounding the enemy king.  Reduced rook slide score  *
  3475.  *           by 40%.
  3476.  *                                                                             *
  3477.  *   21.5    passed pawn extension revisited.  Bad trade was giving a penalty  *
  3478.  *           for being down an exchange (or a bonus for being up an exchange)  *
  3479.  *           which was not expected behavior.  This has been fixed.  EGTB      *
  3480.  *           initialization was being done during the first pass over the      *
  3481.  *           RC file, which was too early as the rest of the engine had not    *
  3482.  *           been initialized.  Now the "egtb" command is the only thing that  *
  3483.  *           triggers initialization, and is only processed during the second  *
  3484.  *           pass over the RC file after paths have been properly set up.      *
  3485.  *           Abs() function bug fix.                                           *
  3486.  *                                                                             *
  3487.  *   21.6    Passed pawn evaluation changed with respect to distant passed     *
  3488.  *           pawns and distant majorities.  Now, if both have a pawn majority  *
  3489.  *           we check to see if one is "distant" (away from the enemy king) as *
  3490.  *           this represents a significant time advantage because the other    *
  3491.  *           side has to waste moves to reach and capture the pawn to prevent  *
  3492.  *           promotion.  LMR no longer uses the history counters, which proved *
  3493.  *           to be essentially random numbers.  LMR decisions are now based    *
  3494.  *           solely on static characteristics of an individual move, rather    *
  3495.  *           than trying to determine how the move affected the search at      *
  3496.  *           other points in the tree.  New wtm bonus added to evaluation.     *
  3497.  *           EvaluateMate() bug fixed where the score was set to a non-zero    *
  3498.  *           value which broke EvaluateMate() completely.  New mobility code   *
  3499.  *           for bishops/rooks encourages better piece placement.  Note that   *
  3500.  *           there are many other evaluation changes too numerous to list here *
  3501.  *           in detail.                                                        *
  3502.  *                                                                             *
  3503.  *   21.7    New reduce at root code added to do reductions at the root, but   *
  3504.  *           not on any move that has been a "best move" during the current    *
  3505.  *           search, unless the move drops too far in the move list.  New nice *
  3506.  *           mode for parallel search terminates threads while waiting on the  *
  3507.  *           opponent's move to avoid burning unnecessary CPU time (this nice  *
  3508.  *           mode is NOT the default mode however.) -DNOFUTILITY removed as    *
  3509.  *           futility is on by default and should not be removed.  All of the  *
  3510.  *           search() code has been cleaned up and streamlined a bit for more  *
  3511.  *           clarity when reading the code.  Nasty bug in EvaluatePawns() that *
  3512.  *           unfortunattely used the king squares to make a decision dealing   *
  3513.  *           with outside passed pawns, but the hash signature for pawns does  *
  3514.  *           not include king position.  This code was deemed unnecessary and  *
  3515.  *           was summarily removed (not summarily executed, it has had that    *
  3516.  *           done far too many times already).                                 *
  3517.  *                                                                             *
  3518.  *   22.0    Redesign of the data structures completed so that Crafty will no  *
  3519.  *           longer have duplicated code for wtm and btm cases.  This has      *
  3520.  *           already resulted in a rewrite of movgen(), SEE(), Make() and      *
  3521.  *           Unmake() and cut that code size by almost exactly 50%. The result *
  3522.  *           has been slightly faster speeds, but also the future benefits     *
  3523.  *           will be enormous by eliminating a lot of debugging caused by the  *
  3524.  *           duplicated code.  Timing change to avoid starting an iteration    *
  3525.  *           and wasting significant time.  We still search enough to get a    *
  3526.  *           quick fail-low, otherwise we stop and make the move and save the  *
  3527.  *           time we used to burn.  Massive cleanup in the macros used to      *
  3528.  *           access much of the data since the new [wtm] approach resulted in  *
  3529.  *           many old macros becoming unused.  Yet another rewrite of the code *
  3530.  *           that handles repetition detection.  There is an undetected bug in *
  3531.  *           the previous code, related to pondering and SMP, that was not     *
  3532.  *           obvious.  The code was completely rewritten and is now much       *
  3533.  *           simpler to understand, and has been verified to be bug-free with  *
  3534.  *           massive cluster testing.                                          *
  3535.  *                                                                             *
  3536.  *   22.1    Minor fix for CPUS=1, which would cause compile errors.  Other    *
  3537.  *           eval tweaks to improve scoring.  New "skill" command that can be  *
  3538.  *           used to "dumb down" Crafty.  "Skill <n>" where n is a number      *
  3539.  *           between 1 and 100.  100 is max (default) skill.  Skill 70 will    *
  3540.  *           drop the playing Elo by about 200 points.  Skill 50 will drop it  *
  3541.  *           about 400 points.  The curve is not linear, and the closer you    *
  3542.  *           get to 1, the lower the rating.  To use this feature, you need to *
  3543.  *           add -DSKILL to your Makefile options otherwise it is not included *
  3544.  *           in the executable.                                                *
  3545.  *                                                                             *
  3546.  *   22.2    We are now back to using POSIX threads, since all current Linux   *
  3547.  *           distributions now use the posix-conforming NTPL implementation    *
  3548.  *           which should eliminate the various compatibility issues that      *
  3549.  *           caused problems in the past.  This also should make the new       *
  3550.  *           smpnice mode work correctly for Linux and Windows since they will *
  3551.  *           now both use threads for the SMP search.  Fruit-like scoring      *
  3552.  *           (interpolation between mg and eg scores) fully implemented.  AEL  *
  3553.  *           pruning (Heinz 2000) also fully implemented (we had razoring and  *
  3554.  *           futility, but not extended futility).  "Eval" command has been    *
  3555.  *           removed and combined with the "personality" command so that eval  *
  3556.  *           parameters can be modified, in addition to some search parameters *
  3557.  *           that also belong in the personality data.  Mate threat extension  *
  3558.  *           and one legal reply to check extensions have been removed.  Tests *
  3559.  *           proved them to be absolutely useless, over 30,000 games for each  *
  3560.  *           test showed no gain and sometimes a loss in playing strength with *
  3561.  *           them so we followed the "simple is better" and removed them.  The *
  3562.  *           fractional ply code was also removed since the only extension we  *
  3563.  *           now use is the "give check" extension which is a whole ply.  A    *
  3564.  *           significant number of evaluation parameters have been changed,    *
  3565.  *           a few even removed as cluster testing helped us find optimal      *
  3566.  *           values.  There are a few new terms, with more planned.            *
  3567.  *                                                                             *
  3568.  *   22.3    Corrected a bug in analysis mode where "back n" would crash.  A   *
  3569.  *           bad array reference broke this during recent changes.             *
  3570.  *                                                                             *
  3571.  *   22.4    Corrected a bug in NextRootMove() that tries to calculate the NPS *
  3572.  *           by adding up the node counters in each used split block.  However *
  3573.  *           should you not use all possible threads (mt=n where n is < the    *
  3574.  *           max CPUS value compiled in) then all split blocks will not be     *
  3575.  *           properly initialized (not even allocated) which will cause a      *
  3576.  *           segfault instantly.  Pawn island evaluation term has also been    *
  3577.  *           removed as cluster testing showed that setting these values to    *
  3578.  *           zero produced a +14 Elo gain.  There might be a better value for  *
  3579.  *           them, but the old value was too high.  Further cluster testing is *
  3580.  *           underway to test other (but smaller than original) values to see  *
  3581.  *           if one of them turns out to be better than zero.  So far, no, but *
  3582.  *           the test has not completed.                                       *
  3583.  *                                                                             *
  3584.  *   22.5    Minor eval tweaks.  Pthread_create was called without giving it   *
  3585.  *           any attributes for the new thread(s) which makes them default to  *
  3586.  *           "joinable".  When smpnice=1 terminates threads, the threads hang  *
  3587.  *           around using memory expecting that the parent will join with them *
  3588.  *           to check the exit status.  We now set "detached" as the proper    *
  3589.  *           attribute so that this memory leak no longer happens.             *
  3590.  *                                                                             *
  3591.  *   22.6    Compile issue fixed which would cause the pthread_lib calls to    *
  3592.  *           be used in a windows compile, which was incorrect.  They are now  *
  3593.  *           protected by a #if defined(UNIX) && (CPUS > 1) conditional test.  *
  3594.  *                                                                             *
  3595.  *   22.7    Windows NUMA support fix to eliminate a memory leak caused by     *
  3596.  *           re-malloc'ing the split blocks each time a new game is started.   *
  3597.  *           This was not found in the previous memory leak testing as that    *
  3598.  *           problem was related to stopping/re-starting threads when using    *
  3599.  *           smpnice=1.  This is unrelated, but similar, and has been around   *
  3600.  *           a long time.                                                      *
  3601.  *                                                                             *
  3602.  *   22.8    Modified material imbalance fix from Tracy included.  This        *
  3603.  *           produced an immediate +7 Elo improvement, and additional tuning   *
  3604.  *           is under way.  Fix to GenerateChecks().  This code had bugs a few *
  3605.  *           weeks back and they were fixed, but the fixes were somehow lost   *
  3606.  *           during copying files among multiple machines.  The fixes are now  *
  3607.  *           back in and properly saved.                                       *
  3608.  *                                                                             *
  3609.  *   22.9    More eval tuning producing another +10 Elo gain.  Curmv[n] was    *
  3610.  *           "overloaded" in that it was used to obtain the next move for a    *
  3611.  *           parallel thread and was also used to pass back a "fail high" move *
  3612.  *           to store in a "LOWER" hash table entry.  This led to some error   *
  3613.  *           messages internal to Crafty that could possibly cause problems.   *
  3614.  *           There is now a second variable "cutmove" used to pass the move    *
  3615.  *           back to eliminate race conditions.  Hash.c modified extensively   *
  3616.  *           to improve readability as well as to eliminate duplicated code.   *
  3617.  *           Internal iterative deepening code removed.  No measurable benefit *
  3618.  *           in real game testing led to removal since it is simpler without   *
  3619.  *           the code.  EvaluateMaterialDynamic() also removed.  This was code *
  3620.  *           that implemented ideas suggested by IM Larry Kaufman, but careful *
  3621.  *           testing showed absolutely no effect on game results.  Again, we   *
  3622.  *           chose "simpler is better" and removed it, as no tuning attempts   *
  3623.  *           helped for this code.  Nasty pawn hashing bug fix, something that *
  3624.  *           has been around for years.  This was essentially the same sort of *
  3625.  *           bug that the "lockless hashing algorithm" addressed for the main  *
  3626.  *           hash table, where out-of-order memory writes could produce a hash *
  3627.  *           signature and the 64 bit word with score and best move which did  *
  3628.  *           not "go together".  The same thing happens in pawn hashing,       *
  3629.  *           except that an entry is 32 bytes rather than 16, giving even      *
  3630.  *           higher probability of an entry that contains mismatched pieces.   *
  3631.  *           In the best case, we just got a bad score.  In the worst case,    *
  3632.  *           this could cause a program crash since some of the data might be  *
  3633.  *           invalid, yet it can be used in ways that produce impossible array *
  3634.  *           subscripts that would cause (very rarely) a segmentation fault.   *
  3635.  *           The solution was to do the same lockless hashing algorithm where  *
  3636.  *           the key is XORed with the other three 64 bit words when the entry *
  3637.  *           is stored, then XORed with them again when we try to match.  If   *
  3638.  *           the entry is mismatched, the signature will not match anything    *
  3639.  *           and we simply will not use the bad data and do a normal pawn      *
  3640.  *           evaluation to compute valid values.                               *
  3641.  *                                                                             *
  3642.  *    23.0   Essentially a cleaned up 22.9 version.  Comments have been        *
  3643.  *           reviewed to make sure they are consistent with what is actually   *
  3644.  *           done in the program.  Major change is that the random numbers     *
  3645.  *           used to produce the Zobrist hash signature are now statically     *
  3646.  *           initialized which eliminates a source of compatibility issues     *
  3647.  *           where a different stream of random numbers is produced if an      *
  3648.  *           architecture has some feature that changes the generator, such    *
  3649.  *           as a case on an older 30/36 bit word machine.  The issue with     *
  3650.  *           this change is that the old binary books are not compatible and   *
  3651.  *           need to be re-created with the current random numbers.  The       *
  3652.  *           "lockless hash table" idea is back in.  It was removed because    *
  3653.  *           the move from the hash table is recognized as illegal when this   *
  3654.  *           is appropriate, and no longer causes crashes.  However, the above *
  3655.  *           pawn hash issue showed that this happens enough that it is better *
  3656.  *           to avoid any error at all, including the score, for safety.  We   *
  3657.  *           made a significant change to the parallel search split logic in   *
  3658.  *           this version.  We now use a different test to limit how near the  *
  3659.  *           tips we split.  This test measures how large the sub-tree is for  *
  3660.  *           the first move at any possible split point, and requires that     *
  3661.  *           this be at least some minimum number of nodes before a split can  *
  3662.  *           be considered at this node.  The older approach, which based this *
  3663.  *           decsion on remaining search depth at a node led to some cases     *
  3664.  *           where the parallel search overhead was excessively high, or even  *
  3665.  *           excessively low (when we chose to not split frequently enough).   *
  3666.  *           This version appears to work well on a variety of platforms, even *
  3667.  *           though NUMA architectures may well need additional tuning of this *
  3668.  *           paramenter (smpsn) as well as (smpgroup) to try to contain most   *
  3669.  *           splits on a single NUMA node where memory is local.  I attempted  *
  3670.  *           to automate this entire process, and tune for all sorts of plat-  *
  3671.  *           forms, but nothing worked for the general case, which leaves the  *
  3672.  *           current approach.  When I converted back to threads from          *
  3673.  *           processes, I forgot to restore the alignment for the hash/pawn-   *
  3674.  *           hash tables.  The normal hash table needs to be on a 16 byte      *
  3675.  *           boundary, which normally happens automatically, but pawn hash     *
  3676.  *           entries should be on a 32 byte boundary to align them properly in *
  3677.  *           cache to avoid splitting an entry across two cache blocks and     *
  3678.  *           hurting performance.  New rook/bishop cache introduced to limit   *
  3679.  *           overhead caused by mobility calculations.  If the ranks/files the *
  3680.  *           rook is on are the same as the last time we evaluated a rook on   *
  3681.  *           this specific square, we can reuse the mobility score with no     *
  3682.  *           calculation required.  The code for "rook behind passed pawns"    *
  3683.  *           was moved to EvaluatePassedPawns() so that it is only done when   *
  3684.  *           there is a passed pawn on the board, not just when rooks are      *
  3685.  *           present.  Book learning has been greatly cleaned up and           *
  3686.  *           simplified.  The old "result learning" (which used the game       *
  3687.  *           result to modify the book) and "book learning" (which used the    *
  3688.  *           first N search scores to modify the book) were redundant, since   *
  3689.  *           result learning would overwrite whatever book learning did.  The  *
  3690.  *           new approach uses the game result (if available) to update the    *
  3691.  *           book database when the program exits or starts a new game.  If    *
  3692.  *           a result is not available, it will then rely on the previous      *
  3693.  *           search results so that it has some idea of whether this was a     *
  3694.  *           good opening or not, even if the game was not completed.  Minor   *
  3695.  *           LMR bug in SearchRoot() could do a PVS fail-high research using   *
  3696.  *           the wrong depth (off by -1) because of the LMR reduction that had *
  3697.  *           been set.  The normal search module had this correct, but the     *
  3698.  *           SearchRoot() module did not.  EvaluateDevelopment() was turned    *
  3699.  *           off for a side after castling.  This caused a problem in that we  *
  3700.  *           do things like checking for a knight blocking the C-pawn in queen *
  3701.  *           pawn openings.  Unfortunately, the program could either block the *
  3702.  *           pawn and then castle, which removed the blocked pawn penalty, or  *
  3703.  *           it could castle first and then block the pawn, making it more     *
  3704.  *           difficult to develop the queen-side.  We now enable this code     *
  3705.  *           always and never disable it.  This disable was done years ago     *
  3706.  *           when the castling evaluation of Crafty would scan the move list   *
  3707.  *           to see if Crafty had castled, when it noticed castling was no     *
  3708.  *           longer possible.  Once it had castled, we disabled this to avoid  *
  3709.  *           the lengthy loop and the overhead it caused.  Today the test is   *
  3710.  *           quite cheap anyway, and I measured no speed difference with it on *
  3711.  *           or off, to speak of.  Now we realize that the knight in front of  *
  3712.  *           the C-pawn is bad and needs to either not go there, or else move  *
  3713.  *           out of the way.                                                   *
  3714.  *                                                                             *
  3715.  *    23.1   Xboard protocol support slightly modified so that draw results    *
  3716.  *           are now sent after the move that causes the draw.  They were      *
  3717.  *           always sent before a move if the position prior to the move was   *
  3718.  *           drawn, but they were also sent just before playing a move to work *
  3719.  *           around a xboard protocol race condition where I can send a move,  *
  3720.  *           and then a draw claim (xboard 'result string') and the GUI sees   *
  3721.  *           my move, relays it to my opponent, and gets an instant reply that *
  3722.  *           it then sees before my draw claim.  After making this move and    *
  3723.  *           forwarding it to me, it now thinks the draw claim is invalid.     *
  3724.  *           slight tweak to queen material value and the way our bishop pair  *
  3725.  *           scoring is done.  The old razoring code has been removed.  It is  *
  3726.  *           redundant with LMR, and it had the unwanted side-effect of        *
  3727.  *           reducing a few of the moves two plies.  The futility pruning has  *
  3728.  *           been modified to work at the last N plies.  We have an array of   *
  3729.  *           pruning margins (tuned on the cluster) where anytime the depth is *
  3730.  *           less than "pruning_depth" we try the futility test.  If the test  *
  3731.  *           succeeds, that move is discarded and not searched at all.  Move   *
  3732.  *           ordering code modified slightly to call SEE() fewer times if the  *
  3733.  *           goodness of the capture can still be accurately assessed without  *
  3734.  *           the call.  Hash table has been changed to use a bucket of 4       *
  3735.  *           entries similar to a 4-way set associative cache.  When a store   *
  3736.  *           is attempted, we replace the least useful entry (see hash.c for   *
  3737.  *           details).  Additionally the hash table is forced to a 64 byte     *
  3738.  *           boundary alignment so that a bucket aligns on the start of a      *
  3739.  *           cache line for efficiency.  The old approach used 3 entries per   *
  3740.  *           bucket, the Belle two-table approach, which caused 1/2 of the     *
  3741.  *           cache probes to result in two cache line reads rather than just   *
  3742.  *           one.  Slight modification to "time overflow" logic.  Now, if the  *
  3743.  *           score drops on the iteration where we reach the normal time       *
  3744.  *           allocation, Crafty will continue to search.  Previously the score *
  3745.  *           had to drop by 1/4 pawn, but cluster testing has shown that this  *
  3746.  *           change is better.  Final bit of old rotated bitboard logic        *
  3747.  *           removed.  We had two bitboards, RooksQueens and BishopsQueens     *
  3748.  *           that were updated in MakeMove() and UnmakeMove().  It turned out  *
  3749.  *           to be faster to just OR the needed piece bitboards together since *
  3750.  *           they were infrequently used in the new "magic" approach, which    *
  3751.  *           allowed me to remove them completely from the position structure  *
  3752.  *           and make/unmake.  Net result was a percent or two faster search   *
  3753.  *           overall.  Old bug fixed related to EGTB usage.  The Edwards       *
  3754.  *           format did not include en passant pawn captures, so it was        *
  3755.  *           necessary to avoid probing any position where both sides had a    *
  3756.  *           pawn and there was any possibility of an en passant capture (one  *
  3757.  *           pawn on original square, enemy pawn anywhere on either adjacent   *
  3758.  *           file).  The Nalimov tables consider en passant correctly, but     *
  3759.  *           somehow this old code was either left in iterate.c or else added  *
  3760.  *           back in by accident.  It is now no longer present.  Minor changes *
  3761.  *           (suggested by J. Cleveland on CCC) that avoids trying a null-move *
  3762.  *           search when remaining depth == 1, and which saves some effort by  *
  3763.  *           remembering, when a node fails low, the first move searched.      *
  3764.  *           This move then gets stored in the hash table as the "best move".  *
  3765.  *           While this might be wrong, it has a chance of being right and     *
  3766.  *           when it is good enough to cause a cutoff, we can avoid a move     *
  3767.  *           generation which saves a bit of time.  Fixed a significant bug in *
  3768.  *           EvaluateWinningChances() where it was using a global variable     *
  3769.  *           "wtm" which tells who is to move in the real game, not at the     *
  3770.  *           current position in the treee.  This value  is used for tempo     *
  3771.  *           calculations to determine if the losing king (in a K + rook-pawn  *
  3772.  *           ending (with or without wrong bishop)) can reach the queening     *
  3773.  *           square before the winning side's king can block acccess.  This    *
  3774.  *           would randomly make the tempo calculation off by one, so that the *
  3775.  *           score could bounce from draw to win and back as the game          *
  3776.  *           progresses, since about 1/2 the time the wtm  value is wrong.  I  *
  3777.  *           simply passed the current wtm in as a formal parameter to solve   *
  3778.  *           this (a good example of why having a global variable and a formal *
  3779.  *           argument paramenter using the same name is a bad idea.)  In this  *
  3780.  *           same general area, EvaluateDraws() could set the score to         *
  3781.  *           DrawScore, which was somewhat "iffy".  I changed this to simply   *
  3782.  *           determine if the side that ahead is score has any realistic       *
  3783.  *           winning chances.  If not, I divide the score by 10 rather than    *
  3784.  *           setting it to the absolute drawscore.  This has the same effect,  *
  3785.  *           but does let the evaluation guide the search to better moves when *
  3786.  *           it is convinced all of them lead to draws.  This version is about *
  3787.  *           +100 Elo stronger than 23.0 based on cluster testing results.     *
  3788.  *                                                                             *
  3789.  *    23.2   Two changes related to draw handling.  First, the 50-move draw    *
  3790.  *           rule is tricky.  It is possible that the move on the 100th ply    *
  3791.  *           after the last non-reversible move might not be a draw, even if   *
  3792.  *           it is reversible itself, because it might deliver mate.  In this  *
  3793.  *           specific case, the mate will end the game as a win.  This has     *
  3794.  *           been fixed in Crafty to match this specific rule exception.  Also *
  3795.  *           draws by "insufficient material" have been changed to match the   *
  3796.  *           FIDE rules which say that mate can't be possible, even with worst *
  3797.  *           possible play by the opponent.  Crafty would claim a draw in a    *
  3798.  *           simple KN vs KN position, which is incorrect.  Even though        *
  3799.  *           neither side can force mate, mate is possible and so the position *
  3800.  *           is not a draw by FIDE rules.  Mobility scoring changed for        *
  3801.  *           sliding pieces.  Now the mobility scores are pre-computed and     *
  3802.  *           stored in a table that is addressed by the "magic number move     *
  3803.  *           generation idea".  This completely eliminates the computational   *
  3804.  *           cost of the mobility scoring since all of the scores are pre-     *
  3805.  *           computed before the game starts.  This was a modest speed         *
  3806.  *           improvement but really made the code simpler and smaller.  Change *
  3807.  *           to lazy eval cutoff code to improve accuracy.  BookUP() had a     *
  3808.  *           minor bug that caused it to not report how many moves were not    *
  3809.  *           included because of the "maxply" limit.  This has been fixed also *
  3810.  *           so that it now reports the correct value.  New xboard "cores" and *
  3811.  *           "memory" command support added.  Code to malloc() both was also   *
  3812.  *           rewritten completely to clean it up and simplify things.  In an   *
  3813.  *           effort to avoid confusion, there is one caveat here.  If your     *
  3814.  *           .craftyrc/crafty.rc file has an option to set the number of       *
  3815.  *           threads (mt=n/smpnt=n), then the "cores" option from xboard is    *
  3816.  *           automatically disabled so that the .craftyrc option effectively   *
  3817.  *           overrides any potential cores setting.  If you set hash or hashp  *
  3818.  *           in the .craftyrc/crafty.rc file, then the "memory" option from    *
  3819.  *           xboard is automatically disabled, for the same reason.  In short, *
  3820.  *           you can let xboard set the number of threads and memory usage     *
  3821.  *           limit, or you can set them in your .craftyrc/crafty.rc file.  But *
  3822.  *           if you use the .craftyrc/crafty.rc file to set either, then the   *
  3823.  *           corresponding xboard command will be disabled.                    *
  3824.  *                                                                             *
  3825.  *    23.3   Null-move search restriction changed to allow null-move searches  *
  3826.  *           at any node where the side on move has at least one piece of any  *
  3827.  *           type.  Minor bug in ValidMove() fixed to catch "backward" pawn    *
  3828.  *           moves and flag them as illegal.  This sometimes caused an error   *
  3829.  *           when annotating games and annotating for both sides.  The killer  *
  3830.  *           move array could have "backward" moves due to flipping sides back *
  3831.  *           and forth, which would cause some odd PV displays.  Small change  *
  3832.  *           to "reduce-at-root".  We no longer reduce moves that are flagged  *
  3833.  *           as "do not search in parallel".  Check extension modified so that *
  3834.  *           if "SEE" says the check is unsafe, the extension is not done.  We *
  3835.  *           found this to be worth about +10 Elo.  We also now reduce any     *
  3836.  *           capture move that appears in the "REMAINING_MOVES" phase since    *
  3837.  *           they can only appear there if SEE returns a score indicating loss *
  3838.  *           of material.  We now reduce a bit more aggressively, reducing by` *
  3839.  *           2 plies once we have searched at least 4 moves at any ply.  I     *
  3840.  *           tried going to 3 on very late moves, but could not find any case  *
  3841.  *           where this was better, even limiting it to near the root or other *
  3842.  *           ideas.  But reducing by 2 plies after the at least 2 moves are    *
  3843.  *           searched was an improvement.  Minor change is that the first move *
  3844.  *           is never reduced.  It is possible that there is no hash move, no  *
  3845.  *           non-losing capture, and no killer move.  That drops us into the   *
  3846.  *           REMAINING_MOVES phase which could reduce the first move searched, *
  3847.  *           which was not intended.  Very minor tweak, but a tweak all the    *
  3848.  *           same.                                                             *
  3849.  *                                                                             *
  3850.  *    23.4   Bug in hash implementation fixed.  It was possible to get a hash  *
  3851.  *           hit at ply=2, and alter the ply=1 PV when it should be left with  *
  3852.  *           no change.  This could cause Crafty to display one move as best   *
  3853.  *           and play another move entirely.  Usually this move was OK, but it *
  3854.  *           could, on occasion, be an outright blunder.  This has been fixed. *
  3855.  *           The search.c code has been re-written to eliminate SearchRoot()   *
  3856.  *           entirely, which simplifies the code.  The only duplication is in  *
  3857.  *           SearchParallel() which would be messier to eliminate.  Ditto for  *
  3858.  *           quiesce.c, which now only has Quiesce() and QuiesceEvasions().    *
  3859.  *           The old QuiesceChecks() has been combined with Quiesce, again to  *
  3860.  *           eliminate duplication and simplify the code.  Stupid bug in code  *
  3861.  *           that handles time-out.  One place checked the wrong variable and  *
  3862.  *           could cause a thread to attempt to output a PV after the search   *
  3863.  *           was in the process of timing out.  That thread could back up an   *
  3864.  *           incomplete/bogus search result to the root in rare occasions,     *
  3865.  *           which would / could result in Crafty kibitzing one move but       *
  3866.  *           playing a different move.  On occasion, the move played could be  *
  3867.  *           a horrible blunder.  Minor bug caused StoreTransRef() to lose a   *
  3868.  *           best move when overwriting an old position with a null-move       *
  3869.  *           search result.  Minor change by Tracy to lazy evaluation cutoff   *
  3870.  *           to speed up evaluation somewhat.  Old "Trojan Horse" attack       *
  3871.  *           detection was removed.  At today's depths, it was no longer       *
  3872.  *           needed.  New hash idea stores the PV for an EXACT hash entry in a *
  3873.  *           separate hash table.  When an EXACT hit happens, this PV can be   *
  3874.  *           added to the incomplete PV we have so far so that we have the     *
  3875.  *           exact path that leads to the backed up score.  New "phash" (path  *
  3876.  *           hash) command to set the number of entries in this path hash      *
  3877.  *           table.  For longer searches, a larger table avoids path table     *
  3878.  *           collisions which will produce those short paths that end in <HT>. *
  3879.  *           If <HT> appears in too many PVs, phash should be increased.  The  *
  3880.  *           "Trojan Horse" code has been completely removed, which also       *
  3881.  *           resulted in the removal of the last bit of "pre-processing code"  *
  3882.  *           in preeval.c, so it has been completely removed as well.  Current *
  3883.  *           search depths are such that the Trojan Horse code is simply not   *
  3884.  *           needed any longer.  A minor bug in TimeSet() fixed where on rare  *
  3885.  *           occasions, near the end of a time control, time_limit could be    *
  3886.  *           larger than the max time allowed (absolute_time_limit).  We never *
  3887.  *           check against this limit until we exceed the nominal time limit.  *
  3888.  *           Cleanup on the draw by repetition code to greatly simplify the    *
  3889.  *           code as well as speed it up.                                      *
  3890.  *                                                                             *
  3891.  *    23.5   Several pieces of code cleanup, both for readability and speed.   *
  3892.  *           We are now using stdint.h, which lets us specific the exact size  *
  3893.  *           of an integer value which gets rid of the int vs long issues that *
  3894.  *           exist between MSVC and the rest of the world on X86_64.  We still *
  3895.  *           use things like "int" if we want to let the compiler choose the   *
  3896.  *           most efficient size, but when we need a specific number of bits,  *
  3897.  *           such as 64, we use a specific type (uint64_t for 64 bits).  Minor *
  3898.  *           change to forward pruning that does not toss out passed pawn      *
  3899.  *           moves if they are advanced enough (compared to remaining depth)   *
  3900.  *           that they might be worth searching.  Cleanup to passed pawn eval  *
  3901.  *           code to help efficiency and readability.  New options to the      *
  3902.  *           display command.  "display nothing" turns all output off except   *
  3903.  *           for the move Crafty chooses to play.  "display everything" will   *
  3904.  *           produce a veritable flood of information before it makes a move.  *
  3905.  *           Cleanup of personality code to fix some values that were not      *
  3906.  *           included, as well as clean up the formatting for simplicity.      *
  3907.  *                                                                             *
  3908.  *    23.6   Minor tweak to "adaptive hash" code + a fix to the usage warning  *
  3909.  *           that failed to explain how many parameters are required.  New way *
  3910.  *           of timing the search, replacing the old "easy move" code that was *
  3911.  *           simply too ineffective.  Now Crafty computes a "difficulty" level *
  3912.  *           after each iteration.  If the best move doesn't change, this      *
  3913.  *           level is reduced by 10% of the current value, until it reaches    *
  3914.  *           60% where it stops dropping.  If the best move changes during an  *
  3915.  *           iteration, it adjusts in one of two ways.  If the current         *
  3916.  *           difficulty level is less than 100%, it reverts to 100% + the      *
  3917.  *           number of different best moves minus 1 times 20%.  If the current *
  3918.  *           difficulty level is already >= 100% it is set to 80% of the       *
  3919.  *           current value + (again) the number of different best moves - 1    *
  3920.  *           times 20%.  Repeated changes can run this up to 180% max.  As the *
  3921.  *           search progresses this difficulty level represents the percentage *
  3922.  *           of the nominal target time limit it should use.  It still tries   *
  3923.  *           to complete the current iteration before quitting, so this limit  *
  3924.  *           is a lower bound on the time it will use.  Restored an old idea   *
  3925.  *           from earlier Crafty versions (and even Cray Blitz), that of       *
  3926.  *           trying the killers from two plies earlier in the tree, once the   *
  3927.  *           killers for the current ply have been tried.  Was a +10 Elo gain, *
  3928.  *           added to about +10 for the new time control logic.  Old fail-high *
  3929.  *           restriction removed.  At one point in time, a fail-high on the    *
  3930.  *           null-window search at the root would cause problems.  Crafty was  *
  3931.  *           modified so that the fail-high was ignored if the re-search       *
  3932.  *           failed low.  Removing this produced an 8 Elo gain.                *
  3933.  *                                                                             *
  3934.  *    23.7   Minor fix to time check code.  Was particularly broken at very    *
  3935.  *           low skill level settings, but it had a small impact everywhere.   *
  3936.  *           Some simplification with the reduction code, and how moves are    *
  3937.  *           counted as they are searched, which would not count any moves     *
  3938.  *           that were pruned, which could delay triggering reductions at a    *
  3939.  *           ply.  Fixed significant killer move bug that would only surface   *
  3940.  *           during a parallel search.  NextMove (remaining moves phase) culls *
  3941.  *           killer moves as it selects, because they have already been tried. *
  3942.  *           Unfortunately, in a parallel search, the killers could get        *
  3943.  *           modified by other threads, which could erroneously cause a move   *
  3944.  *           to be excluded that had not been searched.  I discovered this bug *
  3945.  *           on wac #266 where Crafty normally finds a mate at depth=11, but   *
  3946.  *           a parallel search would often miss the mate completely.  Minor    *
  3947.  *           fix to new "difficulty" time management.  It was possible for a   *
  3948.  *           move to look "easy" (several iterations without finding a new     *
  3949.  *           best move) but it could fail low at the beginning of the next     *
  3950.  *           iteration.  Difficulty would be reduced due to not changing the   *
  3951.  *           best move at previous iterations, so the search could time out    *
  3952.  *           quicker than expected.  Simple fix was to reset difficulty to     *
  3953.  *           100% on a fail low, which makes sense anyway if it was supposed   *
  3954.  *           to be "easy" but the score is mysteriously dropping anyway.       *
  3955.  *                                                                             *
  3956.  *    23.8   MAXPLY changed to 128, which increases the max length of the PV's *
  3957.  *           that can be displayed.  The hash path stuff works so well that it *
  3958.  *           often STILL has PVs with <HT> on the end, after 64 moves are      *
  3959.  *           displayed.  While this can still probably be reached, it should   *
  3960.  *           be much less frequent.  This does mean the search can go for 128  *
  3961.  *           iterations, rather than the old 64 limit, of course.  Bug in      *
  3962.  *           Search() that failed to update the PV on an EGTB hit, which would *
  3963.  *           cause the hashed PV to contain illegal moves.  When Crafty then   *
  3964.  *           tried to display this PV, it would promptly crash.                *
  3965.  *                                                                             *
  3966.  *    24.0   Major changes to portability/platform specific code.  Crafty now  *
  3967.  *           supports Unix and Windows platforms.  All the other spaghetti     *
  3968.  *           code has been removed, with an effort to make the code readable.  *
  3969.  *           Couple of bugs in EvaluateWinningChances() fixed, one in          *
  3970.  *           particular that makes the krp vs kr draw detection unreachable.   *
  3971.  *           strcpy() replaced with memmove() to fix problems with Apple OS X  *
  3972.  *           Mavericks where strcpy() with operands that overlap now causes an *
  3973.  *           application to abort on the spot.  Bug in Search() that caused an *
  3974.  *           inefficiency in the parallel search.  At some point the way moves *
  3975.  *           are counted within a ply was changed, which changed the split     *
  3976.  *           algorithm unintentionally.  The original intent was to search     *
  3977.  *           just one move and then allow splits.  The bug changed this to     *
  3978.  *           search TWO moves before splitting is allowed, which slowed things *
  3979.  *           down quite a bit.  thread[i] is now an array of structures so     *
  3980.  *           that the thread pointers are separated from each other to fit     *
  3981.  *           into separate cache blocks, this avoids excessive cache traffic   *
  3982.  *           since they get changed regularly and were sitting in a single     *
  3983.  *           cache block with 8 cpus on 64 bit architectures.  Bug in new      *
  3984.  *           "difficulty" time usage code would let the program run up against *
  3985.  *           "absolute_time_limit" before stopping the search, even if we      *
  3986.  *           finished an iteration using beyond the normal target.  This       *
  3987.  *           really burned a lot of unnecessary time.  I had previously fixed  *
  3988.  *           the PVS window fail high (at the root) to force such a move to be *
  3989.  *           played in the game.  One unfortunate oversight however was that   *
  3990.  *           when splitting at the root, N different processors could fail     *
  3991.  *           high on N different moves, and they were searching those in       *
  3992.  *           parallel.  I've modified this so that the PVS fail high at the    *
  3993.  *           root exits from Search() (after stopping other busy threads) and  *
  3994.  *           then returns to Iterate() which will print the fail-high notice   *
  3995.  *           and re-start the search with all threads searching just one fail  *
  3996.  *           high move to get a score quicker.  Fail-high/fail-low code clean- *
  3997.  *           up.  In particular, the "delta" value to increment beta or        *
  3998.  *           decrement alpha is now two variables, so that an early fail-low   *
  3999.  *           won't increment the delta value and then the subsequent (hope-    *
  4000.  *           fully) fail-high starts off with a bad increment and jumps beta   *
  4001.  *           too quickly.  All fail-highs at the root return to Iterate(),     *
  4002.  *           even the PVS null-window fail-highs.  This re-starts the search   *
  4003.  *           with all processors working on that one move to get it resolved   *
  4004.  *           much quicker.  Other minor fixes such as when failing low on the  *
  4005.  *           first move, we pop out of search and go back to Iterate() to      *
  4006.  *           lower alpha and start a new search.  Unfortunately, after the     *
  4007.  *           first move is searched, a parallel split at the root would occur, *
  4008.  *           only to be instantly aborted so that we could back out of Search()*
  4009.  *           and then re-start.  Wasted the split time unnecessarily although  *
  4010.  *           it was not a huge amount of time.  Another simplification to the  *
  4011.  *           repetition-detection code while chasing a parallel search bug     *
  4012.  *           was missing repetitions.                                          *
  4013.  *                                                                             *
  4014.  *    24.1   LMR reductions changed to allow a more dynamic reduction amount   *
  4015.  *           rather than just 1 or 2.  An array LMR_reductions[depth][moves]   *
  4016.  *           is initialized at start-up and sets the reduction amount for a    *
  4017.  *           specific depth remaining (larger reduction with more depth left)  *
  4018.  *           and the total moves searched at this node (again a larger         *
  4019.  *           reduction as more moves are searched.)  This can easily be        *
  4020.  *           changed with the new "lmr" command (help lmr for details).  The   *
  4021.  *           old "noise" stuff has been changed.  Now, rather than noise       *
  4022.  *           specifying the number of nodes that have to be searched before    *
  4023.  *           any output is displayed (PV, fail high, etc) it now specifies a   *
  4024.  *           time that must pass before the first output is produced.  This    *
  4025.  *           can still be displayed with noise=0, otherwise noise=n says no    *
  4026.  *           output until n seconds have passed (n can be a fraction of a      *
  4027.  *           second if wanted.)  I restored the old adaptive null-move code,   *
  4028.  *           but changed the reduction (used to be 2 to 3 depending on the     *
  4029.  *           depth remaining) so that it is 3 + depth / 6.  For each 6 plies   *
  4030.  *           of remaining depth, we reduce by another ply, with no real bound  *
  4031.  *           other than the max depth we can reasonably reach.  The "6" in     *
  4032.  *           the above can be changed with the personality command or the new  *
  4033.  *           null m n command.  When the changes to noise were made, Iterate() *
  4034.  *           was also changed so that if the search terminates for any reason  *
  4035.  *           and no PV was displayed, whether because the noise limit was not  *
  4036.  *           satisfied or this search did not produce a PV because it started  *
  4037.  *           at an excessively deep search depth, Crafty now always displays   *
  4038.  *           at least one PV in the log file to show how the game is going to  *
  4039.  *           continue.  One case where this was an issue was where Crafty did  *
  4040.  *           a LONG ponder search because the opponent took an excessive       *
  4041.  *           amount of time to make a move.  If it finishes (say) a 30 ply     *
  4042.  *           search while pondering, when the opponent moves, Crafty will move *
  4043.  *           instantly, but when it starts the next search, we start pondering *
  4044.  *           at iteration 29, which might take a long time to finish.  But we  *
  4045.  *           do still have the PV from the last search (the 30 ply one) and    *
  4046.  *           main() thoughtfully removed the first two moves (the move played  *
  4047.  *           and the move we are now pondering, so we always have something to *
  4048.  *           display, and now we no longer terminate a search with no output   *
  4049.  *           (PV, time, etc) at all.  Generation II of the parallel split code *
  4050.  *           (see Thread() in the thread.c source file comments for specifics) *
  4051.  *           that is a lighter-weight split/copy plus the individual threads   *
  4052.  *           do most of the copying rather than the thread that initiates the  *
  4053.  *           split.  More work on the skill command.  For each 10 units the    *
  4054.  *           skill level is reduced, the search speed is reduced by 50%.       *
  4055.  *           Additionally the null-move and LMR reduction values are also      *
  4056.  *           ramped down so that by the time skill drops below 10, there are   *
  4057.  *           no reductions left.                                               *
  4058.  *                                                                             *
  4059.  *    24.2   Bug in SetTime() fixed.  The absolute time limit was set way too  *
  4060.  *           large in sudden death games (games with no secondary time control *
  4061.  *           to add time on the clock) with an increment.  It was intended to  *
  4062.  *           allow the search to use up to 5x the normal target time, unless   *
  4063.  *           that was larger than 1/2 of the total time remaining, but some-   *
  4064.  *           where along the way that 5x was removed and it always set the     *
  4065.  *           absolute time limit to 1/2 the remaining clock, which would burn  *
  4066.  *           clock time way too quickly.  Complete re-factor of Search() to    *
  4067.  *           take the main loop and move that to a new procedure               *
  4068.  *           SearchMoveList() to eliminate the duplicated search code between  *
  4069.  *           Search() and SearchParallel() which has been replaced by          *
  4070.  *           SearchMoveList().  New addition to NextMove().  It was cleaned up *
  4071.  *           to eliminate the old NextEvasion() code since one was a sub-set   *
  4072.  *           of the other.  A minor change to limit the NPS impact on history  *
  4073.  *           ordering.  We do not do history ordering within 6 plies of a      *
  4074.  *           terminal node, and we only try to order 1/2 of the moves before   *
  4075.  *           giving up and assuming this is an ALL node where ordering does    *
  4076.  *           not matter.                                                       *
  4077.  *                                                                             *
  4078.  *    25.0   Complete re-factor of pawn evaluation code.  There were too many  *
  4079.  *           overlapping terms that made tuning difficult.  Now a pawn is      *
  4080.  *           classified as one specific class, there is no overlap between     *
  4081.  *           classes, which simplifies the code significantly.  The code is    *
  4082.  *           now easier to understand and modify.  In addition, the passed     *
  4083.  *           pawn evaluation was rewritten and consolidates all the passed     *
  4084.  *           pawn evaluation in one place.  The evaluation used to add a bonus *
  4085.  *           for rooks behind passed pawns in rook scoring, blockading some-   *
  4086.  *           where else, etc.  All of this was moved to the passed pawn code   *
  4087.  *           to make it easier to understand and modify.  A limited version of *
  4088.  *           late move pruning (LMP) is used in the last two plies.  Once a    *
  4089.  *           set number of moves have been searched with no fail high, non-    *
  4090.  *           interesting moves are simply skipped in a way similar to futility *
  4091.  *           pruning.  This version also contains a major rewrite of the       *
  4092.  *           parallel search code, now referred to as Generation II.  It has a *
  4093.  *           more lightweight split algorithm, that costs the parent MUCH less *
  4094.  *           effort to split the search.  The key is that now the individual   *
  4095.  *           "helper" threads do all the work, allocating a split block,       *
  4096.  *           copying the data from the parent, etc., rather than the parent    *
  4097.  *           doing it all.  Gen II based on the DTS "late-join" idea so that a *
  4098.  *           thread will try to join existing split points before it goes to   *
  4099.  *           the idle wait loop waiting for some other thread to split with    *
  4100.  *           it.  In fact, this is now the basis for the new split method      *
  4101.  *           where the parent simply creates a split point by allocating a     *
  4102.  *           split block for itself, and then continuing the search, after the *
  4103.  *           parent split block is marked as "joinable".  Now any idle threads *
  4104.  *           just "jump in" without the parent doing anything else, which      *
  4105.  *           means that currently idle threads will "join" this split block if *
  4106.  *           they are in the "wait-for-work" spin loop, and threads that be-   *
  4107.  *           come idle also join in exactly the same way.  This is MUCH more   *
  4108.  *           efficient, and also significantly reduces the number of split     *
  4109.  *           blocks needed during the search.  We also now pre-split the       *
  4110.  *           search when we are reasonably close to the root of the tree,      *
  4111.  *           which is called a "gratuitous split.  This leaves joinable split  *
  4112.  *           points laying around so that whenever a thread becomes idle, it   *
  4113.  *           can join in at these pre-existing split points immediately.  We   *
  4114.  *           now use a much more conservative approach when dealing with fail  *
  4115.  *           highs at the root.  Since LMR and such have introduced greater    *
  4116.  *           levels of search instability, we no longer trust a fail-high at   *
  4117.  *           the root if it fails low on the re-search.  We maintain the last  *
  4118.  *           score returned for every root move, along with the PV.  Either an *
  4119.  *           exact score or the bound score that was returned.  At the end of  *
  4120.  *           the iteration, we sort the root move list using the backed-up     *
  4121.  *           score as the sort key, and we play the move with the best score.  *
  4122.  *           This solves a particularly ugly issue where we get a score for    *
  4123.  *           the first move, then another move fails high, but then fails low  *
  4124.  *           and the re-search produces a score that is actually WORSE than    *
  4125.  *           the original best move.  We still see that, but we always play    *
  4126.  *           the best move now.  One other efficiency trick is that when the   *
  4127.  *           above happens, the search would tend to be less efficient since   *
  4128.  *           the best score for that fail-high/fail-low move is actually worse *
  4129.  *           than the best move/score found so far.  If this happens, the      *
  4130.  *           score is restored to the original best move score (in Search())   *
  4131.  *           so that we continue searching with a good lower bound, not having *
  4132.  *           to deal with moves that would fail high with this worse value,    *
  4133.  *           but not with the original best move's value.  Minor change to     *
  4134.  *           history counters that now rely on a "saturating counter" idea.  I *
  4135.  *           wanted to avoid the aging idea, and it seemed to not be so clear  *
  4136.  *           that preferring history moves by the depth at which they were     *
  4137.  *           good was the way to go.  I returned to a history counter idea I   *
  4138.  *           tested around 2005 but discarded, namely using a saturating       *
  4139.  *           counter.  The idea is that a center value (at present 1024)       *
  4140.  *           represents a zero score.  Decrementing it makes it worse,         *
  4141.  *           incrementing it makes it better.  But to make it saturate at      *
  4142.  *           either end, I only reduce the counter by a fraction of its        *
  4143.  *           distance from the saturation point so that once it gets to either *
  4144.  *           extreme value, it will not be modified further avoiding wrap-     *
  4145.  *           around.  This basic idea was originally reported by Mark Winands  *
  4146.  *           in 2005.  It seems to provide better results (slightly) on very   *
  4147.  *           deep searches.  One impetus for this was an intent to fold this   *
  4148.  *           into a move so that I could sort the moves rather than doing the  *
  4149.  *           selection approach I currently use.  However, this had a bad      *
  4150.  *           effect on testing, since history information is dynamic and is    *
  4151.  *           constantly changing, between two moves at the same ply in fact.   *
  4152.  *           The sort fixed the history counters to the value at the start of  *
  4153.  *           that ply.  This was discarded after testing, but the history      *
  4154.  *           counter based on the saturating counter idea seemed to be OK and  *
  4155.  *           was left in even though it produced minimal Elo gain during       *
  4156.  *           testing.  Change to the way moves are counted, to add a little    *
  4157.  *           more consistency to LMR.  Now Next*() returns an order number     *
  4158.  *           that starts with 1 and monotonically increases, this order number *
  4159.  *           is used for LMR and such decisions that vary things based on how  *
  4160.  *           far down the move list something occurs.  Root move counting was  *
  4161.  *           particularly problematic with parallel searching, now things are  *
  4162.  *           at least "more consistent".  The only negative impact is that now *
  4163.  *           the move counter gets incremented even for illegal moves, but     *
  4164.  *           testing showed this was a no-change change with one thread, and   *
  4165.  *           the consistency with multiple threads made it useful.  New method *
  4166.  *           to automatically tune SMP parameters.  The command is autotune    *
  4167.  *           and "help autotune" will explain how to run it.  Added the        *
  4168.  *           "counter-move" heuristic for move ordering (Jos Uiterwijk, JICCA) *
  4169.  *           which simply remembers a fail high move and the move at the       *
  4170.  *           previous ply.  If the hash, captures or killer moves don't result *
  4171.  *           in a fail high, this move is tried next.  No significant cost,    *
  4172.  *           seems to reduce tree size noticeably.  Added a follow-up idea     *
  4173.  *           based on the same idea, except we pair a move that fails high     *
  4174.  *           with the move two plies back, introducing a sort of "connection"  *
  4175.  *           between them.  This is a sort of "plan" idea where the first move *
  4176.  *           of the pair enables the second move to fail high.  The benefit is *
  4177.  *           that this introduces yet another pair of good moves that get      *
  4178.  *           ordered before history moves, and is therefore not subject to     *
  4179.  *           reduction.  I have been unable to come up with a reference for    *
  4180.  *           this idea, but I believe I first saw it somewhere around the time *
  4181.  *           Fruit showed up, I am thinking perhaps in the JICCA/JICGA.  Any   *
  4182.  *           reference would be appreciated.  Minor change to the way the PV   *
  4183.  *           and fail-hi/fail-low moves are displayed when pondering.  Crafty  *
  4184.  *           now adds the ponder move to the front of the PV enclosed in ( )   *
  4185.  *           so that it is always visible in console mode.  The depths are     *
  4186.  *           reaching such extreme numbers the ponder move scrolls off the top *
  4187.  *           of the screen when running in console mode or when "tail -f" is   *
  4188.  *           used to watch the log file while a game is in progress.  This is  *
  4189.  *           a bit trickier than you might think since Crafty displays the     *
  4190.  *           game move numbers in the PV.  Penalty for pawns on same color as  *
  4191.  *           bishop now only applies when there is one bishop.                 *
  4192.  *                                                                             *
  4193.  *    25.0.1 Cleanup of NextMove() plus a minor ordering bug fix that would    *
  4194.  *           skip counter moves at ply = 2. Added NUMA code to force the hash  *
  4195.  *           tables to be spread across the numa nodes as equally as possible  *
  4196.  *           rather than all of the data sitting on just onenode.  This makes  *
  4197.  *           one specific user policy important.  BEFORE you set the hash size *
  4198.  *           for any of the four hash tables, you should ALWAYS set the max    *
  4199.  *           threads limit first, so that the NUMA trick works correctly.  Of  *
  4200.  *           course, if you do not use -DAFFINITY this is all irrelevant.  The *
  4201.  *           -DNUMA option has been removed.  I no longer use any libnuma      *
  4202.  *           routines.  A new "smpnuma" command is now used to enable/disable  *
  4203.  *           NUMA mode (which really only affects how the hash tables are      *
  4204.  *           cleared, all the other NUMA code works just fine no matter        *
  4205.  *           whether this is enabled or disabled.  Fixed a bug with the xboard *
  4206.  *           memory command that could overflow and cause preposterous malloc  *
  4207.  *           requests.                                                         *
  4208.  *                                                                             *
  4209.  *******************************************************************************
  4210.  */
  4211. int main(int argc, char **argv) {
  4212.   TREE *tree;
  4213.   FILE *personality;
  4214.   int move, readstat, value = 0, i, v, result, draw_type;
  4215.   char announce[128];
  4216.  
  4217. #if defined(UNIX)
  4218.   char path[1024];
  4219.   struct passwd *pwd;
  4220. #else
  4221.   char crafty_rc_file_spec[FILENAME_MAX];
  4222. #endif
  4223. /* Collect environmental variables */
  4224.   char *directory_spec = getenv("CRAFTY_BOOK_PATH");
  4225.  
  4226.   if (directory_spec)
  4227.     strncpy(book_path, directory_spec, sizeof book_path);
  4228.   directory_spec = getenv("CRAFTY_LOG_PATH");
  4229.   if (directory_spec)
  4230.     strncpy(log_path, directory_spec, sizeof log_path);
  4231.   directory_spec = getenv("CRAFTY_TB_PATH");
  4232.   if (directory_spec)
  4233.     strncpy(tb_path, directory_spec, sizeof tb_path);
  4234.   directory_spec = getenv("CRAFTY_RC_PATH");
  4235.   if (directory_spec)
  4236.     strncpy(rc_path, directory_spec, sizeof rc_path);
  4237.   if (getenv("CRAFTY_XBOARD")) {
  4238.     Print(-1, "feature done=0\n");
  4239.     xboard_done = 0;
  4240.   } else if (argc > 1 && !strcmp(argv[1], "xboard")) {
  4241.     Print(-1, "feature done=0\n");
  4242.     xboard_done = 0;
  4243.   }
  4244. /*
  4245.  ************************************************************
  4246.  *                                                          *
  4247.  *  First, parse the command-line options and pick off the  *
  4248.  *  ones that need to be handled before any initialization  *
  4249.  *  is attempted (mainly path commands at present.)         *
  4250.  *                                                          *
  4251.  ************************************************************
  4252.  */
  4253.   AlignedMalloc((void *) ((void *) &tree), 2048, (size_t) sizeof(TREE));
  4254.   block[0] = tree;
  4255.   memset((void *) block[0], 0, sizeof(TREE));
  4256.   tree->ply = 1;
  4257.   input_stream = stdin;
  4258.   for (i = 0; i < 512; i++)
  4259.     args[i] = (char *) malloc(256);
  4260.   if (argc > 1) {
  4261.     for (i = 1; i < argc; i++) {
  4262.       if (strstr(argv[i], "path") || strstr(argv[i], "log") ||
  4263.           strstr(argv[1], "affinity")) {
  4264.         strcpy(buffer, argv[i]);
  4265.         result = Option(tree);
  4266.         if (result == 0)
  4267.           Print(2048, "ERROR \"%s\" is unknown command-line option\n",
  4268.               buffer);
  4269.         display = tree->position;
  4270.       }
  4271.     }
  4272.   }
  4273. /*
  4274.  ************************************************************
  4275.  *                                                          *
  4276.  *  Now, read the crafty.rc/.craftyrc initialization file   *
  4277.  *  and process the commands that need to be handled prior  *
  4278.  *  to initializing things (path commands).                 *
  4279.  *                                                          *
  4280.  ************************************************************
  4281.  */
  4282. #if defined(UNIX)
  4283.   input_stream = fopen(".craftyrc", "r");
  4284.   if (!input_stream)
  4285.     if ((pwd = getpwuid(getuid()))) {
  4286.       sprintf(path, "%s/.craftyrc", pwd->pw_dir);
  4287.       input_stream = fopen(path, "r");
  4288.     }
  4289.   if (input_stream)
  4290. #else
  4291.   sprintf(crafty_rc_file_spec, "%s/crafty.rc", rc_path);
  4292.   if ((input_stream = fopen(crafty_rc_file_spec, "r")))
  4293. #endif
  4294.     while (1) {
  4295.       readstat = Read(1, buffer);
  4296.       if (readstat < 0)
  4297.         break;
  4298.       if (!strstr(buffer, "path"))
  4299.         continue;
  4300.       result = Option(tree);
  4301.       if (result == 0)
  4302.         Print(2048, "ERROR \"%s\" is unknown rc-file option\n", buffer);
  4303.       if (input_stream == stdin)
  4304.         break;
  4305.     }
  4306. /*
  4307.  ************************************************************
  4308.  *                                                          *
  4309.  *   Initialize all data arrays and chess board.            *
  4310.  *                                                          *
  4311.  ************************************************************
  4312.  */
  4313.   Initialize();
  4314. /*
  4315.  ************************************************************
  4316.  *                                                          *
  4317.  *  Now, parse the command-line options and pick off the    *
  4318.  *  ones that need to be handled after initialization is    *
  4319.  *  completed.                                              *
  4320.  *                                                          *
  4321.  ************************************************************
  4322.  */
  4323.   if (argc > 1) {
  4324.     for (i = 1; i < argc; i++)
  4325.       if (strcmp(argv[i], "c"))
  4326.         if (!strstr(argv[i], "path")) {
  4327.           if (strlen(argv[i]) > 255)
  4328.             Print(-1, "ERROR ignoring token %s, 255 character max\n",
  4329.                 argv[i]);
  4330.           else {
  4331.             strcpy(buffer, argv[i]);
  4332.             Print(32, "(info) command line option \"%s\"\n", buffer);
  4333.             result = Option(tree);
  4334.             if (result == 0)
  4335.               Print(2048, "ERROR \"%s\" is unknown command-line option\n",
  4336.                   buffer);
  4337.           }
  4338.         }
  4339.   }
  4340.   display = tree->position;
  4341.   initialized = 1;
  4342.   move_actually_played = 0;
  4343. /*
  4344.  ************************************************************
  4345.  *                                                          *
  4346.  *  Next, read the crafty.rc/.craftyrc initialization file  *
  4347.  *  and process the commands that need to be handled after  *
  4348.  *  engine initialization has been completed.               *
  4349.  *                                                          *
  4350.  ************************************************************
  4351.  */
  4352. #if defined(UNIX)
  4353.   input_stream = fopen(".craftyrc", "r");
  4354.   if (!input_stream)
  4355.     if ((pwd = getpwuid(getuid()))) {
  4356.       sprintf(path, "%s/.craftyrc", pwd->pw_dir);
  4357.       input_stream = fopen(path, "r");
  4358.     }
  4359.   if (input_stream)
  4360. #else
  4361.   sprintf(crafty_rc_file_spec, "%s/crafty.rc", rc_path);
  4362.   if ((input_stream = fopen(crafty_rc_file_spec, "r")))
  4363. #endif
  4364.     while (1) {
  4365.       readstat = Read(1, buffer);
  4366.       if (readstat < 0)
  4367.         break;
  4368.       if (strstr(buffer, "path"))
  4369.         continue;
  4370.       result = Option(tree);
  4371.       if (result == 0)
  4372.         Print(2048, "ERROR \"%s\" is unknown rc-file option\n", buffer);
  4373.       if (input_stream == stdin)
  4374.         break;
  4375.     }
  4376.   input_stream = stdin;
  4377. #if defined(UNIX)
  4378.   if (xboard)
  4379.     signal(SIGINT, SIG_IGN);
  4380. #endif
  4381.   Print(32, "\nCrafty v%s (%d cpus)\n\n", version, Max(smp_max_threads, 1));
  4382.   NewGame(1);
  4383. /*
  4384.  ************************************************************
  4385.  *                                                          *
  4386.  *  Check to see if we can find a "crafty.cpf" personality  *
  4387.  *  file which contains the default personality settings to *
  4388.  *  be used unless overridden by the user.                  *
  4389.  *                                                          *
  4390.  ************************************************************
  4391.  */
  4392.   if ((personality = fopen("crafty.cpf", "r"))) {
  4393.     fclose(personality);
  4394.     Print(-1, "using default personality file \"crafty.cpf\"\n");
  4395.     sprintf(buffer, "personality load crafty.cpf");
  4396.     Option(tree);
  4397.   }
  4398. /*
  4399.  ************************************************************
  4400.  *                                                          *
  4401.  *  This is the "main loop" that never ends unless the user *
  4402.  *  tells Crafty to "quit".  We read commands/moves,        *
  4403.  *  execute them, and when a move is entered we change      *
  4404.  *  sides and execute a search to find a reply.  We repeat  *
  4405.  *  this until the game ends or the opponent gets tired and *
  4406.  *  tells us to terminate the engine.                       *
  4407.  *                                                          *
  4408.  *  Prompt user and read input string for processing.  As   *
  4409.  *  long as Option() returns a non-zero value, continue     *
  4410.  *  reading lines and calling Option().  When Option()      *
  4411.  *  fails to recogize a command, then try InputMove() to    *
  4412.  *  determine if this is a legal move.                      *
  4413.  *                                                          *
  4414.  *  While we are waiting on a move, we call Ponder() which  *
  4415.  *  will find a move that it assumes the opponent will      *
  4416.  *  make, and then it will call Iterate() to find a reply   *
  4417.  *  for that move while we are waiting to see what is       *
  4418.  *  actually played in the game.  Ponder() will return one  *
  4419.  *  of the following "results" (stored in "presult"):       *
  4420.  *                                                          *
  4421.  *  (0) This indicates that Ponder() did not run, either    *
  4422.  *      because pondering is disabled, or we are not in a   *
  4423.  *      state where pondering is allowed, such as using the *
  4424.  *      xboard "force" command to set up a game that will   *
  4425.  *      be continued.                                       *
  4426.  *                                                          *
  4427.  *  (1) This indicates that we pondered a move, the         *
  4428.  *      opponent actually played this move, and we were     *
  4429.  *      able to complete a normal search for the proper     *
  4430.  *      amount of time and have a move ready to use.        *
  4431.  *                                                          *
  4432.  *  (2) This indicates that we pondered a move, but that    *
  4433.  *      for some reason, we did not need to continue until  *
  4434.  *      time ran out.  For example, we found a forced mate  *
  4435.  *      and further searching is not needed.  The search is *
  4436.  *      not "in progress" but we still have a valid move    *
  4437.  *      to play here.                                       *
  4438.  *                                                          *
  4439.  *  (3) We pondered, but the opponent either played a       *
  4440.  *      different move, or else entered a command that      *
  4441.  *      forces us to unwind the search so that the command  *
  4442.  *      can be executed.  In this case, we will re-start    *
  4443.  *      pondering, otherwise we make the correct move and   *
  4444.  *      then start a normal search.                         *
  4445.  *                                                          *
  4446.  ************************************************************
  4447.  */
  4448. /*
  4449.  ************************************************************
  4450.  *                                                          *
  4451.  *  From this point forward, we are in a state where it is  *
  4452.  *                                                          *
  4453.  *             O P P O N E N T ' S turn to move.            *
  4454.  *                                                          *
  4455.  ************************************************************
  4456.  */
  4457.   while (1) {
  4458.     presult = 0;
  4459.     do {
  4460.       if (new_game)
  4461.         NewGame(0);
  4462.       opponent_start_time = ReadClock();
  4463.       input_status = 0;
  4464.       display = tree->position;
  4465.       move = 0;
  4466.       presult = 0;
  4467.       if (xboard_done == 0 && xboard) {
  4468.         xboard_done = 1;
  4469.         Print(-1, "feature done=1\n");
  4470.       }
  4471.       do {
  4472.         if (presult != 2)
  4473.           presult = 0;
  4474.         result = 0;
  4475.         if (pong) {
  4476.           Print(-1, "pong %d\n", pong);
  4477.           pong = 0;
  4478.         }
  4479.         display = tree->position;
  4480.         if (presult != 2 && (move_number != 1 || !game_wtm))
  4481.           presult = Ponder(game_wtm);
  4482.         if (presult == 1)
  4483.           value = last_root_value;
  4484.         else if (presult == 2)
  4485.           value = ponder_value;
  4486.         if (presult == 0 || presult == 2) {
  4487.           if (!xboard) {
  4488.             printf("%s(%d): ", SideToMove(game_wtm), move_number);
  4489.             fflush(stdout);
  4490.           }
  4491.           readstat = Read(1, buffer);
  4492.           if (log_file)
  4493.             fprintf(log_file, "%s(%d): %s\n", SideToMove(game_wtm),
  4494.                 move_number, buffer);
  4495.           if (readstat < 0 && input_stream == stdin) {
  4496.             strcpy(buffer, "end");
  4497.             Option(tree);
  4498.           }
  4499.         }
  4500.         if (presult == 1)
  4501.           break;
  4502.         opponent_end_time = ReadClock();
  4503.         result = Option(tree);
  4504.         if (result == 0) {
  4505.           nargs = ReadParse(buffer, args, " \t;");
  4506.           move = InputMove(tree, 0, game_wtm, 0, 0, args[0]);
  4507.           result = !move;
  4508.           if (move)
  4509.             last_pv.path[1] = 0;
  4510.         } else {
  4511.           input_status = 0;
  4512.           if (result == 3)
  4513.             presult = 0;
  4514.         }
  4515.       } while (result > 0);
  4516.       if (presult == 1)
  4517.         move = ponder_move;
  4518. /*
  4519.  ************************************************************
  4520.  *                                                          *
  4521.  *  We have a move.  Make the move (returned by InputMove)  *
  4522.  *  and then change the side on move (wtm).                 *
  4523.  *                                                          *
  4524.  ************************************************************
  4525.  */
  4526.       if (result == 0) {
  4527.         fseek(history_file, ((move_number - 1) * 2 + 1 - game_wtm) * 10,
  4528.             SEEK_SET);
  4529.         fprintf(history_file, "%9s\n", OutputMove(tree, 0, game_wtm, move));
  4530.         MakeMoveRoot(tree, game_wtm, move);
  4531.         tree->curmv[0] = move;
  4532.         time_used_opponent = opponent_end_time - opponent_start_time;
  4533.         if (!force)
  4534.           Print(1, "              time used: %s\n",
  4535.               DisplayTime(time_used_opponent));
  4536.         TimeAdjust(game_wtm, time_used_opponent);
  4537.         game_wtm = Flip(game_wtm);
  4538.         if (game_wtm)
  4539.           move_number++;
  4540.         move_actually_played = 1;
  4541.         last_opponent_move = move;
  4542. /*
  4543.  ************************************************************
  4544.  *                                                          *
  4545.  *  From this point forward, we are in a state where it is  *
  4546.  *                                                          *
  4547.  *              C R A F T Y ' S turn to move.               *
  4548.  *                                                          *
  4549.  ************************************************************
  4550.  */
  4551. /*
  4552.  ************************************************************
  4553.  *                                                          *
  4554.  *  We have made the indicated move, before we do a search  *
  4555.  *  we need to determine if the present position is a draw  *
  4556.  *  by rule.  If so, Crafty allowed it to happen and must   *
  4557.  *  be satisfied with a draw, so we will claim it and end   *
  4558.  *  the current game.                                       *
  4559.  *                                                          *
  4560.  ************************************************************
  4561.  */
  4562.         if ((draw_type = Repeat3x(tree)) == 1) {
  4563.           Print(1, "I claim a draw by 3-fold repetition.\n");
  4564.           value = DrawScore(game_wtm);
  4565.           if (xboard)
  4566.             Print(-1, "1/2-1/2 {Drawn by 3-fold repetition}\n");
  4567.         }
  4568.         if (draw_type == 2) {
  4569.           Print(1, "I claim a draw by the 50 move rule.\n");
  4570.           value = DrawScore(game_wtm);
  4571.           if (xboard)
  4572.             Print(-1, "1/2-1/2 {Drawn by 50-move rule}\n");
  4573.         }
  4574.         if (Drawn(tree, last_search_value) == 2) {
  4575.           Print(1, "I claim a draw due to insufficient material.\n");
  4576.           if (xboard)
  4577.             Print(-1, "1/2-1/2 {Insufficient material}\n");
  4578.         }
  4579.       } else {
  4580.         tree->status[1] = tree->status[0];
  4581.         presult = 0;
  4582.       }
  4583. #if defined(DEBUG)
  4584.       ValidatePosition(tree, 0, move, "Main(1)");
  4585. #endif
  4586.     } while (force);
  4587. /*
  4588.  ************************************************************
  4589.  *                                                          *
  4590.  *  Now call Iterate() to compute a move for the current    *
  4591.  *  position.  (Note this is not done if Ponder() has al-   *
  4592.  *  ready computed a move.)                                 *
  4593.  *                                                          *
  4594.  ************************************************************
  4595.  */
  4596.     crafty_is_white = game_wtm;
  4597.     if (presult == 2) {
  4598.       if (From(ponder_move) == From(move) && To(ponder_move) == To(move)
  4599.           && Piece(ponder_move) == Piece(move)
  4600.           && Captured(ponder_move) == Captured(move)
  4601.           && Promote(ponder_move) == Promote(move)) {
  4602.         presult = 1;
  4603.         if (!book_move)
  4604.           predicted++;
  4605.       } else
  4606.         presult = 0;
  4607.     }
  4608.     ponder_move = 0;
  4609.     thinking = 1;
  4610.     if (presult != 1) {
  4611.       strcpy(kibitz_text, "n/a");
  4612.       last_pv.pathd = 0;
  4613.       last_pv.pathl = 0;
  4614.       display = tree->position;
  4615.       value = Iterate(game_wtm, think, 0);
  4616.     }
  4617. /*
  4618.  ************************************************************
  4619.  *                                                          *
  4620.  *  We've now completed a search and need to handle a       *
  4621.  *  pending draw offer based on what the search found.      *
  4622.  *                                                          *
  4623.  *  When we get a draw offer, we make a note, but we do not *
  4624.  *  accept it until after we have a chance to see what      *
  4625.  *  happens after making the opponent's move that came with *
  4626.  *  the draw offer.  If he played a blunder, we are not     *
  4627.  *  going to mistakenly accept a draw when we are now       *
  4628.  *  winning.  We make this decision to accept or decline    *
  4629.  *  since we have completed as search and now have a real   *
  4630.  *  score.                                                  *
  4631.  *                                                          *
  4632.  ************************************************************
  4633.  */
  4634.     if (draw_offer_pending) {
  4635.       int drawsc = abs_draw_score;
  4636.  
  4637.       draw_offer_pending = 0;
  4638.       if (move_number < 40 || !accept_draws)
  4639.         drawsc = -300;
  4640.       if (value <= drawsc && (tc_increment != 0 ||
  4641.               tc_time_remaining[Flip(game_wtm)] >= 1000)) {
  4642.         if (xboard)
  4643.           Print(-1, "offer draw\n");
  4644.         else {
  4645.           Print(1, "Draw accepted.\n");
  4646.           if (audible_alarm)
  4647.             printf("%c", audible_alarm);
  4648.           if (speech) {
  4649.             strcpy(announce, "./speak ");
  4650.             strcat(announce, "Drawaccept");
  4651.             v = system(announce);
  4652.             if (v != 0)
  4653.               perror("main() system() error: ");
  4654.           }
  4655.         }
  4656.         Print(-1, "1/2-1/2 {Draw agreed}\n");
  4657.         strcpy(pgn_result, "1/2-1/2");
  4658.       } else {
  4659.         if (!xboard) {
  4660.           Print(1, "Draw declined.\n");
  4661.           if (speech) {
  4662.             strcpy(announce, "./speak ");
  4663.             strcat(announce, "Drawdecline");
  4664.             v = system(announce);
  4665.             if (v != 0)
  4666.               perror("main() system() error: ");
  4667.           }
  4668.         }
  4669.       }
  4670.     }
  4671. /*
  4672.  ************************************************************
  4673.  *                                                          *
  4674.  *  If the last_pv.path is null, then we were either        *
  4675.  *  checkmated or stalemated.  We need to determine which   *
  4676.  *  and end the game appropriately.                         *
  4677.  *                                                          *
  4678.  *  If we do have a PV, we will also check to see if it     *
  4679.  *  leads to mate and make the proper announcement if so.   *
  4680.  *                                                          *
  4681.  ************************************************************
  4682.  */
  4683.     last_pv = tree->pv[0];
  4684.     last_value = value;
  4685.     if (MateScore(last_value))
  4686.       last_mate_score = last_value;
  4687.     thinking = 0;
  4688.     if (!last_pv.pathl) {
  4689.       if (value == -MATE + 1) {
  4690.         over = 1;
  4691.         if (game_wtm) {
  4692.           Print(-1, "0-1 {Black mates}\n");
  4693.           strcpy(pgn_result, "0-1");
  4694.         } else {
  4695.           Print(-1, "1-0 {White mates}\n");
  4696.           strcpy(pgn_result, "1-0");
  4697.         }
  4698.         if (speech) {
  4699.           strcpy(announce, "./speak ");
  4700.           strcat(announce, "Checkmate");
  4701.           v = system(announce);
  4702.           if (v != 0)
  4703.             perror("main() system() error: ");
  4704.         }
  4705.       } else {
  4706.         over = 1;
  4707.         if (!xboard) {
  4708.           Print(1, "stalemate\n");
  4709.           if (speech) {
  4710.             strcpy(announce, "./speak ");
  4711.             strcat(announce, "Stalemate");
  4712.             v = system(announce);
  4713.             if (v != 0)
  4714.               perror("main() system() error: ");
  4715.           }
  4716.         } else
  4717.           Print(-1, "1/2-1/2 {stalemate}\n");
  4718.       }
  4719.     } else {
  4720.       if (value > 32000 && value < MATE - 2) {
  4721.         Print(1, "\nmate in %d moves.\n\n", (MATE - value) / 2);
  4722.         Kibitz(1, game_wtm, 0, 0, (MATE - value) / 2, tree->nodes_searched, 0,
  4723.             0, " ");
  4724.       } else if (-value > 32000 && -value < MATE - 1) {
  4725.         Print(1, "\nmated in %d moves.\n\n", (MATE + value) / 2);
  4726.         Kibitz(1, game_wtm, 0, 0, -(MATE + value) / 2, tree->nodes_searched,
  4727.             0, 0, " ");
  4728.       }
  4729. /*
  4730.  ************************************************************
  4731.  *                                                          *
  4732.  *  See if we want to offer a draw based on the recent      *
  4733.  *  scores that have been returned.  See resign.c for more  *
  4734.  *  details, but this is where we offer a draw, or resign,  *
  4735.  *  if appropriate.  This has nothing to do with claiming a *
  4736.  *  draw by rule, which is done later.                      *
  4737.  *                                                          *
  4738.  ************************************************************
  4739.  */
  4740.       tree->status[MAXPLY] = tree->status[0];
  4741.       ResignOrDraw(tree, value);
  4742. /*
  4743.  ************************************************************
  4744.  *                                                          *
  4745.  *  Now output the move chosen by the search, and the       *
  4746.  *  "result" string if this move checkmates our opponent.   *
  4747.  *                                                          *
  4748.  ************************************************************
  4749.  */
  4750.       if (speech) {
  4751.         char *moveptr = OutputMove(tree, 0, game_wtm, last_pv.path[1]);
  4752.  
  4753.         strcpy(announce, "./speak ");
  4754.         strcat(announce, moveptr);
  4755.         strcat(announce, " &");
  4756.         v = system(announce);
  4757.         if (v != 0)
  4758.           perror("main() system() error: ");
  4759.       }
  4760.       if (!xboard && audible_alarm)
  4761.         printf("%c", audible_alarm);
  4762.       Print(1, "%s(%d): %s\n", SideToMove(game_wtm), move_number,
  4763.           OutputMove(tree, 0, game_wtm, last_pv.path[1]));
  4764.       if (xboard)
  4765.         printf("move %s\n", OutputMove(tree, 0, game_wtm, last_pv.path[1]));
  4766.       fflush(stdout);
  4767.       if (value == MATE - 2) {
  4768.         if (game_wtm) {
  4769.           Print(-1, "1-0 {White mates}\n");
  4770.           strcpy(pgn_result, "1-0");
  4771.         } else {
  4772.           Print(-1, "0-1 {Black mates}\n");
  4773.           strcpy(pgn_result, "0-1");
  4774.         }
  4775.       }
  4776.       time_used = program_end_time - program_start_time;
  4777.       Print(1, "              time used: %s\n", DisplayTime(time_used));
  4778.       TimeAdjust(game_wtm, time_used);
  4779.       fseek(history_file, ((move_number - 1) * 2 + 1 - game_wtm) * 10,
  4780.           SEEK_SET);
  4781.       fprintf(history_file, "%9s\n", OutputMove(tree, 0, game_wtm,
  4782.               last_pv.path[1]));
  4783.       last_search_value = value;
  4784.       if (kibitz) {
  4785.         if (kibitz_depth)
  4786.           Kibitz(2, game_wtm, kibitz_depth, end_time - start_time, value,
  4787.               tree->nodes_searched, busy_percent, (int) tree->egtb_hits, // Pierre-Marie Baty -- added type cast
  4788.               kibitz_text);
  4789.         else
  4790.           Kibitz(4, game_wtm, 0, 0, 0, 0, 0, 0, kibitz_text);
  4791.       }
  4792.       MakeMoveRoot(tree, game_wtm, last_pv.path[1]);
  4793.       tree->curmv[0] = move;
  4794. /*
  4795.  ************************************************************
  4796.  *                                                          *
  4797.  *  From this point forward, we are in a state where it is  *
  4798.  *                                                          *
  4799.  *          O P P O N E N T ' S turn to move.               *
  4800.  *                                                          *
  4801.  *  We have made the indicated move, we need to determine   *
  4802.  *  if the present position is a draw by rule.  If so, we   *
  4803.  *  need to send the appropriate game result to xboard      *
  4804.  *  and/or inform the operator/opponent.                    *
  4805.  *                                                          *
  4806.  ************************************************************
  4807.  */
  4808.       game_wtm = Flip(game_wtm);
  4809.       if (game_wtm)
  4810.         move_number++;
  4811.       move_actually_played = 1;
  4812.       if ((draw_type = Repeat3x(tree)) == 1) {
  4813.         Print(1, "I claim a draw by 3-fold repetition after my move.\n");
  4814.         if (xboard)
  4815.           Print(-1, "1/2-1/2 {Drawn by 3-fold repetition}\n");
  4816.         value = DrawScore(game_wtm);
  4817.       }
  4818.       if (draw_type == 2 && last_search_value < 32000) {
  4819.         Print(1, "I claim a draw by the 50 move rule after my move.\n");
  4820.         if (xboard)
  4821.           Print(-1, "1/2-1/2 {Drawn by 50-move rule}\n");
  4822.         value = DrawScore(game_wtm);
  4823.       }
  4824.       if (Drawn(tree, last_search_value) == 2) {
  4825.         Print(1,
  4826.             "I claim a draw due to insufficient material after my move.\n");
  4827.         if (xboard)
  4828.           Print(-1, "1/2-1/2 {Insufficient material}\n");
  4829.       }
  4830. #if !defined(TEST)
  4831.       if (time_limit > 300)
  4832. #endif
  4833.         if (log_file)
  4834.           DisplayChessBoard(log_file, tree->position);
  4835. /*
  4836.  ************************************************************
  4837.  *                                                          *
  4838.  *  Save the ponder_move from the current principal         *
  4839.  *  variation, then shift it left two moves to use as the   *
  4840.  *  starting point for the next search.  Adjust the depth   *
  4841.  *  to start the next search at the right iteration.        *
  4842.  *                                                          *
  4843.  ************************************************************
  4844.  */
  4845.       if (last_pv.pathl > 2 && VerifyMove(tree, 0, game_wtm, last_pv.path[2])) {
  4846.         ponder_move = last_pv.path[2];
  4847.         for (i = 1; i < (int) last_pv.pathl - 2; i++)
  4848.           last_pv.path[i] = last_pv.path[i + 2];
  4849.         last_pv.pathl = (last_pv.pathl > 2) ? last_pv.pathl - 2 : 0;
  4850.         last_pv.pathd -= 2;
  4851.         if (last_pv.pathd > last_pv.pathl)
  4852.           last_pv.pathd = last_pv.pathl;
  4853.         if (last_pv.pathl == 0)
  4854.           last_pv.pathd = 0;
  4855.         tree->pv[0] = last_pv;
  4856.       } else {
  4857.         last_pv.pathd = 0;
  4858.         last_pv.pathl = 0;
  4859.         ponder_move = 0;
  4860.         tree->pv[0] = last_pv;
  4861.       }
  4862.     }
  4863. #if defined(TEST)
  4864.     strcpy(buffer, "score");
  4865.     Option(tree);
  4866. #endif
  4867.     if ((i = GameOver(game_wtm))) {
  4868.       if (i == 1)
  4869.         Print(-1, "1/2-1/2 {stalemate}\n");
  4870.     }
  4871.     if (book_move) {
  4872.       moves_out_of_book = 0;
  4873.       predicted++;
  4874.       if (ponder_move)
  4875.         sprintf(book_hint, "%s", OutputMove(tree, 0, game_wtm, ponder_move));
  4876.     } else
  4877.       moves_out_of_book++;
  4878. #if defined(DEBUG)
  4879.     ValidatePosition(tree, 0, last_pv.path[1], "Main(2)");
  4880. #endif
  4881. /*
  4882.  ************************************************************
  4883.  *                                                          *
  4884.  *  Now execute LearnValue() to record the scores for the   *
  4885.  *  first N searches out of book.  see learn.c for details  *
  4886.  *  on how this is used and when.                           *
  4887.  *                                                          *
  4888.  ************************************************************
  4889.  */
  4890.     if (learning && moves_out_of_book && !learn_value)
  4891.       LearnValue(last_value, last_pv.pathd + 2);
  4892.     if (learn_positions_count < 63) {
  4893.       learn_seekto[learn_positions_count] = book_learn_seekto;
  4894.       learn_key[learn_positions_count] = book_learn_key;
  4895.       learn_nmoves[learn_positions_count++] = book_learn_nmoves;
  4896.     }
  4897.     if (mode == tournament_mode) {
  4898.       strcpy(buffer, "clock");
  4899.       Option(tree);
  4900.       Print(32, "if clocks are wrong, use 'settc' command to adjust them\n");
  4901.     }
  4902.   }
  4903. }
  4904.