home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Jeux / Reflexion / Crafty-15.19.lha / crafty-15.19 / doc / crafty.doc next >
Text File  |  1998-09-19  |  66KB  |  1,390 lines

  1.         Welcome to the world of Crafty! (version 15)
  2.       -----------------------------------------------
  3. Crafty  is nothing more than a long-time hobby of mine, dat-
  4. ing back to Blitz and later Cray Blitz.  People ask me how I
  5. keep doing this, and that is the one question that generally
  6. leaves me at a loss for words.
  7.  
  8. Perhaps the most common question I'm asked is "is this  ver-
  9. sion  of Crafty some dumbed-down version of what you play on
  10. ICC or what you use at a computer chess event?"  The  answer
  11. is a resounding *NO*.  The current version is *exactly* what
  12. is running on ICC under this version number.   Note  that  a
  13. new  version  can, on occasion, introduce weaknesses or out-
  14. right bugs that were not present in previous gold" versions.
  15. As  a  result,  you  should  be  careful  to  back  up  your
  16. "favorite" before trying the latest and  greatest.   If  you
  17. aren't  satisfied  with  the  new  version, you can then "go
  18. back."
  19.  
  20. If you are looking for the strongest playing computer  chess
  21. program  available, you should likely look to Genius, Rebel,
  22. Mchess Pro, and the other  commercial  entries.   There  you
  23. will  find  strong  opponents  with polished interfaces that
  24. have been tested in a systematic and careful  way.   If  you
  25. are  looking for a program that plays good chess, has a rea-
  26. sonable set of features for you  to  use,  is  available  in
  27. source  form,  and  one  where the author welcomes feedback,
  28. code or suggestions, then you are at  the  right  place.   I
  29. welcome  comments  and  suggestions,  and also feedback from
  30. ideas you try yourself that seem to work.
  31.  
  32. Crafty is a state-of-the-art  computer  chess  program,  and
  33. uses  all  of  the  search algorithms you have probably read
  34. about, negascout search, killer/history move  ordering,  SEE
  35. (Static  Exchange  Evaluation)  quiescence move ordering and
  36. pruning, hash (transposition/refutation) tables as  well  as
  37. evaluation caches, selective extensions, recursive null-move
  38. search, and a host of other features that have been used and
  39. are  still  being  used in most computer chess programs.  If
  40. it's not in Crafty, either it is on the "to do" list, or  it
  41. has been tried, found wanting, and discarded.
  42.  
  43. Chess Knowledge is growing, and suggestions (or even better,
  44. real code) are welcome.  This is  the  best  place  to  con-
  45. tribute  your  ideas,  because knowledge can be used to sup-
  46. plant search and make it play  better.   The  evaluation  is
  47. probably  the easiest place to start studying Crafty because
  48. of the comments and simplicity of using bitmaps, *once*  you
  49. get "into" them.
  50.  
  51. My  purpose  for doing this is an exercise in computer chess
  52. efficiency.  I can't begin to count the number of  people  I
  53. know  that  started  from  scratch to write a chess program.
  54. Even larger is the group that started from scratch, and gave
  55. up  before  finishing, because of the basic size of the pro-
  56. ject.
  57.  
  58. Crafty offers everyone a very clean starting point,  if  you
  59. are  fascinated by the bitmap chess board implementation (as
  60. I  am).   The  search  and  quiescence  code  is  reasonably
  61. straightforward, as is the evaluation,
  62.  
  63. It  offers a great starting point, so that if you are inter-
  64. ested in trying a new search extension, you can  be  testing
  65. tomorrow,  rather  than  next year, because you start with a
  66. fully functional chess engine that is not a  "toy"  applica-
  67. tion,  but is a functional and "dangerous" chess player.  It
  68. offers a rapid start, although you can certainly replace  it
  69. piece  by  piece  until  it is "yours" if you want.  It also
  70. offers a fairly complete set of commands  and  an  interface
  71. for  a GUI as well as support for chess server play, so that
  72. testing and debugging your new ideas is greatly  simplified.
  73.  
  74. If you'd like more information, please check out the read.me
  75. document  and  the  crafty.FAQ  that  are  distributed  with
  76. Crafty.  These contain recent news and specific instructions
  77. for commonly asked  questions,  like  "where  can  I  obtain
  78. tablebase files and how do I use them?"
  79.  
  80.                     How to play a game.
  81.                     -------------------
  82. When  you execute Crafty, you will immediately be greeted by
  83. the prompt string "white(1): " and Crafty will wait for com-
  84. mands.  This prompt means it is white on move, and we are at
  85. move #1 for white.  You can first use any  of  the  commands
  86. from the alphabetic command listing below to tailor the game
  87. to your liking (time control, hash table size, book  random-
  88. ness,  etc.)  and then you have two choices.  If you want to
  89. play white, just enter your move, and Crafty  will  take  it
  90. from  there  and  make a move in response.  You will then be
  91. prompted by "white(2):" and it is your move again.   If  you
  92. would prefer to play black, just enter either "move" or "go"
  93. at the prompt and crafty will move for that side rather than
  94. accepting  a  move  from  you.   After it makes its move for
  95. white, you will then see the prompt "black(1): "  indicating
  96. it is now time for blacks first move.  You can enter a move,
  97. or you can once again enter "move" or "go" and  Crafty  will
  98. again  move  for  the current side, change sides, and prompt
  99. you for what to do next.
  100.  
  101. If you find yourself continually using a set of commands  to
  102. configure crafty to play as you want, you can put these com-
  103. mands in a startup file called .craftyrc (Unix) or crafty.rc
  104. (DOS/Windows).   The  format  for this file is just like you
  105. would type the commands at the keyboard, with  the  require-
  106. ment that the last line of the file must be "exit" on a line
  107. by itself.  Using this, each time you start Crafty, it  will
  108. first  execute the commands from this file before it prompts
  109. you for input.
  110.  
  111. While Crafty is running, you can control what  it  displays,
  112. but  here's a couple of samples to explain what it is saying
  113. and why:
  114.  
  115.            depth   time   score    variation (1)
  116.             book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5}
  117.             book   0.0s     70%    d4
  118.  
  119. White(3): d4
  120.             time used:   0.01
  121.  
  122. This is the normal output for those cases where Crafty is in
  123. book.   The book moves line gives the set of book moves that
  124. made the first selection cut (see the book selection  expla-
  125. nation  given  later), followed by the move actually played,
  126. in this case d4.
  127.  
  128. If Crafty is out of book, then  the  output  looks  somewhat
  129. different as given below:
  130.  
  131.            depth   time   score    variation (1)
  132.              4->   0.81    2.09    dxe4 Bxe4 Rad8 Qf2 Qb5
  133.              5      1.37     2.41    dxe4 Bxe4 Ne5 Qf4 Bxe4+
  134. Qxe4 f5
  135.              5->   1.88    2.41    dxe4 Bxe4 Ne5  Qf4  Bxe4+
  136. Qxe4 f5
  137.              6     7.38      --    dxe4
  138.              6     11.90     1.97     dxe4 Bxe4 Rab8 Qf2 Qc7
  139. Nc5 Qe5
  140.              6    12.92      ++    Ne5
  141.              6    13.71    2.23    Ne5 Qg2 Ng6 h5 Nh4 Qg4
  142.              6->  15.59    2.23    Ne5 Qg2 Ng6 h5 Nh4 Qg4
  143.            time: 15.60  cpu:99%  mat:1  n:246565  nps:15927
  144.            ext-> checks:4706 recaps:1336 pawns:0 1rep:301
  145.            nodes        full:45951         quiescence:200614
  146. evals:104657
  147.            endgame tablebase-> probes done: 0  successful: 0
  148.  
  149. Let's take this stuff one line at a time.  Lines  that  have
  150. something like 4-> in the depth column are printed when that
  151. iteration (depth) is  completely  finished.   The  time  and
  152. score  columns  should  be obvious as to their meaning as is
  153. the PV, the sequence of moves that led to this score.
  154.  
  155. the line that has -- in the score column means that when  we
  156. started depth 6, dxe4 turned out to be worse than we thought
  157. (notice score dropped from 2.411 last search  to  1.972  for
  158. this  move this search.)  To resolve this, Crafty lowers the
  159. lower search bound (alpha) and re-searches the move to  find
  160. the  score.   The line with ++ means that this move (Ne5) is
  161. better than the best move so far, so Crafty raises the upper
  162. search  bound  (beta)  and re-searches this move to find the
  163. new score.
  164.  
  165. the first line of statistics gives the total time taken  for
  166. this search, the cpu percentage which should stay at 98-100%
  167. unless your machine is heavily loaded or unless Crafty is in
  168. an  endgame  that  is  having  lots  of contact with endgame
  169. databases.  If this drops below 98%, it means that Crafty is
  170. not  getting  full CPU usage and will be playing weaker than
  171. normal.  The mat:1 is simply the true material score,  since
  172. Crafty's positional scores are often larger than a pawn.
  173.  
  174.  
  175.  
  176.                Alphabetic Listing of Commands
  177.                ------------------------------
  178.  
  179. 1.   alarm  on|off  This command is used to control Crafty's
  180. "beep" after it makes a move.  Turning this  off  will  make
  181. Crafty "quiet" when it plays, but also makes it easy to miss
  182. a move if you are using crafty  to  play  in  a  tournament.
  183. This  is  primarily designed to make Crafty tolerable during
  184. late night matches.
  185.  
  186. 2.  analyze  This command puts crafty into analyze mode.  In
  187. this  mode, Crafty starts computing for whichever side is on
  188. move, and it continues computing and  showing  its  analysis
  189. until  a move is entered.  This move is made, Crafty changes
  190. sides, and starts thinking and printing analysis  all  over,
  191. but for the other side now.
  192.  
  193. This  command  is useful to play through a game, because you
  194. get instant feedback when you try a move.  If  you  want  to
  195. try  a different move from the one you just entered, use the
  196. "back" command to back up one move, or  use  "back  <n>"  to
  197. back  up <n> moves.  Note that one move is a single move for
  198. the last player, not a move for both sides.  To  unmake  the
  199. most recent 2 moves (one for black, one for white) use "back
  200. 2".
  201.  
  202. 3.  annotate <filename>  <colors>  <moves>  <margin>  <time>
  203. This  command  is used to annotate (make comments in) a game
  204. that has already been played.
  205.  
  206. <filename> is the name of the file that has the  game  moves
  207. stored  in  it.   This  should typically be a PGN-compatible
  208. file, although Crafty can read nearly any  file  with  chess
  209. moves.
  210.  
  211. <colors>  indicates  which  side  Crafty will annotate.  The
  212. valid choices are w, b, and wb for white only,  black  only,
  213. and  both,  respectively.   Crafty  will  search and produce
  214. results for the indicated color only, making moves  for  the
  215. other side silently as they are read in.
  216.  
  217. <moves>  indicates  the  moves that should be annotated.  If
  218. this is a single integer, annotation  starts  at  this  move
  219. number (for the color given above) and proceeds for the rest
  220. of the game.  If a range is given,  as  (20-33),  then  only
  221. moves  20-33  inclusive are annotated.  To annotate the com-
  222. plete game, you can use 1-999.
  223.  
  224. <margin> gives a score "window" that controls whether Crafty
  225. will  produce  comments (see below).  The larger this number
  226. this number, the fewer annotations Crafty will  produce.   A
  227. negative  number will result in an annotation for every move
  228. selected.
  229.  
  230. <time> indicates the time limit for each search.  Since each
  231. move selected requires two searches, you can take the number
  232. of moves, double this  number  and  multiply  by  <time>  to
  233. determine  how  long the annotation process will take.  This
  234. time is in seconds.
  235.  
  236. How it works.  Suppose you use the command "annotate game1 w
  237. 1-999  1.000  30" This asks Crafty to read the file "game1",
  238. and annotate the white moves for the entire game.  The  mar-
  239. gin  is 1 pawn and the search time limit is 30 seconds.  The
  240. output for the annotate command is found in  <filename>.can,
  241. in this case this is game1.can.
  242.  
  243. Crafty  first  searches the move actually played in the game
  244. to determine the score for it.   Crafty  then  searches  the
  245. same  position, but tries all legal moves.  If the score for
  246. the best move found in this search is greater than the score
  247. for the move actually played plus the margin, then a comment
  248. is added to the output file.   This  output  file  is  quite
  249. short,  with  all  the  game moves (plus any PGN tags in the
  250. original, for identification purposes) plus the  brief  com-
  251. ments.  An annotation looks like this:
  252.  
  253. {real_value (depth:best_value PV moves)}
  254.  
  255. real_value is the score for the move actually played.  depth
  256. is the depth Crafty searched to produce the  best_value  and
  257. PV for what it thinks is the best sequence of moves for both
  258. sides.  If you set <margin> to 1.000, you are asking  Crafty
  259. to  only  annotate moves that either lost a pawn or more, or
  260. moves that failed to win a pawn or more.  If you  set  <mar-
  261. gin>  to  .300,  you are asking for annotations for any move
  262. that makes the score drop about 1/3  of  a  pawn  below  the
  263. value for the best move Crafty found.
  264.  
  265. If  you have other moves you would like to see analyzed dur-
  266. ing this annotate process, at the point where the  move  can
  267. be  played,  insert it into the PGN file as an analysis com-
  268. ment, surrounded by () or {} characters.  Crafty  will  pro-
  269. duce  analysis for this move as well.  If more than one move
  270. appears inside a single set of delimiters,  only  the  first
  271. will  be analyzed.  To force Crafty to analyze more than one
  272. move, enter them like this:  (move1) (move2) as though  they
  273. were two separate comments.
  274.  
  275. 4.   ANSI on|off  This command is used to control whether or
  276. not Crafty attempts to display its move in reverse video  or
  277. not.  For PC's, Linux, and most Unix boxes, this works fine.
  278. Should you find yourself playing crafty via a dumb terminal,
  279. this might hose the terminal and interfere with your ability
  280. to see or input  moves.   If  moves  are  not  displayed  in
  281. reverse  video, it's probably wise to turn this off to avoid
  282. hanging the terminal you are using.
  283.  
  284. 5.  black|white  This command simply  toggles  the  side  on
  285. move.   if it is white to move, and you enter white, nothing
  286. happens.  If it is white to move and you enter  black,  then
  287. it  becomes  blacks  turn  to move immediately from the same
  288. position.  Used only infrequently.
  289.  
  290. 6.  book (see the book explanation near the end of this doc-
  291. ument  for  a  full explanation of this command and its many
  292. options.)  Note that there are  special  commands  available
  293. (*only*    on    the    command    line,    *not*   in   the
  294. crafty.rc/.craftyrc files)  to  direct  crafty  to  specific
  295. directories for the book files (bookpath=/a/b/c), the table-
  296. base  files  (tbpath=/i/j/k)  and  the   log   files   (log-
  297. path=/x/y/z).   Note  that these commands can *only* be used
  298. on the command line, because they must  be  executed  before
  299. the   engine   is   initialized.    Putting   them   in  the
  300. crafty.rc/.craftyrc file will produce error messages without
  301. affecting how the files are opened.
  302.  
  303. 7.    clock  <ctime>  <otime>   This  command  is  primarily
  304. intended for use when Crafty is  playing  in  a  tournament,
  305. such  as the WMCCC or WCCC events.  If the operator is some-
  306. what slow in entering moves, or forgets to  stop  the  clock
  307. after making a move for Crafty, the chess clock for the game
  308. will drift from the values that Crafty maintains internally.
  309. <ctime>  is the time (in minutes or hh:mm format) crafty has
  310. left until the next time control, and <otime> is  the  oppo-
  311. nent's  remaining  clock  time.  This command can be used at
  312. any time, but will only affect the  time  per  move  *after*
  313. crafty makes the current move and starts to think about what
  314. the opponent might do next.
  315.  
  316. 8.  display  this command is used to display the game board.
  317. This board is displayed using the ICS style #1 type of ASCII
  318. display, with white always at  the  bottom  of  the  screen,
  319. black  at  the  top.  Very unusable to play a game with, but
  320. good to verify a position after it has been set up.
  321.  
  322. This  command  is  also  used   to   display   the   various
  323. piece/square  tables,  by  typing  "display  <piece>"  where
  324. <piece> is replaced by pawn, knight, bishop, rook, queen  or
  325. king.   The board is oriented in the same way as the display
  326. board with a one-to-one correspondence between the  squares.
  327. Perhaps  useful  for  curiosity,  but not for anything else.
  328. These values can not be modified by the user.
  329.  
  330. The final version of this command is used  to  control  what
  331. kind of output you will see when crafty runs.  Currently the
  332. following options are available.
  333.  
  334.        display time:  this  will  make  Crafty  display  the
  335.      amount of time each side takes after making a move.
  336.  
  337.        display  changes:   this will make Crafty display the
  338.      PV each time it changes during  the  search,  including
  339.      when a move fails high or becomes a new best move.
  340.  
  341.      display  variation:   this will make Crafty display the
  342.      PV at the end of each iteration, but it will only  show
  343.      the  best  PV  for the entire iteration, not all of the
  344.      changes.
  345.  
  346.      display stats:  this enables  basic  search  statistics
  347.      output including time, nodes and so forth.
  348.  
  349.      display  extstats:   this enables extended search stats
  350.      including  the  hashing  statistics,  search  extension
  351.      statistics and so forth.
  352.  
  353.      display movenum: causes all PV output to have move num-
  354.      bers embedded in them to make the PV possibly easier to
  355.      read.   This  causes the PV to look like this:  12. ...
  356.      Nxe4 13. Bxe4 h6 rather than simply Nxe4 Bxe4 h6.  This
  357.      is very helpful when playing on a server and whispering
  358.      or kibitzing analysis.  It will  also  be  useful  when
  359.      crafty  is  run  from  within a database program as the
  360.      move numbers will sync up with the actual game.
  361.  
  362.      display moves:  will display each root move  as  it  is
  363.      searched,  along  with  updating the search time at the
  364.      bottom of the screen, so you can see what move is  cur-
  365.      rently being analyzed.
  366.  
  367.      display general:  will display general information mes-
  368.      sages whenever Crafty wants to tell you  something  (ie
  369.      "clearing  hash tables" or other such things like "Mate
  370.      in n moves."
  371.  
  372. If you put a "no" in front of any  of  these  options,  that
  373. will disable that particular type of output.
  374.  
  375. 9.   draw   offers Crafty a draw.  It generally will look at
  376. the value returned by the last search, and compare  it  with
  377. the  value returned by an internal function DrawScore().  If
  378. the search value is not above this result, then Crafty  will
  379. accept the draw.  If the search value is above the theoreti-
  380. cal value for a draw, Crafty will decline  the  draw.   Note
  381. that  crafty  will  offer  draws based on internal analysis.
  382. When it offers a draw, you can respond with "draw"  although
  383. the game does not really end until you exit Crafty.
  384.  
  385. 10.   echo  <text>   This  command is normally used inside a
  386. command file that you are going to use to "feed" crafty some
  387. positions for analysis or whatever.  Since crafty depends on
  388. the operating system to echo commands  as  they  are  typed,
  389. commands  read  in  from a file are "invisible."  This gives
  390. you the ability to insert commands into such a file so  that
  391. crafty  displays a message on the screen to give you an idea
  392. of where it is in processing the file.
  393.  
  394. 11.  edit  This command has been "cloned" from  GnuChess  to
  395. provide an interface with Xboard.  After entering the "edit"
  396. command,  you  are   in   "edit.white"   mode,   where   any
  397. piece/square  combination  you  enter will add the indicated
  398. white piece on the given square.  Piece/squares are  entered
  399. as  "qa3", or "bc4" for example.  This puts a white queen on
  400. a3 and a white bishop on c4.   Once  all  white  pieces  are
  401. entered,  typing  a  "c"  changes to "edit.black" mode where
  402. piece/square combinations now place black pieces.  Typing  a
  403. "."  character  exits  edit  mode.   To clear the board ini-
  404. tially, you use the "#" character.
  405.  
  406. Here's a sample to set up the  original  starting  position,
  407. after  white  has played 1. e4, but no other moves have been
  408. played.
  409.  
  410.   edit
  411.   #
  412.   ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1
  413.   pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2
  414.   c
  415.   ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8
  416.   pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7
  417.   .
  418.  
  419. Note that input  is  free  form,  so  piece/squares  can  be
  420. entered  one  per line or all on one line.  Ditto for the #,
  421. c, and . special characters.  Note also that there is no way
  422. to  enter castling status here.  It is far better to use the
  423. "setboard" command which uses a FEN-like syntax  and  allows
  424. you to set both castling and enpassant status.
  425. 12.   end|quit  These commands are used to terminate crafty.
  426. Note that you can resume a  game  later  without  having  to
  427. replay  the  moves,  by starting Crafty using the "crafty c"
  428. command.  It will immediately read in the moves for the last
  429. game,  although  you  will have to set the time controls and
  430. clock time remaining yourself.
  431.  
  432. 13.  flag on|off  This command is used to  force  crafty  to
  433. end  a  game  where  the opponent runs out of time with win-
  434. board/xboard (on) or to ignore this (off) if desired.
  435.  
  436. 14.  force [move]  This command is used to force  Crafty  to
  437. play a move that is different from the one chosen and played
  438. by the tree search.  If [move] is given, and it is  a  legal
  439. move,  Crafty  will retract its last move and make this move
  440. instead.  It does not change the  side  on  move,  but  does
  441. change  the  position  of  course.   If [move] is not given,
  442. Crafty will prompt you for a move to make.
  443.  
  444. 15.  help  This command displays multiple pages of  one-line
  445. help,  one  command  per  line.  If a line ends with [help],
  446. then you can use help followed by the  specific  command  to
  447. get detailed help.
  448.  
  449. 16.   history  This command displays the history in a verti-
  450. cal column with one move for white and  one  per  black  per
  451. line.   There  are  other  ways  to display the current game
  452. moves and also to save them  in  files  that  are  explained
  453. later.
  454.  
  455. 17.   hash=x  and hashp=x  These commands are used to adjust
  456. the size of the hash tables in Crafty.   hash  modifies  the
  457. size of the transposition/refutation table, while hashp mod-
  458. ifies the size of the pawn structure/king safety hash table.
  459. The  sizes  may be entered as one of the following two types
  460. of values: nnnK where nnn is an integer indicating how  many
  461. Kbytes Crafty should use for this hash table; nnnM where nnn
  462. is an integer indicating how many Mbytes Crafty should  use.
  463.  
  464. The  transposition/Refutation  table is the most critical of
  465. the two, because it directly affects search efficiency, par-
  466. ticularly  in  the  endgame.  For this reason this should be
  467. maximized.  The most effective size for this hash  table  is
  468. 3/4 of your available memory.  If you don't know how to fig-
  469. ure this out, but know that you have 16  megs  for  example,
  470. they you can say hash=16M and crafty will round that down to
  471. 12M, which is 3/4 of a power of two size.  If you study  the
  472. sizes  that  are  possible,  you will find 3M, 6M, 12M, 24M,
  473. 48M, and so forth.  Anything up to, but not  including,  the
  474. next  size  will  be  rounded  down  to the next lower size.
  475. hashp should be set to approximately 1/2 of  what  is  left.
  476. For example, the P6 Crafty runs on when playing on ICC often
  477. uses hash=48M and hashp=8M.  The only thing to watch for  is
  478. that if you make this too large, particularly under windows,
  479. performance will suffer badly because of  paging  I/O  over-
  480. head.   When Crafty is searching in a normal (non-book, non-
  481. endgame database) position, the disk light should  *not*  be
  482. on, indicating lots of I/O.
  483.  
  484. There  is no danger in making this table too large, although
  485. you have to watch out because if Crafty barely fits in  mem-
  486. ory, doing something else on the machine can cause Crafty to
  487. be swapped out completely or  partially,  depending  on  the
  488. operating system you are using.  If you are going to use the
  489. machine for anything else while Crafty  is  running,  it  is
  490. better  to  "pretend"  that  the machine only has 1/2 of the
  491. memory it actually does when computing the size of the  hash
  492. tables you want to use.
  493.  
  494. 18.   import  <filename>  [clear]   This  command is used to
  495. import any sort of learning data that Crafty supports, which
  496. currently  includes book learning data and position learning
  497. data.  This command reads  the  appropriate  <filename>  and
  498. imports that learned data, just as though Crafty had learned
  499. it by playing the games.  The [clear] option, if  specified,
  500. caused  all  old  learned  results  to be cleared before the
  501. import operation, otherwise  the  imported  data  is  simply
  502. added to what is already present.
  503.  
  504. 19.   input <filename>  This command is used to redirect the
  505. console input I/O  stream  from  the  keyboard  to  a  file.
  506. Crafty  will  then read commands from this file, rather than
  507. from the keyboard, and execute them just as though they were
  508. typed  in.   Such  a command file *must* be terminated by an
  509. "exit" command (no quotes) as the last command in the  file.
  510. This  reverts  the  input  stream  back to the keyboard, and
  511. prompts you for another command or move.
  512.  
  513. This command might be used to configure crafty  for  a  spe-
  514. cific  time control, by putting the appropriate time control
  515. commands in the file, or to customize the hash  table  sizes
  516. as needed.
  517.  
  518. 20.  info  This command is used to display information about
  519. Crafty and the current game.  Such things as the  time  con-
  520. trol,  the  time left on the clocks and other information is
  521. shown.
  522.  
  523. 21.  learn n controls the  learning  facilities  in  crafty.
  524. Currently  this is a 3-bit boolean switch,  bit 1 (001) con-
  525. trols book learning, bit 2 (010) controls position learning,
  526. and  bit 3 (100) controls result learning.  learn=0 disables
  527. all learning, learn=1 enables book  learning  only,  learn=2
  528. enables  position  learning only, and learn=4 enables result
  529. learning.  Add the values together to turn on more than  one
  530. type of learning (default=7 to enable everything).
  531. 22.   level  <m>  <t> <inc>  This command was taken directly
  532. from GnuChess so that the  Xboard/WinBoard  interface  would
  533. interface  with  Crafty.  There are other better ways to set
  534. the time, but this one is well-known.  The three  parameters
  535. are  <m>  (number of moves in the game)  <t> initial time on
  536. the clock.  After <m> moves are made, this amount of time is
  537. added to the clock again.  <inc> is the Fischer-Clock incre-
  538. ment that is added back to each clock after a move is  made.
  539. It may be zero for a non-increment game.
  540.  
  541. Examples:
  542.  
  543. level 0 5 0            (ICS 5 0 game)
  544. level 0 5 3            (ICS 5 3 game)
  545. level 0 15 30          (ICS 15 30 game)
  546.  
  547. 23.   list GM|IM|C|AK|S  +name [+name ...] -name [-name ...]
  548. This command is used to maintain the internal "lists" Crafty
  549. uses  to  auto-tune  itself  when playing on a chess server.
  550. There are three lists, GM, IM and C.  If  Crafty's  opponent
  551. is  in  any of these lists, Crafty adjusts internal controls
  552. that affect how/when it resigns or  offers  draws,  and  how
  553. randomly  it  will  choose moves from the opening book.  For
  554. example, Crafty resigns much sooner against a GM, because it
  555. assumes  he knows how to win a rook-up ending, regardless of
  556. how much time is left.  By  the  same  token,  when  playing
  557. against  computers, Crafty will always assume that a draw is
  558. 0.000, so that it doesn't wreck its position trying to avoid
  559. repeating a position.
  560.  
  561. The  AK  list  will  automatically kibitz scores/PV's if the
  562. opponent is in this list.  The S list will turn  on  special
  563. scoring for opponents in this list.  The only current member
  564. is "mercilous".
  565.  
  566. The syntax +name1 +name2 simply adds these  players  to  the
  567. specified  list.   To remove a name, use -name1 -name2.  You
  568. can use one command per name to remove or add,  or  you  can
  569. use one command to add and remove multiple names.
  570.  
  571. 24.   log  off|on|<n>   This command is used to disable log-
  572. ging.  The default is log on, which causes crafty to produce
  573. a new log.nnn file for each game played.  If you are running
  574. Crafty on a server, you might use log  off,  which  disables
  575. creating  these  files as well as the game.nnn files used to
  576. restart a game after you exit crafty and  come  back  later.
  577. If  you  use the form "log n" crafty will simply display the
  578. last n lines of the log on the screen.  If you  use  "log  n
  579. file" crafty will copy the last n lines of the log to "file"
  580. which could be your hard drive, or a floppy.
  581.  
  582. Note that if you run with log off, you  will  be  unable  to
  583. find  out  what  Crafty was thinking about since there is no
  584. other record of the game.  You will always  see  a  game.001
  585. because  as  crafty plays a game, this contains all the real
  586. moves played so far so that you can back up if needed.   you
  587. will also see a log.001 file, but it will be empty.
  588.  
  589. 25.   mode tournament|normal  This command is primarily used
  590. to put Crafty into "tournament" mode, which is intended  for
  591. use  when  Crafty  is  playing in computer chess events.  It
  592. accomplishes two things:  (1) makes all draws return a score
  593. of  0.000,  and  (2) makes crafty issue a message after each
  594. move showing the internal chess clock time,  and  requesting
  595. that  that  operator  check  and  adjust as needed using the
  596. "clock" command.  This primarily makes  Crafty  comply  with
  597. computer chess rules that say the operator can't do anything
  598. not specifically requested by the program.
  599.  
  600. 26.  mt=n  This command is used to set the number of threads
  601. to use on a machine with more than one processor.  For opti-
  602. mal performance, "n" should be set to the number of  proces-
  603. sors  you have, although using fewer will reduce the load on
  604. your machine.  For this command to work,  Crafty  must  have
  605. been  compiled  with  SMP  defined.   When compiled with SMP
  606. enabled, mt=0 effectively disables the SMP code  completely.
  607.  
  608. 27.   name <name>  This command is an ICS-play specific com-
  609. mand.  Xboard/WinBoard uses this to  inform  Crafty  of  the
  610. opponent's  name.   Crafty uses the name, and looks it up in
  611. its GM/IM/C lists, and if found, adjusts itself accordingly.
  612. This is not used by the PGN code and this will not cause the
  613. players <name> to show up in the PGN tag section.
  614.  
  615. 28.  new  This command wipes everything  out  and  starts  a
  616. brand  new  game.  It closes the old log-file and game-file,
  617. and opens the next sequential numbered file.  It also resets
  618. the  game to the beginning and prepares to start a brand new
  619. game.  This was added for Xboard,  but  it  turns  out  that
  620. Xboard  does not use this, rather it starts Crafty fresh for
  621. each new game by first terminating the old copy then  start-
  622. ing  a  new one.  Not nearly as efficient as using "new" but
  623. likely safer it a program can't be sure of resetting  every-
  624. thing back to the initial state.
  625.  
  626. 29.   noise  <n>   This  command  sets  the "noise" level in
  627. Crafty.  Basically, until  <n>  nodes  have  been  searched,
  628. crafty will be silent and not display analysis.
  629.  
  630. This  is  useful  in two ways.  First, in end-games, 20+ ply
  631. searches are not uncommon, and the search analysis  for  the
  632. first  few  plies arrives so quickly that it is distracting.
  633. Second, when observing games (new  interface  only)  on  ICS
  634. servers,  this  can  be used to avoid having Crafty generate
  635. too many analysis kibitzes.  A value of  100000  will  basi-
  636. cally  shut  off any output for the first second or so (on a
  637. P6/200).  Similarly, 1000000 will eliminate any  output  for
  638. about  the  first  10  seconds.  When watching and kibitzing
  639. games like the World Championship games on ICC, I  generally
  640. use  5000000,  which is almost one minute of silence so that
  641. the first PV it kibitzes is a pretty deep search.
  642.  
  643. noise 0 will cause *all* analysis to be displayed, which  on
  644. a  fast machine causes no problems.  On a slower machine, or
  645. over a slow phone connection, this might cause a big  commu-
  646. nication  backlog.   The  default is roughly one second on a
  647. P6/200 (100000) but can be modified by this command.
  648.  
  649. 30.  operator <n>  Another command  intended  for  use  when
  650. Crafty  is  playing  in  a  tournament, operated by a human.
  651. This tells crafty to "hide" <n> minutes of time and not  use
  652. them.   This  time is basically allocated to the operator to
  653. make up for the time it takes to type in moves  and/or  cor-
  654. rect mistakes.  At the WMCCC events, the normal value we use
  655. is 5.  Playing on a server, this is not needed, as it is not
  656. needed if you are playing Crafty yourself.
  657.  
  658. 31.   perf   This  command  is  primarily used in optimizing
  659. Crafty, or to test the speed of the move generator and Make-
  660. Move()/UnMakeMove() on different platforms.  It produces two
  661. results, the moves it can generate per second, and the moves
  662. is  can  generate and make/unmake per second.  While this is
  663. not  a  perfect  performance  indicator,  it  does  give  an
  664. "approximation"  for how fast Crafty might run.  In general,
  665. the higher the numbers, the better the  program  will  play,
  666. although  machines are certainly different.  It's not uncom-
  667. mon to find a machine that searches slower than another, but
  668. has a higher "perf" value.
  669.  
  670. 32.   perft  <depth>  This command is generally used to con-
  671. firm that the move generator and bitmap operators are  work-
  672. ing  properly.   It  simply  takes the current position, and
  673. generates/makes/unmakes moves and counts  them.   Many  pro-
  674. grams  use this from a "standard" position to make sure that
  675. their move generator does not miss generating odd moves like
  676. enpassant/promotions   and   also   to   confirm   that  the
  677. make/unmake code correctly updates the  board  so  that  the
  678. totals  remain  constant  across different machines and pro-
  679. grams, since there is no  alpha/beta  or  evaluation  things
  680. done.   if  <depth>  is  greater than 5 or 6, it will take a
  681. *long* time, since this is basically a minimax tree  traver-
  682. sal  that  will visit *every* node within the <depth> search
  683. horizon.
  684.  
  685. 33.  pgn <tag> <value>  This command  is  used  to  set  the
  686. usual  PGN  tags  to meaningful values.  The recognized tags
  687. are Event, Site, Round, Date, White, WhiteElo, Black, Black-
  688. Elo,  and  Result,  and  the tags *are* case sensitive.  The
  689. <value> can be  any  valid  input  and  blanks  and  special
  690. characters are allowed.  Note that the date is clearly spec-
  691. ified in the PGN standard and must  be  yyyy.mm.dd  with  no
  692. variance.   Valid  results  are  1-0 (white won), 0-1 (black
  693. won), 1/2-1/2 (drawn) and * (unknown).  Some examples:
  694.  
  695. pgn Event 14th World MicroComputer Chess Championship
  696. pgn Date  1996.10.8
  697. pgn Site  Jakarta, Indonesia
  698. pgn Round 1
  699. pgn White Crafty
  700. pgn WhiteElo 2400
  701. pgn Black assassin
  702. pgn BlackElo 2400
  703. pgn Result 1-0
  704.  
  705. Setting these values will result in a proper PGN  file  when
  706. using the savegame command.  Note that if you use the "read"
  707. command to input a PGN game, these values will be  extracted
  708. from that game if they are given.
  709.  
  710. 34.  ponder off|on|<move>  This command serves two purposes.
  711. First, it can be used to disable (off) or enable (on) think-
  712. ing  on the opponent's time (or pondering as it is called in
  713. many programs including Crafty.)  Turning it off will weaken
  714. Crafty  since it will not use any machine time while waiting
  715. on the opponent to move.  It is sometimes  useful,  however,
  716. when   playing  Crafty  against  another  computer  and  the
  717. machines are not equal.  If crafty is on a  faster  machine,
  718. and  you  attempt  to adjust for this by giving the opponent
  719. more time than Crafty, it doesn't work  quite  as  expected,
  720. because  while the opponent is thinking, so is Crafty, which
  721. lets it use the extra opponent time in  an  unexpected  way.
  722. In  such  a  case,  it's best to stop pondering in both pro-
  723. grams.
  724.  
  725. If <move> is given, it directs Crafty to use that <move>  to
  726. ponder,  rather than the one from the previous search.  Most
  727. commonly this is used to set the right move to ponder  after
  728. Crafty has been stopped and then restarted, assuming that it
  729. is the opponent's turn to move when  this  happens.   Other-
  730. wise,  it is probably better to not try to influence things,
  731. although if you are watching and suddenly wonder "what would
  732. Crafty  do  if the opponent plays move 'X'?", you can answer
  733. this by simply typing "ponder X" and then watching the anal-
  734. ysis.  You should reset the correct ponder move after you do
  735. this of course.
  736.  
  737. 35.  savegame <filename>  This command is used to  save  the
  738. current  game  in  a  PGN-compliant  file  with the PGN tags
  739. included.  Note that the default TAG  values  might  not  be
  740. what  you  want  if you do not either use the pgn command to
  741. set them or else input  a  valid  PGN  file  with  the  tags
  742. already filled in.
  743. Be  aware  that  this command doesn't check the filename for
  744. legality since anything goes in UNIX.   In  DOS,  you  might
  745. produce  a bad filename with either too many characters, too
  746. many periods, or whatever, so be careful with the  name  you
  747. choose.   Note also that this file will be overwritten if it
  748. already exists, so be sure to choose a name that is not  the
  749. name  of a file that has something you consider important in
  750. it.
  751.  
  752. 36.  savepos <filename>  This command writes a  single  line
  753. into  <filename> in FEN-like notation.  This lets you save a
  754. position, and then come back later to  re-examine  it.   You
  755. would use the "in <filename>" command to input this file and
  756. set the position up.
  757.  
  758. 37.  reset <n>  This command lets you back up in the current
  759. game  to  any  move  of your choice.  reset <n> backs up the
  760. game to move <n> with the same side on move.  If you want to
  761. first  change the side to move, use the white/black command,
  762. then use the reset command to back up  to  the  right  move.
  763. Note that you can also go forward as well, just so there are
  764. moves in the current game history.
  765.  
  766. 38.  resign <n>  This command  sets  the  resign  threshold.
  767. When  running  on  ICC I typically use "resign 9" which will
  768. make crafty resign roughly five moves after the score  drops
  769. below  -9.000.   For IM's I change this to 6, and for GM's I
  770. often use 3, so that it will resign quicker and not  drag  a
  771. lost game out unnecessarily.
  772.  
  773. 39.   read/reada [<filename>]  This command will read input,
  774. and extract the chess moves and make  them  to  set  up  the
  775. position  at the end of the game.  It first resets the chess
  776. board to the initial position (read command only)  and  then
  777. extracts  the  PGN  tags  (if present) from the front of the
  778. input.  The rest of the input  is  parsed  for  chess  moves
  779. (comments  and  similar things are culled automatically) and
  780. the moves are made and added to the game history.  Once this
  781. is done, you can back up, go forward, or play from any point
  782. in the game.  If you specify a <filename> everything is read
  783. from  the  file,  otherwise it is read from the console key-
  784. board.
  785.  
  786. The reada command reads moves, but appends them to the  cur-
  787. rent  game  history/  position  rather than resetting to the
  788. initial chess position.  This lets you read in a game,  then
  789. use reada to manually add some more moves to see the result-
  790. ing position.
  791.  
  792. 40.  search <move>  This command allows you to  specify  one
  793. particular move for the side on move, and then when you tell
  794. Crafty to search this position, this is the only  move  that
  795. will  be  searched.  This is used internally by the annotate
  796. command, but can be used to investigate one  specific  move.
  797. If the move is not the best move, a normal search won't show
  798. you why it is bad, but this will.  It is also  quite  a  bit
  799. faster  since  the  other  moves  in  the  position  are not
  800. searched at all.
  801.  
  802. 41.  settc <moves> <ctime> <otime>  This command is  primar-
  803. ily  used  in tournaments, and is an error-recovery command.
  804. If the machine crashes and corrupts the game  history  file,
  805. frequently the operator will have to simply set the position
  806. using the setboard command, and then use the  settc  command
  807. to  restore the time control values.  <moves> is moves until
  808. the next time control (from Crafty's perspective, be careful
  809. and  don't  look  at the opponent's moves to time control by
  810. accident.)  <ctime>  is  minutes  left  on  Crafty's  clock,
  811. <otime> is minutes left on the opponent's clock.
  812.  
  813. 42.   setboard  <FEN  input>   This command is used to set a
  814. chess position up for analysis and is the preferred  way  to
  815. do  this, rather than using the gnu EDIT interface.  It uses
  816. a classic Forsythe-like notation to encode the position  and
  817. also  has  provisions for castling status and enpassant cap-
  818. ture status.
  819.  
  820. the standard piece codes p,n,b,r,q,k are used to denote  the
  821. type  of  piece  on  a  square, upper/lower case are used to
  822. indicate the color of  the  piece  (uppercase=white  pieces,
  823. lowercase=black pieces).
  824.  
  825. the pieces are entered from the classic chess diagram's ori-
  826. entation of a8  being  the  upper-left-hand  corner  of  the
  827. board,  and  this  square  is entered first, followed by the
  828. remainder of the 8th rank left to right.  To indicate  empty
  829. squares,  use  a number between 1 and 8 to indicate how many
  830. adjacent squares are empty.  use a / to terminate each  rank
  831. after  all  of  the  pieces for that rank have been entered.
  832. Note that you do not have to account for all 8 squares on  a
  833. given rank, although many test suites do this for clarity.
  834.  
  835. the following input will setup the board position that given
  836. below:
  837.  
  838.       k2r/ppp////Q/5PPP/7K/ B
  839.  
  840. this assumes that k represents a white king  and  -q  repre-
  841. sents a black queen.
  842.  
  843.                       -k  *  * -r  *  *  *  *
  844.                       -p -p -p  *  *  *  *  *
  845.                        *  *  *  *  *  *  *  *
  846.                        *  *  *  *  *  *  *  *
  847.                        *  *  *  *  *  *  *  *
  848.                        q  *  *  *  *  *  *  *
  849.                        *  *  *  *  *  p  p  p
  850.                        *  *  *  *  *  *  *  k
  851.                                                                            *
  852. the field after the final "/" should be either  b  or  w  to
  853. indicate  which  side is "on move."  after this side-to-move
  854. field any of the following characters can appear to indicate
  855. the   following:   KQ:  white  can  castle  king-side/queen-
  856. side/both;  kq: same for black;  a1-h8: indicates the square
  857. occupied by a pawn that can be captured enpassant.
  858.  
  859. 43.   score   This command simply gives the positional score
  860. for the current position.  This score is  from  whites  per-
  861. spective,  so a + score is good for white, a - score is good
  862. for black.  Crafty also breaks the  score  down  into  major
  863. categories  (from  Evaluate())  to indicate things like pawn
  864. structure, piece evaluation, passed pawns, development,  and
  865. so forth.  Note that some of Crafty's evaluation is asymmet-
  866. ric, so that if you simply change sides with the white/black
  867. command  and then enter "score" again, you may get a differ-
  868. ent value.  This is *not* a bug.  :)
  869.  
  870. 44.  sd <n>  This command lets you specify a specific search
  871. depth  limit  that  Crafty  can  not  exceed.  It still pays
  872. attention to the clock, however, so often you will  use  the
  873. st  <n>  command  (below)  in  conjunction  with this if the
  874. search is going to take an extended amount of time.  <n>  is
  875. the  depth  (in  plies  or  1/2  moves) that the search must
  876. reach.  Note that if Crafty is pondering,  it  still  honors
  877. this  limit  and  will stop a ponder search after this depth
  878. has been completed as well.  This is *not* the way  to  make
  879. Crafty play weaker, although this will be covered in a later
  880. section of this document.
  881.  
  882. 45.  st <n>  This command lets you specify a specific search
  883. time limit for Crafty.  Again, this is not the preferred way
  884. to set a time per move, because this limit is  absolute  and
  885. Crafty  will  never go over this limit, even if it sees that
  886. it is losing or getting mated.   Setting  the  time  control
  887. with  the  usual "time" or "level" command is *much* better.
  888. <time> is given in seconds, although it may also be  entered
  889. as mm:ss if preferred.
  890.  
  891. 46.   show <category>  This command forces Crafty to display
  892. additional information about certain actions it takes.  Cur-
  893. rently  the only <category> is "book" which will make crafty
  894. display information about all the book moves it found in the
  895. database.   More is given about this information in the BOOK
  896. section later in this file.
  897.  
  898. 47.  test <filename> [n] This command will run  a  suite  of
  899. positions  (the file must be in "Crafty" format as explained
  900. below) and produce a summary  of  how  many  it  got  right,
  901. wrong,  etc.   It  uses  the  time per move you set with the
  902. (typically) st <n> command.  The optional paramenter [n]  is
  903. the  "early  exit"  counter.  If Crafty finds, and holds the
  904. solution move  for  n  iterations,  it  will  terminate  the
  905. search.   I  use  this  to make a win at chess run take < 15
  906. minutes, even though the time  per  position  is  set  to  1
  907. minute,  by  setting  n to 2.  After two correct iterations,
  908. Crafty goes on to the next problem.  For absolutely  correct
  909. results,  this is not advisable as it could obviously change
  910. its mind later on, but for performance analysis, this  saves
  911. a lot of time.
  912.  
  913. The  test  suite  contains  the following lines:  (this is a
  914. sample from my test suite for Win At Chess.)
  915.  
  916. title wac299
  917. setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w
  918. solution Nca4
  919.  
  920. title wac300
  921. setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w
  922. solution g6
  923.  
  924. end
  925.  
  926. The title command simply displays this message  in  the  log
  927. file  so  you  can  look  at the output and figure out which
  928. position it goes with.  This is optional, but useful.
  929.  
  930. The setboard command sets the position as explained  before.
  931.  
  932. The solution command gives the set of solution moves (one or
  933. more moves that are separated by blanks)  and/or  a  set  of
  934. "anti-solution"  moves  (moves  that  must  not be played to
  935. count the position as correct.)  "anti-solution"  moves  are
  936. simply followed by a "?" character, for example:
  937.  
  938. solution Bxa7?
  939.  
  940. The  solution  command supplies a set of key moves, and then
  941. starts the search.  If, after the search terminates, one  of
  942. the key solution moves was chosen (or none of the anti-solu-
  943. tion moves were chosen) the position is counted as  correct.
  944.  
  945. The  final  line should be "end" although end-of-file or EOF
  946. will also be detected in this case.
  947.  
  948. 48.   time  CPU|elapsed|<values>   This   command   controls
  949. whether  the  program  uses  CPU time or wall-clock time for
  950. timing.  for tournament play, it is safer to use  wall-clock
  951. timing,  for  testing  it  may be more consistent to use CPU
  952. timing if the machine is used for other things  concurrently
  953. with the tests being run.
  954. time  is  also used to set the basic search timing controls.
  955. the general form of the command is as follows:
  956.  
  957.       time nmoves/ntime/[nmoves/ntime]/[increment]
  958.  
  959. nmoves/ntime represents a  traditional  first  time  control
  960. when  nmoves  is an integer representing the number of moves
  961. and ntime is the total time allowed for  these  moves.   the
  962. [optional] nmoves/ntime is a traditional secondary time con-
  963. trol.  increment is a feature related to ICS play  and  emu-
  964. lates  the  Fischer  clock where <increment> is added to the
  965. time left after each move is made.
  966.  
  967. as an alternative, nmoves can be  "sd"  which  represents  a
  968. sudden  death  time  control  of  the  remainder of the game
  969. played in ntime.  the optional secondary time control can be
  970. a sudden-death time control, as in the following example:
  971.  
  972.         time 60/30/sd/30
  973.  
  974. this sets 60 moves in 30 minutes, then game in 30 additional
  975. minutes.  an increment can be added if desired.
  976.  
  977. One final example is the following:
  978.  
  979.         time sd/15
  980.  
  981. which is a simple game/15 setting.  This command can also be
  982. used  to  perform  the same function as the "level" command.
  983. For example, to set up a classic ICS 2 12 game, the  follow-
  984. ing would would work:
  985.  
  986.         time sd/2/12
  987.  
  988. 49.   trace <n>  This command is used to make crafty display
  989. the tree as it searches a position.  Due to  the  incredible
  990. speed  at  which  this  program can search, however, this is
  991. less than useful since it can swamp any known display driver
  992. and make things scroll impossibly fast.
  993.  
  994. Also  note  that  this  command usually is disabled, because
  995. Crafty is generally compiled with  the  -DFAST  flag,  which
  996. removes the trace output code from the search to make things
  997. slightly faster.  You will have to  recompile,  without  the
  998. -DFAST,  if  you want to use this.  It's utility is limited,
  999. except for debugging, anyway.
  1000.  
  1001. 50.  usage <n> is simply a way to modify Crafty's time usage
  1002. to fit your tastes.  You can "suggest" a time limit with any
  1003. of the options discussed previously, but if you use anything
  1004. other  than the "st" command, Crafty will do its best to use
  1005. time as you suggest, but it also anticipates  that  it  will
  1006. save  some  time  by  pondering, etc., and will therefore be
  1007. more aggressive at trying to use time.  if <n> is a positive
  1008. integer, it is taken as a percentage and crafty will compute
  1009. the time limit it thinks  is  appropriate  for  the  current
  1010. clock  settings, then increase this limit by this percentage
  1011. (50 would make it take 1.5 times longer than  normal.)   -50
  1012. would make it take 1/2 the time it would normally take.
  1013.  
  1014. Crafty  adjusts  the  usage  internally  based on time left,
  1015. opponent's time left, how quickly or slowly the opponent  is
  1016. moving,  etc.  Further modifying things with this is danger-
  1017. ous, but possible.
  1018.  
  1019. 51.  whisper/kibitz <n>  These commands are used to  control
  1020. what  Crafty  will whisper or kibitz on a chess server.  The
  1021. options are (1) only whispers  or  kibitzes  mate  announce-
  1022. ments;  (2)  adds time, score, depth to the previous option,
  1023. but no PV or moves.  (3) adds the PV.  (4)  adds  book  move
  1024. information to the output.  The remaining two options gener-
  1025. ate a lot of output and should be used  with  caution.   (5)
  1026. displays  the PV after each iteration completes.  I use this
  1027. when using my custom interface to let Crafty observe/comment
  1028. on  games  in progress on ICC.  Noise can be used to prevent
  1029. shallow searches from generating output and keeping  "noise"
  1030. down  on  the games being watched.  (6) basically will whis-
  1031. per/kibitz nearly everything you see on the console  from  a
  1032. search,  each  PV when it changes, fail highs and fail lows,
  1033. etc.  A significant amount of output that  should  be  care-
  1034. fully weighed before turning it "loose."
  1035.  
  1036. 52.   Xboard  This command turns on Xboard/WinBoard compati-
  1037. bility mode, and makes Crafty behave somewhat like GnuChess.
  1038. This  is designed to be used *only* when Crafty is interfac-
  1039. ing with Xboard/WinBoard.  Crafty will not work  with  these
  1040. two  GUIs  without  this  option, and really won't work very
  1041. well with this option if it is not connected to one of them.
  1042.                 Opening Book Setup and Usage
  1043.                 ----------------------------
  1044.  
  1045. Crafty   uses   two   pre-compiled   opening  books,  called
  1046. "book.bin" and "books.bin".
  1047.  
  1048. The file book.bin is usually build from a  large  text  file
  1049. containing  PGN  games,  often  taken from collections of GM
  1050. games.  Building book.bin is a simple exercise and  requires
  1051. nothing  other than the raw input file you are going to use.
  1052. Generally this will be either medium.zip or the set of  four
  1053. files  large[1-4].zip,  all  of  which are stored on the ftp
  1054. machine ftp.cis.uab.edu/pub/hyatt/.
  1055.  
  1056. To create the file book.bin, you need a PGN game  collection
  1057. that is a *real* PGN-compliant file.  Supposing this file is
  1058. called "large.pgn" you would use the following command:
  1059. book create large.pgn <m> [n]
  1060.  
  1061. The only thing you have to supply is <m>, a number  indicat-
  1062. ing  how  many  moves from each game are to be stored in the
  1063. book.bin database.  I typically use  60,  which  stores  the
  1064. first  60  moves  from  each  game.   Increasing this number
  1065. slightly increases the probability that Crafty will stay  in
  1066. book  longer,  but it also increases the probability that it
  1067. will follow a game too far, so that it begins to reach posi-
  1068. tions  where  the move actually played might not be the best
  1069. move, letting it fall into a bad hole.  Increasing this also
  1070. increases the size of the database as well.
  1071.  
  1072. You  can  decrease the size of the book, and also reduce the
  1073. number of ugly moves by  specifying  "n",  which  says  that
  1074. unless  a  move  is  played in at least N games, the move is
  1075. discarded.  This will substantially decrease the size of the
  1076. book.bin  file,  and  also  eliminate single game moves that
  1077. often have significant errors or blunders.
  1078.  
  1079. After creating book.bin, you need to create books.bin.  This
  1080. is  a  small  version of book.bin, which is intended to give
  1081. you more control over the moves/openings Crafty  will  play.
  1082. This  is  usually  built  from the file start.pgn on the ftp
  1083. machine, but you can modify this file  to  suit  your  taste
  1084. easily.  To build books.bin, you use the following command:
  1085.  
  1086. books create start.pgn 60
  1087.  
  1088. Again,  60  is what I use, but none of my start.pgn lines go
  1089. anywhere near that many moves.  The main point here is  that
  1090. in start.pgn, you can append a "!" to any move you want, and
  1091. when it is Crafty's turn to move for  that  color,  it  will
  1092. play from the set of moves with "!" if there are any, ignor-
  1093. ing the rest of the book moves.  If you only want it to play
  1094. 1. e4 as white, you would just enter the short game:
  1095.  
  1096. [Crafty only plays 1. e4] 1. e4!
  1097.  
  1098. and  you  are finished!.  You can enter as many as you want.
  1099. If on the other hand there is a move you don't  want  Crafty
  1100. to  play, then follow that move with a "?" and it will never
  1101. play it.  Moves in books.bin that are not flagged with !  or
  1102. ? don't have any influence on Crafty's choice at all.
  1103.  
  1104. Here's  how  the files are used.  When searching a position,
  1105. Crafty first enumerates the set of moves it can find in  the
  1106. opening  database.   It then does the same for the books.bin
  1107. database, and performs a "merge" operation to combine the  ?
  1108. and ! flags...  The purpose of the books.bin file is to give
  1109. you a small database that you can  easily  modify,  rebuild,
  1110. and  repeat  this  process  over and over.  Since it takes a
  1111. fraction of a second to completely rebuild this file, it  is
  1112. very  easy  to modify this to control what Crafty will play,
  1113. without having to rebuild the large database.
  1114.  
  1115. One important characteristic of the PGN input is the  Result
  1116. tag  must  be specified in most of the lines, because Crafty
  1117. counts wins, losses and draws for each book  move  and  uses
  1118. these  counts  with some of the book selection options given
  1119. below.
  1120.  
  1121. How the flags are used.
  1122.  
  1123. The ! and ? flags should only appear in the small  books.bin
  1124. file, although there is no reason why they can not appear in
  1125. the large file as well.  For  this  discussion,  it  doesn't
  1126. matter  since  Crafty  takes  the  moves from both files and
  1127. "merges" the flags/etc into one entry for each move.
  1128.  
  1129. Quite simply, if any book legal book move has a ! flag, then
  1130. Crafty  will only play moves from the set of moves which all
  1131. have the ! flag.  If a move has a ? flag, then that move  is
  1132. immediately removed from the set of possible book moves.  If
  1133. the only legal book move has a ? flag, it will not be played
  1134. as  a book move and Crafty will simply pretend that it found
  1135. no book moves and will execute a normal tree search.  Pretty
  1136. simple.
  1137.  
  1138. How does Crafty choose book moves?
  1139.  
  1140. Crafty's  book  selection  algorithm  depends  on  two user-
  1141. defined values that can be set at any time during a game:
  1142.  
  1143. book random <n>
  1144.  
  1145. book width <w>
  1146.  
  1147. The selection algorithm first finds the set  of  legal  book
  1148. moves  as  above.   This  set will either be all ! moves, or
  1149. will have no ! moves in it.  This set is then  sorted  based
  1150. on the setting of book random.  Here's the options:
  1151.  
  1152. book  random  0.  This is a special case for book selection.
  1153. Crafty simply takes the set of book moves, and searches only
  1154. these  moves  using  a  normal alpha/beta search, but with a
  1155. shorter than usual time limit.  It then plays the move  that
  1156. produces the best search value.  This has one serious disad-
  1157. vantage in that there is no randomness to this at  all.   It
  1158. will  always play the same move in the same position, unless
  1159. the evaluation is modified, or the time per move is  differ-
  1160. ent  enough to let the search find a different move from the
  1161. book move set.
  1162.  
  1163. book random 1.  This enables a  random  form  of  book  move
  1164. selection,  but you have a lot of control over how moves are
  1165. randomly chosen.  The moves are ordered, based on 4  parame-
  1166. ters:   frequency of play, win/lose ratio, static evaluation
  1167. and learned results.  Normally these are factored  into  the
  1168. value used to sort the moves, based on default settings that
  1169. you can  modify  by  using  the  command  "bookw  option  N"
  1170. "option"  should  be "freq", "ratio", "eval" and "learn".  N
  1171. should be a number between 0 and 1.
  1172.  
  1173. Crafty finds the min and max values for each of the 4 param-
  1174. eters,  and  then  maps  this into the range 0-1000 for each
  1175. parameter.  Each parameter is multiplied by the  correspond-
  1176. ing  "weight" you have assigned, and this is used as a value
  1177. to sort the moves from low to high.
  1178.  
  1179. Once Crafty has sorted the moves as  given  above,  it  next
  1180. excludes  any  book moves which have 0 wins.  This culls the
  1181. odd lines where a player chose a bad line and lost  quickly.
  1182. With  zero  wins,  it  will never be chosen, although Crafty
  1183. will happily follow it from the other side.  :)  This is not
  1184. anywhere  near  perfect,  however,  because an opening could
  1185. have 1 win and 19 losses and that still would  stay  in  the
  1186. list.
  1187.  
  1188. If  a  move  has a learned value of > 100, this move is ele-
  1189. vated in priority to that of a ! move, since it  appears  to
  1190. win material instantly.  If a value is < -100, it is given a
  1191. ? since it appears to be a lemon.
  1192.  
  1193. After this, the setting for "book width <w>" is used to keep
  1194. the first <w> moves in the list, after the above culling has
  1195. been completed.  The smaller you make <w> the  less  random-
  1196. ness  you get, but the chance of Crafty popping out a really
  1197. bizarre book move gets smaller as well.
  1198.  
  1199. Once this has been done, crafty simply uses the "sort value"
  1200. for  each  move  to  compute a total for all moves.  It then
  1201. generates a random number between  1  and  this  limit,  and
  1202. chooses the move that this probability distribution matches.
  1203. This will certainly evolve over time as new ideas are devel-
  1204. oped.
  1205.  
  1206. For  my  play  on ICC, I use book random 1, and book width 5
  1207. normally, although for titled players  this  is  reduced  to
  1208. book width 3.  For computers, I reduce this further to 2, to
  1209. try to play reasonable openings and  cull  the  gambits  and
  1210. things that don't work out.
  1211.  
  1212. How  does  book  learning  work  and how can I share learned
  1213. results?
  1214.  
  1215. 1.  *all* of crafty's "learned knowledge" is in the book.bin
  1216. file.  It keeps the learned value and learned count right in
  1217. the book file for speed.   You  can't  modify  it,  although
  1218. "show  book"  will  make  crafty  display all the book stuff
  1219. before it makes a move.
  1220.  
  1221. 2.  the book.lrn file has two purposes:  (a) to serve  as  a
  1222. log  for your prying eyes, so you can see what it's learned,
  1223. against whom, and what the score was that got its  attention
  1224. in  the  first  place.   The  values on the end of each book
  1225. line, inside the {} characters are as follows:
  1226.     {value, depth, rating_difference} value is the value  of
  1227. the  "key"  search that comes from the first 10 moves out of
  1228. book.  it's in millipawns, and + is good - is bad.  depth is
  1229. the  depth  the  search  reached at this "key" position, the
  1230. deeper the search, the more the value  is  "trusted."   rat-
  1231. ing_difference is crafty's rating - opponent's rating a neg-
  1232. ative value means pay more attention to the score since  the
  1233. opponent  is  better  than crafty, a positive value means to
  1234. take the score with a grain of salt,  because  the  opponent
  1235. was weaker than Crafty.
  1236.  
  1237. You  can  delete this file at any time, and it has no effect
  1238. on learning.  As I mentioned, the learning  takes  place  in
  1239. book.bin...  this  is  mainly  for you to peek at if you are
  1240. interested.  However, this is the  "portable  learning  data
  1241. file"  also, and can be given to others to import into their
  1242. crafty, where it will affect  the  opening  book  just  like
  1243. their  crafty  had  played  the  openings  and  got the same
  1244. scores.  There are two ways to use such "lrn" files:
  1245.  
  1246. 1.  "import <filename>" will read <filename> and import  the
  1247. knowledge  therein into your book.bin.  Since I use the same
  1248. learning code as is used when playing games,  this  informa-
  1249. tion  also gets appended to *your* book.lrn file as well, so
  1250. that your book.lrn always reflects *everything* your program
  1251. has learned, so long as you don't ever remove this file.  It
  1252. would be a mistake to use this command on your own  book.lrn
  1253. file,  because  the  things  would  get counted twice, which
  1254. might or might not be a good thing.
  1255.  
  1256. 2.  "import  <filename>  clear"  will  read  <filename)  and
  1257. import  the  knowledge  as  above,  but  first  clears *all*
  1258. learned results from book.bin.  you will want to do this  if
  1259. you  import  my  book.lrn, *and*, you have contributed to my
  1260. book.lrn data by sending me yours.  I'll take care of elimi-
  1261. nating  duplicates  if you screw up in what you send me, but
  1262. once you send me something, you run the risk of  getting  it
  1263. "back  again"  later.   This  is going to be a problem until
  1264. everyone gets used  to  sharing  something  that  is  rather
  1265. "vapid" like this "learned info" is...
  1266.  
  1267. Other than that, we are now "open for business"...  when the
  1268. urge strikes you, email me your .lrn file, I'll keep a large
  1269. master  here  and  update it on occasion.  Probably the best
  1270. thing to do is  to  send  me  your  .lrn  and  at  the  same
  1271. *instant*  delete yours.  This will capture anything learned
  1272. *after* you send me the file, but you'll get  it  all  right
  1273. back  with  the  next version of book.lrn that I distribute.
  1274. after getting this new book.lrn back, here's what you should
  1275. do:
  1276.  
  1277. 1.   rename  your old book.lrn to something else.  I'll call
  1278. it "book.lrn.old" here.
  1279.  
  1280. 2.  copy my blearn.dat to your machine, but *do not* put  it
  1281. in  the  directory  with  your  book.bin  and books.bin file
  1282. because it will get confusing very quickly if you  do.   put
  1283. it  somewhere  else,  because  you  are  going  to remove it
  1284. quickly anyway.  I'll call it new.lrn for this example.
  1285.  
  1286. 3.  import new.lrn clear
  1287.     import book.lrn.old
  1288.  
  1289. and you are ready to rumble again.  The first command clears
  1290. the  learned  values, sucks in my new learn file and updates
  1291. everything.  the second command re-learns everything  you've
  1292. learned  since  you  sent  me the last book.lrn file.  After
  1293. doing this your book.lrn will have my .lrn stuff, plus  your
  1294. old.lrn stuff, just waiting to be sent to me again...
  1295.  
  1296. If  this  is confusing, I can probably add an automatic com-
  1297. mand to do all of this by renaming book.lrn, etc.  Hopefully
  1298. this is not too error-prone for the time being anyway...
  1299.  
  1300. What is this new Position Learning I've heard about?
  1301.  
  1302. Crafty  now  has  a "permanent" hash table that is kept from
  1303. game to game.  A position gets into this  "hash  file"  when
  1304. Crafty  executes  a  search and the search value is signifi-
  1305. cantly lower than the last search value.
  1306.  
  1307. When this happens, Crafty stores the current information for
  1308. this  position in the permanent hash file, which can hold up
  1309. to 65536 positions.  Once it fills  up,  the  positions  are
  1310. replaced  on a FIFO basic always keeping the most recent 64K
  1311. entries.
  1312.  
  1313. Each time crafty starts a search, the positions/scores  from
  1314. this  file  are stuffed into the normal transposition table,
  1315. and used during the search just like any other table  entry.
  1316. Here's how it helps:  In a game that was played, the follow-
  1317. ing moves and scores were found by crafty (playing white):
  1318.  
  1319. 1.  Ng5 (+.277)  h6 2.  Nh7 (+.321)   Kg8  3.   Qh5  (+.133)
  1320. Qg7 4.  Ng5 (-2.122) hxg5
  1321.  
  1322. So,  the knight got trapped at h7, and at move 4 crafty dis-
  1323. covered   that   this   is   gross   and    "learns"    this
  1324. result/position.
  1325.  
  1326. We  play  the exact same game again:  except that two things
  1327. can happen here.  It might be that Ng7 is the *only*  square
  1328. the knight can move to here, which means this whole thing is
  1329. forced.  the first search would find:
  1330.  
  1331. 1.  Ng5 (-2.122) if the search can reach 8 plies deep, which
  1332. happens  even  in  5 second games.  It's learned that Ng5 is
  1333. bad.  It stores *this* position in the permanent  hash  file
  1334. also, and the next time you try this same trap, it will dis-
  1335. cover 4-5 moves earlier that if the knight gets to g5 it  is
  1336. in  trouble.  Each game will diverge from the first game 3-4
  1337. moves earlier.  Simple and effective.
  1338.  
  1339. 2.  Ng5 might not be forced, and if not, it knows Ng5  loses
  1340. a piece for a pawn, so it will promptly play something else,
  1341. which is exactly what is desired.
  1342.  
  1343. This is implemented with two (count 'em,  two)  files.   One
  1344. file  "position.bin" is a binary file that contains the hash
  1345. table entries, and it right at one megabyte in size,  *max*.
  1346. (16  bytes per hash entry X 65536 entries = exactly one meg,
  1347. but I have 8 extra bytes for the FIFO  queue  implementation
  1348. and  to see how many entries are currently in the file if it
  1349. is not full.
  1350.  
  1351. The second file is "position.lrn" and is, you guessed it,  a
  1352. file that can be shared with others, just like book.lrn.  It
  1353. contains all information needed to reconstruct the position,
  1354. the  score,  the depth, etc.  and also included the pgn tags
  1355. for who was what color and when the game was played...
  1356.  
  1357. This data can be imported with the new "import" command (the
  1358. old  book  learn  <filename> is no longer around) which will
  1359. import either book.lrn type data or position.lrn  type  data
  1360. and  can tell them apart without your having to do anything.
  1361. The <clear> option is still there, should you  want  to  use
  1362. it,  and  simply  removes  the position.lrn and position.bin
  1363. files before starting the import process for position learn-
  1364. ing.
  1365.  
  1366. This  can  be  turned  off, if you like, by checking out the
  1367. "learn" command, which gives you the  ability  to  turn  off
  1368. book  learning  (as  it presently works), position learning,
  1369. and the next book learning stage which will add to the  book
  1370. in addition to learning which book lines are good and bad.
  1371.  
  1372. What is this new "result" learning?
  1373.  
  1374. Result learning works just like normal book learning, except
  1375. that if Crafty is checkmated or resigns, it will  step  back
  1376. through  the  book  line to find the last point where it had
  1377. more than one move to choose from.  It will flag the move it
  1378. chose as "never play again".
  1379.  
  1380. This  handles  the  case  where the first ten non-book moves
  1381. produce reasonable scores, but  the  position  is  one  that
  1382. Crafty  simply  can't  handle very well.  If it loses such a
  1383. game, it will still vary  the  next  time  this  opening  is
  1384. played, as otherwise it would possibly repeat the same open-
  1385. ing, and would certainly repeat the remainder of the game.
  1386.  
  1387. All three learning modes are turned on by default,  although
  1388. any  of  them  can  be disabled with the appropriate command
  1389. option to "learn".
  1390.