English version | Русская версия  
 
Кветка логотип
Кветка

Программа для анализа шахматных партий
 
 

Описание формата EPD

Формат EPD (Extended Position Description) используется для описания шахматных позиций вместе со связанной с ними дополнительной информацией. В этом формате кроме непосредственно расположения фигур на доске могут содержаться различные продолжения из заданной позиции, оценки, команды для обрабатывающих программ и многое другое. Он может использоваться для обмена данными и командами между шахматными программами, а также для создания и хранения баз шахматных задач.

Любой файл в формате EPD состоит из набора строк, каждая строка разделяется символом перевода строки. Длина строки не фиксирована, хотя её длина ограничена 4096 символами. С современными компьютерами на это ограничение сильно полагаться не стоит.

В каждой строке содержится информация ровно об одной позиции. Она состоит из 4-х полей, описывающих позицию, за которыми могут следовать дополнительные команды.

Поля, описывающие позицию

Каждое поле отделяется от соседних единственным символом пробела. Внутри описания полей символ пробела не используется. Слева направо значение каждого поля следующее: расположение фигур, цвет ходящего следующим игрока, возможность рокировки и информация о взятии на проходе. Формат этих полей совпадают с аналогичными полями в формате FEN:
  1. Расположение фигур. Описывается построчно сверху-вниз (с 8-й строки до 1-й). Описания отдельных строк разделяются символом "/". Внутри отдельной строчки клетки описываются слева-направо (от a до h). Каждая фигура кодируется латинским символом: пешка - "P", конь - "N", слон - "B", ладья - "R", королева - "Q", король - "K". Белые фигуры кодируются прописными символами ("PNBRQK"), а чёрные - строчными ("pnbrqk"). Пустые клетки кодируются числом от 1 до 8, означающем число идущих подряд пустых клеток. Пример описания этого поля для стартовой позиции:
    
    rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
    
  2. Цвет ходящего следующим игрока. Символ "w" означает, что сейчас будет ход белых, а "b" - чёрных.
  3. Возможность рокировки. Если никто рокировку уже сделать не может, то используется символ "-". В противном случае, используется набор символов: "K" - белые могут сделать короткую рокировку, "Q" - белые могут сделать длинную рокировку, "k" - чёрные могут сделать короткую рокировку, "q" - чёрные могут сделать длинную рокировку. Символы должны быть упорядочены в таком порядке: "KQkq".

    Внимание: в этом поле указывается потенциальная возможность сделать рокировку в будущем. Даже если рокировка невозможна на следующем ходу из-за блокирующих фигур или атак противника, однако король и соответствующая ладья ещё не двигались, следует пометить рокировку как возможную.

  4. Информация о взятии на проходе. Здесь записываются координаты клетки, на которую передвинется пешка, если произойдёт взятие на проходе. Если взятие на проходе невозможно, то используется символ "-".

    Информация о взятии на проходе даётся в том и только том случае, когда предыдущим ходом было движение пешки на две клетки. Даже если при этом рядом нет пешки противника, способной взять на проходе, координаты клетки всё равно записываются.

Пример описания четырёх полей для начальной позиции:

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

Дополнительные команды

Каждая команда в EPD файле состоит из оппкода (имени команды), за которым следуют от нуля и более операндов. Описание команды заканчивается символом точки с запятой.

Команды разделяются между собой одним символом пробела. Первая команда (если она имеется в строке) отделяется от последнего поля, описывающего позицию, одним пробелом.

Формат оппкодов

Оппкод представляет собой идентификатор, который начинается с символа латинского алфавита и имеет в длину не более 14 символов. Каждый последующий символ может быть любым из списка: "a", ... , "z", "A", ... , "Z", "0", ..., "9", "_". Если планируется использовать оппкод более чем в одной программе, то прописные символы в нём как правило не используются.

С другой стороны, если оппкод используется только в одной программе или введён в несколько программ в качестве эксперимента, он должна начинаться с заглавной буквы. Таким образом, его можно будет легко различить другим программам, читающим EPD. Если впоследствии окажется, что такой оппкод получил широкое распространение, он добавляется в официальный список оппкодов с заменой всех заглавных символов на строчные.

Если программа не распознаёт встретившийся оппкод, то соответствующая команда попросту игнорируется. Это не должно приводить к ошибке распознавания.

Многие оппкоды имеют предопределённые значения (см. список оппкодов).

Формат операндов.

