#summary Протокол Opal

<wiki:toc max_depth="2" />
----

= Общие сведения =

Протокол Opal специально разрабатывался с такой целью, чтобы быть максимально простым в использовании как человеку, так и машине. Не смотря на простоту, протокол обладает большой гибкостью и лаконичностью.

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

== Формат сообщения ==


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

В общем случае сообщение выглядит следующим образом - это набор пар ключ-значение, заключенный в фигурные скобки.
{{{
{ тело сообщения }
}}}

Пример простейшего сообщения:
{{{
{ request = info }
}}}

== Ключевые слова ==

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

|| *Слово* || Краткое описание ||
|| request || запрос какой-либо информации ||
|| answer  || ответ на запрос ||
|| status  || статус опрашиваемого процесса ||
|| main    || секция с описанием параметров модели ||
|| algo    || секция с описанием алгоритмов-методов модели ||
|| header  || секция с описанием заголовка таблицы результатов ||
|| table   || секция с описанием таблицы результатов ||
|| comment || комментарий ||

Теперь более подробно о каждом из ключевых слов.

=== request ===

=== answer ===

== Типы данных ==

= Соединение сервер - задача =

== Запрос информации сервером ==

Перед запуском задачи для того, чтобы узнать какие параметры нужно передавать для корректного выполнения алгоритма, сервер запускает задачу с ключом -i или --info:

`task (-i|--info)`

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

_name_ = _type_ (choice _list_) (default _value_)

<wiki:comment>
в будущем
_name_ = _type_ (choice _list_) (default _value_) (check _expr_)
</wiki:comment>

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

== Передача списка параметров ==

== Получение результата ==

= Соединение сервер - ГИП =

= Пример сессии =

{{{
// запрос сервера на получение информации о задаче
{
    request = info
}
// ответ клиента-задачи
{
    answer = ok
    
    meta = {
        detailed = true
    }
    
    main = {
        size    = int       default 100
        x       = float     default 20.0
        y       = float     default 0.0
        time    = period    default 00:00 to 24:00 comment twenty-four hours
    }
    
    algo = {
    
        genetic = {
            method  = string choice [std, last] default std
            poplulation = int default 1000
        }
        
        bellman = {
            xpart = float partition 0 to 100 by 1
            ypart = float partition 0 to  50 by 0.5
        }
    }
}
// запрос сервера на вычисления по указанным параметрам
{
    request = calculate
    
    main = {
        size    = 100
        x       = 20.0
        y       = 5.0
        time    = 00:00 to 48:00
    }
    
    algo = {
        genetic = {
            method = last
            population = 1200
        }
    }
}
// ответ клиента задачи о том, что вычисления начались
{
    answer = ok
    status = inprogress
}
// запрос сервера о статусе вычислений
{
    request = status
}
// ответ клиента-задачи о том, что прошла уже половина вычислений
{
    answer = ok
    status = inprogress
    percent = 0.50
    comment = 10 минут, полет нормальный
}
// снова запрос сервера о статусе
{
    request = status
}   
// клиент сообщает, что вычисления завершены, и предоставляет таблицу результатов
{
    answer = ok
    status = ready
    
    header = {
        time    = datetime
        x       = float
        y       = float
        u       = float comment management
    }
    
    table = {
        00:00   20.0    5.0     0.0
        01:00   18.0    6.0     1.0
        02:00   16.0    7.0     2.0
        //...
    }
}
}}}