% -*- mode: LaTeX; coding: koi8-r -*-
% $Id: rm_tables.tex 61 2004-04-29 04:12:21Z cher $
% Copyright (C) 2004 Alexander Chernov <cher@unicorn.cmc.msu.ru>

\chapter{Внутренние файлы}

В настоящей главе описывается формат файлов, в которых хранится
информация о турнире. Эти файлы обычно непосредственно
недоступны как участникам, так и администраторам турнира, и
доступ к ним осуществляется посредством программ системы
\S{ejudge}.

\section{Таблица посылок}
\hypertarget{F:run.log}{}

Таблица посылок хранит всю информацию о посылках, кроме текста
программы и протокола тестирования. По-умолчанию таблица посылок
хранится в файле \V{run.log}, располагающемся в подкаталоге
\V{var} каталога турнира. Имя файла таблицы посылок или полный
путь к нему можно изменить с помощью глобальной конфигурационной
переменной
\hyperlink{F:serve.cfg,T:run_log_file}{\V{run\_log\_file}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Напомним, что каталог
турнира задаётся с помощью конфигурационной переменной
\hyperlink{F:serve.cfg,T:root_dir}{\V{root\_dir}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}, а также с помощью
элемента \hyperlink{F:contest.xml,T:root_dir}{\V{root\_dir}}
конфигурационного файла турнира
\hyperlink{F:contest.xml}{\V{contest.xml}}.

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

\subsection{Заголовок таблицы}

Формат заголовка таблицы описывается следующей структурой данных
на языке Си.

{\small
\begin{lstlisting}[print]
struct run_header
{
  int    version;
  time_t start_time;
  time_t sched_time;
  time_t duration;
  time_t stop_time;
  unsigned char pad[44];
};
\end{lstlisting}
}

Здесь предполагается, что тип \K{int} имеет размер 4 байта (32
бита), тип \K{time\_t} является синонимом типа \K{long}, который
также имеет размер 4 байта (32 бита). Тип \K{unsigned char}
имеет размер 1 байт (8 битов). Для платформ с другими размерами
примитивных типов определение структуры заголовка должно быть
соответствующим образом изменено. Целые значения хранятся в том
порядке байтов, который принят на данной платформе. Например, на
\S{Linux-ix86} целые значения хранятся в порядке байтов
``Little-endian''.

Поле \V{version} хранит номер версии формата базы посылок.
Текущая версия имеет номер 1. Номер версии будет увеличиваться
каждый раз, когда формат базы посылок меняется несовместимым с
предыдущими версиями образом.

Поле \V{start\_time} хранит фактическое время начала турнира,
если турнир уже начался. Если турнир ещё не начался, в данном
поле хранится значение 0. Время хранится во внутреннем формате
\S{Unix}-систем, то есть как количество секунд, прошедшее от 1
января 1970 года.

Поле \V{sched\_time} хранит назначенное время начала турнира.
Для уже начавшегося турнира (то есть для турнира, у которого
\V{start\_time} не равно 0) значение этого поля не имеет
значения. Если значение этого поля равно 0, то для данного
турнира никакое время старта не было назначено. Назначить время
старта турнира можно с помощью интерфейса администратора
турнира, предоставляемого CGI-программой \S{master}. В момент
первого запуска сервера турнира, когда файл базы посылок
создаётся, в данное поле записывается значение 0.

Поле \V{duration} хранит установленную продолжительность турнира
в секундах. Для турниров неограниченной продолжительности данное
поле содержит значение 0. Изменить назначенную продолжительность
турнира можно с помощью интерфейса администратора турнира,
предоставляемого CGI-программой \S{master}. В момент первого
запуска сервера турнира для данного турнира при создании файла
базы посылок в данное поле копируется значение глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:contest_time}{\V{contest\_time}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

Поле \V{stop\_time} хранит фактическое время окончания турнира. 
Если турнир ещё не окончен, данное поле хранит значение 0.
Турнир заканчивается автоматически, когда истекает его
продолжительность, либо турнир в любой момент может быть
закончен по команде администратора с помощью интерфейса,
предоставляемого CGI-программой \S{master}.

Поле \V{pad} используется для дополнения структуры до размера 64 байта.

\subsection{Запись о посылке в таблице}

Формат одной записи описывается следующей структурой данных на
языке Си. Как было сказано выше, размер такой структуры на
архитектуре \S{Linux-ix86} равен 64 байтам.

{\small
\begin{lstlisting}[print]
struct run_entry
{
  int            submission;
  time_t         timestamp;
  size_t         size;
  unsigned long  ip;
  unsigned long  sha1[5];
  int            team;
  int            problem;
  int            score;
  signed char    locale_id;
  unsigned char  language;
  unsigned char  status;
  signed char    test;
  unsigned char  is_imported;
  unsigned char  variant;
  unsigned char  is_hidden;
  unsigned char  is_readonly;
  unsigned char  pages;
  unsigned char  pad[3];
  long           nsec;
};
\end{lstlisting}
}

Здесь используются предположения о размере и размещении целых
типов, справедливые для архитектуры \S{Linux-ix86}. Далее даётся
подробное описание назначения каждого из полей структуры.

\hypertarget{F:run.log,T:submission}{}
Поле \V{submission} хранит номер посылки. Каждая посылка
нумеруется от 0 и до некоторого максимального значения.
Дисциплина хранения файлов с исходным текстом программы и
протоколов тестирования посылки в настоящее время такова, что
максимальный номер посылки не может превышать 100000. Номер
посылки должен быть проставлен для всех записей в базе посылок,
даже для записей со статусом \I{EMPTY}, при этом номер посылки
должен совпадать с расположением структуры соответствующей
посылки в файле. Так, непосредственно за заголовком файла должна
идти посылка с номером 0, затем посылка с номером 1 и т. д.
Пропуски в последовательной нумерации посылок не допускаются.
Посылки должны размещаться в файле посылок в строго возрастающем
порядке.

\hypertarget{F:run.log,T:timestamp}{}
Поле \V{timestamp} содержит время приёма данной посылки сервером
турнира \S{serve}. Время хранится во внутреннем формате
\S{Unix}-систем, то есть как число секунд, прошедших с 1 января
1970 года. Все посылки в файле посылок должны быть упорядочены в
порядке неубывания их времени приёма за исключением записи со
статусом \I{EMPTY}. Время приёма посылки может быть меньше
времени начала турнира или больше времени конца турнира только
для посылок, у которых поле \V{is\_hidden} установлено в
\I{true}. Для записи в базе посылок со статусом \I{EMPTY}
значение данного поля должно быть равным 0.

\hypertarget{F:run.log,T:nsec}{}
Поле \V{nsec} содержит наносекундную компоненту времени приёма
данной посылки сервером турнира. Данное поле может принимать
значения в интервале от 0 до 999999999. Для каждой посылки в
турнире полное время её приёма (то есть время, включающее как
секундную, так и наносекундную компоненты) уникально. Посылки
в базе посылок всегда упорядочиваются по полному времени приёма
посылки. Данное поле введено в \S{ejudge} версии 2.1.27, для
турниров, обслуживаемых предыдущей версией системы,
наносекундная компонента времени всегда равна нулю. Формат
журнала посылки совместим снизу вверх и сверху вниз, то есть для
\S{ejudge} младших версий поле \V{nsec} будет проигнорировано, а
для \S{ejudge} старших версий значение поля \V{nsec} по
умолчанию будет установлено в 0.

\hypertarget{F:run.log,T:size}{}
Поле \V{size} содержит размер исходного файла программы в
байтах. Протокол взаимодействия CGI-программы и сервера турнира
накладывает ограничения на максимальный размер программы. Кроме
того, CGI-программы \S{master}, \S{judge}, \S{team} не принимают
данные от веб-браузера по методу \V{POST}, если размер данных
превышает ? кб. Кроме того, максимальный размер принимаемых на
проверку программ может быть установлен в глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_run_size}{\V{max\_run\_size}}
конфигурационного файла сервера турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Значение этой переменной
по умолчанию устанавливается в 65535 байтов, но не может
превышать ограничения на приём данных по методу \V{POST} и
ограничения протокола. Для записей в базе посылок со статусом
\I{EMPTY}, \I{VSTART} или \I{VSTOP} поле \V{size} должно
содержать 0.

