[packages/crafty] - updated to 25.2 - updated paths,security patches - removed outdated Makefile patch - added portabl
qboosh
qboosh at pld-linux.org
Sun Nov 17 13:10:36 CET 2019
commit f86d9ab97bcdd8f192274f1a76f8f46b6d7da9b0
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Sun Nov 17 12:54:48 2019 +0100
- updated to 25.2
- updated paths,security patches
- removed outdated Makefile patch
- added portable patch (allow building not only on x86_64)
- added spelling patch (typo fix from Debian)
crafty-Makefile.patch | 49 --
crafty-paths.patch | 154 +++-
crafty-portable.patch | 15 +
crafty-security.patch | 33 +-
crafty-spelling.patch | 11 +
crafty.doc.ascii | 2112 -------------------------------------------------
crafty.spec | 98 ++-
7 files changed, 219 insertions(+), 2253 deletions(-)
---
diff --git a/crafty.spec b/crafty.spec
index 5e5520d..f1d05a8 100644
--- a/crafty.spec
+++ b/crafty.spec
@@ -1,31 +1,33 @@
# TODO:
-# - update to 21.6
# - executable should be sgid games?
Summary: Superior chess program by Bob Hyatt for Unix systems
Summary(pl.UTF-8): Jeden z lepszych programów szachowych dla uniksów autorstwa Boba Hyatta
Name: crafty
-Version: 23.4
+Version: 25.2
Release: 1
-License: GPL
+License: Personal use only (see COPYRIGHT)
Group: Applications/Games
-Source0: ftp://ftp.cis.uab.edu/pub/hyatt/source/%{name}-%{version}.zip
-# Source0-md5: 7e0811dd2d801428d8da48a4e487885a
-Source1: ftp://ftp.cis.uab.edu/pub/hyatt/documentation/%{name}.doc.ascii
-# NoSource1-md5: 5fd73027a1de1674763562e1987197ba
-Source2: ftp://ftp.cis.uab.edu/pub/hyatt/documentation/%{name}.doc.ps
-# Source2-md5: 6cef69aa2f9ea1ceb74b6c14edc8291f
-Source3: %{name}.desktop
-Source4: xchess.png
+Source0: http://www.craftychess.com/downloads/source/%{name}-%{version}.zip
+# Source0-md5: d8ad87d9b0fc39a437595203d7b302fc
+Source1: http://www.craftychess.com/documentation/craftydoc.html
+# Source1-md5: 584ef65843016328d67a7c9df4007e87
+Source2: http://www.craftychess.com/downloads/book/book.pgn.gz
+# Source2-md5: 05efad71289b2d328da5110df4a19f85
+Source3: http://www.craftychess.com/downloads/book/start.pgn.gz
+# Source3-md5: 880279c223dc34164837a351faafe2f0
+Source4: http://www.craftychess.com/downloads/book/startc.pgn.gz
+# Source4-md5: 7a53d5f09d2baa5e7f0df4ee81961cfb
Source5: %{name}-misc.tar.bz2
# Source5-md5: 28072241d4978a532ac3ef536b02557c
Source6: %{name}-bitmaps.tar.gz
# Source6-md5: e3e94a914f02dfe8b237b1de7376749e
-Source7: ftp://ftp.cis.uab.edu/pub/hyatt/book/book.bin
-# Source7-md5: 6d527840579904bf0e0b0a456a580a9b
+Source7: %{name}.desktop
+Source8: xchess.png
Patch0: %{name}-paths.patch
-Patch1: %{name}-Makefile.patch
-Patch2: %{name}-security.patch
-URL: http://www.limunltd.com/crafty/
+Patch1: %{name}-security.patch
+Patch2: %{name}-portable.patch
+Patch3: %{name}-spelling.patch
+URL: http://www.craftychess.com/
BuildRequires: libstdc++-devel
BuildRequires: sed >= 4.0
BuildRequires: unzip
@@ -47,41 +49,33 @@ Crafty to uniksowy program szachowy rozpowszechniany w postaci
często wygrywa z GNU Chess na tym samym sprzęcie.
%prep
-%setup -q -a5 -a6
+%setup -q -c -a5 -a6
%patch0 -p0
%patch1 -p0
%patch2 -p0
-mv doc/read.me README
-mv doc/* .
-mv bitmaps/README.bitmaps .
-rm -f bitmaps/gifs.tar
-cp %{SOURCE1} %{SOURCE2} .
-cp %{SOURCE7} .
-
-sed 's at .*machine/builtins.*@@' -i chess.h
+%patch3 -p0
+%{__mv} doc/read.me README
+%{__mv} doc/* .
+%{__mv} bitmaps/README.bitmaps .
+%{__rm} bitmaps/gifs.tar
+cp -p %{SOURCE1} .
+zcat %{SOURCE2} > book.pgn
+zcat %{SOURCE3} > start.pgn
+zcat %{SOURCE4} > startc.pgn
+
+%{__sed} -ne '/Crafty, copyright/,/ as stated previously/ p' main.c > COPYRIGHT
+%{__sed} -ne '/version description/,/^\*\*\*/ p; /^ \*\// q' main.c > ChangeLog
%build
-asmobj=""
-optarch=""
-target="LINUX"
-%ifarch %{ix86}
-optarch="-DUSE_ASSEMBLY_A -DUSE_ASSEMBLY_B"
-asmobj="X86-elf.o"
-%endif
-%ifarch alpha
-target="ALPHA"
-%endif
%{__make} crafty-make \
- target="$target" \
CC="%{__cc}" \
CXX="%{__cxx}" \
CFLAGS="%{rpmcflags} -Wall -pipe -D_REENTRANT" \
- LDFLAGS="%{rpmldflags} -lpthread" \
- opt="-DCOMPACT_ATTACKS -DUSE_ATTACK_FUNCTIONS $optarch -DFAST" \
- asm="$asmobj"
+ LDFLAGS="%{rpmldflags} -pthread" \
+ opt="-DCPUS=4 -DSYZYGY" \
+ target=UNIX
sh make_books
-#mv large_book.bin book.bin
%install
rm -rf $RPM_BUILD_ROOT
@@ -92,15 +86,15 @@ install crafty $RPM_BUILD_ROOT%{_bindir}
install xcrafty $RPM_BUILD_ROOT%{_bindir}
install speak $RPM_BUILD_ROOT%{_bindir}/crafty-speak
-install book.bin books.bin crafty.hlp $RPM_BUILD_ROOT%{_datadir}/%{name}
-install bitmaps/* $RPM_BUILD_ROOT%{_datadir}/%{name}/bitmaps
-install tb/*.emd $RPM_BUILD_ROOT%{_datadir}/%{name}/tb
+cp -p book.bin bookc.bin books.bin crafty.hlp $RPM_BUILD_ROOT%{_datadir}/%{name}
+cp -p bitmaps/* $RPM_BUILD_ROOT%{_datadir}/%{name}/bitmaps
+cp -p tb/*.emd $RPM_BUILD_ROOT%{_datadir}/%{name}/tb
-install crafty.6 $RPM_BUILD_ROOT%{_mandir}/man6
+cp -p crafty.6 $RPM_BUILD_ROOT%{_mandir}/man6
echo ".so crafty.6" > $RPM_BUILD_ROOT%{_mandir}/man6/xcrafty.6
-install %{SOURCE3} $RPM_BUILD_ROOT%{_desktopdir}
-install %{SOURCE4} $RPM_BUILD_ROOT%{_pixmapsdir}
+cp -p %{SOURCE7} $RPM_BUILD_ROOT%{_desktopdir}
+cp -p %{SOURCE8} $RPM_BUILD_ROOT%{_pixmapsdir}
touch $RPM_BUILD_ROOT/var/lib/%{name}/book.lrn \
$RPM_BUILD_ROOT/var/lib/%{name}/position.{bin,lrn}
@@ -114,8 +108,9 @@ rm -rf $RPM_BUILD_ROOT
%files
%defattr(644,root,root,755)
-%doc crafty.doc* crafty.faq README* small.txt start.pgn tournament.howto
-%attr(755,root,root) %{_bindir}/crafty*
+%doc COPYRIGHT ChangeLog README* crafty.doc crafty.faq craftydoc.html tournament.howto
+%attr(755,root,root) %{_bindir}/crafty
+%attr(755,root,root) %{_bindir}/crafty-speak
%attr(755,root,root) %{_bindir}/xcrafty
%dir %{_datadir}/%{name}
%{_datadir}/%{name}/*.bin
@@ -130,6 +125,7 @@ rm -rf $RPM_BUILD_ROOT
%attr(660,root,games) %config(noreplace) %verify(not md5 mtime size) /var/lib/%{name}/book.lrn
%attr(660,root,games) %config(noreplace) %verify(not md5 mtime size) /var/lib/%{name}/position.bin
%attr(660,root,games) %config(noreplace) %verify(not md5 mtime size) /var/lib/%{name}/position.lrn
-%{_mandir}/man6/*.6*
-%{_desktopdir}/*.desktop
-%{_pixmapsdir}/*
+%{_mandir}/man6/crafty.6*
+%{_mandir}/man6/xcrafty.6*
+%{_desktopdir}/crafty.desktop
+%{_pixmapsdir}/xchess.png
diff --git a/crafty-Makefile.patch b/crafty-Makefile.patch
deleted file mode 100644
index a9744e9..0000000
--- a/crafty-Makefile.patch
+++ /dev/null
@@ -1,49 +0,0 @@
---- Makefile.orig 2010-03-06 22:16:20.000000000 +0100
-+++ Makefile 2010-03-06 22:38:29.000000000 +0100
-@@ -108,19 +108,19 @@
- linux-amd64-profile:
- $(MAKE) target=LINUX \
- CC=gcc CXX=g++ \
-- CFLAGS='-Wall -pipe -fprofile-arcs -fomit-frame-pointer -O3 -march=k8' \
-+ CFLAGS='-Wall -pipe -fprofile-arcs -fomit-frame-pointer -O3' \
- CXFLAGS='' \
-- LDFLAGS='$(LDFLAGS) -lpthread -lnuma -fprofile-arcs -lstdc++' \
-- opt='$(opt) -DINLINE64 -DCPUS=8 -DNUMA -DLIBNUMA' \
-+ LDFLAGS='$(LDFLAGS) -lpthread -pthreads -fprofile-arcs -lstdc++' \
-+ opt='$(opt) -DINLINE64 -DCPUS=8' \
- crafty-make
-
- linux-amd64:
- $(MAKE) target=LINUX \
- CC=gcc CXX=g++ \
-- CFLAGS='-Wall -pipe -fbranch-probabilities -fomit-frame-pointer -O3 -march=k8' \
-+ CFLAGS='-Wall -pipe -fbranch-probabilities -fomit-frame-pointer -O3' \
- CXFLAGS='' \
-- LDFLAGS='$(LDFLAGS) -lpthread -lnuma -lstdc++' \
-- opt='$(opt) -DINLINE64 -DCPUS=8 -DNUMA -DLIBNUMA' \
-+ LDFLAGS='$(LDFLAGS) -lpthread -pthread -lstdc++' \
-+ opt='$(opt) -DINLINE64 -DCPUS=8' \
- crafty-make
-
- linux:
-@@ -128,8 +128,8 @@
- CC=gcc CXX=g++ \
- CFLAGS='-pg -Wall -pipe' \
- CXFLAGS='' \
-- LDFLAGS='$(LDFLAGS) -pg -lstdc++ -lpthread' \
-- opt='$(opt) -DTRACE -DINLINE64 -DCPUS=2' \
-+ LDFLAGS='$(LDFLAGS) -pg -lstdc++ -pthread -lpthread' \
-+ opt='$(opt) -DTRACE -DINLINE32 -DCPUS=2' \
- crafty-make
-
- linux-profile:
-@@ -322,7 +322,7 @@
- crafty.o: *.c *.h
-
- crafty: $(objects) egtb.o
-- $(CC) $(LDFLAGS) -o crafty $(objects) egtb.o -lm $(LIBS)
-+ $(CXX) $(LDFLAGS) -o crafty $(objects) egtb.o -lm $(LIBS)
-
- egtb.o: egtb.cpp
- $(CXX) -c $(CXFLAGS) $(opts) egtb.cpp
-
diff --git a/crafty-paths.patch b/crafty-paths.patch
index 097867f..d4a79f0 100644
--- a/crafty-paths.patch
+++ b/crafty-paths.patch
@@ -1,30 +1,28 @@
---- chess.h.org 2010-11-08 19:07:43.000000000 +0100
-+++ chess.h 2012-05-07 20:13:11.000000000 +0200
-@@ -110,13 +110,13 @@
- # define UNIX /* system is unix-based */
+--- chess.h.orig 2019-11-14 18:45:24.015435698 +0100
++++ chess.h 2019-11-14 18:52:10.289901387 +0100
+@@ -62,17 +62,20 @@
+ # endif
# endif
# if !defined(BOOKDIR)
--# define BOOKDIR "."
-+# define BOOKDIR "/usr/share/crafty"
+-# define BOOKDIR "."
++# define BOOKDIR "/usr/share/crafty"
# endif
# if !defined(LOGDIR)
- # define LOGDIR "."
+ # define LOGDIR "."
# endif
# if !defined(TBDIR)
--# define TBDIR "./TB"
-+# define TBDIR "/usr/share/crafty/TB"
+-# define TBDIR "./syzygy"
++# define TBDIR "/usr/share/crafty/syzygy"
# endif
# if !defined(RCDIR)
- # define RCDIR "."
-@@ -684,7 +684,7 @@
- # include "inline32.h"
- # endif
- # if defined(UNIX)
--# define SPEAK "./speak "
-+# define SPEAK "/usr/bin/crafty-speak "
- # else
- # define SPEAK ".\\Speak.exe "
+ # define RCDIR "."
# endif
++# if !defined(SPEAK_CMD)
++# define SPEAK_CMD "/usr/bin/crafty-speak"
++# endif
+ # include "lock.h"
+ # define MAXPLY 129
+ # define MAX_TC_NODES 3000000
--- option.c.orig 2010-03-04 03:11:14.000000000 +0100
+++ option.c 2010-03-06 22:15:00.000000000 +0100
@@ -1038,7 +1038,7 @@
@@ -36,3 +34,123 @@
if (!helpfile) {
printf("ERROR. Unable to open \"crafty.hlp\" -- help unavailable\n");
return (1);
+--- analyze.c.orig 2019-11-14 18:56:09.495272167 +0100
++++ analyze.c 2019-11-14 18:56:11.901925796 +0100
+@@ -146,10 +146,7 @@
+ Print(32, "%s\n", outmove);
+ if (speech) {
+ char announce[64];
+-
+- strcpy(announce, "./speak ");
+- strcat(announce, outmove);
+- strcat(announce, " &");
++ snprintf(announce, sizeof(announce), "%s %s &", SPEAK_CMD, outmove);
+ v = system(announce);
+ if (v != 0)
+ perror("Analyze() system() error: ");
+--- main.c.orig 2016-10-27 22:11:42.000000000 +0200
++++ main.c 2019-11-14 19:06:40.188522076 +0100
+@@ -4698,8 +4698,7 @@
+ if (audible_alarm)
+ printf("%c", audible_alarm);
+ if (speech) {
+- strcpy(announce, "./speak ");
+- strcat(announce, "Drawaccept");
++ snprintf(announce, sizeof(announce), "%s Drawaccept", SPEAK_CMD);
+ v = system(announce);
+ if (v != 0)
+ perror("main() system() error: ");
+@@ -4711,8 +4710,7 @@
+ if (!xboard) {
+ Print(1, "Draw declined.\n");
+ if (speech) {
+- strcpy(announce, "./speak ");
+- strcat(announce, "Drawdecline");
++ snprintf(announce, sizeof(announce), "%s Drawdecline", SPEAK_CMD);
+ v = system(announce);
+ if (v != 0)
+ perror("main() system() error: ");
+@@ -4748,8 +4746,7 @@
+ strcpy(pgn_result, "1-0");
+ }
+ if (speech) {
+- strcpy(announce, "./speak ");
+- strcat(announce, "Checkmate");
++ snprintf(announce, sizeof(announce), "%s Checkmate", SPEAK_CMD);
+ v = system(announce);
+ if (v != 0)
+ perror("main() system() error: ");
+@@ -4759,8 +4756,7 @@
+ if (!xboard) {
+ Print(1, "stalemate\n");
+ if (speech) {
+- strcpy(announce, "./speak ");
+- strcat(announce, "Stalemate");
++ snprintf(announce, sizeof(announce), "%s Stalemate", SPEAK_CMD);
+ v = system(announce);
+ if (v != 0)
+ perror("main() system() error: ");
+@@ -4802,9 +4798,7 @@
+ if (speech) {
+ char *moveptr = OutputMove(tree, 0, game_wtm, last_pv.path[1]);
+
+- strcpy(announce, "./speak ");
+- strcat(announce, moveptr);
+- strcat(announce, " &");
++ snprintf(announce, sizeof(announce), "%s %s &", SPEAK_CMD, moveptr);
+ v = system(announce);
+ if (v != 0)
+ perror("main() system() error: ");
+--- resign.c.orig 2016-10-27 22:11:42.000000000 +0200
++++ resign.c 2019-11-14 19:08:06.374721832 +0100
+@@ -109,8 +109,7 @@
+ if (speech) {
+ char announce[128];
+
+- strcpy(announce, "./speak ");
+- strcat(announce, "Resign");
++ snprintf(announce, sizeof(announce), "%s Resign", SPEAK_CMD);
+ v = system(announce);
+ if (v <= 0)
+ perror("ResignOrDraw() system() error: ");
+@@ -132,8 +131,7 @@
+ if (speech) {
+ char announce[128];
+
+- strcpy(announce, "./speak ");
+- strcat(announce, "Drawoffer");
++ snprintf(announce, sizeof(announce), "%s Drawoffer", SPEAK_CMD);
+ v = system(announce);
+ if (v <= 0)
+ perror("ResignOrDraw() system() error: ");
+--- annotate.c.orig 2016-10-27 22:11:42.000000000 +0200
++++ annotate.c 2019-11-15 21:38:33.684414406 +0100
+@@ -557,7 +557,7 @@
+ fprintf(annotate_out, "</HTML>\n");
+ }
+ void AnnotatePositionHTML(TREE * RESTRICT tree, int wtm, FILE * annotate_out) {
+- char filename[32], html_piece;
++ char filename[64], html_piece;
+ char alt[32];
+ int rank, file;
+
+@@ -567,7 +567,7 @@
+ for (rank = RANK8; rank >= RANK1; rank--) {
+ fprintf(annotate_out, "<TR>\n");
+ for (file = FILEA; file <= FILEH; file++) {
+- strcpy(filename, "bitmaps/");
++ strcpy(filename, "/usr/share/crafty/bitmaps/");
+ if ((rank + file) % 2)
+ strcat(filename, "w");
+ else
+--- make_books.orig 2003-02-15 13:10:34.000000000 +0100
++++ make_books 2019-11-15 19:08:06.169987317 +0100
+@@ -7,4 +7,7 @@
+ echo "books create start.pgn 60" | ./crafty
+
+ # create book.bin (opening book)
+-echo "book create small.txt 60 3" | ./crafty
++echo "book create book.pgn 60 3" | ./crafty
++
++# create bookc.bin (computer opening book)
++echo "bookc create startc.pgn 60 3" | ./crafty
diff --git a/crafty-portable.patch b/crafty-portable.patch
new file mode 100644
index 0000000..ad10b62
--- /dev/null
+++ b/crafty-portable.patch
@@ -0,0 +1,15 @@
+--- tbprobe.c.orig 2016-10-27 22:11:42.000000000 +0200
++++ tbprobe.c 2019-11-14 21:37:58.862672013 +0100
+@@ -108,8 +108,12 @@
+ #define board(s) ((uint64_t)1 << (s))
+ static inline unsigned _lsb(uint64_t b) {
++#ifdef __x86_64__
+ size_t idx;
+ __asm__("bsfq %1, %0": "=r"(idx):"rm"(b));
+ return idx;
++#else
++ return ffsll(b) - 1;
++#endif
+ }
+
+ #define square(r, f) (8 * (r) + (f))
diff --git a/crafty-security.patch b/crafty-security.patch
index d21a281..c6b0ea3 100644
--- a/crafty-security.patch
+++ b/crafty-security.patch
@@ -1,30 +1,18 @@
---- main.c.orig 2010-03-04 03:12:14.000000000 +0100
-+++ main.c 2010-03-06 22:34:46.000000000 +0100
-@@ -3888,7 +3888,10 @@
- if (argc > 1) {
+--- main.c.orig 2019-11-15 20:01:15.292710356 +0100
++++ main.c 2019-11-15 20:08:22.987060003 +0100
+@@ -4308,7 +4308,10 @@
for (i = 1; i < argc; i++) {
- if (strstr(argv[i], "path") || strstr(argv[i], "log")) {
+ if (strstr(argv[i], "path") || strstr(argv[i], "log") ||
+ strstr(argv[1], "affinity")) {
- strcpy(buffer, argv[i]);
-+ //This is a security flaw (see http://bugs.debian.org/203541
-+ //strcpy(buffer, argv[i]);
-+ memset(buffer,'\0',sizeof(buffer));
++ //This is a security flaw (see http://bugs.debian.org/203541
++ //strcpy(buffer, argv[i]);
++ memset(buffer,'\0',sizeof(buffer));
+ strncpy(buffer,argv[i],sizeof(buffer)-1);
result = Option(tree);
if (result == 0)
- printf("ERROR \"%s\" is unknown command-line option\n", buffer);
-@@ -3967,7 +3970,10 @@
- for (i = 1; i < argc; i++)
- if (strcmp(argv[i], "c"))
- if (!strstr(argv[i], "path")) {
-- strcpy(buffer, argv[i]);
-+ //This is a security flaw (see http://bugs.debian.org/203541
-+ //strcpy(buffer, argv[i]);
-+ memset(buffer,'\0',sizeof(buffer));
-+ strncpy(buffer,argv[i],sizeof(buffer)-1);
- result = Option(tree);
- if (result == 0)
- printf("ERROR \"%s\" is unknown command-line option\n", buffer);
-@@ -3996,11 +4002,16 @@
+ Print(2048, "ERROR \"%s\" is unknown command-line option\n",
+@@ -4328,11 +4331,16 @@
*/
#if defined(UNIX)
input_stream = fopen(".craftyrc", "r");
@@ -42,4 +30,3 @@
if (input_stream)
#else
sprintf(crafty_rc_file_spec, "%s/crafty.rc", rc_path);
-
diff --git a/crafty-spelling.patch b/crafty-spelling.patch
new file mode 100644
index 0000000..b50b450
--- /dev/null
+++ b/crafty-spelling.patch
@@ -0,0 +1,11 @@
+--- option.c.orig 2019-11-15 20:09:00.500190110 +0100
++++ option.c 2019-11-15 21:39:46.887351164 +0100
+@@ -1404,7 +1404,7 @@
+ nargs--;
+ targs++;
+ } else
+- printf("error, name must be preceeded by +/- flag.\n");
++ printf("error, name must be preceded by +/- flag.\n");
+ nargs--;
+ targs++;
+ }
diff --git a/crafty.doc.ascii b/crafty.doc.ascii
deleted file mode 100644
index dda0725..0000000
--- a/crafty.doc.ascii
+++ /dev/null
@@ -1,2112 +0,0 @@
-
-
-
-
-
-
-
- Crafty Command Documentation (version 18)
- -----------------------------------------------
-Crafty is nothing more than a long-time hobby of mine, dat-
-ing back to Blitz and later Cray Blitz. People ask me how I
-keep doing this, and that is the one question that generally
-leaves me at a loss for words.
-
-Perhaps the most common question I'm asked is "is this ver-
-sion of Crafty some dumbed-down version of what you play on
-ICC or what you use at a computer chess event?" The answer
-is a resounding *NO*. The current version is *exactly* what
-is running on ICC under this version number. Note that a
-new version can, on occasion, introduce weaknesses or out-
-right bugs that were not present in previous "gold" ver-
-sions. As a result, you should be careful to back up your
-"favorite" before trying the latest and greatest. If you
-aren't satisfied with the new version, you can then go back
-to what you believe is a better version.
-
-If you are looking for the strongest playing computer chess
-program available, you should likely look to Fritz, Rebel,
-Tiger, and the other commercial entries. There you will
-find strong opponents with polished interfaces that have
-been tested in a systematic and careful way. If you are
-looking for a program that plays good chess, has a reason-
-able set of features for you to use, is available in source
-form, and one where the author welcomes feedback, code or
-suggestions, then you are at the right place. I welcome
-comments and suggestions, and also feedback from ideas you
-try yourself that seem to work.
-
-Crafty is a state-of-the-art computer chess program, and
-uses all of the search algorithms you have probably read
-about, negascout search, killer/history move ordering, SEE
-(Static Exchange Evaluation) quiescence move ordering and
-pruning, hash (transposition/refutation) tables as well as
-evaluation caches, selective extensions, recursive null-move
-search, and a host of other features that have been used and
-are still being used in most computer chess programs. If
-it's not in Crafty, either it is on the "to do" list, or it
-has been tried, found wanting, and discarded.
-
-Chess Knowledge is growing, and suggestions (or even better,
-real code) are welcome. This is the best place to con-
-tribute your ideas, because knowledge can be used to sup-
-plant search and make it play better. The evaluation is
-probably the easiest place to start studying Crafty because
-of the comments and simplicity of using bitmaps, *once* you
-get "into" them.
-
-My purpose for doing this is an exercise in computer chess
-efficiency. I can't begin to count the number of people I
-know that started from scratch to write a chess program.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Even larger is the group that started from scratch, and gave
-up before finishing, because of the basic size of the pro-
-ject.
-
-Crafty offers everyone a very clean starting point, if you
-are fascinated by the bitmap chess board implementation (as
-I am). The search and quiescence code is reasonably
-straightforward, as is the evaluation,
-
-It offers a great starting point, so that if you are inter-
-ested in trying a new search extension, you can be testing
-tomorrow, rather than next year, because you start with a
-fully functional chess engine that is not a "toy" applica-
-tion, but is a functional and "dangerous" chess player. It
-offers a rapid start, although you can certainly replace it
-piece by piece until it is "yours" if you want. It also
-offers a fairly complete set of commands and an interface
-for a GUI as well as support for chess server play, so that
-testing and debugging your new ideas is greatly simplified.
-
-If you'd like more information, please check out the read.me
-document and the crafty.FAQ that are distributed with
-Crafty. These contain recent news and specific instructions
-for commonly asked questions, like "where can I obtain
-tablebase files and how do I use them?"
- How to play a game.
- -------------------
-When you execute Crafty, you will immediately be greeted by
-the prompt string "white(1): " and Crafty will wait for com-
-mands. This prompt means it is white on move, and we are at
-move #1 for white. You can first use any of the commands
-from the alphabetic command listing below to tailor the game
-to your liking (time control, hash table size, book random-
-ness, etc.) and then you have two choices. If you want to
-play white, just enter your move, and Crafty will take it
-from there and make a move in response. You will then be
-prompted by "white(2):" and it is your move again. If you
-would prefer to play black, just enter either "move" or "go"
-at the prompt and crafty will move for that side rather than
-accepting a move from you. After it makes its move for
-white, you will then see the prompt "black(1): " indicating
-it is now time for blacks first move. You can enter a move,
-or you can once again enter "move" or "go" and Crafty will
-again move for the current side, change sides, and prompt
-you for what to do next.
-
-If you find yourself continually using a set of commands to
-configure crafty to play as you want, you can put these com-
-mands in a startup file called .craftyrc (Unix) or crafty.rc
-(DOS/Windows). The format for this file is just like you
-would type the commands at the keyboard, with the require-
-ment that the last line of the file must be "exit" on a line
-by itself. Using this, each time you start Crafty, it will
-
-
-
-
-
-
-
-
-
-
-
-
-
-first execute the commands from this file before it prompts
-you for input.
-
-While Crafty is running, you can control what it displays,
-but here's a couple of samples to explain what it is saying
-and why:
-
- depth time score variation (1)
- book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5}
- book 0.0s 70% d4
-
-White(3): d4
- time used: 0.01
-
-This is the normal output for those cases where Crafty is in
-book. The book moves line gives the set of book moves that
-made the first selection cut (see the book selection expla-
-nation given later), followed by the move actually played,
-in this case d4.
-
-If Crafty is out of book, then the output looks somewhat
-different as given below:
-
- depth time score variation (1)
- 4-> 0.81 2.09 6. dxe4 Bxe4 7. Rad8 Qf2 8. Qb5
- 5 1.37 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+
-Qxe4 9. f5
- 5-> 1.88 2.41 6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+
-Qxe4 9. f5
- 6 7.38 -- 6. dxe4
- 6 11.90 1.97 6. dxe4 Bxe4 7. Rab8 Qf2 8. Qc7
-Nc5 9. Qe5
- 6 12.92 ++ 6. Ne5
- 6 13.71 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
- 6-> 15.59 2.23 6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
- time: 15.60 cpu:99% mat:1 n:246565 nps:15927
- ext-> checks:4706 recaps:1336 pawns:0 1rep:301
- nodes full:45951 quiescence:200614 evals:104657
- endgame tablebase-> probes done: 0 successful: 0
-
-Let's take this stuff one line at a time. Lines that have
-something like 4-> in the depth column are printed when that
-iteration (depth) is completely finished. The time and
-score columns should be obvious as to their meaning as is
-the PV, the sequence of moves that led to this score. One
-note about the "score" column. As of version 18, Crafty
-displays the score with + values good for white, - values
-good for black, no matter which side it is playing in the
-game. All output now follows this convention, from playing,
-to analysis mode, to annotating your games, to whisper-
-ing/kibitzing on the chess servers, and so forth. This is
-unlike other engines, but once you get used to it, it is
-much less confusing when you remember that negative scores
-
-
-
-
-
-
-
-
-
-
-
-
-
-are good for black and bad for white, and vice-versa.
-
-the line that has -- in the score column means that when we
-started depth 6, dxe4 turned out to be worse than we thought
-(notice score dropped from 2.411 last search to 1.972 for
-this move this search.) To resolve this, Crafty lowers the
-lower search bound (alpha) and re-searches the move to find
-the score. The line with ++ means that this move (Ne5) is
-better than the best move so far, so Crafty raises the upper
-search bound (beta) and re-searches this move to find the
-new score.
-
-the first line of statistics gives the total time taken for
-this search, the cpu percentage which should stay at 98-100%
-unless your machine is heavily loaded or unless Crafty is in
-an endgame that is having lots of contact with endgame
-databases. If this drops below 98%, it means that Crafty is
-not getting full CPU usage and will be playing weaker than
-normal. The mat:1 is simply the true material score, since
-Crafty's positional scores are often larger than a pawn.
-
- Alphabetic Listing of Commands
- ------------------------------
-
-1. alarm on|off This command is used to control Crafty's
-"beep" after it makes a move. Turning this off will make
-Crafty "quiet" when it plays, but also makes it easy to miss
-a move if you are using crafty to play in a tournament.
-This is primarily designed to make Crafty tolerable during
-late night matches.
-
-2. analyze This command puts crafty into analyze mode. In
-this mode, Crafty starts computing for whichever side is on
-move, and it continues computing and showing its analysis
-until a move is entered. This move is made, Crafty changes
-sides, and starts thinking and printing analysis all over,
-but for the other side now.
-
-This command is useful to play through a game, because you
-get instant feedback when you try a move. If you want to
-try a different move from the one you just entered, use the
-"back" command to back up one move, or use "back <n>" to
-back up <n> moves. Note that one move is a single move for
-the last player, not a move for both sides. To unmake the
-most recent 2 moves (one for black, one for white) use "back
-2".
-
-3. annotate|annotateh <filename> <colors|name> <moves>
-<margin> <time> This command is used to annotate (make com-
-ments in) a game that has already been played.
-
-The annotate command produces a file with the .can extension
-added to the original name. This file will contain pure
-
-
-
-
-
-
-
-
-
-
-
-
-
-ascii information from the annotation pass. "annotateh"
-produces an HTML file instead (with the .html extension).
-This includes the normal output, plus a nice bitmapped
-graphical board display for every position where crafty had
-'something to say'.
-
-<filename> is the name of the file that has the game moves
-stored in it. This should be a PGN-compatible file,
-although Crafty can read nearly any file with chess moves
-and convert it to pgn using the "read" and "savegame" com-
-mands to perform the conversion.
-
-<colors|name> indicates which side Crafty will annotate.
-The valid choices are w, b, and wb/bw for white only, black
-only, and both, respectively. Crafty will search and pro-
-duce results for the indicated color only, making moves for
-the other side silently as they are read in.
-
-Alternatively, you can specify the player's name (useful if
-you want to annotate several of your own games in one large
-pgn file, for example, and you alternated colors so that you
-can't pick the right one easily). Crafty will then figure
-out which side to annotate for in each game. Note that the
-name is case-sensitive, but that you only have to enter a
-string that is unique in the name field. IE if one name is
-"Anatoly Karpov" and the other is "unknown" then specifying
-Karpov as the name would be sufficient. If the same
-'string' appears in both names, Crafty will complain.
-
-<moves> indicates the moves that should be annotated. If
-this is a single integer, annotation starts at this move
-number (for the color given above) and proceeds for the rest
-of the game. If a range is given, as (20-33), then only
-moves 20-33 inclusive are annotated. To annotate the com-
-plete game, you can use 1-999.
-
-<margin> gives a score "window" that controls whether Crafty
-will produce comments (see below). The larger this number
-this number, the fewer annotations Crafty will produce. A
-negative number will result in an annotation for every move
-selected.
-
-<time> indicates the time limit for each search. Since each
-move selected requires two searches, you can take the number
-of moves, double this number and multiply by <time> to
-determine how long the annotation process will take. This
-time is in seconds.
-
-How it works. Suppose you use the command "annotate game1 w
-1-999 1.000 30" This asks Crafty to read the file "game1",
-and annotate the white moves for the entire game. The mar-
-gin is 1 pawn and the search time limit is 30 seconds. The
-output for the annotate command is found in <filename>.can,
-
-
-
-
-
-
-
-
-
-
-
-
-
-in this case this is game1.can.
-
-Crafty first searches the move actually played in the game
-to determine the score for it. Crafty then searches the
-same position, but tries all legal moves. If the score for
-the best move found in this search is greater than the score
-for the move actually played plus the margin, then a comment
-is added to the output file. This output file is quite
-short, with all the game moves (plus any PGN tags in the
-original, for identification purposes) plus the brief com-
-ments. An annotation looks like this:
-
-{real_value (depth:best_value PV moves)}
-
-real_value is the score for the move actually played. depth
-is the depth Crafty searched to produce the best_value and
-PV for what it thinks is the best sequence of moves for both
-sides. If you set <margin> to 1.000, you are asking Crafty
-to only annotate moves that either lost a pawn or more, or
-moves that failed to win a pawn or more. If you set <mar-
-gin> to .300, you are asking for annotations for any move
-that makes the score drop about 1/3 of a pawn below the
-value for the best move Crafty found.
-
-If you have other moves you would like to see analyzed dur-
-ing this annotate process, at the point where the move can
-be played, insert it into the PGN file as an analysis com-
-ment, surrounded by () or {} characters. Crafty will pro-
-duce analysis for this move as well. If more than one move
-appears inside a single set of delimiters, only the first
-will be analyzed. To force Crafty to analyze more than one
-move, enter them like this: (move1) (move2) as though they
-were two separate comments.
-
-4. ANSI on|off This command is used to control whether or
-not Crafty attempts to display its move in reverse video or
-not. For PC's, Linux, and most Unix boxes, this works fine.
-Should you find yourself playing crafty via a dumb terminal,
-this might hose the terminal and interfere with your ability
-to see or input moves. If moves are not displayed in
-reverse video, it's probably wise to turn this off to avoid
-hanging the terminal you are using.
-
-5. black|white This command simply toggles the side on
-move. if it is white to move, and you enter white, nothing
-happens. If it is white to move and you enter black, then
-it becomes blacks turn to move immediately from the same
-position. Used only infrequently.
-
-6. book (see the book explanation near the end of this doc-
-ument for a full explanation of this command and its many
-options.) Note that there are special commands available
-(*only* on the command line, *not* in the
-
-
-
-
-
-
-
-
-
-
-
-
-
-crafty.rc/.craftyrc files) to direct crafty to specific
-directories for the book files (bookpath=/a/b/c), the table-
-base files (tbpath=/i/j/k) and the log files (log-
-path=/x/y/z). Note that these commands can *only* be used
-on the command line, because they must be executed before
-the engine is initialized. Putting them in the
-crafty.rc/.craftyrc file will produce error messages without
-affecting how the files are opened.
-
-If you need to specify multiple directories (tbpath only)
-you may do so by using "tbpath=path1:path2:path3:etc" or
-else use the more Unix- like
-"tbpath=(path1:path2:path3:etc)" instead. The paths are
-separated by ":" (colon) characters and everything is case-
-sensitive as usual. For dos/windows users, the separator
-can be a semi-color (;) or a comma(,) to avoid the drive
-designation ambiguity.
-
-7. cache=N This command is used to alter the cache size
-used for endgame database probes. N can be a simple inte-
-ger, representing the number of bytes to use or it can be
-specified as nK or nM representing n * 1024 bytes or n *
-1024 * 1024 bytes. This should be in multiples of the
-database "chunk" size, which might vary. Using the nM form
-guarantees that you will have a reasonable number.
-
-8. clock <ctime> <otime> This command is primarily
-intended for use when Crafty is playing in a tournament,
-such as the WMCCC or WCCC events. If the operator is some-
-what slow in entering moves, or forgets to stop the clock
-after making a move for Crafty, the chess clock for the game
-will drift from the values that Crafty maintains internally.
-<ctime> is the time (in minutes or hh:mm format) crafty has
-left until the next time control, and <otime> is the oppo-
-nent's remaining clock time. This command can be used at
-any time, but will only affect the time per move *after*
-crafty makes the current move and starts to think about what
-the opponent might do next.
-
-9. computer This command usually comes from xboard/win-
-board, but can be used at any time to tell Crafty it is
-playing a computer. This will prevent some things from hap-
-pening, such as a draw score that varies, as well as adjust-
-ing the book selection code to be more selective in what it
-plays.
-
-10. display this command is used to display the game
-board. This board is displayed using the ICS style #1 type
-of ASCII display, with white always at the bottom of the
-screen, black at the top. Very unusable to play a game
-with, but good to verify a position after it has been set
-up.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-This command is also used to display the various
-piece/square tables, by typing "display <piece>" where
-<piece> is replaced by pawn, knight, bishop, rook, queen or
-king. The board is oriented in the same way as the display
-board with a one-to-one correspondence between the squares.
-Perhaps useful for curiosity, but not for anything else.
-These values can not be modified by the user.
-
-The final version of this command is used to control what
-kind of output you will see when crafty runs. Currently the
-following options are available.
-
- display time: this will make Crafty display the
- amount of time each side takes after making a move.
-
- display changes: this will make Crafty display the
- PV each time it changes during the search, including
- when a move fails high or becomes a new best move.
-
- display variation: this will make Crafty display the
- PV at the end of each iteration, but it will only show
- the best PV for the entire iteration, not all of the
- changes.
-
- display stats: this enables basic search statistics
- output including time, nodes and so forth.
-
- display extstats: this enables extended search stats
- including the hashing statistics, search extension
- statistics and so forth.
-
- display movenum: causes all PV output to have move num-
- bers embedded in them to make the PV possibly easier to
- read. This causes the PV to look like this: 12. ...
- Nxe4 13. Bxe4 h6 rather than simply Nxe4 Bxe4 h6. This
- is very helpful when playing on a server and whispering
- or kibitzing analysis. It will also be useful when
- crafty is run from within a database program as the
- move numbers will sync up with the actual game.
-
- display moves: will display each root move as it is
- searched, along with updating the search time at the
- bottom of the screen, so you can see what move is cur-
- rently being analyzed.
-
- display general: will display general information mes-
- sages whenever Crafty wants to tell you something (ie
- "clearing hash tables" or other such things like "Mate
- in n moves."
-
-If you put a "no" in front of any of these options, that
-will disable that particular type of output.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-11. draw offers Crafty a draw. It generally will look at
-the value returned by the last search, and compare it with
-the value returned by an internal function DrawScore(). If
-the search value is not above this result, then Crafty will
-accept the draw. If the search value is above the theoreti-
-cal value for a draw, Crafty will decline the draw. Note
-that crafty will offer draws based on internal analysis.
-When it offers a draw, you can respond with "draw" although
-the game does not really end until you exit Crafty.
-
-12. drawscore N sets the draw score (or contempt factor) to
-N. If you want crafty to avoid draws, set this number to
-something that is negative. IE -50 says that a repetition
-(draw) is the same as being 1/2 pawn down. Setting it to
-+100 will make it try very hard to draw because that looks
-like it is winning a pawn when it does so. Note that this
-is dangerous (either way) as a -50 in a king and pawn ending
-is very likely dead lost... and a repetition is better.
-
-13. echo <text> This command is normally used inside a
-command file that you are going to use to "feed" crafty some
-positions for analysis or whatever. Since crafty depends on
-the operating system to echo commands as they are typed,
-commands read in from a file are "invisible." This gives
-you the ability to insert commands into such a file so that
-crafty displays a message on the screen to give you an idea
-of where it is in processing the file.
-
-14. edit This command has been "cloned" from GnuChess to
-provide an interface with Xboard. After entering the "edit"
-command, you are in "edit.white" mode, where any
-piece/square combination you enter will add the indicated
-white piece on the given square. Piece/squares are entered
-as "qa3", or "bc4" for example. This puts a white queen on
-a3 and a white bishop on c4. Once all white pieces are
-entered, typing a "c" changes to "edit.black" mode where
-piece/square combinations now place black pieces. Typing a
-"." character exits edit mode. To clear the board ini-
-tially, you use the "#" character.
-
-Here's a sample to set up the original starting position,
-after white has played 1. e4, but no other moves have been
-played.
-
- edit
- #
- ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1
- pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2
- c
- ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8
- pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7
- .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Note that input is free form, so piece/squares can be
-entered one per line or all on one line. Ditto for the #,
-c, and . special characters. Note also that there is no way
-to enter castling status here. It is far better to use the
-"setboard" command which uses a FEN-like syntax and allows
-you to set both castling and enpassant status.
-
-15. egtb This command enables the endgame databases.
-Crafty will use the "tbpath" directory (if provided) to
-locate and register all of the databases you have down-
-loaded. It will report the largest class it found, as in "5
-piece tablebase files found" if you downloaded at least one
-5-piece file. If you use this command to enable databases,
-you should also consider using the "cache" command to spec-
-ify the egtb cache size.
-
-16. end|quit These commands are used to terminate crafty.
-Note that you can resume a game later without having to
-replay the moves, by starting Crafty using the "crafty c"
-command. It will immediately read in the moves for the last
-game, although you will have to set the time controls and
-clock time remaining yourself.
-
-17. evaluation option <value> This command is used to mod-
-ify the evaluation scores.
-
-The option "asymmetry" is used to make crafty evaluate king
-safety differently for each side. "evaluation asymmetry 25"
-will increase the king safety scores for the opponent only,
-meaning it will pay less attention to its own king safety
-than to that of its opponent. This will make it play more
-aggressively. "evaluation asymmetry -25" will reduce the
-king safety scores for for the opponent by 25%, making it
-care more about its own king safety than that of its oppo-
-nent. This will make it play more defensively.
-
-The "bscale" option will adjust the scores for blocked
-pawns. The default value is 100. Increasing this will tend
-to make Crafty dislike blocked pawn positions more, which
-will lead to more open positions. Note that this only
-affects moves _after_ the opening book has been followed,
-which means that the position might be blocked before the
-evaluation term has a chance to affect the game.
-
-The "kscale" option will adjust all king safety scores based
-on the 'value' entered. For example, "evaluation kscale 50"
-will reduce all king safety scores to 50% of their normal
-value. "evaluation kscale 133" will increase all king
-safety scores to 133% of their normal values.
-
-The option "tropism" is used to scale king tropism scores.
-This will attract pieces toward kings. A value of 100 means
-no change. other values are treated as a percentage (like
-
-
-
-
-
-
-
-
-
-
-
-
-
-scale) to increase (> 100) or decrease (<100) the king
-tropism scores.
-
-When you use this command, you will see something like this:
-
-modified king-safety values:
-white: 0 4 16 26 39 45 58 77 87 90 93 96 100 103 106 109
- 112 116 119 122 125 128 128 128 128 128 128 128 128 128 128 128
-
-black: 0 5 20 32 48 56 72 96 108 112 116 120 124 128 132 136
- 140 144 148 152 156 160 160 160 160 160 160 160 160 160 160 160
-
-Those values represent the king-safety evaluation as the
-king gets more and more exposed. This is always based on
-the fast that "crafty" will be the side on move when the
-search starts. In the above, it was white's move when this
-was typed, meaning that it appears that crafty will be play-
-ing black. Notice that white's king safety numbers are
-scaled by 20% to make it slightly more cautious about its
-own king. If you type "go" in this position, the scores get
-reversed as Crafty's scores are always left alone (with the
-asymmetry option) and the opponent's scores are scaled down
-as indicated.
-
-You will see similar numbers (but not black and white sets)
-that represent the actual scores produced for king tropism.
-Note that pieces interact to choose which element of this
-vector is used, but in general, the more pieces are close to
-the king, the larger the element from this array.
-
-The "pscale" option is used to scale normal pawn structure
-scoring in the same way as the other scaling options. 100
-is the default. Values less than 100 reduce this term, val-
-ues over 100 inflate it.
-
-The "ppscale" option is used to scale some passed pawn scor-
-ing in the same way as the other scaling options. 100 is
-the default. Values less than 100 reduce this term, values
-over 100 inflate it. This mainly effects outside passed
-pawns/protected passed pawns. The normal pawn scoring com-
-putes the value of a passed pawn. This term is then used to
-scale those terms that modify this value further, such as
-two connected passed pawns on the 6th, or a passed pawn with
-the king supporting it in an endgame.
-
-18. extensions type value
-
-This command is used to control the extension depth for the
-various extensions done in Crafty's search. The extensions
-are set as decimel numbers that represent plies (or frac-
-tions of plies) to extend for each particular reason. Most
-default to 1.0 and .75, but any value can be used. Note
-that value > 1.0 are _very_ dangerous as they can cause the
-
-
-
-
-
-
-
-
-
-
-
-
-
-search to become non-terminating (crafty will stop when it
-runs out of time for the move, but it might not be able to
-get anything useful from such a search).
-
-These extensions are presently limited to a maximum of one
-ply of extensions at any point in the tree. IE no matter
-what you set these values to, they can not exceed one ply at
-present.
-
-incheck This is the amount to extend when the side on move
-makes a move that leaves the opponent in check. Note that
-Crafty extends on the ply where the check is played, not on
-the next ply where the opposite side is in check.
-
-onerep This is the one-reply-to-check extensions, and is
-done at the point where one side is in check and has exactly
-one legal move to escape from the check.
-
-pushpp This is the extension used for certain passed pawn
-pushes in the endgame.
-
-recapture This is the recapture extension, and is applied
-when the current move recaptures an equal-valued piece that
-made a capture at the previous ply. IE BxN, PxB. Note that
-this can only be applied once for every two plies so that
-BxN, BxB, NxB, NxN won't look like three recaptures.
-
-mate This is the mate threat extensions and is applied when
-a null move search returns -MATED, which means that doing
-nothing gets the side on move mated. The opponent must have
-some sort of serious mate threat in such a position.
-
-19. flag on|off This command is used to force crafty to
-end a game where the opponent runs out of time with win-
-board/xboard (on) or to ignore this (off) if desired.
-
-20. force [move] This command is used to force Crafty to
-play a move that is different from the one chosen and played
-by the tree search. If [move] is given, and it is a legal
-move, Crafty will retract its last move and make this move
-instead. It does not change the side on move, but does
-change the position of course. If [move] is not given,
-Crafty will prompt you for a move to make.
-
-21. help This command displays multiple pages of one-line
-help, one command per line. If a line ends with [help],
-then you can use help followed by the specific command to
-get detailed help.
-
-22. history This command displays the history in a verti-
-cal column with one move for white and one per black per
-line. There are other ways to display the current game
-moves and also to save them in files that are explained
-
-
-
-
-
-
-
-
-
-
-
-
-
-later.
-
-23. hash=x and hashp=x These commands are used to adjust
-the size of the hash tables in Crafty. hash modifies the
-size of the transposition/refutation table, while hashp mod-
-ifies the size of the pawn structure/king safety hash table.
-The sizes may be entered as one of the following two types
-of values: nnnK where nnn is an integer indicating how many
-Kbytes Crafty should use for this hash table; nnnM where nnn
-is an integer indicating how many Mbytes Crafty should use.
-
-The transposition/Refutation table is the most critical of
-the two, because it directly affects search efficiency, par-
-ticularly in the endgame. For this reason this should be
-maximized. The most effective size for this hash table is
-3/4 of your available memory. If you don't know how to fig-
-ure this out, but know that you have 16 megs for example,
-they you can say hash=16M and crafty will round that down to
-12M, which is 3/4 of a power of two size. If you study the
-sizes that are possible, you will find 3M, 6M, 12M, 24M,
-48M, and so forth. Anything up to, but not including, the
-next size will be rounded down to the next lower size.
-hashp should be set to approximately 1/2 of what is left.
-For example, the P6 Crafty runs on when playing on ICC often
-uses hash=48M and hashp=8M. The only thing to watch for is
-that if you make this too large, particularly under windows,
-performance will suffer badly because of paging I/O over-
-head. When Crafty is searching in a normal (non-book, non-
-endgame database) position, the disk light should *not* be
-on, indicating lots of I/O.
-
-There is no danger in making this table too large, although
-you have to watch out because if Crafty barely fits in mem-
-ory, doing something else on the machine can cause Crafty to
-be swapped out completely or partially, depending on the
-operating system you are using. If you are going to use the
-machine for anything else while Crafty is running, it is
-better to "pretend" that the machine only has 1/2 of the
-memory it actually does when computing the size of the hash
-tables you want to use.
-
-24. import <filename> [clear] This command is used to
-import any sort of learning data that Crafty supports, which
-currently includes book learning data and position learning
-data. This command reads the appropriate <filename> and
-imports that learned data, just as though Crafty had learned
-it by playing the games. The [clear] option, if specified,
-caused all old learned results to be cleared before the
-import operation, otherwise the imported data is simply
-added to what is already present.
-
-25. input <filename> This command is used to redirect the
-console input I/O stream from the keyboard to a file.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Crafty will then read commands from this file, rather than
-from the keyboard, and execute them just as though they were
-typed in. Such a command file *must* be terminated by an
-"exit" command (no quotes) as the last command in the file.
-This reverts the input stream back to the keyboard, and
-prompts you for another command or move.
-
-This command might be used to configure crafty for a spe-
-cific time control, by putting the appropriate time control
-commands in the file, or to customize the hash table sizes
-as needed.
-
-26. info This command is used to display information about
-Crafty and the current game. Such things as the time con-
-trol, the time left on the clocks and other information is
-shown.
-
-27. learn n controls the learning facilities in crafty.
-Currently this is a 3-bit boolean switch, bit 1 (001) con-
-trols book learning, bit 2 (010) controls position learning,
-and bit 3 (100) controls result learning. learn=0 disables
-all learning, learn=1 enables book learning only, learn=2
-enables position learning only, and learn=4 enables result
-learning. Add the values together to turn on more than one
-type of learning (default=7 to enable everything).
-
-28. level <m> <t> <inc> This command was taken directly
-from GnuChess so that the Xboard/WinBoard interface would
-interface with Crafty. There are other better ways to set
-the time, but this one is well-known. The three parameters
-are <m> (number of moves in the game) <t> initial time on
-the clock. After <m> moves are made, this amount of time is
-added to the clock again. <inc> is the Fischer-Clock incre-
-ment that is added back to each clock after a move is made.
-It may be zero for a non-increment game.
-
-Examples:
-
-level 0 5 0 (ICS 5 0 game)
-level 0 5 3 (ICS 5 3 game)
-level 0 15 30 (ICS 15 30 game)
-
-29. list GM|IM|C|AK|S +name [+name ...] -name [-name ...]
-This command is used to maintain the internal "lists" Crafty
-uses to auto-tune itself when playing on a chess server.
-There are three lists, GM, IM and C. If Crafty's opponent
-is in any of these lists, Crafty adjusts internal controls
-that affect how/when it resigns or offers draws, and how
-randomly it will choose moves from the opening book. For
-example, Crafty resigns much sooner against a GM, because it
-assumes he knows how to win a rook-up ending, regardless of
-how much time is left. By the same token, when playing
-against computers, Crafty will always assume that a draw is
-
-
-
-
-
-
-
-
-
-
-
-
-
-0.000, so that it doesn't wreck its position trying to avoid
-repeating a position.
-
-The AK list will automatically kibitz scores/PV's if the
-opponent is in this list. The S list will turn on special
-scoring for opponents in this list. The only current member
-is "mercilous".
-
-The syntax +name1 +name2 simply adds these players to the
-specified list. To remove a name, use -name1 -name2. You
-can use one command per name to remove or add, or you can
-use one command to add and remove multiple names. Note that
-all names must be entered in lowercase characters, using any
-uppercase characters will break the matching algorithm.
-
-30. log off|on|<n> This command is used to disable log-
-ging. The default is log on, which causes crafty to produce
-a new log.nnn file for each game played. If you are running
-Crafty on a server, you might use log off, which disables
-creating these files as well as the game.nnn files used to
-restart a game after you exit crafty and come back later.
-If you use the form "log n" crafty will simply display the
-last n lines of the log on the screen. If you use "log n
-file" crafty will copy the last n lines of the log to "file"
-which could be your hard drive, or a floppy.
-
-Note that if you run with log off, you will be unable to
-find out what Crafty was thinking about since there is no
-other record of the game. You will always see a game.001
-because as crafty plays a game, this contains all the real
-moves played so far so that you can back up if needed. you
-will also see a log.001 file, but it will be empty.
-
-31. ls <filename> will list all the files that match the
-filename wildcard (the wildcards depend on the system you
-are using, but generally *, ? will work fine. you can also
-supply path information in the filename if you want to list
-the contents of a different directory. Just use the same
-syntax you would if you were using "ls" under unix or "dir"
-under windows.
-
-32. mode tournament|normal This command is primarily used
-to put Crafty into "tournament" mode, which is intended for
-use when Crafty is playing in computer chess events. It
-accomplishes two things: (1) makes all draws return a score
-of 0.000, and (2) makes crafty issue a message after each
-move showing the internal chess clock time, and requesting
-that that operator check and adjust as needed using the
-"clock" command. This primarily makes Crafty comply with
-computer chess rules that say the operator can't do anything
-not specifically requested by the program.
-
-33. name <name> This command is an ICS-play specific
-
-
-
-
-
-
-
-
-
-
-
-
-
-command. Xboard/WinBoard uses this to inform Crafty of the
-opponent's name. Crafty uses the name, and looks it up in
-its GM/IM/C lists, and if found, adjusts itself accordingly.
-This is not used by the PGN code and this will not cause the
-players <name> to show up in the PGN tag section.
-
-34. new This command wipes everything out and starts a
-brand new game. It closes the old log-file and game-file,
-and opens the next sequential numbered file. It also resets
-the game to the beginning and prepares to start a brand new
-game. This was added for Xboard, but it turns out that
-Xboard does not use this, rather it starts Crafty fresh for
-each new game by first terminating the old copy then start-
-ing a new one. Not nearly as efficient as using "new" but
-likely safer it a program can't be sure of resetting every-
-thing back to the initial state.
-
-35. noise <n> This command sets the "noise" level in
-Crafty. Basically, until <n> nodes have been searched,
-crafty will be silent and not display analysis.
-
-This is useful in two ways. First, in end-games, 20+ ply
-searches are not uncommon, and the search analysis for the
-first few plies arrives so quickly that it is distracting.
-Second, when observing games (new interface only) on ICS
-servers, this can be used to avoid having Crafty generate
-too many analysis kibitzes. A value of 100000 will basi-
-cally shut off any output for the first second or so (on a
-P6/200). Similarly, 1000000 will eliminate any output for
-about the first 10 seconds. When watching and kibitzing
-games like the World Championship games on ICC, I generally
-use 5000000, which is almost one minute of silence so that
-the first PV it kibitzes is a pretty deep search.
-
-noise 0 will cause *all* analysis to be displayed, which on
-a fast machine causes no problems. On a slower machine, or
-over a slow phone connection, this might cause a big commu-
-nication backlog. The default is roughly one second on a
-P6/200 (100000) but can be modified by this command.
-
-36. operator <n> Another command intended for use when
-Crafty is playing in a tournament, operated by a human.
-This tells crafty to "hide" <n> minutes of time and not use
-them. This time is basically allocated to the operator to
-make up for the time it takes to type in moves and/or cor-
-rect mistakes. At the WMCCC events, the normal value we use
-is 5. Playing on a server, this is not needed, as it is not
-needed if you are playing Crafty yourself.
-
-37. perf This command is primarily used in optimizing
-Crafty, or to test the speed of the move generator and Make-
-Move()/UnMakeMove() on different platforms. It produces two
-results, the moves it can generate per second, and the moves
-
-
-
-
-
-
-
-
-
-
-
-
-
-is can generate and make/unmake per second. While this is
-not a perfect performance indicator, it does give an
-"approximation" for how fast Crafty might run. In general,
-the higher the numbers, the better the program will play,
-although machines are certainly different. It's not uncom-
-mon to find a machine that searches slower than another, but
-has a higher "perf" value.
-
-38. perft <depth> This command is generally used to con-
-firm that the move generator and bitmap operators are work-
-ing properly. It simply takes the current position, and
-generates/makes/unmakes moves and counts them. Many pro-
-grams use this from a "standard" position to make sure that
-their move generator does not miss generating odd moves like
-enpassant/promotions and also to confirm that the
-make/unmake code correctly updates the board so that the
-totals remain constant across different machines and pro-
-grams, since there is no alpha/beta or evaluation things
-done. if <depth> is greater than 5 or 6, it will take a
-*long* time, since this is basically a minimax tree traver-
-sal that will visit *every* node within the <depth> search
-horizon.
-
-39. pgn <tag> <value> This command is used to set the
-usual PGN tags to meaningful values. The recognized tags
-are Event, Site, Round, Date, White, WhiteElo, Black, Black-
-Elo, and Result, and the tags *are* case sensitive. The
-<value> can be any valid input and blanks and special char-
-acters are allowed. Note that the date is clearly specified
-in the PGN standard and must be yyyy.mm.dd with no variance.
-Valid results are 1-0 (white won), 0-1 (black won), 1/2-1/2
-(drawn) and * (unknown). Some examples:
-
-pgn Event 14th World MicroComputer Chess Championship
-pgn Date 1996.10.8
-pgn Site Jakarta, Indonesia
-pgn Round 1
-pgn White Crafty
-pgn WhiteElo 2400
-pgn Black assassin
-pgn BlackElo 2400
-pgn Result 1-0
-
-Setting these values will result in a proper PGN file when
-using the savegame command. Note that if you use the "read"
-command to input a PGN game, these values will be extracted
-from that game if they are given.
-
-40. ponder off|on|<move> This command serves two purposes.
-First, it can be used to disable (off) or enable (on) think-
-ing on the opponent's time (or pondering as it is called in
-many programs including Crafty.) Turning it off will weaken
-Crafty since it will not use any machine time while waiting
-
-
-
-
-
-
-
-
-
-
-
-
-
-on the opponent to move. It is sometimes useful, however,
-when playing Crafty against another computer and the
-machines are not equal. If crafty is on a faster machine,
-and you attempt to adjust for this by giving the opponent
-more time than Crafty, it doesn't work quite as expected,
-because while the opponent is thinking, so is Crafty, which
-lets it use the extra opponent time in an unexpected way.
-In such a case, it's best to stop pondering in both pro-
-grams.
-
-If <move> is given, it directs Crafty to use that <move> to
-ponder, rather than the one from the previous search. Most
-commonly this is used to set the right move to ponder after
-Crafty has been stopped and then restarted, assuming that it
-is the opponent's turn to move when this happens. Other-
-wise, it is probably better to not try to influence things,
-although if you are watching and suddenly wonder "what would
-Crafty do if the opponent plays move 'X'?", you can answer
-this by simply typing "ponder X" and then watching the anal-
-ysis. You should reset the correct ponder move after you do
-this of course.
-
-41. reset <n> This command lets you back up in the current
-game to any move of your choice. reset <n> backs up the
-game to move <n> with the same side on move. If you want to
-first change the side to move, use the white/black command,
-then use the reset command to back up to the right move.
-Note that you can also go forward as well, just so there are
-moves in the current game history.
-
-42. resign <n> This command sets the resign threshold.
-When running on ICC I typically use "resign 9" which will
-make crafty resign roughly five moves after the score drops
-below -9.000. For IM's I change this to 6, and for GM's I
-often use 3, so that it will resign quicker and not drag a
-lost game out unnecessarily.
-
-43. read/reada [<filename>] This command will read input,
-and extract the chess moves and make them to set up the
-position at the end of the game. It first resets the chess
-board to the initial position (read command only) and then
-extracts the PGN tags (if present) from the front of the
-input. The rest of the input is parsed for chess moves
-(comments and similar things are culled automatically) and
-the moves are made and added to the game history. Once this
-is done, you can back up, go forward, or play from any point
-in the game. If you specify a <filename> everything is read
-from the file, otherwise it is read from the console key-
-board.
-
-The reada command reads moves, but appends them to the cur-
-rent game history/ position rather than resetting to the
-initial chess position. This lets you read in a game, then
-
-
-
-
-
-
-
-
-
-
-
-
-
-use reada to manually add some more moves to see the result-
-ing position.
-
-44. savegame <filename> This command is used to save the
-current game in a PGN-compliant file with the PGN tags
-included. Note that the default TAG values might not be
-what you want if you do not either use the pgn command to
-set them or else input a valid PGN file with the tags
-already filled in.
-
-Be aware that this command doesn't check the filename for
-legality since anything goes in UNIX. In DOS, you might
-produce a bad filename with either too many characters, too
-many periods, or whatever, so be careful with the name you
-choose. Note also that this file will be overwritten if it
-already exists, so be sure to choose a name that is not the
-name of a file that has something you consider important in
-it.
-
-45. savepos <filename> This command writes a single line
-into <filename> in FEN-like notation. This lets you save a
-position, and then come back later to re-examine it. You
-would use the "in <filename>" command to input this file and
-set the position up.
-
-46. search <move> This command allows you to specify one
-particular move for the side on move, and then when you tell
-Crafty to search this position, this is the only move that
-will be searched. This is used internally by the annotate
-command, but can be used to investigate one specific move.
-If the move is not the best move, a normal search won't show
-you why it is bad, but this will. It is also quite a bit
-faster since the other moves in the position are not
-searched at all.
-
-47. settc <moves> <ctime> <otime> This command is primar-
-ily used in tournaments, and is an error-recovery command.
-If the machine crashes and corrupts the game history file,
-frequently the operator will have to simply set the position
-using the setboard command, and then use the settc command
-to restore the time control values. <moves> is moves until
-the next time control (from Crafty's perspective, be careful
-and don't look at the opponent's moves to time control by
-accident.) <ctime> is minutes left on Crafty's clock,
-<otime> is minutes left on the opponent's clock.
-
-48. setboard <FEN input> This command is used to set a
-chess position up for analysis and is the preferred way to
-do this, rather than using the gnu EDIT interface. It uses
-a classic Forsythe-like notation to encode the position and
-also has provisions for castling status and enpassant cap-
-ture status.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-the standard piece codes p,n,b,r,q,k are used to denote the
-type of piece on a square, upper/lower case are used to
-indicate the color of the piece (uppercase=white pieces,
-lowercase=black pieces).
-
-the pieces are entered from the classic chess diagram's ori-
-entation of a8 being the upper-left-hand corner of the
-board, and this square is entered first, followed by the
-remainder of the 8th rank left to right. To indicate empty
-squares, use a number between 1 and 8 to indicate how many
-adjacent squares are empty. use a / to terminate each rank
-after all of the pieces for that rank have been entered.
-Note that you do not have to account for all 8 squares on a
-given rank, although many test suites do this for clarity.
-
-the following input will setup the board position that given
-below:
-
- k2r/ppp////Q/5PPP/7K/ B
-
-this assumes that k represents a white king and -q repre-
-sents a black queen.
-
- -k * * -r * * * *
- -p -p -p * * * * *
- * * * * * * * *
- * * * * * * * *
- * * * * * * * *
- q * * * * * * *
- * * * * * p p p
- * * * * * * * k
- *
-the field after the final "/" should be either b or w to
-indicate which side is "on move." after this side-to-move
-field any of the following characters can appear to indicate
-the following: KQ: white can castle king-side/queen-
-side/both; kq: same for black; a1-h8: indicates the square
-occupied by a pawn that can be captured enpassant.
-
-49. score This command simply gives the positional score
-for the current position. This score is from whites per-
-spective, so a + score is good for white, a - score is good
-for black. Crafty also breaks the score down into major
-categories (from Evaluate()) to indicate things like pawn
-structure, piece evaluation, passed pawns, development, and
-so forth. Note that some of Crafty's evaluation is asymmet-
-ric, so that if you simply change sides with the white/black
-command and then enter "score" again, you may get a differ-
-ent value. This is *not* a bug. :)
-
-50. sd <n> This command lets you specify a specific search
-depth limit that Crafty can not exceed. It still pays
-attention to the clock, however, so often you will use the
-
-
-
-
-
-
-
-
-
-
-
-
-
-st <n> command (below) in conjunction with this if the
-search is going to take an extended amount of time. <n> is
-the depth (in plies or 1/2 moves) that the search must
-reach. Note that if Crafty is pondering, it still honors
-this limit and will stop a ponder search after this depth
-has been completed as well. This is *not* the way to make
-Crafty play weaker, although this will be covered in a later
-section of this document.
-
-51. show <category> This command forces Crafty to display
-additional information about certain actions it takes. Cur-
-rently the only <category> is "book" which will make crafty
-display information about all the book moves it found in the
-database. More is given about this information in the BOOK
-section later in this file.
-
-52. smpmt=n This command is used to set the number of
-threads to use on a machine with more than one processor.
-For optimal performance, "n" should be set to the number of
-processors you have, although using fewer will reduce the
-load on your machine. For this command to work, Crafty must
-have been compiled with SMP defined. When compiled with SMP
-enabled, mt=0 effectively disables the SMP code completely.
-
-This command also has two that are closely related. smpmin
-and smpmax. Both accept single numerical arguments. smpmin
-is used to control the minimum tree depth required at a node
-for it to be eligible for parallel searching. IE smpmin 2
-says don't split unless at least two more plies are left to
-search below this node. smpmax sets the maximum for the
-same idea, is smpmax 10 says don't split if more than 10
-plies are remaining below this node.
-
-53. sn <n> This command is similar to the sd command, but
-instead of setting a specific search depth, it sets a number
-of nodes to search. Once the search has searched this num-
-ber of nodes (+ maybe one more second of searching to check
-the time) the search will exit.
-
-54. st <n> This command lets you specify a specific search
-time limit for Crafty. Again, this is not the preferred way
-to set a time per move, because this limit is absolute and
-Crafty will never go over this limit, even if it sees that
-it is losing or getting mated. Setting the time control
-with the usual "time" or "level" command is *much* better.
-<time> is given in seconds, although it may also be entered
-as mm:ss if preferred.
-
-55. swindle on|off This command gives you control over
-"swindle mode." When on, and playing a game, Crafty will
-try to win drawn endings (according to the tablebases) if it
-has winning chances (like KR vs KB, for example). This will
-put up very stiff "resistance" to accepting the draw, while
-
-
-
-
-
-
-
-
-
-
-
-
-
-with this mode off, it may be very easy to draw a position
-once the tablebases say "drawn." This mode is automatically
-turned "off" during analysis or when annotating a game, and
-is only used when actually playing a game against an oppo-
-nent. If there are no tablebases then this has no effect on
-the game at all.
-
-56. tags This command will simply display the current PGN
-tags (you can edit them with the various PGN commands).
-
-57. test <filename> [n] This command will run a suite of
-positions (the file must be in "Crafty" format as explained
-below) and produce a summary of how many it got right,
-wrong, etc. It uses the time per move you set with the
-(typically) st <n> command. The optional parameter [n] is
-the "early exit" counter. If Crafty finds, and holds the
-solution move for n iterations, it will terminate the
-search. I use this to make a win at chess run take < 15
-minutes, even though the time per position is set to 1
-minute, by setting n to 2. After two correct iterations,
-Crafty goes on to the next problem. For absolutely correct
-results, this is not advisable as it could obviously change
-its mind later on, but for performance analysis, this saves
-a lot of time.
-
-The test suite contains the following lines: (this is a
-sample from my test suite for Win At Chess.)
-
-title wac299
-setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w
-solution Nca4
-
-title wac300
-setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w
-solution g6
-
-end
-
-The title command simply displays this message in the log
-file so you can look at the output and figure out which
-position it goes with. This is optional, but useful.
-
-The setboard command sets the position as explained before.
-
-The solution command gives the set of solution moves (one or
-more moves that are separated by blanks) and/or a set of
-"anti-solution" moves (moves that must not be played to
-count the position as correct.) "anti-solution" moves are
-simply followed by a "?" character, for example:
-
-solution Bxa7?
-
-The solution command supplies a set of key moves, and then
-
-
-
-
-
-
-
-
-
-
-
-
-
-starts the search. If, after the search terminates, one of
-the key solution moves was chosen (or none of the anti-solu-
-tion moves were chosen) the position is counted as correct.
-
-The final line should be "end" although end-of-file or EOF
-will also be detected in this case.
-
-57. time CPU|elapsed|<values> This command controls
-whether the program uses CPU time or wall-clock time for
-timing. for tournament play, it is safer to use wall-clock
-timing, for testing it may be more consistent to use CPU
-timing if the machine is used for other things concurrently
-with the tests being run.
-
-time is also used to set the basic search timing controls.
-the general form of the command is as follows:
-
- time nmoves/ntime/[nmoves/ntime]/[increment]
-
-nmoves/ntime represents a traditional first time control
-when nmoves is an integer representing the number of moves
-and ntime is the total time allowed for these moves. the
-[optional] nmoves/ntime is a traditional secondary time con-
-trol. increment is a feature related to ICS play and emu-
-lates the Fischer clock where <increment> is added to the
-time left after each move is made.
-
-as an alternative, nmoves can be "sd" which represents a
-sudden death time control of the remainder of the game
-played in ntime. the optional secondary time control can be
-a sudden-death time control, as in the following example:
-
- time 60/30/sd/30
-
-this sets 60 moves in 30 minutes, then game in 30 additional
-minutes. an increment can be added if desired.
-
-One final example is the following:
-
- time sd/15
-
-which is a simple game/15 setting. This command can also be
-used to perform the same function as the "level" command.
-For example, to set up a classic ICS 2 12 game, the follow-
-ing would would work:
-
- time sd/2/12
-
-59. trace <n> This command is used to make crafty display
-the tree as it searches a position. Due to the incredible
-speed at which this program can search, however, this is
-less than useful since it can swamp any known display driver
-and make things scroll impossibly fast.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Also note that this command usually is disabled, because
-Crafty is generally compiled with the -DFAST flag, which
-removes the trace output code from the search to make things
-slightly faster. You will have to recompile, without the
--DFAST, if you want to use this. It's utility is limited,
-except for debugging, anyway.
-
-60. usage <n> is simply a way to modify Crafty's time usage
-to fit your tastes. You can "suggest" a time limit with any
-of the options discussed previously, but if you use anything
-other than the "st" command, Crafty will do its best to use
-time as you suggest, but it also anticipates that it will
-save some time by pondering, etc., and will therefore be
-more aggressive at trying to use time. if <n> is a positive
-integer, it is taken as a percentage and crafty will compute
-the time limit it thinks is appropriate for the current
-clock settings, then increase this limit by this percentage
-(50 would make it take 1.5 times longer than normal.) -50
-would make it take 1/2 the time it would normally take.
-
-Crafty adjusts the usage internally based on time left,
-opponent's time left, how quickly or slowly the opponent is
-moving, etc. Further modifying things with this is danger-
-ous, but possible.
-
-61. whisper/kibitz <n> These commands are used to control
-what Crafty will whisper or kibitz on a chess server. The
-options are (1) only whispers or kibitzes mate announce-
-ments; (2) adds time, score, depth to the previous option,
-but no PV or moves. (3) adds the PV. (4) adds book move
-information to the output. The remaining two options gener-
-ate a lot of output and should be used with caution. (5)
-displays the PV after each iteration completes. I use this
-when using my custom interface to let Crafty observe/comment
-on games in progress on ICC. Noise can be used to prevent
-shallow searches from generating output and keeping "noise"
-down on the games being watched. (6) basically will whis-
-per/kibitz nearly everything you see on the console from a
-search, each PV when it changes, fail highs and fail lows,
-etc. A significant amount of output that should be care-
-fully weighed before turning it "loose."
-
-62. xboard This command turns on Xboard/WinBoard compati-
-bility mode, and makes Crafty behave somewhat like GnuChess.
-This is designed to be used *only* when Crafty is interfac-
-ing with Xboard/WinBoard. Crafty will not work with these
-two GUIs without this option, and really won't work very
-well with this option if it is not connected to one of them.
-
-63. There are other commands that are not documented. They
-are part of the xboard protocol and really should not be
-used by the normal user. You can find all the commands in
-option.c should you be interested.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Opening Book Setup and Usage
- ----------------------------
-
-Crafty uses two pre-compiled opening books, called
-"book.bin" and "books.bin".
-
-The file book.bin is usually build from a large text file
-containing PGN games, often taken from collections of GM
-games. Building book.bin is a simple exercise and requires
-nothing other than the raw input file you are going to use.
-Generally this will be either medium.zip or the set of four
-files large[1-4].zip, all of which are stored on the ftp
-machine ftp.cis.uab.edu/pub/hyatt/.
-
-To create the file book.bin, you need a PGN game collection
-that is a *real* PGN-compliant file. Supposing this file is
-called "large.pgn" you would use the following command:
-
-book create large.pgn <m> [n] [wpct]
-
-The only thing you have to supply is <m>, a number indicat-
-ing how many moves from each game are to be stored in the
-book.bin database. I typically use 60, which stores the
-first 60 moves from each game. Increasing this number
-slightly increases the probability that Crafty will stay in
-book longer, but it also increases the probability that it
-will follow a game too far, so that it begins to reach posi-
-tions where the move actually played might not be the best
-move, letting it fall into a bad hole. Increasing this also
-increases the size of the database as well.
-
-You can decrease the size of the book, and also reduce the
-number of ugly moves by specifying <n>, which says that
-unless a move is played in at least N games, the move is
-discarded. This will substantially decrease the size of the
-book.bin file, and also eliminate single game moves that
-often have significant errors or blunders.
-
-You can increase the quality of book lines by specifying
-<wpct> which is the "winning percentage". This is specified
-as a percentage of lost games, and is used to discard moves
-that led to mostly losses. A safe value is 50, which says
-that if a particular opening move didn't win at least 50% as
-many games as it lost, the move is culled. A value of 100
-would mean that moves are culled if they produced more
-losses than wins, and is really a strict criterion.
-
-After creating book.bin, you need to create books.bin. This
-is a small version of book.bin, which is intended to give
-you more control over the moves/openings Crafty will play.
-This is usually built from the file start.pgn on the ftp
-machine, but you can modify this file to suit your taste
-easily. To build books.bin, you use the following command:
-
-
-
-
-
-
-
-
-
-
-
-
-
-books create start.pgn 60
-
-Again, 60 is what I use, but none of my start.pgn lines go
-anywhere near that many moves. The main point here is that
-in start.pgn, you can append a "!" to any move you want, and
-when it is Crafty's turn to move for that color, it will
-play from the set of moves with "!" if there are any, ignor-
-ing the rest of the book moves. If you only want it to play
-1. e4 as white, you would just enter the short game:
-
-[Crafty only plays 1. e4] 1. e4!
-
-and you are finished!. You can enter as many as you want.
-If on the other hand there is a move you don't want Crafty
-to play, then follow that move with a "?" and it will never
-play it. Moves in books.bin that are not flagged with ! or
-? don't have any influence on Crafty's choice at all.
-
-Here's how the files are used. When searching a position,
-Crafty first enumerates the set of moves it can find in the
-opening database. It then does the same for the books.bin
-database, and performs a "merge" operation to combine the ?
-and ! flags... The purpose of the books.bin file is to give
-you a small database that you can easily modify, rebuild,
-and repeat this process over and over. Since it takes a
-fraction of a second to completely rebuild this file, it is
-very easy to modify this to control what Crafty will play,
-without having to rebuild the large database.
-
-One important characteristic of the PGN input is the Result
-tag must be specified in most of the lines, because Crafty
-counts wins, losses and draws for each book move and uses
-these counts with some of the book selection options given
-below.
-
-How the flags are used.
-
-The ! and ? flags should only appear in the small books.bin
-file, although there is no reason why they can not appear in
-the large file as well. For this discussion, it doesn't
-matter since Crafty takes the moves from both files and
-"merges" the flags/etc into one entry for each move.
-
-Quite simply, if any book legal book move has a ! flag, then
-Crafty will only play moves from the set of moves which all
-have the ! flag. If a move has a ? flag, then that move is
-immediately removed from the set of possible book moves. If
-the only legal book move has a ? flag, it will not be played
-as a book move and Crafty will simply pretend that it found
-no book moves and will execute a normal tree search. Pretty
-simple.
-
-How to control the frequency of opening move selection.
-
-
-
-
-
-
-
-
-
-
-
-
-
-A new feature in version 15.15 and beyond allows you to
-append a PGN comment to any move in a text file used to cre-
-ate books.bin, of the form {play nn%}. This will force the
-move it follows to be played that percentage of the time,
-regardless of the normal book-ordering values based on fre-
-quency and so forth.
-
-Note that {play 0%} will not prevent a move from being
-played at all, as this will look just like a move with no
-percent specified. To avoid playing a move, use the ? flag.
-
-How does Crafty choose book moves?
-
-Crafty's book selection algorithm depends on two user-
-defined values that can be set at any time during a game:
-
-book random <n>
-
-book width <w>
-
-The selection algorithm first finds the set of legal book
-moves as above. This set will either be all ! moves, or
-will have no ! moves in it. This set is then sorted based
-on the setting of book random. Here's the options:
-
-book random 0. This is a special case for book selection.
-Crafty simply takes the set of book moves, and searches only
-these moves using a normal alpha/beta search, but with a
-shorter than usual time limit. It then plays the move that
-produces the best search value. This has one serious disad-
-vantage in that there is no randomness to this at all. It
-will always play the same move in the same position, unless
-the evaluation is modified, or the time per move is differ-
-ent enough to let the search find a different move from the
-book move set.
-
-book random 1. This enables a random form of book move
-selection, but you have a lot of control over how moves are
-randomly chosen. The moves are ordered, based on 4 parame-
-ters: frequency of play, win/lose ratio, static evaluation
-and learned results. Normally these are factored into the
-value used to sort the moves, based on default settings that
-you can modify by using the command "bookw option N"
-"option" should be "freq", "ratio", "eval" and "learn". N
-should be a number between 0 and 1.
-
-Crafty finds the min and max values for each of the 4 param-
-eters, and then maps this into the range 0-1000 for each
-parameter. Each parameter is multiplied by the correspond-
-ing "weight" you have assigned, and this is used as a value
-to sort the moves from low to high. Note that the first
-sort value is always the "play percent" to move them to the
-top of the list. For moves with equal "play percent"
-
-
-
-
-
-
-
-
-
-
-
-
-
-values, the normal sort-value is used as the second-level
-sort variable (if no moves have a play-percent, then this
-second-level variable is the only one used, of course.)
-
-Once Crafty has sorted the moves as given above, it next
-excludes any book moves which have 0 wins. This culls the
-odd lines where a player chose a bad line and lost quickly.
-With zero wins, it will never be chosen, although Crafty
-will happily follow it from the other side. :) This is not
-anywhere near perfect, however, because an opening could
-have 1 win and 19 losses and that still would stay in the
-list.
-
-If a move has a learned value of > 100, this move is ele-
-vated in priority to that of a ! move, since it appears to
-win material instantly. If a value is < -100, it is given a
-? since it appears to be a lemon.
-
-After this, the setting for "book width <w>" is used to keep
-the first <w> moves in the list, after the above culling has
-been completed. The smaller you make <w> the less random-
-ness you get, but the chance of Crafty popping out a really
-bizarre book move gets smaller as well.
-
-After sorting, the final step is to fold in any mandatory
-"play percent" values. What this step does is that it finds
-all the moves in the "playable move set" just computed,
-which have no percent-to-play value set. It sums the sort-
-values for these moves, then adjusts the sort-values for the
-other moves so that their percentages will be honored.
-
-Once this has been done, crafty simply uses the "sort value"
-for each move to compute a total for all moves. It then
-generates a random number between 1 and this limit, and
-chooses the move that this probability distribution matches.
-This will certainly evolve over time as new ideas are devel-
-oped.
-
-For my play on ICC, I use book random 1, and book width 5
-normally, although for titled players this is reduced to
-book width 3. For computers, I reduce this further to 2, to
-try to play reasonable openings and cull the gambits and
-things that don't work out.
-
-How does book learning work and how can I share learned
-results?
-
-1. *all* of crafty's "learned knowledge" is in the book.bin
-file. It keeps the learned value and learned count right in
-the book file for speed. You can't modify it, although
-"show book" will make crafty display all the book stuff
-before it makes a move.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-2. the book.lrn file has two purposes: (a) to serve as a
-log for your prying eyes, so you can see what it's learned,
-against whom, and what the score was that got its attention
-in the first place. The values on the end of each book
-line, inside the {} characters are as follows:
- {value, depth, rating_difference} value is the value of
-the "key" search that comes from the first 10 moves out of
-book. it's in centipawns, and + is good - is bad. depth is
-the depth the search reached at this "key" position, the
-deeper the search, the more the value is "trusted." rat-
-ing_difference is crafty's rating - opponent's rating a neg-
-ative value means pay more attention to the score since the
-opponent is better than crafty, a positive value means to
-take the score with a grain of salt, because the opponent
-was weaker than Crafty.
-
-You can delete this file at any time, and it has no effect
-on learning. As I mentioned, the learning takes place in
-book.bin... this is mainly for you to peek at if you are
-interested. However, this is the "portable learning data
-file" also, and can be given to others to import into their
-crafty, where it will affect the opening book just like
-their crafty had played the openings and got the same
-scores. There are two ways to use such "lrn" files:
-
-1. "import <filename>" will read <filename> and import the
-knowledge therein into your book.bin. Since I use the same
-learning code as is used when playing games, this informa-
-tion also gets appended to *your* book.lrn file as well, so
-that your book.lrn always reflects *everything* your program
-has learned, so long as you don't ever remove this file. It
-would be a mistake to use this command on your own book.lrn
-file, because the things would get counted twice, which
-might or might not be a good thing.
-
-2. "import <filename> clear" will read <filename) and
-import the knowledge as above, but first clears *all*
-learned results from book.bin. you will want to do this if
-you import my book.lrn, *and*, you have contributed to my
-book.lrn data by sending me yours. I'll take care of elimi-
-nating duplicates if you screw up in what you send me, but
-once you send me something, you run the risk of getting it
-"back again" later. This is going to be a problem until
-everyone gets used to sharing something that is rather
-"vapid" like this "learned info" is...
-
-Other than that, we are now "open for business"... when the
-urge strikes you, email me your .lrn file, I'll keep a large
-master here and update it on occasion. Probably the best
-thing to do is to send me your .lrn and at the same
-*instant* delete yours. This will capture anything learned
-*after* you send me the file, but you'll get it all right
-back with the next version of book.lrn that I distribute.
-
-
-
-
-
-
-
-
-
-
-
-
-
-after getting this new book.lrn back, here's what you should
-do:
-
-1. rename your old book.lrn to something else. I'll call
-it "book.lrn.old" here.
-
-2. copy my blearn.dat to your machine, but *do not* put it
-in the directory with your book.bin and books.bin file
-because it will get confusing very quickly if you do. put
-it somewhere else, because you are going to remove it
-quickly anyway. I'll call it new.lrn for this example.
-
-3. import new.lrn clear
- import book.lrn.old
-
-and you are ready to rumble again. The first command clears
-the learned values, sucks in my new learn file and updates
-everything. the second command re-learns everything you've
-learned since you sent me the last book.lrn file. After
-doing this your book.lrn will have my .lrn stuff, plus your
-old.lrn stuff, just waiting to be sent to me again...
-
-If this is confusing, I can probably add an automatic com-
-mand to do all of this by renaming book.lrn, etc. Hopefully
-this is not too error-prone for the time being anyway...
-
-What is this new Position Learning I've heard about?
-
-Crafty now has a "permanent" hash table that is kept from
-game to game. A position gets into this "hash file" when
-Crafty executes a search and the search value is signifi-
-cantly lower than the last search value.
-
-When this happens, Crafty stores the current information for
-this position in the permanent hash file, which can hold up
-to 65536 positions. Once it fills up, the positions are
-replaced on a FIFO basic always keeping the most recent 64K
-entries.
-
-Each time crafty starts a search, the positions/scores from
-this file are stuffed into the normal transposition table,
-and used during the search just like any other table entry.
-Here's how it helps: In a game that was played, the follow-
-ing moves and scores were found by crafty (playing white):
-
-1. Ng5 (+.277) h6 2. Nh7 (+.321) Kg8 3. Qh5 (+.133)
-Qg7 4. Ng5 (-2.122) hxg5
-
-So, the knight got trapped at h7, and at move 4 crafty dis-
-covered that this is gross and "learns" this result/posi-
-tion.
-
-We play the exact same game again: except that two things
-
-
-
-
-
-
-
-
-
-
-
-
-
-can happen here. It might be that Ng7 is the *only* square
-the knight can move to here, which means this whole thing is
-forced. the first search would find:
-
-1. Ng5 (-2.122) if the search can reach 8 plies deep, which
-happens even in 5 second games. It's learned that Ng5 is
-bad. It stores *this* position in the permanent hash file
-also, and the next time you try this same trap, it will dis-
-cover 4-5 moves earlier that if the knight gets to g5 it is
-in trouble. Each game will diverge from the first game 3-4
-moves earlier. Simple and effective.
-
-2. Ng5 might not be forced, and if not, it knows Ng5 loses
-a piece for a pawn, so it will promptly play something else,
-which is exactly what is desired.
-
-This is implemented with two (count 'em, two) files. One
-file "position.bin" is a binary file that contains the hash
-table entries, and it right at one megabyte in size, *max*.
-(16 bytes per hash entry X 65536 entries = exactly one meg,
-but I have 8 extra bytes for the FIFO queue implementation
-and to see how many entries are currently in the file if it
-is not full.
-
-The second file is "position.lrn" and is, you guessed it, a
-file that can be shared with others, just like book.lrn. It
-contains all information needed to reconstruct the position,
-the score, the depth, etc. and also included the pgn tags
-for who was what color and when the game was played...
-
-This data can be imported with the new "import" command (the
-old book learn <filename> is no longer around) which will
-import either book.lrn type data or position.lrn type data
-and can tell them apart without your having to do anything.
-The <clear> option is still there, should you want to use
-it, and simply removes the position.lrn and position.bin
-files before starting the import process for position learn-
-ing.
-
-This can be turned off, if you like, by checking out the
-"learn" command, which gives you the ability to turn off
-book learning (as it presently works), position learning,
-and the next book learning stage which will add to the book
-in addition to learning which book lines are good and bad.
-
-What is this new "result" learning?
-
-Result learning works just like normal book learning, except
-that if Crafty is checkmated or resigns, it will step back
-through the book line to find the last point where it had
-more than one move to choose from. It will flag the move it
-chose as "never play again".
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-This handles the case where the first ten non-book moves
-produce reasonable scores, but the position is one that
-Crafty simply can't handle very well. If it loses such a
-game, it will still vary the next time this opening is
-played, as otherwise it would possibly repeat the same open-
-ing, and would certainly repeat the remainder of the game.
-
-All three learning modes are turned on by default, although
-any of them can be disabled with the appropriate command
-option to "learn".
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/crafty.git/commitdiff/f86d9ab97bcdd8f192274f1a76f8f46b6d7da9b0
More information about the pld-cvs-commit
mailing list