User Tools

Site Tools


libkin:classes:schema:index

Schema

Parameters

Основными сущностями (Entity) Схемы являются Константы скоростей элементарных реакций, Реагенты и дополнительные параметры, используемые в вычислениях. Тип Entity – это пара “имя/значение”: std::pair<String, Expression*>. Задавать значения сущностям “константа скорости” и “начальная концентрация” на уровне схемы нет нужды, ибо такие значения появляются на стадии инстанциации Схемы, создания Инстанса, SchemaInstance. Однако для удобства в ABC-Kinetics предусмотрена такая возможность: объявление подобных “глобальных” значений облегчает параметризацию Инстансов, когда ряд их параметров совпадает по значению1). В таких случаях достаточно объявить глобальное значение.

Для хранения списков параметров в классе Schema существуют контейнеры: parameters и reactants, их тип, EntityContainer, это несколько расширенный класс std::vector<Entity>. Использование типа vector<Entity>, а не map<String,Expression*> – это осознанное и важное решение, принятое при проектировании. Необходимость доступа к элементам контейнеров по их индексам обсуждается далее, в описании класса Expression.

Итак:

typedef std::pair<String, Expression*> Entity;

class EntityContainer
{
 //...
 private:
   std::vector<Entity> entities;
};

class Schema
{
 //...
 private:
   EntityContainer parameters;
   EntityContainer reactants;
 //...
};

SchemaInstance

В объекте “Вариант схемы” (SchemaInstance) хранятся лишь конкретные значения параметров для данного конкретного варианта, все имена параметров обнаруживаются на этапе анализа и параметризации Схемы. Поэтому в классе SchemaInstance для их используются контейнеры несколько иного типа ExpressionContainer:

typedef std::vector<Expression*> ExpressionContainer;

class SchemaInstance
{
 //...
 private:
   ExpressionContainer parameterValues;
   ExpressionContainer reactantInitValues;
 //...
};

Для единообразия в интерфейсах обоих классов введём методы доступа к значениям параметров2):

const Expression* getParameterValue(Const String& name) const;
const Expression* getInitConcentration(Const String& name) const;

Status setParameterValue(const String& name, const String& exprText);
Status setReactantInitValue(const String& name, const String& exprText);

Здесь Status – расширенный логический тип, сообщающий об успехе/неуспехе трансляции выражения и об ошибке, если таковая присутствует. Эти методы ориентированы на GUI, в вычислениях используются внутренние методы быстрого доступа (см. Примечание).

Addition

При интегрировании систем дифференциальных уравнений Решатель (Solver) переключается между контекстами вариантов, а доступ к значениям параметров осуществляет не по имени, а через внутренние методы классов, используя индексацию элементов массивов.

1)
например, начальная концентрация продукта во всех изучаемых Интстансах равна нулю
2)
NB: под “Значением” здесь и далее понимается не численное значение, а объект Expression, который может быть “вычислен”/evaluated
libkin/classes/schema/index.txt · Last modified: by 127.0.0.1