Обратите внимание, что текущая версия системы \S{ejudge}
передаёт программу как одну си-строку, то есть как
последовательность байт, в которой нулевой байт означает конец
строки. Поэтому в настоящее время не поддерживаются нулевые
символы в тексте программы, а также сдача программ в каком-либо
бинарном (или архивном) формате.

\hypertarget{F:run.log,F:ip}{}
Поле \V{ip} содержит IP-адрес (IPV4) хоста, с которого с помощью
веб-браузера было отослано решение. Старший байт поля IP-адреса
в данной структуре содержит первый октет IP-адреса в точечной
нотации. Таким образом IP-адрес хранится в локальном (а не
сетевом) порядке байт в слове. Для записи в базе посылок со
статусом \I{EMPTY} данное поле должно содержать значение 0.

\hypertarget{F:run.log,F:sha1}{}
Поле \V{sha1} содержит контрольную сумму исходного текста
программы, вычисляемую по алгоритму SHA1. Этот алгоритм любой
последовательности байт ставит в соответствие 160-битное число,
при этом вероятность коллизии крайне мала. Если два файла имеют
одинаковую контрольную сумму SHA1, они с вероятностью близкой к
единице идентичны. Для записей в базе посылок со статусом
\I{EMPTY}, \I{VSTART} или \I{VSTOP} данное поле должно содержать
нулевую контрольную сумму.

Контрольная сумма используется для того, чтобы автоматически
выявлять дубликаты посылок. Таковыми считаются посылки, у
которых совпадают IP-адрес, размер, контрольная сумма,
идентификатор участника, идентификатор задачи и идентификатор
языка программирования. Дубликаты посылок не проверяются и им
немедленно присваивается статус ``Ignored''. Дубликаты посылок
могут возникать, если пользователь после посылки решения на
проверку, не дождавшись подтверждения о её получении, нажимает
кнопку браузера ``Refresh''.

\hypertarget{F:run.log,T:team}{}
Поле \V{team} хранит идентификатор пользователя, от имени
которого выполнена данная посылка. Идентификатор пользователя
представляет собой положительное целое число (идентификатор
пользователя 0 является недопустимым). Текущая версия системы
\S{ejudge} накладывает верхнее ограничение на идентификатор
пользователя, равное 100000. Для записи в базе посылок со
статусом \I{EMPTY} данное поле должно содержать значение 0.

