summaryrefslogtreecommitdiff
path: root/EPD.txt
blob: 906826c32827c3d78dfb2c8d92c96590f4d48837 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
EPD_Spec: Extended Position Description Specification

Revised: 1995.11.26

Technical contact: sje@mv.mv.com (Steven J. Edwards)

1: Introduction

EPD is "Extended Position Description".  It is a standard for describing
chess positions along with an extended set of structured attribute
values using the ASCII character set.  It is intended for data and
command interchange among chessplaying programs.  It is also intended
for the representation of portable opening library repositories and for
problem test suites.

EPD is an open standard and is freely available for use by both research
and commercial programs without charge.  The only requirement for use is
that any proposed extensions be coordinated through the technical
contact given at the start of this document.

A single EPD record uses one text line of variable length composed of
four data fields followed by zero or more operations.  A text file
composed exclusively of EPD data records should have a file name with
the suffix ".epd".

2: History

EPD was created in 1993 and is based in part on the earlier FEN standard
(Forsyth-Edwards Notation) for representing chess positions.  Compared
to FEN, EPD has added extensions for use with opening library
preparation and also for general data and command interchange among
advanced chess programs.  EPD was developed by John Stanback and Steven
Edwards; its first implementation was in Stanback's commercial
chessplaying program Zarkov and its second implementation was in
Edwards' research chessplaying program Spector.  So many programs have
since adopted EPD that no one knows the exact sequence thereafter.

EPD is employed for storing test suites for chessplaying programs and
for recording the results of programs running these test suites.
Example test suites are available for researchers via anonymous ftp from
the chess.onenet.net site in the pub/chess/Tests directory.  The ASCII
text file pub/chess/Tests/Manifest gives descriptions of the contents of
the various test suite files.

EPD is used to provide a linkage mechanism between chessplaying programs
and position database programs to support the automated direction of
analysis generation.

3: EPD tools and applications

To encourage development of EPD capable applications, a free EPD tool
kit is available for program authors working with the ANSI C language.
To further encourage usage of EPD, a number of free applications are
also available.

3.1: The EPD Kit

Work is currently in progress on developing an EPD Kit.  This tool kit
is a collection of portable ANSI C source code files that provide
routines to create and manipulate EPD data for arbitrarily complex
records.  It is designed to handle all common EPD related tasks so as to
assist chess program developers with EPD implementation.  A secondary
goal is to ensure that every implementation of EPD processing have the
same set of operational semantics.

The EPD Kit will be made freely available to all chess software authors
without charge and can be used in both research and commercial
applications.  As with EPD itself, the only requirement for use is that
any proposed extensions be coordinated through the technical contact
given at the start of this document.

3.2: Argus, the automated tournament referee

Work is currently in progress on developing Argus, an automated
tournament referee program for computer chess events.  Argus uses IP
(Internet Protocol) communications to act as a mediator for multiple
pairs of chessplaying programs and to provide an interactive interface
for a human tournament supervisor.  Argus uses the EPD Kit along with
other routines to perform the following tasks:

1) Starting chessplaying programs (IP clients) with proper
initialization data;

2) Relaying position/move data (using EPD) from each program to its
opponent;

3) Providing all chess clock data as part of the relay process;

4) Record all games using PGN (Portable Game Notation) to assist in the
production of the tournament final report;

5) Record all moves and other transmitted data in log files for later
analysis;

6) Detect and report time forfeit conditions;

7) Mediate draw offers and responses between each pair of opponents;

8) Recognize and handle game termination conditions due to draws,
resignations, time forfeits, and checkmates;

9) Allow for chessplaying program restart and game resumption as
directed by the human supervisor;

10) Allow for a second instance of itself to operate in observer mode to
be ready to take over in case of primary machine failure;

11) Support display of games in progress for the benefit of the human
supervisor and for the general viewing audience.

In its usual configuration, Argus runs on an IP network that connects it
with all of the participating machines.  It acts like a Unix style
server using TCP/IP; the chessplaying programs connect to Argus as
TCP/IP clients.  Unlike a typical Unix style server, it runs in the
foreground instead of the background when operated by a human
supervisor.

One variant mode of operation allows for Argus to be started by the host
system and run in the background.  This use is intended for events where
human supervision is not required.  Any operating information usually
provided manually may instead be supplied by configuration files.

Another variant mode of operation allows for Argus to mediate
communication between a single pair of chessplaying programs using
regular (unstructured) bidirectional asynchronous serial communication
instead of IP.  While less reliable than IP operation, unstructured
serial communication can be used on common inexpensive hardware
platforms that lack IP support.  An example would be to use common PC
machines with each chessplaying program running on a separate machine
and a third machine running Argus in serial mode.  Each of the two
machines with chessplaying programs connect to the Argus machine via a
null modem cable.  Note that the Argus machine needs two free serial
ports while each of the chessplaying machines needs only a single free
serial port.
The Argus program will be made freely available to all chess software
authors without charge and can be used in both research and commercial
applications.  As with EPD itself, the only requirement for use is that
any proposed extensions be coordinated through the technical contact
given at the start of this document.

3.3: Gastric, an EPD based report generator

Work is in progress on Gastric, an application that reads EPD files and
produces statistical reports.  The main use of Gastric is to assist in
the process of benchmarking chessplaying program performance on EPD test
suites.  The resulting reports contain summaries of raw performance,
identification of solved/missed problems, distribution information for
node count, time consumption, and other items.  Advanced functions of
Gastric may be used to produce comparative analysis of different
programs or different versions of the same program.  Some work is also
planned to allow Gastric output to be used as feedback into
self-adjusting chessplaying programs.

The Gastric program will be made freely available to all chess software
authors without charge and can be used in both research and commercial
applications.  As with EPD itself, the only requirement for use is that
any proposed extensions be coordinated through the technical contact
given at the start of this document.

4: The four EPD data fields

