File: documentation.txt

package info (click to toggle)
crafty 23.4-7
  • links: PTS
  • area: non-free
  • in suites: bookworm, bullseye, buster, stretch
  • size: 3,292 kB
  • ctags: 2,891
  • sloc: ansic: 30,650; cpp: 5,829; makefile: 901; sh: 178; perl: 30
file content (2112 lines) | stat: -rw-r--r-- 79,678 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112







         Crafty Command Documentation (version 18)
      -----------------------------------------------
Crafty  is nothing more than a long-time hobby of mine, dat-
ing back to Blitz and later Cray Blitz.  People ask me how I
keep doing this, and that is the one question that generally
leaves me at a loss for words.

Perhaps the most common question I'm asked is "is this  ver-
sion  of Crafty some dumbed-down version of what you play on
ICC or what you use at a computer chess event?"  The  answer
is a resounding *NO*.  The current version is *exactly* what
is running on ICC under this version number.   Note  that  a
new  version  can, on occasion, introduce weaknesses or out-
right bugs that were not present  in  previous  "gold"  ver-
sions.   As  a result, you should be careful to back up your
"favorite" before trying the latest and  greatest.   If  you
aren't  satisfied with the new version, you can then go back
to what you believe is a better version.

If you are looking for the strongest playing computer  chess
program  available,  you should likely look to Fritz, Rebel,
Tiger, and the other commercial  entries.   There  you  will
find  strong  opponents  with  polished interfaces that have
been tested in a systematic and careful  way.   If  you  are
looking  for  a program that plays good chess, has a reason-
able set of features for you to use, is available in  source
form,  and  one  where the author welcomes feedback, code or
suggestions, then you are at the  right  place.   I  welcome
comments  and  suggestions, and also feedback from ideas you
try yourself that seem to work.

Crafty is a state-of-the-art  computer  chess  program,  and
uses  all  of  the  search algorithms you have probably read
about, negascout search, killer/history move  ordering,  SEE
(Static  Exchange  Evaluation)  quiescence move ordering and
pruning, hash (transposition/refutation) tables as  well  as
evaluation caches, selective extensions, recursive null-move
search, and a host of other features that have been used and
are  still  being  used in most computer chess programs.  If
it's not in Crafty, either it is on the "to do" list, or  it
has been tried, found wanting, and discarded.

Chess Knowledge is growing, and suggestions (or even better,
real code) are welcome.  This is  the  best  place  to  con-
tribute  your  ideas,  because knowledge can be used to sup-
plant search and make it play  better.   The  evaluation  is
probably  the easiest place to start studying Crafty because
of the comments and simplicity of using bitmaps, *once*  you
get "into" them.

My  purpose  for doing this is an exercise in computer chess
efficiency.  I can't begin to count the number of  people  I
know  that  started  from  scratch to write a chess program.













Even larger is the group that started from scratch, and gave
up  before  finishing, because of the basic size of the pro-
ject.

Crafty offers everyone a very clean starting point,  if  you
are  fascinated by the bitmap chess board implementation (as
I  am).   The  search  and  quiescence  code  is  reasonably
straightforward, as is the evaluation,

It  offers a great starting point, so that if you are inter-
ested in trying a new search extension, you can  be  testing
tomorrow,  rather  than  next year, because you start with a
fully functional chess engine that is not a  "toy"  applica-
tion,  but is a functional and "dangerous" chess player.  It
offers a rapid start, although you can certainly replace  it
piece  by  piece  until  it is "yours" if you want.  It also
offers a fairly complete set of commands  and  an  interface
for  a GUI as well as support for chess server play, so that
testing and debugging your new ideas is greatly  simplified.

If you'd like more information, please check out the read.me
document  and  the  crafty.FAQ  that  are  distributed  with
Crafty.  These contain recent news and specific instructions
for commonly asked  questions,  like  "where  can  I  obtain
tablebase files and how do I use them?"
                    How to play a game.
                    -------------------
When  you execute Crafty, you will immediately be greeted by
the prompt string "white(1): " and Crafty will wait for com-
mands.  This prompt means it is white on move, and we are at
move #1 for white.  You can first use any  of  the  commands
from the alphabetic command listing below to tailor the game
to your liking (time control, hash table size, book  random-
ness,  etc.)  and then you have two choices.  If you want to
play white, just enter your move, and Crafty  will  take  it
from  there  and  make a move in response.  You will then be
prompted by "white(2):" and it is your move again.   If  you
would prefer to play black, just enter either "move" or "go"
at the prompt and crafty will move for that side rather than
accepting  a  move  from  you.   After it makes its move for
white, you will then see the prompt "black(1): "  indicating
it is now time for blacks first move.  You can enter a move,
or you can once again enter "move" or "go" and  Crafty  will
again  move  for  the current side, change sides, and prompt
you for what to do next.

If you find yourself continually using a set of commands  to
configure crafty to play as you want, you can put these com-
mands in a startup file called .craftyrc (Unix) or crafty.rc
(DOS/Windows).   The  format  for this file is just like you
would type the commands at the keyboard, with  the  require-
ment that the last line of the file must be "exit" on a line
by itself.  Using this, each time you start Crafty, it  will













first  execute the commands from this file before it prompts
you for input.

While Crafty is running, you can control what  it  displays,
but  here's a couple of samples to explain what it is saying
and why:

           depth   time   score    variation (1)
            book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5}
            book   0.0s     70%    d4

White(3): d4
            time used:   0.01

This is the normal output for those cases where Crafty is in
book.   The book moves line gives the set of book moves that
made the first selection cut (see the book selection  expla-
nation  given  later), followed by the move actually played,
in this case d4.

If Crafty is out of book, then  the  output  looks  somewhat
different as given below:

   depth   time   score    variation (1)
     4->   0.81    2.09    6. dxe4 Bxe4 7. Rad8 Qf2 8. Qb5
     5      1.37    2.41    6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+
Qxe4 9. f5
     5->   1.88    2.41    6. dxe4 Bxe4 7. Ne5 Qf4 8.  Bxe4+
Qxe4 9. f5
     6     7.38      --    6. dxe4
     6     11.90     1.97    6. dxe4 Bxe4 7. Rab8 Qf2 8. Qc7
Nc5 9. Qe5
     6    12.92      ++    6. Ne5
     6    13.71    2.23    6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
     6->  15.59    2.23    6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
   time: 15.60  cpu:99%  mat:1  n:246565  nps:15927
   ext-> checks:4706 recaps:1336 pawns:0 1rep:301
   nodes  full:45951  quiescence:200614  evals:104657
   endgame tablebase-> probes done: 0  successful: 0

Let's take this stuff one line at a time.  Lines  that  have
something like 4-> in the depth column are printed when that
iteration (depth) is  completely  finished.   The  time  and
score  columns  should  be obvious as to their meaning as is
the PV, the sequence of moves that led to this  score.   One
note  about  the  "score"  column.  As of version 18, Crafty
displays the score with + values good for  white,  -  values
good  for  black,  no matter which side it is playing in the
game.  All output now follows this convention, from playing,
to  analysis  mode,  to  annotating  your games, to whisper-
ing/kibitzing on the chess servers, and so forth.   This  is
unlike  other  engines,  but  once you get used to it, it is
much less confusing when you remember that  negative  scores













are good for black and bad for white, and vice-versa.

the  line that has -- in the score column means that when we
started depth 6, dxe4 turned out to be worse than we thought
(notice  score  dropped  from 2.411 last search to 1.972 for
this move this search.)  To resolve this, Crafty lowers  the
lower  search bound (alpha) and re-searches the move to find
the score.  The line with ++ means that this move  (Ne5)  is
better than the best move so far, so Crafty raises the upper
search bound (beta) and re-searches this move  to  find  the
new score.

the  first line of statistics gives the total time taken for
this search, the cpu percentage which should stay at 98-100%
unless your machine is heavily loaded or unless Crafty is in
an endgame that is  having  lots  of  contact  with  endgame
databases.  If this drops below 98%, it means that Crafty is
not getting full CPU usage and will be playing  weaker  than
normal.   The mat:1 is simply the true material score, since
Crafty's positional scores are often larger than a pawn.

               Alphabetic Listing of Commands
               ------------------------------

1.  alarm on|off  This command is used to  control  Crafty's
"beep"  after  it  makes a move.  Turning this off will make
Crafty "quiet" when it plays, but also makes it easy to miss
a  move  if  you  are  using crafty to play in a tournament.
This is primarily designed to make Crafty  tolerable  during
late night matches.