\hypertarget{F:run.log,T:problem}{}
Поле \V{problem} хранит идентификатор задачи. Идентификатор
задачи представляет собой целое число, большее нуля (0 как
идентификатор задачи недопустим). Система \S{ejudge} накладывает
верхнее ограничение на идентификатор задачи, равное
максимальному числу задач, которые могут быть определены в одном
турнире. В настоящее время это число равно 100 задачам.
Идентификатор задачи в записи базы посылок должен
соответствовать идентификатору какой-либо задачи в
конфигурационном файле турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Идентификатор задачи
можно установить явно с помощью конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:id}{id} раздела описания
задачи этого файла.

\hypertarget{F:run.log,T:score}{}
Поле \V{score} хранит количество баллов, полученное при
тестировании данной посылки, без учёта штрафов за повторные
посылки. Это поле используется только в режимах турнира
\I{KIROV} и \I{OLYMPIAD}. Количество баллов представляет собой
неотрицательное целое число. Значение $-1$ данного поля задаёт
неопределённое значение, которое отображается в журнале посылок
как \V{N/A}. Максимальное число баллов в текущей версии
установлено в 100000.

\hypertarget{F:run.log,T:locale_id}{}
Поле \V{locale\_id} хранит идентификатор языкового окружения,
установленный в клиенте \S{team} в момент отправки посылки.
Идентификатор языкового окружения представляет собой
неотрицательное целое число от 0 до 127. Значение $-1$ поля
\V{locale\_id} задаёт <<неопределённое>> значение. В этом случае
программы \S{serve} и \S{run} используют значения по умолчанию
(в настоящее время 0). Идентификатор языкового окружения
используется программой \S{run} при генерации пользовательского
протокола тестирования.

В настоящее время система \S{ejudge} поддерживает два языковых
окружения: английское (идентификатор 0) и русское (идентификатор
1). В обоих случаях используется кодировка \V{koi8-r}.

\hypertarget{F:run.log,T:language}{}
Поле \V{language} хранит идентификатор языка программирования,
на котором написана посылаемая программа. Идентификатор языка
программирования представляет собой целое число в интервале от 0
до 255. Идентификатор языка программирования в записи базы
посылок должен соответствовать идентификатору какого-либо языка
программирования в конфигурационном файле турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Идентификатор языка
программирования для некоторого языка можно установить явно с
помощью конфигурационной переменной
\hyperlink{F:serve.cfg,S:language,T:id}{id} раздела описания
языка программирования этого файла.

\hypertarget{F:run.log,T:status}{}
Поле \V{status} хранит статус посылки. Статус посылки подробно
рассматривается в таблице \ref{tableRunStatuses}.

\hypertarget{F:run.log,T:test}{}
Поле \V{test} хранит либо минимальный номер теста, на котором
программа дала неверный ответ (для турниров по системе \I{ACM}),
либо количество тестов, на которых программа дала правильный
ответ (для турниров по системе \I{KIROV} или \I{OLYMPIAD}).

Для турниров по системе \I{ACM} если значение данного поля
$\leqslant 0$, то минимальный номер теста не определён (в
случаях, когда статус посылки допускает это, например, при
статусе ``Compilation error''). Для турниров по системам
\I{KIROV} или \I{OLYMPIAD} значение данного поля, не большее 0
также означает, что количество тестов, на которых программа дала
правильный ответ, не определено. Если для турниров по этим
системам поле \V{test} хранит положительное значение, то оно на
1 больше количества успешно пройденных тестов. Например, если
решение дало правильный ответ на 3 тестах, в базе посылок в поле
\V{test} хранится значение 4. 

\hypertarget{F:run.log,T:is_imported}{}
Поле \V{is\_imported} хранит признак проимпортированной
посылки. Поле может принимать два значения: 0 и 1,
соответствующие булевским значениям \I{false} и \I{true}. У
посылки устанавливается этот флаг при импорте в базу посылок
внешнего XML-файла с посылками, если импортируемой посылке не
соответствует никакая локальная посылка. В текущей версии
системы \S{ejudge} при импорте базы посылок не импортируется
исходный код программы посылки, а также протоколы тестирования.
Поэтому при работе с посылкой, у которой поле \V{is\_imported}
установлено в \I{true} предполагается, что ни исходного файла,
ни файлов протоколов тестирования в архивах турнира не
существует. Как следствие, такие посылки не могут быть
пересужены с помощью кнопок ``Rejudge'' интерфейса
администратора турнира. При необходимости нужный статус посылки
должен быть выставлен вручную. Обратите внимание, что результаты
редактирования проимпортированной посылки могут потеряться при
очередном импорте, если эта посылка в импортируемом XML-файле
помечена как <<авторитетная>>.

\hypertarget{F:run.log,T:variant}{}
Поле \V{variant} хранит номер варианта задачи. Для невариантных
задач данное поле не используется. Для вариантных задач данное
поле может иметь значение 0, что означает, что должен
использоваться вариант согласно таблице вариантов
(см. глобальную конфигурационную переменную
\hyperlink{F:serve.cfg,T:variant_map_file}{\V{variant\_map\_file}}),
либо данное поле может хранить номер варианта явно. Явный номер
варианта задачи может выставляться только администратором
турнира при редактировании записи, либо выбираться при отправке
посылки из-под привилегированной CGI-программы \S{master} или
\S{judge} пользователем с соответствующими привилегиями. 