Each EPD record contains four data filed that describe the current
position.  From left to right starting at the beginning of the record,
these are the piece placement, the active color, the castling
availability, and the en passant target square of a position.  These can
all fit on a single text line in an easily read format.  The length of
an EPD position description varies somewhat according to the position
and any associated operations. In some cases, the description could be
eighty or more characters in length and so may not fit conveniently on
some displays.  However, most EPD records pass among programs only and
so are not usually seen by program users.

Note: due to the likelihood of future expansion of EPD, implementors are
encouraged to have their programs handle EPD text lines of up to 4096
characters long including the traditional ASCII NUL character as a
terminator.  This is an increase from the earlier suggestion of a
maximum length of 1024 characters.  Depending on the host operating
system, the external representation of EPD records will include one or
more bytes to indicate the end of a line.  These do not count against
the length limit as the internal representation of an EPD text record is
stripped of end of line bytes and instead is terminated by the
traditional ASCII NUL character.

Each of the four EPD data fields are composed only of non-blank printing
ASCII characters.  Adjacent data fields are separated by a single ASCII
space character.

4.1: Piece placement data

The first field represents the placement of the pieces on the board.
The board contents are specified starting with the eighth rank and
ending with the first rank.  For each rank, the squares are specified
from file a to file h.  White pieces are identified by uppercase SAN
(Standard Algebraic Notation) piece letters ("PNBRQK") and black pieces
are identified by lowercase SAN piece letters ("pnbrqk").  Empty squares
are represented by the digits one through eight; the digit used
represents the count of contiguous empty squares along a rank.  The
contents of all eight squares on each rank must be specified; therefore,
the count of piece letters plus the sum of the vacant square counts must
always equal eight.  The solidus character "/" (forward slash) is used
to separate data of adjacent ranks.  There is no leading or trailing
solidus in the piece placement data; hence there are exactly seven of
solidus characters in the placement field.

The piece placement data for the starting array is:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR

4.2: Active color

The second field represents the active color.  A lower case "w" is used
if White is to move; a lower case "b" is used if Black is the active
player.

The piece placement and active color data for the starting array is:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w

4.3: Castling availability

The third field represents castling availability.  This indicates
potential future castling that may or may not be possible at the moment
due to blocking pieces or enemy attacks.  If there is no castling
availability for either side, the single character symbol "-" is used.
Otherwise, a combination of from one to four characters are present.  If
White has kingside castling availability, the uppercase letter "K"
appears.  If White has queenside castling availability, the uppercase
letter "Q" appears.  If Black has kingside castling availability, the
lowercase letter "k" appears.  If Black has queenside castling
availability, then the lowercase letter "q" appears.  Those letters
which appear will be ordered first uppercase before lowercase and second
kingside before queenside.  There is no white space between the letters.

The piece placement, active color, and castling availability data for
the starting array is:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq

4.4: En passant target square

The fourth field is the en passant target square.  If there is no en
passant target square then the single character symbol "-" appears.  If
there is an en passant target square then is represented by a lowercase
file character (one of "abcdefgh") immediately followed by a rank digit.
Obviously, the rank digit will be "3" following a white pawn double
advance (Black is the active color) or else be the digit "6" after a
black pawn double advance (White being the active color).

An en passant target square is given if and only if the last move was a
pawn advance of two squares.  Therefore, an en passant target square
field may have a square name even if there is no pawn of the opposing
side that may immediately execute the en passant capture.

The piece placement, active color, castling availability, and en passant
target square data for the starting array is:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -

5: Operations

An EPD operation is composed of an opcode followed by zero or more
operands and is concluded by a semicolon.

Multiple operations are separated by a single space character.  If there
is at least one operation present in an EPD line, it is separated from
the last (fourth) data field by a single space character.

5.1: General format of opcodes and operands

An opcode is an identifier that starts with a letter character and may
be followed by up to fourteen more characters.  Each additional
character may be a letter or a digit or the underscore character.
Traditionally, no uppercase letters are used in opcode names that are to
be used by more than one program.

An operand is either a set of contiguous non-white space printing
characters or a string.  A string is a set of contiguous printing
characters delimited by a quote (ASCII code: 34 decimal, 0x22
hexadecimal) character at each end.  A string value must have less than
256 bytes of data.  This count does not include the traditional ASCII
NUL character terminator.

If at least one operand is present in an operation, there is a single
space between the opcode and the first operand.  If more than one
operand is present in an operation, there is a single blank character
between every two adjacent operands.  If there are no operands, a
semicolon character is appended to the opcode to mark the end of the
operation.  If any operands appear, the last operand has an appended
semicolon that marks the end of the operation.

Any given opcode appears at most once per EPD record.  Multiple
operations in a single EPD record should appear in ASCII order of their
opcode names (mnemonics).  However, a program reading EPD records may
allow for operations not in ASCII order by opcode mnemonics; the
semantics are the same in either case.

Some opcodes that allow for more than one operand may have special
ordering requirements for the operands.  For example, the "pv"
(predicted variation) opcode requires its operands (moves) to appear in
the order in which they would be played.  Most other opcodes that allow
for more than one operand should have operands appearing in ASCII order.
An example of the latter set is the "bm" (best move[s]) opcode; its
operands are moves that are all immediately playable from the current
position.

5.2: Operand basetypes

Operand values are represented using a variety of basetypes.

5.2.1:  Identifier basetype

Some opcodes require one of more operands that are identifiers.  An
identifier is an unquoted sequence of one to fifteen characters.  The
characters are selected from the upper and lower case letters, the ten
digits, and the underscore character.  Most identifiers that may appear
in EPD are taken from predefined sets as explained in the sections
covering opcode semantics.

Identifiers are most often used to select one value from a list of
possible values for a general attribute.  They are also used to
represent PGN tag attributes.

5.2.2:  Chess move basetype

Some opcodes require one or more operands that are chess moves.  These
moves should be represented using SAN (Standard Algebraic Notation).  If
a different representation is used, there is no guarantee that the EPD
will be read correctly during subsequent processing.  In particular, EDN
(English Descriptive Notation), CCN (Computer Coordinate Notation), and
LAN (Long Algebraic Notation) are explicitly not supported.