Каждый операнд представляет собой либо непрерывный набор из непробельных печатных символов, либо строку. Строка представляет собой любую последовательность символов, заключённых в кавычки (", ASCII код 0x22). Длина строки не должна превосходить 256 символов. И снова я бы не полагался на это ограничение.

Если в команде присутствует хотя бы один операнд, то от оппкода он отделяется одним пробелом. Между собой последовательные операнды тоже разделяются одним пробелом. Если операндов нет, сразу за оппкодом следует символ точки с запятой. В противном случае этот символ следует сразу за последним операндом. Он указывает на окончание описания текущей команды.

Любой оппкод не должен появляться в одной строке более одного раза. Все команды одной строки должны быть упорядочены в лексикографическом порядке в соответствии с ASCII записью их оппкодов. Однако при распознавании формата EPD программам стоит допускать следование команд в произвольном порядке.

Некоторые команды, допускающие более одного операнда, могут требовать, чтобы операнды были упорядочены специальным образом. Например, команда с оппкодом pv (предсказанное продолжение) требует, чтобы её операнды (ходы) были записаны в том порядке, в котором они должны играться. Однако если в описании команды порядок следования операндов не указан, то он должен быть лексикографическим.

Базовые типы операндов

Каждый операнд может быть одного из следующих типов:
  1. Идентификатор (1 - 15 символов). Последовательность символов, не взятая в кавычки. Каждый символ берётся из списка: "a", ... , "z", "A", ... , "Z", "0", ..., "9", "_". Для большинства команд идентификаторы берутся из предопределённого множества. (см список оппкодов). Чаще всего идентификаторы используют для выбора одного из возможных значений операнда.

  2. Шахматный ход. Записывается в стандартной алгебраической нотации. Если будет использована другая нотация, то не гарантируется, что EPD файл корректно прочитается.

    В командах с единственным операндом шахматные ходы чаще всего используются для выделения одного хода от всех остальных возможных продолжений. Они также используются в командах с множеством операндов для определения набора возможных продолжений либо для определения последовательности ходов (которая может быть проиграна из заданной позиции).

    Некоторые шахматные ходы могут выглядеть точно также, как и идентификаторы. Однако каждый оппкод строго определяет, какого типа операнды должны следовать за ним, так что неопределённость здесь не возникает.

  3. Целое число. Записывается стандартным образом как последовательность цифр. В отрицательном числе перед цифрами ставится знак минус ("-"). Для неотрицательных чисел перед цифрами допускается ставить знак плюс ("+"), однако он является лишним, а потому лучше его опустить. Поддерживаются целые числа от -2147483648 до 2147483647 (максимальное и минимальное знаковые 32-биттные значения). Однако некоторые команды могут накладывать на них дополнительные ограничения.

  4. Число с плавающей точкой. Состоит из необязательного знака ("+" или "-"), последовательности цифр (из как минимум одной цифры), точки (".") и ещё одной последовательности цифр (из как минимум одной цифры). Представление действительных чисел в экспоненциальной записи не поддерживается.

  5. Дата (10 символов). Первые 4 символа задают год (0001 - 9999); пятый символ - точка ("."); символы 6 - 7 задают месяц (01 - 12); символ 8 - точка ("."); символы 9 - 10 задают день месяца (01 - 31).

  6. Время (5 символов). Первые 2 символа задают часы (00 - 23); символ 3 - двоеточие (":"); символы 4 - 5 задают минуты (00 - 59).

  7. Таймер (12 символов). Первые 3 символа задают число дней (000 - 999); символ 4 - двоеточие (":"); символы 5 - 6 задают количество часов (00 - 23); символ 7 - двоеточие (":"); символы 8 - 9 задают количество минут (00 - 59); символ 10 - двоеточие (":"); символы 11 - 12 задают количество секунд (00 - 59).

    Тип таймер обычно используется для указания информации с шахматных часов. Он не используется для указания времени, потраченного на поиск, в таком случае указывается целое число секунд.

  8. Строка (до 256 символов). Её описание приводится выше.

Список оппкодов

Оппкоды в этом разделе приведены в алфавитном порядке. Любые предложения по добавлению новых оппкодов должны присылаться по адресу (Steven J Edwards).

Оппкод acn: число проанализированных позиций. Имеет единственный целочисленный операнд. Используется для указания числа позиций, которые были проанализированы во время анализа или поиска. Его значение может быть довольно большим, поэтому для хранения операнда рекомендуется использовать 4-байтные (или 8-байтные) переменные.

Оппкод acs: время анализа. Имеет единственный целочисленный операнд. Используется для указания времени, затраченного на анализ позиции или поиск. Измеряется в секундах. Значение операнда может быть довольно большим, поэтому для его хранения рекомендуется использовать 4-байтные переменные. По возможности здесь необходимо использовать показания процессорных, а не обычных часов, поскольку обычно они точнее измеряют количество времени, затраченного на анализ.

Оппкод am: избегать ход(ы). Может содержать от нуля и более шахматных ходов. Все они могут быть сыграны из приведенной позиции. Указанные ходы не следует рассматривать при анализе позиции.

Оппкод bm: лучший(е) ход(ы). Может содержать от нуля и более шахматных ходов. Все они могут быть сыграны из приведенной позиции. Они были оценены составителем EPD файла как наилучшие возможные ходы из данной позиции.

Оппкод c0: комментарий (основной, другие комментарии c1 - c9). Имеет либо единственный строковый операнд, либо не содержит операндов. Комментарии в c0, ..., c9 проранжированы в порядке убывания важности. То есть, в c0 содержится главный комментарий, важность последующих комментариев убывает.

Считается, что комментарии будут использоваться для полного описания всей партии или её фрагмента. Обычно обработка этих оппкодов происходит так:

  1. В начале партии (или фрагмента) программа, читающая последовательность ходов, инициализирует все десять комментариев пустыми строками.
  2. По прочтении в EPD каждой строки с позицией команды с комментариями интерпретируются слева направо. Поскольку все команды в строке записаны в алфавитном порядке их оппкодов, то оппкод c0 будет прочитан первым, следующим пойдёт оппкод c1 (если он есть) и т.д.
  3. Чтение оппкода cN (0<= N <= 9) состоит из двух шагов. Сначала всем комментариям с номерами, большими N, присваиваются пустые значения. Затем, если команда содержит строковый операнд, комментарию с номером N присваивается значение прочитанной строки.

Оппкод cc: показатели шахматных часов. Указывает, сколько времени потратил каждый игрок данной партии к моменту написания EPD записи. Этот оппкод всегда имеет два операнда в формате таймер. Первый операнд указывает время для белых, второй - для чёрных.

Чаще всего этот оппкод используется программами-посредниками для предоставления объективной информации о времени, затраченном обоими игроками.

Оппкод ce: оценка позиции. Имеет единственный целочисленный операнд. Используется для указания оценки позиции относительно активного игрока, то есть того, чей сейчас ход. Измеряется в десятых долях пешки. Положительное значение указывает, что преимущество у активного игрока, отрицательное - преимущество у его противника.

Значения операнда должны быть в пределах от -32768 до 32766. Любое значение, большее 32000 указывает на возможность для активного игрока поставить мат. Число полуходов до мата вычисляется вычитанием оценки из 32767. Так, например, мат в N ходов даётся через 2 * N - 1 полуходов и имеет соответствующую оценку 32767 - (2 * N - 1).

Значение оценки, меньшее -32000 указывает на возможность поставить мат для противника активного игрока. Число полуходов до мата вычисляется вычитанием из оценки числа -32767. Так, например, мат в N ходов даётся через 2 * N полуходов и имеет соответствующую оценку 2 * N - 32767.

Значение оценки -32767 означает, что активному игроку поставлен мат. Значение -32768 указывает на невозможную позицию. Патовая позиция, ровно как и любая другая позиция, про которую известно, что она приводит к ничье, должна иметь оценку 0.

Оппкод dm: число ходов до мата. Имеет единственный целочисленный операнд, указывающий на число ходов из данной позиции до мата, который может поставить активный игрок (тот, чей сейчас ход).

Предполагается, что эта команда будет использоваться в шахматных задачах, в которых требуется найти мат за определённое число ходов.

Оппкод draw_accept: предложение ничьи принято. Не имеет операндов. Указывает на то, что в данной позиции была предложена ничья, которую активный игрок принял.

Оппкод draw_accept не должен появляться в одной строке совместно с командой draw_reject.

Оппкод draw_claim: требование ничьи. Не имеет операндов. Указывает на то, что в данной позиции активный игрок потребовал ничью. Такое может произойти из-за троекратного повторения одной и той же последовательности ходов, правила 50-ти ходов или нехватки материала для мата.

Вместе с командой draw_claim в одной строке должна присутствовать команда sm. С другой стороны, она не должна появляться в одной строке совместно с командой draw_offer.

Оппкод draw_offer: предложение ничьи. Не имеет операндов. Указывает на то, что в данной позиции активный игрок предложил ничью.

Вместе с командой draw_offer в одной строке должна присутствовать команда sm. С другой стороны, она не должна появляться в одной строке совместно с командой draw_claim.

Оппкод draw_reject: предложение ничьи отклонено. Не имеет операндов. Указывает на то, что в данной позиции была предложена ничья, которую активный игрок отклонил.

Оппкод draw_reject не должен появляться в одной строке совместно с командой draw_accept.

Оппкод eco: Код дебюта ECO. Либо имеет единственный строковый операнд, либо не имеет операндов. Если операнд присутствует, его значение указывает на код дебюта партии, из которой приведена данная позиция. Код дебюта берётся из библиотеки ECO. Если операнд отсутствует, то код дебюта не установлен (например, у программы, записавшей EPD файл, нет такой возможности).

Оппкод fmvn: число полных ходов. Имеет единственный целочисленный операнд, указывающий на номер хода в текущей позиции. Для стартовой позиции номер хода равен 1.

Значение команды fmvn совпадает со значением шестого поля в описании позиции FEN. В самом формате EPD эта информация зачастую опускается, так как она не влияет на генерацию дальнейших ходов.

Оппкод hmvc: число обратимых полуходов. Имеет единственный целочисленный операнд. Указывает на число полуходов, сделанных с момента последнего взятия, движения пешки или начала партии. Эта информация необходима для реализации правила 50-ти ходов. Для начальной позиции число обратимых полуходов равно 0.

Значение команды hmvc совпадает со значением пятого поля в описании позиции FEN. В самом формате EPD эта информация зачастую опускается, так как она не влияет на генерацию дальнейших ходов.

Оппкод id: Идентификатор позиции. Имеет единственный строковый операнд. Присваивает данной позиции простой идентификатор. Впоследствии по нему можно будет ссылаться на позицию.

Оппкод nic: Код дебюта из New in Chess. Либо имеет единственный строковый операнд, либо не имеет операндов. Если операнд присутствует, его значение указывает на код дебюта партии, из которой приведена данная позиция. Код дебюта берётся из библиотеки New in Chess. Если операнд отсутствует, то код дебюта не установлен (например, у программы, записывающей EPD файл, нет такой возможности).

Оппкод noop: пустая команда. Может иметь от нуля и более операндов любого типа. Команда не требует никаких действий. В основном используется разработчиками для тестирования программ создания и чтения EPD файлов.

Оппкод pm: предсказанный ход. Содержит единственный шахматный ход, который можно сделать из данной позиции. С точки зрения составителя EPD это наилучший ход.

Если в этой же строке содержится команда pv, то её первым операндом должен идти тот же ход, что и в pm.

Предполагается, что команда pm будет использоваться для показа подсказки.

Оппкод ptp: пара тегов PGN. Принимает чётное число операндов. Для каждой пары операндов (слева направо) первый операнд - это идентификатор, который стоит понимать как имя PGN тега, связанного с партией, откуда берётся указанная позиция. Второй операнд пары всегда строковый. Он определяет значение соответствующего тега.

В одной команде ptp любой PGN тег не должен появляться более одного раза.

Оппкод pv: предсказанное продолжение. Содержит от нуля и более шахматных ходов, которые последовательно можно играть из данной позиции. По мнению составителя EPD он представляет собой наилучшее продолжение из заданной позиции.

Если в этой же строке содержится команда pm, то её операнд должен совпадать с первым шахматным ходом в pv.

Оппкод rc: число повторений. Имеет единственный целочисленный операнд. Указывает на количество повторений данной позиции в партии. Для стартовой позиции этот параметр равен 1. Значение rc не меньшее трёх говорит о том, что игрок может потребовать ничью в соответствии с правилом повторения.

Оппкод refcom: сообщение судьи. Имеет единственный операнд-идентификатор. Передаёт сообщение от судейской программы программе-клиенту.

Всего может передаваться семь команд: conclude, disconnect, execute, fault, inform, reset и respond. Подробное их описание приведено далее.

Оппкод refreq: клиентское сообщение. Имеет единственный операнд идентификатор. Передаёт сообщение от программы-клиента судейской программе.

Всего может передаваться четыре сообщения: fault, reply, sign_off и sign_on. Подробное их описание приведено далее.

Оппкод resign: сдача. Не имеет операндов. Указывает на то, что в данной позиции активный игрок (тот, чей сейчас ход) сдался.

Команда resign не должна идти в одной строке с командами draw_accept, draw_claim, draw_decline и draw_offer.

Оппкод sm: сделанный ход. Содержит единственный шахматный ход, который можно сделать из данной позиции. Этот ход был сыгран из данной позиции.

Предполагается, что команда sm будет использоваться для передачи последнего сделанного хода в активной партии. Её можно использовать при автоматической игре между программами или людьми по сети или в игре по переписке.

Если в этой же строке присутствует команда sv и если у неё имеется хотя бы один операнд, то первым её операндом должен идти ход из sm.

Оппкод sv: сыгранное продолжение. Содержит ноль или более шахматных ходов, которые можно последовательно сыграть из данной позиции. Указывает на последовательность ходов, которая была сыграна из этой позиции.

Если в этой же строке присутствует команда sm и sv имеет хотя бы один операнд, то первый операнд в sv должен совпасть с ходом из sm.

Оппкод tcgs: телекоммуникации; выбор игры. Имеет единственный целочисленный операнд, представляющий положительное число. Это один из серии телекоммуникационных оппкодов, используемых в шахматных партиях через e-mail и для других подобных целей. Используется для указания конкретной партии среди нескольких активных партий между одними и теми же игроками. Детали реализации партий через e-mail находятся в процессе доработки. И, наверное, уже никогда не доработаются.

Оппкод tcri: телекоммуникации; информация о получателе. Имеет два упорядоченных строковых операнда. Первый оператор - это e-mail адрес получателя записи EPD. Второй операнд - имя игрока (человека или программы), который непосредственно является получателем EPD. Это один из серии телекоммуникационных оппкодов, используемых в шахматных партиях через e-mail и для других подобных целей. Детали реализации партий через e-mail находятся в процессе доработки. И, наверное, уже никогда не доработаются.

Оппкод tcsi: телекоммуникации; информация об отправителе. Имеет два упорядоченных строковых операнда. Первый оператор - это e-mail адрес отправителя записи EPD. Второй операнд - имя игрока (человека или программы), который непосредственно является отправителем EPD с указанного адреса. Это один из серии телекоммуникационных оппкодов, используемых в шахматных партиях через e-mail и для других подобных целей. Детали реализации партий через e-mail находятся в процессе доработки. И, наверное, уже никогда не доработаются.

Оппкод ts: временная метка. Имеет два операнда. Первый в формате даты, а второй в формате времени. Указывает на время последней модификации EPD записи. В ts используется время в формате UTC.

Оппкод v0: имя ветки (основной, имена других веток задаются оппкодами v1 - v9). Имеет либо единственный строковый операнд, либо не содержит операндов. Ветки в v0, ..., v9 проранжированы в порядке убывания важности. То есть в v0 задаётся имя самой важной ветки, важность последующих веток убывает.

Считается, что это семейство оппкодов будет использоваться для задания названий ответвлений во всей партии или её фрагменте. Обычно обработка этих оппкодов происходит так:

  1. В начале партии (или фрагмента) программа, читающая последовательность ходов, инициализирует все десять имён ответвлений пустыми строками.
  2. По прочтении каждой EPD строки с позицией команды с именами веток интерпретируются слева направо. Поскольку все команды в строке записаны в алфавитном порядке их оппкодов, то v0 будет прочитан первым, следующим пойдёт v1 (если он есть) и т.д.
  3. Чтение оппкода vN (0<= N <= 9) состоит из двух шагов. Сначала всем именам веток с номерами, большими N, присваиваются пустые значения. Затем, если команда содержит строковый операнд, имени ветки с номером N присваивается значение прочитанной строки.

Команды обработки EPD

Команды обработки EPD предназначены для программ, который напрямую работают с файлами в формате EPD. Они могут указывать программе, какие записи из EPD следует прочитать, какие записи добавить, а в какие внести изменения. Стандартизация таких команд помогает избежать неразберихи среди пользователей и в целом способствует взаимодействию между программами.

Каждая команда, требующая чтения EPD записей, должна содержать конкретный набор необходимых оппкодов, которые должны присутствовать в каждой прочтённой записи. Каждая команда, требующая запись в EPD записи, должна содержать конкретный набор необходимых оппкодов, которые должны присутствовать в каждой сохраняемой записи. Некоторые из команд включают в себя как чтение, так и запись EPD записей. Они должны содержать конкретные множества оппкодов как для прочитанных записей, так и для записанных. В спецификации не указано, каким образом в командах должны указываться эти наборы.

В принципе, авторы программ могут давать и свои имена командам, лучше подходящие для их нужд. Названия команд, приведенные здесь, нужны только в целях спецификации. что бы это ни значило.

Команда pfdn: нормализация данных

По команде pfdn должно производиться чтение данных из входного EPD файла, их нормализация и последующая запись в выходной EPD файл. Порядок строк в выходном файле должен совпадать с порядком во входном файле. Нормализация используется для получения канонического EPD файла. Дополнительно все строки проверяются на легальность. Для входного файла нет никаких ограничений на минимальное число команд в каждой строке. Для каждой входной строки все эти команды просто копируются в выходную строку.

Нормализация каждой строки состоит из следующих действий:

  1. Удаляются все пробелы в начале строки.
  2. Удаляются все пробелы в конце строки.
  3. Удаляются все лишние пробелы внутри строки. Оставляется ровно один пробел между последовательными полями, последовательными командами и операндами. Один пробел также оставляется для разделения последнего поля и первой команды (если она присутствует).
  4. Команды сортируются в лексикографическом порядке в соответствии с ASCII записью их оппкодов.
  5. Операнды, не требующие специального упорядочения, сортируются в лексикографическом порядке в соответствии с кодами ASCII.

Нормализованные данные полезны для получения канонической версии данных, полученных от программ или других источников, не вполне следующих данной спецификации. Они также позволяют сравнивать два разных EPD файла из разных источников строка за строкой. Разные строки будут иметь различные значения.

Команда pfga: основной анализ

Команда pfga указывает шахматной программе, что ей необходимо проанализировать каждую строку из входного файла и записать результаты анализа в выходной файл. Порядок следования строк в выходном файле не должен меняться. Текущая позиция в каждой строке не должна меняться, она должна копироваться в выходной файл.

На анализ каждой строки должно уделяться равное количество усилий. Уровень усилий указывается программе перед тем, как начинается обработка EPD файлов. Обычно уровень задаётся либо временем на анализ, либо глубиной анализа на каждую позицию. Лимит может быть как жёстким, так и мягким. Жёсткий лимит полностью фиксирует максимальные усилия на позицию. В то время как в при мягком лимите эти усилия могут слегка варьироваться. Жёсткий лимит предпочтительнее для сравнивающих программ. Мягкий лимит лучше использовать для того, чтобы программа могла выделять слегка больше или меньше времени на позицию, в зависимости от её сложности.

Каждая строка на выходе - это копия входной строки с добавленными результатами анализа.

Для входного файла нет никаких ограничений на минимальное число команд в каждой строке. Каждая строка на выходе должна содержать команды pv (предсказанное продолжение) и ce (оценка позиции). Дополнительно она может содержать команды pm (предсказанный ход), sm (сделанный ход), acn (число проанализированных позиций) и acs (время анализа).

Команда pfms: поиск мата

Команда pfms используется для поиска мата в позициях. Число ходов, приводящих к мату, передаётся программе до начала обработки файла. Оно измеряется в количестве полных ходов. То есть, для поиска мата в три хода необходимо установить этот параметр в три. При получении команды pfms анализирующая программа должна прочитать строки из входного EPD файла и, если в соответствующей позиции нет информации о мате за такое же или меньшее число ходов, то произвести поиск форсированного мата для неё. Порядок следования строк в выходном файле не должен меняться.

Действие команды pfms зависит от выставленного заранее числа полных ходов до мата и от значения операнда в команде dm (число ходов до мата) для текущей позиции. Анализ мата в текущей позиции будет производиться, если

  1. Строка не содержит команды dm или
  2. Значение операнда в команде dm больше, чем выставленное число полных ходов.

Если программа находит мат из текущей позиции, она добавляет дополнительные команды dm (число ходов до мата) и pm (предсказанный ход) в выходную строку.

Идея заключается в том, чтобы анализирующая программа раз за разом сканировала все позиции в поисках мата, начиная с мата в 1 ход, с каждым новым проходом увеличивая число ходов до мата на единицу. (В принципе, можно начинать с мата в большее число ходов, это может сэкономить время). При каждом последующем проходе позиции, решённые ранее, будут просто пропускаться.

Дополнительно в выходную строку могут быть добавлены команды pv (предсказанное продолжение), acn (число проанализированных позиций) и acs (время анализа).

Команда pfop: удаление команды

По команде pfop должно производиться удаление дополнительной команды с заданным оппкодом из каждой записи входного EPD файла. Порядок следования строк в выходном файле не должен меняться. До того, как передаётся pfop, необходимо указать оппкод удаляемой команды. Если указанная команда присутствует во входной строке, то в выходной строке она удаляется.

Команда pfts: направленный анализ

Команда pfts по своему значению похожа на команду pfga (основной анализ). Разница заключается в том, что каждая входная строка содержит набор ходов для анализа (команда bm) и набор ходов, которые следует избегать (команда am). Каждый из этих двух наборов (но не оба сразу) может быть пустым.

Перед началом анализа программе передаётся предел усилий, затрачиваемых на анализ каждой позиции. Измеряться он может либо временем, либо глубиной анализа. При получении команды pfts программа должна читать каждую строку из EPD файла, анализировать её и по результатам анализа добавлять в неё команду pm (предсказанный ход). Полученная запись сохраняется в выходном файле. (Команда pm не пишется, если позиция матовая или патовая с точки зрения активного игрока). Дополнительно в выходную строку могут добавляться команды pv (предсказанное продолжение), acn (число проанализированных позиций) и acs (время анализа).

Описание взаимодействия судейских и игровых программ

Взаимодействие между игровыми и судейскими программами производится с помощью передачи записей в формате EPD. Каждая запись, передающаяся от игровой программы к судейской, должна содержать команду с оппкодом refreq и операндом, описывающим запрос. С другой стороны, каждая запись передающаяся от судейской программы к игровой, должна содержать команду с оппкодом refcom и операндом, описывающим судейский запрос.

Если турнир производится при посредничестве судейской программы, то обычно производится следующая последовательность действий:

  1. На сервере запускается судейская программа, и в неё вносится вся необходимая информация о турнире, включая имена игроков, название турнира и т.п.
  2. Судейская программа (сервер) завершает инициализацию.
  3. После этого сервер открывает один из портов и начинает его прослушивать в ожидании данных от клиентов (игроков).
  4. Запускаются соревнующиеся шахматные программы (клиенты). Им задаётся адрес сервера вместе с номером открытого порта.
  5. Каждая клиентская программа пересылает EPD запись с запросом регистрации. Таким образом каждая программа регистрируется на сервере.
  6. В ответ судейская программа посылает каждому подключившемуся клиенту EPD запись с сообщением подготовиться к новой партии.
  7. Судейская программа посылает каждому клиенту EPD запись, с информацией о значениях семи основных тегов для предстоящей партии из формата PGN.
  8. Программе-игроку, чей сейчас ход, сервер посылает EPD запись, указывающую, что необходимо сделать ход. Если это не первый ход в партии, то в записи передаётся позиция, полученная до последнего хода соперника вместе с последним ходом. Если ходов до этого не было, то в записи передаётся только текущая позиция без добавления хода. Получившая такую запись программа должна произвести свой ход.
  9. Как только клиент получает такую запись, его текущая позиция устанавливается в соответствие с позицией из записи (они должны совпадать и так). Если в записи вдобавок содержится проделанный ход, то он должен быть из текущей позиции произведён. После этого клиент должен сделать свой ход.
  10. После того, как игровая программа произведёт необходимые вычисления (например, сделает ход), она посылает ответ на сервер с их результатами. Посылаемая назад позиция вычисляется из полученной до этого позиции от сервера с проделанным ходом, тоже присланным от сервера (если он был). Если в результате вычислений был сделан ход, он передаётся в той же записи в дополнительной команде. (Ход может быть не произведён, если клиент получил мат, пат, предлагает ничью или сдаётся).
  11. Как только сервер получает ответ от клиента, он формирует соответствующую EPD запись его оппоненту. (Этот шаг пропускается, если обнаружен конец игры, и дальнейшие ходы производить не требуется.)
  12. Сервер продолжает получать и отправлять записи для каждой пары игроков пока игра не завершается.
  13. По завершении игры сервер посылает запись, информирующую об этом обоих игроков.
  14. Если необходимо удалить клиента из турнира, ему посылается EPD запись с сообщением об отключении. После этого клиент не может участвовать в турнире до тех пор, пока не пошлёт новый запрос на подключение.
  15. Перед тем, как сервер отключается от сети, он посылает всем клиентам сообщение об отключении каждому клиенту, подключённому на данный момент к серверу.

Сообщения от судейской программы к клиентам

Судейская программа передаёт необходимые сообщения в качестве операнда к команде refcom. Команда с таким оппкодом будет присутствовать в каждой EPD записи, посланной сервером. Каждый операнд refcom имеет тип идентификатора (не строки).

Каждая EPD запись от судейской программы также содержит показания шахматных часов для текущей партии (команда cc). Клиент должен устанавливать значение его внутренних часов в соответствии с операндом к cc. Этой сообщении присутствует время как для белых, так и для чёрных.

Все EPD записи содержат четыре поля, описывающих текущую позицию. В большинстве случаев эта позиция должна совпадать с текущей позицией на стороне принимающего клиента. Если присланная позиция совпадает с текущей позицией на стороне клиента, то он может быть уверен, что история ходов в партии, приводящая к данной позиции, корректна. Поэтому каждый игрок хранит историю ходов в партии у себя и использует эту информацию для определения ничьей из-за повторения ходов. Это позволяет не передавать всю историю ходов партии в каждой EPD записи.

Если вдруг присланная позиция не совпадает с текущей позицией программы-игрока, то он должен установить свою текущую позицию в соответствии с позицией из EPD записи. Исключение составляет случай, когда полная история ходов также прислана в EPD записи. Программа должна предполагать, что у полученной позиции нет истории ходов. Если такое произойдёт, то программа не может проверить ничью из-за повторяющихся ходов, поскольку таковых нет.

Ожидается, что каждый клиент будет хранить своё собственное значение количества сделанных последних обратимых полуходов (устанавливается в ноль в стартовой позиции), а также номер хода (устанавливается в 1 в начальной позиции). Если судейская программа присылает запись, в которой один из этих параметров не совпадает с внутренним его значением у клиента, полученная позиция должна рассматриваться как новая позиция в партии, у которой ещё нет истории сделанных ходов. Как уже ранее говорилось, количество сделанных последних обратимых полуходов передаётся командой hmvc, а номер хода передаётся в fmvn.

Если от судейской программы приходит запись со сделанным ходом (всегда в команде sm), то получившая её программа-игрок должна этот ход произвести. Это делается сразу после того, как текущая позиция приведена в соответствие с позицией, присланной сервером. Полученная позиция становится новой текущей позицией. Она будет использоваться во всех дальнейших вычислениях. Новая текущая позиция впоследствии должна быть передана судейской программе, когда программа-игрок сделает ход. При передаче хода клиент должен использовать команду sm, в которую текущий ход записывается операндом. Таким образом, описание текущей позиции и сделанного хода симметрично с точки зрения клиента и сервера.

Описания сообщений от судейской программы

Сообщение conclude. Говорит клиенту о том, что текущая партия завершилась. Позиция в записи является финальной позицией в партии. Больше записей, связанных с данной партией посылаться не будет. При получении этого сообщения клиент должен произвести все необходимые финальные действия. Никакого ответа посылать не нужно.

Чтобы дать клиенту время на завершение игры, сервер не будет посылать ему никаких EPD записей в течение определённого интервала времени. Интервал задаётся человеком, управляющим турниром. По умолчанию он равен пяти секундам.

Сообщение disconnect. Говорит клиенту о том, что сервер его отключил. Клиент после этого должен закрыть канал коммуникации с сервером. Сообщение disconnect посылается либо в конце турнира, либо когда по какой-то причине на сервере возникли проблемы. После этого сообщения сервер не посылает никаких EPD записей до тех пор, пока он не восстановится. Это даёт клиенту возможность аккуратно отключиться от сети, управляемой сервером. Ход в этом случае не посылается, текущая позиция не имеет значения. Клиент не должен отвечать на это сообщение.

Сообщение execute. Говорит клиенту о том, что необходимо установить новую позицию. Если в записи содержится сделанный ход (обычно так и есть), то этот ход делается из текущей позиции. Присланная позиция обычно совпадает с текущей позицией клиента. Сообщение execute используется только чтобы заново воспроизвести все начальные ходы партии. Это добавляет возможность переигровки партии. Никакого ответа от клиента не требуется.

Сообщение fault. Посылается клиенту в том случае, когда сервер обнаружил ошибку, которую нельзя исправить автоматически. Клиент в ответ должен просигналить человеку, чтобы тот принял меры по исправлению ошибки. При этом человек, управляющий сервером, будет проинформирован о природе ошибки. Никакого ответа от клиента не требуется.

Будущие версии протокола будут поддерживать некоторую форму автоматического исправления ошибок. (По всей видимости, уже не будут)

Сообщение inform. Используется для передачи клиенту данных о тегах к текущей партии. Запись при этом должна содержать оппкод ptp, в котором будут передаваться пары тегов в формате PGN. Запись с этим сообщением может быть передана в любое время. Обычно она посылается перед первым ходом в партии. Она также посылается после последнего хода в партии, чтобы передать информацию о результате партии через пару тегов Result. Никакого ответа от клиента не требуется.

Основная цель сообщения inform - передать клиенту значения тегов для партии, не передавая при этом никаких ходов либо какой-нибудь другой информации.
Внимание: оппкод ptp может встретиться и в записи, не содержащую судейскую команду inform. В этом случае её операнды должны обрабатываться аналогично.

Обычно передаваемая информация включает в себя значения семи основных тегов. Их имена: Event, Site, Round, White, Black и Result.

Некоторые судейские программы могут дополнительно посылать тег TimeControl. Он позволяет клиентам устанавливать контроль времени автоматически, а не вручную.

Сообщение reset. Указывает клиенту, что необходимо подготовиться к новой партии. Любая информация о текущей партии должна быть удалена. Это сообщение посылается, чтобы проинформировать клиента о начале новой партии. Оно также посылается, если необходимо прервать текущую партию. Никакого ответа от клиента не требуется.

Чтобы дать клиенту время на подготовку к новой партии, сервер не будет посылать ему другие EPD записи в течение определённого интервала времени. Интервал задаётся человеком, управляющим турниром. По умолчанию он равен пяти секундам.

Сообщение respond. Указывает клиенту, что необходимо ответить на ход, сделанный оппонентом. Позиция, из которой необходимо произвести ход - это присланная позиция, из которой сделан ход (если есть, пересылается в команде sm). Клиент производит свой ход и посылает его серверу, используя операнд reply в оппкоде refreq.

Описания сообщений от программ клиентов

Шахматная программа передаёт необходимые сообщения серверу в качестве операнда к команде refreq. Команда с таким оппкодом будет присутствовать в каждой EPD записи, посланной клиентом. Каждый операнд refreq имеет тип идентификатора (не строки).

Сообщение fault. Передаёт серверу о том, что в клиентской программе произошла ошибка, которую нельзя исправить автоматически. Сервер при этом должен просигналить человеку, управляющему турниром, что необходимо произвести действия по исправлению ошибки. Сервер также проинформирует его о природе ошибки (Возможно, клиент проинформирует. Ибо я не вижу механизма, как сервер эту информацию получит).

В будущих версиях протокола для судейских программ будет добавлена поддержка автоматического восстановления после ошибок. (Скорее всего, уже не будет).

Сообщение reply. Используется для ответа на сообщение сервера (см команду respond). Обычно в запись включается ход, сделанный клиентом (в команде с оппкодом sm).

Сообщение sign_off. Говорит серверу, что клиент отключается, и больше никаких действий по этому каналу коммуникации производиться не будет. После этого клиент и сервер оба разрывают канал связи.

Чтобы получить возможность играть партии, клиенту после этого придётся подключаться к серверу опять (используя Сообщение sign_on).

Сообщение sign_on. Говорит серверу, что данный клиент подключается к нему. Это сообщение необходимо передать перед тем, как начинать какое бы то ни было взаимодействие между клиентом и сервером. По этому сообщению сервер открывает канал связи с клиентом, который остаётся открытым вплоть до того, как одна из сторон не проинформирует другую о закрытии канала.

Текст подготовлен на основе спецификации EPD (English).
Написал Бодягин Дмитрий
info@kvetka.org