\hypertarget{F:run.log,T:is_hidden}{}
Поле \V{is\_hidden} хранит флаг скрытой посылки. Поле может
принимать два значения: 0 и 1, соответствующие булевским
значениям \I{false} и \I{true}. Флаг скрытой посылки ставится
всегда при отправке посылки из-под привилегированных
CGI-программ \S{master} или \S{judge}. Кроме этого флаг скрытой
посылки может быть установлен вручную администратором турнира.

Когда флаг скрытой посылки установлен в \I{true}, такая посылка:
\begin{itemize}
\item
Не учитывается при вычислении штрафов за попытки, текущих
результатов турнира и не отображается в таблице текущих
результатов и публичном журнале посылок (если таковой ведётся).
\item
Не экспортируется в XML-формате.
\item
Может иметь время получения до момента начала турнира и после
момента окончания турнира.
\end{itemize}

\hypertarget{F:run.log,T:is_readonly}{}
Поле \V{is\_readonly} хранит флаг нередактируемой посылки. Поле
может принимать два значения: 0 и 1, соответствующие булевским
значениям \I{false} и \I{true}. Флаг нередактируемой посылки
может быть установлен вручную администратором турнира.

Если флаг нередактируемой посылки установлен в \I{true}, данная
посылка никогда не пересуживается с помощью кнопок ``Rejudge''
интерфейса администратора турнира. Администратор турнира не
может изменить ни одно поле посылки, за исключением поля
\V{is\_readonly}.

Назначение данного флага --- предотвратить случайное изменение
полей посылки (например, с помощью кнопки ``Rejudge'', если
статус посылки был установлен вручную), а не запретить
каким-либо пользователям редактировать поля базы посылок.

\hypertarget{F:run.log,T:pages}{}
Поле \V{pages} хранит количество страниц бумаги, использованных
при распечатке программы непривилегированным пользователем. Если
значение поля равно 0, программа не была распечатана. Значение
поля устанавливается после распечатки исходного кода программы в
данной посылке. Счётчик страниц включает в себя обязательную
титульную страницу, поэтому даже самая маленькая программа
потребует две страницы.