2.  analyze  This command puts crafty into analyze mode.  In
this mode, Crafty starts computing for whichever side is  on
move,  and  it  continues computing and showing its analysis
until a move is entered.  This move is made, Crafty  changes
sides,  and  starts thinking and printing analysis all over,
but for the other side now.

This command is useful to play through a game,  because  you
get  instant  feedback  when you try a move.  If you want to
try a different move from the one you just entered, use  the
"back"  command  to  back  up one move, or use "back <n>" to
back up <n> moves.  Note that one move is a single move  for
the  last  player, not a move for both sides.  To unmake the
most recent 2 moves (one for black, one for white) use "back
2".

3.    annotate|annotateh  <filename>  <colors|name>  <moves>
<margin> <time> This command is used to annotate (make  com-
ments in) a game that has already been played.

The annotate command produces a file with the .can extension
added to the original name.  This  file  will  contain  pure













ascii  information  from  the  annotation pass.  "annotateh"
produces an HTML file instead (with  the  .html  extension).
This  includes  the  normal  output,  plus  a nice bitmapped
graphical board display for every position where crafty  had
'something to say'.

<filename>  is  the name of the file that has the game moves
stored  in  it.   This  should  be  a  PGN-compatible  file,
although  Crafty  can  read nearly any file with chess moves
and convert it to pgn using the "read" and  "savegame"  com-
mands to perform the conversion.

<colors|name>  indicates  which  side  Crafty will annotate.
The valid choices are w, b, and wb/bw for white only,  black
only,  and  both, respectively.  Crafty will search and pro-
duce results for the indicated color only, making moves  for
the other side silently as they are read in.

Alternatively,  you can specify the player's name (useful if
you want to annotate several of your own games in one  large
pgn file, for example, and you alternated colors so that you
can't pick the right one easily).  Crafty will  then  figure
out  which side to annotate for in each game.  Note that the
name is case-sensitive, but that you only have  to  enter  a
string  that is unique in the name field.  IE if one name is
"Anatoly Karpov" and the other is "unknown" then  specifying
Karpov  as  the  name  would  be  sufficient.   If  the same
'string' appears in both names, Crafty will complain.

<moves> indicates the moves that should  be  annotated.   If
this  is  a  single  integer, annotation starts at this move
number (for the color given above) and proceeds for the rest
of  the  game.   If  a range is given, as (20-33), then only
moves 20-33 inclusive are annotated.  To annotate  the  com-
plete game, you can use 1-999.

<margin> gives a score "window" that controls whether Crafty
will produce comments (see below).  The larger  this  number
this  number,  the fewer annotations Crafty will produce.  A
negative number will result in an annotation for every  move
selected.

<time> indicates the time limit for each search.  Since each
move selected requires two searches, you can take the number
of  moves,  double  this  number  and  multiply by <time> to
determine how long the annotation process will  take.   This
time is in seconds.

How it works.  Suppose you use the command "annotate game1 w
1-999 1.000 30" This asks Crafty to read the  file  "game1",
and  annotate the white moves for the entire game.  The mar-
gin is 1 pawn and the search time limit is 30 seconds.   The
output  for the annotate command is found in <filename>.can,













in this case this is game1.can.

Crafty first searches the move actually played in  the  game
to  determine  the  score  for it.  Crafty then searches the
same position, but tries all legal moves.  If the score  for
the best move found in this search is greater than the score
for the move actually played plus the margin, then a comment
is  added  to  the  output  file.  This output file is quite
short, with all the game moves (plus any  PGN  tags  in  the
original,  for  identification purposes) plus the brief com-
ments.  An annotation looks like this:

{real_value (depth:best_value PV moves)}

real_value is the score for the move actually played.  depth
is  the  depth Crafty searched to produce the best_value and
PV for what it thinks is the best sequence of moves for both
sides.   If you set <margin> to 1.000, you are asking Crafty
to only annotate moves that either lost a pawn or  more,  or
moves  that  failed to win a pawn or more.  If you set <mar-
gin> to .300, you are asking for annotations  for  any  move
that  makes  the  score  drop  about 1/3 of a pawn below the
value for the best move Crafty found.

If you have other moves you would like to see analyzed  dur-
ing  this  annotate process, at the point where the move can
be played, insert it into the PGN file as an  analysis  com-
ment,  surrounded  by () or {} characters.  Crafty will pro-
duce analysis for this move as well.  If more than one  move
appears  inside  a  single set of delimiters, only the first
will be analyzed.  To force Crafty to analyze more than  one
move,  enter them like this:  (move1) (move2) as though they
were two separate comments.

4.  ANSI on|off  This command is used to control whether  or
not  Crafty attempts to display its move in reverse video or
not.  For PC's, Linux, and most Unix boxes, this works fine.
Should you find yourself playing crafty via a dumb terminal,
this might hose the terminal and interfere with your ability
to  see  or  input  moves.   If  moves  are not displayed in
reverse video, it's probably wise to turn this off to  avoid
hanging the terminal you are using.

5.   black|white   This  command  simply toggles the side on
move.  if it is white to move, and you enter white,  nothing
happens.   If  it is white to move and you enter black, then
it becomes blacks turn to move  immediately  from  the  same
position.  Used only infrequently.

6.  book (see the book explanation near the end of this doc-
ument for a full explanation of this command  and  its  many
options.)   Note  that  there are special commands available
(*only*   on   the    command    line,    *not*    in    the













crafty.rc/.craftyrc  files)  to  direct  crafty  to specific
directories for the book files (bookpath=/a/b/c), the table-
base   files   (tbpath=/i/j/k)   and  the  log  files  (log-
path=/x/y/z).  Note that these commands can *only*  be  used
on  the  command  line, because they must be executed before
the  engine   is   initialized.    Putting   them   in   the
crafty.rc/.craftyrc file will produce error messages without
affecting how the files are opened.

If you need to specify multiple  directories  (tbpath  only)
you  may  do  so  by using "tbpath=path1:path2:path3:etc" or
else       use       the       more        Unix-        like
"tbpath=(path1:path2:path3:etc)"  instead.   The  paths  are
separated by ":" (colon) characters and everything is  case-
sensitive  as  usual.   For dos/windows users, the separator
can be a semi-color (;) or a comma(,)  to  avoid  the  drive
designation ambiguity.

7.   cache=N   This  command is used to alter the cache size
used for endgame database probes.  N can be a  simple  inte-
ger,  representing  the  number of bytes to use or it can be
specified as nK or nM representing n * 1024  bytes  or  n  *
1024  *  1024  bytes.   This  should  be in multiples of the
database "chunk" size, which might vary.  Using the nM  form
guarantees that you will have a reasonable number.

8.    clock  <ctime>  <otime>   This  command  is  primarily
intended for use when Crafty is  playing  in  a  tournament,
such  as the WMCCC or WCCC events.  If the operator is some-
what slow in entering moves, or forgets to  stop  the  clock
after making a move for Crafty, the chess clock for the game
will drift from the values that Crafty maintains internally.
<ctime>  is the time (in minutes or hh:mm format) crafty has
left until the next time control, and <otime> is  the  oppo-
nent's  remaining  clock  time.  This command can be used at
any time, but will only affect the  time  per  move  *after*
crafty makes the current move and starts to think about what
the opponent might do next.

9.  computer  This command usually  comes  from  xboard/win-
board,  but  can  be  used  at any time to tell Crafty it is
playing a computer.  This will prevent some things from hap-
pening, such as a draw score that varies, as well as adjust-
ing the book selection code to be more selective in what  it
plays.

10.   display   this  command  is  used  to display the game
board.  This board is displayed using the ICS style #1  type
of  ASCII  display,  with  white always at the bottom of the
screen, black at the top.  Very  unusable  to  play  a  game
with,  but  good  to verify a position after it has been set
up.














This  command  is  also  used   to   display   the   various
piece/square  tables,  by  typing  "display  <piece>"  where
<piece> is replaced by pawn, knight, bishop, rook, queen  or
king.   The board is oriented in the same way as the display
board with a one-to-one correspondence between the  squares.
Perhaps  useful  for  curiosity,  but not for anything else.
These values can not be modified by the user.