Chess moves are used most often in single operand operations to select
one move from the available moves.  They are also used in multiple
operand operations to define a set of moves (all taken from available
moves) and in multiple operand operations to express a sequence of moves
(taken from moves available at each point in a forward sequence of
play).

Note that some chess moves also qualify as identifiers.  However, the
semantics of a particular opcode dictate the exact basetype
interpretation of its operands, so there is no ambiguity.

5.2.3:  Integer basetype

Some opcodes require one or more operands that are integers.  Some
opcodes may require that an integer operand must be within a given
range; the details are described in the opcode list given below.  A
negative integer is formed with a hyphen (minus sign) preceding the
integer digit sequence.  An optional plus sign may be used for
indicating a non-negative value, but such use is not required and is
discouraged.  Support for integers in the range -2147483648 to
2147483647 (32 bit two's complement signed extrema) is required.

Integers are used to represent centipawn scores and also for various
counts, limits, and totals.

5.2.4:  Floating basetype

Some opcodes require one or more operands that are floating point
numbers.  Some opcodes may require that a floating point operand must be
within a given range; the details are described in the opcode list given
below.  A floating point operand is constructed from an optional sign
character ("+" or "-"), a digit sequence (with at least one digit), a
radix point (always "."), and a final digit sequence (with at least one
digit).  There is currently no provision for scientific representation
of numeric values.

The floating basetype in not in current use.

5.2.5:  Date basetype

Some opcodes require one or more operands that represent dates.  These
are given in a special date format composed of ten characters.  The
first four characters are digits that give the year (0001-9999), the
fifth character is a period, the sixth and seventh characters are digits
that give the month number (01-12), the eighth character is a period,
and the ninth and tenth characters are digits that give the day number
in the month (01-31).

The date basetype is used to specify date values in timestamps.

5.2.6:  Time of day basetype

Some opcodes require one or more operands that represent a time of day.
These are given in a special time of day format composed of eight
characters.  The first two characters are digits that give the hour
(00-23), the third character is a colon, the fourth and fifth characters
are digits that give the minute (00-59), the sixth character is a colon,
and the seventh and eighth characters are digits that give the second
(00-59).

The time of day basetype is used to specify time of day values in
timestamps.

5.2.7:  Clock basetype

Some opcodes require one or more operands that represent a total amount
of time as would be measured by a traditional digital clock.  These are
given in a special clock format composed of 12 characters.  The first
three characters are digits giving a count of days (000-999), the fourth
character is a colon, the fifth and sixth characters are digits giving a
count of hours (00-23), the seventh character is a colon, the eighth and
ninth characters are digits giving a count of minutes (00-59), the tenth
character is a colon, and the eleventh and twelfth characters are digits
giving a count of seconds (00-59).

The clock basetype is used to specify clock values for chess clock
information.  It is not used to measure time consumption for a search;
an integer count of seconds is used instead.

5.3: Opcode mnemonics

An opcode mnemonic used for archival storage and for interprogram
communication starts with a lower case letter and is composed of only
lower case letters, digits, and the underscore character (i.e., no upper
case letters).  Mnemonics are all at least two characters long.

Opcode mnemonics used only by a single program or an experimental suite
of programs should start with an upper case letter.  This is so they may
be easily distinguished should they be inadvertently be encountered by
other programs.  When a such a "private" opcode be demonstrated to be
widely useful, it should be brought into the official list (appearing
below) in a lower case form.

If a given program does not recognize a particular opcode, that
operation is simply ignored; it is not signaled as an error.

6: Opcode list

The opcodes are listed here in ASCII order of their mnemonics.
Suggestions for new opcodes should be sent to the technical contact
listed near the start of this document.

6.1: Opcode "acn": analysis count: nodes

The opcode "acn" takes a single non-negative integer operand.  It is
used to represent the number of nodes examined in an analysis or search.
Note that the value may be quite large for some extended searches and so
use of a long (four byte) representation is suggested.

6.2: Opcode "acs": analysis count: seconds

The opcode "acs" takes a single non-negative integer operand.  It is
used to represent the number of seconds used for an analysis or search.
Note that the value may be quite large for some extended searches and so
use of a long (four byte) representation is suggested.  Also note that
the special clock format is not used for this operand.  Some systems can
distinguish between elapsed time and processor time; in such cases, the
processor time should be used as its value is usually more indicative of
search effort than wall clock time.

6.3: Opcode "am": avoid move(s)

The opcode "am" indicates a set of zero or more moves, all immediately
playable from the current position, that are to be avoided as a search
result.  Each operand is a SAN move; they appear in ASCII order.

6.4: Opcode "bm": best move(s)

The opcode "bm" indicates a set of zero or more moves, all immediately
playable from the current position, that are judged to the best
available by the EPD writer and so each is allowable as a search result.
Each operand is a SAN move; they appear in ASCII order.

6.5: Opcode "c0": comment (primary, also "c1" though "c9")

The opcode "c0" (lower case letter "c", digit character zero) indicates
a top level comment that applies to the given position.  It is the first
of ten ranked comments, each of which has a mnemonic formed from the
lower case letter "c" followed by a single decimal digit.  Each of these
opcodes takes either a single string operand or no operand at all.

This ten member comment family of opcodes is intended for use as
descriptive commentary for a complete game or game fragment.  The usual
processing of these opcodes are as follows:

1) At the beginning of a game (or game fragment), a move sequence
scanning program initializes each element of its set of ten comment
string registers to be null.

2) As the EPD record for each position in the game is processed, the
comment operations are interpreted from left to right.  (Actually, all
operations in an EPD record are interpreted from left to right.)
Because operations appear in ASCII order according to their opcode
mnemonics, opcode "c0" (if present) will be handled prior to all other
opcodes, then opcode "c1" (if present), and so forth until opcode "c9"
(if present).

3) The processing of opcode "cN" (0 <= N <= 9) involves two steps.
First, all comment string registers with an index equal to or greater
than N are set to null.  (This is the set "cN" though "c9".)  Second,
and only if a string operand is present, the value of the corresponding
comment string register is set equal to the string operand.

6.6: Opcode "cc": chess clock values