По умолчанию распечатка программ непривилегированными
пользователями запрещена. Чтобы разрешить распечатку необходимо
установить в \I{true} глобальную конфигурационную переменную
\hyperlink{F:serve.cfg,T:enable_printing}{\V{enable\_printing}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\subsection{Статус посылки}

В таблице \ref{tableRunStatuses} перечислены все возможные
статусы записей в базе посылок. Все перечисленные статусы
подробно комментируются ниже.

\begin{table}[htp]
\begin{center}
\begin{tabular}{|>{\scriptsize\ttfamily}p{3cm}>{\small\ttfamily}p{1cm}>{\small\ttfamily}p{1cm}p{1cm}p{3.5cm}>{\small}p{4.5cm}|}
\hline
\hspace{0pt}\rmfamily\normalsize Обозначение
 & \hspace{0pt}\rmfamily Числовое значение
 & \hspace{0pt}\rmfamily Выражение фильтра
 & \rmfamily\small Типы турниров
 & Английский текст
 & Русский текст\\
\hline
\multicolumn{6}{|c|}{\B{Обычные состояния}} \\
\hline
\hspace{0pt}\hyperlink{F:run.log,T:OK}{OK} & 0
  & OK & \I{AKO} & OK & OK \\
\hspace{0pt}\hyperlink{F:run.log,T:COMPILE_ERR}{COMPILE\_ERR} & 1
  & CE & \I{AKO} & Compilation error & Ошибка компиляции \\
\hspace{0pt}\hyperlink{F:run.log,T:RUN_TIME_ERR}{RUN\_TIME\_ERR} & 2
  & RT & \I{A} & Run-time error & Ошибка выполнения\\
\hspace{0pt}\hyperlink{F:run.log,T:TIME_LIMIT_ERR}{TIME\_LIMIT\_ERR} & 3
  & TL & \I{A} & Time-limit exceeded & Превышено максимальное время работы\\
\hspace{0pt}\hyperlink{F:run.log,T:PRESENTATION_ERR}{PRESENTATION\_ERR} & 4
  & PE & \I{A} & Presentation error & Неправильный формат вывода\\
\hspace{0pt}\hyperlink{F:run.log,T:WRONG_ANSWER_ERR}{WRONG\_ANSWER\_ERR} & 5
  & WA & \I{A} & Wrong answer & Неправильный ответ \\
\hspace{0pt}\hyperlink{F:run.log,T:CHECK_FAILED}{CHECK\_FAILED} & 6
  & CF & \I{AKO} & Check failed & Проверка завершилась неудачно\\
\hspace{0pt}\hyperlink{F:run.log,T:PARTIAL}{PARTIAL} & 7
  & PT & \I{KO} & Partial solution & Неполное решение\\
\hspace{0pt}\hyperlink{F:run.log,T:ACCEPTED}{ACCEPTED} & 8
  & AC & \I{AKO} & Accepted for testing & Принято на проверку\\
\hspace{0pt}\hyperlink{F:run.log,T:IGNORED}{IGNORED} & 9
  & IG & \I{AKO} & Ignored & Проигнорирована\\
\hline
\multicolumn{6}{|c|}{\B{Специальные записи}} \\
\hline
\hspace{0pt}\hyperlink{F:run.log,T:VIRTUAL_START}{VIRTUAL\_START} & 20
  & VS & \I{A} & Virtual start & Начало виртуального турнира\\
\hspace{0pt}\hyperlink{F:run.log,T:VIRTUAL_STOP}{VIRTUAL\_STOP} & 21
  & VT & \I{A} & Virtual stop & Окончание виртуального турнира\\
\hspace{0pt}\hyperlink{F:run.log,T:EMPTY}{EMPTY} & 22
  & EM & \I{AKO} & EMPTY & ПУСТО\\
\hline
\multicolumn{6}{|c|}{\B{Промежуточные состояния}} \\
\hline
\hspace{0pt}\hyperlink{F:run.log,T:RUNNING}{RUNNING} & 96 
  & RU & \I{AKO} & Running... & Выполняется...\\
\hspace{0pt}\hyperlink{F:run.log,T:COMPILED}{COMPILED} & 97
  & CD & \I{AKO} & Compiled & Скомпилировано\\
\hspace{0pt}\hyperlink{F:run.log,T:COMPILING}{COMPILING} & 98
  & CG & \I{AKO} & Compiling... & Компилируется...\\
\hspace{0pt}\hyperlink{F:run.log,T:AVAILABLE}{AVAILABLE} & 99
  & AV & \I{AKO} & Available & Доступна\\
\hline
\end{tabular}
\end{center}
\caption{Допустимые статусы посылок}
\label{tableRunStatuses}
\end{table}

В столбце <<Типы турниров>> перечислены типы турниров, в которых
посылка может иметь указанный статус. Букве \I{A} соответствует
тип турнира \I{ACM}, букве \I{K} --- \I{KIROV}, а букве \I{O}
--- \I{OLYMPIAD}.

\begin{itemize}
\item \hypertarget{F:run.log,T:OK}{}\K{OK.}
Посылка с таким статусом соответствует полностью засчитанному
решению. Решение засчитывается полностью, если оно даёт
правильный ответ на всех тестах. Кроме того, статус \V{OK} может
быть установлен вручную администратором системы.

В турнире по системе \I{ACM} участники ранжируются по количеству
полностью засчитанных решений. Полностью засчитанное решение
получает штраф равный количеству минут, прошедший от момента
начала турнира до момента получения этого решения плюс по 20
штрафных минут за каждую предыдущую попытку сдачи этой задачи.
Все посылки некоторого участника по некоторой задаче посланные
после успешной посылки игнорируются.

В турнире по системе \I{KIROV} полностью засчитанное решение
получает либо полный балл, указанный в конфигурационной
переменной
\hyperlink{F:serve.cfg,S:problem,T:full_score}{\V{full\_score}}
секции описания задачи
\hyperlink{F:serve.cfg,S:problem}{\V{problem}} конфигурационного
файла описания турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}},
либо количество баллов, указанное в поле \V{score}, если
конфигурационная переменная
\hyperlink{F:serve.cfg,S:problem,T:variable_full_score}{\V{variable\_full\_score}}
секции описания задачи установлена в значение \I{true}. Далее из
этого количества баллов вычитается штраф за предыдущие попытки
(как успешные, так и неуспешные). Штраф за попытку
устанавливается в конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:run_penalty}{\V{run\_penalty}}.
Если получающееся число оказывается меньшим нуля, берётся
значение 0. Окончательное число баллов, полученное участником за
задачу берётся как максимум по всем попыткам этого пользователя
сдать данную задачу.

В турнир по системе \I{OLYMPIAD} отличается от турнира по
системе \I{KIROV} тем, что штраф за предыдущие попытки не
начисляется, а количество баллов за задачу берётся по последней
попытке сдать эту задачу. 

\item \hypertarget{F:run.log,T:COMPILE_ERR}{}\K{COMPILE\_ERR.}
Если у посылки установлен такой статус, при компиляции программы
возникла ошибка компиляции. Причины возникновения ошибки
компиляции зависят от используемого компилятора. Судейский
протокол тестирования для посылок с таким статусом содержит
полный вывод (на стандартный поток вывода и стандартный поток
ошибок) компилятора. Если глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}}
или конфигурационная переменная раздела описания задачи
\hyperlink{F:serve.cfg,S:problem,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}}
файла конфигурации турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в \I{true}, то диагностика компилятора становиться
доступной участнику турнира.

Кроме того, если установлена
глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:team_enable_ce_view}{\V{team\_enable\_ce\_view}}
или конфигурационная переменная раздела описания задачи
\hyperlink{F:serve.cfg,S:problem,T:team_enable_ce_view}{\V{team\_enable\_ce\_view}}
файла конфигурации турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в \I{true}, диагностика компилятора в случае ошибки
компиляции предоставляется участнику вне зависимости от значения
конфигурационной переменной \V{team\_enable\_rep\_view}.

Если установлена глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:ignore_compile_errors}{\V{ignore\_compile\_errors}}
файла конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}, то посылки, имеющие
данный статус, не учитываются при вычислении текущих результатов
турнира, штрафов за предыдущие посылки участника, набранного
количества баллов и т. д.

\item \hypertarget{F:run.log,T:RUN_TIME_ERR}{}\K{RUN\_TIME\_ERR.}
Данный статус специфичен для турниров по системе \I{ACM} и
устанавливается, когда на некотором тесте тестируемая программа
завершилась аварийно. Для турниров по системам \I{OLYMPIAD} и
\I{KIROV} аварийное завершение тестируемой программы на
каком-либо тесте приведёт к тому, что статус посылки будет
установлен в \V{PARTIAL} или \V{CHECK\_FAILED} в зависимости от
результата тестирования на других тестах.

