API вычислительных моделей

Принцип работы API

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

В основе API лежит формат XML. Платформа принимает алгоритм двумя способами:

  1. файл модели в формате .xml, выложенный на сервере,
  2. текстовое поле Model, переданное по Websockets API в команде start.

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

Для каждой из этих операций определены свои параметры.

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

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

Все вычислительные модули можно условно разделить на два типа:

  1. генерирующие  — модули, которые не получают данные на вход, а генерируют их сами,
  2. обрабатывающие  — модули, которые преобразовывают одни типы данных в другие.

Для генерирующих модулей в параметрах задаются выходные типы данных в формате Group:Class:Kind, для обрабатывающих модулей задаются входные и выходные типы данных в таком же формате.

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

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

Корневым элементом XML-конфига является список вычислительных модулей modules, то есть каждый файл модели начинается открывающим тэгом <modules> и заканчивается закрывающим тэгом </modules>.

Дочерним элементом для списка модулей могут быть только отдельные модули, которые обозначаются тэгом module.

Каждая отдельная вычислительная операция начинается открывающим тэгом <module> и заканчивается закрывающим тэгом </module>. Между ними располагаются тэги, соответствующие параметрам модуля. Состав параметров зависит от типа модуля.

Пример XML-конфига модели

Рассмотрим пример простейшей модели для обработки сигнала ЭЭГ.

В этом примере модель:

  1. Получает данные от нейроинтерфейса Muse,
  2. Выполняет спектральное разложение с помощью преобразования Фурье с двух отведений AF7 и AF8 на альфа- и бета-составляющие,
  3. Суммирует альфа-ритмы и определяет этот поток данных как bio:wave:Alpha_sum.
<modules>
  <module>
    <type>Np.Engine.Modules.MuseBle.MuseBleModule</type>
    <description>Получение данных от Muse</description>
    <settings>
      <Configuration>
        <Autorun>true</Autorun>
        <GlobalEvents>true</GlobalEvents>
        <Mac>0</Mac>
        <Interval>1</Interval>
        <LogEegAf7>true</LogEegAf7>
        <LogEegAf8>true</LogEegAf8>
        <LogEegTp9>false</LogEegTp9>
        <LogEegTp10>false</LogEegTp10>
        <LogEegAux>false</LogEegAux>
        <LogGyro>false</LogGyro>
        <LogAcc>true</LogAcc>
        <LogDeviceStatus>true</LogDeviceStatus>
      </Configuration>
    </settings>
  </module>
  <module>
    <type>Np.Engine.Modules.BandPower.BandPowerModule</type>
    <description>Преобразование Фурье AF7</description>
    <settings>
      <Configuration>
        <GlobalEvents>true</GlobalEvents>
		<IsPersistent>true</IsPersistent>
        <Group1>bio</Group1>
        <Class1>eeg</Class1>
        <Kind1>AF7</Kind1>
        <Freq1>256</Freq1>
        <Freq2>10</Freq2>
        <Interval>1</Interval>
        <OutputBands>
          <BandIndicatorConfig>
            <Enabled>true</Enabled>
            <Group>bio</Group>
            <Class>wave</Class>
            <Kind>AF7_alpha</Kind>
            <FreqMin>8</FreqMin>
            <FreqMax>13</FreqMax>
          </BandIndicatorConfig>
          <BandIndicatorConfig>
            <Enabled>true</Enabled>
            <Group>bio</Group>
            <Class>wave</Class>
            <Kind>AF7_beta</Kind>
            <FreqMin>14</FreqMin>
            <FreqMax>30</FreqMax>
          </BandIndicatorConfig>
        </OutputBands>
      </Configuration>
    </settings>
  </module>
  <module>
    <type>Np.Engine.Modules.BandPower.BandPowerModule</type>
    <description>Преобразование Фурье AF8</description>
    <settings>
      <Configuration>
        <GlobalEvents>true</GlobalEvents>
        <Group1>bio</Group1>
        <Class1>eeg</Class1>
        <Kind1>AF8</Kind1>
        <Freq1>256</Freq1>
        <Freq2>10</Freq2>
        <Interval>1</Interval>
        <OutputBands>
            <Kind>AF8_alpha</Kind>
            <FreqMin>8</FreqMin>
            <FreqMax>13</FreqMax>
          </BandIndicatorConfig>
          <BandIndicatorConfig>
            <Enabled>true</Enabled>
            <Group>bio</Group>
            <Class>wave</Class>
            <Kind>AF8_beta</Kind>
            <FreqMin>14</FreqMin>
            <FreqMax>30</FreqMax>
          </BandIndicatorConfig>
        </OutputBands>
      </Configuration>
    </settings>
  </module>
  <module>
    <type>Np.Engine.Modules.General.Combinator.CombinatorModule</type>
    <description>Сумма альфа-ритмов AF7 и AF8</description>
    <settings>
      <Configuration>
        <Autorun>true</Autorun>
        <GlobalEvents>true</GlobalEvents>
        <Group1>AF7_alpha</Group1>
        <Class1>wave</Class1>
        <Kind1>Concentration_filtered_muse</Kind1>
        <Group2>AF8_alpha</Group2>
        <Class2>wave</Class2>
        <Kind2>Concentration_muse_global_avg</Kind2>
        <Group>bio</Group>
        <Class>wave</Class>
        <Kind>Alpha_sum</Kind>
        <Neighborhood>120</Neighborhood>
        <MaxDelay>120</MaxDelay>
        <K1>1</K1>
        <K2>1</K2>
        <K3>0</K3>
        <K4>0</K4>
      </Configuration>
    </settings>
  </module>
 </modules>