The opcode "cc" is used to indicate the amount of time used for each
side at the time of the writing of the opcode to the EPD record.  This
opcode always takes two values.  Both values are in clock format.  The
first is the amount of time consumed by White and the second is the
amount of time consumed by Black.  Note that these values are not simple
integers.  Also, there is no provision for recording at a resolution of
less than one second.

This opcode is most commonly used by a mediation program as a source of
impartial time information for a pair of opposing players.

6.7: Opcode "ce": centipawn evaluation

The opcode "ce" indicates the evaluation of the indicated position in
centipawn units.  It takes a single operand, an optionally signed
integer that gives an evaluation of the position from the viewpoint of
the active player; i.e., the player with the move.  Positive values
indicate a position favorable to the moving player while negative values
indicate a position favorable to the passive player; i.e., the player
without the move.  A centipawn evaluation value close to zero indicates
a neutral positional evaluation.

Values are restricted to integers that are equal to or greater than
-32768 and
are less than or equal to 32766.

A value greater than 32000 indicates the availability of a forced mate
to the active player.  The number of plies until mate is given by
subtracting the evaluation from the value 32767.  Thus, a winning mate
in N fullmoves is a mate in ((2 * N) - 1) halfmoves (or ply) and has a
corresponding centipawn evaluation of (32767 - ((2 * N) - 1)).  For
example, a mate on the move (mate in one) has a centipawn evaluation of
32766 while a mate in five has a centipawn evaluation of 32758.

A value less than -32000 indicates the availability of a forced mate to
the passive player.  The number of plies until mate is given by
subtracting the evaluation from the value -32767 and then negating the
result.  Thus, a losing mate in N fullmoves is a mate in (2 * N)
halfmoves (or ply) and has a corresponding centipawn evaluation of
(-32767 + (2 * N)).  For example, a mate after the move (losing mate in
one) has a centipawn evaluation of -32765 while a losing mate in five
has a centipawn evaluation of -32757.

A value of -32767 indicates that the side to move is checkmated.  A
value of -32768 indicates an illegal position.  A stalemate position has
a centipawn evaluation of zero as does a position drawn due to
insufficient mating material.  Any other position known to be a certain
forced draw also has a centipawn evaluation of zero.

6.8: Opcode "dm": direct mate fullmove count

The "dm" opcode is used to indicate the number of fullmoves until
checkmate is to be delivered by the active color for the indicated
position.  It always takes a single operand which is a positive integer
giving the fullmove count.  For example, a position known to be a "mate
in three" would have an operation of "dm 3;" to indicate this.

This opcode is intended for use with problem sets composed of positions
requiring direct mate answers as solutions.

6.9: Opcode "draw_accept": accept a draw offer

The opcode "draw_accept" is used to indicate that a draw offer made
after the move that lead to the indicated position is accepted by the
active player.  This opcode takes no operands.

The "draw_accept" opcode should not appear on the same EPD record as a
"draw_reject" opcode.

6.10: Opcode "draw_claim": claim a draw

The opcode "draw_claim" is used to indicate claim by the active player
that a draw exists.  The draw is claimed because of a third time
repetition or because of the fifty move rule or because of insufficient
mating material.  A supplied move (see the opcode "sm") is also required
to appear as part of the same EPD record.  The "draw_claim" opcode takes
no operands.

The "draw_claim" opcode should not appear on the same EPD record as a
"draw_offer" opcode.

6.11: Opcode "draw_offer": offer a draw

The opcode "draw_offer" is used to indicate that a draw is offered by
the active player.  A supplied move (see the opcode "sm") is also
required to appear as part of the same EPD record; this move is
considered played from the indicated position.  The "draw_offer" opcode
takes no operands.

The "draw_offer" opcode should not appear on the same EPD record as a
"draw_claim" opcode.

6.12: Opcode "draw_reject": reject a draw offer

The opcode "draw_reject" is used to indicate that a draw offer made
after the move that lead to the indicated position is rejected by the
active player.  This opcode takes no operands.

The "draw_reject" opcode should not appear on the same EPD record as a
"draw_accept" opcode.

6.13: Opcode "eco": _Encyclopedia of Chess Openings_ opening code

The opcode "eco" is used to associate an opening designation from the
_Encyclopedia of Chess Openings_ taxonomy with the indicated position.
The opcode takes either a single string operand (the ECO opening name)
or no operand at all.  If an operand is present, its value is associated
with an "ECO" string register of the scanning program.  If there is no
operand, the ECO string register of the scanning program is set to null.

The usage is similar to that of the "ECO" tag pair of the PGN standard.

6.14: Opcode "fmvn": fullmove number

The opcode "fmvn" represents the fullmove number associated with the
position.  It always takes a single operand that is the positive integer
value of the move number.  The value of the fullmove number for the
starting array is one.

This opcode is used to explicitly represent the fullmove number in EPD
that is present by default in FEN as the sixth field.  Fullmove number
information is usually omitted from EPD because it does not affect move
generation (commonly needed for EPD-using tasks) but it does affect game
notation (commonly needed for FEN-using tasks).  Because of the desire
for space optimization for large EPD files, fullmove numbers were
dropped from EPD's parent FEN.  The halfmove clock information was
similarly dropped.

6.15: Opcode "hmvc": halfmove clock

The opcode "hmvc" represents the halfmove clock associated with the
position.  The halfmove clock of a position is equal to the number of
plies since the last pawn move or capture.  This information is used to
implement the fifty move draw rule.  It always takes a single operand
that is the non-negative integer value of the halfmove clock.  The value
of the halfmove clock for the starting array is zero.

This opcode is used to explicitly represent the halfmove clock in EPD
that is present by default in FEN as the fifth field.  Halfmove clock
information is usually omitted from EPD because it does not affect move
generation (commonly needed for EPD-using tasks) but it does affect game
termination issues (commonly needed for FEN-using tasks).  Because of
the desire for space optimization for large EPD files, halfmove clock
values were dropped from EPD's parent FEN.  The fullmove number
information was similarly dropped.

6.16: Opcode "id": position identification