The final version of this command is used  to  control  what
kind of output you will see when crafty runs.  Currently the
following options are available.

       display time:  this  will  make  Crafty  display  the
     amount of time each side takes after making a move.

       display  changes:   this will make Crafty display the
     PV each time it changes during  the  search,  including
     when a move fails high or becomes a new best move.

     display  variation:   this will make Crafty display the
     PV at the end of each iteration, but it will only  show
     the  best  PV  for the entire iteration, not all of the
     changes.

     display stats:  this enables  basic  search  statistics
     output including time, nodes and so forth.

     display  extstats:   this enables extended search stats
     including  the  hashing  statistics,  search  extension
     statistics and so forth.

     display movenum: causes all PV output to have move num-
     bers embedded in them to make the PV possibly easier to
     read.   This  causes the PV to look like this:  12. ...
     Nxe4 13. Bxe4 h6 rather than simply Nxe4 Bxe4 h6.  This
     is very helpful when playing on a server and whispering
     or kibitzing analysis.  It will  also  be  useful  when
     crafty  is  run  from  within a database program as the
     move numbers will sync up with the actual game.

     display moves:  will display each root move  as  it  is
     searched,  along  with  updating the search time at the
     bottom of the screen, so you can see what move is  cur-
     rently being analyzed.

     display general:  will display general information mes-
     sages whenever Crafty wants to tell you  something  (ie
     "clearing  hash tables" or other such things like "Mate
     in n moves."

If you put a "no" in front of any  of  these  options,  that
will disable that particular type of output.














11.   draw  offers Crafty a draw.  It generally will look at
the value returned by the last search, and compare  it  with
the  value returned by an internal function DrawScore().  If
the search value is not above this result, then Crafty  will
accept the draw.  If the search value is above the theoreti-
cal value for a draw, Crafty will decline  the  draw.   Note
that  crafty  will  offer  draws based on internal analysis.
When it offers a draw, you can respond with "draw"  although
the game does not really end until you exit Crafty.

12.  drawscore N sets the draw score (or contempt factor) to
N.  If you want crafty to avoid draws, set  this  number  to
something  that  is negative.  IE -50 says that a repetition
(draw) is the same as being 1/2 pawn down.   Setting  it  to
+100  will  make it try very hard to draw because that looks
like it is winning a pawn when it does so.  Note  that  this
is dangerous (either way) as a -50 in a king and pawn ending
is very likely dead lost...  and a repetition is better.

13.  echo <text>  This command is  normally  used  inside  a
command file that you are going to use to "feed" crafty some
positions for analysis or whatever.  Since crafty depends on
the  operating  system  to  echo commands as they are typed,
commands read in from a file are  "invisible."   This  gives
you  the ability to insert commands into such a file so that
crafty displays a message on the screen to give you an  idea
of where it is in processing the file.

14.   edit   This command has been "cloned" from GnuChess to
provide an interface with Xboard.  After entering the "edit"
command,   you   are   in   "edit.white"   mode,  where  any
piece/square combination you enter will  add  the  indicated
white  piece on the given square.  Piece/squares are entered
as "qa3", or "bc4" for example.  This puts a white queen  on
a3  and  a  white  bishop  on c4.  Once all white pieces are
entered, typing a "c" changes  to  "edit.black"  mode  where
piece/square  combinations now place black pieces.  Typing a
"." character exits edit mode.   To  clear  the  board  ini-
tially, you use the "#" character.

Here's  a  sample  to set up the original starting position,
after white has played 1. e4, but no other moves  have  been
played.

  edit
  #
  ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1
  pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2
  c
  ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8
  pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7
  .














Note  that  input  is  free  form,  so  piece/squares can be
entered one per line or all on one line.  Ditto for  the  #,
c, and . special characters.  Note also that there is no way
to enter castling status here.  It is far better to use  the
"setboard"  command  which uses a FEN-like syntax and allows
you to set both castling and enpassant status.

15.  egtb   This  command  enables  the  endgame  databases.
Crafty  will  use  the  "tbpath"  directory (if provided) to
locate and register all of  the  databases  you  have  down-
loaded.  It will report the largest class it found, as in "5
piece tablebase files found" if you downloaded at least  one
5-piece  file.  If you use this command to enable databases,
you should also consider using the "cache" command to  spec-
ify the egtb cache size.

16.   end|quit  These commands are used to terminate crafty.
Note that you can resume a  game  later  without  having  to
replay  the  moves,  by starting Crafty using the "crafty c"
command.  It will immediately read in the moves for the last
game,  although  you  will have to set the time controls and
clock time remaining yourself.

17.  evaluation option <value>  This command is used to mod-
ify the evaluation scores.

The  option "asymmetry" is used to make crafty evaluate king
safety differently for each side.  "evaluation asymmetry 25"
will  increase the king safety scores for the opponent only,
meaning it will pay less attention to its  own  king  safety
than  to  that of its opponent.  This will make it play more
aggressively.  "evaluation asymmetry -25"  will  reduce  the
king  safety  scores  for for the opponent by 25%, making it
care more about its own king safety than that of  its  oppo-
nent.  This will make it play more defensively.

The  "bscale"  option  will  adjust  the  scores for blocked
pawns.  The default value is 100.  Increasing this will tend
to  make  Crafty  dislike blocked pawn positions more, which
will lead to more  open  positions.   Note  that  this  only
affects  moves  _after_  the opening book has been followed,
which means that the position might be  blocked  before  the
evaluation term has a chance to affect the game.

The "kscale" option will adjust all king safety scores based
on the 'value' entered.  For example, "evaluation kscale 50"
will  reduce  all  king safety scores to 50% of their normal
value.  "evaluation  kscale  133"  will  increase  all  king
safety scores to 133% of their normal values.

The  option  "tropism" is used to scale king tropism scores.
This will attract pieces toward kings.  A value of 100 means
no  change.   other values are treated as a percentage (like













scale) to increase (>  100)  or  decrease  (<100)  the  king
tropism scores.

When you use this command, you will see something like this:

modified king-safety values:
white:   0   4  16  26  39  45  58  77  87  90  93  96 100 103 106 109
       112 116 119 122 125 128 128 128 128 128 128 128 128 128 128 128

black:   0   5  20  32  48  56  72  96 108 112 116 120 124 128 132 136
       140 144 148 152 156 160 160 160 160 160 160 160 160 160 160 160

Those values represent the  king-safety  evaluation  as  the
king  gets  more  and more exposed.  This is always based on
the fast that "crafty" will be the side  on  move  when  the
search  starts.  In the above, it was white's move when this
was typed, meaning that it appears that crafty will be play-
ing  black.   Notice  that  white's  king safety numbers are
scaled by 20% to make it slightly more  cautious  about  its
own king.  If you type "go" in this position, the scores get
reversed as Crafty's scores are always left alone (with  the
asymmetry  option) and the opponent's scores are scaled down
as indicated.

You will see similar numbers (but not black and white  sets)
that  represent the actual scores produced for king tropism.
Note that pieces interact to choose which  element  of  this
vector is used, but in general, the more pieces are close to
the king, the larger the element from this array.

The "pscale" option is used to scale normal  pawn  structure
scoring  in  the same way as the other scaling options.  100
is the default.  Values less than 100 reduce this term, val-
ues over 100 inflate it.

The "ppscale" option is used to scale some passed pawn scor-
ing in the same way as the other scaling  options.   100  is
the  default.  Values less than 100 reduce this term, values
over 100 inflate it.  This  mainly  effects  outside  passed
pawns/protected  passed pawns.  The normal pawn scoring com-
putes the value of a passed pawn.  This term is then used to
scale  those  terms  that modify this value further, such as
two connected passed pawns on the 6th, or a passed pawn with
the king supporting it in an endgame.

18.  extensions type value

This  command is used to control the extension depth for the
various extensions done in Crafty's search.  The  extensions
are  set  as  decimel numbers that represent plies (or frac-
tions of plies) to extend for each particular reason.   Most
default  to  1.0  and  .75, but any value can be used.  Note
that value > 1.0 are _very_ dangerous as they can cause  the













search  to  become non-terminating (crafty will stop when it
runs out of time for the move, but it might not be  able  to
get anything useful from such a search).

These  extensions  are presently limited to a maximum of one
ply of extensions at any point in the tree.   IE  no  matter
what you set these values to, they can not exceed one ply at
present.

incheck  This is the amount to extend when the side on  move
makes  a  move that leaves the opponent in check.  Note that
Crafty extends on the ply where the check is played, not  on
the next ply where the opposite side is in check.

onerep   This  is  the one-reply-to-check extensions, and is
done at the point where one side is in check and has exactly
one legal move to escape from the check.

pushpp   This  is the extension used for certain passed pawn
pushes in the endgame.

recapture  This is the recapture extension, and  is  applied
when  the current move recaptures an equal-valued piece that
made a capture at the previous ply.  IE BxN, PxB.  Note that
this  can  only  be applied once for every two plies so that
BxN, BxB, NxB, NxN won't look like three recaptures.

