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".
|