home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Jeux / Reflexion / Crafty-15.19.lha / crafty-15.19 / src / main.c < prev    next >
C/C++ Source or Header  |  1998-09-18  |  195KB  |  2,712 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "chess.h"
  5. #include "data.h"
  6. #if defined(UNIX) || defined(AMIGA)
  7. #  include <unistd.h>
  8. #  include <pwd.h>
  9. #  include <sys/types.h>
  10. #endif
  11. #include <signal.h>
  12.  
  13. /* last modified 06/05/98 */
  14. /*
  15. *******************************************************************************
  16. *                                                                             *
  17. *  Crafty, copyrighted 1996 by Robert M. Hyatt, Ph.D., Associate Professor    *
  18. *  of Computer and Information Sciences, University of Alabama at Birmingham. *
  19. *                                                                             *
  20. *  All rights reserved.  No part of this program may be reproduced in any     *
  21. *  form or by any means, for any commercial (for profit/sale) reasons.  This  *
  22. *  program may be freely distributed, used, and modified, so long as such use *
  23. *  does not in any way result in the sale of all or any part of the source,   *
  24. *  the executables, or other distributed materials that are a part of this    *
  25. *  package.                                                                   *
  26. *                                                                             *
  27. *  Crafty is the "son" (direct descendent) of Cray Blitz.  it is designed     *
  28. *  totally around the bit-board data structure for reasons of speed of ex-    *
  29. *  ecution, ease of adding new knowledge, and a *significantly* cleaner       *
  30. *  overall design.  it is written totally in ANSI C with some few UNIX system *
  31. *  calls required for I/O, etc.                                               *
  32. *                                                                             *
  33. *  main() is the driver for the chess program.  its primary function is to    *
  34. *  cycle between asking the user for a move and calling for a tree search     *
  35. *  to produce a move for the program.  after accepting an input string from   *
  36. *  the user, this string is first passed to Option() which checks to see if   *
  37. *  it is a command to the program.  if Option() returns a non-zero result,    *
  38. *  the input was a command and was executed, otherwise the input should be    *
  39. *  passed to input() for conversion to the internal move format.              *
  40. *                                                                             *
  41. *  version  description                                                       *
  42. *                                                                             *
  43. *    1.0    first version of the bit-board program to play a legitimate game  *
  44. *           even though significant features are missing:  transposition      *
  45. *           table, sophisticated scoring, etc.                                *
  46. *                                                                             *
  47. *    1.1    added the minimal window search.  at each ply in the tree, the    *
  48. *           first branch is searched with the normal alpha/beta window, while *
  49. *           remaining nodes are searched with value/value+1 which was         *
  50. *           returned from searching the first branch.  If such a search       *
  51. *           returns the upper bound, this position is once again searched     *
  52. *           with the normal window.                                           *
  53. *                                                                             *
  54. *    1.2    added the classic null-move search.  the program searches the     *
  55. *           sub-tree below the null move (typically) one play shallower than  *
  56. *           the normal search, saving a lot of time.                          *
  57. *                                                                             *
  58. *    1.3    added the transposition table support.  this also includes the    *
  59. *           code in Iterate() necessary to propagate the principal variation  *
  60. *           from one iteration to the next to improve move ordering.          *
  61. *                                                                             *
  62. *    1.4    modified the transposition table to use three tables, one for 64  *
  63. *           bits of white entry, one for 64 bits of black entry, and one with *
  64. *           the remaining 32 bits of white and black entry combined into one  *
  65. *           64 bit word.  eliminated the "bit fields" since they seemed to be *
  66. *           erratic on most compilers and made portability nearly impossible. *
  67. *                                                                             *
  68. *    1.5    pawn scoring added.  this required three additions to the code:   *
  69. *           (1) InitializePawnMasks() which produces the necessary masks to   *
  70. *           let us efficiently detect isolated, backward, passed, etc. pawns; *
  71. *           (2) a pawn hash table to store recently computed pawn scores so   *
  72. *           it won't be too expensive to do complex analysis;  (3) Evaluate() *
  73. *           now evaluates pawns if the current pawn position is not in the    *
  74. *           pawn hash table.                                                  *
  75. *                                                                             *
  76. *    1.6    piece scoring added, although it is not yet complete.  also, the  *
  77. *           search now uses the familiar zero-width window search for all but *
  78. *           the first move at the root, in order to reduce the size of the    *
  79. *           tree to a nearly optimal size.  this means that a move that is    *
  80. *           only one point better than the first move will "fail high" and    *
  81. *           have to be re-searched a second time to get the true value.  if   *
  82. *           the new best move is significantly better, it may have to be      *
  83. *           searched a third time to increase the window enough to return the *
  84. *           score.                                                            *
  85. *                                                                             *
  86. *    1.7    replaced the old "killer" move ordering heuristic with the newer  *
  87. *           "history" ordering heuristic.   this version uses the 12-bit key  *
  88. *           formed by <from><to> to index into the history table.             *
  89. *                                                                             *
  90. *    1.8    added pondering for both PC and UNIX-based machines.  also other  *
  91. *           improvements include the old Cray Blitz algorithm that takes the  *
  92. *           P.V. returned by the tree search, and "extends" it by looking up  *
  93. *           positions in the transposition table, which improves move         *
  94. *           ordering significantly.  repetitions are now handled correctly.   *
  95. *                                                                             *
  96. *    1.9    added an opening book with flags to control which moves are       *
  97. *           selected for play.  the book maintenance code is stubbed directly *
  98. *           into the program, so that no additional executables are needed.   *
  99. *                                                                             *
  100. *    1.10   added king safety + hashing (as done in the old Cray Blitz).      *
  101. *           nothing novel other than the use of bit-masks to speed up some of *
  102. *           the tests.                                                        *
  103. *                                                                             *
  104. *    1.11   additional evaluation knowledge plus log_file so that program     *
  105. *           saves a record of the game statistics for later analysis.  added  *
  106. *           the "annotate" command to make the program analyze a game or part *
  107. *           of a game for testing/debugging.                                  *
  108. *                                                                             *
  109. *    1.12   added ICS (Internet Chess Server) support for Xboard support so   *
  110. *           that Crafty can play on ICS in an automated manner.  added new    *
  111. *           commands to be compatible with Xboard.  Crafty also has a new     *
  112. *           command-line interface that allows options to be entered on the   *
  113. *           command-line directly, ie:  "crafty alarm=off verbose=2" will     *
  114. *           start the program, set the move alarm off, and set verbose to     *
  115. *           2.  this allows an "alias" to easily customize the program.       *
  116. *                                                                             *
  117. *    1.13   added time-control logic to the program.  it now monitors how     *
  118. *           much time both it and its opponent uses when thinking about a     *
  119. *           move to make.  when pondering, it only times itself from the      *
  120. *           point that a move is actually entered.                            *
  121. *                                                                             *
  122. *    1.14   added the piece/square tables to the program to move static       *
  123. *           scoring to the root of the tree since it never changes (things    *
  124. *           like centralization of pieces, etc.)  also some minor tuning of   *
  125. *           numbers to bring positional score "swings" down some.             *
  126. *                                                                             *
  127. *    1.15   added edit so that positions can be altered (and so ICS games     *
  128. *           can be resumed after they are adjourned).  also added a "force"   *
  129. *           command to force the program to play a different move than the    *
  130. *           search selected.  search timing allocation slightly altered to    *
  131. *           improve ICS performance.                                          *
  132. *                                                                             *
  133. *    1.16   significant adjustments to evaluation weights to bring positional *
  134. *           scores down to below a pawn for "normal" positions.  some small   *
  135. *           "tweaks" to king safety as well to keep the king safer.           *
  136. *                                                                             *
  137. *    1.17   added "development" evaluation routine to encourage development   *
  138. *           and castling before starting on any tactical "sorties."  also     *
  139. *           repaired many "bugs" in evaluation routines.                      *
  140. *                                                                             *
  141. *    1.18   added the famous Cray Blitz "square of the king" passed pawn      *
  142. *           evaluation routine.  this will evaluate positions where one       *
  143. *           side has passed pawns and the other side has no pieces, to see    *
  144. *           if the pawn can outrun the defending king and promote.  note that *
  145. *           this is rediculously fast because it only requires one And()      *
  146. *           to declare that a pawn can't be caught!                           *
  147. *                                                                             *
  148. *    2.0    initial version preparing for search extension additions.  this   *
  149. *           version has a new "next_evasion()" routine that is called when    *
  150. *           the king is in check.  it generates sensible (nearly all are      *
  151. *           legal) moves which include capturing the checking piece (if there *
  152. *           is only one), moving the king (but not along the checking ray),   *
  153. *           and interpositions that block the checking ray (if there is only  *
  154. *           one checking piece.                                               *
  155. *                                                                             *
  156. *    2.1    search is now broken down into three cleanly-defined phases:      *
  157. *           (1) basic full-width search [Search()]; (2) extended tactical     *
  158. *           search [extend()] which includes winning/even captures and then   *
  159. *           passed pawn pushes to the 6th or 7th rank (if the pawn pushes     *
  160. *           are safe);  (3) normal quiescence search [Quiesce()] which only   *
  161. *           includes captures that appear to gain material.                   *
  162. *                                                                             *
  163. *    2.2    king safety code re-written and cleaned up.  Crafty was giving    *
  164. *           multiple penalties which was causing the king safety score to be  *
  165. *           extremely large (and unstable.)  now, if it finds something wrong *
  166. *           with king safety, it only penalizes a weakness once.              *
  167. *                                                                             *
  168. *    2.3    king safety code modified further, penalties were significant     *
  169. *           enough to cause search anomolies.  modified rook scoring to avoid *
  170. *           having the rook trapped in the corner when the king is forced to  *
  171. *           move rather than castle, and to keep the rook in a position to be *
  172. *           able to reach open files in one move, which avoids getting them   *
  173. *           into awkward positions where they become almost worthless.        *
  174. *                                                                             *
  175. *    2.4    king safety code completely rewritten.  it now analyzes "defects" *
  176. *           in the king safety field and counts them as appropriate.  these   *
  177. *           defects are then summed up and used as an index into a vector of  *
  178. *           of values that turns them into a score in a non-linear fashion.   *
  179. *           increasing defects quickly "ramp up" the score to about 1/3+ of   *
  180. *           a pawn, then additional faults slowly increase the penalty.       *
  181. *                                                                             *
  182. *    2.5    first check extensions added.  in the extension search (stage     *
  183. *           between full-width and captures-only, up to two checking moves    *
  184. *           can be included, if there are checks in the full-width part of    *
  185. *           the search.  if only one check occurs in the full-width, then     *
  186. *           only one check will be included in the extension phase of the     *
  187. *           selective search.                                                 *
  188. *                                                                             *
  189. *    2.6    evaluation modifications attempting to cure Crafty's frantic      *
  190. *           effort to develop all its pieces without giving a lot of regard   *
  191. *           to the resulting position until after the pieces are out.         *
  192. *                                                                             *
  193. *    2.7    new evaluation code to handle the "outside passed pawn" concept.  *
  194. *           Crafty now understands that a passed pawn on the side away from   *
  195. *           the rest of the pawns is a winning advantage due to decoying the  *
  196. *           king away from the pawns to prevent the passer from promoting.    *
  197. *           the advantage increases as material is removed from the board.    *
  198. *                                                                             *
  199. *    3.0    the 3.* series of versions will primarily be performance en-      *
  200. *           hancements.  the first version (3.0) has a highly modified        *
  201. *           version of MakeMove() that tries to do no unnecessary work.  it   *
  202. *           is about 25% faster than old version of MakeMove() which makes    *
  203. *           Crafty roughly 10% faster.  also calls to Mask() have been        *
  204. *           replaced by constants (which are replaced by calls to Mask() on   *
  205. *           the Crays for speed) to eliminate function calls.                 *
  206. *                                                                             *
  207. *    3.1    significantly modified king safety again, to better detect and    *
  208. *           react to king-side attacks.  Crafty now uses the recursive null-  *
  209. *           move search to depth-2 instead of depth-1, which results in       *
  210. *           slightly improved speed.                                          *
  211. *                                                                             *
  212. *    3.2    null-move restored to depth-1.  depth-2 proved unsafe as Crafty   *
  213. *           was overlooking tactical moves, particularly against itself,      *
  214. *           which lost several "won" games.                                   *
  215. *                                                                             *
  216. *    3.3    additional king-safety work.  Crafty now uses the king-safety     *
  217. *           evaluation routines to compare king safety for both sides.  if    *
  218. *           one side is "in distress" pieces are attracted to that king in    *
  219. *           "big hurry" to either attack or defend.                           *
  220. *                                                                             *
  221. *    3.4    "threat extensions" added.  simply, this is a null-move search    *
  222. *           used to determine if a move is good only because it is a horizon  *
  223. *           effect type move.  we do a null move search after a move fails    *
  224. *           high anywhere in the tree.  the window is normally lowered by 1.5 *
  225. *           pawns, the idea being that if the fail-high move happens in a     *
  226. *           position that fails "really low" with a null move, then this move *
  227. *           might be a horizon move.  to test this, re-search this move with  *
  228. *           the depth increased by one.                                       *
  229. *                                                                             *
  230. *    3.5    50-move rule implemented.  a count of moves since the last pawn   *
  231. *           move or capture is kept as part of the position[] structure.  it  *
  232. *           is updated by MakeMove().  when this number reaches 100 (which    *
  233. *           in plies is 50 moves) RepetitionCheck() will return the draw      *
  234. *           score immediately, just as though the position was a repetition   *
  235. *           draw.                                                             *
  236. *                                                                             *
  237. *    3.6    search extensions cleaned up to avoid excessive extensions which  *
  238. *           produced some wild variations, but which was also slowing things  *
  239. *           down excessively.                                                 *
  240. *                                                                             *
  241. *    3.7    endgame strategy added.  two specifics: KBN vs K has a piece/sq   *
  242. *           table that will drive the losing king to the correct corner.  for *
  243. *           positions with no pawns, scoring is altered to drive the losing   *
  244. *           king to the edge and corner for mating purposes.                  *
  245. *                                                                             *
  246. *    3.8    hashing strategy modified.  Crafty now stores search value or     *
  247. *           bound, *and* positional evaluation in the transposition table.    *
  248. *           this avoids about 10-15% of the "long" evaluations during the     *
  249. *           middlegame, and avoids >75% of them in endgames.                  *
  250. *                                                                             *
  251. *    4.0    evaluation units changed to "millipawns" where a pawn is now      *
  252. *           1000 rather than the prior 100 units.  this provides more         *
  253. *           "resolution" in the evaluation and will let Crafty have large     *
  254. *           positional bonuses for significant things, without having the     *
  255. *           small positional advantages add up and cause problems.  V3.8      *
  256. *           exhibited a propensity to "sac the exchange" frequently because   *
  257. *           of this.  it is hoped that this is a thing of the past now.       *
  258. *           also, the "one legal reply to check" algorithm is now being used. *
  259. *           in short, if one side has only one legal reply to a checking move *
  260. *           then the other side is free to check again on the next ply. this  *
  261. *           only applies in the "extension" search, and allows some checks    *
  262. *           that extend() would normally not follow.                          *
  263. *                                                                             *
  264. *    4.1    extension search modified.  it now "tracks" the basic iteration   *
  265. *           search depth up to some user-set limit (default=6).  for shallow  *
  266. *           depths, this speeds things up, while at deeper depths it lets the *
  267. *           program analyze forcing moves somewhat deeper.                    *
  268. *                                                                             *
  269. *    4.2    extension search modified.  fixed a problem where successive      *
  270. *           passed-pawn pushes were not extended correctly by extend() code.  *
  271. *           threat-extension margin was wrong after changing the value of a   *
  272. *           pawn to 1000, it is now back to 1.5 pawns.                        *
  273. *                                                                             *
  274. *    4.3    hash scoring "repaired."  as the piece/square tables changed, the *
  275. *           transposition table (positional evaluation component) along with  *
  276. *           the pawn and king-safety hash tables prevented the changes from   *
  277. *           affecting the score, since the hashed scores were based on the    *
  278. *           old piece/square table values.  now, when any piece/square table  *
  279. *           is modified, the affected hash tables are cleared fo evaluation   *
  280. *           information.                                                      *
  281. *                                                                             *
  282. *    4.4    piece/square tables simplified, king tropism scoring moved to     *
  283. *           Evaluate() where it is computed dynamically now as it should be.  *
  284. *                                                                             *
  285. *    4.5    book move selection algorithm replaced.  Crafty now counts the    *
  286. *           number of times each book move was played as the book file is     *
  287. *           created.  since these moves come (typically) from GM games, the   *
  288. *           more frequently a move appears, the more likely it is to lead to  *
  289. *           a sound position.  Crafty then enumerates all possible book moves *
  290. *           for the current position, computes a probability distribution for *
  291. *           each move so that Crafty will select a move proportional to the   *
  292. *           number of times it was played in GM games (for example, if e4 was *
  293. *           played 55% of the time, then Crafty will play e4 55% of the time) *
  294. *           although the special case of moves played too infrequently is     *
  295. *           handled by letting the operator set a minimum threshold (say 5)   *
  296. *           Crafty won't play moves that are not popular (or are outright     *
  297. *           blunders as the case may be.)  pushing a passed pawn to the 7th   *
  298. *           rank in the basic search [Search() module] now extends the search *
  299. *           by two plies unless we have extended this ply already (usually a  *
  300. *           check evasion) or unless we have extended the whole line to more  *
  301. *           than twice the nominal iteration depth.                           *
  302. *                                                                             *
  303. *    5.0    selective search extensions removed.  with the extensions now in  *
  304. *           the basic full-width search, these became more a waste of time    *
  305. *           than anything useful, and removing them simplifies things quite   *
  306. *           a bit.                                                            *
  307. *                                                                             *
  308. *    5.1    pondering logic now has a "puzzling" feature that is used when    *
  309. *           the search has no move to ponder.  it does a short search to find *
  310. *           a move and then ponders that move, permanently eliminating the    *
  311. *           "idle" time when it has nothing to ponder.                        *
  312. *                                                                             *
  313. *    5.2    evaluation terms scaled down to prevent positional scores from    *
  314. *           reaching the point that sacrificing material to avoid simple      *
  315. *           positional difficulties begins to look attractive.                *
  316. *                                                                             *
  317. *    5.3    performance improvement produced by avoiding calls to MakeMove()  *
  318. *           when the attack information is not needed.  since the first test  *
  319. *           done in Quiesce() is to see if the material score is so bad that  *
  320. *           a normal evaluation and/or further search is futile, this test    *
  321. *           has been moved to inside the loop *before* Quiesce() is           *
  322. *           recursively called, avoiding the MakeMove() work only to          *
  323. *           discover that the resulting position won't be searched further.   *
  324. *                                                                             *
  325. *    5.4    new Swap() function that now understands indirect attacks through *
  326. *           the primary attacking piece(s).  this corrects a lot of sloppy    *
  327. *           move ordering as well as make the "futility" cutoffs added in     *
  328. *           in version 5.3 much more reliable.                                *
  329. *                                                                             *
  330. *    5.5    checks are now back in the quiescence search.  Crafty now stores  *
  331. *           a negative "draft" in the transposition table rather than forcing *
  332. *           any depth < 0 to be zero.  the null-move search now searches the  *
  333. *           null-move to depth-1 (R=1) rather than depth-2 (R=2) which seemed *
  334. *           to cause some tactical oversights in the search.                  *
  335. *                                                                             *
  336. *    5.6    improved move ordering by using the old "killer move" idea.  an   *
  337. *           additional advantage is that the killers can be tried before      *
  338. *           generating any moves (after the captures.)  quiescence now only   *
  339. *           includes "safe" checks (using Swap() to determine if it is a safe *
  340. *           checking move.                                                    *
  341. *                                                                             *
  342. *    5.7    king safety now "hates" a pawn at b3/g3 (white) or b6/g6 (black)  *
  343. *           to try and avoid the resulting mate threats.                      *
  344. *                                                                             *
  345. *    5.8    EvaluateOutsidePassedPawns() fixed to correctly evaluate those    *
  346. *           positions where both sides have outside passed pawns.  before     *
  347. *           this fix, it only evaluated positions where one side had a passed *
  348. *           pawn, which overlooked those won/lost positions where both sides  *
  349. *           have passed pawns but one is "distant" or "outside" the other.    *
  350. *                                                                             *
  351. *    5.9    removed "futility" forward pruning.  exhaustive testing has       *
  352. *           proved that this causes significant tactical oversights.          *
  353. *                                                                             *
  354. *    5.10   added code to handle king and pawn vs king, which understands     *
  355. *           the cases where the pawn can't outrun the king, but has to be     *
  356. *           assisted along by the king.                                       *
  357. *                                                                             *
  358. *    5.11   two king-safety changes.  (1) the program's king safety score is  *
  359. *           now "doubled" to make it much less likely that it will try to win *
  360. *           a pawn but destroy it's king-side.  (2) the attack threshold has  *
  361. *           been lowered which is used to key the program that it is now      *
  362. *           necessary to move pieces to defend the king-side, in an effort to *
  363. *           protect a king-side that is deemed somewhat unsafe.               *
  364. *                                                                             *
  365. *    5.12   improved null-move code by computing the Knuth/Moore node type    *
  366. *           and then only trying null-moves at type 2 nodes.  this has        *
  367. *           resulted in a 2x speedup in test positions.                       *
  368. *                                                                             *
  369. *    5.13   optimization to avoid doing a call to MakeMove() if it can be     *
  370. *           avoided by noting that the move is not good enough to bring the   *
  371. *           score up to an acceptable level.                                  *
  372. *                                                                             *
  373. *    5.14   artificially isolated pawns recognized now, so that Crafty won't  *
  374. *           push a pawn so far it can't be defended.  also, the bonus for a   *
  375. *           outside passed pawn was nearly doubled.                           *
  376. *                                                                             *
  377. *    5.15   passed pawns supported by a king, or connected passed pawns now   *
  378. *           get a large bonus as they advance.  minor fix to the ICC resume   *
  379. *           feature to try to avoid losing games on time.                     *
  380. *                                                                             *
  381. *    6.0    converted to rotated bitboards to make attack generation *much*   *
  382. *           faster.  MakeMove() now can look up the attack bit vectors        *
  383. *           rather than computing them which is significantly faster.         *
  384. *                                                                             *
  385. *    6.1    added a "hung piece" term to Evaluate() which penalizes the side  *
  386. *           to move if a piece is attacked by a lesser piece, or a piece is   *
  387. *           attacked and not defended at all.  additionally, a new scoring    *
  388. *           term was added to detect a weak back rank (where the king does    *
  389. *           not attack an empty square on the 2nd rank, and there are no      *
  390. *           horizontally sliding pieces [rook or queen] on the first rank to  *
  391. *           guard against back-rank mates.                                    *
  392. *                                                                             *
  393. *    6.2    modified the "futility" cutoff to (a) emulate the way the program *
  394. *           normally searches, but avoiding MakeMove() calls when possible,   *
  395. *           and (2) not searching a move near the horizon if the material     *
  396. *           score is hopeless.                                                *
  397. *                                                                             *
  398. *    6.3    null-move code moved from NextMove() directly into Search().      *
  399. *           this results is a "cleaner" implementation, as well as fixing an  *
  400. *           error in the node type, caused by Search() thinking that after    *
  401. *           the first move tried fails to cause a cutoff, that suddenly this  *
  402. *           node is a type=3 node (Knuth and Moore).  this bug would then     *
  403. *           introduce null-moves into later nodes that are a waste of time.   *
  404. *                                                                             *
  405. *    6.4    pawn scoring modified.  passed pawns were scored low enough that  *
  406. *           Crafty would let the opponent create one in the endgame (as long  *
  407. *           as it wasn't an "outside" passed pawn).  this required adjusting  *
  408. *           isolated pawns as well.  all "weak" pawns (pawns on open files    *
  409. *           that aren't defended by a pawn) are not penalized so much if      *
  410. *           there aren't any rooks/queens to attack on the file.              *
  411. *                                                                             *
  412. *    7.0    removed the to.attack and from.attack bitboards.  these are now   *
  413. *           computed as needed, using the rotated bitboards.  hung piece      *
  414. *           stuff removed due to lack of any verified benefit.                *
  415. *                                                                             *
  416. *    7.1    modified next.c and nextc.c so that they check "mvv_lva_ordering" *
  417. *           to determine which capture ordering strategy to use.  note that   *
  418. *           setting this to "1" (default at present) disables the forward     *
  419. *           pruning in quiescence search that wants to cull losing captures.  *
  420. *                                                                             *
  421. *    7.2    major clean-up of MakeMove() using macros to make it easier to    *
  422. *           read and understand.  ditto for other modules as well.  fixed a   *
  423. *           bug in Evaluate() where bishop scoring failed in endgame          *
  424. *           situations, and discouraged king centralization.                  *
  425. *                                                                             *
  426. *    7.3    Evaluate() is no longer called if material is too far outside the *
  427. *           current alpha/beta window.  the time-consuming part of Evaluate() *
  428. *           is no longer done if the major scoring contributors in Evaluate() *
  429. *           haven't pulled the score within the alpha/beta window, and the    *
  430. *           remainder of Evaluate() can't possible accomplish this either.    *
  431. *           gross error in EvaluatePawns() fixed, which would "forget" all    *
  432. *           of the pawn scoring done up to the point where doubled white      *
  433. *           pawns were found.  error was xx=+ rather than xx+=, which had     *
  434. *           an extremely harmful effect on pawn structure evaluation.         *
  435. *                                                                             *
  436. *    7.4    performance improvements produced by elimination of bit-fields.   *
  437. *           this was accomplished by hand-coding the necessary ANDs, ORs, and *
  438. *           SHIFTs necessary to accomplish the same thing, only faster.       *
  439. *                                                                             *
  440. *    7.5    repetition code modified.  it could store at replist[-1] which    *
  441. *           clobbered the long long word just in front of this array.         *
  442. *                                                                             *
  443. *    7.6    null move search now searches with R=2, unless within 3 plies     *
  444. *           of the quiescence search, then it searches nulls with R=1.        *
  445. *                                                                             *
  446. *    8.0    re-vamp of evaluation, bringing scores back down so that Crafty   *
  447. *           will stop sacrificing the exchange, or a piece for two pawns just *
  448. *           it thinks it has lots of positional compensation.  the next few   *
  449. *           versions are going to be tuning or coding modifications to eval.  *
  450. *                                                                             *
  451. *    8.1    Futility() re-written to be more efficient, as well as to stop    *
  452. *           tossing moves out based on the +/- 2 pawn window, which was too   *
  453. *           speculative.  it still saves roughly 20% in speed over the same   *
  454. *           searches without futility, but seems to have *no* harmful effects *
  455. *           in tests run to date.                                             *
  456. *                                                                             *
  457. *    8.2    Futility() removed once and for all.  since MakeMove() is so      *
  458. *           fast after the new attack generation algorithm, this was actually *
  459. *           slower than not using it.                                         *
  460. *                                                                             *
  461. *    8.3    EvaluatePawns() weak pawn analysis bug fixed.  other minor        *
  462. *           performance enhancements and cleanup.                             *
  463. *                                                                             *
  464. *    8.4    dynamic "king tropism" evaluation term now used, which varies     *
  465. *           based on how exposed the target king is.  the more exposed, the   *
  466. *           larger the bonus for placing pieces near the king.  new "analyze" *
  467. *           feature that complements the "annotate" feature that Crafty has   *
  468. *           had for a while.  "annotate" is used to play over moves that are  *
  469. *           either in the current game history, or have been read in using    *
  470. *           the "read <filename>" command.  analyze, on the other hand, will  *
  471. *           immediately begin searching the current position.  each time the  *
  472. *           operator enters a move, it will make that move on the board, and  *
  473. *           then search the resulting position for the other side.  in effect *
  474. *           this gives a running commentary on a "game in progress".  these   *
  475. *           moves can be pumped into Crafty in many ways so that "on the fly" *
  476. *           analysis of a game-in-progress is possible.                       *
  477. *                                                                             *
  478. *    8.5    more cleanup.  pawn promotions were searched twice, thanks to the *
  479. *           killer moves, although often they resulted in no search overhead  *
  480. *           due to transposition table hits the second time around.  other    *
  481. *           minor fixes, including one serious "undefined variable" in        *
  482. *           Evaluate() that caused grief in endings.                          *
  483. *                                                                             *
  484. *    8.6    new book file structure.  it is no longer necessary to enter the  *
  485. *           "number of records" as Crafty now uses a new compressed hashing   *
  486. *           technique so that the book has no empty space in it, and the size *
  487. *           is computed "on the fly" producing a smaller book without the     *
  488. *           user having to compute the size.  tweaks to Evaluate() to cure    *
  489. *           minor irritating habits.                                          *
  490. *                                                                             *
  491. *    8.7    repaired optimization made in null-move search, that forgot to    *
  492. *           clear "EnPassant_Target".  a double pawn push, followed by a null *
  493. *           left the side on move "very confused" and would let it play an    *
  494. *           illegal enpassant capture in the tree. sort.<n> files are now     *
  495. *           removed after book.bin is created.  also, minor change to book    *
  496. *           format makes it incompatible with older book versions, but also   *
  497. *           allows book lines to be as long as desired, and the book size to  *
  498. *           reach any reasonable size.  dynamic king tropism replaced by a    *
  499. *           dynamic computation, but with a static king tropism score, rather *
  500. *           than a score based on king exposure.  there was simply too much   *
  501. *           interaction, although this may prove workable later.              *
  502. *                                                                             *
  503. *    8.8    tweaks to passed pawn scoring.  scores were too low, making       *
  504. *           Crafty "ignore" them too much.                                    *
  505. *                                                                             *
  506. *    8.9    internal iterative deepening is now used in those rare positions  *
  507. *           where a PV node has no hash move to search.  this does a shallow  *
  508. *           search to depth-2 to find a good move for ordering.               *
  509. *                                                                             *
  510. *    8.10   internal interative deepening modified to handle cases where lots *
  511. *           of tactics make the deepening search fail high or low, and        *
  512. *           occasionally end up with no move to try.  this produced a "bad    *
  513. *           move from hash table" error.                                      *
  514. *                                                                             *
  515. *    8.11   minor bug in internal iterative deepening fixed.  also, macros    *
  516. *           for accessing the "position" data structure are now used to make  *
  517. *           things a little more readable.                                    *
  518. *                                                                             *
  519. *    8.12   fixed minor bugs in quiescence checks, which let Crafty include   *
  520. *           more checks than intended (default quiescence_checks=2, but the   *
  521. *           comparison was <= before including a check, which made it include *
  522. *           three.  Additionally, a hashed check was *always* tried, even if  *
  523. *           quiescence_checks had already been satisfied.  pawn scoring also  *
  524. *           had a bug, in that there was a "crack" between opening and middle *
  525. *           game, where Crafty would conclude that it was in an endgame, and  *
  526. *           adjust the pawn advance scores accordingly, sometimes causing an  *
  527. *           odd a4/a5/etc move "out of the blue."  minor bug in next_capture  *
  528. *           was pruning even exchanges very early in quiescence search.  that *
  529. *           has now been removed, so only losing exchanges are pruned.        *
  530. *                                                                             *
  531. *    8.13   NextCapture() now *always* tries checking moves if the move at    *
  532. *           the previous ply was a null-move.  this avoids letting the null   *
  533. *           move hide some serious mating threats.  a minor bug where Crafty  *
  534. *           could draw by repetition after announcing a mate.  this was a     *
  535. *           result of finding a mate score in hash table, and, after the      *
  536. *           search iteration completed, the mate score would terminate the    *
  537. *           search completely.  now, the search won't terminate until it      *
  538. *           finds a mate shorter than the previous search did.  minor eval    *
  539. *           tweaks and bugfixes as well.                                      *
  540. *                                                                             *
  541. *    8.14   checks after null moves discontinued.  worked in some cases, but, *
  542. *           in general made the tree larger for nothing.  eval tweaks to stop *
  543. *           sacs that resulted in connected passed pawns, often at the        *
  544. *           expense of a minor piece for a pawn or two, which usually lost.   *
  545. *           mobility coeffecient increased for all pieces.  asymmetric king   *
  546. *           safety discontinued.  king safety for both sides is now equally   *
  547. *           important.  king safety is now also proportional to the number of *
  548. *           pieces the other side has, so that a disrupted king-side will     *
  549. *           encourage trading pieces to reduce attacking chances.             *
  550. *                                                                             *
  551. *    8.15   weak pawn scoring modified further.  the changes are designed to  *
  552. *           cause Crafty to keep pawns "mobile" where they can advance,       *
  553. *           rather than letting them become blocked or locked.                *
  554. *                                                                             *
  555. *    8.16   still more weak pawn modifications.  in addition, there is no     *
  556. *           "rook on half-open file" any longer.  if there are only enemy     *
  557. *           pawns on the file, and the most advanced one is weak, then the    *
  558. *           file is treated as though it were open.  technical error in the   *
  559. *           EvaluateDevelopment() code that caused screwey evaluations is     *
  560. *           fixed, making Crafty more likely to castle.  :)  Book() now       *
  561. *           verifies that the current position is in book, before trying any  *
  562. *           moves to see if the resulting positions are in book.  This avoids *
  563. *           something like e4 e5 Bb5 a6 Nf3 from causing Crafty to play Nc6   *
  564. *           which takes it back into book, rather than axb5 winning a piece.  *
  565. *           this will occasionally backfire and prevent Crafty from trans-    *
  566. *           posing back into book, but seems safer at present.                *
  567. *                                                                             *
  568. *    8.17   piece values changed somewhat, to avoid Crafty's propensity to    *
  569. *           make unfavorable trades.  an example:  Crafty is faced with the   *
  570. *           loss of a pawn.  instead, it trades the queen for a rook and      *
  571. *           bishop, which used to be the same as losing a pawn.  this is not  *
  572. *           so good, and often would result in a slow loss.  this version     *
  573. *           also implements several "user-supplied" patches to make Crafty    *
  574. *           compile cleanly on various machines.  In addition, you no longer  *
  575. *           have to continually modify types.h for different configurations.  *
  576. *           the Makefile now supplies a -D<target> to the compiler.  you need *
  577. *           to edit Makefile and set "target" to the appropriate value from   *
  578. *           the list provided.  then, when getting a new version, save your   *
  579. *           Makefile, extract the new source, copy in your makefile and you   *
  580. *           will be ready, except for those rare occasions where I add a new  *
  581. *           source module.  other changes are performance tweaks.  one is a   *
  582. *           simple trick to order captures while avoiding Swap() if possible. *
  583. *           if the captured piece is more valuable than the capturing piece,  *
  584. *           we can simply use the difference (pessimistic value) rather than  *
  585. *           calling Swap() since this pessimistic value is still > 0.  other  *
  586. *           tweaks to the various Next_*() routines to avoid a little un-     *
  587. *           necessary work.                                                   *
  588. *                                                                             *
  589. *    8.18   book move selection algorithm changed.  note that this is highly  *
  590. *           speculative, but when best book play is selected, Crafty will     *
  591. *           use the books.bin file as always.  if there is no move in books,  *
  592. *           Crafty reverts to book.bin, but now finds all known book moves    *
  593. *           and puts them into the root move list.  It then does a fairly     *
  594. *           short search, only considering these moves, and it will play the  *
  595. *           best one so long as the evaluation is acceptable.  if not, it     *
  596. *           simply returns as though there was no book move, and executes a   *
  597. *           search as it normally would.  the book hashing algorithm was also *
  598. *           modified so that the 64-bit hash key is slightly different from   *
  599. *           the real hash key.  in effect, the upper 16 bits are only set as  *
  600. *           a result of the side-not-to-move's pieces.  this means that for a *
  601. *           given position, all the book moves will be in the same "cluster"  *
  602. *           which makes the book dramatically faster, since one seek and read *
  603. *           produces all the possible book moves (plus some others too, since *
  604. *           the upper 16 bits are not unique enough.)  A significant speed    *
  605. *           improvement is noticable, particularly with a 60mb opening book.  *
  606. *           Crafty now understands (if that's the right word) that endings    *
  607. *           with bishops of opposite colors are to be avoided.  when such an  *
  608. *           ending is encountered, the total score is simply divided by two   *
  609. *           to make the ending look more drawish.                             *
  610. *                                                                             *
  611. *    8.19   book selection algorithm further modified, so that the result of  *
  612. *           each game in the GM database is known.  now Crafty will not play  *
  613. *           a move from book, if all games were lost by the side on move,     *
  614. *           hopefully avoiding many blunders.  Crafty now understands how to  *
  615. *           attack if both players castle on opposite sides, by encouraging   *
  616. *           pawn advances against the kings.  other minor modifications to    *
  617. *           the eval values.                                                  *
  618. *                                                                             *
  619. *    8.20   PVS search finally implemented fully.  problems several months    *
  620. *           ago prevented doing the PVS search along the PV itself.  this is  *
  621. *           therefore quite a bit faster, now that it's fully implemented and *
  622. *           working properly.  elapsed time code modified so that Crafty now  *
  623. *           uses gettimeofday() to get fractions of a second elapsed time.    *
  624. *           slight modification time allocation algorithm to avoid using too  *
  625. *           much time early in the game.                                      *
  626. *                                                                             *
  627. *    8.21   courtesy of Mark Bromley, Crafty may run significantly faster on  *
  628. *           your machine.  there are some options in the Makefile that will   *
  629. *           eliminate many of the large attack computation long longs, which  *
  630. *           helps prevent cache thrashing.  on some machines this will be     *
  631. *           slower, on others 20% (or maybe more) faster.  you'll have to     *
  632. *           try -DCOMPACT_ATTACKS, and if that's faster, then it's time to    *
  633. *           try -DUSE_SPLIT_SHIFTS which may help even more.  finally, if you *
  634. *           are running on a supersparc processor, you can use the fastattack *
  635. *           assembly module fastattack.s and get another big boost.  (attack  *
  636. *           function is largest compute user in Crafty at present.) serious   *
  637. *           search problem fixed.  it turns out that Crafty uses the hash     *
  638. *           table to pass PV moves from one iteration to the next, but for    *
  639. *           moves at the root of the tree the hash table has no effect, so a  *
  640. *           special case was added to RootMoveList to check the list of moves *
  641. *           and if one matches the PV move, move it to the front of the list. *
  642. *           this turned out to be critical because after completing a search, *
  643. *           (say to 9 plies) Crafty makes its move, then chops the first two  *
  644. *           moves off of the PV and then passes that to iterate to start a    *
  645. *           search.  this search starts at lastdepth-1 (8 in this case) since *
  646. *           the n-2 search was already done.  the "bug" showed up however, in *
  647. *           that RootMoveList() was not checking for the PV move correctly,   *
  648. *           which meant the root moves were ordered by static eval and static *
  649. *           exchange evaluation.  Normally not a serious problem, just that   *
  650. *           move ordering is not so good.  however, suppose that the opponent *
  651. *           takes a real long time to make a move (say 30 seconds) so that    *
  652. *           Crafty completes a 10 ply search.  it then starts the next search *
  653. *           at depth=9, but with the wrong move first.  if the target time is *
  654. *           not large enough to let it resolve this wrong move and get to the *
  655. *           other moves on the list, Crafty is "confused" into playing this   *
  656. *           move knowing absolutely nothing about it.  the result is that it  *
  657. *           can play a blunder easily.  the circumstances leading to this are *
  658. *           not common, but in a 60 move game, once is enough.  PV was pretty *
  659. *           well mis-handled in carrying moves from one search to another     *
  660. *           (not from one iteration to another, but from one complete search  *
  661. *           to another) and has been fixed.  a cute glitch concerning storing *
  662. *           PV from one iteration to another was also fixed, where the score  *
  663. *           stored was confusing the following search.                        *
  664. *                                                                             *
  665. *    8.22   EPD support (courtesy of Steven Edwards [thanks]) is now standard *
  666. *           in Crafty.  for porting, I'll provide a small test run which can  *
  667. *           be used to validate Crafty once it's been compiled.               *
  668. *                                                                             *
  669. *    8.23   cleanup/speedup in hashing.  LookUp() and Store*() now carefully  *
  670. *           cast the boolean operations to the most efficient size to avoid   *
  671. *           64bit operations when only the right 32 bits are significant.     *
  672. *           RepetitionCheck() code completely re-written to maintain two      *
  673. *           repetition lists, one for each side.  Quiesce() now handles the   *
  674. *           repetition check a little different, being careful to not call    *
  675. *           it when it's unimportant, but calling it when repetitions are     *
  676. *           possible.                                                         *
  677. *                                                                             *
  678. *    8.24   tweaks for king tropism to encourage pieces to collect near the   *
  679. *           king, or to encourage driving them away when being attacked.  a   *
  680. *           modification to Evaluate() to address the problem where Crafty    *
  681. *           is forced to play Kf1 or Kf8, blocking the rook in and getting    *
  682. *           into tactical difficulties as a result.  Book problem fixed where *
  683. *           BookUp was attempting to group moves with a common ancestor       *
  684. *           position together.  unfortunately, captures were separated from   *
  685. *           this group, meaning capture moves in the book could never be      *
  686. *           played.  if a capture was the only move in book, it sort of       *
  687. *           worked because Crafty would drop out of book (not finding the     *
  688. *           capture) and then the search would "save" it.  however, if there  *
  689. *           was a non-capture alternative, it would be forced to play it,     *
  690. *           making it play gambits, and, often, bad ones.  tablebase support  *
  691. *           is now in.  the tablebase files can be downloaded from the ftp    *
  692. *           machine at chess.onenet.net, pub/chess/TB.  currently, Steven     *
  693. *           Edwards has all interesting 4 piece endings done.  to make this   *
  694. *           work, compile with -DTABLEBASES, and create a TB directory where  *
  695. *           Crafty is run, and locate the tablebase files in that directory.  *
  696. *           if you are running under UNIX, TB can be a symbolic or hard link  *
  697. *           to a directory anywhere you want.                                 *
  698. *                                                                             *
  699. *    8.25   minor repair on draw by repetition.  modified how books.bin was   *
  700. *           being used.  now, a move in books.bin has its flags merged with   *
  701. *           the corresponding move from book.bin, but if the move does not    *
  702. *           exist in book.bin, it is still kept as a book move.  repetitions  *
  703. *           are now counted as a draw if they occur two times, period.  the   *
  704. *           last approach was causing problems due to hashing, since the hash *
  705. *           approach used in Crafty is fairly efficient and frequently will   *
  706. *           carry scores across several searches.  this resulted in Crafty    *
  707. *           stumbling into a draw by repetition without knowing.  the con-    *
  708. *           figuration switch HAS-64BITS has been cleaned up and should be    *
  709. *           set for any 64bit architecture now, not just for Cray machines.   *
  710. *                                                                             *
  711. *    8.26   new search extension added, the well-known "one legal response to *
  712. *           check" idea.  if there's only one legal move when in check, we    *
  713. *           extend two plies rather than one, since this is a very forcing    *
  714. *           move.  also, when one side has less than a rook, and the other    *
  715. *           has passed pawns, pushing these pawns to the 6th or 7th rank      *
  716. *           will extend the search one ply, where in normal positions, we     *
  717. *           only extend when a pawn reaches the 7th rank.                     *
  718. *                                                                             *
  719. *    9.0    minor constraint added to most extensions:  we no longer extend   *
  720. *           if the side on move is either significantly ahead or behind,      *
  721. *           depending on the extension.  for example, getting out of check    *
  722. *           won't extend if the side on move is a rook behind, since it's     *
  723. *           already lost anyway.  we don't extend on passed pawn pushes if    *
  724. *           the side on move is ahead a rook, since he's already winning.     *
  725. *           minor adjustments for efficiency as well.  the next few           *
  726. *           versions in this series will have module names in these comments  *
  727. *           indicating which modules have been "cleaned" up.  this is an      *
  728. *           effort at optimizing, although it is currently directed at a line *
  729. *           by line analysis within modules, rather than major changes that   *
  730. *           effect more global ideas.  this type of optimization will come at *
  731. *           a later point in time.                                            *
  732. *                                                                             *
  733. *    9.1    NextMove(), NextCapture() and NextEvasion() were re-structured    *
  734. *           to eliminate unnecessary testing and speed them up significantly. *
  735. *           EvaluateTrades() was completely removed, since Crafty already has *
  736. *           positional scores that encourage/discourage trading based on the  *
  737. *           status of the game.  EvaluateTempo() was evaluated to be a        *
  738. *           failure and was removed completely.                               *
  739. *                                                                             *
  740. *    9.2    Quiesce()) and Search() were modified to be more efficient.  in   *
  741. *           addition, the null-move search was relaxed so that it always does *
  742. *           a search to depth-R, even if close to the end of the tree.        *
  743. *                                                                             *
  744. *    9.3    Check() is no longer used to make sure a position is legal after  *
  745. *           MakeMove() called, but before Search() is called recursively.  We *
  746. *           now use the same approach as Cray Blitz, we make a move and then  *
  747. *           capture the king at the next ply to prove the position is not a   *
  748. *           valid move.  if the side-on-move is already in check, we use      *
  749. *           NextEvasion() which only generates legal moves anyway, so this    *
  750. *           basically eliminates 1/2 of the calls to Check(), a big win.      *
  751. *           this resulted in modifications to Search(), Quiesce(), and        *
  752. *           QuiesceFull().  connected passed pawns on 6th-7th no longer       *
  753. *           trigger search extensions.  solved some problems like Win at      *
  754. *           Chess #2, but overall was a loser.                                *
  755. *                                                                             *
  756. *    9.4    Lookup now checks the transposition table entry and then informs  *
  757. *           Search() when it appears that a null move is useless.  this is    *
  758. *           found when the draft is too low to use the position, but it is at *
  759. *           least as deep as a null-move search would go, and the position    *
  760. *           did not cause a fail-high when it was stored.  king-safety was    *
  761. *           modified again.  the issue here is which king should attract the  *
  762. *           pieces, and for several months the answer has been the king that  *
  763. *           is most exposed attracts *all* pieces.  this has been changed to  *
  764. *           always attract one side's pieces to the other king.  Crafty's     *
  765. *           asymmetric king-safety was making it overly-defensive, even when  *
  766. *           the opponent's king was more exposed.  this should cure that and  *
  767. *           result in more aggressive play.                                   *
  768. *                                                                             *
  769. *    9.5    "vestigial code" (left over from who-knows-when) rmoved from      *
  770. *           Evaluate().  this code used an undefined variable when there was  *
  771. *           no bishop or knight left on the board, and could add in a penalty *
  772. *           on random occasions.  quiescence checks removed completely to see *
  773. *           how this works, since checks extend the normal search significant *
  774. *           amounts in any case.  QuiesceFull() removed and merged into       *
  775. *           Quiesce() which is faster and smaller.  first impression: faster, *
  776. *           simpler, better.  the benefit of no quiescence checks is that the *
  777. *           exhaustive search goes deeper to find positional gains, rather    *
  778. *           than following checks excessively.  No noticable loss in tactical *
  779. *           strength (so far).                                                *
  780. *                                                                             *
  781. *    9.6    legal move test re-inserted in Search() since null-moves could    *
  782. *           make it overlook the fact that a move was illegal.  new assembly  *
  783. *           code for X86 improves performance about 1/3, very similarly to    *
  784. *           the results obtained with the sparc-20 assembly code.  this was   *
  785. *           contributed by Eugene Nalimov and is a welcome addition.          *
  786. *                                                                             *
  787. *    9.7    optimizations continuing.  minor bug in pawn evaluation repaired. *
  788. *           Crafty looked at most advanced white pawn, but least-advanced     *
  789. *           black pawn on a file when doing its weak pawn evaluation.  the    *
  790. *           history heuristic was slightly broken, in that it was supposed to *
  791. *           be incrementing the history count by depth*depth, but this was    *
  792. *           somehow changed to 7*depth, which was not as good.  assembly      *
  793. *           language interface fixed to cleanly make Crafty on all target     *
  794. *           architectures.                                                    *
  795. *                                                                             *
  796. *    9.8    the first change was to borrow a time-allocation idea from Cray   *
  797. *           Blitz.  essentially, when Crafty notices it has used the normal   *
  798. *           time allotment, rather than exiting the search immediately, it    *
  799. *           will wait until it selects the next move at the root of the tree. *
  800. *           the intent of this is that if it has started searching a move     *
  801. *           that is going to be better than the best found so far, this will  *
  802. *           take more time, while a worse move will fail low quickly.  Crafty *
  803. *           simply spends more time to give this move a chance to fail high   *
  804. *           or else quickly fail low.  a fairly serious bug, that's been      *
  805. *           around for a long time, has finally been found/fixed.  in simple  *
  806. *           terms, if the "noise" level was set too high, it could make       *
  807. *           Crafty actually play a bad move.  the more likely effect was to   *
  808. *           see "bad move hashed" messages and the first few lines of output  *
  809. *           from the search often looked funny.  the bug was "noise" was used *
  810. *           as a limit, until that many nodes had been searched, no output    *
  811. *           would be produced.  unfortunately, on a fail-high condition, the  *
  812. *           same code that produced the "++  Nh5" message also placed the     *
  813. *           fail-high move in the PV.  failing to do this meant that the      *
  814. *           search could fail high, but not play the move it found.  most     *
  815. *           often this happened in very fast games, or near the end of long   *
  816. *           zero-increment games.  it now always saves this move as it should *
  817. *           regardless of whether it prints the message or not.               *
  818. *                                                                             *
  819. *    9.9    interface to Xboard changed from -ics to -xboard, so that -ics    *
  820. *           can be used with the custom interface.  additional code to        *
  821. *           communicate with custom interface added.  Search() extensions are *
  822. *           restricted so that there can not be more than one extension at a  *
  823. *           node, rather than the two or (on occasion) more of the last       *
  824. *           version.                                                          *
  825. *                                                                             *
  826. *    9.10   converted to Ken Thompson's "Belle" hash table algorithm.  simply *
  827. *           put, each side has two tables, one that has entries replaced on a *
  828. *           depth-priority only, the other is an "always replace" table, but  *
  829. *           is twice as big.  this allows "deep" entries to be kept along     *
  830. *           with entries close to search point.  basically, when the depth-   *
  831. *           priority table gets a position stored in it, the displaced        *
  832. *           position is moved to the always-replace table.  if the position   *
  833. *           can not replace the depth-priority entry, it always overwrites    *
  834. *           the other always-replace entry.  however, a position is never put *
  835. *           in both tables at the same time.                                  *
  836. *                                                                             *
  837. *    9.11   bug in Search() that could result in the "draft" being recorded   *
  838. *           incorrectly in the hash table.  caused by passing depth, which    *
  839. *           could be one or two plies more than it should be due to the last  *
  840. *           move extending the search.  RepetitionCheck() completely removed  *
  841. *           from Quiesce() since only capture moves are included, and it's    *
  842. *           impossible to repeat a position once a capture has been made.     *
  843. *                                                                             *
  844. *    9.12   optimizations: history.c, other minor modifications.              *
  845. *                                                                             *
  846. *    9.13   EvaluatePawns() modified significantly to simplify and be more    *
  847. *           accurate as well.  pawns on open files are now not directly       *
  848. *           penalized if they are weak, rather the penalty is added when the  *
  849. *           rooks are evaluated.  pawn hashing modified to add more info to   *
  850. *           the data that is hashed.  king safety scores toned down almost    *
  851. *           50% although it is still asymmetric.                              *
  852. *                                                                             *
  853. *    9.14   EvaluatePawns() modified further so that it now does the same     *
  854. *           computations for king safety as the old EvaluateKingSafety*()     *
  855. *           modules did, only it produces four values, two for each king,     *
  856. *           for each side of the board (king or queen-side).  this is now     *
  857. *           hashed with the rest of the pawn scoring, resulting in less       *
  858. *           hashing and computation, and more hits for king-safety too.  king *
  859. *           safety modified further.  asymmetric scoring was accidentally     *
  860. *           disabled several versions ago, this is now enabled again.         *
  861. *                                                                             *
  862. *    9.15   Evaluate() now attempts to recognize the case where a knight is   *
  863. *           trapped on one of the four corner squares, much like a bishop     *
  864. *           trapped at a2/a7/h2/h7.  if a knight is on a corner square, and   *
  865. *           neither of the two potential flight squares are safe (checked by  *
  866. *           Swap()) then a large penalty is given.  this was done to avoid    *
  867. *           positions where Crafty would give up a piece to fork the king and *
  868. *           rook at (say) c7, and pick up the rook at a8 and think it was an  *
  869. *           exchange ahead, when often the knight was trapped and it was      *
  870. *           two pieces for a rook and pawn (or worse.)  two timing bugs fixed *
  871. *           in this version:  (1) nodes_per_second was getting clobbered at   *
  872. *           the end of iterate, which would then corrupt the value stored in  *
  873. *           nodes_between_time_checks and occasionally make Crafty not check  *
  874. *           the time very often and use more time than intended; (2) the      *
  875. *           "don't stop searching after time is out, until the current move   *
  876. *           at the root of the tree has been searched" also would let Crafty  *
  877. *           use time unnecessarily.                                           *
  878. *                                                                             *
  879. *    9.16   significant changes to the way MakeMove() operates.  rather than  *
  880. *           copying the large position[ply] structure around, the piece       *
  881. *           location bitmaps and the array of which piece is on which square  *
  882. *           are now simple global variables.  this means that there is now an *
  883. *           UnMakeMove() function that must be used to restore these after a  *
  884. *           a move has been made.  the benefit is that we avoid copying 10    *
  885. *           bitmaps for piece locations when typically only one is changed,   *
  886. *           ditto for the which piece is on which square array which is 64    *
  887. *           bytes long.  the result is much less memory traffic, with the     *
  888. *           probability that the bitmaps now stay in cache all the time. the  *
  889. *           EvaluatePawns() code now has an exponential-type penalty for      *
  890. *           isolated pawns, but it penalizes the difference between white and *
  891. *           black isolated pawns in this manner.  king evaluation now         *
  892. *           evaluates cases where the king moves toward one of the rooks and  *
  893. *           traps it in either corner.                                        *
  894. *                                                                             *
  895. *    9.17   Xboard compatibility version!  now supports, so far as I know,    *
  896. *           the complete xboard interface, including hint, show thinking,     *
  897. *           taking back moves, "move now" and so forth.  additionally, Crafty *
  898. *           now works with standard xboard.  notice that this means that a    *
  899. *           ^C (interrupt) will no long terminate crafty, because xboard uses *
  900. *           this to implement the "move now" facility.  this should also      *
  901. *           work with winboard and allow pondering, since there is now a      *
  902. *           special windows version of CheckInput() that knows how to check   *
  903. *           Win95 or WinNT pipes when talking with winboard.                  *
  904. *                                                                             *
  905. *    9.18   Xboard compatibility update.  "force" (gnu) mode was broken, so   *
  906. *           that reading in a PGN file (via xboard) would break.  now, Crafty *
  907. *           can track the game perfectly as xboard reads the moves in.  king  *
  908. *           safety modified to discourage g3/g6 type moves without the bishop *
  909. *           to defend the weak squares.  significant other changes to the     *
  910. *           Evaluate() procedure and its derivatives.  very nasty trans/ref   *
  911. *           bug fixed.  been there since transposition tables added.  when    *
  912. *           storing a mate score, it has to be adjusted since it's backed up  *
  913. *           as "mate in n plies from root" but when storing, it must be saved *
  914. *           as "mate in n plies from current position".  trivial, really, but *
  915. *           I overlooked one important fact:  mate scores can also be upper   *
  916. *           or lower search bounds, and I was correcting them in the same way *
  917. *           which is an error.  the effect was that crafty would often find a *
  918. *           mate in 2, fail high on a move that should not fail high, and end *
  919. *           up making a move that would mate in 3.  in particularly bad cases *
  920. *           this would make the search oscillate back and forth and draw a    *
  921. *           won position.  the fix was to only adjust the score if it's a     *
  922. *           score, not if it's a bound.  the "age" field of the trans/ref     *
  923. *           table was expanded to 3 bits.  iterate now increments a counter   *
  924. *           modulo 8, and this counter is stored in the 3 ID bits of the      *
  925. *           trans/ref table.  if they are == the transposition_id counter,    *
  926. *           we know that this is a position stored during the current search. *
  927. *           if not, it's an "old" position.  this avoids the necessity of     *
  928. *           stepping through each entry in the trans/ref table (at the begin- *
  929. *           ning of a search) to set the age bit.  much faster in blitz games *
  930. *           as stepping through the trans/ref table, entry by entry, would    *
  931. *           blow out cache.  this idea was borrowed from Cray Blitz, which    *
  932. *           used this same technique for many years.                          *
  933. *                                                                             *
  934. *    9.19   new evaluation code for passed pawns.  Crafty now gives a large   *
  935. *           bonus for two or more connected passed pawns, once they reach the *
  936. *           sixth rank, when the opponent has less than a queen remaining.    *
  937. *           this will probably be tuned as experience produces the special    *
  938. *           cases that "break" it.  such things as the king too far away or   *
  939. *           the amount of enemy material left might be used to further im-    *
  940. *           prove the evaluation.                                             *
  941. *                                                                             *
  942. *    9.20   bug in SetBoard() fixed.  validity checks for castling status and *
  943. *           en passant status was broken for castle status.  it was checking  *
  944. *           the wrong rook to match castling status, and would therefore not  *
  945. *           accept some valid positions, including #8 in Win At Chess suite.  *
  946. *           minor repetition bug fixed, where Crafty would recognize that a   *
  947. *           three-fold repetition had occurred, but would not claim it when   *
  948. *           playing on a chess server.  Crafty now does not immediately re-   *
  949. *           search the first move when it fails low.  rather, it behaves like *
  950. *           Cray Blitz, and searches all moves.  if all fail low, Crafty will *
  951. *           then relax (lower) alpha and search the complete list again.      *
  952. *           this is a simple gamble that there is another move that will      *
  953. *           "save the day" so that we avoid the overhead of finding out just  *
  954. *           how bad the first move is, only to have more overhead when a good *
  955. *           move fails high.  minor repetition bug fixed.  when running test  *
  956. *           suites of problems, SetBoard() neglected to put the starting      *
  957. *           position in the repetition list, which would occasionally waste   *
  958. *           time.  one notable case was Win At Chess #8, where crafty would   *
  959. *           find Nf7+ Kg8 Nh6+ Kh8 (repeating the original position) followed *
  960. *           by Rf7 (the correct move, but 4 tempi behind.)  Display() bug     *
  961. *           fixed.  Crafty now displays the current board position, rather    *
  962. *           than the position that has been modified by a search in progress. *
  963. *           castling evaluation modified including a bug in the black side    *
  964. *           that would tend to make Crafty not castle queen-side as black if  *
  965. *           the king-side was shredded.  minor bug in Book(). if the book was *
  966. *           turned off (which is done automatically when using the test com-  *
  967. *           mand since several of the Win At Chess positions are from games   *
  968. *           in Crafty's large opening book) Book() would still try to read    *
  969. *           the file and then use the data from the uninitialized buffer.     *
  970. *           this would, on occasion, cause Crafty to crash in the middle of   *
  971. *           a test suite run.                                                 *
  972. *                                                                             *
  973. *    9.21   castling evaluation has been significantly modified to handle the *
  974. *           following three cases better:                                     *
  975. *           (a) one side can castle at the root of the tree, but can not      *
  976. *           castle at a tip position.  if the move that gave up the right to  *
  977. *           castle was *not* a castle move, penalize the score.               *
  978. *           (b) one side can castle short or long at the root, but has al-    *
  979. *           ready castled by the time the search reaches a tip position.      *
  980. *           here the goal is to make sure the player castled to the "better"  *
  981. *           side by comparing king safety where the king really is, to king   *
  982. *           safety had the king castled to the other side.  if the latter is  *
  983. *           "safer" then penalize the current position by the "difference"    *
  984. *           in king safety to encourage that side to delay castling.  this is *
  985. *           a problem when Crafty can castle kingside *now*, but the kingside *
  986. *           has been disrupted somehow.  if the search is not deep enough to  *
  987. *           see clearing out the queenside and castling long, then it will    *
  988. *           often castle short rather than not castle at all.  this fix will  *
  989. *           make it delay, develop the queenside, and castle to a safer king  *
  990. *           shelter, unless tactics force it to castle short.                 *
  991. *           (c) one side can castle short or long at the root, but can only   *
  992. *           castle one way at a tip position, because a rook has been moved.  *
  993. *           if the remaining castle option is worse than castling to the side *
  994. *           where the rook was moved, then we penalize the rook move to keep  *
  995. *           castling to that side open as an option.                          *
  996. *                                                                             *
  997. *    9.22   more castling evaluation changes, to tune how/when Crafty chooses *
  998. *           to castle.  bugs in Option() where certain commands could be ex-  *
  999. *           ecuted while a search was in progress.  if these commands did     *
  1000. *           anything to the board position, it would break Crafty badly.      *
  1001. *           all that was needed was to check for an active search before some *
  1002. *           commands were attempted, and if a search was in progress, return  *
  1003. *           to abort the search then re-try the command.  when playing games  *
  1004. *           with computers (primarily a chess-server consideration) Crafty is *
  1005. *           now defaulting to "book random 0" to use a short search to help   *
  1006. *           avoid some ugly book lines on occasion.  in this version, *all*   *
  1007. *           positional scores were divided by 2 to reduce the liklihood that  *
  1008. *           crafty would sacrifice material and make up the loss with some    *
  1009. *           sort of positional gain that was often only temporary.  note that *
  1010. *           king safety scores were not reduced while doing this.  new book   *
  1011. *           random options:  0=search, 1=most popular move, 2=move that       *
  1012. *           produces best positional value, 3=choose from most frequently     *
  1013. *           played moves, 4=emulate GM frequency of move selection, 5=use     *
  1014. *           sqrt() on frequencies to give more randomness, 6=random.  for     *
  1015. *           now, computers get book_random=1, while GM's now get 4 (same as   *
  1016. *           before), everyone else gets 5.  until now, there has been no      *
  1017. *           penalty for doubled/tripled pawns.  it now exists.  also, if the  *
  1018. *           king stands on E1/E8, then the king-side king safety term is used *
  1019. *           to discourage disrupting the king-side pawns before castling.     *
  1020. *           Crafty now has a start-up initialization file (as most Unix       *
  1021. *           programs do).  this file is named ".craftyrc" if the macro UNIX   *
  1022. *           is defined, otherwise a "dossy" filename "crafty.rc" is used.     *
  1023. *           Crafty opens this file and executes every command in it as though *
  1024. *           they were typed by the operator.  the last command *must* be      *
  1025. *           "exit" to revert input back to STDIN.                             *
  1026. *                                                                             *
  1027. *    9.23   more evaluation tuning, including the complete removal of the     *
  1028. *           mobility term for rooks/queens.  since rooks already have lots    *
  1029. *           of scoring terms like open files, connected, etc, mobility is     *
  1030. *           redundant at times and often misleading.  The queen's mobility    *
  1031. *           is so variable it is nearly like introducing a few random points  *
  1032. *           at various places in the search.  minor Xboard compatibility bug  *
  1033. *           fixed where you could not load a game file, then have crafty play *
  1034. *           by clicking the "machine white" or "machine black" options.       *
  1035. *                                                                             *
  1036. *    9.24   minor bug in Quiesce() repaired.  when several mate-in-1 moves    *
  1037. *           were available at the root, Crafty always took the last one,      *
  1038. *           which was often an under-promotion to a rook rather than to a     *
  1039. *           queen.  It looked silly and has been fixed so that it will play   *
  1040. *           the first mate-in-1, not the last.  RootMoveList() went to great  *
  1041. *           pains to make sure that promotion to queen occurs before rook.    *
  1042. *           bug in EvaluateOutsidePassedPawns() would fail to recognize that  *
  1043. *           one side had an outside passer, unless both sides had at least    *
  1044. *           one passer, which failed on most cases seen in real games.        *
  1045. *           minor "tweak" to move ordering.  GenerateMoves() now uses the     *
  1046. *           LastOne() function to enumerate white moves, while still using    *
  1047. *           FirstOne() for black moves.  this has the effect of moving pieces *
  1048. *           toward your opponent before moving them away.  a severe oversight *
  1049. *           regarding the use of "!" (as in wtm=!wtm) was found and corrected *
  1050. *           to speed things up some.  !wtm was replaced by wtm^1 (actually,   *
  1051. *           a macro ChangeSide(wtm) is used to make it more readable) which   *
  1052. *           resulted in significant speedup on the sparc, but a more modest   *
  1053. *           improvement on the pentium.                                       *
  1054. *                                                                             *
  1055. *    9.25   minor bug in Book() fixed where it was possible for crafty to     *
  1056. *           play a book move that was hardly ever played.  minor change to    *
  1057. *           time utilization to use a little more time "up front".  tuned     *
  1058. *           piece/square tables to improve development some.  saw Crafty lose *
  1059. *           an occasional game because (for example) the bishop at c1 or c8   *
  1060. *           had not moved, but the king had already castled, which turned the *
  1061. *           EvaluateDevelopment() module "off".  first[ply] removed, since it *
  1062. *           was redundant with last[ply-1].  the original intent was to save  *
  1063. *           a subscript math operation, but the compilers are quite good with *
  1064. *           the "strength-reduction" optimization, making referencing a value *
  1065. *           by first[ply] or last[ply-1] exactly the same number of cycles.   *
  1066. *           passed pawn scores increased.  the reduction done to reduce all   *
  1067. *           scores seemed to make Crafty less attentive to passed pawns and   *
  1068. *           the threats they incur.  Minor bug in Book() fixed, the variable  *
  1069. *           min_percent_played was inoperative due to incorrect test on the   *
  1070. *           book_status[n] value.  pawn rams now scored a little differently, *
  1071. *           so that pawn rams on Crafty's side of the board are much worse    *
  1072. *           than rams elsewhere.  This avoids positional binds where, for ex- *
  1073. *           ample Crafty would like black with pawns at e6 d5 c6, white with  *
  1074. *           pawns at e5 and c5.  black has a protected passed pawn at d5 for  *
  1075. *           sure, but the cramp makes it easy for white to attack black, and  *
  1076. *           makes it difficult for black to defend because the black pawns    *
  1077. *           block the position badly.  king safety tweaked up about 30%, due  *
  1078. *           to using nearly symmetrical scoring, the values had gotten too    *
  1079. *           small and were not overriding minor positional things.            *
  1080. *                                                                             *
  1081. *    9.26   minor bug fixes in time allocation.  this mainly affects Crafty   *
  1082. *           as it plays on a chess server.  the problem is, simply, that the  *
  1083. *           current internal timing resolution is 1/10 of a second, kept in   *
  1084. *           an integer variable.  .5 seconds is stored as 5, for example.     *
  1085. *           this became a problem when the target time for a search dropped   *
  1086. *           below .3 seconds, because the "easy move" code would terminate    *
  1087. *           the search after 1/3 of the target time elapsed if there were no  *
  1088. *           fail lows or PV changes.  unfortunately, 2 divided by 3 (.2 secs  *
  1089. *           /3) is "zero" which would let the search quickly exit, possibly   *
  1090. *           without producing a PV with a move for Crafty to play.  Crafty    *
  1091. *           would play the first PV move anyway, which was likely the PV move *
  1092. *           from the last search.  this would corrupt the board information,  *
  1093. *           often produce the error "illegal move" when the opponent tried to *
  1094. *           move, or, on occasion, blow crafty up.  on a chess server, Crafty *
  1095. *           would simply flag and lose.  after this fix, I played several     *
  1096. *           hundred games with a time control of 100 moves in 1 second and    *
  1097. *           there were no failures.  before the fix, this time control could  *
  1098. *           not result in a single completed game.  if you don't run Crafty   *
  1099. *           on a chess server, this version is not important, probably. a     *
  1100. *           minor fix for move input, so that moves like e2e4 will always be  *
  1101. *           accepted, where before they would sometimes be flagged as errors. *
  1102. *                                                                             *
  1103. *    9.27   this version has an interesting modification to NextCapture().    *
  1104. *           Quiesce() now passes alpha to NextCapture() and if a capture      *
  1105. *           appears to win material, but doesn't bring the score up to the    *
  1106. *           value of alpha, the capture is ignored.  in effect, if we are so  *
  1107. *           far behind that a capture still leaves us below alpha, then there *
  1108. *           is nothing to gain by searching the capture because our opponent  *
  1109. *           can simply stand pat at the next ply leaving the score very bad.  *
  1110. *           one exception is if the previous ply was in check, we simply look *
  1111. *           for any safe-looking capture just in case it leads to mate.  bad  *
  1112. *           book bug with book random=1 or 2 fixed (this is set when playing  *
  1113. *           a computer).  this bug would cause crafty to play an illegal move *
  1114. *           and bust wide open with illegal move errors, bad move hashed, and *
  1115. *           other things.  book randomness also quite a bit better now.       *
  1116. *                                                                             *
  1117. *    9.28   piece/square table added for rooks.  primary purpose is to dis-   *
  1118. *           courage rooks moving to the edge of the board but in front of     *
  1119. *           pawns, where it is easy to trap it.  Crafty now understands the   *
  1120. *           concept of blockading a passed pawn to prevent it from advancing. *
  1121. *           it always understood that advancing one was good, which would     *
  1122. *           tend to encourage blockading, but it would also often ignore the  *
  1123. *           pawn and let it advance a little here, a little there, until it   *
  1124. *           suddenly realized that it was a real problem.  the command to set *
  1125. *           the size of the hash table has been modified.  this command is    *
  1126. *           now "hash n", "hash nK" or "hash nM" to set the hash table to one *
  1127. *           of bytes, Kbytes, or Mbytes.  Note that if the size is not an     *
  1128. *           exact multiple of what crafty needs, it silently reduces the size *
  1129. *           to an optimum value as close to the suggested size as possible.   *
  1130. *           trade bonus/penalty is now back in, after having been removed     *
  1131. *           when the new UnMake() code was added.  crafty now tries to trade  *
  1132. *           pawns but not pieces when behind, and tries to trade pieces but   *
  1133. *           not pawns when ahead.  EvaluateDraws() now understands that rook  *
  1134. *           pawns + the wrong bishop is a draw.  minor adjustment to the      *
  1135. *           quiescence-search pruning introduced in 9.27, to avoid excluding  *
  1136. *           captures that didn't lose material, but looked bad because the    *
  1137. *           positional score was low.  slightly increased the values of the   *
  1138. *           pieces relative to that of a pawn to discourage the tendency to   *
  1139. *           trade a piece for two or three pawns plus some positional plusses *
  1140. *           that often would slowly vanish.  null-move search modified to try *
  1141. *           null-moves, even after captures.  this seems to hurt some prob-   *
  1142. *           lem positions, but speeds up others significantly.  seems better  *
  1143. *           but needs close watching.  EvaluateDraws() call moved to the top  *
  1144. *           of Evaluate() to check for absolute draws first.  Quiesce() now   *
  1145. *           always calls Evaluate() which checks for draws before trying the  *
  1146. *           early exit tests to make sure that draws are picked up first.     *
  1147. *           EvaluateDraws() substantially re-written to get rid of lots of    *
  1148. *           unnecessary instructions, and to also detect RP+B of wrong color  *
  1149. *           even if the losing side has a pawn of its own.  Crafty would      *
  1150. *           often refuse to capture that last pawn to avoid reaching an end-  *
  1151. *           game it knew was drawn.                                           *
  1152. *                                                                             *
  1153. *    9.29   new time.c as contributed by Mike Byrne.  basically makes Crafty  *
  1154. *           use more time up front, which is a method of anticipating that    *
  1155. *           Crafty will predict/ponder pretty well and save time later on     *
  1156. *           anyway.  InCheck() is never called in Quiesce() now.  as a        *
  1157. *           result, Crafty won't recognize mates in the q-search.  this has   *
  1158. *           speeded the code up with no visible penalty, other than it will   *
  1159. *           occasionally find a win of material rather than a mate score, but *
  1160. *           this has not affected the problem suite results in a measurable   *
  1161. *           way, other than crafty is now about 10% faster in average type    *
  1162. *           position, and much faster in others.  the latest epd code from    *
  1163. *           Steven Edwards is a part of this version, which includes updated  *
  1164. *           tablebase access code.                                            *
  1165. *                                                                             *
  1166. *   10.0    new time.c with a "monitoring feature" that has two distinct      *
  1167. *           functions:  (1) monitor crafty's time remaining and if it is too  *
  1168. *           far behind the opponent, force it to speed up, or if it is well   *
  1169. *           ahead on time, slow down some;  (2) if opponent starts moving     *
  1170. *           quickly, crafty will speed up as well to avoid getting too far    *
  1171. *           behind.  EvaluateDraws() modified to detect that if one side has  *
  1172. *           insufficient material to win, the score can never favor that side *
  1173. *           which will make Crafty avoid trading into an ending where it has  *
  1174. *           KNN vs KB for example, where KNN seems to be ahead.               *
  1175. *                                                                             *
  1176. *   10.1    new book.c.  crafty now counts wins, losses and draws for each    *
  1177. *           possible book move and can use these to play a move that had a    *
  1178. *           high percentage of wins, vs the old approach of playing a move    *
  1179. *           just because it was played a lot in the past.                     *
  1180. *                                                                             *
  1181. *   10.2    evaluation tuning.  rook on 7th, connected rooks on 7th, etc.,    *
  1182. *           are now more valuable.  Crafty was mistakenly evaluating this     *
  1183. *           too weakly.  book() changed so that the list of moves is first    *
  1184. *           sorted based on winning percentages, but then, after selecting    *
  1185. *           the sub-set of this group, the list is re-sorted based on the     *
  1186. *           raw total games won so that the most popular opening is still the *
  1187. *           most likely to be played.                                         *
  1188. *                                                                             *
  1189. *   10.3    timer resolution changed to 1/100th of a second units, with all   *
  1190. *           timing variables conforming to this, so that it is unnecessary    *
  1191. *           to multiply by some constant to convert one type of timing info   *
  1192. *           to the standard resolution.  bug in evaluate.c fixed.  trapped    *
  1193. *           rook (rook at h1, king at g1 for example) code had a bad sub-     *
  1194. *           script that caused erroneous detection of a trapped rook when     *
  1195. *           there was none.                                                   *
  1196. *                                                                             *
  1197. *   10.4    Quiesce() no longer checks for time exceeded, nor does it do any  *
  1198. *           hashing whatsoever, which makes it significantly faster, while    *
  1199. *           making the trees only marginally bigger.                          *
  1200. *                                                                             *
  1201. *   10.5    Quiesce() now calls GenerateCaptures() to generate capture moves. *
  1202. *           this new move generator module is significantly faster, which     *
  1203. *           speeds the quiescence search up somewhat.                         *
  1204. *                                                                             *
  1205. *   10.6    CastleStatus is now handled slightly differently.  the right two  *
  1206. *           bits still indicate whether or not that side can castle to either *
  1207. *           side, and 0 -> no castling at all, but now, <0 means that no      *
  1208. *           castling can be done, and that castling rights were lost by       *
  1209. *           making a move that was not castling.  this helps in Evaluate()    *
  1210. *           by eliminating a loop to see if one side castled normally or had  *
  1211. *           to give up the right to castle for another (bad) reason.  this is *
  1212. *           simply an efficiency issue, and doesn't affect play or anything   *
  1213. *           at all other than to make the search faster.                      *
  1214. *                                                                             *
  1215. *   10.7    NextMove() now doesn't try history moves forever, rather it will  *
  1216. *           try the five most popular history moves and if it hasn't gotten a *
  1217. *           cutoff by then, simply tries the rest of the moves without the    *
  1218. *           history testing, which is much faster.                            *
  1219. *                                                                             *
  1220. *   10.8    Book() now "puzzles" differently.  In puzzling, it is trying to   *
  1221. *           find a move for the opponent.  since a book move by the opponent  *
  1222. *           will produce an instant move, puzzle now enumerates the set of    *
  1223. *           legal opponent moves, and from this set, removes the set of known *
  1224. *           book moves and then does a quick search to choose the best.  we   *
  1225. *           then ponder this move just in case the opponent drops out of book *
  1226. *           and uses a normal search to find a move.  Crafty now penalizes    *
  1227. *           a pawn that advances, leaving its neighbors behind where both     *
  1228. *           the advancing pawn, and the ones being left behind become weaker. *
  1229. *           the opening phase of the game has been modified to "stay active"  *
  1230. *           until all minor pieces are developed and Crafty has castled, to   *
  1231. *           keep EvaluateDevelopment() active monitoring development.  minor  *
  1232. *           change to DrawScore() so that when playing a computer, it will    *
  1233. *           return "default_draw_score" under all circumstances rather than   *
  1234. *           adjusting this downward, which makes Crafty accept positional     *
  1235. *           weaknesses rather than repeat a position.                         *
  1236. *                                                                             *
  1237. *   10.9    Evaluate() now handles king safety slightly differently, and      *
  1238. *           increases the penalty for an exposed king quite a bit when there  *
  1239. *           is lots of material present, but scales this increase down as the *
  1240. *           material comes off.  this seems to help when attacking or getting *
  1241. *           attacked.  since Quiesce() no longer probes the hash table, the   *
  1242. *           idea of storing static evaluations there became worthless and was *
  1243. *           burning cycles that were wasted.  this has been removed. check    *
  1244. *           extensions relaxed slightly so that if ply is < iteration+10 it   *
  1245. *           will allow the extension.  old limit was 2*iteration.  connected  *
  1246. *           passed pawns on 6th now evaluated differently.  they get a 1 pawn *
  1247. *           bonus, then if material is less than a queen, another 1 pawn      *
  1248. *           bonus, and if not greater than a rook is left, and the king can't *
  1249. *           reach the queening square of either of the two pawns, 3 more      *
  1250. *           more pawns are added in for the equivalent of + a rook.           *
  1251. *                                                                             *
  1252. *   10.10   Evaluate() modified.  king safety was slightly broken, in that    *
  1253. *           an uncastled king did not get a penalty for open center files.    *
  1254. *           new evaluation term for controlling the "absolute 7th rank", a    *
  1255. *           concept from "My System".                                         *
  1256. *                                                                             *
  1257. *   10.11   lazy evaluation implemented.  now as the Evaluate() code is ex-   *
  1258. *           ecuted, crafty will "bail out" when it becomes obvious that the   *
  1259. *           remainder of the evaluation can't bring the score back inside the *
  1260. *           alpha/beta window, saving time.                                   *
  1261. *                                                                             *
  1262. *   10.12   more Jakarta time control commands added so operator can set the  *
  1263. *           time accurately if something crashes, and so the operator can set *
  1264. *           a "cushion" to compensate for operator inattention.  "easy" is    *
  1265. *           more carefully qualified to be a recapture, or else a move that   *
  1266. *           preserves the score, rather than one that appears to win material *
  1267. *           as was done in the past.  king safety tweaked a little so that if *
  1268. *           one side gives up the right to castle, and could castle to a safe *
  1269. *           position, the penalty for giving up the right is substantially    *
  1270. *           larger than before.  a minor bug also made it more likely for     *
  1271. *           black to give up the right to castle than for white.              *
  1272. *                                                                             *
  1273. *   10.13   modifications to Book() so that when using "book random 0" mode   *
  1274. *           (planned for Jakarta) and the search value indicates that we are  *
  1275. *           losing a pawn, we return "out of book" to search *all* the moves, *
  1276. *           not just the moves that are "in book."  This hopefully avoids     *
  1277. *           some book lines that lose (gambit) material unsoundly.            *
  1278. *                                                                             *
  1279. *   10.14   final timing modifications.  puzzling/booking searches now take   *
  1280. *           1/30th of the normal time, rather than 1/10th.  new command       *
  1281. *           "mode=tournament" makes crafty assess DRAW as "0" and also makes  *
  1282. *           it prompt the operator for time corrections as required by WMCCC  *
  1283. *           rules.                                                            *
  1284. *                                                                             *
  1285. *   10.15   Evaluate() tuning to reduce development bonuses, which were able  *
  1286. *           to overwhelm other scores and lead to poor positions.             *
  1287. *                                                                             *
  1288. *   10.16   "lazy" (early exit) caused some problems in Evaluate() since so   *
  1289. *           many scores are very large.  scaled this back significantly and   *
  1290. *           also EvaluateOutsidePassedPawns() could double the score if one   *
  1291. *           side had passers on both sides.  this was fixed.                  *
  1292. *                                                                             *
  1293. *   10.17   crafty's Book() facility has been significantly modified to be    *
  1294. *           more understandable.  book random <n> has the following options:  *
  1295. *           (0) do a search on set of book moves; (1) choose from moves that  *
  1296. *           are played most frequently; (2) choose from moves with best win   *
  1297. *           ratio; (3) choose from moves with best static evaluation; and     *
  1298. *           (4) choose completely randomly.  book width <n> can be used to    *
  1299. *           control how large the "set" of moves will be, with the moves in   *
  1300. *           the "set" being the best (according to the criteria chosen) from  *
  1301. *           the known book moves.  minor tweak to Search() so that it extends *
  1302. *           passed pawn pushes to the 6th or 7th rank if the move is safe,    *
  1303. *           and this is an endgame.                                           *
  1304. *                                                                             *
  1305. *   10.18   new annotate command produces a much nicer analysis file and also *
  1306. *           lets you exert control over what has to happen to trigger a com-  *
  1307. *           ment among other things.  AKA Crafty/Jakarta version.             *
  1308. *                                                                             *
  1309. *   11.1    fractional depth allows fractional ply increments.  the reso-     *
  1310. *           lution is 1/60 of a ply, so all of the older "depth++" lines now  *
  1311. *           read depth+=PLY, where #define PLY 60 is used everywhere.  this   *
  1312. *           gives added flexibility in that some things can increment the     *
  1313. *           depth by < 1 ply, so that it takes two such things before the     *
  1314. *           search actually extends one ply deeper.  Crafty now has full PGN  *
  1315. *           support.  a series of pgn commands (pgn Event 14th WMCCC) allow   *
  1316. *           the PGN tags to be defined, when crafty reads or annotates a PGN  *
  1317. *           file it reads and parses the headers and will display the info    *
  1318. *           in the annotation (.can) file or in the file you specify when you *
  1319. *           execute a "savegame <filename>" command.                          *
  1320. *                                                                             *
  1321. *   11.2    fractional ply increments now implemented.  11.1 added the basic  *
  1322. *           fractional ply extension capabilities, but this version now uses  *
  1323. *           them in Search().  there are several fractional ply extensions    *
  1324. *           being used, all are #defined in types.h to make playing with them *
  1325. *           somewhat easier.  one advantage is that now all extensions are    *
  1326. *           3/4 of a ply, which means the first time any extension is hit, it *
  1327. *           has no effect, but the next three extensions will result in an    *
  1328. *           additional ply, followed by another ply where the extension does  *
  1329. *           nothing, followed by ...  this allowed me to remove the limit on  *
  1330. *           how deep in the tree the extensions were allowed, and also seems  *
  1331. *           to not extend as much unless there's "something" going on.  when  *
  1332. *           the position gets interesting, these kick in.  asymmetric king    *
  1333. *           safety is back in.  Crafty's king safety is a little more im-     *
  1334. *           portant than the opponent's now to help avoid getting its king-   *
  1335. *           side shredded to win a pawn.  a new term, ROOK_ON_7TH_WITH_PAWN   *
  1336. *           to help Crafty understand how dangerous a rook on the 7th is if   *
  1337. *           it is supported by a pawn.  it is difficult to drive off and the  *
  1338. *           pawn provides additional threats as well.                         *
  1339. *                                                                             *
  1340. *   11.3    king safety modifications.  one fairly serious bug is that Crafty *
  1341. *           considered that king safety became unimportant when the total     *
  1342. *           pieces dropped below 16 material points.  note that this was      *
  1343. *           pieces only, not pieces and pawns, which left plenty of material  *
  1344. *           on the board to attack with.  as a result, Crafty would often     *
  1345. *           allow its king-side to be weakened because it was either in an    *
  1346. *           endgame, or close to an endgame.  *incorrectly*, it turns out. :) *
  1347. *           going back to a very old Crafty idea, king tropism is now tied to *
  1348. *           how exposed each king is, with pieces being attracted to the most *
  1349. *           exposed king for attack/defense.                                  *
  1350. *                                                                             *
  1351. *   11.4    tuning on outside passed pawn code.  values were not large enough *
  1352. *           and didn't emphasize how strong such a pawn is.  general passed   *
  1353. *           pawn value increased as well.  minor bug in edit that would let   *
  1354. *           crafty flag in some wild games was fixed.  basically, edit has no *
  1355. *           way to know if castling is legal, and has to assume if a rook and *
  1356. *           king are on the original squares, castling is o.k.  for wild2     *
  1357. *           games in particular, this can fail because castling is illegal    *
  1358. *           (by the rules for wild 2) while it might be that rooks and king   *
  1359. *           are randomly configured to make it look possible.  crafty would   *
  1360. *           then try o-o or o-o-o and flag when the move was rejected as      *
  1361. *           illegal.  Richard Lloyd suggested a speed-up for the annotate     *
  1362. *           command which I'm using temporarily.  Crafty now searches all     *
  1363. *           legal moves in a position, and if the best move matches the game  *
  1364. *           move, the second search of just the move played is not needed.  I *
  1365. *           was searching just the game move first, which was a waste of time *
  1366. *           in many positions.  I'll resume this later, because I want to see *
  1367. *           these values:  (1) score for move actually played; (2) score for  *
  1368. *           the rest of the moves only, not including the move actually       *
  1369. *           played, to see how often a player finds a move that is the *only* *
  1370. *           good move in a position.                                          *
  1371. *                                                                             *
  1372. *   11.5    more fractional ply extension tuning.  a few positions could blow *
  1373. *           up the search and go well beyond 63 plies, the max that Crafty    *
  1374. *           can handle.  now, extensions are limited to no more than one ply  *
  1375. *           of extensions for every ply of search.  note that "in check" is   *
  1376. *           extended on the checking move ply, not on the out of check ply,   *
  1377. *           so that one-reply-to-check still extends further.  minor changes  *
  1378. *           to time.c to further help on long fast games.  another important  *
  1379. *           timing bug repaired.  if Crafty started an iteration, and failed  *
  1380. *           high on the first move, it would not terminate the search until   *
  1381. *           this move was resolved and a score returned.  this could waste a  *
  1382. *           lot of time in already won positions.  interesting bug in the     *
  1383. *           capture search pruning fixed.  at times, a piece would be hung,   *
  1384. *           but the qsearch would refuse to try the capture because it would  *
  1385. *           not bring the score back to above alpha.  unfortunately, taking   *
  1386. *           the piece could let passed pawns race in undisturbed which would  *
  1387. *           affect the score.  this pruning is turned off when there are not  *
  1388. *           at least two pieces left on the board.  another bug in the move   *
  1389. *           generator produced pawn promotions twice, once when captures were *
  1390. *           generated, then again when the rest of the moves are produced.    *
  1391. *           this was also repaired.  small book now will work.  the BookUp()  *
  1392. *           code now assumes white *and* black won in the absence of a valid  *
  1393. *           PGN Result tag, so that the small book will work correctly.       *
  1394. *                                                                             *
  1395. *   11.6    modifications to time allocation in a further attempt to make     *
  1396. *           Crafty speed up if time gets short, to avoid flagging.  it is now *
  1397. *           *very* difficult to flag this thing.  :)  minor evaluation tweaks *
  1398. *           and a fix to Quiesce() to speed it up again after a couple of bad *
  1399. *           fixes slowed things down.                                         *
  1400. *                                                                             *
  1401. *   11.7    minor modification to Evaluate().  rooks behind a passed pawn are *
  1402. *           good, but two rooks behind the pawn don't help if the pawn is     *
  1403. *           blockaded and can't move, unless the two rooks are not the same   *
  1404. *           color as the pawn.                                                *
  1405. *                                                                             *
  1406. *   11.8    first stage of "book learning" implemented.  Crafty monitors the  *
  1407. *           search evaluation for the first 10 moves out of book.  it then    *
  1408. *           computes a "learn value" if it thinks this set of values shows    *
  1409. *           that the book line played was very good or very bad.  this value  *
  1410. *           is added to a "learn count" for each move in the set of book      *
  1411. *           moves it played, with the last move getting the full learn value, *
  1412. *           and moves closer to the start of the game getting a smaller       *
  1413. *           percentage.  (see learn.c for more details).  these values are    *
  1414. *           used by Book() to help in selecting/avoiding book lines.  Crafty  *
  1415. *           produces a "book.lrn" file that synthesizes this information into *
  1416. *           a portable format that will be used by other crafty programs,     *
  1417. *           once the necessary code is added later on.                        *
  1418. *                                                                             *
  1419. *   11.9    an age-old problem caused by null-move searching was eliminated   *
  1420. *           in this version.  often the null-move can cause a move to fail    *
  1421. *           high when it should not, but then the move will fail low on the   *
  1422. *           re-search when beta is relaxed.  this would, on occasion, result  *
  1423. *           in Crafty playing a bad move for no reason.  now, if a fail high  *
  1424. *           is followed by a fail-low, the fail high condition is ignored.    *
  1425. *           this can be wrong, but with null-move pruning, it can also be     *
  1426. *           even "more wrong" to accept a fail high move after it fails low   *
  1427. *           due to a null-move failure, than it would be right to accept the  *
  1428. *           fail high/fail low that is caused by trans/ref table anomalies.   *
  1429. *                                                                             *
  1430. *   11.10   Crafty is now using the Kent, et. al, "razoring" algorithm, which *
  1431. *           simply eliminates the last ply of full-width searching and goes   *
  1432. *           directly to the capture search if the move before the last full-  *
  1433. *           width ply is uninteresting, and the Material eval is 1.5 pawns    *
  1434. *           below alpha.  It's a "modest futility" idea that doesn't give up  *
  1435. *           on the uninteresting move, but only tries captures after the move *
  1436. *           is played in the tree.  net result is 20-30% average faster times *
  1437. *           to reach the same depth.  minor mod to book.lrn to include Black, *
  1438. *           White and Date PGN tags just for reference.  next learning mod is *
  1439. *           another "book random n" option, n=3.  this will use the "learned" *
  1440. *           score to order book moves, *if* any of them are > 0.  what this   *
  1441. *           does is to encourage Crafty to follow opening lines that have     *
  1442. *           been good, even if the learn count hasn't reached the current     *
  1443. *           threshold of 1,000.  this makes learning "activate" faster.  this *
  1444. *           has one hole in it, in that once crafty learns that one move has  *
  1445. *           produced a positive learn value, it will keep playing that move   *
  1446. *           (since no others will yet have a positive value) until it finally *
  1447. *           loses enough to take the learn value below zero.  this will be    *
  1448. *           taken care of in the next version, hopefully.                     *
  1449. *                                                                             *
  1450. *   11.11   new "book random 4" mode that simply takes *all* learning scores  *
  1451. *           for the set of legal book moves, translates them so that the      *
  1452. *           worst value is +1 (by adding -Min(all_scores)+1 to every learn    *
  1453. *           value) and then squaring the result.  this encourages Crafty to   *
  1454. *           follow book lines that it has learned to be good, while still     *
  1455. *           letting it try openings that it has not yet tried (learn value    *
  1456. *           =0) and even lets it try (albeit rarely) moves that it has        *
  1457. *           learned to be bad.  minor evaluation tweaking for king placement  *
  1458. *           in endgames to encourage penetration in the center rather than on *
  1459. *           a wing where the king might get too far from the "action."        *
  1460. *                                                                             *
  1461. *   11.12   LearnFunction() now keeps positional score, rather than using a   *
  1462. *           constant value for scores < PAWN_VALUE, to improve learning       *
  1463. *           accuracy.  book learn <filename> [clear] command implemented to   *
  1464. *           import learning files from other Crafty programs.                 *
  1465. *                                                                             *
  1466. *   11.13   endgame threshold lowered to the other side having a queen or     *
  1467. *           less (9) rather than (13) points.  queen+bishop can be very       *
  1468. *           dangerous to the king for example, or two rooks and a bishop.     *
  1469. *           learning "curve" modified.  it was accidentally left in a sort    *
  1470. *           of "geometric" shape, with the last move getting the full learn   *
  1471. *           value, the next one back getting 1/2, the next 1/3, etc.   now    *
  1472. *           it is uniformly distributed from front to back.  if there are 20  *
  1473. *           moves, the last gets the full value, the next gets 19/20, etc..   *
  1474. *           also the "percentage played" was hosed and is fixed.              *
  1475. *                                                                             *
  1476. *   11.14   minor modification to book learn 4 code so that when you start    *
  1477. *           off with *no* learned data, Book() won't exclude moves from the   *
  1478. *           possible set of opening moves just because one was not played     *
  1479. *           very often.  due to the lack of "ordering" info in this case, it  *
  1480. *           would often discover the second or third move in the list had not *
  1481. *           been played very often and cull the rest of the list thinking it  *
  1482. *           was ordered by the number of times it was played.  new channel=n  *
  1483. *           command works with old whisper command, but takes what Crafty     *
  1484. *           would normally whisper and directs it to channel "n" instead.     *
  1485. *           primarily used with custom interface when observing a game on a   *
  1486. *           server.  this lets other observers either listen or ignore the    *
  1487. *           analysis Crafty produces by using +chan n or -chan n.  this code  *
  1488. *           contains all of Frank's xboard patches so that analyze mode and   *
  1489. *           so forth works cleanly.  a new book random option <5> modifies    *
  1490. *           the probability of playing a move by letting the popularity of a  *
  1491. *           move affect the learned-value sorting algorithm somewhat. minor   *
  1492. *           adjustment in pawn ram asymmetric term to simply count rams and   *
  1493. *           not be too concerned about which half of the board they are on.   *
  1494. *           adjustment to weak pawn code.  also increased bonus for king      *
  1495. *           tropism to attract pieces toward enemy king to improve attacking. *
  1496. *           code that detects drawn K+RP+wrong bishop had a bug in that on    *
  1497. *           occasion, the defending king might not be able to reach the       *
  1498. *           queening square before the opposing king blocks it out.  this     *
  1499. *           would let some positions look like draws when they were not. king *
  1500. *           safety now uses square(7-distance(piece,king)) as one multiplier  *
  1501. *           to really encourage pieces to get closer to the king.  in cases   *
  1502. *           whre one king is exposed, all pieces are attracted to that king   *
  1503. *           to attack or defend.   this is turned off during the opening.     *
  1504. *           minor 50-move rule draw change to fix a bug, in that the game is  *
  1505. *           not necessarily a draw after 50 moves by both sides, because one  *
  1506. *           side might be mated by the 50th move by the other side.  this     *
  1507. *           occurred in a game Crafty vs Ferret, and now works correctly.     *
  1508. *                                                                             *
  1509. *   11.15   modified LearnBook() so that when Crafty terminates, or resigns,  *
  1510. *           or sees a mate, it will force LearnBook() to execute the learning *
  1511. *           analysis even if 10 moves have not been made sine leaving the     *
  1512. *           book.  Crafty now trusts large positive evals less when learning  *
  1513. *           about an opening, since such evals are often the result of the    *
  1514. *           opponent's blunder, rather than a really  good opening line.      *
  1515. *           second learning stage implemented.  Crafty maintains a permanent  *
  1516. *           hash file that it uses to store positions where the search value  *
  1517. *           (at the root of the tree) suddenly drop, and then it "seeds" the  *
  1518. *           real transposition table with these values at the start of each   *
  1519. *           of each search so that information is available earlier the next  *
  1520. *           time this game is played.  position.bin has the raw binary data   *
  1521. *           this uses, while position.lrn has the "importable" data.  new     *
  1522. *           import <filename> [clear] command imports all learning data now,  *
  1523. *           eliminating the old book learn command.  LearnFunction() modified *
  1524. *           to handle "trusted" values (negative scores, because we are sure  *
  1525. *           that Crafty won't make an outright blunder very often) and        *
  1526. *           "untrusted" values (positive values often caused by the opponent  *
  1527. *           hanging a piece.  trusted values are scaled up if the opponent is *
  1528. *           weaker than crafty since a weaker opponent forcing a negative     *
  1529. *           eval means the position must really be bad, and are scaled down   *
  1530. *           somewhat if the opponent is stronger than crafty (from the rating *
  1531. *           information from ICC or the operator using the rating command.)   *
  1532. *           untrusted values are scaled down harshly, unless the opponent is  *
  1533. *           much stronger than crafty, since it is unlikely such an opponent  *
  1534. *           would really blunder, while weaker opponents drastically scale    *
  1535. *           untrusted value (which is positive, remember) down.  minor depth  *
  1536. *           problem fixed in learning code.  the depth used in LearnFunction  *
  1537. *           was not the depth for the search that produced the "learn value"  *
  1538. *           the LearnBook() chooses, it was the depth for the search last     *
  1539. *           done.  now, in addition to the 10 last search values, I store the *
  1540. *           depth for each as well.  when a particular search value is used   *
  1541. *           to "learn", the corresponding (correct) depth is also now used.   *
  1542. *           these learn values are now limited to +6000/-6000 because in one  *
  1543. *           book line, Crafty discovered it was getting mated in 2 moves at   *
  1544. *           the end of the book line which was 30 moves deep.  if you try to  *
  1545. *           distribute a "mate score" as the learned value, it will instantly *
  1546. *           make every move for the last 26 moves look too bad to play.  this *
  1547. *           is not desirable, rather the last few moves should be unplayable, *
  1548. *           but other moves further back should be o.k.  another bug that let *
  1549. *           Crafty overlook the above mate also fixed.  the search value was  *
  1550. *           not correct if Crafty got mated, which would avoid learning in    *
  1551. *           that case.  this has been fixed, although it was obviously a rare *
  1552. *           problem anyway.  minor draw bug fixed, where crafty would offer   *
  1553. *           a draw when time was way low, caused by the resolution change a   *
  1554. *           few months back, and also it would offer a draw after the         *
  1555. *           opponent moved, even if he made a blunder.  it now only offers a  *
  1556. *           draw after moving to make sure it's reasonable.  Crafty now won't *
  1557. *           resign if there is a deep mate, such as a mate in 10+, because we *
  1558. *           want to be sure that the opponent can demonstrate making progress *
  1559. *           before we toss in the towel.  LearnBook() now learns on all games *
  1560. *           played.  the old algorithm had a serious problem in that negative *
  1561. *           scores were trusted fully, positive scores were treated with low  *
  1562. *           confidence, and scores near zero were ignored totally.  the net   *
  1563. *           result was that learning values became more and more negative as  *
  1564. *           games were played.  now equal positions are also factored in to   *
  1565. *           the learning equation to help pull some of these negative values  *
  1566. *           back up.  Book() now excludes moves that have not been played     *
  1567. *           many times (if there is at least one move that has) for book      *
  1568. *           random = 2, 3 and 4.  This stops some of the silly moves.         *
  1569. *           position learning is turned off after 15 moves have passed since  *
  1570. *           leaving book, to avoid learning things that won't be useful at a  *
  1571. *           later time.  hashing changed slightly to include "permanent"      *
  1572. *           entries so that the learned stuff can be copied into the hash     *
  1573. *           table with some confidence that it will stay there long enough to *
  1574. *           be used.                                                          *
  1575. *                                                                             *
  1576. *   11.16   king tropism toned down a little to not be quite so intent on     *
  1577. *           closeness to the kings, so that other positional ideas don't get  *
  1578. *           "lost" in the eval.  back to normal piece values (1,3,3,5,9) for  *
  1579. *           a while.  optimizations in Quiesce() speeded things up about 2%.  *
  1580. *           pawns pushed toward the king are not so valuable any more so that *
  1581. *           Crafty won't prefer to hold on to them rather than trading to     *
  1582. *           open a file(s) on the enemy king.  BookLearn() call was moved in  *
  1583. *           Resign() so that it first learns, then resigns, so that it won't  *
  1584. *           get zapped by a SIGTERM right in the middle of learning when      *
  1585. *           xboard realizes the game is over.  edit/setboard logic modified   *
  1586. *           so that it is now possible to back up, and move forward in a game *
  1587. *           that was set up via these commands.                               *
  1588. *                                                                             *
  1589. *   11.17   EvaluatePawns() modified to eliminate "loose pawn" penalty which  *
  1590. *           was not particularly effective and produced pawn scores that were *
  1591. *           sometimes misleading.  several optimizations dealing with cache   *
  1592. *           efficiency, primarily changing int's to signed char's so that     *
  1593. *           multiple values fit into a cache line together, to eliminate some *
  1594. *           cache thrashing.  PopCnt() no longer used to recognize that we    *
  1595. *           have reached an endgame database, there's now a counter for the   *
  1596. *           total number of pieces on the board, as it's much faster to inc   *
  1597. *           and dec that value rather than count 1 bits.  tweaks to MakeMove  *
  1598. *           and UnMakeMove to make things a couple of percent faster, but a   *
  1599. *           whole lot cleaner.  ditto for Swap and Quiesce.  more speed, and  *
  1600. *           cleaner code.  outside passed pawn scored scaled down except when *
  1601. *           the opponent has no pieces at all.  "lazy eval" cleaned up.  we   *
  1602. *           now have two early exits, one before king safety and one after    *
  1603. *           king safety.  there are two saved values so we have an idea of    *
  1604. *           how large the positional scores have gotten to make this work.    *
  1605. *           bug in passed pawn code was evaluating black passed pawns as less *
  1606. *           valuable than white.  fixed and passed pawn scores increased      *
  1607. *           slightly.  isolated pawn scoring modified so the penalty is pro-  *
  1608. *           portional to the number of isolani each side has, rather than the *
  1609. *           old approach of penalizing the "excess" isolani one side has over *
  1610. *           the other side.  seems to be more accurate, but we'll see.  fixed *
  1611. *           a rather gross bug in ValidateMove() related to the way castling  *
  1612. *           status not only indicates whether castling is legal or not, but   *
  1613. *           if it's not, whether that side castled or move the king/rooks.    *
  1614. *           this let ValidateMove() fail to correctly detect that a castling  *
  1615. *           move from the hash table might be invalid, which could wreck the  *
  1616. *           search easily.  this was an oversight from the new status code.   *
  1617. *           serious book bug fixed.  BookUp() was not counting wins and       *
  1618. *           losses correctly, a bug introduced to make small.pgn work. minor  *
  1619. *           bug in the "trapped bishop" (a2/h2/a7/h7) code fixed.  minor bug  *
  1620. *           in Swap() also fixed (early exit that was not safe in rare cases.)*
  1621. *                                                                             *
  1622. *   11.18   EvaluatePawns() modified to recognize that if there are two white *
  1623. *           pawns "rammed" by black pawns at (say) c4/c5 and e4/e5, then any  *
  1624. *           pawns on the d-file are also effectively rammed as well since     *
  1625. *           there is no hope for advancing it.  auto232 automatic play code   *
  1626. *           seems to be working, finally.  the problem was Crafty delayed     *
  1627. *           echoing the move back to auto232, if the predicted move was the   *
  1628. *           move played by the opponent.  auto232 gave Crafty 3 seconds and   *
  1629. *           then said "too late, you must be hung."  outpost knight scoring   *
  1630. *           modified to produce scores between 0 and .2 pawns.  a knight was  *
  1631. *           getting too valuable, which caused some confusion in the scoring. *
  1632. *                                                                             *
  1633. *   11.19   slight reduction in the value of passed pawns, as they were       *
  1634. *           getting pretty large.  cleaned up annotate.c to get rid of code   *
  1635. *           that didn't work out.  annotate now gives the PV for the move     *
  1636. *           actually played as well as the move Crafty suggests is best.      *
  1637. *           Crafty now has a reasonable "trade" bonus that kicks in when it   *
  1638. *           has 20 points of material (or less) and is ahead or behind at     *
  1639. *           least 2 pawns.  this trade bonus ranges from 0 to 1000 (one pawn) *
  1640. *           and encourages the side that is winning to trade, while the side  *
  1641. *           that is losing is encouraged to avoid trades.  more minor tweaks  *
  1642. *           for auto232 including trying a delay of 100ms before sending      *
  1643. *           a move.  new annotate command gives the option to get more than   *
  1644. *           one suggested best move displayed, as well as fixes a few bugs    *
  1645. *           in the older code.  fix to bishop + wrong rook pawn code to also  *
  1646. *           recognize the RP + no pieces is just as bad if the king can reach *
  1647. *           the queening square first.                                        *
  1648. *                                                                             *
  1649. *   11.20   cleanup to annotate command.  it now won't predict that one side  *
  1650. *           will follow a book line that only resulted in losses.  also a     *
  1651. *           couple of glitches in annotate where it was possible for a move   *
  1652. *           to take an exhorbitant amount of time if the best move was a      *
  1653. *           book move, but there were no other possible book moves.  the      *
  1654. *           trade bonus now includes trade pawns if behind, but not if ahead  *
  1655. *           as well as now considering being ahead or behind only one pawn    *
  1656. *           rather than the two pawns used previously in 11.19.  castling is  *
  1657. *           now written to files and read from files using 0-0 (zero-zero)    *
  1658. *           to be PGN compatible.  it will still accept upper/lower alpha o   *
  1659. *           as well, but uses numeric zero for output.                        *
  1660. *                                                                             *
  1661. *   11.21   additional bug fix in annotate command that would fail if there   *
  1662. *           was only one legal move to search.  passed pawn values now have   *
  1663. *           an added evaluation component based on material on the board, so  *
  1664. *           that they become more valuable as material is traded.             *
  1665. *                                                                             *
  1666. *   11.22   test command modified.  test <filename> [N] (where N is optional  *
  1667. *           and defaults to 99) will terminate a test position after N con-   *
  1668. *           secutive iterations have had the correct solution.  bug in        *
  1669. *           Quiesce() fixed, which would incorrectly prune (or fail to prune) *
  1670. *           some captures, due to using "Material" which is computed with     *
  1671. *           respect to white-to-move.  this was fixed many versions ago, but  *
  1672. *           the fix was somehow lost.  fix to EvaluateDraws that mistakenly   *
  1673. *           declared some endings drawn when there were rookpawns on both     *
  1674. *           sides of the board, and the king could get in front of one. minor *
  1675. *           fix to RepetitionCheck() that was checking one too many entries.  *
  1676. *           no harmful effect other than one extra iteration in the loop that *
  1677. *           would make "purify/purity" fail as well as slow things down 1% or *
  1678. *           so.                                                               *
  1679. *                                                                             *
  1680. *   11.23   logpath=, bookpath= and tbpath= command line options added to     *
  1681. *           direct logs, books and tb files to the indicated path.  these     *
  1682. *           only work as command line options, and can't be used in normal    *
  1683. *           places since the files are already opened and in use. a bug in    *
  1684. *           Evaluate() would call EvaluatePawns() when there were no pawns,   *
  1685. *           breaking things on many systems.                                  *
  1686. *                                                                             *
  1687. *   12.0    rewrite of Input/Output routines.  Crafty no longer relies on the *
  1688. *           C library buffered I/O routine scanf() for input.  this made it   *
  1689. *           basically impossible to determine when to read data from the key- *
  1690. *           board, which made xboard/winboard difficult to interface with.    *
  1691. *           now Crafty does its own I/O using read(), which is actually much  *
  1692. *           cleaner and easier.  minor bug where a fail high in very short    *
  1693. *           time controls might not get played...                             *
  1694. *                                                                             *
  1695. *   12.1    clean-up of Main().  the code had gotten so obtuse with the       *
  1696. *           pondering call, plus handling Option() plus move input, that it   *
  1697. *           was nearly impossible to follow.  It is now *much* cleaner and    *
  1698. *           easier to understand/follow.                                      *
  1699. *                                                                             *
  1700. *   12.2    continued cleanup of I/O, particularly the way main() is          *
  1701. *           structured, to make it more understandable.  rewritten time.c     *
  1702. *           to make it more readable and understandable, not to mention       *
  1703. *           easier to modify.  fixed a timing problem where Crafty could be   *
  1704. *           pondering, and the predicted move is made followed immediately by *
  1705. *           "force", caused when the opponent makes a move and loses on time, *
  1706. *           or makes a move and resigns.  this would leave the engine state   *
  1707. *           somewhat confused, and would result in the "new" command not      *
  1708. *           reinitializing things at all, which would hang crafty on xboard   *
  1709. *           or winboard.                                                      *
  1710. *                                                                             *
  1711. *   12.3    modified piece values somewhat to increase their worth relative   *
  1712. *           to a pawn, to try to stop the tendency to sac a piece for 3 pawns *
  1713. *           and get into trouble for doing so.  minor fixes in NewGame() that *
  1714. *           caused odd problems, such as learning positions after 1. e4.  the *
  1715. *           position.lrn/.bin files were growing faster than they should.     *
  1716. *           other minor tweaks to fix a few broken commands in Option().      *
  1717. *           slight reduction in trade bonus to match slightly less valuable   *
  1718. *           pawns.                                                            *
  1719. *                                                                             *
  1720. *   12.4    added ABSearch() macro, which makes Search() much easier to read  *
  1721. *           by doing the test to call Search() or Quiesce() in the macro      *
  1722. *           where it is hidden from sight.  bugs in the way the log files     *
  1723. *           were closed and then used caused crashed with log=off.            *
  1724. *                                                                             *
  1725. *   12.5    development bonus for central pawns added to combat the h4/a3     *
  1726. *           sort of openings that would get Crafty into trouble.  it now will *
  1727. *           try to seize the center if the opponent dallies around.           *
  1728. *                                                                             *
  1729. *   12.6    bug in EvaluateDraws() that would erroneously decide that a KNP   *
  1730. *           vs K was drawn if the pawn was a rook pawn and the king could get *
  1731. *           in front of it, which was wrong.  another minor bug would use     *
  1732. *           EvaluateMate() when only a simple exchange ahead, which would     *
  1733. *           result in sometimes giving up a pawn to reach such a position.    *
  1734. *           minor bug in SetBoard() would incorrectly reset many important    *
  1735. *           game state variables if the initial position was set to anything  *
  1736. *           other than the normal starting position, such as wild 7.  this    *
  1737. *           would make learning add odd PV's to the .lrn file.  development   *
  1738. *           bonus modified topenalize moving the queen before minor pieces,   *
  1739. *           and not moving minor pieces at all.  it is now possible to build  *
  1740. *           a "wild 7" book, by first typing "wild 7", and then typing the    *
  1741. *           normal book create command.  Crafty will remember to reset to the *
  1742. *           "wild 7" position at the start of each book line.  note that it   *
  1743. *           is not possible to have both wild 7 book lines *and* regular book *
  1744. *           lines in the same book.                                           *
  1745. *                                                                             *
  1746. *   12.7    failsoft added, so that scores can now be returned outside the    *
  1747. *           alpha/beta window.  minor null-move threat detection added where  *
  1748. *           a mate in 1 score, returned by a null-move search, causes a one   *
  1749. *           ply search extension, since a mate in one is a serious threat.    *
  1750. *           razoring is now disabled if there is *any* sort of extension in   *
  1751. *           the search preceeding the point where razoring would be applied,  *
  1752. *           to avoid razoring taking away one ply from a search that was ex-  *
  1753. *           tended (for good reasons) earlier.  fail-soft discarded, due to   *
  1754. *           no advantages at all, and a slight slowdown in speed.  rewrite of *
  1755. *           pawn hashing, plus a rewrite of the weak pawn scoring code to     *
  1756. *           make it significantly more accurate, while going a little slower  *
  1757. *           (but since hashing hits 99% of the time, the slower speed is not  *
  1758. *           noticable at all.)  evaluation tweaking as well.                  *
  1759. *                                                                             *
  1760. *   12.8    continued work on weak pawn analysis, as well as a few minor      *
  1761. *           changes to clean the code up.                                     *
  1762. *                                                                             *
  1763. *   13.0    preparation for the Paris WMCCC version starts here.  first new   *
  1764. *           thing is the blocked pawn evaluation code.  this recognizes when  *
  1765. *           a pawn is immobolized and when a pawn has lever potential, but    *
  1766. *           is disabled if playing a computer opponent.  passed pawn scoring  *
  1767. *           modified to eliminate duplicate bonuses that were added in        *
  1768. *           EvaluatePawns as well as EvaluatePassedPawns.  Trade bonus code   *
  1769. *           rewritten to reflect trades made based on the material when the   *
  1770. *           search begins.  this means that some things have to be cleared in *
  1771. *           the hash table after a capture is really made on the board, but   *
  1772. *           prevents the eval from looking so odd near the end of a game.     *
  1773. *           minor bug with book random 0 fixed.  if there was only one book   *
  1774. *           move, the search could blow up.                                   *
  1775. *                                                                             *
  1776. *   13.1    all positional scores reduced by 1/4, in an attempt to balance    *
  1777. *           things a little better.  also more modifications to the weak and  *
  1778. *           blocked pawn code.  added evaluation code to help with KRP vs KR, *
  1779. *           so that the pawn won't be advanced too far before the king comes  *
  1780. *           to its aid.  ditto for defending, it knows that once the king is  *
  1781. *           in front of the pawn, it is a draw.                               *
  1782. *                                                                             *
  1783. *   13.2    blocked pawn scoring changed slightly to not check too far to see *
  1784. *           if a pawn can advance.  also pawns on center squares are weighted *
  1785. *           more heavily to encourage keeping them there, or trying to get    *
  1786. *           rid of them if the opponent has some there.  discovered that      *
  1787. *           somehow, the two lines of code that add in bonuses for passed     *
  1788. *           pawns were deleted as I cleaned up and moved code around.  these  *
  1789. *           were reinserted (missing from 13.0 on).                           *
  1790. *                                                                             *
  1791. *   13.3    modified tablebase code to support 5 piece endings.  there is now *
  1792. *           a configuration option (see Makefile) to specify 3, 4 or 5 piece  *
  1793. *           endgame databases.  more evaluation tuning.                       *
  1794. *                                                                             *
  1795. *   13.4    modified null-move search.  if there is more than a rook left for *
  1796. *           the side on move, null is always tried, as before.  if there is   *
  1797. *           a rook or less left, the null move is only tried within 5 plies   *
  1798. *           of the leaf positions, so that as the search progresses deeper,   *
  1799. *           null-move errors are at least moved away from the root.  many     *
  1800. *           evaluation changes, particularly to king safety and evaluating    *
  1801. *           castling to one side while the other side is safer.  also it now  *
  1802. *           handles pre-castled positions better.                             *
  1803. *                                                                             *
  1804. *   13.5    "from-to" display patch from Jason added.  this shows the from    *
  1805. *           and to squares on a small diagram, oriented to whether Crafty is  *
  1806. *           playing black or white.  the intent is to minimize operator       *
  1807. *           errors when playing black and the board coordinates are reversed. *
  1808. *           more eval changes.                                                *
  1809. *                                                                             *
  1810. *   13.6    weak pawns on open files now add value to the opponent's rooks    *
  1811. *           since they are the pieces that will primarily use an open file to *
  1812. *           attack a weak pawn.                                               *
  1813. *                                                                             *
  1814. *   13.7    minor eval tweaks, plus fixes for the CR/LF file reading problems *
  1815. *           in windows NT.                                                    *
  1816. *                                                                             *
  1817. *   13.8    adjustments to book.c, primarily preventing Crafty from playing   *
  1818. *           lines that had very few games in the file, because those are      *
  1819. *           often quite weak players.  minor fix to InputMoves() so that a    *
  1820. *           move like bxc3 can *never* be interpreted as a bishop move.  a    *
  1821. *           bishop move must use an uppercase B, as in Bxc3.  bug in the      *
  1822. *           king safety for white only was not checking for open opponent     *
  1823. *           files on the king correctly.                                      *
  1824. *                                                                             *
  1825. *   13.9    minor adjustment to time allocation to allow "operator time" to   *
  1826. *           affect time per move.  this is set by "operator <n>" where <n> is *
  1827. *           time in seconds per move that should be "reserved" to allow the   *
  1828. *           operator some typing/bookkeeping time.  new command "book         *
  1829. *           trigger <n>" added so that in tournament mode, when choosing a    *
  1830. *           book line, Crafty will revert to book random 0 if the least       *
  1831. *           popular move was played fewer times than <n>.  this is an attempt *
  1832. *           to avoid trusting narrow book lines too much while still allowing *
  1833. *           adequate randomness.  if the least frequently played move in the  *
  1834. *           set of book moves was played fewer times than this, then a search *
  1835. *           over all the book moves is done.  If the best one doesn't look    *
  1836. *           so hot, crafty drops out of book and searches *all* legal moves   *
  1837. *           instead.                                                          *
  1838. *                                                                             *
  1839. *   13.10   minor adjustments.  this is the gold Paris version that is going  *
  1840. *           with Jason.  any changes made during the event will be included   *
  1841. *           in the next version.                                              *
  1842. *                                                                             *
  1843. *   14.0    major eval modification to return to centipawn evaluation, rather *
  1844. *           then millipawns.  this reduces the resolution, but makes it a lot *
  1845. *           easier to understand evaluation changes.  significant eval mods   *
  1846. *           regarding king safety and large positional bonuses, where the ad- *
  1847. *           vantage is not pretty solid.  note that old book learning will    *
  1848. *           not work now, since the evals are wrong.  old position learning   *
  1849. *           must be deleted completely.  see the read.me file for details on  *
  1850. *           what must be done about book learning results.  new egtb=n option *
  1851. *           to replace the older -DTABLEBASES=n Makefile option, so that the  *
  1852. *           tablebases can be enabled or disabled without recompiling.        *
  1853. *                                                                             *
  1854. *   14.1    glitch in EvaluateDevelopment() was producing some grossly large  *
  1855. *           positional scores.  also there were problems with where the       *
  1856. *           PreEvaluate() procedure were called, so that it could be called   *
  1857. *           *after* doing RootMoveslist(), but before starting a search.  this*
  1858. *           caused minor problems with hashing scores.  one case was that it  *
  1859. *           was possible for a "test suite" to produce slightly different     *
  1860. *           scores than the same position run in normal mode.  this has been  *
  1861. *           corrected.  st=n command now supports fractional times to .01     *
  1862. *           second resolution.                                                *
  1863. *                                                                             *
  1864. *   14.2    MATE reduced to 32767, which makes all scores now fit into 16     *
  1865. *           bits.  added code to EvaluatePawns() to detect the Stonewall      *
  1866. *           pawn formation and not like it as black.  also it detects a       *
  1867. *           reversed Stonewall formation (for black) and doesn't like it as   *
  1868. *           white.  EvaluateOutsidePassedPawns() removed.  functionality is   *
  1869. *           incorporated in EvaluatePawns() and is hashed, which speeds the   *
  1870. *           evaluation up a bit.  king safety is now fully symmetric and is   *
  1871. *           folded into individual piece scoring to encourage pieces to       *
  1872. *           attack an unsafe king.                                            *
  1873. *                                                                             *
  1874. *   14.3    minor adjustments to the king safety code for detecting attacks   *
  1875. *           initiated by pushing kingside pawns.  flip/flop commands added to *
  1876. *           mirror the board either horizontally or vertically to check for   *
  1877. *           symmetry bugs in the evaluation.  other eval tuning changes.      *
  1878. *                                                                             *
  1879. *   14.4    queen value increased to stop trading queen for two rooks.  book  *
  1880. *           learning slightly modified to react quicker.  also scores are now *
  1881. *           stored in the book file as floats to get rid of an annoying trun- *
  1882. *           cation problem that was dragging scores toward zero.  the book    *
  1883. *           file now has a "version" so that old book versions won't cause    *
  1884. *           problems due to incorrect formats.  null-move mated threat ex-    *
  1885. *           tension was modified.  if null-move search fails high, I fail     *
  1886. *           high as always, if it fails low, and it says I get mated in N     *
  1887. *           moves, I extend all moves at this ply, since something is going   *
  1888. *           on.  I also carry this threat extension into the hash table since *
  1889. *           a hash entry can say "don't do null move, it will fail low."  I   *
  1890. *           now have a flag that says not only will null-move fail low, it    *
  1891. *           fails to "mated in N" so this ply needs extending even without a  *
  1892. *           null-move search to tell it so.  book learning greatly modified   *
  1893. *           in the way it "distributes" the learned values, in an effort to   *
  1894. *           make learning happen faster.  I now construct a sort of "tree"    *
  1895. *           so I know how many book alternatives Crafty had at each move it   *
  1896. *           at each book move it played.  I then assign the whole learn value *
  1897. *           to all moves below the last book move where there was a choice,   *
  1898. *           and also assign the whole learn value to the move where there     *
  1899. *           was a choice.  I then divide the learn value by the number of     *
  1900. *           choices and assign this to each book move (working backward once  *
  1901. *           again) until the next point where there were choices.  this makes *
  1902. *           sure that if there is a choice, and it is bad, it won't be played *
  1903. *           again, even if this choice was at move 2, and the remainder of    *
  1904. *           the book line was completely forced.  all in an effort to learn   *
  1905. *           more quickly.                                                     *
  1906. *                                                                             *
  1907. *   14.5    annotate bug fixed where if there was only one legal move, the    *
  1908. *           annotation would stop with no warning.  BookUp() now produces a   *
  1909. *           more useful error message, giving the exact line number in the    *
  1910. *           input file where the error occurred, to make fixing them easier.  *
  1911. *           if you are playing without a book.bin, 14.4 would crash in the    *
  1912. *           book learning code.  this is now caught and avoided.  BookUp()    *
  1913. *           now knows how to skip analysis in PGN files, so you can use such  *
  1914. *           files to create your opening book, without having problems.  it   *
  1915. *           understands that nesting () {} characters "hides" the stuff in-   *
  1916. *           side them, as well as accepting non-standard PGN comments that    *
  1917. *           are inside [].  Annotate() now will annotate a PGN file with      *
  1918. *           multiple games, although it will use the same options for all of  *
  1919. *           the games.  PGN headers are preserved in the .can file.  annotate *
  1920. *           now will recognize the first move in a comment (move) or {move}   *
  1921. *           and will search that move and give analysis for it in addition to *
  1922. *           the normal output.                                                *
  1923. *                                                                             *
  1924. *   14.6    minor change to book random 4 (use learned value.)  if all the    *
  1925. *           learned values are 0, then use the book random 3 option instead.  *
  1926. *           bug in 50-move counter fixed.  Learn() could cause this to be set *
  1927. *           to a value that didn't really reflect the 50-move status, and     *
  1928. *           cause games to be drawn when they should not be.  modified the    *
  1929. *           "Mercilous" attack code to recognize a new variation he worked    *
  1930. *           out that sacrifices a N, R and B for a mating attack.  no more.   *
  1931. *                                                                             *
  1932. *   14.7    "verbose" command removed and replaced by a new "display" command *
  1933. *           that sets display options.  use "help display" for more info on   *
  1934. *           how this works.  the "mercilous" attack scoring is only turned on *
  1935. *           when playing "mercilous".  but there is a new "special" list that *
  1936. *           you can add players too if you want, and this special scoring is  *
  1937. *           turned on for them as well.                                       *
  1938. *                                                                             *
  1939. *   14.8    new scoring term to penalize unbalanced trades.  IE if Crafty has *
  1940. *           to lose a pawn, it would often trade a knight for two pawns in-   *
  1941. *           stead, which is actually worse.  this new term prevents this sort *
  1942. *           of trades.                                                        *
  1943. *                                                                             *
  1944. *   14.9    "mercilous" attack code modified to handle a new wrinkle he (and  *
  1945. *           one other player) found.                                          *
  1946. *                                                                             *
  1947. *   14.10   new "bench" command runs a test and gives a benchmark comparison  *
  1948. *           for crafty and compares this to a P6/200 base machine.  minor bug *
  1949. *           disabled the "dynamic draw score" and fixed it at zero, even if   *
  1950. *           the opponent was much weaker (rating) or behind on time.  also    *
  1951. *           draw_score was not reset to 0 at start of each new game, possibly *
  1952. *           leaving it at +.20 after playing a higher-rated opponent.         *
  1953. *                                                                             *
  1954. *   14.11   release to make mercilous attack detection code the default, to   *
  1955. *           prevent the rash of mercilous attacks on the chess servers.       *
  1956. *                                                                             *
  1957. *   14.12   modified tuning of evaluation.  scores were reduced in the past,  *
  1958. *           to discourage the piece for two pawns sort of trades, but since   *
  1959. *           this was basically solved in 14.8, scores are going "back up".    *
  1960. *           particularly passed pawn scores.  Crafty now accepts draw offers  *
  1961. *           if the last search result was <= the current result returned by   *
  1962. *           DrawScore().  it also honors draw requests via xboard when        *
  1963. *           against a human opponent as well, and will flag the game as over. *
  1964. *           minor modification to annotate.c to display move numbers in the   *
  1965. *           PV's to match the PV output format used everywhere else in        *
  1966. *           Crafty.  a new type of learning, based on results, has been added *
  1967. *           and is optional (learn=7 now enables every type of learning.)     *
  1968. *           this type of learning uses the win/lose game result to flag an    *
  1969. *           opening that leads to a lost game as "never" play again.  the     *
  1970. *           book move selection logic has been modified.  there are four com- *
  1971. *           ponents used in choosing book moves:  frequency of play; win/lose *
  1972. *           ratio; static evaluation; and learned score.  There are four      *
  1973. *           weights that can be modified with the bookw command, that control *
  1974. *           how these 4 values are used to choose book moves.  each weight is *
  1975. *           a floating point value between 0 and 1, and controls how much the *
  1976. *           corresponding term factors in to move selection.                  *
  1977. *                                                                             *
  1978. *   14.13   fixed a book parsing bug that now requires a [Site "xxx"] tag in  *
  1979. *           any book file between lines for the "minplay" option of book      *
  1980. *           create to work properly.                                          *
  1981. *                                                                             *
  1982. *   15.0    this is the first version to support a parallel search using      *
  1983. *           multiple processors on a shared-memory machinel.  this version    *
  1984. *           uses the "PVS" algorithm (Principal Variation Search) that is an  *
  1985. *           early form of "Young Brothers Wait".  this is not the final       *
  1986. *           search algorithm that will be used, but it is relatively easy to  *
  1987. *           implement, so that the massive data structure changes can be de-  *
  1988. *           bugged before getting too fancy.  the major performance problem   *
  1989. *           with this approach is that all processors work together at a node *
  1990. *           and when one finishes, it has to wait until all others finish     *
  1991. *           before it can start doing anything more.  this adds up to a       *
  1992. *           significant amount of time and really prevents good speedups on   *
  1993. *           multiprocessor machines.  this restriction will be eliminanted in *
  1994. *           future versions, but it makes debugging much simpler for the      *
  1995. *           first version.  after much agonizing, I finally chose to write my *
  1996. *           own "spinlock" macros to avoid using the pthread_mutex_lock stuff *
  1997. *           that is terribly inefficient due to its trying to be cute and     *
  1998. *           yield the processor rather than spinning, when the lock is al-    *
  1999. *           ready set.  I'd rather spin than context-switch.                  *
  2000. *                                                                             *
  2001. *   15.1    this version actually unleashes the full design of the parallel   *
  2002. *           search, which lets threads split away from the "pack" when        *
  2003. *           they become idle, and they may then jump in and help another      *
  2004. *           busy thread.  this eliminates the significant delays that         *
  2005. *           occur near the end of a search at a given ply.  now as those pro- *
  2006. *           cessors drop out of the search at that ply, they are reused at    *
  2007. *           other locations in the tree without any significant delays.       *
  2008. *                                                                             *
  2009. *   15.2    WinNT support added.  also fixed a small bug in Interrupt() that  *
  2010. *           could let it exit with "busy" set so that it would ignore all     *
  2011. *           input from that point forward, hanging the game up.  added a new  *
  2012. *           "draw accept" and "draw decline" option to enable/disable Crafty  *
  2013. *           accepting draw offers if it is even or behind.  turned on by      *
  2014. *           an IM/GM opponent automatically.  Thread pools now being used to  *
  2015. *           avoid the overhead of creating/destroying threads at a high rate  *
  2016. *           rate of speed.  it is now quite easy to keep N processors busy.   *
  2017. *                                                                             *
  2018. *   15.3    CPU time accounting modified to correctly measure the actual time *
  2019. *           spent in a parallel search, as well as to modify the way Crafty   *
  2020. *           handles time management in an SMP environment.  a couple of bugs  *
  2021. *           fixed in book.c, affecting which moves were played.  also veri-   *
  2022. *           fied that this version will play any ! move in books.bin, even if *
  2023. *           it was not played in the games used to build the main book.bin    *
  2024. *           file.                                                             *
  2025. *                                                                             *
  2026. *   15.4    this version will terminate threads once the root position is in  *
  2027. *           a database, to avoid burning cpu cycles that are not useful. a    *
  2028. *           flag "done" is part of each thread block now.  when a thread goes *
  2029. *           to select another move to search, and there are no more left, it  *
  2030. *           sets "done" in the parent task thread block so that no other pro- *
  2031. *           cessors will attempt to "join the party" at that block since no   *
  2032. *           work remains to be done.  book selection logic modified so that   *
  2033. *           frequency data is "squared" to improve probabilities.  also, the  *
  2034. *           frequency data is used to cull moves, in that if a move was not   *
  2035. *           played 1/10th of the number of times that the "most popular" move *
  2036. *           was played, then that move is eliminated from consideration.      *
  2037. *                                                                             *
  2038. *   15.5    changes to "volatile" variables to enhance compiler optimization  *
  2039. *           in places where it is safe.  added a function ThreadStop() that   *
  2040. *           works better at stopping threads when a fail high condition       *
  2041. *           occurs at any nodes.  it always stopped all sibling threads at    *
  2042. *           the node in question, but failed to stop threads that might be    *
  2043. *           working somewhere below the fail-high node.  ThreadStop() will    *
  2044. *           recursively call itself to stop all of those threads. significant *
  2045. *           increase in king centralization (endgame) scoring to encourage    *
  2046. *           the king to come out and fight rather than stay back and get      *
  2047. *           squeezed to death.  minor change to queen/king tropism to only    *
  2048. *           conside the file distance, not ranks also.  bug in interupt.c     *
  2049. *           fixed.  this bug would, on very rare occasion, let crafty read in *
  2050. *           a move, but another thread could read on top of this and lose the *
  2051. *           move.  xboard would then watch the game end with a <flag>.        *
  2052. *                                                                             *
  2053. *   15.6    ugly repetition draw bug (SMP only) fixed.  I carefully copied    *
  2054. *           the repetition list from parent to child, but also copied the     *
  2055. *           repetition list pointer...  which remained pointing at the parent *
  2056. *           repetition list.  which failed, of course.                        *
  2057. *                                                                             *
  2058. *   15.7    problem in passing PV's back up the search fixed.  the old bug of *
  2059. *           a fail high/fail low was not completely handled, so that if the   *
  2060. *           *last* move on a search failed high, then low, the PV could be    *
  2061. *           broken or wrong, causing Crafty to make the wrong move, or else   *
  2062. *           break something when the bogus PV was used.  piece/square tables  *
  2063. *           now only have the _w version initialized in data.c, to eliminate  *
  2064. *           the second copy which often caused errors.  Initialize() now will *
  2065. *           copy the _w tables to the _b tables (reflected of course.)        *
  2066. *                                                                             *
  2067. *   15.8    trade bonus modified to not kick in until one side is two pawns   *
  2068. *           ahead or behind, so that trading toward a draw is not so common.  *
  2069. *           fixed a whisper bug that would cause Crafty to whisper nonsense   *
  2070. *           if it left book, then got back in book.  it also now whispers the *
  2071. *           book move it played, rather than the move it would play if the    *
  2072. *           opponent played the expected book move, which was confusing.      *
  2073. *                                                                             *
  2074. *   15.9    bug in positions with one legal move would abort the search after *
  2075. *           a 4 ply search, as it should, but it was possible that the result *
  2076. *           from the aborted search could be "kept" which would often make    *
  2077. *           Crafty just "sit and wait" and flag on a chess server.            *
  2078. *                                                                             *
  2079. *   15.10   fixed "draw" command to reject draw offers if opponent has < ten  *
  2080. *           seconds left and no increment is being used.  fixed glitch in     *
  2081. *           LearnResult() that would crash crafty if no book was being used,  *
  2082. *           and it decides to resign.  modified trade bonus code to eliminate *
  2083. *           a hashing inconsistency.  minor glitch in "show thinking" would   *
  2084. *           show bad value if score was mate.  added Tim Mann's new xboard/   *
  2085. *           winboard "result" command and modified the output from Crafty to  *
  2086. *           tell xboard when a game is over, using the new result format that *
  2087. *           Tim now expects.  note that this is xboard 3.6.9, and earlier     *
  2088. *           versions will *not* work correctly (ok on servers, but not when   *
  2089. *           you play yourself) as the game won't end correctly due to the     *
  2090. *           change in game-end message format between the engine and xboard.  *
  2091. *                                                                             *
  2092. *   15.11   modified SMP code to not start a parallel search at a node until  *
  2093. *           "N" (N=2 at present) moves have been search.  N was 1, and when   *
  2094. *           move ordering breaks down the size of the tree gets larger.  this *
  2095. *           controls that much better.  fixed an ugly learning bug.  if the   *
  2096. *           last move actually in the game history was legal for the other    *
  2097. *           side, after playing it for the correct side, it could be played   *
  2098. *           a second time, which would break things after learning was done.  *
  2099. *           an example was Rxd4 for white, where black can respond with Rxd4. *
  2100. *           changes for the new 3.6.10 xboard/winboard are also included as   *
  2101. *           well as a fix to get book moves displayed in analysis window as   *
  2102. *           it used to be done.                                               *
  2103. *                                                                             *
  2104. *   15.12   "the" SMP repetition bug was finally found and fixed.  CopyToSMP  *
  2105. *           was setting the thread-specific rephead_* variable *wrong* which  *
  2106. *           broke so many things it was not funny.  evaluation tuning in this *
  2107. *           version as well to try to "center" values in a range of -X to +X  *
  2108. *           rather than 0 to 2X.  trade bonus had a bug in the pawn part that *
  2109. *           not only encouraged trading pawns when it should be doing the     *
  2110. *           opposite, but the way it was written actually made it look bad to *
  2111. *           win a pawn.  more minor xboard/winboard compatibility bugs fixed  *
  2112. *           so that games end when they should.  DrawScore() had a quirk that *
  2113. *           caused some problems, in that it didn't know what to do with non- *
  2114. *           zero draw scores, and could return a value with the wrong sign at *
  2115. *           times.  it is now passed a flag, "crafty_is_white" to fix this.   *
  2116. *           modification so that crafty can handle the "FEN" PGN tag and set  *
  2117. *           the board to the correct position when it is found.  xboard       *
  2118. *           options "hard" and "easy" now enable and disable pondering.       *
  2119. *                                                                             *
  2120. *   15.13   modification to "bad trade" code to avoid any sort of unbalanced  *
  2121. *           trades, like knight/bishop for 2-3 pawns, or two pieces for a     *
  2122. *           rook and pawn.  more new xboard/winboard fixes for Illegal move   *
  2123. *           messages and other engine interface changes made recently.  minor *
  2124. *           change to null move search, to always search with the alpha/beta  *
  2125. *           window of (beta-1,beta) rather than (alpha,beta), which is very   *
  2126. *           slightly more efficient.                                          *
  2127. *                                                                             *
  2128. *   15.14   rewrite of ReadPGN() to correctly handle nesting of various sorts *
  2129. *           of comments.  this will now correctly parse wall.pgn, except for  *
  2130. *           promotion moves with no promotion piece specified.  the book      *
  2131. *           create code also now correctly reports when you run out of disk   *
  2132. *           space and this should work under any system to let you know when  *
  2133. *           you run out of space.                                             *
  2134. *                                                                             *
  2135. *   15.15   major modifications to Book() and BookUp().  BookUp() now needs   *
  2136. *           1/2 the temp space to build a book that it used to need (even     *
  2137. *           less under windows).  also, a book position is now 16 bytes in-   *
  2138. *           stead of 20 (or 24 under windows) further reducing the space      *
  2139. *           requirements.  the "win/lose/draw" counts are no longer absolute, *
  2140. *           rather they are relative so they can be stored in one byte. A new *
  2141. *           method for setting "!" moves in books.bin is included in this     *
  2142. *           version.  for any move in the input file used to make books.bin,  *
  2143. *           you can add a {play nn%} string, which says to play this move nn% *
  2144. *           of the time, regardless of how frequently it was played in the    *
  2145. *           big book file.  for example, e4 {play 50%} says to play e4 50% of *
  2146. *           the time.  note two things here:  (1) if the percentages for all  *
  2147. *           of white's first moves add up to a number > 100, then the         *
  2148. *           percentage played is taken as is, but all will be treated as if   *
  2149. *           they sum to 100 (ie if there are three first moves, each with a   *
  2150. *           percentage of 50%, they will behave as though they are all 33%    *
  2151. *           moves).  (2) for any moves not marked with a % (assuming at least *
  2152. *           one move *is* marked with a percent) then such moves will use the *
  2153. *           remaining percentage left over applied to them equally. note that *
  2154. *           using the % *and* the ! flags together slightly changes things,   *
  2155. *           because normally only the set of ! moves will be considered, and  *
  2156. *           within that set, any with % specified will have that percent used *
  2157. *           as expected.  but if you have some moves with !, then a percent   *
  2158. *           on any of the *other* moves won't do a thing, because only the !  *
  2159. *           moves will be included in the set to choose from.                 *
  2160. *                                                                             *
  2161. *   15.16   bug in the king tropism code, particularly for white pieces that  *
  2162. *           want to be close to the black king, fixed in this version.  new   *
  2163. *           History() function that handles all history/killer cases, rather  *
  2164. *           than the old 2-function approach.  ugly RepetitionCheck() bug     *
  2165. *           fixed in CopyToSMP().  this was not copying the complete replist  *
  2166. *           due to a ply>>2 rather than ply>>1 counter.                       *
  2167. *                                                                             *
  2168. *   15.17   adjustments to "aggressiveness" to slightly tone it down.  minor  *
  2169. *           fix to avoid the odd case of whispering one move and playing an-  *
  2170. *           other, caused by a fail-high/fail-low overwriting the pv[1] stuff *
  2171. *           and then Iterate() printing that rather than pv[0] which is the   *
  2172. *           correct one.  new LegalMove() function that strengthens the test  *
  2173. *           for legality at the root, so that it is impossible to ponder a    *
  2174. *           move that looks legal, but isn't.  modifications to king safety   *
  2175. *           to better handle half-open files around the king as well as open  *
  2176. *           files.  EGTB "swindler" added.  if the position is drawn at the   *
  2177. *           root of the tree, then all losing moves are excluded from the     *
  2178. *           move list and the remainder are searched normally with the EGTB   *
  2179. *           databases disabled, in an effort to give the opponent a chance to *
  2180. *           go wrong and lose.  fixed "mode tournament" and "book random 0"   *
  2181. *           so that they will work correctly with xboard/winboard, and can    *
  2182. *           even be used to play bullet games on a server if desired. minor   *
  2183. *           fix to attempt to work around a non-standard I/O problem on the   *
  2184. *           Macintosh platform dealing with '\r' as a record terminator       *
  2185. *           rather than the industry/POSIX-standard \n terminator character.  *
  2186. *                                                                             *
  2187. *   15.18   fix to the "material balance" evaluation term so that it will not *
  2188. *           like two pieces for a rook (plus pawn) nor will it like trading a *
  2189. *           piece for multiple pawns.  a rather gross bug in the repetition   *
  2190. *           code (dealing with 50 move rule) could overwrite random places in *
  2191. *           memory when the 50 move rule approached, because the arrays were  *
  2192. *           not long enough to hold 50 moves, plus allow the search to go     *
  2193. *           beyond the 50-move rule (which is legal and optional) and then    *
  2194. *           output moves (which uses ply=65 data structures).  this let the   *
  2195. *           repetition (50-move-rule part) overwrite things by storing well   *
  2196. *           beyond the end of the repetition list for either side.  minor fix *
  2197. *           to EGTB "swindle" code.  it now only tries the searches if it is  *
  2198. *           the side with swindling chances.  ie it is pointless to try for   *
  2199. *           a swindle in KRP vs KR if you don't have the P.  :)  some very    *
  2200. *           substantial changes to evaluate.c to get things back into some    *
  2201. *           form of synch with each other.                                    *
  2202. *                                                                             *
  2203. *   15.19   more evaluation changes.  slight change to the Lock() facility    *
  2204. *           as it is used to lock the hash table.  modifications to the book  *
  2205. *           selection logic so that any move in books.bin that is not in the  *
  2206. *           regular book.bin file still can be played, and will be played if  *
  2207. *           it has a {play xxx%} or ! option.  new option added to the book   *
  2208. *           create command to allow the creation of a better book.  this      *
  2209. *           option lets you specify a percentage that says "exclude a book    *
  2210. *           move it if didn't win xx% as many games as it lost.  IE, if the   *
  2211. *           book move has 100 losses, and you use 50% for the new option, the *
  2212. *           move will only be included if there are at least 50 wins.  this   *
  2213. *           allows culling lines that only lost, for example.  new bad trade  *
  2214. *           scoring that is simpler.  if one side has one extra minor piece   *
  2215. *           and major pieces are equal, the other side has traded a minor for *
  2216. *           pawns and made a mistake.  if major pieces are not matched, and   *
  2217. *           one side has two or more extra minors, we have seen either a rook *
  2218. *           for two minor pieces (bad) or a queen for three minor pieces (bad *
  2219. *           also).  horrible bug in initializing min_thread_depth, which is   *
  2220. *           supposed to control thrashing.  the SMP search won't split the    *
  2221. *           tree within "min_thread_depth" of the leaf positions.  due to a   *
  2222. *           gross bug, however, this was initialized to "2", and would have   *
  2223. *           been the right value except that a ply in Crafty is 60.  the      *
  2224. *           mtmin command that adjusts this correctly multiplied it by 60,    *
  2225. *           but in data.c, it was left at "2" which lets the search split way *
  2226. *           too deeply and can cause thrashing.  it now correctly defaults to *
  2227. *           120 (2*INCREMENT_PLY) as planned.  Crafty now *only* supports     *
  2228. *           winboard/xboard 4.0 or higher, by sending the string "move xxx"   *
  2229. *           to indicate its move.  this was done to eliminate older xboard    *
  2230. *           versions that had some incompatibilities with crafty that were    *
  2231. *           causing lots of questions/problems.  xboard 4.0 works perfectly   *
  2232. *           and is the only recommended GUI now.                              *
  2233. *                                                                             *
  2234. *******************************************************************************
  2235. */
  2236. int main(int argc, char **argv)
  2237. {
  2238.   int move, presult, readstat;
  2239.   int value=0, i, cont=0, result;
  2240.   char *targs[32];
  2241.   TREE *tree;
  2242. #  if defined(NT_i386) || defined(NT_AXP)
  2243.   extern void _cdecl SignalInterrupt(int);
  2244. #  else
  2245.   extern void SignalInterrupt(int);
  2246. #  endif
  2247. #  if defined(UNIX)
  2248.     char path[1024];
  2249.     struct passwd *pwd;
  2250. #  endif
  2251. /*
  2252.  ----------------------------------------------------------
  2253. |                                                          |
  2254. |   first, parse the command-line options and pick off the |
  2255. |   ones that need to be handled before any initialization |
  2256. |   is attempted (mainly path commands at present.)        |
  2257. |                                                          |
  2258.  ----------------------------------------------------------
  2259. */
  2260.   local[0]=(TREE*) malloc(sizeof(TREE));
  2261.   local[0]->used=1;
  2262.   local[0]->stop=0;
  2263.   local[0]->ply=1;
  2264.   local[0]->nprocs=0;
  2265.   tree=local[0];
  2266.   input_stream=stdin;
  2267.   for (i=0;i<32;i++) args[i]=malloc(128);
  2268.   if (argc > 1) {
  2269.     for (i=0;i<32;i++) targs[i]=malloc(128);
  2270.     for (i=1;i<argc;i++) {
  2271.       if (!strcmp(argv[i],"c")) cont=1;
  2272.       else if (argv[i][0]>='0' && argv[i][0] <= '9' && i+1<argc) {
  2273.         tc_moves=atoi(argv[i]);
  2274.         tc_time=atoi(argv[i+1]);
  2275.         tc_increment=0;
  2276.         tc_secondary_moves=tc_moves;
  2277.         tc_secondary_time=tc_time;
  2278.         tc_time*=60;
  2279.         tc_time_remaining=tc_time;
  2280.         tc_secondary_time*=60;
  2281.         i++;
  2282.       }
  2283.       else if (strstr(argv[i],"path")) {
  2284.         strcpy(buffer,argv[i]);
  2285.         result=Option(tree);
  2286.         if (result == 0)
  2287.           printf("ERROR \"%s\" is unknown command-line option\n",buffer);
  2288.         display=tree->pos;
  2289.       }
  2290.     }
  2291.   }
  2292. /*
  2293.  ----------------------------------------------------------
  2294. |                                                          |
  2295. |   initialize chess board to starting position.  if the   |
  2296. |   first option on the command line is a "c" then we will |
  2297. |   continue the last game that was in progress.           |
  2298. |                                                          |
  2299.  ----------------------------------------------------------
  2300. */
  2301.   if (cont) Initialize(1);
  2302.   else Initialize(0);
  2303. #if defined(SMP)
  2304.   Print(128,"\nCrafty v%s (%d cpus)\n\n",version,CPUS);
  2305. #else
  2306.   Print(128,"\nCrafty v%s\n\n",version);
  2307. #endif
  2308. /*
  2309.  ----------------------------------------------------------
  2310. |                                                          |
  2311. |   now, parse the command-line options and pick off the   |
  2312. |   ones that need to be handled after initialization is   |
  2313. |   completed.                                             |
  2314. |                                                          |
  2315.  ----------------------------------------------------------
  2316. */
  2317.   if (argc > 1) {
  2318.     for (i=1;i<argc;i++) if (strcmp(argv[i],"c"))
  2319.       if ((argv[i][0]<'0' || argv[i][0] > '9') &&
  2320.           !strstr(argv[i],"path")) {
  2321.         strcpy(buffer,argv[i]);
  2322.         result=Option(tree);
  2323.         if (result == 0)
  2324.           printf("ERROR \"%s\" is unknown command-line option\n",buffer);
  2325.       }
  2326.     for (i=0;i<32;i++) free(targs[i]);
  2327.   }
  2328.   display=tree->pos;
  2329.   initialized=1;
  2330. /*
  2331.  ----------------------------------------------------------
  2332. |                                                          |
  2333. |   now, read the crafty.rc/.craftyrc initialization file  |
  2334. |   and process the commands.                              |
  2335. |                                                          |
  2336.  ----------------------------------------------------------
  2337. */
  2338. #if defined(UNIX)
  2339.   input_stream=fopen(".craftyrc","r");
  2340.   if (!input_stream)
  2341.     if ((pwd=getpwuid(getuid()))) {
  2342.       sprintf(path, "%s/.craftyrc", pwd->pw_dir);
  2343.       input_stream=fopen(path,"r");
  2344.     }
  2345.   if (input_stream)
  2346. #else
  2347.   if ((input_stream=fopen("crafty.rc","r")))
  2348. #endif
  2349.   while (1) {
  2350.     readstat=Read(1,buffer);
  2351.     if (readstat) {
  2352.       char *delim;
  2353.       delim=strchr(buffer,'\n');
  2354.       if (delim) *delim=0;
  2355.       delim=strchr(buffer,'\r');
  2356.       if (delim) *delim=' ';
  2357.     }
  2358.     if (readstat < 0) break;
  2359.     result=Option(tree);
  2360.     if (result == 0)
  2361.       printf("ERROR \"%s\" is unknown rc-file option\n",buffer);
  2362.     if (input_stream == stdin) break;
  2363.   }
  2364.   input_stream=stdin;
  2365.   if (xboard) signal(SIGINT,SIG_IGN);
  2366.   signal(SIGTERM,SignalInterrupt);
  2367. #if defined(SMP)
  2368.   if (ics) printf("*whisper Hello from Crafty v%s! (SMP=%d)\n",
  2369.                   version,CPUS);
  2370. #else
  2371.   if (ics) printf("*whisper Hello from Crafty v%s!\n",
  2372.                   version);
  2373. #endif
  2374.   NewGame(1);
  2375. /*
  2376.  ----------------------------------------------------------
  2377. |                                                          |
  2378. |   prompt user and read input string for processing.  as  |
  2379. |   long as Option() returns a non-zero value, continue    |
  2380. |   reading lines and calling Option().  when Option()     |
  2381. |   fails to recogize a command, then try InputMove() to   |
  2382. |   determine if this is a legal move.                     |
  2383. |                                                          |
  2384.  ----------------------------------------------------------
  2385. */
  2386.   while (1) {
  2387.     presult=0;
  2388.     do {
  2389.       if (new_game) NewGame(0);
  2390.       opponent_start_time=ReadClock(elapsed);
  2391.       made_predicted_move=0;
  2392.       display=tree->pos;
  2393.       move=0;
  2394.       presult=0;
  2395.       do {
  2396.         if (presult != 2) presult=0;
  2397.         result=0;
  2398.         display=tree->pos;
  2399.         if (presult !=2 && (move_number!=1 || !wtm)) presult=Ponder(wtm);
  2400.         if (presult==0 || presult==2) {
  2401.           if (!ics && !xboard) {
  2402.             if (wtm) printf("White(%d): ",move_number);
  2403.             else printf("Black(%d): ",move_number);
  2404.             fflush(stdout);
  2405.           }
  2406.           readstat=Read(1,buffer);
  2407.           if (log_file) {
  2408.             if (wtm) fprintf(log_file,"White(%d): %s\n",move_number,buffer);
  2409.             else fprintf(log_file,"Black(%d): %s\n",move_number,buffer);
  2410.           }
  2411.           if (readstat<0 && input_stream==stdin) {
  2412.             strcpy(buffer,"end");
  2413.             (void) Option(tree);
  2414.           }
  2415.         }
  2416.         if (presult == 1) break;
  2417.         opponent_end_time=ReadClock(elapsed);
  2418.         result=Option(tree);
  2419.         if (result == 0) {
  2420.           nargs=ReadParse(buffer,args,"     ;");
  2421.           move=InputMove(tree,args[0],0,wtm,0,0);
  2422.           if (auto232 && presult!=3) {
  2423.             char *mv=OutputMoveICS(tree,move);
  2424.             Delay232(auto232_delay);
  2425.             if (!wtm) fprintf(auto_file,"\t");
  2426.             fprintf(auto_file, " %c%c-%c%c", mv[0], mv[1], mv[2], mv[3]);
  2427.             if ((mv[4] != ' ') && (mv[4] != 0))
  2428.             fprintf(auto_file, "/%c", mv[4]);
  2429.             fprintf(auto_file, "\n");
  2430.             fflush(auto_file);
  2431.           }
  2432.           result=!move;
  2433.         }
  2434.         else if (result == 3) presult=0;
  2435.       } while (result > 0);
  2436.       if (presult == 1) move=ponder_move;
  2437. /*
  2438.  ----------------------------------------------------------
  2439. |                                                          |
  2440. |   make the move (using internal form returned by         |
  2441. |   InputMove() and then complement wtm (white to move).   |
  2442. |                                                          |
  2443.  ----------------------------------------------------------
  2444. */
  2445.       if(result == 0) {
  2446.         fseek(history_file,((move_number-1)*2+1-wtm)*10,SEEK_SET);
  2447.         fprintf(history_file,"%9s\n",OutputMove(tree,move,0,wtm));
  2448.         MakeMoveRoot(tree,move,wtm);
  2449.         last_opponent_move=move;
  2450.         if (RepetitionDraw(tree,ChangeSide(wtm))==1) {
  2451.           Print(4095,"%sgame is a draw by repetition.%s\n",Reverse(),Normal());
  2452.           value=DrawScore(crafty_is_white);
  2453.           if (xboard) Print(4095,"1/2-1/2 {Drawn by 3-fold repetition}\n");
  2454.         }
  2455.         if (RepetitionDraw(tree,ChangeSide(wtm))==2) {
  2456.           Print(4095,"%sgame is a draw by the 50 move rule.%s\n",Reverse(),Normal());
  2457.           value=DrawScore(crafty_is_white);
  2458.           if (xboard) Print(4095,"1/2-1/2 {Drawn by 50-move rule}\n");
  2459.         }
  2460.         if (Drawn(tree,DrawScore(crafty_is_white)) == 2) {
  2461.           Print(4095,"%sgame is a draw due to insufficient material.%s\n",
  2462.                 Reverse(),Normal());
  2463.           if (xboard) Print(4095,"1/2-1/2 {Insufficient material}\n");
  2464.         }
  2465.         wtm=ChangeSide(wtm);
  2466.         if (wtm) move_number++;
  2467.         time_used_opponent=opponent_end_time-opponent_start_time;
  2468.         if (!force)
  2469.           Print(1,"              time used: %s\n",
  2470.                 DisplayTime(time_used_opponent));
  2471.         TimeAdjust(time_used_opponent,opponent);
  2472.       }
  2473.       else {
  2474.         tree->position[1]=tree->position[0];
  2475.         presult=0;
  2476.       }
  2477.       ValidatePosition(tree,0,move,"Main(1)");
  2478.     } while(force);
  2479. /*
  2480.  ----------------------------------------------------------
  2481. |                                                          |
  2482. |   now call Iterate() to compute a move for the current   |
  2483. |   position.  (note this is not done if Ponder() has al-  |
  2484. |   computed a move.)                                      |
  2485. |                                                          |
  2486.  ----------------------------------------------------------
  2487. */
  2488.     crafty_is_white=wtm;
  2489.     if (presult == 2) {
  2490.       if((From(ponder_move) == From(move)) &&
  2491.          (To(ponder_move) == To(move)) &&
  2492.          (Piece(ponder_move) == Piece(move)) &&
  2493.          (Captured(ponder_move) == Captured(move)) &&
  2494.          (Promote(ponder_move) == Promote(move))) {
  2495.         presult=1;
  2496.         if (!book_move) predicted++;
  2497.       }
  2498.       else presult=0;
  2499.     }
  2500.     ponder_move=0;
  2501.     thinking=1;
  2502.     if (presult == 1) value=last_search_value;
  2503.     else {
  2504.       strcpy(whisper_text,"n/a");
  2505.       last_pv.path_iteration_depth=0;
  2506.       last_pv.path_length=0;
  2507.       display=tree->pos;
  2508.       value=Iterate(wtm,think,0);
  2509.     }
  2510. /*
  2511.  ----------------------------------------------------------
  2512. |                                                          |
  2513. |   we've now completed a search and need to do some basic |
  2514. |   bookkeeping.                                           |
  2515. |                                                          |
  2516.  ----------------------------------------------------------
  2517. */
  2518.     last_pv=tree->pv[0];
  2519.     last_value=value;
  2520.     if (abs(last_value) > (MATE-100)) last_mate_score=last_value;
  2521.     thinking=0;
  2522.     if (!last_pv.path_length) {
  2523.       if (value == -MATE+1) {
  2524.         over=1;
  2525.         if(wtm) {
  2526.           Print(4095,"0-1 {Black mates}\n");
  2527.           strcpy(pgn_result,"0-1");
  2528.         }
  2529.         else {
  2530.           Print(4095,"1-0 {White mates}\n");
  2531.           strcpy(pgn_result,"1-0");
  2532.         }
  2533.       }
  2534.       else {
  2535.         over=1;
  2536.         if (!xboard) {
  2537.           printf("%s",Reverse());
  2538.           Print(4095,"stalemate\n");
  2539.           printf("%s",Normal());
  2540.         }
  2541.         else Print(4095,"1/2-1/2 {stalemate}\n");
  2542.       }
  2543.     }
  2544.     else {
  2545.       if ((value > MATE-100) && (value < MATE-2)) {
  2546.         Print(128,"\nmate in %d moves.\n\n",(MATE-value)/2);
  2547.         Whisper(1,0,0,(MATE-value)/2,tree->nodes_searched,0," ");
  2548.       }
  2549.       else if ((-value > MATE-100) && (-value < MATE-1)) {
  2550.         Print(128,"\nmated in %d moves.\n\n",(MATE+value)/2);
  2551.         Whisper(1,0,0,-(MATE+value)/2,tree->nodes_searched,0," ");
  2552.       }
  2553.       if (wtm) {
  2554.         if (!xboard && !ics) {
  2555.           Print(4095,"\n");
  2556.           printf("%s",Reverse());
  2557.           if (audible_alarm) printf("%c",audible_alarm);
  2558.           Print(4095,"White(%d): %s ",move_number,
  2559.                 OutputMove(tree,last_pv.path[1],0,wtm));
  2560.           printf("%s",Normal());
  2561.           Print(4095,"\n");
  2562.           if (auto232) {
  2563.             char *mv=OutputMoveICS(tree,last_pv.path[1]);
  2564.             Delay232(auto232_delay);
  2565.             fprintf(auto_file, " %c%c-%c%c", mv[0],mv[1],mv[2],mv[3]);
  2566.             if ((mv[4]!=' ') && (mv[4]!=0))
  2567.               fprintf(auto_file, "/%c", mv[4]);
  2568.             fprintf(auto_file, "\n");
  2569.             fflush(auto_file);
  2570.           }
  2571.         }
  2572.         else if (xboard) {
  2573.           if (log_file) fprintf(log_file,"White(%d): %s\n",move_number,
  2574.                                 OutputMove(tree,last_pv.path[1],0,wtm));
  2575.           printf("move %s\n",OutputMoveICS(tree,last_pv.path[1]));
  2576.         }
  2577.         else Print(4095,"*%s\n",OutputMove(tree,last_pv.path[1],0,wtm));
  2578.       }
  2579.       else {
  2580.         if (!xboard && !ics) {
  2581.           Print(4095,"\n");
  2582.           printf("%s",Reverse());
  2583.           if (audible_alarm) printf("%c",audible_alarm);
  2584.           Print(4095,"Black(%d): %s ",move_number,OutputMove(tree,last_pv.path[1],0,wtm));
  2585.           printf("%s",Normal());
  2586.           Print(4095,"\n");
  2587.           if (auto232) {
  2588.             char *mv=OutputMoveICS(tree,last_pv.path[1]);
  2589.             Delay232(auto232_delay);
  2590.             fprintf(auto_file, "\t %c%c-%c%c", mv[0],mv[1],mv[2],mv[3]);
  2591.             if ((mv[4]!=' ') && (mv[4]!=0))
  2592.               fprintf(auto_file, "/%c", mv[4]);
  2593.             fprintf(auto_file, "\n");
  2594.             fflush(auto_file);
  2595.           }
  2596.         }
  2597.         else {
  2598.           if (log_file) fprintf(log_file,"Black(%d): %s\n",move_number,
  2599.                                 OutputMove(tree,last_pv.path[1],0,wtm));
  2600.           printf("move %s\n",OutputMoveICS(tree,last_pv.path[1]));
  2601.         }
  2602.       }
  2603.       if (value == MATE-2) {
  2604.         if(wtm) {
  2605.           Print(4095,"1-0 {White mates}\n");
  2606.           strcpy(pgn_result,"1-0");
  2607.         }
  2608.         else {
  2609.           Print(4095,"0-1 {Black mates}\n");
  2610.           strcpy(pgn_result,"0-1");
  2611.         }
  2612.       }
  2613.       time_used=program_end_time-program_start_time;
  2614.       Print(1,"              time used: %s\n",DisplayTime(time_used));
  2615.       TimeAdjust(time_used,crafty);
  2616.       fseek(history_file,((move_number-1)*2+1-wtm)*10,SEEK_SET);
  2617.       fprintf(history_file,"%9s\n",OutputMove(tree,last_pv.path[1],0,wtm));
  2618. /*
  2619.  ----------------------------------------------------------
  2620. |                                                          |
  2621. |   now execute LearnPosition() to determine if the        |
  2622. |   current position is bad and should be remembered.      |
  2623. |                                                          |
  2624.  ----------------------------------------------------------
  2625. */
  2626.       LearnPosition(tree,wtm,previous_search_value,last_search_value);
  2627.       previous_search_value=last_search_value;
  2628.       MakeMoveRoot(tree,last_pv.path[1],wtm);
  2629.       if (RepetitionDraw(tree,ChangeSide(wtm))==1) {
  2630.         Print(128,"%sgame is a draw by repetition.%s\n",Reverse(),Normal());
  2631.         if (xboard) Print(4095,"1/2-1/2 {Drawn by 3-fold repetition}\n");
  2632.         value=DrawScore(crafty_is_white);
  2633.       }
  2634.       if (RepetitionDraw(tree,ChangeSide(wtm))==2) {
  2635.         Print(128,"%sgame is a draw by the 50 move rule.%s\n",Reverse(),Normal());
  2636.         if (xboard) Print(4095,"1/2-1/2 {Drawn by 50-move rule}\n");
  2637.         value=DrawScore(crafty_is_white);
  2638.       }
  2639.       if (Drawn(tree,DrawScore(crafty_is_white)) == 2) {
  2640.         Print(4095,"%sgame is a draw due to insufficient material.%s\n",
  2641.               Reverse(),Normal());
  2642.         if (xboard) Print(4095,"1/2-1/2 {Insufficient material}\n");
  2643.       }
  2644.       if (log_file && time_limit > 500) DisplayChessBoard(log_file,tree->pos);
  2645. /*
  2646.  ----------------------------------------------------------
  2647. |                                                          |
  2648. |   save the ponder_move from the current principal        |
  2649. |   variation, then shift it left two moves to use as the  |
  2650. |   starting point for the next search.  adjust the depth  |
  2651. |   to start the next search at the right iteration.       |
  2652. |                                                          |
  2653.  ----------------------------------------------------------
  2654. */
  2655.       if (last_pv.path_length>1 &&
  2656.           LegalMove(tree,0,ChangeSide(wtm),last_pv.path[2])) {
  2657.         ponder_move=last_pv.path[2];
  2658.         for (i=1;i<=(int) last_pv.path_length-2;i++)
  2659.           last_pv.path[i]=last_pv.path[i+2];
  2660.         last_pv.path_length=(last_pv.path_length > 2) ? last_pv.path_length-2 : 0;
  2661.         last_pv.path_iteration_depth-=2;
  2662.         if (last_pv.path_iteration_depth > last_pv.path_length)
  2663.           last_pv.path_iteration_depth=last_pv.path_length;
  2664.         if (last_pv.path_length == 0) last_pv.path_iteration_depth=0;
  2665.       }
  2666.       else {
  2667.         last_pv.path_iteration_depth=0;
  2668.         last_pv.path_length=0;
  2669.         ponder_move=0;
  2670.       }
  2671.     }
  2672.     if (book_move) {
  2673.       moves_out_of_book=0;
  2674.       predicted++;
  2675.     }
  2676.     else moves_out_of_book++;
  2677.     wtm=ChangeSide(wtm);
  2678.     if (wtm) move_number++;
  2679.     ValidatePosition(tree,0,last_pv.path[1],"Main(2)");
  2680.     if (kibitz || whisper) {
  2681.       if (tree->nodes_searched)
  2682.         Whisper(2,whisper_depth,end_time-start_time,whisper_value,
  2683.                 tree->nodes_searched,cpu_percent,whisper_text);
  2684.       else
  2685.         Whisper(4,0,0,0,0,0,whisper_text);
  2686.     }
  2687. /*
  2688.  ----------------------------------------------------------
  2689. |                                                          |
  2690. |   now execute LearnBook() to determine if the book line  |
  2691. |   was bad or good.  then follow up with LearnResult() if |
  2692. |   Crafty was checkmated.                                 |
  2693. |                                                          |
  2694.  ----------------------------------------------------------
  2695. */
  2696.     ResignOrDraw(tree,value,wtm);
  2697.     if (moves_out_of_book)
  2698.       LearnBook(tree,crafty_is_white,last_value,
  2699.                 last_pv.path_iteration_depth+2,0,0);
  2700.     if (value == -MATE+1) LearnResult(tree,crafty_is_white);
  2701.     for (i=0;i<4096;i++) {
  2702.       history_w[i]=history_w[i]>>8;
  2703.       history_b[i]=history_b[i]>>8;
  2704.     }
  2705.     if (mode == tournament_mode) {
  2706.       strcpy(buffer,"clock");
  2707.       Option(tree);
  2708.       Print(128,"if clocks are wrong, use 'clock' command to adjust them\n");
  2709.     }
  2710.   }
  2711. }
  2712.