mate  This is the mate threat extensions and is applied when
a  null  move  search returns -MATED, which means that doing
nothing gets the side on move mated.  The opponent must have
some sort of serious mate threat in such a position.

19.   flag  on|off   This command is used to force crafty to
end a game where the opponent runs out  of  time  with  win-
board/xboard (on) or to ignore this (off) if desired.

20.   force  [move]  This command is used to force Crafty to
play a move that is different from the one chosen and played
by  the  tree search.  If [move] is given, and it is a legal
move, Crafty will retract its last move and make  this  move
instead.   It  does  not  change  the side on move, but does
change the position of course.   If  [move]  is  not  given,
Crafty will prompt you for a move to make.

21.   help  This command displays multiple pages of one-line
help, one command per line.  If a  line  ends  with  [help],
then  you  can  use help followed by the specific command to
get detailed help.

22.  history  This command displays the history in a  verti-
cal  column  with  one  move for white and one per black per
line.  There are other ways  to  display  the  current  game
moves  and  also  to  save  them in files that are explained













later.

23.  hash=x and hashp=x  These commands are used  to  adjust
the  size  of  the hash tables in Crafty.  hash modifies the
size of the transposition/refutation table, while hashp mod-
ifies the size of the pawn structure/king safety hash table.
The sizes may be entered as one of the following  two  types
of  values: nnnK where nnn is an integer indicating how many
Kbytes Crafty should use for this hash table; nnnM where nnn
is  an integer indicating how many Mbytes Crafty should use.

The transposition/Refutation table is the most  critical  of
the two, because it directly affects search efficiency, par-
ticularly in the endgame.  For this reason  this  should  be
maximized.   The  most effective size for this hash table is
3/4 of your available memory.  If you don't know how to fig-
ure  this  out,  but know that you have 16 megs for example,
they you can say hash=16M and crafty will round that down to
12M,  which is 3/4 of a power of two size.  If you study the
sizes that are possible, you will find  3M,  6M,  12M,  24M,
48M,  and  so forth.  Anything up to, but not including, the
next size will be rounded  down  to  the  next  lower  size.
hashp  should  be  set to approximately 1/2 of what is left.
For example, the P6 Crafty runs on when playing on ICC often
uses  hash=48M and hashp=8M.  The only thing to watch for is
that if you make this too large, particularly under windows,
performance  will  suffer  badly because of paging I/O over-
head.  When Crafty is searching in a normal (non-book,  non-
endgame  database)  position, the disk light should *not* be
on, indicating lots of I/O.

There is no danger in making this table too large,  although
you  have to watch out because if Crafty barely fits in mem-
ory, doing something else on the machine can cause Crafty to
be  swapped  out  completely  or partially, depending on the
operating system you are using.  If you are going to use the
machine  for  anything  else  while Crafty is running, it is
better to "pretend" that the machine only  has  1/2  of  the
memory  it actually does when computing the size of the hash
tables you want to use.

24.  import <filename> [clear]   This  command  is  used  to
import any sort of learning data that Crafty supports, which
currently includes book learning data and position  learning
data.   This  command  reads  the appropriate <filename> and
imports that learned data, just as though Crafty had learned
it  by playing the games.  The [clear] option, if specified,
caused all old learned results  to  be  cleared  before  the
import  operation,  otherwise  the  imported  data is simply
added to what is already present.

25.  input <filename>  This command is used to redirect  the
console  input  I/O  stream  from  the  keyboard  to a file.













Crafty will then read commands from this file,  rather  than
from the keyboard, and execute them just as though they were
typed in.  Such a command file *must* be  terminated  by  an
"exit"  command (no quotes) as the last command in the file.
This reverts the input stream  back  to  the  keyboard,  and
prompts you for another command or move.

This  command  might  be used to configure crafty for a spe-
cific time control, by putting the appropriate time  control
commands  in  the file, or to customize the hash table sizes
as needed.

26.  info  This command is used to display information about
Crafty  and  the current game.  Such things as the time con-
trol, the time left on the clocks and other  information  is
shown.

27.   learn  n  controls  the learning facilities in crafty.
Currently this is a 3-bit boolean switch,  bit 1 (001)  con-
trols book learning, bit 2 (010) controls position learning,
and bit 3 (100) controls result learning.  learn=0  disables
all  learning,  learn=1  enables book learning only, learn=2
enables position learning only, and learn=4  enables  result
learning.   Add the values together to turn on more than one
type of learning (default=7 to enable everything).

28.  level <m> <t> <inc>  This command  was  taken  directly
from  GnuChess  so  that the Xboard/WinBoard interface would
interface with Crafty.  There are other better ways  to  set
the  time, but this one is well-known.  The three parameters
are <m> (number of moves in the game)  <t> initial  time  on
the clock.  After <m> moves are made, this amount of time is
added to the clock again.  <inc> is the Fischer-Clock incre-
ment  that is added back to each clock after a move is made.
It may be zero for a non-increment game.

Examples:

level 0 5 0            (ICS 5 0 game)
level 0 5 3            (ICS 5 3 game)
level 0 15 30          (ICS 15 30 game)

29.  list GM|IM|C|AK|S  +name [+name ...] -name [-name  ...]
This command is used to maintain the internal "lists" Crafty
uses to auto-tune itself when playing  on  a  chess  server.
There  are  three lists, GM, IM and C.  If Crafty's opponent
is in any of these lists, Crafty adjusts  internal  controls
that  affect  how/when  it  resigns or offers draws, and how
randomly it will choose moves from the  opening  book.   For
example, Crafty resigns much sooner against a GM, because it
assumes he knows how to win a rook-up ending, regardless  of
how  much  time  is  left.   By the same token, when playing
against computers, Crafty will always assume that a draw  is













0.000, so that it doesn't wreck its position trying to avoid
repeating a position.

The AK list will automatically  kibitz  scores/PV's  if  the
opponent  is  in this list.  The S list will turn on special
scoring for opponents in this list.  The only current member
is "mercilous".

The  syntax  +name1  +name2 simply adds these players to the
specified list.  To remove a name, use -name1  -name2.   You
can  use  one  command per name to remove or add, or you can
use one command to add and remove multiple names.  Note that
all names must be entered in lowercase characters, using any
uppercase characters will break the matching algorithm.

30.  log off|on|<n>  This command is used  to  disable  log-
ging.  The default is log on, which causes crafty to produce
a new log.nnn file for each game played.  If you are running
Crafty  on  a  server, you might use log off, which disables
creating these files as well as the game.nnn files  used  to
restart  a  game  after you exit crafty and come back later.
If you use the form "log n" crafty will simply  display  the
last  n  lines  of the log on the screen.  If you use "log n
file" crafty will copy the last n lines of the log to "file"
which could be your hard drive, or a floppy.

Note  that  if  you  run with log off, you will be unable to
find out what Crafty was thinking about since  there  is  no
other  record  of  the game.  You will always see a game.001
because as crafty plays a game, this contains all  the  real
moves  played so far so that you can back up if needed.  you
will also see a log.001 file, but it will be empty.