The opcode "id" is used to provide a simple identification label for the
indicated position.  It takes a single string operand.

This opcode is intended for use with test suites used for measuring
chessplaying program strength.  An example "id" operand for the seven
hundred fifty seventh position of the one thousand one problems in
Reinfeld's _1001 Winning Chess Sacrifices and Combinations_ would be
"WCSAC.0757" while the fifteenth position in the twenty four problem
Bratko-Kopec test suite would have an "id" operand of "BK.15".

6.17: Opcode "nic": _New In Chess_ opening code

The opcode "nic" is used to associate an opening designation from the
_New In Chess_ taxonomy with the indicated position.  The opcode takes
either a single string operand (the NIC code for the opening) or no
operand at all.  If an operand is present, its value is associated with
an "NIC" string register of the scanning program.  If there is no
operand, the NIC string register of the scanning program is set to null.

The usage is similar to that of the "NIC" tag pair of the PGN standard.

6.18: Opcode "noop": no operation

The "noop" opcode is used to indicate no operation.  It takes zero or
more operands, each of which may be of any type.  The operation involves
no processing.  It is intended for use by developers for program testing
purposes.

6.19: Opcode "pm": predicted move

The "pm" opcode is used to provide a single predicted move for the
indicated position.  It has exactly one operand, a move playable from
the position.  This move is judged by the EPD writer to represent the
best move available to the active player.

If a non-empty "pv" (predicted variation) line of play is also present
in the same EPD record, the first move of the predicted variation is the
same as the predicted move.

The "pm" opcode is intended for use as a general "display hint"
mechanism.

6.20: Opcode "ptp": PGN tag pair

The "ptp" opcode is used to record a PGN tag pair.  It always takes an
even number of operands.  For each pair of operands (from left to
right), the first operand in the pair is always an identifier and is
interpreted as the name of a PGN tag; the second operand in the pair is
always a string and is the value associated with the tag given by the
first operand.

Any given PGN tag name should only appear once as a tag identifier
operand in a "ptp" operation.

6.21: Opcode "pv": predicted variation

The "pv" opcode is used to provide a predicted variation for the
indicated position.  It has zero or more operands which represent a
sequence of moves playable from the position.  This sequence is judged
by the EPD writer to represent the best play available.

If a "pm" (predicted move) operation is also present in the same EPD
record, the predicted move is the same as the first move of the
predicted variation.

6.22: Opcode "rc": repetition count

The "rc" opcode is used to indicate the number of occurrences of the
indicated position.  It takes a single, positive integer operand.  Any
position, including the initial starting position, is considered to have
an "rc" value of at least one.  A value of three indicates a candidate
for a draw claim by the position repetition rule.

6.23: Opcode "refcom": referee command

The "refcom" opcode is used to represent a command from a referee
program to a client program during automated competition.  It takes a
single identifier operand which is to be interpreted as a command by the
receiving program.  Note that as the operand is an identifier and not a
string value, it is not enclosed in quote characters.

There are seven available operand values: conclude, disconnect, execute,
fault, inform, reset, and respond.

Further details of "refcom" usage are given in the section on referee
semantics later in this document.

6.24: Opcode "refreq": referee request

The "refreq" opcode is used to represent a request from a client program
to the referee program during automated competition.  It takes a single
identifier operand which is to be interpreted as a request to the
referee from a client program.  Note that as the operand is an
identifier and not a string value, it is not enclosed in quote
characters.

There are four available operand values: fault, reply, sign_off, and
sign_on.

Further details of "refreq" usage are given in the section on referee
semantics later in this document.

6.25: Opcode "resign": game resignation

The opcode "resign" is used to indicate that the active player has
resigned the game.  This opcode takes no operands.

The "resign" opcode should not appear on the same EPD record with any of
the following opcodes: "draw_accept", "draw_claim", "draw_decline', and
"draw_offer".

6.26: Opcode "sm": supplied move

The "sm" opcode is used to provide a single supplied move for the
indicated position.  It has exactly one operand, a move playable from
the position.  This move is the move to be played from the position.

If a "sv" (supplied variation) operation is present on the same record
and has at least one operand, then its first operand must match the
single operand of the "sm" opcode.

The "sm" opcode is intended for use to communicate the most recent
played move in an active game.  It is used to communicate moves between
programs in automatic play via a network.  This includes correspondence
play using e-mail and also programs acting as network front ends to
human players.

6.27: Opcode "sv": supplied variation

The "sv" opcode is used to provide zero or more supplied moves for the
indicated position.  The operands are a move sequence playable from the
position.

If an "sm" (supplied move) operation is also present on the same record
and the "sv" operation has at least one operand, then the "sm" operand
must match the first operand of the "sv" operation.

6.28: Opcode "tcgs": telecommunication: game selector

The "tcgs" opcode is one of the telecommunication family of opcodes used
for games conducted via e-mail and similar means.  This opcode takes a
single operand that is a positive integer.  It is used to select among
various games in progress between the same sender and receiver.

Details of e-mail implementation await further development.

6.29: Opcode "tcri": telecommunication: receiver identification

The "tcri" opcode is one of the telecommunication family of opcodes used
for games conducted via e-mail and similar means.  This opcode takes two
order dependent string operands.  The first operand is the e-mail
address of the receiver of the EPD record.  The second operand is the
name of the player (program or human) at the address who is the actual
receiver of the EPD record.

Details of e-mail implementation await further development.

6.30: Opcode "tcsi": telecommunication: sender identification

The "tcsi" opcode is one of the telecommunication family of opcodes used
for games conducted via e-mail and similar means.  This opcode takes two
order dependent string operands.  The first operand is the e-mail
address of the sender of the EPD record.  The second operand is the name
of the player (program or human) at the address who is the actual sender
of the EPD record.

Details of e-mail implementation await further development.

6.31: Opcode "ts": timestamp

The "ts" opcode is used to record a timestamp value.  It takes two
operands.  The first operand is in date format and the second operand is
in time of day format. The interpretation of the combined operand values
gives the time of the last modification of the EPD record.  The
timestamp is interpreted to be in UTC (Universal Coordinated Time,
formerly known as GMT).