Тестируемая программа считается завершившейся аварийно, если
процесс был завершён из-за получения им сигнала,
который по умолчанию вызывает завершение процесса (например,
\V{SIGSEGV}), или если процесс завершился с ненулевым кодом
возврата.

Если включён режим передачи кода завершения процесса через файл
(см. параметр
\hyperlink{F:serve.cfg,S:tester,T:errorcode_file}{\V{errorcode\_file}}
секции тестировщика конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}, то проверяется только
код возврата, записанный в этом файле, а статус завершения
процесса игнорируется.

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

\item \hypertarget{F:run.log,T:TIME_LIMIT_ERR}{}\K{TIME\_LIMIT\_ERR.}
Данный статус специфичен для турниров по системе \I{ACM} и
устанавливается, когда на некотором тесте тестируемая программа
превысила максимальное время работы. Для турниров по системам
\I{OLYMPIAD} и \I{KIROV} превышение максимального времени работы
на каком-либо тесте приведёт к тому, что статус посылки будет
установлен в \V{PARTIAL} или \V{CHECK\_FAILED} в зависимости от
результата тестирования на других тестах.

Тестируемая программа считается превысившей максимальное время
работы, если виртуальное время работы процесса (пользовательская
составляющая) превысило ограничение, установленное в
конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:time_limit}{\V{time\_limit}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}, или если реальное
(астрономическое) время работы процесса превысило ограничение,
установленное в конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:real_time_limit}{\V{real\_time\_limit}}
того же файла. По умолчанию лимит астрономического времени
установлен в 30 секунд. Рекомендуется устанавливать этот лимит так,
чтобы он в 2---3 раза превосходил значение конфигурационной
переменной \V{time\_limit}.

Необходимость ограничения астрономического времени обоснована
тем, что в режиме <<сна>> (например, вызвав функцию \V{pause})
процесс не потребляет виртуальное процессорное время и, как
следствие, такой процесс может заблокировать проверяющую
систему. С другой стороны, нельзя ограничивать время
тестирования только с использованием астрономического времени,
так как тестирующий компьютер может быть загружен неравномерно,
могут выполняться другие процессы и т. д.

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

\item \hypertarget{F:run.log,T:PRESENTATION_ERR}{}\K{PRESENTATION\_ERR.}
Данный статус специфичен для турниров по системе \I{ACM} и
устанавливается, если проверяющая программа по тем или иным
причинам не может проанализировать вывод тестируемой программы
на некотором тесте. Для турниров по системам \I{OLYMPIAD} и
\I{KIROV} та же самая ошибка на каком-либо тесте приведёт к
тому, что статус посылки будет установлен в \V{PARTIAL} или
\V{CHECK\_FAILED} в зависимости от результата тестирования на
других тестах.

Если тестируемая программа завершилась корректно (с кодом
возврата 0) и уложилась в отведённое время, запускается
проверяющая программа, задача которой --- сравнить результат
работы тестируемой программы, сохранённый в файле, и правильный
ответ для этого теста. Имя проверяющей программы задаётся в
конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:check_cmd}{\V{check\_cmd}}
секции описания задачи конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

Проверяющая программа пишется специально для каждой задачи, хотя
возможно повторное использование проверяющих программ в простых
случаях, например, когда сравниваются два числа. Проверяющая
программа на основании входного файла с тестом, результата
работы программы на этом тесте и, возможно, файла с правильным
ответом выдаёт вердикт либо \V{OK}, либо \V{PRESENTATION\_ERR},
либо \V{WRONG\_ANSWER\_ERR}, либо \V{CHECK\_FAILED}.

Традиционно, \V{PRESENTATION\_ERR} выдаётся, когда проверяющая
программа не может разобрать файл с результатом работы
программы. Например, вместо целого числа в файле записана строка
и т. д. Следует заметить, что граница между ошибками типа
\V{PRESENTATION\_ERR} и \V{WRONG\_ANSWER\_ERR} не всегда может
быть определена точно.

\item \hypertarget{F:run.log,T:WRONG_ANSWER_ERR}{}\K{WRONG\_ANSWER\_ERR.}
Данный статус специфичен для турниров по системе \I{ACM} и
устанавливается, когда проверяющая программа выносит
соответствующий вердикт. Для турниров по системам \I{OLYMPIAD} и
\I{KIROV} та же самая ошибка на каком-либо тесте приведёт к
тому, что статус посылки будет установлен в \V{PARTIAL} или
\V{CHECK\_FAILED} в зависимости от результата тестирования на
других тестах.

Традиционно, \V{WRONG\_ANSWER\_ERR} выдаётся, если файл с
результатом работы соответствует спецификации вывода,
оговоренной в условии задачи, но конкретные значения не
совпадают с правильными, например, правильный ответ --- это
целое число 4, а программа выдала в качестве ответа целое число
3. Следует заметить, что граница между ошибками типа
\V{PRESENTATION\_ERR} и \V{WRONG\_ANSWER\_ERR} не всегда может
быть определена точно.