31.  ls <filename> will list all the files  that  match  the
filename  wildcard  (the  wildcards depend on the system you
are using, but generally *, ? will work fine.  you can  also
supply  path information in the filename if you want to list
the contents of a different directory.  Just  use  the  same
syntax  you would if you were using "ls" under unix or "dir"
under windows.

32.  mode tournament|normal  This command is primarily  used
to  put Crafty into "tournament" mode, which is intended for
use when Crafty is playing in  computer  chess  events.   It
accomplishes two things:  (1) makes all draws return a score
of 0.000, and (2) makes crafty issue a  message  after  each
move  showing  the internal chess clock time, and requesting
that that operator check and  adjust  as  needed  using  the
"clock"  command.   This  primarily makes Crafty comply with
computer chess rules that say the operator can't do anything
not specifically requested by the program.

33.   name  <name>   This  command  is  an ICS-play specific













command.  Xboard/WinBoard uses this to inform Crafty of  the
opponent's  name.   Crafty uses the name, and looks it up in
its GM/IM/C lists, and if found, adjusts itself accordingly.
This is not used by the PGN code and this will not cause the
players <name> to show up in the PGN tag section.

34.  new  This command wipes everything  out  and  starts  a
brand  new  game.  It closes the old log-file and game-file,
and opens the next sequential numbered file.  It also resets
the  game to the beginning and prepares to start a brand new
game.  This was added for Xboard,  but  it  turns  out  that
Xboard  does not use this, rather it starts Crafty fresh for
each new game by first terminating the old copy then  start-
ing  a  new one.  Not nearly as efficient as using "new" but
likely safer it a program can't be sure of resetting  every-
thing back to the initial state.

35.   noise  <n>   This  command  sets  the "noise" level in
Crafty.  Basically, until  <n>  nodes  have  been  searched,
crafty will be silent and not display analysis.

This  is  useful  in two ways.  First, in end-games, 20+ ply
searches are not uncommon, and the search analysis  for  the
first  few  plies arrives so quickly that it is distracting.
Second, when observing games (new  interface  only)  on  ICS
servers,  this  can  be used to avoid having Crafty generate
too many analysis kibitzes.  A value of  100000  will  basi-
cally  shut  off any output for the first second or so (on a
P6/200).  Similarly, 1000000 will eliminate any  output  for
about  the  first  10  seconds.  When watching and kibitzing
games like the World Championship games on ICC, I  generally
use  5000000,  which is almost one minute of silence so that
the first PV it kibitzes is a pretty deep search.

noise 0 will cause *all* analysis to be displayed, which  on
a  fast machine causes no problems.  On a slower machine, or
over a slow phone connection, this might cause a big  commu-
nication  backlog.   The  default is roughly one second on a
P6/200 (100000) but can be modified by this command.

36.  operator <n>  Another command  intended  for  use  when
Crafty  is  playing  in  a  tournament, operated by a human.
This tells crafty to "hide" <n> minutes of time and not  use
them.   This  time is basically allocated to the operator to
make up for the time it takes to type in moves  and/or  cor-
rect mistakes.  At the WMCCC events, the normal value we use
is 5.  Playing on a server, this is not needed, as it is not
needed if you are playing Crafty yourself.

37.   perf   This  command  is  primarily used in optimizing
Crafty, or to test the speed of the move generator and Make-
Move()/UnMakeMove() on different platforms.  It produces two
results, the moves it can generate per second, and the moves













is  can  generate and make/unmake per second.  While this is
not  a  perfect  performance  indicator,  it  does  give  an
"approximation"  for how fast Crafty might run.  In general,
the higher the numbers, the better the  program  will  play,
although  machines are certainly different.  It's not uncom-
mon to find a machine that searches slower than another, but
has a higher "perf" value.

38.   perft  <depth>  This command is generally used to con-
firm that the move generator and bitmap operators are  work-
ing  properly.   It  simply  takes the current position, and
generates/makes/unmakes moves and counts  them.   Many  pro-
grams  use this from a "standard" position to make sure that
their move generator does not miss generating odd moves like
enpassant/promotions   and   also   to   confirm   that  the
make/unmake code correctly updates the  board  so  that  the
totals  remain  constant  across different machines and pro-
grams, since there is no  alpha/beta  or  evaluation  things
done.   if  <depth>  is  greater than 5 or 6, it will take a
*long* time, since this is basically a minimax tree  traver-
sal  that  will visit *every* node within the <depth> search
horizon.

39.  pgn <tag> <value>  This command  is  used  to  set  the
usual  PGN  tags  to meaningful values.  The recognized tags
are Event, Site, Round, Date, White, WhiteElo, Black, Black-
Elo,  and  Result,  and  the tags *are* case sensitive.  The
<value> can be any valid input and blanks and special  char-
acters are allowed.  Note that the date is clearly specified
in the PGN standard and must be yyyy.mm.dd with no variance.
Valid  results are 1-0 (white won), 0-1 (black won), 1/2-1/2
(drawn) and * (unknown).  Some examples:

pgn Event 14th World MicroComputer Chess Championship
pgn Date  1996.10.8
pgn Site  Jakarta, Indonesia
pgn Round 1
pgn White Crafty
pgn WhiteElo 2400
pgn Black assassin
pgn BlackElo 2400
pgn Result 1-0

Setting these values will result in a proper PGN  file  when
using the savegame command.  Note that if you use the "read"
command to input a PGN game, these values will be  extracted
from that game if they are given.

40.  ponder off|on|<move>  This command serves two purposes.
First, it can be used to disable (off) or enable (on) think-
ing  on the opponent's time (or pondering as it is called in
many programs including Crafty.)  Turning it off will weaken
Crafty  since it will not use any machine time while waiting













on the opponent to move.  It is sometimes  useful,  however,
when   playing  Crafty  against  another  computer  and  the
machines are not equal.  If crafty is on a  faster  machine,
and  you  attempt  to adjust for this by giving the opponent
more time than Crafty, it doesn't work  quite  as  expected,
because  while the opponent is thinking, so is Crafty, which
lets it use the extra opponent time in  an  unexpected  way.
In  such  a  case,  it's best to stop pondering in both pro-
grams.

If <move> is given, it directs Crafty to use that <move>  to
ponder,  rather than the one from the previous search.  Most
commonly this is used to set the right move to ponder  after
Crafty has been stopped and then restarted, assuming that it
is the opponent's turn to move when  this  happens.   Other-
wise,  it is probably better to not try to influence things,
although if you are watching and suddenly wonder "what would
Crafty  do  if the opponent plays move 'X'?", you can answer
this by simply typing "ponder X" and then watching the anal-
ysis.  You should reset the correct ponder move after you do
this of course.

41.  reset <n>  This command lets you back up in the current
game  to  any  move  of your choice.  reset <n> backs up the
game to move <n> with the same side on move.  If you want to
first  change the side to move, use the white/black command,
then use the reset command to back up  to  the  right  move.
Note that you can also go forward as well, just so there are
moves in the current game history.

42.  resign <n>  This command  sets  the  resign  threshold.
When  running  on  ICC I typically use "resign 9" which will
make crafty resign roughly five moves after the score  drops
below  -9.000.   For IM's I change this to 6, and for GM's I
often use 3, so that it will resign quicker and not  drag  a
lost game out unnecessarily.

43.   read/reada [<filename>]  This command will read input,
and extract the chess moves and make  them  to  set  up  the
position  at the end of the game.  It first resets the chess
board to the initial position (read command only)  and  then
extracts  the  PGN  tags  (if present) from the front of the
input.  The rest of the input  is  parsed  for  chess  moves
(comments  and  similar things are culled automatically) and
the moves are made and added to the game history.  Once this
is done, you can back up, go forward, or play from any point
in the game.  If you specify a <filename> everything is read
from  the  file,  otherwise it is read from the console key-
board.

The reada command reads moves, but appends them to the  cur-
rent  game  history/  position  rather than resetting to the
initial chess position.  This lets you read in a game,  then













use reada to manually add some more moves to see the result-
ing position.

44.  savegame <filename>  This command is used to  save  the
current  game  in  a  PGN-compliant  file  with the PGN tags
included.  Note that the default TAG  values  might  not  be
what  you  want  if you do not either use the pgn command to
set them or else input  a  valid  PGN  file  with  the  tags
already filled in.

Be  aware  that  this command doesn't check the filename for
legality since anything goes in UNIX.   In  DOS,  you  might
produce  a bad filename with either too many characters, too
many periods, or whatever, so be careful with the  name  you
choose.   Note also that this file will be overwritten if it
already exists, so be sure to choose a name that is not  the
name  of a file that has something you consider important in
it.

45.  savepos <filename>  This command writes a  single  line
into  <filename> in FEN-like notation.  This lets you save a
position, and then come back later to  re-examine  it.   You
would use the "in <filename>" command to input this file and
set the position up.

46.  search <move>  This command allows you to  specify  one
particular move for the side on move, and then when you tell
Crafty to search this position, this is the only  move  that
will  be  searched.  This is used internally by the annotate
command, but can be used to investigate one  specific  move.
If the move is not the best move, a normal search won't show
you why it is bad, but this will.  It is also  quite  a  bit
faster  since  the  other  moves  in  the  position  are not
searched at all.

47.  settc <moves> <ctime> <otime>  This command is  primar-
ily  used  in tournaments, and is an error-recovery command.
If the machine crashes and corrupts the game  history  file,
frequently the operator will have to simply set the position
using the setboard command, and then use the  settc  command
to  restore the time control values.  <moves> is moves until
the next time control (from Crafty's perspective, be careful
and  don't  look  at the opponent's moves to time control by
accident.)  <ctime>  is  minutes  left  on  Crafty's  clock,
<otime> is minutes left on the opponent's clock.

48.   setboard  <FEN  input>   This command is used to set a
chess position up for analysis and is the preferred  way  to
do  this, rather than using the gnu EDIT interface.  It uses
a classic Forsythe-like notation to encode the position  and
also  has  provisions for castling status and enpassant cap-
ture status.