6.32: Opcode "v0": variation name (primary, also "v1" though "v9")

The opcode "v0" (lower case letter "v", digit character zero) indicates
a top level variation name that applies to the given position.  It is
the first of ten ranked variation names, each of which has a mnemonic
formed from the lower case letter "v" followed by a single decimal
digit.  Each of these opcodes takes either a single string operand or no
operand at all.

This ten member variation name family of opcodes is intended for use as
traditional variation names for a complete game or game fragment.  The
usual processing of these opcodes are as follows:

1) At the beginning of a game (or game fragment), a move sequence
scanning program initializes each element of its set of ten variation
name string registers to be null.

2) As the EPD record for each position in the game is processed, the
variation name operations are interpreted from left to right.
(Actually, all operations in an EPD record are interpreted from left to
right.)  Because operations appear in ASCII order according to their
opcode mnemonics, opcode "v0" (if present) will be handled prior to all
other opcodes, then opcode "v1" (if present), and so forth until opcode
"v9" (if present).

3) The processing of opcode "vN" (0 <= N <= 9) involves two steps.
First, all variation name string registers with an index equal to or
greater than N are set to null.  (This is the set "vN" though "v9".)
Second, and only if a string operand is present, the value of the
corresponding variation name string register is set equal to the string
operand.

7: EPD processing verbs

An EPD processing verb is a command to an EPD capable program used to
direct processing of one or more EPD files.  Standardization of verb
semantics among EPD capable programs is important to helping reduce
confusion among program users and to better insure overall
interoperatibilty.

Each EPD processing verb that requires the reading of EPD records has a
specific set of required opcodes that must be on each input record.
Each EPD processing verb that requires the writing of EPD records has a
specific set of required opcodes that must be on each output record.
Some EPD processing verbs imply both reading and writing EPD records;
these will have requirements for both input and output opcode sets.

The names of the EPD processing verbs in this section are for use for
specification purposes only.  Program authors are free to select
different names as appropriate for the needs of a program's user
interface.

7.1: EPD verb: pfdn (process file: data normalization)

The "pfdn" (process file: data normalization) verb reads an EPD input
file and produces a normalized copy of the data on as the EPD output
file.  The output file retains the record ordering of the input file.
The noramlization is used to produce a canonical representation of the
EPD.  The input records are also checked for legality.  There is no
minimum set of operations requires on the input records.  For each input
record, all of the operations present are reproduced in the
corresponding output record.

The normalization of each EPD record consists of the following actions:

1) Any leading whitespace characters are removed.

2) Any trailing whitespace characters are removed.

3) Any unneeded whitespace characters used as data separators are
removed; a single blank is used to separate adjacent fields, adjacent
operations, and adjacent operands.  Also, a single blank character is
used to separate the fourth position data field (the en passant target
square indication) from the first operation (if present).

4) Operations are reordered in increasing ASCII order by opcode
mnemonic.

5) Operands for each opcode that does not require a special order of
interpretation are reordered in increasing ASCII order by external
representation.

Data normalization is useful for making a canonical version from data
produced by programs or other sources that do not completely conform to
the lexigraphical and ordering rules of the EPD standard.  It also helps
when comparing two EPD files from different sources on a line by line
basis; the non-semantic differences are removed so that different text
lines indicate true semantic difference.

7.2: EPD verb: pfga (process file: general analysis)

The "pfga" (process file: general analysis) verb is used to instruct a
chessplaying program to perform an analysis for each EPD input record
and produce an EPD output file containing this analysis.  The output
file retains the record ordering of the input file.  The current
position given by each input record is not changed; it is copied to the
output.

Each input EPD record receives the same analysis effort.  The level of
effort is indicated as a command (separate from EPD) to the analysis
program prior to the start of the EPD processing.  Usually, the level is
given as a time limit or depth limit per each position.  The limit can
be either a hard limit or a soft limit.  A hard limit represents an
absolute maximum effort per position, while a soft limit allows the
program to spend more or less effort per position.  The hard limit
interpretation is preferred for comparing programs.  The soft limit
interpretation is used to help test time allocation strategy where a
program can choose to take more or less time depending on the complexity
of a position.

Each EPD output record is a copy of the corresponding EPD input record
with new analysis added as a result of the verb processing.

There is no minimum set of operations required for the EPD input
records.

Each output EPD record must contain:

1) A "pv" (predicted variation) operation.  The operands of this form a
sequence of chess moves to be played from the given position.  The
length of this may vary from record to record due to the level of
anaylsis effort and the complexity of each position. However, unless the
current position represents a checkmate or stalemate for the side to
move, the pv operation must include at least one move.  If the current
position represents a checkmate or stalemate for the side to move, then
the pv operation still appears, but has no operands.

2) A "ce" (centipawn evaluation) operation.  The value of its operand is
the value in hundredths of a pawn of the current position.  Note that
the evaluation is assigned to the position before the predicted move (or
any other move) is made.  Thus, a positive centipawn score indicates an
advantage for the side to move in the current position while a negative
score indicates a disadvantage for the side to move.

Each output EPD record may also contain:

1) A "pm" (predicted move) operation, unless the current position
represents a checkmate or stalemate for the side to move.  (If the side
to move has no moves, then the "pm" operation will not appear.)  The
single operand of the "pm" opcode must be the same as the first operand
of the "pv" sequence.

2) A "sm" (supplied move) operation, unless the current position
represents a checkmate or stalemate for the side to move.  (If the side
to move has no moves, then the "sm" operation will not appear.)  The
single operand of the "sm" opcode must be the same as the first operand
of the "pv" sequence.

3) An "acn" (analysis count: nodes) operation.  The single operand is
the number of nodes visited in the analysis search for the position.

4) An "acs" (analysis count: seconds) operation.  The single operand is
the number of seconds used for the analysis search for the position.

7.3: EPD verb: pfms (process file: mate search)