\item \hypertarget{F:run.log,T:CHECK_FAILED}{}\K{CHECK\_FAILED.}
Данный статус устанавливается, если посылка не может быть
проверена из-за сбоя в проверяющей системе. Для турнира по
системе \I{ACM} этот статус устанавливается, если при
тестировании программы на некотором тесте была получена ошибка
\V{CHECK\_FAILED}, а тестирование на всех предыдущих тестах
завершилась успешно. Для турнира по системам \I{OLYMPIAD} или
\I{KIROV} этот статус устанавливается, если хотя бы на одном
тесте была получена ошибка \V{CHECK\_FAILED}.

Ошибка \V{CHECK\_FAILED} может возникнуть и до начала
тестирования на этапе компиляции программы по следующим
причинам:
\begin{itemize}
\item
возникла ошибка копирования текста программы в разделяемые
каталоги программы \S{compile}, например, из-за нехватки
дискового пространства;
\item
возникла ошибка копирования файлов в программе \S{compile};
\item
программа компиляции не может быть запущена (например, не найден
файл программы);
\item
процесс компиляции завершился из-за получения сигнала,
обрабатываемого по умолчанию;
\item
процесс компиляции не завершился за астрономическое время,
установленное в конфигурационной переменной
\hyperlink{F:serve.cfg,S:language,T:compile_real_time_limit}{\V{compile\_real\_time\_limit}}
секции описания языка программирования конфигурационного файла
\hyperlink{F:serve.cfg}{\V{serve.cfg}};
\item
процесс компиляции вернул нулевой статус завершения, но файл с
исполняемым кодом не был создан.
\end{itemize}

На этапе тестирования программы ошибка \V{CHECK\_FAILED} может
возникнуть по следующим причинам:
\begin{itemize}
\item
возникла ошибка копирования текста программы в разделяемые
каталоги программы \S{run}, например, из-за нехватки
дискового пространства;
\item
возникла ошибка копирования файлов в программе \S{run};
\item
тестируемая программа не может быть запущена на выполнение;
\item
проверяющая программа не может быть запущена на выполнение;
\item
проверяющая программа была завершена из-за получения сигнала,
обрабатываемого по умолчанию, или вернула код завершения, не
равный кодам \V{OK}, \V{PRESENTATION\_ERR} или
\V{WRONG\_ANSWER\_ERR};
\item
проверяющая программа не завершилась за астрономическое время,
установленное в конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:checker_real_time_limit}{\V{checker\_real\_time\_limit}}
секции описания задачи конфигурационного файла
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.
\end{itemize}

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

Посылка со статусом \V{CHECK\_FAILED} не учитывается при
вычислении текущего положения участников турнира, расчёте
штрафных баллов и т. д.

\item \hypertarget{F:run.log,T:PARTIAL}{}\K{PARTIAL.}
Данный статус посылки специфичен для турниров типа \I{OLYMPIAD}
и \I{KIROV}. Он устанавливается, когда ни на одном тесте не было
получено ошибки \V{CHECK\_FAILED}, но в то же время не на всех
тестах был получен результат \V{OK}. Статус посылки \V{PARTIAL}
--- обычный статус для неполных решений в турнирах данных
типов.

\item \hypertarget{F:run.log,T:ACCEPTED}{}\K{ACCEPTED.}
Данный статус устанавливается у посылки в случаях, когда
автоматическое тестирование не производится. Программа участника
принимается и сохраняется в архиве исходных текстов, но
тестирование программы будет проводится позднее.

Посылка получает данный статус автоматически в следующих
случаях.

\begin{itemize}
\item
Турнир проводится по системе \I{OLYMPIAD} и находится в режиме
сбора решений. В режиме сбора решений каждое поступающее решение
проверяется на нескольких начальных тестах из набора тестов к
задаче (количество тестов задаётся с помощью конфигурационной
переменной
\hyperlink{F:serve.cfg,S:problem,T:tests_to_accept}{\V{tests\_to\_accept}}
секции описания задачи конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}). Если поступившее
решение проходит все тесты, соответствующей посылке
присваивается статус \V{ACCEPTED}. В дальнейшем в режиме
окончательного тестирования такие посылки будут протестированы
уже на всех тестах.

\item
Турнир проводится по любой системе, но для некоторой задачи
значение конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:disable_auto_testing}{\V{disable\_auto\_testing}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} равно \I{true}. В этом
случае при получении решения его немедленное тестирование не
производится, но при выборе команды ``Rejudge'' любого вида,
затрагивающей данную посылку, эта посылка будет полностью
протестирована.

\item
Турнир проводится по любой системе, но для некоторой задачи
значение конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:disable_testing}{\V{disable\_testing}}
раздела описания задачи конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} равно \I{true}. В этом
случае тестирование решения средствами системы \S{ejudge}
полностью отключено.

\item
Турнир проводится по любой системе, но находится в режиме
приостановки автоматического тестирования поступающих решений.
Турнир может быть переведён в этот режим командой
``Suspend testing'' администратора турнира (см. раздел
\ref{sectionMasterContestControl}. Все поступающие посылки
получают статус \V{ACCEPTED} и могут быть впоследствии
пересужены с помощью команды ``Rejudge''.
\end{itemize}

Посылка со статусом \V{ACCEPTED} не учитывается при вычислении
текущего положения участников турнира, расчёте штрафных баллов и
т. д.

\item \hypertarget{F:run.log,T:IGNORED}{}\K{IGNORED.}
Посылка с таким статусом не учитывается при вычислении текущего
положения участников турнира, расчёте штрафных баллов и т. д.

Статус \V{IGNORED} присваивается посылке автоматически, если
глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:ignore_duplicated_runs}{\V{ignore\_duplicated\_runs}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} равна \I{true} и в базе
посылок уже существует посылка, у которой значения полей
\V{size}, \V{ip}, \V{sha1}, \V{team}, \V{problem} и \V{language}
равны значениям этих полей текущей посылки. Такая проверка
полезна, чтобы избежать дублирующих посылок (и начисления
штрафных баллов) в случаях, когда пользователь системы слишком
часто нажимает кнопку ``Refresh'' браузера при медленном
канале.