the standard piece codes p,n,b,r,q,k are used to denote  the
type  of  piece  on  a  square, upper/lower case are used to
indicate the color of  the  piece  (uppercase=white  pieces,
lowercase=black pieces).

the pieces are entered from the classic chess diagram's ori-
entation of a8  being  the  upper-left-hand  corner  of  the
board,  and  this  square  is entered first, followed by the
remainder of the 8th rank left to right.  To indicate  empty
squares,  use  a number between 1 and 8 to indicate how many
adjacent squares are empty.  use a / to terminate each  rank
after  all  of  the  pieces for that rank have been entered.
Note that you do not have to account for all 8 squares on  a
given rank, although many test suites do this for clarity.

the following input will setup the board position that given
below:

      k2r/ppp////Q/5PPP/7K/ B

this assumes that k represents a white king  and  -q  repre-
sents a black queen.

                      -k  *  * -r  *  *  *  *
                      -p -p -p  *  *  *  *  *
                       *  *  *  *  *  *  *  *
                       *  *  *  *  *  *  *  *
                       *  *  *  *  *  *  *  *
                       q  *  *  *  *  *  *  *
                       *  *  *  *  *  p  p  p
                       *  *  *  *  *  *  *  k
                                                                           *
the field after the final "/" should be either  b  or  w  to
indicate  which  side is "on move."  after this side-to-move
field any of the following characters can appear to indicate
the   following:   KQ:  white  can  castle  king-side/queen-
side/both;  kq: same for black;  a1-h8: indicates the square
occupied by a pawn that can be captured enpassant.

49.   score   This command simply gives the positional score
for the current position.  This score is  from  whites  per-
spective,  so a + score is good for white, a - score is good
for black.  Crafty also breaks the  score  down  into  major
categories  (from  Evaluate())  to indicate things like pawn
structure, piece evaluation, passed pawns, development,  and
so forth.  Note that some of Crafty's evaluation is asymmet-
ric, so that if you simply change sides with the white/black
command  and then enter "score" again, you may get a differ-
ent value.  This is *not* a bug.  :)

50.  sd <n>  This command lets you specify a specific search
depth  limit  that  Crafty  can  not  exceed.  It still pays
attention to the clock, however, so often you will  use  the













st  <n>  command  (below)  in  conjunction  with this if the
search is going to take an extended amount of time.  <n>  is
the  depth  (in  plies  or  1/2  moves) that the search must
reach.  Note that if Crafty is pondering,  it  still  honors
this  limit  and  will stop a ponder search after this depth
has been completed as well.  This is *not* the way  to  make
Crafty play weaker, although this will be covered in a later
section of this document.

51.  show <category>  This command forces Crafty to  display
additional information about certain actions it takes.  Cur-
rently the only <category> is "book" which will make  crafty
display information about all the book moves it found in the
database.  More is given about this information in the  BOOK
section later in this file.

52.   smpmt=n   This  command  is  used to set the number of
threads to use on a machine with more  than  one  processor.
For  optimal performance, "n" should be set to the number of
processors you have, although using fewer  will  reduce  the
load on your machine.  For this command to work, Crafty must
have been compiled with SMP defined.  When compiled with SMP
enabled,  mt=0 effectively disables the SMP code completely.

This command also has two that are closely related.   smpmin
and smpmax.  Both accept single numerical arguments.  smpmin
is used to control the minimum tree depth required at a node
for  it  to be eligible for parallel searching.  IE smpmin 2
says don't split unless at least two more plies are left  to
search  below  this  node.   smpmax sets the maximum for the
same idea, is smpmax 10 says don't split  if  more  than  10
plies are remaining below this node.

53.   sn <n>  This command is similar to the sd command, but
instead of setting a specific search depth, it sets a number
of  nodes to search.  Once the search has searched this num-
ber of nodes (+ maybe one more second of searching to  check
the time) the search will exit.

54.  st <n>  This command lets you specify a specific search
time limit for Crafty.  Again, this is not the preferred way
to  set  a time per move, because this limit is absolute and
Crafty will never go over this limit, even if it  sees  that
it  is  losing  or  getting mated.  Setting the time control
with the usual "time" or "level" command is  *much*  better.
<time>  is given in seconds, although it may also be entered
as mm:ss if preferred.

55.  swindle on|off  This command  gives  you  control  over
"swindle  mode."   When  on, and playing a game, Crafty will
try to win drawn endings (according to the tablebases) if it
has winning chances (like KR vs KB, for example).  This will
put up very stiff "resistance" to accepting the draw,  while













with  this  mode off, it may be very easy to draw a position
once the tablebases say "drawn."  This mode is automatically
turned  "off" during analysis or when annotating a game, and
is only used when actually playing a game against  an  oppo-
nent.  If there are no tablebases then this has no effect on
the game at all.

56.  tags  This command will simply display the current  PGN
tags (you can edit them with the various PGN commands).

57.   test  <filename>  [n] This command will run a suite of
positions (the file must be in "Crafty" format as  explained
below)  and  produce  a  summary  of  how many it got right,
wrong, etc.  It uses the time per  move  you  set  with  the
(typically)  st  <n> command.  The optional parameter [n] is
the "early exit" counter.  If Crafty finds,  and  holds  the
solution  move  for  n  iterations,  it  will  terminate the
search.  I use this to make a win at chess  run  take  <  15
minutes,  even  though  the  time  per  position is set to 1
minute, by setting n to 2.  After  two  correct  iterations,
Crafty  goes on to the next problem.  For absolutely correct
results, this is not advisable as it could obviously  change
its  mind later on, but for performance analysis, this saves
a lot of time.

The test suite contains the following  lines:   (this  is  a
sample from my test suite for Win At Chess.)

title wac299
setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w
solution Nca4

title wac300
setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w
solution g6

end

The  title  command  simply displays this message in the log
file so you can look at the  output  and  figure  out  which
position it goes with.  This is optional, but useful.

The  setboard command sets the position as explained before.

The solution command gives the set of solution moves (one or
more  moves  that  are  separated by blanks) and/or a set of
"anti-solution" moves (moves that  must  not  be  played  to
count  the  position as correct.)  "anti-solution" moves are
simply followed by a "?" character, for example:

solution Bxa7?

The solution command supplies a set of key moves,  and  then













starts  the search.  If, after the search terminates, one of
the key solution moves was chosen (or none of the anti-solu-
tion  moves were chosen) the position is counted as correct.

The final line should be "end" although end-of-file  or  EOF
will also be detected in this case.

57.    time   CPU|elapsed|<values>   This  command  controls
whether the program uses CPU time  or  wall-clock  time  for
timing.   for tournament play, it is safer to use wall-clock
timing, for testing it may be more  consistent  to  use  CPU
timing  if the machine is used for other things concurrently
with the tests being run.

time is also used to set the basic search  timing  controls.
the general form of the command is as follows:

      time nmoves/ntime/[nmoves/ntime]/[increment]

nmoves/ntime  represents  a  traditional  first time control
when nmoves is an integer representing the number  of  moves
and  ntime  is  the total time allowed for these moves.  the
[optional] nmoves/ntime is a traditional secondary time con-
trol.   increment  is a feature related to ICS play and emu-
lates the Fischer clock where <increment> is  added  to  the
time left after each move is made.

as  an  alternative,  nmoves  can be "sd" which represents a
sudden death time control  of  the  remainder  of  the  game
played in ntime.  the optional secondary time control can be
a sudden-death time control, as in the following example:

        time 60/30/sd/30

this sets 60 moves in 30 minutes, then game in 30 additional
minutes.  an increment can be added if desired.

One final example is the following:

        time sd/15

which is a simple game/15 setting.  This command can also be
used to perform the same function as  the  "level"  command.
For  example, to set up a classic ICS 2 12 game, the follow-
ing would would work:

        time sd/2/12

59.  trace <n>  This command is used to make crafty  display
the  tree  as it searches a position.  Due to the incredible
speed at which this program can  search,  however,  this  is
less than useful since it can swamp any known display driver
and make things scroll impossibly fast.













Also note that this command  usually  is  disabled,  because
Crafty  is  generally  compiled  with the -DFAST flag, which
removes the trace output code from the search to make things
slightly  faster.   You  will have to recompile, without the
-DFAST, if you want to use this.  It's utility  is  limited,
except for debugging, anyway.

60.  usage <n> is simply a way to modify Crafty's time usage
to fit your tastes.  You can "suggest" a time limit with any
of the options discussed previously, but if you use anything
other than the "st" command, Crafty will do its best to  use
time  as  you  suggest, but it also anticipates that it will
save some time by pondering, etc.,  and  will  therefore  be
more aggressive at trying to use time.  if <n> is a positive
integer, it is taken as a percentage and crafty will compute
the  time  limit  it  thinks  is appropriate for the current
clock settings, then increase this limit by this  percentage
(50  would  make it take 1.5 times longer than normal.)  -50
would make it take 1/2 the time it would normally take.