The "pfms" verb is used to conduct searches for forced checkmating
sequences.  The length of the forced mate sequence is provided (outside
of EPD) to the program prior to the beginning of "pfms" processing.  The
length is specified using a fullmove count.  For example, a fullmove
mate length of three would instruct the program to search for all mates
in three.  An analysis program reads and input EPD file and looks for
forced mates in each position where no forced mate of equal or lesser
length has been recorded.  The output file retains the record ordering
of the input file.

The action of the "pfms" command on each record is governed by the
pre-specified fullmove count and, if present on the record, the value of
the "dm" (direct mate fullmove count) operand.  A particular record will
be subject to a search for a forced mate if either:

1) There is no "dm" operation on the input record, or

2) The value of the "dm" operand on the input record is greater than the
value of the pre-specified fullmove analysis length.

If the analysis program finds a forced mate, it produces two additional
operations on the corresponding output EPD record:

1) A "dm" operation with an operand equal to the pre-specified fullmove
mate length.

2) A "pm" operation with the first move of the mating sequence as its
operand.  If two or more such moves exist, the program selects the first
one it located to appear as the "pm" operand.

The idea is that a set of positions can be repeatedly scanned by a mate
finding program with the fullmove analysis depth starting with a value
of one and being increased by one with each pass.  For any given pass,
the positions solved by an earlier pass are skipped.

The output EPD records may also contain other (optional) information
such as "acn", "acs", and "pv" operations.

7.4: EPD verb: pfop (process file: operation purge)

The "pfop" verb is used to purge a particular operation from each of the
records in an EPD file that contain the operation.  The output file
retains the record ordering of the input file.  Prior to processing, the
opcode of the operation to be purged is specified.

The records of the input file are copied to the output file.  If the
pre-specified operation is present on a record, the operation is removed
prior to copying the record to the output.

7.5: EPD verb: pfts (process file: target search)

The "pfts" (process file: target search) verb is similar to the "pfga"
(process file: general analysis) verb in that each position on the EPD
input file is subject to a general analysis.  The difference is that
each input record contains a set of target moves and a set of avoidance
moves.  Either of these two sets, but not both, may be empty.  The set
of avoidance moves is given by the operands of a "am" opcode (if
present).  The set of target moves is given by the operands of a "bm"
opcode (if present).

Prior to processing the target search, the program is given a search
effort limit such as a limit on the amount of search time or search
nodes per position.  The "pfts" verb causes each input EPD record to be
read, subjected to analysis, and then written to output file with the
predicted move attached with the "pm" opcode.  (No "pm" operation is
added is the current position is a checkmate or stalemate of the side to
play.)

The output EPD records may also contain other (optional) information
such as "acn", "acs", and "pv" operations.

8: EPD referee semantics

Communication between a chessplaying program and a referee program is
performed by exchanging EPD records.  Each EPD record emitted by a
chessplaying program to be received by the referee has a "refreq" EPD
opcode with an operand that describes the request.  Each EPD record
emitted by a referee to be received by a chessplaying program has a
"refcom" EPD opcode with an operand that describes the command.

The usual operation sequence in a referee mediated event is as follows:

1) The referee server program is started and the human event supervisor
provides it with any necessary tournament information including the
names of the chessplaying programs, the name of the event, and various
other data.

2) The referee program completes its initialization by performing
pairing operations as required.

3) Once the server has its initial data, it then opens a socket and
binds it to the appropriate port.  It then starts listening for input
from clients.  For a serial implementation, an analogous function is
performed.

4) The competing chessplaying programs (clients) are started (if not
already running) and are given the name of the referee host machine
along with the port number.  For a serial implementation, an analogous
function is performed.

5) Each client program transmits an EPD record to the referee requesting
registration.  This causes each client to be signed on to the referee.

6) The referee program replies to each client signing on with an EPD
record commanding a reset operation to set up for a new game.

7) The referee program sends an EPD record to each client informing each
client about the values for each of the tag values for the PGN Seven Tag
Format.

8) For each client on the move, the referee will send an EPD record
commanding a response.  This causes each receiving client to calculate a
move.  If there has been a prior move, it along with the position from
which the move is played is sent.  If there has been no prior move, the
current position is sent but no move is included.

9) For each client receiving a command to respond, the current position
indicated by the record is set as the current position in the receiving
program.  (It should already be the current position in the receiver.)
If a supplied move was given, it is executed on the current position.
Finally, the receiving program calculates a move.

10) As each program on the move completes its calculation, it sends a
reply to the referee which includes the result of the calculation.  The
position sent back on the reply is the result of applying the move
received on the referee record to the position on the same received
record.  If a move was produced as the result of the calculation, it is
also sent.  (A move will not be produced or sent if the receving client
was checkmated, or if it was stalemated, of if it resigns, or claims a
draw due to insufficient material.)

11) As the referee receives a reply from a client, it produces a respond
command record to the client's opponent.  (This step will be skipped if
an end of game condition is detected and no further moves need to be
communicated.)

12) The referee continues with the respond/reply cycle for each pair of
opponent clients until the game concludes for that pair.

13) For each game conclusion, the referee sends a conclude command to
each of the clients involved.

14) When a client is to be removed from competition, it sends a sign off
request.  This eliminates that program from being paired until it
re-registers with a sign on request.

15) When the referree server is to be removed from network operations,
it will send a disconnect command to each client that is currently
signed on to the referee.

8.1: Referee commands (client directives)

The referee communicates the command of interest as the single operand
of the "refcom" opcode.  The refcom opcode will be on each record sent
by the referee.  Each possible refcom operand is sent as an identifier
(and not as a string).

EPD records sent by the referee will include check clock data as
appropriate.  Whenever a client program receives a record with the "cc"
(chess clock) opcode, the client should set the values of its internal
clocks to the values specified by the cc operands.  Note that the clock
values for both White and Black are present in a cc operation.

All EPD records carry the four data fields describing the current
position.  In most cases, this position should also be the current
position of the receiving client.  If the position sent by the referee
matches the client's current position, then the client can assume that
all of the game history leading to the current position is valid.  Thus,
every client keeps track of the game history internally and uses this to
detect repetition draws and so there is no need for each EPD record to
contain a complete copy of the game history.

