Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | pmbaty | 1 | <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
2 | <html> <head> |
||
3 | <title> Crafty Command Documentation (version 18) |
||
4 | </title> |
||
5 | </head> |
||
6 | |||
7 | <body> |
||
8 | <h1> Crafty Command Documentation |
||
9 | </h1> |
||
10 | |||
11 | <!--- Note that I have put "Crafty" into <cite></cite>. This is |
||
12 | logical, as a computer program with source code provided is not less |
||
13 | than a book. On the other hand, maybe the document looks a bit garish |
||
14 | as a result? A matter of taste. ---JM. ---> |
||
15 | |||
16 | <cite>Crafty</cite> is nothing more than a long-time hobby of mine, |
||
17 | dating back to <cite>Blitz</cite> and later <cite>Cray Blitz</cite>. |
||
18 | People ask me how I keep doing this, and that is the one question that |
||
19 | generally leaves me at a loss for words. |
||
20 | |||
21 | <p>Perhaps the most common question I'm asked is "is this version of |
||
22 | <cite>Crafty</cite> some dumbed-down version of what you play on ICC |
||
23 | or what you use at a computer chess event?" The answer is a |
||
24 | resounding <strong>*NO*</strong>. The current version is |
||
25 | <em>exactly</em> what is running on ICC under this version number. |
||
26 | Note that a new version can, on occasion, introduce weaknesses or |
||
27 | outright bugs that were not present in previous "gold" versions. As a |
||
28 | result, you should be careful to back up your "favorite" before trying |
||
29 | the latest and greatest. If you aren't satisfied with the new |
||
30 | version, you can then go back to what you believe is a better version. |
||
31 | |||
32 | <p>If you are looking for the strongest playing computer chess |
||
33 | program available, you should likely look to <cite>Fritz</cite>, |
||
34 | <cite>Rebel</cite>, <cite>Tiger</cite>, and the other commercial |
||
35 | entries. There you will find strong opponents with polished |
||
36 | interfaces that have been tested in a systematic and careful way. If |
||
37 | you are looking for a program that plays good chess, has a reasonable |
||
38 | set of features for you to use, is available in source form, and one |
||
39 | where the author welcomes feedback, code or suggestions, then you are |
||
40 | at the right place. I welcome comments and suggestions, and also |
||
41 | feedback from ideas you try yourself that seem to work. |
||
42 | |||
43 | <p><cite>Crafty</cite> is a state-of-the-art computer chess program, |
||
44 | and uses all of the search algorithms you have probably read about, |
||
45 | negascout search, killer/history move ordering, SEE (Static Exchange |
||
46 | Evaluation) quiescence move ordering and pruning, hash |
||
47 | (transposition/refutation) tables as well as evaluation caches, |
||
48 | selective extensions, recursive null-move search, and a host of other |
||
49 | features that have been used and are still being used in most computer |
||
50 | chess programs. If it's not in <cite>Crafty</cite>, either it is on |
||
51 | the "to do" list, or it has been tried, found wanting, and discarded. |
||
52 | |||
53 | <p>Chess knowledge is growing, and suggestions (or even better, real |
||
54 | code) are welcome. This is the best place to contribute your ideas, |
||
55 | because knowledge can be used to supplant search and make it play |
||
56 | better. The evaluation is probably the easiest place to start |
||
57 | studying <cite>Crafty</cite> because of the comments and simplicity of |
||
58 | using bitmaps, *once* you get "into" them. |
||
59 | |||
60 | <p>My purpose for doing this is an exercise in computer chess |
||
61 | efficiency. I can't begin to count the number of people I know that |
||
62 | started from scratch to write a chess program. Even larger is the |
||
63 | group that started from scratch, and gave up before finishing, because |
||
64 | of the basic size of the project. |
||
65 | |||
66 | <p><cite>Crafty</cite> offers everyone a very clean starting point, |
||
67 | if you are fascinated by the bitmap chess board implementation (as I |
||
68 | am). The search and quiescence code is reasonably straightforward, as |
||
69 | is the evaluation. |
||
70 | |||
71 | <p>It offers a great starting point, so that if you are interested |
||
72 | in trying a new search extension, you can be testing tomorrow, rather |
||
73 | than next year, because you start with a fully functional chess engine |
||
74 | that is not a "toy" application, but is a functional and "dangerous" |
||
75 | chess player. It offers a rapid start, although you can certainly |
||
76 | replace it piece by piece until it is "yours" if you want. It also |
||
77 | offers a fairly complete set of commands and an interface for a GUI as |
||
78 | well as support for chess server play, so that testing and debugging |
||
79 | your new ideas is greatly simplified. |
||
80 | |||
81 | <p>If you'd like more information, please check out the |
||
82 | <code>read.me</code> document and the <code>crafty.FAQ</code> that are |
||
83 | distributed with <cite>Crafty</cite>. These contain recent news and |
||
84 | specific instructions for commonly asked questions, like "where can I |
||
85 | obtain tablebase files and how do I use them?" |
||
86 | |||
87 | |||
88 | |||
89 | <hr> |
||
90 | <h2>How to play a game.</h2> |
||
91 | |||
92 | When you execute <strong>crafty</strong>, you will immediately be |
||
93 | greeted by the prompt string <strong>white(1): </strong> and |
||
94 | <cite>Crafty</cite> will wait for commands. This prompt means it is |
||
95 | White on move, and we are at move #1 for White. You can first use any |
||
96 | of the commands from the alphabetic command listing below to tailor |
||
97 | the game to your liking (time control, hash table size, book |
||
98 | randomness, etc.) and then you have two choices. If you want to play |
||
99 | White, just enter your move, and <cite>Crafty</cite> will take it from |
||
100 | there and make a move in response. You will then be prompted by |
||
101 | <strong>white(2):</strong> and it is your move again. If you would |
||
102 | prefer to play Black, just enter either <strong>move</strong> or |
||
103 | <strong>go</strong> at the prompt and <cite>Crafty</cite> will move |
||
104 | for that side rather than accepting a move from you. After it makes |
||
105 | its move for White, you will then see the prompt |
||
106 | <strong>black(1):</strong> indicating it is now time for Black's first |
||
107 | move. You can enter a move, or you can once again enter |
||
108 | <strong>move</strong> or <strong>go</strong> and <cite>Crafty</cite> |
||
109 | will again move for the current side, change sides, and prompt you for |
||
110 | what to do next. |
||
111 | |||
112 | <p>If you find yourself continually using a set of commands to |
||
113 | configure <cite>Crafty</cite> to play as you want, you can put these |
||
114 | commands in a startup file called <code>.craftyrc</code> |
||
115 | (<cite>Unix</cite>) or <code>crafty.rc</code> |
||
116 | (<cite>DOS</cite>/<cite>Windows</cite>). The format for this file is |
||
117 | just like you would type the commands at the keyboard, with the |
||
118 | requirement that the last line of the file must be |
||
119 | <strong>exit</strong> on a line by itself. Using this, each time you |
||
120 | start <cite>Crafty</cite>, it will first execute the commands from |
||
121 | this file before it prompts you for input. |
||
122 | |||
123 | <p>While <cite>Crafty</cite> is running, you can control what it |
||
124 | displays, but here's a couple of samples to explain what it is saying |
||
125 | and why: |
||
126 | |||
127 | <pre><tt><strong> |
||
128 | depth time score variation (1) |
||
129 | book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5} |
||
130 | book 0.0s 70% d4 |
||
131 | |||
132 | White(3): d4 |
||
133 | time used: 0.01 |
||
134 | </strong></tt></pre> |
||
135 | |||
136 | This is the normal output for those cases where <cite>Crafty</cite> is |
||
137 | in book. The book moves line gives the set of book moves that made |
||
138 | the first selection cut (see the book selection explanation given |
||
139 | later), followed by the move actually played, in this case d4. |
||
140 | |||
141 | <p>If <cite>Crafty</cite> is out of book, then the output looks |
||
142 | somewhat different as given below: |
||
143 | |||
144 | <pre><tt><strong> |
||
145 | depth time score variation (1) |
||
146 | 4-> 0.81 2.09 6. dxe4 Bxe4 7. Rad8 Qf2 8. Qb5 |
||
147 | 5 1.37 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5 |
||
148 | 5-> 1.88 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5 |
||
149 | 6 7.38 -- 6. dxe4 |
||
150 | 6 11.90 1.97 6. dxe4 Bxe4 7. Rab8 Qf2 8. Qc7 Nc5 9. Qe5 |
||
151 | 6 12.92 ++ 6. Ne5 |
||
152 | 6 13.71 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4 |
||
153 | 6-> 15.59 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4 |
||
154 | time: 15.60 cpu:99% mat:1 n:246565 nps:15927 |
||
155 | ext-> checks:4706 recaps:1336 pawns:0 1rep:301 |
||
156 | nodes full:45951 quiescence:200614 evals:104657 |
||
157 | endgame tablebase-> probes done: 0 successful: 0 |
||
158 | </strong></tt></pre> |
||
159 | |||
160 | Let's take this stuff one line at a time.<ul> |
||
161 | |||
162 | <li> Lines that have something like <samp>4-></samp> in the depth |
||
163 | column are printed when that iteration (depth) is completely finished. |
||
164 | |||
165 | <li> The time and score columns should be obvious as to their |
||
166 | meaning as is the PV, the sequence of moves that led to this score. |
||
167 | One note about the "score" column. As of version 18, |
||
168 | <cite>Crafty</cite> displays the score with + values good for White, |
||
169 | - values good for Black, no matter which side it is playing in the |
||
170 | game. All output now follows this convention, from playing, to |
||
171 | analysis mode, to annotating your games, to whispering/kibitzing on |
||
172 | the chess servers, and so forth. This is unlike other engines, but |
||
173 | once you get used to it, it is much less confusing when you remember |
||
174 | that negative scores are good for Black and bad for White, and |
||
175 | vice-versa. |
||
176 | |||
177 | <li> The line that has <samp>--</samp> in the score column means that |
||
178 | when we started depth 6, dxe4 turned out to be worse than we thought |
||
179 | (notice score dropped from 2.411 last search to 1.972 for this move |
||
180 | this search.) To resolve this, <cite>Crafty</cite> lowers the lower |
||
181 | search bound (alpha) and re-searches the move to find the score. |
||
182 | |||
183 | <li> The line with <samp>++</samp> means that this move |
||
184 | (<samp>Ne5</samp>) is better than the best move so far, so |
||
185 | <cite>Crafty</cite> raises the upper search bound (beta) and |
||
186 | re-searches this move to find the new score. |
||
187 | |||
188 | <li> The first line of statistics gives the total time taken for |
||
189 | this search, the cpu percentage which should stay at 98-100% |
||
190 | unless your machine is heavily loaded or unless <cite>Crafty</cite> |
||
191 | is in an endgame that is having lots of contact with endgame |
||
192 | databases. If this drops below 98%, it means that |
||
193 | <cite>Crafty</cite> is not getting full CPU usage and will be |
||
194 | playing weaker than normal. The mat:1 is simply the true material |
||
195 | score, since <cite>Crafty</cite>'s positional scores are often |
||
196 | larger than a pawn. |
||
197 | |||
198 | </ul> |
||
199 | |||
200 | |||
201 | |||
202 | |||
203 | <hr> |
||
204 | <h2>Alphabetic Listing of Commands</h2> |
||
205 | |||
206 | <dl> |
||
207 | |||
208 | <!-- This is formatted as a `definition list', quite properly. |
||
209 | However, there is a problem about what tags to wrap around the |
||
210 | `definiendum'. The general style, `dfn', is not quite suitable for |
||
211 | computer commands. The logical choice, `code', does not show up well |
||
212 | in Lynx, nor in the default settings of Mozilla. So I have cheated |
||
213 | slightly, and used `strong'. Further, it all looks better with the |
||
214 | crude expedient of putting an empty paragraph at the end of each |
||
215 | definition. ---JM. ---> |
||
216 | |||
217 | |||
218 | <a name="alarm"></a> |
||
219 | <dt> <strong>alarm on</strong>|<strong>off</strong> |
||
220 | |||
221 | <dd> This command is used to control <cite>Crafty</cite>'s "beep" |
||
222 | after it makes a move. Turning this off will make <cite>Crafty</cite> |
||
223 | "quiet" when it plays, but also makes it easy to miss a move if you |
||
224 | are using <cite>Crafty</cite> to play in a tournament. This is |
||
225 | primarily designed to make <cite>Crafty</cite> tolerable during late |
||
226 | night matches. |
||
227 | |||
228 | |||
229 | <p> |
||
230 | <a name="analyze"></a> |
||
231 | <dt> <strong>analyze</strong> |
||
232 | |||
233 | <dd> This command puts <cite>Crafty</cite> into analyze mode. In this |
||
234 | mode, <cite>Crafty</cite> starts computing for whichever side is on |
||
235 | move, and it continues computing and showing its analysis until a move |
||
236 | is entered. This move is made, <cite>Crafty</cite> changes sides, and |
||
237 | starts thinking and printing analysis all over, but for the other side |
||
238 | now. |
||
239 | |||
240 | <p>This command is useful to play through a game, because you get |
||
241 | instant feedback when you try a move. If you want to try a different |
||
242 | move from the one you just entered, use the <strong>back</strong> |
||
243 | command to back up one move, or use <strong>back <n></strong> to |
||
244 | back up <n> moves. Note that one move is a single move for the |
||
245 | last player, not a move for both sides. To unmake the most recent 2 |
||
246 | moves (one for Black, one for White) use <strong>back 2</strong>.<p> |
||
247 | |||
248 | |||
249 | |||
250 | <a name="annotate"></a> |
||
251 | <dt> <strong>annotate</strong> | <strong>annotateh</strong> |
||
252 | <var><filename> <colors</var> | <var>name> <moves> |
||
253 | <margin> <time></var> |
||
254 | |||
255 | <dd> This command is used to annotate (make comments in) a game that |
||
256 | has already been played.<p><dl> |
||
257 | |||
258 | <dt> <strong>annotate</strong> |
||
259 | <dd> produces a file with the .can extension added to the original |
||
260 | name. This file will contain pure ascii information from the |
||
261 | annotation pass. |
||
262 | |||
263 | <dt> <strong>annotateh</strong> |
||
264 | <dd> produces an HTML file instead (with the .html extension). This |
||
265 | includes the normal output, plus a nice bitmapped graphical board |
||
266 | display for every position where <cite>Crafty</cite> had 'something to say'. |
||
267 | |||
268 | <dt> <var><filename></var> |
||
269 | <dd> is the name of the file that has the game moves stored in it. |
||
270 | This should be a PGN-compatible file, although <cite>Crafty</cite> can |
||
271 | read nearly any file with chess moves and convert it to pgn using the |
||
272 | <a href="#read"><strong>read</strong></a> and <a |
||
273 | href="#savegame"><strong>savegame</strong></a> commands to perform the |
||
274 | conversion. |
||
275 | |||
276 | <dt> <var><colors</var> | <var>name></var> |
||
277 | <dd> indicates which side <cite>Crafty</cite> will annotate. The |
||
278 | valid choices are <strong>w</strong>, <strong>b</strong>, and |
||
279 | <strong>wb</strong>/<strong>bw</strong> for White only, Black only, |
||
280 | and both, respectively. <cite>Crafty</cite> will search and produce |
||
281 | results for the indicated color only, making moves for the other side |
||
282 | silently as they are read in. Alternatively, you can specify the |
||
283 | player's name (useful if you want to annotate several of your own |
||
284 | games in one large pgn file, for example, and you alternated colors so |
||
285 | that you can't pick the right one easily). <cite>Crafty</cite> will |
||
286 | then figure out which side to annotate for in each game. Note that |
||
287 | the name is case-sensitive, but that you only have to enter a string |
||
288 | that is unique in the name field. IE if one name is "Anatoly Karpov" |
||
289 | and the other is "unknown" then specifying Karpov as the name would be |
||
290 | sufficient. If the same 'string' appears in both names, |
||
291 | <cite>Crafty</cite> will complain. |
||
292 | |||
293 | <dt><var><moves></var> |
||
294 | <dd> indicates the moves that should be annotated. If this is a |
||
295 | single integer, annotation starts at this move number (for the color |
||
296 | given above) and proceeds for the rest of the game. If a range is |
||
297 | given, as (20-33), then only moves 20-33 inclusive are annotated. To |
||
298 | annotate the complete game, you can use 1-999. |
||
299 | |||
300 | <dt> <var><margin></var> |
||
301 | <dd> gives a score "window" that controls whether |
||
302 | <cite>Crafty</cite> will produce comments (see below). The larger |
||
303 | this number this number, the fewer annotations <cite>Crafty</cite> |
||
304 | will produce. A negative number will result in an annotation for |
||
305 | every move selected. |
||
306 | |||
307 | <dt> <var><time></var> |
||
308 | <dd> indicates the time limit for each search. Since each move |
||
309 | selected requires two searches, you can take the number of moves, |
||
310 | double this number and multiply by <time> to determine how long |
||
311 | the annotation process will take. This time is in seconds. |
||
312 | |||
313 | </dl> |
||
314 | |||
315 | |||
316 | <p>How it works. Suppose you use the command <strong>annotate game1 |
||
317 | w 1-999 1.000 30</strong>. This asks <cite>Crafty</cite> to read the |
||
318 | file "game1", and annotate the white moves for the entire game. The |
||
319 | margin is 1 pawn and the search time limit is 30 seconds. The output |
||
320 | for the annotate command is found in <filename>.can, in this |
||
321 | case this is game1.can. |
||
322 | |||
323 | <p><cite>Crafty</cite> first searches the move actually played in |
||
324 | the game to determine the score for it. <cite>Crafty</cite> then |
||
325 | searches the same position, but tries all legal moves. If the score |
||
326 | for the best move found in this search is greater than the score for |
||
327 | the move actually played plus the margin, then a comment is added to |
||
328 | the output file. This output file is quite short, with all the game |
||
329 | moves (plus any PGN tags in the original, for identification purposes) |
||
330 | plus the brief comments. |
||
331 | |||
332 | <p>An annotation looks like this: <strong>{real_value |
||
333 | (depth:best_value PV moves)}</strong> |
||
334 | |||
335 | <ul> |
||
336 | |||
337 | <li> <strong>real_value</strong> is the score for the move actually |
||
338 | played. |
||
339 | |||
340 | <li> <strong>depth</strong> is the depth <cite>Crafty</cite> |
||
341 | searched to produce the best_value and PV for what it thinks is the |
||
342 | best sequence of moves for both sides. |
||
343 | |||
344 | </ul> |
||
345 | |||
346 | <p>If you set <var><margin></var> to 1.000, you are asking |
||
347 | <cite>Crafty</cite> to only annotate moves that either lost a pawn or |
||
348 | more, or moves that failed to win a pawn or more. If you set |
||
349 | <var><margin></var> to .300, you are asking for annotations for |
||
350 | any move that makes the score drop about 1/3 of a pawn below the value |
||
351 | for the best move <cite>Crafty</cite> found. |
||
352 | |||
353 | <p>If you have other moves you would like to see analyzed during |
||
354 | this annotate process, at the point where the move can be played, |
||
355 | insert it into the PGN file as an analysis comment, surrounded by () |
||
356 | or {} characters. <cite>Crafty</cite> will produce analysis for this |
||
357 | move as well. If more than one move appears inside a single set of |
||
358 | delimiters, only the first will be analyzed. To force |
||
359 | <cite>Crafty</cite> to analyze more than one move, enter them like |
||
360 | this: (move1) (move2) as though they were two separate comments.<p> |
||
361 | |||
362 | |||
363 | |||
364 | <a name="ANSI"></a> |
||
365 | <dt><strong>ANSI on</strong> | <strong>off</strong> |
||
366 | |||
367 | <dd> This command is used to control whether or not |
||
368 | <cite>Crafty</cite> attempts to display its move in reverse video or |
||
369 | not. For PC's, Linux, and most Unix boxes, this works fine. Should |
||
370 | you find yourself playing <cite>Crafty</cite> via a dumb terminal, |
||
371 | this might hose the terminal and interfere with your ability to see or |
||
372 | input moves. If moves are not displayed in reverse video, it's |
||
373 | probably wise to turn this off to avoid hanging the terminal you are |
||
374 | using.<p> |
||
375 | |||
376 | |||
377 | |||
378 | <a name="black|white"></a> |
||
379 | <dt> <strong>black</strong> | <strong>white</strong> |
||
380 | |||
381 | <dd> This command simply toggles the side on move. if it is White to |
||
382 | move, and you enter white, nothing happens. If it is White to move |
||
383 | and you enter black, then it becomes Black's turn to move immediately |
||
384 | from the same position. Used only infrequently.<p> |
||
385 | |||
386 | |||
387 | |||
388 | <a name="book"></a> |
||
389 | <dt> <strong>book</strong> |
||
390 | |||
391 | <dd> (See the <a href="#Opening Book">Opening Book Setup and Usage</a> |
||
392 | section near the end of this document for a full explanation of this |
||
393 | command and its many options.) Note that there are special commands |
||
394 | available (*only* on the command line, *not* in the |
||
395 | <code>crafty.rc</code>/<code>.craftyrc</code> files) to direct |
||
396 | <cite>Crafty</cite> to specific directories for the book files |
||
397 | (<code>bookpath=/a/b/c</code>), the tablebase files |
||
398 | (<code>tbpath=/i/j/k</code>) and the log files |
||
399 | (<code>logpath=/x/y/z</code>). Note that these commands can *only* be |
||
400 | used on the command line, because they must be executed before the |
||
401 | engine is initialized. Putting them in the |
||
402 | <code>crafty.rc</code>/<code>.craftyrc</code> file will produce error |
||
403 | messages without affecting how the files are opened. |
||
404 | |||
405 | <p>If you need to specify multiple directories (tbpath only) you may |
||
406 | do so by using "<code>tbpath=path1:path2:path3:etc</code>" or else use |
||
407 | the more Unix-like "<code>tbpath=(path1:path2:path3:etc)</code>" |
||
408 | instead. The paths are separated by ":" (colon) characters and |
||
409 | everything is case-sensitive as usual. For |
||
410 | <cite>DOS</cite>/<cite>Windows</cite> users, the separator can be a |
||
411 | semi-colon (;) or a comma (,) to avoid the drive designation |
||
412 | ambiguity.<p> |
||
413 | |||
414 | |||
415 | |||
416 | <a name="cache"></a> |
||
417 | <dt> <strong>cache</strong> [=] <var><N></var> |
||
418 | |||
419 | <dd> This command is used to alter the cache size used for <a |
||
420 | href="#egtb">endgame database</a> probes. <var><N></var> can be |
||
421 | a simple integer, representing the number of bytes to use or it can be |
||
422 | specified as nK or nM representing n * 1024 bytes or n * 1024 * 1024 |
||
423 | bytes. This should be in multiples of the database "chunk" size, |
||
424 | which might vary. Using the nM form guarantees that you will have a |
||
425 | reasonable number.<p> |
||
426 | |||
427 | |||
428 | |||
429 | <a name="clock"></a> |
||
430 | <dt> <strong>clock</strong> <var><ctime> <otime></var> |
||
431 | |||
432 | <dd> This command is primarily intended for use when |
||
433 | <cite>Crafty</cite> is playing in a tournament, such as the WMCCC or |
||
434 | WCCC events. If the operator is somewhat slow in entering moves, or |
||
435 | forgets to stop the clock after making a move for <cite>Crafty</cite>, |
||
436 | the chess clock for the game will drift from the values that |
||
437 | <cite>Crafty</cite> maintains internally. <var><ctime></var> is |
||
438 | the time (in minutes or hh:mm format) <cite>Crafty</cite> has left |
||
439 | until the next time control, and <var><otime></var> is the |
||
440 | opponent's remaining clock time. This command can be used at any |
||
441 | time, but will only affect the time per move *after* |
||
442 | <cite>Crafty</cite> makes the current move and starts to think about |
||
443 | what the opponent might do next.<p> |
||
444 | |||
445 | |||
446 | |||
447 | <a name="computer"></a> |
||
448 | <dt> <strong>computer</strong> |
||
449 | |||
450 | <dd> This command usually comes from <a |
||
451 | href="#xboard">XBoard/WinBoard</a>, but can be used at any time to |
||
452 | tell <cite>Crafty</cite> it is playing a computer. This will prevent |
||
453 | some things from happening, such as a draw score that varies, as well |
||
454 | as adjusting the book selection code to be more selective in what it |
||
455 | plays.<p> |
||
456 | |||
457 | |||
458 | |||
459 | <a name="display"></a> |
||
460 | <dt> <strong>display</strong> |
||
461 | |||
462 | <dd> This command is used to display the game board. This board is |
||
463 | displayed using the ICS style #1 type of ASCII display, with White |
||
464 | always at the bottom of the screen, Black at the top. Very unusable |
||
465 | to play a game with, but good to verify a position after it has been |
||
466 | set up. |
||
467 | |||
468 | <p>This command is also used to display the various piece/square |
||
469 | tables, by typing <strong>display</strong> <var><piece></var> |
||
470 | where <var><piece></var> is replaced by <strong>pawn</strong>, |
||
471 | <strong>knight</strong>, <strong>bishop</strong>, |
||
472 | <strong>rook</strong>, <strong>queen</strong> or |
||
473 | <strong>king</strong>. The board is oriented in the same way as the |
||
474 | display board with a one-to-one correspondence between the squares. |
||
475 | Perhaps useful for curiosity, but not for anything else. These values |
||
476 | can not be modified by the user. |
||
477 | |||
478 | <p>The final version of this command is used to control what kind of |
||
479 | output you will see when <cite>Crafty</cite> runs. Currently the |
||
480 | following options are available. |
||
481 | |||
482 | <dl> |
||
483 | |||
484 | <dt> <strong>display time</strong>: |
||
485 | |||
486 | <dd> this will make <cite>Crafty</cite> display the amount of |
||
487 | time each side takes after making a move. |
||
488 | |||
489 | |||
490 | <dt> <strong>display changes</strong>: |
||
491 | |||
492 | <dd> this will make <cite>Crafty</cite> display the PV each time |
||
493 | it changes during the search, including when a move fails high or |
||
494 | becomes a new best move. |
||
495 | |||
496 | |||
497 | <dt> <strong>display variation</strong>: |
||
498 | |||
499 | <dd> this will make <cite>Crafty</cite> display the PV at the end of each |
||
500 | iteration, but it will only show the best PV for the entire |
||
501 | iteration, not all of the changes. |
||
502 | |||
503 | |||
504 | <dt> <strong>display stats</strong>: |
||
505 | |||
506 | <dd> this enables basic search statistics output including time, |
||
507 | nodes and so forth. |
||
508 | |||
509 | |||
510 | <dt> <strong>display extstats</strong>: |
||
511 | |||
512 | <dd> this enables extended search stats including the hashing |
||
513 | statistics, search extension statistics and so forth. |
||
514 | |||
515 | |||
516 | <dt> <strong>display movenum</strong>: |
||
517 | |||
518 | <dd> causes all PV output to have move numbers embedded in them to |
||
519 | make the PV possibly easier to read. This causes the PV to look |
||
520 | like this: <strong>12. ... Nxe4 13. Bxe4 h6</strong> rather than |
||
521 | simply <strong>Nxe4 Bxe4 h6</strong>. This is very helpful when |
||
522 | playing on a server and whispering or kibitzing analysis. It |
||
523 | will also be useful when <cite>Crafty</cite> is run from within a |
||
524 | database program as the move numbers will sync up with the actual |
||
525 | game. |
||
526 | |||
527 | |||
528 | <dt> <strong>display moves</strong>: |
||
529 | |||
530 | <dd> will display each root move as it is searched, along with |
||
531 | updating the search time at the bottom of the screen, so you can |
||
532 | see what move is currently being analyzed. |
||
533 | |||
534 | |||
535 | <dt> <strong>display general</strong>: |
||
536 | |||
537 | <dd> will display general information messages whenever |
||
538 | <cite>Crafty</cite> wants to tell you something (ie "clearing |
||
539 | hash tables" or other such things like "Mate in n moves." |
||
540 | |||
541 | </dl> |
||
542 | |||
543 | If you put a <strong>no</strong> in front of any of these options, |
||
544 | that will disable that particular type of output.<p> |
||
545 | |||
546 | |||
547 | |||
548 | <a name="draw"></a> |
||
549 | <dt> <strong>draw</strong> |
||
550 | |||
551 | <dd> offers <cite>Crafty</cite> a draw. It generally will look at the |
||
552 | value returned by the last search, and compare it with the value |
||
553 | returned by an internal function DrawScore(). If the search value is |
||
554 | not above this result, then <cite>Crafty</cite> will accept the draw. |
||
555 | If the search value is above the theoretical value for a draw, |
||
556 | <cite>Crafty</cite> will decline the draw. Note that |
||
557 | <cite>Crafty</cite> will offer draws based on internal analysis. When |
||
558 | it offers a draw, you can respond with <strong>"draw"</strong> |
||
559 | although the game does not really end until you exit |
||
560 | <cite>Crafty</cite>.<p> |
||
561 | |||
562 | |||
563 | |||
564 | <a name="drawscore"></a> |
||
565 | <dt> <strong>drawscore</strong> <var>N</var> |
||
566 | |||
567 | <dd> sets the draw score (or contempt factor) to <var>N</var>. If you |
||
568 | want <cite>Crafty</cite> to avoid draws, set this number to something that is |
||
569 | negative. IE -50 says that a repetition (draw) is the same as being |
||
570 | 1/2 pawn down. Setting it to +100 will make it try very hard to draw |
||
571 | because that looks like it is winning a pawn when it does so. Note |
||
572 | that this is dangerous (either way) as a -50 in a king and pawn ending |
||
573 | is very likely dead lost... and a repetition is better.<p> |
||
574 | |||
575 | |||
576 | |||
577 | <a name="echo"></a> |
||
578 | <dt> <strong>echo</strong> <var><text></var> |
||
579 | |||
580 | <dd> This command is normally used inside a command file that you are |
||
581 | going to use to "feed" <cite>Crafty</cite> some positions for analysis |
||
582 | or whatever. Since <cite>Crafty</cite> depends on the operating |
||
583 | system to echo commands as they are typed, commands read in from a |
||
584 | file are "invisible." This gives you the ability to insert commands |
||
585 | into such a file so that <cite>Crafty</cite> displays a message on the |
||
586 | screen to give you an idea of where it is in processing the file.<p> |
||
587 | |||
588 | |||
589 | |||
590 | <a name="edit"></a> |
||
591 | <dt> <strong>edit</strong> |
||
592 | |||
593 | <dd> This command has been "cloned" from <cite>GnuChess</cite> to |
||
594 | provide an interface with <a href="#xboard">Xboard</a>. After |
||
595 | entering the <strong>edit</strong> command, you are in "edit.white" |
||
596 | mode, where any piece/square combination you enter will add the |
||
597 | indicated white piece on the given square. Piece/squares are entered |
||
598 | as "qa3", or "bc4" for example. This puts a white queen on a3 and a |
||
599 | white bishop on c4. Once all white pieces are entered, typing a "c" |
||
600 | changes to "edit.black" mode where piece/square combinations now place |
||
601 | black pieces. Typing a "." character exits edit mode. To clear the |
||
602 | board initially, you use the "#" character. |
||
603 | |||
604 | <p>Here's a sample to set up the original starting position, after |
||
605 | White has played 1. e4, but no other moves have been played. |
||
606 | |||
607 | <pre><strong> |
||
608 | edit |
||
609 | # |
||
610 | ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1 |
||
611 | pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2 |
||
612 | c |
||
613 | ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8 |
||
614 | pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7 |
||
615 | . |
||
616 | </strong></pre> |
||
617 | |||
618 | Note that input is free form, so piece/squares can be entered one per |
||
619 | line or all on one line. Ditto for the #, c, and . special |
||
620 | characters. Note also that there is no way to enter castling status |
||
621 | here. It is far better to use the <a href="#setboard"> |
||
622 | <strong>setboard</strong></a> command which uses a FEN-like syntax and |
||
623 | allows you to set both castling and en passant status.<p> |
||
624 | |||
625 | |||
626 | |||
627 | <a name="egtb"></a> |
||
628 | <dt> <strong>egtb</strong> |
||
629 | |||
630 | <dd> This command enables the endgame databases. <cite>Crafty</cite> |
||
631 | will use the "tbpath" directory (if provided) to locate and register |
||
632 | all of the databases you have downloaded. It will report the largest |
||
633 | class it found, as in "5 piece tablebase files found" if you |
||
634 | downloaded at least one 5-piece file. If you use this command to |
||
635 | enable databases, you should also consider using the <a |
||
636 | href="commands.html#cache"><strong>cache</strong></a> command to |
||
637 | specify the egtb cache size.<p> |
||
638 | |||
639 | |||
640 | |||
641 | <a name="quit"></a> <dt> <strong>end</strong> | <strong>quit</strong> |
||
642 | |||
643 | <dd> These commands are used to terminate <cite>Crafty</cite>. Note |
||
644 | that you can resume a game later without having to replay the moves, |
||
645 | by starting <cite>Crafty</cite> using the <strong>crafty c</strong> |
||
646 | command. It will immediately read in the moves for the last game, |
||
647 | although you will have to set the time controls and clock time |
||
648 | remaining yourself.<p> |
||
649 | |||
650 | |||
651 | |||
652 | <a name="evaluation"></a> |
||
653 | <dt> <strong>evaluation</strong> <var>option <value></var> |
||
654 | |||
655 | <dd> This command is used to modify the evaluation scores. |
||
656 | |||
657 | <ul> |
||
658 | |||
659 | |||
660 | <li> The option <strong>asymmetry</strong> is used to make |
||
661 | <cite>Crafty</cite> evaluate king safety differently for each side. |
||
662 | |||
663 | <p><strong>evaluation asymmetry 25</strong> will increase the king |
||
664 | safety scores for the opponent only, meaning it will pay less |
||
665 | attention to its own king safety than to that of its opponent. This |
||
666 | will make it play more aggressively. |
||
667 | |||
668 | <p><strong>evaluation asymmetry -25</strong> will reduce the king |
||
669 | safety scores for the opponent by 25%, making it care more about |
||
670 | its own king safety than that of its opponent. This will make it |
||
671 | play more defensively. |
||
672 | |||
673 | |||
674 | <li> The <strong>bscale</strong> option will adjust the scores for blocked |
||
675 | pawns. The default value is 100. Increasing this will tend to make |
||
676 | <cite>Crafty</cite> dislike blocked pawn positions more, which will |
||
677 | lead to more open positions. Note that this only affects moves |
||
678 | _after_ the opening book has been followed, which means that the |
||
679 | position might be blocked before the evaluation term has a chance to |
||
680 | affect the game. |
||
681 | |||
682 | |||
683 | <li> The <strong>kscale</strong> option will adjust all king safety |
||
684 | scores based on the 'value' entered. For example, |
||
685 | |||
686 | <dl> |
||
687 | |||
688 | <dt> <strong>evaluation kscale 50</strong> |
||
689 | <dd> will reduce all king safety scores to 50% of their normal |
||
690 | value. |
||
691 | |||
692 | <dt> <strong>evaluation kscale 133</strong> |
||
693 | <dd> will increase all king safety scores to 133% of their normal |
||
694 | values.<dd></dl> |
||
695 | |||
696 | |||
697 | <li> The option <strong>tropism</strong> is used to scale king |
||
698 | tropism scores. This will attract pieces toward kings. A value of |
||
699 | 100 means no change. other values are treated as a percentage (like |
||
700 | scale) to increase (> 100) or decrease (<100) the king |
||
701 | tropism scores. |
||
702 | |||
703 | </ul> |
||
704 | |||
705 | <p>When you use this command, you will see something like this: |
||
706 | |||
707 | <pre> |
||
708 | |||
709 | modified king-safety values: |
||
710 | white: 0 4 16 26 39 45 58 77 87 90 93 96 100 103 106 109 |
||
711 | 112 116 119 122 125 128 128 128 128 128 128 128 128 128 128 128 |
||
712 | |||
713 | black: 0 5 20 32 48 56 72 96 108 112 116 120 124 128 132 136 |
||
714 | 140 144 148 152 156 160 160 160 160 160 160 160 160 160 160 160 |
||
715 | |||
716 | </pre> |
||
717 | |||
718 | Those values represent the king-safety evaluation as the king gets |
||
719 | more and more exposed. This is always based on the fast that "crafty" |
||
720 | will be the side on move when the search starts. In the above, it was |
||
721 | White's move when this was typed, meaning that it appears that |
||
722 | <cite>Crafty</cite> will be playing Black. Notice that White's king |
||
723 | safety numbers are scaled by 20% to make it slightly more cautious |
||
724 | about its own king. If you type <strong>go</strong> in this position, |
||
725 | the scores get reversed as <cite>Crafty</cite>'s scores are always |
||
726 | left alone (with the asymmetry option) and the opponent's scores are |
||
727 | scaled down as indicated. |
||
728 | |||
729 | <p>You will see similar numbers (but not black and white sets) that |
||
730 | represent the actual scores produced for king tropism. Note that |
||
731 | pieces interact to choose which element of this vector is used, but in |
||
732 | general, the more pieces are close to the king, the larger the element |
||
733 | from this array. |
||
734 | |||
735 | <ul> |
||
736 | |||
737 | <li> The <strong>pscale</strong> option is used to scale normal pawn |
||
738 | structure scoring in the same way as the other scaling options. 100 |
||
739 | is the default. Values less than 100 reduce this term, values over |
||
740 | 100 inflate it. |
||
741 | |||
742 | |||
743 | <li> The <strong>ppscale</strong> option is used to scale some |
||
744 | passed pawn scoring in the same way as the other scaling options. |
||
745 | 100 is the default. Values less than 100 reduce this term, values |
||
746 | over 100 inflate it. This mainly effects outside passed |
||
747 | pawns/protected passed pawns. The normal pawn scoring computes the |
||
748 | value of a passed pawn. This term is then used to scale those terms |
||
749 | that modify this value further, such as two connected passed pawns |
||
750 | on the 6th, or a passed pawn with the king supporting it in an |
||
751 | endgame. |
||
752 | |||
753 | </ul><p> |
||
754 | |||
755 | |||
756 | |||
757 | <a name="extensions"></a> |
||
758 | <dt> <strong>extensions</strong> <var><type> <value></var> |
||
759 | |||
760 | <dd> This command is used to control the extension depth for the |
||
761 | various extensions done in <cite>Crafty</cite>'s search. The |
||
762 | extensions are set as decimal numbers that represent plies (or |
||
763 | fractions of plies) to extend for each particular reason. Most |
||
764 | default to 1.0 and .75, but any value can be used. Note that values |
||
765 | > 1.0 are _very_ dangerous as they can cause the search to become |
||
766 | non-terminating (<cite>Crafty</cite> will stop when it runs out of |
||
767 | time for the move, but it might not be able to get anything useful |
||
768 | from such a search). |
||
769 | |||
770 | <p>These extensions are presently limited to a maximum of one ply of |
||
771 | extensions at any point in the tree. IE no matter what you set these |
||
772 | values to, they can not exceed one ply at present. |
||
773 | |||
774 | <dl> |
||
775 | |||
776 | <dt> <strong>incheck</strong> |
||
777 | |||
778 | <dd> This is the amount to extend when the side on move makes a move |
||
779 | that leaves the opponent in check. Note that <cite>Crafty</cite> |
||
780 | extends on the ply where the check is played, not on the next ply |
||
781 | where the opposite side is in check. |
||
782 | |||
783 | <dt> <strong>onerep</strong> |
||
784 | <dd> This is the one-reply-to-check extensions, and is done at the |
||
785 | point where one side is in check and has exactly one legal move to |
||
786 | escape from the check. |
||
787 | |||
788 | <dt> <strong>pushpp</strong> |
||
789 | <dd> This is the extension used for certain passed pawn pushes in |
||
790 | the endgame. |
||
791 | |||
792 | <dt> <strong>recapture</strong> |
||
793 | <dd> This is the recapture extension, and is applied when the |
||
794 | current move recaptures an equal-valued piece that made a capture at |
||
795 | the previous ply. IE BxN, PxB. Note that this can only be applied |
||
796 | once for every two plies so that BxN, BxB, NxB, NxN won't look like |
||
797 | three recaptures. |
||
798 | |||
799 | <dt> <strong>mate</strong> |
||
800 | <dd> This is the mate threat extensions and is applied when a null |
||
801 | move search returns -MATED, which means that doing nothing gets the |
||
802 | side on move mated. The opponent must have some sort of serious mate |
||
803 | threat in such a position. |
||
804 | |||
805 | </dl><p> |
||
806 | |||
807 | |||
808 | |||
809 | <a name="flag"></a> |
||
810 | <dt> <strong>flag on</strong>|<strong>off</strong> |
||
811 | |||
812 | <dd> This command is used to force <cite>Crafty</cite> to end a game |
||
813 | where the opponent runs out of time with <a |
||
814 | href="#xboard">WinBoard/XBoard</a> (<strong>on</strong>) or to ignore |
||
815 | this (<strong>off</strong>) if desired.<p> |
||
816 | |||
817 | |||
818 | |||
819 | <a name="force"></a> |
||
820 | <dt> <strong>force</strong> [<var>move</var>] |
||
821 | |||
822 | <dd> This command is used to force <cite>Crafty</cite> to play a move |
||
823 | that is different from the one chosen and played by the tree search. |
||
824 | If [<var>move</var>] is given, and it is a legal move, |
||
825 | <cite>Crafty</cite> will retract its last move and make this move |
||
826 | instead. It does not change the side on move, but does change the |
||
827 | position of course. If [<var>move </var>]is not given, |
||
828 | <cite>Crafty</cite> will prompt you for a move to make.<p> |
||
829 | |||
830 | |||
831 | |||
832 | <a name="hash"></a> |
||
833 | <dt> <strong>hash=</strong><var>x</var> and |
||
834 | <strong>hashp=</strong><var>x</var> |
||
835 | |||
836 | <dd> These commands are used to adjust the size of the hash tables in |
||
837 | <cite>Crafty</cite>: <strong>hash</strong> modifies the size of the |
||
838 | transposition/refutation table, while <strong>hashp</strong> modifies |
||
839 | the size of the pawn structure/king safety hash table. The size |
||
840 | <var>x</var> may be entered as one of the following two types of |
||
841 | values: nnnK where nnn is an integer indicating how many Kbytes |
||
842 | <cite>Crafty</cite> should use for this hash table; nnnM where nnn is |
||
843 | an integer indicating how many Mbytes <cite>Crafty</cite> should use. |
||
844 | |||
845 | <p>The transposition/refutation table is the more critical of the |
||
846 | two, because it directly affects search efficiency, particularly in |
||
847 | the endgame. For this reason this should be maximized. The most |
||
848 | effective size for this hash table is 3/4 of your available memory. |
||
849 | If you don't know how to figure this out, but know that you have 16 |
||
850 | megs for example, they you can say <strong>hash=16M</strong> and |
||
851 | <cite>Crafty</cite> will round that down to 12M, which is 3/4 of a |
||
852 | power of two size. If you study the sizes that are possible, you will |
||
853 | find 3M, 6M, 12M, 24M, 48M, and so forth. Anything up to, but not |
||
854 | including, the next size will be rounded down to the next lower size. |
||
855 | hashp should be set to approximately 1/2 of what is left. For |
||
856 | example, the P6 <cite>Crafty</cite> runs on when playing on ICC often |
||
857 | uses <strong>hash=48M</strong> and <strong>hashp=8M</strong>. The |
||
858 | only thing to watch for is that if you make this too large, |
||
859 | particularly under <cite>Windows</cite>, performance will suffer badly |
||
860 | because of paging I/O overhead. When <cite>Crafty</cite> is searching |
||
861 | in a normal (non-book, non-endgame database) position, the disk light |
||
862 | should *not* be on, indicating lots of I/O. |
||
863 | |||
864 | <p>There is no danger in making this table too large, although you |
||
865 | have to watch out because if <cite>Crafty</cite> barely fits in |
||
866 | memory, doing something else on the machine can cause |
||
867 | <cite>Crafty</cite> to be swapped out completely or partially, |
||
868 | depending on the operating system you are using. If you are going to |
||
869 | use the machine for anything else while <cite>Crafty</cite> is |
||
870 | running, it is better to "pretend" that the machine only has 1/2 of |
||
871 | the memory it actually does when computing the size of the hash tables |
||
872 | you want to use.<p> |
||
873 | |||
874 | |||
875 | |||
876 | <a name="help"></a> |
||
877 | <dt> <strong>help</strong> |
||
878 | |||
879 | <dd> This command displays multiple pages of one-line help, one |
||
880 | command per line. If a line ends with [help], then you can use help |
||
881 | followed by the specific command to get detailed help.<p> |
||
882 | |||
883 | |||
884 | |||
885 | <a name="history"></a> |
||
886 | <dt> <strong>history</strong> |
||
887 | |||
888 | <dd> This command displays the history in a vertical column with one |
||
889 | move for White and one per Black per line. There are other ways to |
||
890 | display the current game moves and also to save them in files that are |
||
891 | explained later.<p> |
||
892 | |||
893 | |||
894 | <a name="import"></a> |
||
895 | <dt> <strong>import</strong> <var><filename></var> |
||
896 | [<strong>clear</strong>] |
||
897 | |||
898 | <dd> This command is used to import any sort of learning data that |
||
899 | <cite>Crafty</cite> supports, which currently includes book learning |
||
900 | data and position learning data. This command reads the appropriate |
||
901 | <var><filename></var> and imports that learned data, just as |
||
902 | though <cite>Crafty</cite> had learned it by playing the games. The |
||
903 | [<strong>clear</strong>] option, if specified, causes all old learned |
||
904 | results to be cleared before the import operation, otherwise the |
||
905 | imported data is simply added to what is already present.<p> |
||
906 | |||
907 | |||
908 | |||
909 | <a name="info"></a> |
||
910 | <dt> <strong>info</strong> |
||
911 | |||
912 | <dd> This command is used to display information about |
||
913 | <cite>Crafty</cite> and the current game. Such things as the time |
||
914 | control, the time left on the clocks and other information is |
||
915 | shown.<p> |
||
916 | |||
917 | |||
918 | |||
919 | <a name="input"></a> |
||
920 | <dt> <strong>input</strong> <var><filename></var> |
||
921 | |||
922 | <dd> This command is used to redirect the console input I/O stream |
||
923 | from the keyboard to a file. <cite>Crafty</cite> will then read |
||
924 | commands from this file, rather than from the keyboard, and execute |
||
925 | them just as though they were typed in. Such a command file *must* be |
||
926 | terminated by an <strong>"exit"</strong> command (no quotes) as the |
||
927 | last command in the file. This reverts the input stream back to the |
||
928 | keyboard, and prompts you for another command or move. |
||
929 | |||
930 | <p>This command might be used to configure <cite>Crafty</cite> for a |
||
931 | specific time control, by putting the appropriate time control |
||
932 | commands in the file, or to customize the hash table sizes as |
||
933 | needed.<p> |
||
934 | |||
935 | |||
936 | |||
937 | <a name="learn"></a> |
||
938 | <dt> <strong>learn</strong> <var>n</var> |
||
939 | |||
940 | <dd> controls the learning facilities in <cite>Crafty</cite>. |
||
941 | Currently this is a 3-bit boolean switch, bit 1 (001) controls book |
||
942 | learning, bit 2 (010) controls position learning, and bit 3 (100) |
||
943 | controls result learning. <strong>learn=0</strong> disables all |
||
944 | learning, <strong>learn=1</strong> enables book learning only, |
||
945 | <strong>learn=2</strong> enables position learning only, and |
||
946 | <strong>learn=4</strong> enables result learning. Add the values |
||
947 | together to turn on more than one type of learning (default=7 to |
||
948 | enable everything).<p> |
||
949 | |||
950 | |||
951 | |||
952 | <a name="level"></a> |
||
953 | <dt> <strong>level</strong> <var><m> <t> <inc></var> |
||
954 | |||
955 | <dd> This command was taken directly from <cite>GnuChess</cite> so |
||
956 | that the <cite>Xboard</cite>/<cite>WinBoard</cite> interface would |
||
957 | interface with <cite>Crafty</cite>. There are other better ways to |
||
958 | set the time, but this one is well-known. The three parameters are |
||
959 | <var><m></var> (number of moves in the game) |
||
960 | <var><t></var> initial time on the clock. After |
||
961 | <var><m></var> moves are made, this amount of time is added to |
||
962 | the clock again. <var><inc></var> is the Fischer-Clock |
||
963 | increment that is added back to each clock after a move is made. It |
||
964 | may be zero for a non-increment game. |
||
965 | |||
966 | <p> Examples: |
||
967 | |||
968 | <pre> |
||
969 | |||
970 | <strong>level 0 5 0</strong> (ICS 5 0 game) |
||
971 | <strong>level 0 5 3</strong> (ICS 5 3 game) |
||
972 | <strong>level 0 15 30</strong> (ICS 15 30 game) |
||
973 | |||
974 | </pre><p> |
||
975 | |||
976 | |||
977 | <a name="list"></a> |
||
978 | |||
979 | <dt> <strong>list GM</strong> | <strong>IM</strong> | |
||
980 | <strong>C</strong> | <strong>AK</strong> | <strong>S +</strong><var>name</var> |
||
981 | [<strong>+</strong><var>name</var> ...] |
||
982 | <strong>-</strong><var>name</var> [<strong>-</strong><var>name</var> |
||
983 | <strong>...</strong>] |
||
984 | |||
985 | <dd> This command is used to maintain the internal "lists" |
||
986 | <cite>Crafty</cite> uses to auto-tune itself when playing on a chess |
||
987 | server. There are three lists, <strong>GM</strong>, |
||
988 | <strong>IM</strong> and <strong>C</strong>. If <cite>Crafty</cite>'s |
||
989 | opponent is in any of these lists, <cite>Crafty</cite> adjusts |
||
990 | internal controls that affect how/when it resigns or offers draws, and |
||
991 | how randomly it will choose moves from the opening book. For example, |
||
992 | <cite>Crafty</cite> resigns much sooner against a GM, because it |
||
993 | assumes he knows how to win a rook-up ending, regardless of how much |
||
994 | time is left. By the same token, when playing against computers, |
||
995 | <cite>Crafty</cite> will always assume that a draw is 0.000, so that |
||
996 | it doesn't wreck its position trying to avoid repeating a position. |
||
997 | |||
998 | <p>The <strong>AK</strong> list will automatically kibitz |
||
999 | scores/PV's if the opponent is in this list. The <strong>S</strong> |
||
1000 | list will turn on special scoring for opponents in this list. The |
||
1001 | only current member is "mercilous". |
||
1002 | |||
1003 | <p>The syntax +name1 +name2 simply adds these players to the |
||
1004 | specified list. To remove a name, use -name1 -name2. You can use one |
||
1005 | command per name to remove or add, or you can use one command to add |
||
1006 | and remove multiple names. Note that all names must be entered in |
||
1007 | lowercase characters, using any uppercase characters will break the |
||
1008 | matching algorithm.<dd><p> |
||
1009 | |||
1010 | |||
1011 | |||
1012 | <a name="log"></a> |
||
1013 | <dt> <strong>log off</strong> | <strong>on</strong> | |
||
1014 | <var><n></var> |
||
1015 | |||
1016 | <dd> This command is used to disable logging. The default is |
||
1017 | <strong>log on</strong>, which causes <cite>Crafty</cite> to produce a |
||
1018 | new log.nnn file for each game played. If you are running |
||
1019 | <cite>Crafty</cite> on a server, you might use <strong>log |
||
1020 | off</strong>, which disables creating these files as well as the |
||
1021 | game.nnn files used to restart a game after you exit |
||
1022 | <cite>Crafty</cite> and come back later. If you use the form |
||
1023 | <strong>log</strong> <var>n</var> <cite>Crafty</cite> will simply |
||
1024 | display the last <var>n</var> lines of the log on the screen. If you |
||
1025 | use <strong>log</strong> <var>n file</var> <cite>Crafty</cite> will |
||
1026 | copy the last n lines of the log to <var>file</var> which could be |
||
1027 | your hard drive, or a floppy. |
||
1028 | |||
1029 | <p>Note that if you run with <strong>log off</strong>, you will be |
||
1030 | unable to find out what <cite>Crafty</cite> was thinking about since |
||
1031 | there is no other record of the game. You will always see a game.001 |
||
1032 | because as <cite>Crafty</cite> plays a game, this contains all the |
||
1033 | real moves played so far so that you can back up if needed. you will |
||
1034 | also see a log.001 file, but it will be empty.<p> |
||
1035 | |||
1036 | |||
1037 | <a name="ls"></a> |
||
1038 | <dt> <strong>ls</strong> <var><filename></var> |
||
1039 | |||
1040 | <dd> will list all the files that match the |
||
1041 | <var><filename></var> wildcard (the wildcards depend on the |
||
1042 | system you are using, but generally *, ? will work fine). you can |
||
1043 | also supply path information in the filename if you want to list the |
||
1044 | contents of a different directory. Just use the same syntax you would |
||
1045 | if you were using "ls" under <cite>Unix</cite> or "dir" under |
||
1046 | <cite>Windows</cite>.<p> |
||
1047 | |||
1048 | |||
1049 | |||
1050 | <a name="mode"></a> |
||
1051 | <dt> <strong>mode tournament</strong> | <strong>normal</strong> |
||
1052 | |||
1053 | <dd> This command is primarily used to put <cite>Crafty</cite> into |
||
1054 | "tournament" mode, which is intended for use when <cite>Crafty</cite> |
||
1055 | is playing in computer chess events. It accomplishes two things: (1) |
||
1056 | makes all draws return a score of 0.000, and (2) makes |
||
1057 | <cite>Crafty</cite> issue a message after each move showing the |
||
1058 | internal chess clock time, and requesting that that operator check and |
||
1059 | adjust as needed using the <a href="#clock"><strong>clock</strong></a> |
||
1060 | command. This primarily makes <cite>Crafty</cite> comply with |
||
1061 | computer chess rules that say the operator can't do anything not |
||
1062 | specifically requested by the program.<p> |
||
1063 | |||
1064 | |||
1065 | |||
1066 | <a name="name"></a> |
||
1067 | <dt> <strong>name</strong> <var><name></var> |
||
1068 | |||
1069 | <dd> This command is an ICS-play specific command. |
||
1070 | <cite>Xboard</cite>/<cite>WinBoard</cite> uses this to inform |
||
1071 | <cite>Crafty</cite> of the opponent's name. <cite>Crafty</cite> uses |
||
1072 | the <var><name></var>, and looks it up in its GM/IM/C lists, and |
||
1073 | if found, adjusts itself accordingly. This is not used by the PGN |
||
1074 | code and this will not cause the players <var><name></var> to |
||
1075 | show up in the PGN tag section.<p> |
||
1076 | |||
1077 | |||
1078 | |||
1079 | <a name="new"></a> |
||
1080 | <dt> <strong>new</strong> |
||
1081 | |||
1082 | <dd> This command wipes everything out and starts a brand new game. |
||
1083 | It closes the old log-file and game-file, and opens the next |
||
1084 | sequential numbered file. It also resets the game to the beginning |
||
1085 | and prepares to start a brand new game. This was added for Xboard, |
||
1086 | but it turns out that Xboard does not use this, rather it starts |
||
1087 | <cite>Crafty</cite> fresh for each new game by first terminating the |
||
1088 | old copy then starting a new one. Not nearly as efficient as using |
||
1089 | <strong>new</strong> but likely safer it a program can't be sure of |
||
1090 | resetting everything back to the initial state.<p> |
||
1091 | |||
1092 | |||
1093 | |||
1094 | <a name="noise"></a> |
||
1095 | <dt> <strong>noise</strong> <var><n></var> |
||
1096 | |||
1097 | <dd> This command sets the "noise" level in <cite>Crafty</cite>. |
||
1098 | Basically, until <var><n></var> nodes have been searched, |
||
1099 | <cite>Crafty</cite> will be silent and not display analysis. |
||
1100 | |||
1101 | <p>This is useful in two ways. First, in end-games, 20+ ply |
||
1102 | searches are not uncommon, and the search analysis for the first few |
||
1103 | plies arrives so quickly that it is distracting. Second, when |
||
1104 | observing games (new interface only) on ICS servers, this can be used |
||
1105 | to avoid having <cite>Crafty</cite> generate too many analysis kibitzes. A value |
||
1106 | of 100000 will basically shut off any output for the first second or |
||
1107 | so (on a P6/200). Similarly, 1000000 will eliminate any output for |
||
1108 | about the first 10 seconds. When watching and kibitzing games like |
||
1109 | the World Championship games on ICC, I generally use 5000000, which is |
||
1110 | almost one minute of silence so that the first PV it kibitzes is a |
||
1111 | pretty deep search. |
||
1112 | |||
1113 | <p><strong>noise 0</strong> will cause *all* analysis to be |
||
1114 | displayed, which on a fast machine causes no problems. On a slower |
||
1115 | machine, or over a slow phone connection, this might cause a big |
||
1116 | communication backlog. The default is roughly one second on a P6/200 |
||
1117 | (100000) but can be modified by this command.<p> |
||
1118 | |||
1119 | |||
1120 | <a name="operator"></a> |
||
1121 | <dt> <strong>operator</strong> <var><n></var> |
||
1122 | |||
1123 | <dd> Another command intended for use when <cite>Crafty</cite> is |
||
1124 | playing in a tournament, operated by a human. This tells |
||
1125 | <cite>Crafty</cite> to "hide" <var><n></var> minutes of time and |
||
1126 | not use them. This time is basically allocated to the operator to |
||
1127 | make up for the time it takes to type in moves and/or correct |
||
1128 | mistakes. At the WMCCC events, the normal value we use is 5. Playing |
||
1129 | on a server, this is not needed, as it is not needed if you are |
||
1130 | playing <cite>Crafty</cite> yourself.<p> |
||
1131 | |||
1132 | |||
1133 | <a name="perf"></a> |
||
1134 | <dt> <strong>perf</strong> |
||
1135 | |||
1136 | <dd> This command is primarily used in optimizing <cite>Crafty</cite>, |
||
1137 | or to test the speed of the move generator and |
||
1138 | <code>MakeMove()</code>/<code>UnMakeMove()</code> on different |
||
1139 | platforms. It produces two results, the moves it can generate per |
||
1140 | second, and the moves is can generate and make/unmake per second. |
||
1141 | While this is not a perfect performance indicator, it does give an |
||
1142 | "approximation" for how fast <cite>Crafty</cite> might run. In |
||
1143 | general, the higher the numbers, the better the program will play, |
||
1144 | although machines are certainly different. It's not uncommon to find |
||
1145 | a machine that searches slower than another, but has a higher "perf" |
||
1146 | value.<p> |
||
1147 | |||
1148 | |||
1149 | <a name="perft"></a> |
||
1150 | <dt> <strong>perft</strong> <var><depth></var> |
||
1151 | |||
1152 | <dd> This command is generally used to confirm that the move generator |
||
1153 | and bitmap operators are working properly. It simply takes the |
||
1154 | current position, and generates/makes/unmakes moves and counts them. |
||
1155 | Many programs use this from a "standard" position to make sure that |
||
1156 | their move generator does not miss generating odd moves like |
||
1157 | enpassant/promotions and also to confirm that the make/unmake code |
||
1158 | correctly updates the board so that the totals remain constant across |
||
1159 | different machines and programs, since there is no alpha/beta or |
||
1160 | evaluation things done. if <var><depth></var> is greater than 5 |
||
1161 | or 6, it will take a *long* time, since this is basically a minimax |
||
1162 | tree traversal that will visit *every* node within the |
||
1163 | <var><depth></var> search horizon.<p> |
||
1164 | |||
1165 | |||
1166 | <a name="pgn"></a> |
||
1167 | <dt> <strong>pgn</strong> <var><tag> <value></var> |
||
1168 | |||
1169 | <dd> This command is used to set the usual PGN tags to meaningful |
||
1170 | values. The recognized tags are <strong>Event</strong>, |
||
1171 | <strong>Site</strong>, <strong>Round</strong>, <strong>Date</strong>, |
||
1172 | <strong>White</strong>, <strong>WhiteElo</strong>, |
||
1173 | <strong>Black</strong>, <strong>BlackElo</strong>, and |
||
1174 | <strong>Result</strong>, and the tags *are* case sensitive. The |
||
1175 | <var><value></var> can be any valid input and blanks and special |
||
1176 | characters are allowed. Note that the date is clearly specified in |
||
1177 | the PGN standard and must be yyyy.mm.dd with no variance. Valid |
||
1178 | results are <strong>1-0</strong> (White won), <strong>0-1</strong> |
||
1179 | (Black won), <strong>1/2-1/2</strong> (drawn) and <strong>*</strong> |
||
1180 | (unknown). Some examples: |
||
1181 | |||
1182 | <pre><strong> |
||
1183 | pgn Event 14th World MicroComputer Chess Championship |
||
1184 | pgn Date 1996.10.8 |
||
1185 | pgn Site Jakarta, Indonesia |
||
1186 | pgn Round 1 |
||
1187 | pgn White Crafty |
||
1188 | pgn WhiteElo 2400 |
||
1189 | pgn Black assassin |
||
1190 | pgn BlackElo 2400 |
||
1191 | pgn Result 1-0 |
||
1192 | </strong></pre> |
||
1193 | |||
1194 | Setting these values will result in a proper PGN file when using the |
||
1195 | <a href="#savegame"><strong>savegame</strong></a> command. Note that if you |
||
1196 | use the <a href="#read"><strong>read</strong></a> command to input a PGN game, |
||
1197 | these values will be extracted from that game if they are given.<p> |
||
1198 | |||
1199 | |||
1200 | |||
1201 | <a name="ponder"></a> |
||
1202 | <dt> <strong>ponder off</strong> | <strong>on</strong> | |
||
1203 | <var><move></var> |
||
1204 | |||
1205 | <dd> This command serves two purposes. First, it can be used to |
||
1206 | disable (<strong>off</strong>) or enable (<strong>on</strong>) |
||
1207 | thinking on the opponent's time (or pondering as it is called in many |
||
1208 | programs including <cite>Crafty</cite>.) Turning it off will weaken |
||
1209 | <cite>Crafty</cite> since it will not use any machine time while |
||
1210 | waiting on the opponent to move. It is sometimes useful, however, |
||
1211 | when playing <cite>Crafty</cite> against another computer and the |
||
1212 | machines are not equal. If <cite>Crafty</cite> is on a faster |
||
1213 | machine, and you attempt to adjust for this by giving the opponent |
||
1214 | more time than <cite>Crafty</cite>, it doesn't work quite as expected, |
||
1215 | because while the opponent is thinking, so is <cite>Crafty</cite>, |
||
1216 | which lets it use the extra opponent time in an unexpected way. In |
||
1217 | such a case, it's best to stop pondering in both programs. |
||
1218 | |||
1219 | <p>If <var><move></var> is given, it directs |
||
1220 | <cite>Crafty</cite> to use that <var><move></var> to ponder, |
||
1221 | rather than the one from the previous search. Most commonly this is |
||
1222 | used to set the right move to ponder after <cite>Crafty</cite> has |
||
1223 | been stopped and then restarted, assuming that it is the opponent's |
||
1224 | turn to move when this happens. Otherwise, it is probably better to |
||
1225 | not try to influence things, although if you are watching and suddenly |
||
1226 | wonder "what would <cite>Crafty</cite> do if the opponent plays move |
||
1227 | 'X'?", you can answer this by simply typing <strong>ponder X</strong> |
||
1228 | and then watching the analysis. You should reset the correct ponder |
||
1229 | move after you do this of course.<p> |
||
1230 | |||
1231 | |||
1232 | <a name="read"></a> |
||
1233 | <dt> <strong>read</strong> | <strong>reada</strong> |
||
1234 | [<var><filename></var>] |
||
1235 | |||
1236 | <dd> This command will read input, and extract the chess moves and |
||
1237 | make them to set up the position at the end of the game. It first |
||
1238 | resets the chess board to the initial position (read command only) and |
||
1239 | then extracts the PGN tags (if present) from the front of the input. |
||
1240 | The rest of the input is parsed for chess moves (comments and similar |
||
1241 | things are culled automatically) and the moves are made and added to |
||
1242 | the game history. Once this is done, you can back up, go forward, or |
||
1243 | play from any point in the game. If you specify a |
||
1244 | <var><filename></var> everything is read from the file, |
||
1245 | otherwise it is read from the console keyboard. |
||
1246 | |||
1247 | <p>The <strong>reada</strong> command reads moves, but appends them |
||
1248 | to the current game history/position rather than resetting to the |
||
1249 | initial chess position. This lets you read in a game, then use reada |
||
1250 | to manually add some more moves to see the resulting position.<p> |
||
1251 | |||
1252 | |||
1253 | |||
1254 | <a name="reset"></a> |
||
1255 | <dt> <strong>reset</strong> <var><n></var> |
||
1256 | |||
1257 | <dd> This command lets you back up in the current game to any move of |
||
1258 | your choice. <strong>reset</strong> <var><n></var> backs up the |
||
1259 | game to move <var><n></var> with the same side on move. If you |
||
1260 | want to first change the side to move, use the <a href="#black|white" |
||
1261 | ><strong>white</strong>|<strong>black</strong></a> command, then use |
||
1262 | the <strong>reset</strong> command to back up to the right move. Note |
||
1263 | that you can also go forward as well, just so there are moves in the |
||
1264 | current game history.<p> |
||
1265 | |||
1266 | |||
1267 | |||
1268 | <a name="resign"></a> |
||
1269 | <dt> <strong>resign</strong> <var><n></var> |
||
1270 | |||
1271 | <dd> This command sets the resign threshold. When running on ICC I |
||
1272 | typically use <strong>resign 9</strong> which will make |
||
1273 | <cite>Crafty</cite> resign roughly five moves after the score drops |
||
1274 | below -9.000. For IM's I change this to 6, and for GM's I often use |
||
1275 | 3, so that it will resign quicker and not drag a lost game out |
||
1276 | unnecessarily.<p> |
||
1277 | |||
1278 | |||
1279 | <a name="savegame"></a> |
||
1280 | <dt> <strong>savegame</strong> <var><filename></var> |
||
1281 | |||
1282 | <dd> This command is used to save the current game in a PGN-compliant |
||
1283 | file with the PGN tags included. Note that the default TAG values |
||
1284 | might not be what you want if you do not either use the <a |
||
1285 | href="#pgn"><strong>pgn</strong></a> command to set them or else input |
||
1286 | a valid PGN file with the tags already filled in. |
||
1287 | |||
1288 | <p>Be aware that this command doesn't check the filename for |
||
1289 | legality since anything goes in UNIX. In DOS, you might produce a bad |
||
1290 | filename with either too many characters, too many periods, or |
||
1291 | whatever, so be careful with the name you choose. Note also that this |
||
1292 | file will be overwritten if it already exists, so be sure to choose a |
||
1293 | name that is not the name of a file that has something you consider |
||
1294 | important in it.<p> |
||
1295 | |||
1296 | |||
1297 | |||
1298 | <a name="savepos"></a> |
||
1299 | <dt> <strong>savepos</strong> <var><filename></var> |
||
1300 | |||
1301 | <dd> This command writes a single line into |
||
1302 | <var><filename></var> in FEN-like notation. This lets you save |
||
1303 | a position, and then come back later to re-examine it. You would use |
||
1304 | the <a href=#input><strong>input</strong> |
||
1305 | <var><filename></var></a> command to input this file and set the |
||
1306 | position up.<p> |
||
1307 | |||
1308 | |||
1309 | |||
1310 | <a name="search"></a> |
||
1311 | <dt> <strong>search</strong> <var><move></var> |
||
1312 | |||
1313 | <dd> This command allows you to specify one particular move for the |
||
1314 | side on move, and then when you tell <cite>Crafty</cite> to search |
||
1315 | this position, this is the only move that will be searched. This is |
||
1316 | used internally by the annotate command, but can be used to |
||
1317 | investigate one specific move. If the move is not the best move, a |
||
1318 | normal search won't show you why it is bad, but this will. It is also |
||
1319 | quite a bit faster since the other moves in the position are not |
||
1320 | searched at all.<p> |
||
1321 | |||
1322 | |||
1323 | |||
1324 | <a name="settc"></a> |
||
1325 | <dt> <strong>settc</strong> <var><moves> <ctime> |
||
1326 | <otime></var> |
||
1327 | |||
1328 | <dd> This command is primarily used in tournaments, and is an |
||
1329 | error-recovery command. If the machine crashes and corrupts the game |
||
1330 | history file, frequently the operator will have to simply set the |
||
1331 | position using the <a href=#setboard"><strong>setboard</strong></a> |
||
1332 | command, and then use the <strong>settc</strong> command to restore |
||
1333 | the time control values. |
||
1334 | |||
1335 | <dl> |
||
1336 | |||
1337 | <dt> <var><moves></var> |
||
1338 | <dd> is moves until the next time control (from <cite>Crafty</cite>'s |
||
1339 | perspective, be careful and don't look at the opponent's moves to time |
||
1340 | control by accident.)<dd> |
||
1341 | |||
1342 | <dt> <var><ctime></var> |
||
1343 | <dd> is minutes left on <cite>Crafty</cite>'s clock, |
||
1344 | <var><otime></var> is minutes left on the opponent's clock. |
||
1345 | |||
1346 | </dl><p> |
||
1347 | |||
1348 | |||
1349 | |||
1350 | <a name="setboard"></a> |
||
1351 | <dt> <strong>setboard</strong> <var><FEN input></var> |
||
1352 | |||
1353 | <dd> This command is used to set a chess position up for analysis and |
||
1354 | is the preferred way to do this, rather than using the gnu <a |
||
1355 | href=#edit><strong> edit</strong></a> interface. It uses a classic |
||
1356 | Forsythe-like notation to encode the position and also has provisions |
||
1357 | for castling status and en passant capture status. |
||
1358 | |||
1359 | <p>Standard piece codes p, n, b, r, q, k are used to denote the type |
||
1360 | of piece on a square, upper/lower case are used to indicate the color |
||
1361 | of the piece (uppercase=white pieces, lowercase=black pieces). |
||
1362 | |||
1363 | <p>Pieces are entered from the classic chess diagram's orientation |
||
1364 | of a8 being the upper-left-hand corner of the board, and this square |
||
1365 | is entered first, followed by the remainder of the 8th rank left to |
||
1366 | right. To indicate empty squares, use a number between 1 and 8 to |
||
1367 | indicate how many adjacent squares are empty. Use a slash (/) to |
||
1368 | terminate each rank after all of the pieces for that rank have been |
||
1369 | entered. Note that you do not have to account for all 8 squares on a |
||
1370 | given rank, although many test suites do this for clarity. |
||
1371 | |||
1372 | <p>The input <strong>k2r/ppp////Q/5PPP/7K/ B</strong> |
||
1373 | will setup the board position that is given below: |
||
1374 | |||
1375 | <pre><tt> |
||
1376 | -k * * -r * * * * |
||
1377 | -p -p -p * * * * * |
||
1378 | * * * * * * * * |
||
1379 | * * * * * * * * |
||
1380 | * * * * * * * * |
||
1381 | q * * * * * * * |
||
1382 | * * * * * p p p |
||
1383 | * * * * * * * k * |
||
1384 | </tt></pre> |
||
1385 | |||
1386 | This assumes that k represents a white king and -q represents a black |
||
1387 | queen. |
||
1388 | |||
1389 | <p>The field after the final "/" should be either b or w to indicate |
||
1390 | which side is "on move." After this side-to-move field any of the |
||
1391 | following characters can appear to indicate the following: KQ: White |
||
1392 | can castle king-side/queen-side/both; kq: same for Black; a1-h8: |
||
1393 | indicates the square occupied by a pawn that can be captured en |
||
1394 | passant.<p> |
||
1395 | |||
1396 | |||
1397 | |||
1398 | <a name="score"></a> |
||
1399 | <dt> <strong>score</strong> |
||
1400 | |||
1401 | <dd> This command simply gives the positional score for the current |
||
1402 | position. This score is from White's perspective, so a + score is |
||
1403 | good for White, a - score is good for Black. <cite>Crafty</cite> also |
||
1404 | breaks the score down into major categories (from Evaluate()) to |
||
1405 | indicate things like pawn structure, piece evaluation, passed pawns, |
||
1406 | development, and so forth. Note that some of <cite>Crafty</cite>'s |
||
1407 | evaluation is asymmetric, so that if you simply change sides with the |
||
1408 | <a |
||
1409 | href="#black|white"><strong>white</strong>/<strong>black</strong></a> |
||
1410 | command and then enter "score" again, you may get a different value. |
||
1411 | This is *not* a bug. :)<p> |
||
1412 | |||
1413 | |||
1414 | |||
1415 | <a name="sd"></a> |
||
1416 | <dt> <strong>sd</strong> <var><n></var> |
||
1417 | |||
1418 | <dd> This command lets you specify a specific search depth limit that |
||
1419 | <cite>Crafty</cite> can not exceed. It still pays attention to the |
||
1420 | clock, however, so often you will use the <a |
||
1421 | href=#st><strong>st</strong></a> command (below) in conjunction with |
||
1422 | this if the search is going to take an extended amount of time. |
||
1423 | <var><n></var> is the depth (in plies or 1/2 moves) that the |
||
1424 | search must reach. Note that if <cite>Crafty</cite> is pondering, it |
||
1425 | still honors this limit and will stop a ponder search after this depth |
||
1426 | has been completed as well. This is *not* the way to make |
||
1427 | <cite>Crafty</cite> play weaker, although this will be covered in a |
||
1428 | later section of this document.<p> |
||
1429 | |||
1430 | |||
1431 | |||
1432 | <a name="show"></a> |
||
1433 | <dt> <strong>show</strong> <var><category></var> |
||
1434 | |||
1435 | <dd> This command forces <cite>Crafty</cite> to display additional |
||
1436 | information about certain actions it takes. Currently the only |
||
1437 | <var><category></var> is <strong>book</strong> which will make |
||
1438 | <cite>Crafty</cite> display information about all the book moves it |
||
1439 | found in the database. More is given about this information in the |
||
1440 | the <a href="#Opening Book">Opening Book Setup and Usage</a> section |
||
1441 | later in this file.<p> |
||
1442 | |||
1443 | |||
1444 | <a name="smpmt"></a> |
||
1445 | <dt> <strong>smpmt=</strong><var>n</var> |
||
1446 | |||
1447 | <dd> This command is used to set the number of threads to use on a |
||
1448 | machine with more than one processor. For optimal performance, |
||
1449 | "<var>n</var>" should be set to the number of processors you have, |
||
1450 | although using fewer will reduce the load on your machine. For this |
||
1451 | command to work, <cite>Crafty</cite> must have been compiled with SMP |
||
1452 | defined. When compiled with SMP enabled, <strong>mt=0</strong> |
||
1453 | effectively disables the SMP code completely. |
||
1454 | |||
1455 | <p>This command also has two that are closely related: |
||
1456 | <strong>smpmin</strong> and <strong>smpmax</strong>. Both accept |
||
1457 | single numerical arguments.<dl> |
||
1458 | |||
1459 | |||
1460 | <a name="smpmin"></a> |
||
1461 | <dt> <strong>smpmin</strong> |
||
1462 | |||
1463 | <dd> is used to control the minimum tree depth required at a node |
||
1464 | for it to be eligible for parallel searching. IE <strong>smpmin |
||
1465 | 2</strong> says don't split unless at least two more plies are left |
||
1466 | to search below this node.<dd |
||
1467 | |||
1468 | |||
1469 | <a name="smpmax"></a> |
||
1470 | <dt> <strong>smpmax</strong> |
||
1471 | |||
1472 | <dd> sets the maximum for the same idea; that is, <strong>smpmax |
||
1473 | 10</strong> says don't split if more than 10 plies are remaining |
||
1474 | below this node. |
||
1475 | |||
1476 | </dl><p> |
||
1477 | |||
1478 | |||
1479 | |||
1480 | <a name="sn"></a> |
||
1481 | <dt> <strong>sn</strong> <var><n></var> |
||
1482 | |||
1483 | <dd> This command is similar to the <a |
||
1484 | href="#sd"><strong>sd</strong></a> command, but instead of setting a |
||
1485 | specific search depth, it sets a number of nodes to search. Once the |
||
1486 | search has searched this number of nodes (+ maybe one more second of |
||
1487 | searching to check the time) the search will exit.<p> |
||
1488 | |||
1489 | |||
1490 | |||
1491 | <a name="st"></a> |
||
1492 | <dt> <strong>st</strong> <var><n></var> |
||
1493 | |||
1494 | <dd> This command lets you specify a specific search time limit for |
||
1495 | <cite>Crafty</cite>. Again, this is not the preferred way to set a |
||
1496 | time per move, because this limit is absolute and <cite>Crafty</cite> |
||
1497 | will never go over this limit, even if it sees that it is losing or |
||
1498 | getting mated. Setting the time control with the usual <a |
||
1499 | href="#time"><strong>time</strong></a> or <a |
||
1500 | href="#level"><strong>level</strong></a> command is *much* better. |
||
1501 | <var><n></var> is given in seconds, although it may also be |
||
1502 | entered as mm:ss if preferred.<p> |
||
1503 | |||
1504 | |||
1505 | |||
1506 | <a name="swindle"></a> |
||
1507 | <dt> <strong>swindle on</strong>|<strong>off</strong> |
||
1508 | |||
1509 | <dd> This command gives you control over "swindle mode." When on, and |
||
1510 | playing a game, <cite>Crafty</cite> will try to win drawn endings |
||
1511 | (according to the tablebases) if it has winning chances (like KR vs |
||
1512 | KB, for example). This will put up very stiff "resistance" to |
||
1513 | accepting the draw, while with this mode off, it may be very easy to |
||
1514 | draw a position once the tablebases say "drawn." This mode is |
||
1515 | automatically turned "off" during <a href="#analyze">analysis</a> or |
||
1516 | when <a href="#annotate">annotating</a> a game, and is only used when |
||
1517 | actually playing a game against an opponent. If there are <a |
||
1518 | href="#egtb">no tablebases</a> then this has no effect on the game at |
||
1519 | all.<p> |
||
1520 | |||
1521 | |||
1522 | |||
1523 | <a name="tags"></a> |
||
1524 | <dt> <strong>tags</strong> |
||
1525 | |||
1526 | <dd> This command will simply display the current PGN tags (you can |
||
1527 | edit them with the various <a href="#pgn"><strong>pgn</strong></a> |
||
1528 | commands).<p> |
||
1529 | |||
1530 | |||
1531 | |||
1532 | <a name="test"></a> |
||
1533 | <dt> <strong>test</strong> <var><filename></var> [<var>n</var>] |
||
1534 | |||
1535 | <dd> This command will run a suite of positions (the file must be in |
||
1536 | "<cite>Crafty</cite>" format as explained below) and produce a summary |
||
1537 | of how many it got right, wrong, etc. It uses the time per move you |
||
1538 | set with the (typically) <strong>st</strong> <var><n></var> |
||
1539 | command. The optional parameter [<var>n</var>] is the "early exit" |
||
1540 | counter. If <cite>Crafty</cite> finds, and holds the solution move |
||
1541 | for n iterations, it will terminate the search. I use this to make a |
||
1542 | "<cite>Win at Chess</cite>" run take < 15 minutes, even though the |
||
1543 | time per position is set to 1 minute, by setting n to 2. After two |
||
1544 | correct iterations, <cite>Crafty</cite> goes on to the next problem. |
||
1545 | For absolutely correct results, this is not advisable as it could |
||
1546 | obviously change its mind later on, but for performance analysis, this |
||
1547 | saves a lot of time. |
||
1548 | |||
1549 | <p>The test suite contains the following lines: (this is a sample |
||
1550 | from my test suite for <cite>Win At Chess</cite>.) |
||
1551 | |||
1552 | <pre> |
||
1553 | title wac299 |
||
1554 | setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w |
||
1555 | solution Nca4 |
||
1556 | |||
1557 | title wac300 |
||
1558 | setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w |
||
1559 | solution g6 |
||
1560 | |||
1561 | end |
||
1562 | |||
1563 | </pre> |
||
1564 | |||
1565 | <ul> |
||
1566 | |||
1567 | <li> The <strong>title</strong> command simply displays this message |
||
1568 | in the log file so you can look at the output and figure out which |
||
1569 | position it goes with. This is optional, but useful. |
||
1570 | |||
1571 | <li> The <strong>setboard</strong> command sets the position as |
||
1572 | explained above. |
||
1573 | |||
1574 | <li> The <strong>solution</strong> command gives the set of solution |
||
1575 | moves (one or more moves that are separated by blanks) and/or a set |
||
1576 | of "anti-solution" moves (moves that must not be played to |
||
1577 | count the position as correct.) "anti-solution" moves are |
||
1578 | simply followed by a "?" character, for example: |
||
1579 | |||
1580 | <center><strong> solution Bxa7?</strong></center> |
||
1581 | <center> </center> |
||
1582 | |||
1583 | <p>The <strong>solution</strong> command supplies a set of key moves, and |
||
1584 | then starts the search. If, after the search terminates, one of the |
||
1585 | key solution moves was chosen (or none of the anti-solution moves |
||
1586 | were chosen) the position is counted as correct. |
||
1587 | |||
1588 | <li> The final line should be <strong>end</strong> although |
||
1589 | end-of-file or EOF will also be detected in this case.</ul><p> |
||
1590 | |||
1591 | |||
1592 | |||
1593 | <a name="time"></a> |
||
1594 | <dt> <strong>time |
||
1595 | CPU</strong> | <strong>elapsed</strong> | <var><values></var> |
||
1596 | |||
1597 | <dd> In the forms <strong>time CPU</strong> and <strong>time |
||
1598 | elapsed</strong>, this command controls whether the program uses CPU |
||
1599 | time or wall-clock time for timing. For tournament play, it is safer |
||
1600 | to use wall-clock timing. For testing it may be more consistent to |
||
1601 | use CPU timing if the machine is used for other things concurrently |
||
1602 | with the tests being run. |
||
1603 | |||
1604 | <p>The form <strong>time</strong> <var><values></var> is used |
||
1605 | to set the basic search timing controls. The general form of the |
||
1606 | command is as follows: |
||
1607 | |||
1608 | <center><strong>time</strong> |
||
1609 | <var>nmoves</var> <strong>/</strong> <var>ntime</var> |
||
1610 | [<strong>/</strong> <var>nmoves</var> <strong>/</strong> |
||
1611 | <var>ntime</var>] |
||
1612 | [<strong>/</strong> <var>increment</var>]</center> |
||
1613 | |||
1614 | <ul> |
||
1615 | |||
1616 | <li> <var>nmoves</var><strong>/</strong><var>ntime</var> represents a |
||
1617 | traditional first time control when nmoves is an integer representing |
||
1618 | the number of moves and ntime is the total time allowed for these |
||
1619 | moves. |
||
1620 | |||
1621 | <li> the optional |
||
1622 | [<var>nmoves</var><strong>/</strong><var>ntime</var>] is a traditional |
||
1623 | secondary time control. |
||
1624 | |||
1625 | <li> <var>increment</var> is a feature related to ICS play and |
||
1626 | emulates the Fischer clock where <var><increment></var> is added |
||
1627 | to the time left after each move is made. |
||
1628 | |||
1629 | </ul> |
||
1630 | |||
1631 | <p>Instead of an integer, nmoves can be <strong>sd</strong> which |
||
1632 | represents a sudden death time control of the remainder of the game |
||
1633 | played in ntime. The optional secondary time control can be a |
||
1634 | sudden-death time control, as in the following example: |
||
1635 | |||
1636 | <center><strong>time 60/30/sd/30</strong>;</center> |
||
1637 | |||
1638 | this sets 60 moves in 30 minutes, then game in 30 additional |
||
1639 | minutes. An increment can be added if desired. |
||
1640 | |||
1641 | <p>One final example is the following: |
||
1642 | |||
1643 | <center><strong>time sd/15</strong></center> |
||
1644 | |||
1645 | which is a simple game/15 setting. This command can also be used to |
||
1646 | perform the same function as the "level" command. For example, to set |
||
1647 | up a classic ICS 2 12 game, the following would would work: |
||
1648 | |||
1649 | <center><strong>time sd/2/12</strong>.</center> |
||
1650 | <p> |
||
1651 | |||
1652 | |||
1653 | <a name="trace"></a> |
||
1654 | <dt> <strong>trace</strong> <var><n></var> |
||
1655 | |||
1656 | <dd> This command is used to make <cite>Crafty</cite> display the tree as it |
||
1657 | searches a position. Due to the incredible speed at which this |
||
1658 | program can search, however, this is less than useful since it can |
||
1659 | swamp any known display driver and make things scroll impossibly fast. |
||
1660 | |||
1661 | <p>Also note that this command usually is disabled, because |
||
1662 | <cite>Crafty</cite> is generally compiled with the -DFAST flag, which |
||
1663 | removes the trace output code from the search to make things slightly |
||
1664 | faster. You will have to recompile, without the -DFAST, if you want |
||
1665 | to use this. Its utility is limited, except for debugging, anyway.<p> |
||
1666 | |||
1667 | |||
1668 | <a name="usage"></a> |
||
1669 | <dt> <strong>usage</strong> <var><n></var> |
||
1670 | |||
1671 | <dd> is simply a way to modify <cite>Crafty</cite>'s time usage to fit |
||
1672 | your tastes. You can "suggest" a time limit with any of the options |
||
1673 | discussed previously, but if you use anything other than the <a |
||
1674 | href="#st"><strong>st</strong></a> command, <cite>Crafty</cite> will |
||
1675 | do its best to use time as you suggest, but it also anticipates that |
||
1676 | it will save some time by pondering, etc., and will therefore be more |
||
1677 | aggressive at trying to use time. If <var><n></var> is a |
||
1678 | positive integer, it is taken as a percentage and <cite>Crafty</cite> |
||
1679 | will compute the time limit it thinks is appropriate for the current |
||
1680 | clock settings, then increase this limit by this percentage (50 would |
||
1681 | make it take 1.5 times longer than normal.) -50 would make it take |
||
1682 | 1/2 the time it would normally take. |
||
1683 | |||
1684 | <p><cite>Crafty</cite> adjusts the usage internally based on time |
||
1685 | left, opponent's time left, how quickly or slowly the opponent is |
||
1686 | moving, etc. Further modifying things with this is dangerous, but |
||
1687 | possible.<p> |
||
1688 | |||
1689 | |||
1690 | |||
1691 | <a name="whisper/kibitz"></a> |
||
1692 | <dt> <strong>whisper/kibitz</strong> <var><n></var> |
||
1693 | |||
1694 | <dd> These commands are used to control what <cite>Crafty</cite> will |
||
1695 | whisper or kibitz on a chess server. The options are (1) only |
||
1696 | whispers or kibitzes mate announcements; (2) adds time, score, depth |
||
1697 | to the previous option, but no PV or moves. (3) adds the PV. (4) |
||
1698 | adds book move information to the output. The remaining two options |
||
1699 | generate a lot of output and should be used with caution. (5) |
||
1700 | displays the PV after each iteration completes. I use this when using |
||
1701 | my custom interface to let <cite>Crafty</cite> observe/comment on |
||
1702 | games in progress on ICC. Noise can be used to prevent shallow |
||
1703 | searches from generating output and keeping "noise" down on the games |
||
1704 | being watched. (6) basically will whisper/kibitz nearly everything |
||
1705 | you see on the console from a search, each PV when it changes, fail |
||
1706 | highs and fail lows, etc. A significant amount of output that should |
||
1707 | be carefully weighed before turning it "loose."<p> |
||
1708 | |||
1709 | |||
1710 | |||
1711 | <a name="xboard"></a> |
||
1712 | <dt> <strong>xboard</strong> |
||
1713 | |||
1714 | <dd> This command turns on <cite>Xboard</cite>/<cite>WinBoard</cite> |
||
1715 | compatibility mode, and makes <cite>Crafty</cite> behave somewhat like |
||
1716 | GnuChess. This is designed to be used *only* when <cite>Crafty</cite> |
||
1717 | is interfacing with <cite>Xboard</cite>/<cite>WinBoard</cite>. |
||
1718 | <cite>Crafty</cite> will not work with these two GUIs without this |
||
1719 | option, and really won't work very well with this option if it is not |
||
1720 | connected to one of them.<p> |
||
1721 | |||
1722 | |||
1723 | </dl> |
||
1724 | |||
1725 | There are other commands that are not documented. They are part of |
||
1726 | the xboard protocol and really should not be used by the normal user. |
||
1727 | You can find all the commands in option.c should you be interested. |
||
1728 | |||
1729 | |||
1730 | |||
1731 | |||
1732 | <hr> |
||
1733 | <a name="Opening Book"></a> |
||
1734 | <h2>Opening Book Setup and Usage</h2> |
||
1735 | |||
1736 | <cite>Crafty</cite> uses two pre-compiled opening books, called |
||
1737 | "<code>book.bin</code>" and "<code>books.bin</code>". |
||
1738 | |||
1739 | <p>The file <code>book.bin</code> is usually build from a large text |
||
1740 | file containing PGN games, often taken from collections of GM games. |
||
1741 | Building <code>book.bin</code> is a simple exercise and requires |
||
1742 | nothing other than the raw input file you are going to use. Generally |
||
1743 | this will be either <code>medium.zip</code> or the set of four files |
||
1744 | <code>large</code>[1-4].<code>zip</code>, all of which are stored on |
||
1745 | the ftp machine <a |
||
1746 | href="ftp://ftp.cis.uab.edu/pub/hyatt/">ftp.cis.uab.edu/pub/hyatt/</a>. |
||
1747 | |||
1748 | <p>To create the file <code>book.bin</code>, you need a PGN game |
||
1749 | collection that is a *real* PGN-compliant file. Supposing this file |
||
1750 | is called "large.pgn" you would use the following command: |
||
1751 | |||
1752 | <center><strong>book create large.pgn</strong> <var><m></var> |
||
1753 | [<var>n</var>] [<var>wpct</var>]</center> |
||
1754 | |||
1755 | <p>The only thing you have to supply is <var><m></var>, |
||
1756 | a number indicating how many moves from each game are to be stored in |
||
1757 | the book.bin database. I typically use 60, which stores the first 60 |
||
1758 | moves from each game. Increasing this number slightly increases the |
||
1759 | probability that <cite>Crafty</cite> will stay in book longer, but it also |
||
1760 | increases the probability that it will follow a game too far, so that |
||
1761 | it begins to reach positions where the move actually played might not |
||
1762 | be the best move, letting it fall into a bad hole. Increasing this |
||
1763 | also increases the size of the database as well. |
||
1764 | |||
1765 | <p>You can decrease the size of the book, and also reduce the number |
||
1766 | of ugly moves by specifying [<var>n</var>], which says that unless a |
||
1767 | move is played in at least <var>n</var> games, the move is discarded. |
||
1768 | This will substantially decrease the size of the book.bin file, and |
||
1769 | also eliminate single game moves that often have significant errors or |
||
1770 | blunders. |
||
1771 | |||
1772 | <p>You can increase the quality of book lines by specifying |
||
1773 | <var>wpct</var> which is the "winning percentage". This is specified |
||
1774 | as a percentage of lost games, and is used to discard moves that led |
||
1775 | to mostly losses. A safe value is 50, which says that if a particular |
||
1776 | opening move didn't win at least 50% as many games as it lost, the |
||
1777 | move is culled. A value of 100 would mean that moves are culled if |
||
1778 | they produced more losses than wins, and is really a strict criterion. |
||
1779 | |||
1780 | <p>After creating <code>book.bin</code>, you need to create |
||
1781 | <code>books.bin</code>. This is a small version of |
||
1782 | <code>book.bin</code>, which is intended to give you more control over |
||
1783 | the moves/openings <cite>Crafty</cite> will play. This is usually |
||
1784 | built from the file <code>start.pgn</code> on the ftp machine, but you |
||
1785 | can modify this file to suit your taste easily. To build |
||
1786 | <code>books.bin</code>, you use the following command: |
||
1787 | |||
1788 | <center><strong>books create start.pgn 60</strong></center> |
||
1789 | |||
1790 | <p>Again, 60 is what I use, but none of my <code>start.pgn</code> |
||
1791 | lines go anywhere near that many moves. The main point here is that |
||
1792 | in <code>start.pgn</code>, you can append a "!" to any move you want, |
||
1793 | and when it is <cite>Crafty</cite>'s turn to move for that color, it |
||
1794 | will play from the set of moves with "!" if there are any, ignoring |
||
1795 | the rest of the book moves. If you only want it to play 1. e4 as |
||
1796 | White, you would just enter the short game: |
||
1797 | |||
1798 | <center><strong>[Crafty only plays 1. e4] |
||
1799 | 1. e4!</strong></center> |
||
1800 | |||
1801 | <p>and you are finished! You can enter as many as you want. If on |
||
1802 | the other hand there is a move you don't want <cite>Crafty</cite> to |
||
1803 | play, then follow that move with a "?" and it will never play it. |
||
1804 | Moves in <code>books.bin</code> that are not flagged with ! or ? don't |
||
1805 | have any influence on <cite>Crafty</cite>'s choice at all. |
||
1806 | |||
1807 | <p>Here's how the files are used. When searching a position, |
||
1808 | <cite>Crafty</cite> first enumerates the set of moves it can find in |
||
1809 | the opening database. It then does the same for the |
||
1810 | <code>books.bin</code> database, and performs a "merge" operation to |
||
1811 | combine the ? and ! flags... The purpose of the |
||
1812 | <code>books.bin</code> file is to give you a small database that you |
||
1813 | can easily modify, rebuild, and repeat this process over and over. |
||
1814 | Since it takes a fraction of a second to completely rebuild this file, |
||
1815 | it is very easy to modify this to control what <cite>Crafty</cite> |
||
1816 | will play, without having to rebuild the large database. |
||
1817 | |||
1818 | <p>One important characteristic of the PGN input is the Result tag |
||
1819 | must be specified in most of the lines, because <cite>Crafty</cite> |
||
1820 | counts wins, losses and draws for each book move and uses these counts |
||
1821 | with some of the book selection options given below. |
||
1822 | |||
1823 | |||
1824 | |||
1825 | <h3>How the flags are used.</h3> |
||
1826 | |||
1827 | The ! and ? flags should only appear in the small |
||
1828 | <code>books.bin</code> file, although there is no reason why they can |
||
1829 | not appear in the large file as well. For this discussion, it doesn't |
||
1830 | matter since <cite>Crafty</cite> takes the moves from both files and |
||
1831 | "merges" the flags, etc., into one entry for each move. |
||
1832 | |||
1833 | <p>Quite simply, if any book legal book move has a ! flag, then |
||
1834 | <cite>Crafty</cite> will only play moves from the set of moves which |
||
1835 | all have the ! flag. If a move has a ? flag, then that move is |
||
1836 | immediately removed from the set of possible book moves. If the only |
||
1837 | legal book move has a ? flag, it will not be played as a book move and |
||
1838 | <cite>Crafty</cite> will simply pretend that it found no book moves |
||
1839 | and will execute a normal tree search. Pretty simple. |
||
1840 | |||
1841 | |||
1842 | <h3> |
||
1843 | How to control the frequency of opening move selection.</h3> |
||
1844 | |||
1845 | A new feature in version 15.15 and beyond allows you to append a PGN |
||
1846 | comment to any move in a text file used to create |
||
1847 | <code>books.bin</code>, of the form <strong>{play</strong> |
||
1848 | <var>nn</var><strong>%}</strong>. This will force the move it follows |
||
1849 | to be played that percentage of the time, regardless of the normal |
||
1850 | book-ordering values based on frequency and so forth. |
||
1851 | |||
1852 | <p>Note that <strong>{play 0%}</strong> will not prevent a move from |
||
1853 | being played at all, as this will look just like a move with no |
||
1854 | percent specified. To avoid playing a move, use the ? flag. |
||
1855 | |||
1856 | |||
1857 | <h3> |
||
1858 | How does <cite>Crafty</cite> choose book moves?</h3> |
||
1859 | |||
1860 | <cite>Crafty</cite>'s book selection algorithm depends on two |
||
1861 | user-defined values that can be set at any time during a game: |
||
1862 | |||
1863 | <center><strong>book random</strong> <var><n></var></center> |
||
1864 | |||
1865 | <center><strong>book width</strong><var> <w></var></center> |
||
1866 | |||
1867 | <p>The selection algorithm first finds the set of legal book moves |
||
1868 | as above. This set will either be all ! moves, or will have no ! |
||
1869 | moves in it. This set is then sorted based on the setting of book |
||
1870 | random. Here's the options: |
||
1871 | |||
1872 | <p><strong>book random 0</strong>. This is a special case for book |
||
1873 | selection. <cite>Crafty</cite> simply takes the set of book moves, |
||
1874 | and searches only these moves using a normal alpha/beta search, but |
||
1875 | with a shorter than usual time limit. It then plays the move that |
||
1876 | produces the best search value. This has one serious disadvantage in |
||
1877 | that there is no randomness to this at all. It will always play the |
||
1878 | same move in the same position, unless the evaluation is modified, or |
||
1879 | the time per move is different enough to let the search find a |
||
1880 | different move from the book move set. |
||
1881 | |||
1882 | <p><strong>book random 1</strong>. This enables a random form of |
||
1883 | book move selection, but you have a lot of control over how moves are |
||
1884 | randomly chosen. The moves are ordered, based on 4 parameters: |
||
1885 | frequency of play, win/lose ratio, static evaluation and learned |
||
1886 | results. Normally these are factored into the value used to sort the |
||
1887 | moves, based on default settings that you can modify by using the |
||
1888 | command <strong>bookw</strong> <var><option> <N></var>, |
||
1889 | where <var><option></var> should be "freq", "ratio", "eval" or |
||
1890 | "learn". <var><N></var> should be a number between 0 and 1. |
||
1891 | |||
1892 | <p><cite>Crafty</cite> finds the min and max values for each of the |
||
1893 | 4 parameters, and then maps this into the range 0-1000 for each |
||
1894 | parameter. Each parameter is multiplied by the corresponding "weight" |
||
1895 | you have assigned, and this is used as a value to sort the moves from |
||
1896 | low to high. Note that the first sort value is always the "play |
||
1897 | percent" to move them to the top of the list. For moves with equal |
||
1898 | "play percent" values, the normal sort-value is used as the |
||
1899 | second-level sort variable (if no moves have a play-percent, then this |
||
1900 | second-level variable is the only one used, of course.) |
||
1901 | |||
1902 | <p>Once <cite>Crafty</cite> has sorted the moves as given above, it |
||
1903 | next excludes any book moves which have 0 wins. This culls the odd |
||
1904 | lines where a player chose a bad line and lost quickly. With zero |
||
1905 | wins, it will never be chosen, although <cite>Crafty</cite> will |
||
1906 | happily follow it from the other side. :) This is not anywhere near |
||
1907 | perfect, however, because an opening could have 1 win and 19 losses |
||
1908 | and that still would stay in the list. |
||
1909 | |||
1910 | <p>If a move has a learned value of > 100, this move is elevated |
||
1911 | in priority to that of a ! move, since it appears to win material |
||
1912 | instantly. If a value is < -100, it is given a ? since it appears |
||
1913 | to be a lemon. |
||
1914 | |||
1915 | <p>After this, the setting for <strong>book width</strong> |
||
1916 | <var><w></var> is used to keep the first |
||
1917 | <var><w></var> moves in the list, after the above culling |
||
1918 | has been completed. The smaller you make <var><w></var> |
||
1919 | the less randomness you get, but the chance of <cite>Crafty</cite> |
||
1920 | popping out a really bizarre book move gets smaller as well. |
||
1921 | |||
1922 | <p>After sorting, the final step is to fold in any mandatory "play |
||
1923 | percent" values. What this step does is that it finds all the moves |
||
1924 | in the "playable move set" just computed, which have no |
||
1925 | percent-to-play value set. It sums the sort-values for these moves, |
||
1926 | then adjusts the sort-values for the other moves so that their |
||
1927 | percentages will be honored. |
||
1928 | |||
1929 | <p>Once this has been done, <cite>Crafty</cite> simply uses the |
||
1930 | "sort value" for each move to compute a total for all moves. It then |
||
1931 | generates a random number between 1 and this limit, and chooses the |
||
1932 | move that this probability distribution matches. This will certainly |
||
1933 | evolve over time as new ideas are developed. |
||
1934 | |||
1935 | <p>For my play on ICC, I use <strong>book random 1</strong>, and |
||
1936 | <strong>book width 5</strong> normally, although for titled players |
||
1937 | this is reduced to <strong>book width 3</strong>. For computers, I |
||
1938 | reduce this further to <strong>2</strong>, to try to play reasonable |
||
1939 | openings and cull the gambits and things that don't work out. |
||
1940 | |||
1941 | |||
1942 | <h3> How does book learning work and how can I share learned |
||
1943 | results?</h3> |
||
1944 | |||
1945 | <p>1. *All* of <cite>Crafty</cite>'s "learned knowledge" is in the |
||
1946 | <code>book.bin</code> file. It keeps the learned value and learned |
||
1947 | count right in the book file for speed. You can't modify it, although |
||
1948 | <a href="#show"><strong>show book</strong></a> will make |
||
1949 | <cite>Crafty</cite> display all the book stuff before it makes a move. |
||
1950 | |||
1951 | <p>2. the <code>book.lrn</code> file has two purposes: (a) to |
||
1952 | serve as a log for your prying eyes, so you can see what it's learned, |
||
1953 | against whom, and what the score was that got its attention in the |
||
1954 | first place. The values on the end of each book line, inside the {} |
||
1955 | characters are as follows: |
||
1956 | |||
1957 | <center>{value, depth, rating_difference}</center> |
||
1958 | |||
1959 | <dl> |
||
1960 | |||
1961 | <dt> <strong>value</strong> is the value of the "key" search that |
||
1962 | comes from the first 10 moves out of book. It's in centipawns, and + |
||
1963 | is good - is bad.<dd> |
||
1964 | |||
1965 | <dt> <strong>depth</strong> is the depth the search reached at this "key" |
||
1966 | position, the deeper the search, the more the value is "trusted."<dd> |
||
1967 | |||
1968 | <dt> <strong>rating_difference</strong> is <cite>Crafty</cite>'s |
||
1969 | rating - opponent's rating a negative value means pay more attention |
||
1970 | to the score since the opponent is better than <cite>Crafty</cite>, a |
||
1971 | positive value means to take the score with a grain of salt, because |
||
1972 | the opponent was weaker than <cite>Crafty</cite>.<dd></dl> |
||
1973 | |||
1974 | |||
1975 | <p>You can delete this file at any time, and it has no effect on |
||
1976 | learning. As I mentioned, the learning takes place in |
||
1977 | <code>book.bin</code>... this is mainly for you to peek at if you are |
||
1978 | interested. However, this is the "portable learning data file" also, |
||
1979 | and can be given to others to import into their <cite>Crafty</cite>, |
||
1980 | where it will affect the opening book just like their |
||
1981 | <cite>Crafty</cite> had played the openings and got the same scores. |
||
1982 | There are two ways to use such "lrn" files: |
||
1983 | |||
1984 | <p>1. <a href="#import"><strong>import</strong></a> |
||
1985 | <strong><filename></strong> will read <filename> and |
||
1986 | import the knowledge therein into your book.bin. Since I use the same |
||
1987 | learning code as is used when playing games, this information also |
||
1988 | gets appended to *your* <code>book.lrn</code> file as well, so that |
||
1989 | your <code>book.lrn</code> always reflects *everything* your program |
||
1990 | has learned, so long as you don't ever remove this file. It would be |
||
1991 | a mistake to use this command on your own book.lrn file, because the |
||
1992 | things would get counted twice, which might or might not be a good |
||
1993 | thing. |
||
1994 | |||
1995 | <p>2. <a href="#import"<strong>import</strong></a> |
||
1996 | <strong><filename> clear</strong> will read <filename) and |
||
1997 | import the knowledge as above, but first clears *all* learned results |
||
1998 | from book.bin. you will want to do this if you import my book.lrn, |
||
1999 | *and*, you have contributed to my book.lrn data by sending me yours. |
||
2000 | I'll take care of eliminating duplicates if you screw up in what you |
||
2001 | send me, but once you send me something, you run the risk of getting |
||
2002 | it "back again" later. This is going to be a problem until everyone |
||
2003 | gets used to sharing something that is rather "vapid" like this |
||
2004 | "learned info" is... |
||
2005 | |||
2006 | <p>Other than that, we are now "open for business"... when the urge |
||
2007 | strikes you, email me your .lrn file, I'll keep a large master here |
||
2008 | and update it on occasion. Probably the best thing to do is to send |
||
2009 | me your .lrn and at the same *instant* delete yours. This will |
||
2010 | capture anything learned *after* you send me the file, but you'll get |
||
2011 | it all right back with the next version of book.lrn that I |
||
2012 | distribute. |
||
2013 | |||
2014 | <p>After getting this new book.lrn back, here's what you should |
||
2015 | do: |
||
2016 | |||
2017 | <p>1. rename your old <code>book.lrn</code> to something else. |
||
2018 | I'll call it "book.lrn.old" here. |
||
2019 | |||
2020 | <p>2. copy my blearn.dat to your machine, but *do not* put it in |
||
2021 | the directory with your <code>book.bin</code> and |
||
2022 | <code>books.bin</code> file because it will get confusing very quickly |
||
2023 | if you do. Put it somewhere else, because you are going to remove it |
||
2024 | quickly anyway. I'll call it new.lrn for this example. |
||
2025 | |||
2026 | <p>3.<pre><strong> |
||
2027 | import new.lrn clear |
||
2028 | import book.lrn.old</strong></pre> |
||
2029 | |||
2030 | and you are ready to rumble again. The first command clears the |
||
2031 | learned values, sucks in my new learn file and updates everything. |
||
2032 | the second command re-learns everything you've learned since you sent |
||
2033 | me the last book.lrn file. After doing this your book.lrn will have |
||
2034 | my .lrn stuff, plus your old.lrn stuff, just waiting to be sent to me |
||
2035 | again... |
||
2036 | |||
2037 | <p>If this is confusing, I can probably add an automatic command to |
||
2038 | do all of this by renaming book.lrn, etc. Hopefully this is not too |
||
2039 | error-prone for the time being anyway... |
||
2040 | |||
2041 | |||
2042 | <h3> |
||
2043 | What is this new Position Learning I've heard about?</h3> |
||
2044 | |||
2045 | <cite>Crafty</cite> now has a "permanent" hash table that is kept from |
||
2046 | game to game. A position gets into this "hash file" when |
||
2047 | <cite>Crafty</cite> executes a search and the search value is |
||
2048 | significantly lower than the last search value. |
||
2049 | |||
2050 | <p>When this happens, <cite>Crafty</cite> stores the current |
||
2051 | information for this position in the permanent hash file, which can |
||
2052 | hold up to 65536 positions. Once it fills up, the positions are |
||
2053 | replaced on a FIFO basis, always keeping the most recent 64K entries. |
||
2054 | |||
2055 | <p>Each time <cite>Crafty</cite> starts a search, the |
||
2056 | positions/scores from this file are stuffed into the normal |
||
2057 | transposition table, and used during the search just like any other |
||
2058 | table entry. Here's how it helps: In a game that was played, the |
||
2059 | following moves and scores were found by <cite>Crafty</cite> (playing |
||
2060 | White): |
||
2061 | |||
2062 | <p>1. Ng5 (+.277) h6 2. Nh7 (+.321) Kg8 3. Qh5 (+.133) Qg7 4. Ng5 |
||
2063 | (-2.122) hxg5 |
||
2064 | |||
2065 | <p>So, the knight got trapped at h7, and at move 4 |
||
2066 | <cite>Crafty</cite> discovered that this is gross and "learns" this |
||
2067 | result/position. |
||
2068 | |||
2069 | <p>We play the exact same game again: except that two things can |
||
2070 | happen here. |
||
2071 | |||
2072 | <p>1. It might be that g5 is the *only* square the knight can move |
||
2073 | to here, which means this whole thing is forced. The first search |
||
2074 | would find 1. Ng5 (-2.122) if the search can reach 8 plies deep, which |
||
2075 | happens even in 5 second games. It's learned that Ng5 is bad. It |
||
2076 | stores *this* position in the permanent hash file also, and the next |
||
2077 | time you try this same trap, it will discover 4-5 moves earlier that |
||
2078 | if the knight gets to g5 it is in trouble. Each game will diverge |
||
2079 | from the first game 3-4 moves earlier. Simple and effective. |
||
2080 | |||
2081 | <p>2. Ng5 might not be forced, and if not, it knows Ng5 loses a |
||
2082 | piece for a pawn, so it will promptly play something else, which is |
||
2083 | exactly what is desired. |
||
2084 | |||
2085 | <p>This is implemented with two (count 'em, two) files. One file |
||
2086 | "<code>position.bin</code>" is a binary file that contains the hash |
||
2087 | table entries, and it right at one megabyte in size, *max*. (16 bytes |
||
2088 | per hash entry X 65536 entries = exactly one meg, but I have 8 extra |
||
2089 | bytes for the FIFO queue implementation and to see how many entries |
||
2090 | are currently in the file if it is not full. |
||
2091 | |||
2092 | <p>The second file is "<code>position.lrn</code>" and is, you |
||
2093 | guessed it, a file that can be shared with others, just like book.lrn. |
||
2094 | It contains all information needed to reconstruct the position, the |
||
2095 | score, the depth, etc. and also included the pgn tags for who was |
||
2096 | what color and when the game was played... |
||
2097 | |||
2098 | <p>This data can be imported with the new <a |
||
2099 | href="#import"><strong>import</strong></a> command (the old book learn |
||
2100 | <filename> is no longer around) which will import either |
||
2101 | book.lrn type data or position.lrn type data and can tell them apart |
||
2102 | without your having to do anything. The [<strong>clear</strong>] |
||
2103 | option is still there, should you want to use it, and simply removes |
||
2104 | the position.lrn and position.bin files before starting the import |
||
2105 | process for position learning. |
||
2106 | |||
2107 | <p>This can be turned off, if you like, by checking out the <a |
||
2108 | href="#learn"><strong>learn</strong></a> command, which gives you the |
||
2109 | ability to turn off book learning (as it presently works), position |
||
2110 | learning, and the next book learning stage which will add to the book |
||
2111 | in addition to learning which book lines are good and bad. |
||
2112 | |||
2113 | |||
2114 | <h3> |
||
2115 | What is this new "result" learning?</h3> |
||
2116 | |||
2117 | Result learning works just like normal book learning, except |
||
2118 | that if <cite>Crafty</cite> is checkmated or resigns, it will step back |
||
2119 | through the book line to find the last point where it had |
||
2120 | more than one move to choose from. It will flag the move it |
||
2121 | chose as "never play again". |
||
2122 | |||
2123 | <p>This handles the case where the first ten non-book moves produce |
||
2124 | reasonable scores, but the position is one that <cite>Crafty</cite> |
||
2125 | simply can't handle very well. If it loses such a game, it will still |
||
2126 | vary the next time this opening is played, as otherwise it would |
||
2127 | possibly repeat the same opening, and would certainly repeat the |
||
2128 | remainder of the game. |
||
2129 | |||
2130 | <p>All three learning modes are turned on by default, although any |
||
2131 | of them can be disabled with the appropriate command option to <a |
||
2132 | href="#learn"><strong>learn</strong></a>. |
||
2133 | |||
2134 | |||
2135 | <hr> |
||
2136 | <address></address> |
||
2137 | <!-- hhmts start --> Last modified: Sat Dec 20 01:41:05 EST 2003 <!-- hhmts end --> |
||
2138 | </body> </html> |