Crafty adjusts the usage  internally  based  on  time  left,
opponent's  time left, how quickly or slowly the opponent is
moving, etc.  Further modifying things with this is  danger-
ous, but possible.

61.   whisper/kibitz <n>  These commands are used to control
what Crafty will whisper or kibitz on a chess  server.   The
options  are  (1)  only  whispers or kibitzes mate announce-
ments; (2) adds time, score, depth to the  previous  option,
but  no  PV  or moves.  (3) adds the PV.  (4) adds book move
information to the output.  The remaining two options gener-
ate  a  lot  of output and should be used with caution.  (5)
displays the PV after each iteration completes.  I use  this
when using my custom interface to let Crafty observe/comment
on games in progress on ICC.  Noise can be used  to  prevent
shallow  searches from generating output and keeping "noise"
down on the games being watched.  (6) basically  will  whis-
per/kibitz  nearly  everything you see on the console from a
search, each PV when it changes, fail highs and  fail  lows,
etc.   A  significant  amount of output that should be care-
fully weighed before turning it "loose."

62.  xboard  This command turns on Xboard/WinBoard  compati-
bility mode, and makes Crafty behave somewhat like GnuChess.
This is designed to be used *only* when Crafty is  interfac-
ing  with  Xboard/WinBoard.  Crafty will not work with these
two GUIs without this option, and  really  won't  work  very
well with this option if it is not connected to one of them.

63.  There are other commands that are not documented.  They
are  part  of  the  xboard protocol and really should not be
used by the normal user.  You can find all the  commands  in
option.c should you be interested.













                Opening Book Setup and Usage
                ----------------------------

Crafty   uses   two   pre-compiled   opening  books,  called
"book.bin" and "books.bin".

The file book.bin is usually build from a  large  text  file
containing  PGN  games,  often  taken from collections of GM
games.  Building book.bin is a simple exercise and  requires
nothing  other than the raw input file you are going to use.
Generally this will be either medium.zip or the set of  four
files  large[1-4].zip,  all  of  which are stored on the ftp
machine ftp.cis.uab.edu/pub/hyatt/.

To create the file book.bin, you need a PGN game  collection
that is a *real* PGN-compliant file.  Supposing this file is
called "large.pgn" you would use the following command:

book create large.pgn <m> [n] [wpct]

The only thing you have to supply is <m>, a number  indicat-
ing  how  many  moves from each game are to be stored in the
book.bin database.  I typically use  60,  which  stores  the
first  60  moves  from  each  game.   Increasing this number
slightly increases the probability that Crafty will stay  in
book  longer,  but it also increases the probability that it
will follow a game too far, so that it begins to reach posi-
tions  where  the move actually played might not be the best
move, letting it fall into a bad hole.  Increasing this also
increases the size of the database as well.

You  can  decrease the size of the book, and also reduce the
number of ugly moves by  specifying  <n>,  which  says  that
unless  a  move  is  played in at least N games, the move is
discarded.  This will substantially decrease the size of the
book.bin  file,  and  also  eliminate single game moves that
often have significant errors or blunders.

You can increase the quality of  book  lines  by  specifying
<wpct> which is the "winning percentage".  This is specified
as a percentage of lost games, and is used to discard  moves
that  led  to mostly losses.  A safe value is 50, which says
that if a particular opening move didn't win at least 50% as
many  games  as it lost, the move is culled.  A value of 100
would mean that moves  are  culled  if  they  produced  more
losses than wins, and is really a strict criterion.

After creating book.bin, you need to create books.bin.  This
is a small version of book.bin, which is  intended  to  give
you  more  control over the moves/openings Crafty will play.
This is usually built from the file  start.pgn  on  the  ftp
machine,  but  you  can  modify this file to suit your taste
easily.  To build books.bin, you use the following command:













books create start.pgn 60

Again, 60 is what I use, but none of my start.pgn  lines  go
anywhere  near that many moves.  The main point here is that
in start.pgn, you can append a "!" to any move you want, and
when  it  is  Crafty's  turn to move for that color, it will
play from the set of moves with "!" if there are any, ignor-
ing the rest of the book moves.  If you only want it to play
1. e4 as white, you would just enter the short game:

[Crafty only plays 1. e4] 1. e4!

and you are finished!.  You can enter as many as  you  want.
If  on  the other hand there is a move you don't want Crafty
to play, then follow that move with a "?" and it will  never
play  it.  Moves in books.bin that are not flagged with ! or
? don't have any influence on Crafty's choice at all.

Here's how the files are used.  When searching  a  position,
Crafty  first enumerates the set of moves it can find in the
opening database.  It then does the same for  the  books.bin
database,  and performs a "merge" operation to combine the ?
and ! flags...  The purpose of the books.bin file is to give
you  a  small  database that you can easily modify, rebuild,
and repeat this process over and over.   Since  it  takes  a
fraction  of a second to completely rebuild this file, it is
very easy to modify this to control what Crafty  will  play,
without having to rebuild the large database.

One  important characteristic of the PGN input is the Result
tag must be specified in most of the lines,  because  Crafty
counts  wins,  losses  and draws for each book move and uses
these counts with some of the book selection  options  given
below.

How the flags are used.

The  ! and ? flags should only appear in the small books.bin
file, although there is no reason why they can not appear in
the  large  file  as  well.  For this discussion, it doesn't
matter since Crafty takes the  moves  from  both  files  and
"merges" the flags/etc into one entry for each move.

Quite simply, if any book legal book move has a ! flag, then
Crafty will only play moves from the set of moves which  all
have  the ! flag.  If a move has a ? flag, then that move is
immediately removed from the set of possible book moves.  If
the only legal book move has a ? flag, it will not be played
as a book move and Crafty will simply pretend that it  found
no book moves and will execute a normal tree search.  Pretty
simple.

How to control the frequency of opening move selection.













A new feature in version 15.15  and  beyond  allows  you  to
append a PGN comment to any move in a text file used to cre-
ate books.bin, of the form {play nn%}.  This will force  the
move  it  follows  to be played that percentage of the time,
regardless of the normal book-ordering values based on  fre-
quency and so forth.

Note  that  {play  0%}  will  not  prevent a move from being
played at all, as this will look just like a  move  with  no
percent specified.  To avoid playing a move, use the ? flag.

How does Crafty choose book moves?

Crafty's book  selection  algorithm  depends  on  two  user-
defined values that can be set at any time during a game:

book random <n>

book width <w>

The  selection  algorithm  first finds the set of legal book
moves as above.  This set will either be  all  !  moves,  or
will  have  no ! moves in it.  This set is then sorted based
on the setting of book random.  Here's the options:

book random 0.  This is a special case for  book  selection.
Crafty simply takes the set of book moves, and searches only
these moves using a normal alpha/beta  search,  but  with  a
shorter  than usual time limit.  It then plays the move that
produces the best search value.  This has one serious disad-
vantage  in  that there is no randomness to this at all.  It
will always play the same move in the same position,  unless
the  evaluation is modified, or the time per move is differ-
ent enough to let the search find a different move from  the
book move set.

book  random  1.   This  enables  a random form of book move
selection, but you have a lot of control over how moves  are
randomly  chosen.  The moves are ordered, based on 4 parame-
ters:  frequency of play, win/lose ratio, static  evaluation
and  learned  results.  Normally these are factored into the
value used to sort the moves, based on default settings that
you  can  modify  by  using  the  command  "bookw  option N"
"option" should be "freq", "ratio", "eval" and  "learn".   N
should be a number between 0 and 1.

Crafty finds the min and max values for each of the 4 param-
eters, and then maps this into the  range  0-1000  for  each
parameter.   Each parameter is multiplied by the correspond-
ing "weight" you have assigned, and this is used as a  value
to  sort  the  moves  from low to high.  Note that the first
sort value is always the "play percent" to move them to  the
top  of  the  list.   For  moves  with  equal "play percent"













values, the normal sort-value is used  as  the  second-level
sort  variable  (if  no moves have a play-percent, then this
second-level variable is the only one used, of course.)

Once Crafty has sorted the moves as  given  above,  it  next
excludes  any  book moves which have 0 wins.  This culls the
odd lines where a player chose a bad line and lost  quickly.
With  zero  wins,  it  will never be chosen, although Crafty
will happily follow it from the other side.  :)  This is not
anywhere  near  perfect,  however,  because an opening could
have 1 win and 19 losses and that still would  stay  in  the
list.