При отправке решений из-под привилегированных программ
\S{master} и \S{judge} проверка дубликатов никогда не
выполняется.

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

\item \hypertarget{F:run.log,T:VIRTUAL_START}{}\K{VIRTUAL\_START.}
Такой статус имеет специальная запись в базе посылок, которая не
соответствует никакой посылке участника. Она добавляется в базу
посылок в момент начала участником своего виртуального турнира
(см. глобальную конфигурационную переменную
\hyperlink{F:serve.cfg,T:virtual}{virtual} конфигурационного
файла описания турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}).

Запись такого типа может быть добавлена в базу посылок только
при старте участником виртуального турнира и не может быть
установлена при редактировании полей посылок средствами
CGI-программы \S{master}. Запись может быть удалена только в том
случае, если в базе посылок не осталось посылок и записи типа
\V{VIRTUAL\_STOP}, принадлежащих этому участнику.

\item \hypertarget{F:run.log,T:VIRTUAL_STOP}{}\K{VIRTUAL\_STOP.}
Такой статус имеет специальная запись в базе посылок, которая не
соответствует никакой посылке участника. Она добавляется в базу
посылок в момент окончания участником своего виртуального
турнира с помощью команды ``Stop contest''. Если виртуальный
турнир участника завершается автоматически по истечению времени
турнира, никакая запись в базу посылок не добавляется.

Запись такого типа может быть добавлена в базу посылок только
участником при принудительном завершении им своего виртуального
турнира. Такой статус записи не может быть установлена при
редактировании полей посылок средствами CGI-программы
\S{master}.

\item \hypertarget{F:run.log,T:EMPTY}{}\K{EMPTY.}
Запись такого типа никогда не добавляется в базу посылок
автоматически. Статус \V{EMPTY} не может быть установлена при
редактировании полей посылок средствами CGI-программы
\S{master}.

Запись типа \V{EMPTY} возникает после очистки записи базы
посылок с помощью команды ``Clear entry'' CGI-программы
\S{master}. Поскольку номер посылки используется как первичный
ключ для обращения к архиву исходных текстов и протоколов
тестирования, операция сдвига записей в базе посылок на место
удаляемых посылок является достаточно дорогой и поэтому не
выполняется автоматически при каждом удалении записи. Чтобы
выполнить сдвиг записей на место удалённых записей необходимо
явно выполнить команду ``Squeeze runs'' CGI-программы
\S{master}.

\item \hypertarget{F:run.log,T:RUNNING}{}\K{RUNNING.}
Такой статус посылки устанавливается после копирования файла со
служебной информацией и файла с исполняемым файлом в каталог
обмена программы \S{run}. При получении результата тестирования
от программы \S{run} статус посылки будет изменён на результат
тестирования.

Если сервер компиляции \S{run} не запущен, файл со служебной
информацией имеет неправильный формат, или сервер тестирования
не может записать файл с результатом тестирования в каталог
обмена, посылка может оставаться в состоянии \V{RUNNING}
неограниченно долго. В этом случае необходимо вручную пересудить
эту посылку.

\item \hypertarget{F:run.log,T:COMPILED}{}\K{COMPILED.}
Такой статус посылки устанавливается после чтения файлов
результата компиляции и до копирования исполняемого файла в
каталог обмена с программой \S{run}, если компиляция завершилась
успешно. После того, как все необходимые данные будут
скопированы в каталог обмена, статус посылки меняется на
\V{RUNNING}.

\item \hypertarget{F:run.log,T:COMPILING}{}\K{COMPILING.}
Такой статус посылки устанавливается после копирования текста
программы в каталог обмена с программой \S{compile}. При
получении результата компиляции от программы \S{compile} статус
может быть изменён на \V{COMPILED}, \V{COMPILE\_ERR} или
\V{CHECK\_FAILED}.

Если сервер компиляции \S{compile} не запущен, файл со служебной
информацией для компиляции имеет неправильный формат, или сервер
компиляции не может записать файл с результатом компиляции в
каталог обмена, посылка может оставаться в состоянии
\V{COMPILING} неограниченно долго. В этом случае необходимо
вручную пересудить эту посылку.

\item \hypertarget{F:run.log,T:AVAILABLE}{}\K{AVAILABLE.}
Такой статус посылки устанавливается непосредственно после
приёма посылки от клиента и до отправки программы на компиляцию
и тестирование, если посылка проверяется автоматически (то есть
не выполняются условия для установки статуса \V{IGNORED} или
\V{ACCEPTED}).

После того, как файл с текстом программы будет скопирован в
каталог обмена с программой \V{compile}, у посылки будет
установлен статус \V{COMPILING}.  
\end{itemize}

% Local variables:
%  compile-command: "make"
% End:
