Table of Contents
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) переключается между контекстами вариантов, а доступ к значениям параметров осуществляет не по имени, а через внутренние методы классов, используя индексацию элементов массивов.