If  a  move  has a learned value of > 100, this move is ele-
vated in priority to that of a ! move, since it  appears  to
win material instantly.  If a value is < -100, it is given a
? since it appears to be a lemon.

After this, the setting for "book width <w>" is used to keep
the first <w> moves in the list, after the above culling has
been completed.  The smaller you make <w> the  less  random-
ness  you get, but the chance of Crafty popping out a really
bizarre book move gets smaller as well.

After sorting, the final step is to fold  in  any  mandatory
"play percent" values.  What this step does is that it finds
all the moves in the  "playable  move  set"  just  computed,
which  have no percent-to-play value set.  It sums the sort-
values for these moves, then adjusts the sort-values for the
other moves so that their percentages will be honored.

Once this has been done, crafty simply uses the "sort value"
for each move to compute a total for  all  moves.   It  then
generates  a  random  number  between  1 and this limit, and
chooses the move that this probability distribution matches.
This will certainly evolve over time as new ideas are devel-
oped.

For my play on ICC, I use book random 1, and  book  width  5
normally,  although  for  titled  players this is reduced to
book width 3.  For computers, I reduce this further to 2, to
try  to  play  reasonable  openings and cull the gambits and
things that don't work out.

How does book learning work and  how  can  I  share  learned
results?

1.  *all* of crafty's "learned knowledge" is in the book.bin
file.  It keeps the learned value and learned count right in
the  book  file  for  speed.   You can't modify it, although
"show book" will make crafty  display  all  the  book  stuff
before it makes a move.














2.   the  book.lrn file has two purposes:  (a) to serve as a
log for your prying eyes, so you can see what it's  learned,
against  whom, and what the score was that got its attention
in the first place.  The values on  the  end  of  each  book
line, inside the {} characters are as follows:
    {value,  depth, rating_difference} value is the value of
the "key" search that comes from the first 10 moves  out  of
book.  it's in centipawns, and + is good - is bad.  depth is
the depth the search reached at  this  "key"  position,  the
deeper  the  search,  the more the value is "trusted."  rat-
ing_difference is crafty's rating - opponent's rating a neg-
ative  value means pay more attention to the score since the
opponent is better than crafty, a positive  value  means  to
take  the  score  with a grain of salt, because the opponent
was weaker than Crafty.

You can delete this file at any time, and it has  no  effect
on  learning.   As  I mentioned, the learning takes place in
book.bin... this is mainly for you to peek  at  if  you  are
interested.   However,  this  is the "portable learning data
file" also, and can be given to others to import into  their
crafty,  where  it  will  affect  the opening book just like
their crafty had  played  the  openings  and  got  the  same
scores.  There are two ways to use such "lrn" files:

1.   "import <filename>" will read <filename> and import the
knowledge therein into your book.bin.  Since I use the  same
learning  code  as is used when playing games, this informa-
tion also gets appended to *your* book.lrn file as well,  so
that your book.lrn always reflects *everything* your program
has learned, so long as you don't ever remove this file.  It
would  be a mistake to use this command on your own book.lrn
file, because the things  would  get  counted  twice,  which
might or might not be a good thing.

2.   "import  <filename>  clear"  will  read  <filename) and
import the  knowledge  as  above,  but  first  clears  *all*
learned  results from book.bin.  you will want to do this if
you import my book.lrn, *and*, you have  contributed  to  my
book.lrn data by sending me yours.  I'll take care of elimi-
nating duplicates if you screw up in what you send  me,  but
once  you  send me something, you run the risk of getting it
"back again" later.  This is going to  be  a  problem  until
everyone  gets  used  to  sharing  something  that is rather
"vapid" like this "learned info" is...

Other than that, we are now "open for business"...  when the
urge strikes you, email me your .lrn file, I'll keep a large
master here and update it on occasion.   Probably  the  best
thing  to  do  is  to  send  me  your  .lrn  and at the same
*instant* delete yours.  This will capture anything  learned
*after*  you  send  me the file, but you'll get it all right
back with the next version of book.lrn  that  I  distribute.













after getting this new book.lrn back, here's what you should
do:

1.  rename your old book.lrn to something else.   I'll  call
it "book.lrn.old" here.

2.   copy my blearn.dat to your machine, but *do not* put it
in the directory  with  your  book.bin  and  books.bin  file
because  it  will get confusing very quickly if you do.  put
it somewhere else,  because  you  are  going  to  remove  it
quickly anyway.  I'll call it new.lrn for this example.

3.  import new.lrn clear
    import book.lrn.old

and you are ready to rumble again.  The first command clears
the learned values, sucks in my new learn file  and  updates
everything.   the second command re-learns everything you've
learned since you sent me the  last  book.lrn  file.   After
doing  this your book.lrn will have my .lrn stuff, plus your
old.lrn stuff, just waiting to be sent to me again...

If this is confusing, I can probably add an  automatic  com-
mand to do all of this by renaming book.lrn, etc.  Hopefully
this is not too error-prone for the time being anyway...

What is this new Position Learning I've heard about?

Crafty now has a "permanent" hash table that  is  kept  from
game  to  game.   A position gets into this "hash file" when
Crafty executes a search and the search  value  is  signifi-
cantly lower than the last search value.

When this happens, Crafty stores the current information for
this position in the permanent hash file, which can hold  up
to  65536  positions.   Once  it fills up, the positions are
replaced on a FIFO basic always keeping the most recent  64K
entries.

Each  time crafty starts a search, the positions/scores from
this file are stuffed into the normal  transposition  table,
and  used during the search just like any other table entry.
Here's how it helps:  In a game that was played, the follow-
ing moves and scores were found by crafty (playing white):

1.   Ng5  (+.277)   h6  2.  Nh7 (+.321)  Kg8 3.  Qh5 (+.133)
Qg7 4.  Ng5 (-2.122) hxg5

So, the knight got trapped at h7, and at move 4 crafty  dis-
covered  that  this  is gross and "learns" this result/posi-
tion.

We play the exact same game again:  except that  two  things













can  happen here.  It might be that Ng7 is the *only* square
the knight can move to here, which means this whole thing is
forced.  the first search would find:

1.  Ng5 (-2.122) if the search can reach 8 plies deep, which
happens even in 5 second games.  It's learned  that  Ng5  is
bad.   It  stores *this* position in the permanent hash file
also, and the next time you try this same trap, it will dis-
cover  4-5 moves earlier that if the knight gets to g5 it is
in trouble.  Each game will diverge from the first game  3-4
moves earlier.  Simple and effective.

2.   Ng5 might not be forced, and if not, it knows Ng5 loses
a piece for a pawn, so it will promptly play something else,
which is exactly what is desired.

This  is  implemented  with two (count 'em, two) files.  One
file "position.bin" is a binary file that contains the  hash
table  entries, and it right at one megabyte in size, *max*.
(16 bytes per hash entry X 65536 entries = exactly one  meg,
but  I  have 8 extra bytes for the FIFO queue implementation
and to see how many entries are currently in the file if  it
is not full.

The  second file is "position.lrn" and is, you guessed it, a
file that can be shared with others, just like book.lrn.  It
contains all information needed to reconstruct the position,
the score, the depth, etc.  and also included the  pgn  tags
for who was what color and when the game was played...

This data can be imported with the new "import" command (the
old book learn <filename> is no longer  around)  which  will
import  either  book.lrn type data or position.lrn type data
and can tell them apart without your having to do  anything.
The  <clear>  option  is still there, should you want to use
it, and simply removes  the  position.lrn  and  position.bin
files before starting the import process for position learn-
ing.

This can be turned off, if you like,  by  checking  out  the
"learn"  command,  which  gives  you the ability to turn off
book learning (as it presently  works),  position  learning,
and  the next book learning stage which will add to the book
in addition to learning which book lines are good and bad.

What is this new "result" learning?

Result learning works just like normal book learning, except
that  if  Crafty is checkmated or resigns, it will step back
through the book line to find the last point  where  it  had
more than one move to choose from.  It will flag the move it
chose as "never play again".














This handles the case where the  first  ten  non-book  moves
produce  reasonable  scores,  but  the  position is one that
Crafty simply can't handle very well.  If it  loses  such  a
game,  it  will  still  vary  the  next time this opening is
played, as otherwise it would possibly repeat the same open-
ing, and would certainly repeat the remainder of the game.

All  three learning modes are turned on by default, although
any of them can be disabled  with  the  appropriate  command
option to "learn".