If the position sent by the referee does not match the receiving
program's current position, then the receiving program must set its
current position to be the same as the one it received.  Unless an
explicit game history move sequence is also sent on the same EPD record,
the receiving program is to assume that the new (different) position
received has no game history.  In this case the receiving program cannot
check for repetition of positions prior to the new position as there
aren't any previous positions in the game.

Each client is expected to maintain its own copy of the halfmove clock
(plies since last irreversible move; starts at zero for the initial
position) and the fullmove number (which has a value of one for the
initial position).  If the referee sends a halfmove clock value or a
fullmove number which is different from that kept by the program, then
the receiving program is to treat it as a new position and clear any
game history.  As noted above, a halfmove clock is sent using the "hmvc"
opcode and a fullmove number is sent using a "fmvn" opcode.

If a supplied move (always using the "sm" opcode) is sent by the
referee, the receiving program must execute this move on the current
position.  This is done after the program's current position is set to
the position sent by the referee (remember that the two will usually
match).  The resulting position becomes the new current position.  This
new current position is used for all further calculations.  The new
current position is also the position to be sent to the referee if a
move response is commanded.  When a client program produces a move to be
played, it uses the sm opcode with its operand being the supplied move.
The position sent is alwasy the position from which the supplied move is
to be played.  Thus, the semantics of the current position and the
supplied move are symmetric with respect to the client and the server.

8.1.1: Referee command: conclude

The "conclude" refcom operand instructs the client to conclude the
current game in progress.  The position sent is the final position of
the game.  There is no supplied move sent.  No further EPD records
concerning the game will be sent by the referee.  The client should
perform any end of game activity required for its normal operation.  No
response from the client is made.

To allow for client game conclusion processing time, the referee will
avoid sending any more EPD records to a client concluding a game for a
time period set by the human supervisor.  The default delay will be five
seconds.

8.1.2: Referee command: disconnect

The "disconnect" refcom operand instructs the client that the referee is
terminating service operations.  The client should close its
communication channel with the server.  This command is sent at the end
of an event or whenever the referee is to be brought down for some
reason.  No further EPD records will be sent until the server is cycled.
It provides an opportunity for a client to gracefully disconnect from
network operations with the server.  No supplied move is sent.  The
position sent is irrelevant.  No response from the client is made.

8.1.3: Referee command: execute

The "execute" refcom operand instructs the client to set up a position.
If a move is supplied (it usually is), then that move is executed from
the position.  The sent position will usually be the receiver's current
position.  This command is used only to play through the initial
sequence of moves from a game to support a restart capability.  No
response is made by the receiver.

8.1.4: Referee command: fault

The "fault" refcom operand is used to indicate that the referee has
detected an unrecoverable fault.  The reciever should signal for human
intervention to assist with corrective action.  The human supervisor
will be notified by the referee regarding the nature of the fault.  No
response is made by the receiver.

A future version of the referee protocol will support some form of
automated fault recovery.

8.1.5: Referee command: inform

The "inform" refcom operand is used to convey PGN tag pair data to the
receiver.  The "ptp" opcode will carry the PGN tag data to be set on the
receiving client.  This command may be sent at any time.  It will
usually be sent prior to the first move of a game.  It will also be sent
after the last move of a game to communicate the result of the game via
the PGN "Result" tag pair.  No response is made by the receiver.

The main purpose for the inform referee command is to be able to
communcate tag pair data to a client without having to send a move or
other command.  Note that the ptp opcode may also appear on EPD records
from the referee that are not inform commands; its operands are
processed in the same way.

The usual information sent includes the values for the Seven Tag Roster.
The PGN tag names are "Event", "Site", "Date", "Round", "White",
"Black", and "Result".

Future versions of the referee will likely send more than just the Seven
Tag Roster of PGN tag pairs.  One probable addition will be to send the
"TimeControl" tag pair prior to the start of a game; this will allow a
receiving program to have its time control parameters set automatically
rather than manually.

8.1.6: Referee command: reset

The "reset" refcom operand is used to command the receiving client to
set up for a new game.  Any previous information about a game in
progress is deleted.  This command will be sent to mark the beginning of
a game.  It will also be sent if there is a need to abort the game
currently in progress.  No response is made by the receiver.

To allow for client reset processing time, the referee will avoid
sending any more EPD records to a resetting client for a time period set
by the human supervisor.  The default delay will be five seconds.

8.1.7: Referee command: respond

The "respond" refcom operand is used to command the receiving client to
respond to the move (if any) played by its opponent.  The position to
use for calculation is the position sent which is modified by a supplied
move (if present; uses the "sm" opcode).  The client program calculates
a response and sends it to the referee using the "reply" operand of the
"refreq" opcode.

8.2: Referee requests (server directives)

The referee communicates the command of interest as the single operand
of the "refcom" opcode.  The refcom opcode will be on each record sent
by the referee.  Each possible refcom operand is sent as an identifier
(and not as a string).

8.2.1: Referee request: fault

The "fault" refreq operand is used to indicate that the client has
detected an unrecoverable fault.  The receiver should signal for human
intervention to assist with corrective action.  The human supervisor
will be notified by the referee regarding the nature of the fault.  No
response is made by the referee.

A future version of the referee protocol will support some form of
automated fault recovery.

8.2.2: Referee request: reply

The "reply" refreq operand is used to carry a reply by the client
program.  Usually, a move (the client's reply) is included as the
operand of the "sm" opcode.

8.2.3: Referee request: sign_off

The "sign_off" refreq operand is used to indicate that the client
program is signing off from the referee connection and no further
operations will be made on the communication channel.  The channel in
use is then closed by both the referee and the client.

A new connection must be established and a new "sign_on" referee request
needs to be made for further referee operations with the client.

8.2.4: Referee request: sign_on

The "sign_on" refreq operand is used to indicate that the client program
is signing on to the referee connection.  This request is required
before any further operations can be made on the communication channel.
The channel in use remains open until it is closed by either side.

9: EPD report generation semantics

[TBD]

EPD_Spec: EOF