====== Schema ====== ===== Parameters ===== Основными сущностями (//Entity//) //Схемы// являются //Константы скоростей элементарных реакций//, //Реагенты// и //дополнительные параметры//, используемые в вычислениях. Тип //Entity// -- это пара "имя/значение": ''std::pair''. Задавать значения сущностям "константа скорости" и "начальная концентрация" на уровне схемы нет нужды, ибо такие значения появляются на стадии инстанциации //Схемы//, создания //Инстанса//, //SchemaInstance//. Однако для удобства в //ABC-Kinetics// предусмотрена такая возможность: объявление подобных "глобальных" значений облегчает параметризацию //Инстансов//, когда ряд их параметров совпадает по значению((например, начальная концентрация продукта во всех изучаемых //Интстансах// равна нулю)). В таких случаях достаточно объявить глобальное значение. Для хранения списков параметров в классе //Schema// существуют контейнеры: //parameters// и //reactants//, их тип, //EntityContainer//, это несколько расширенный класс ''std::vector''. Использование типа ''vector'', а не ''map'' -- это осознанное и важное решение, принятое при проектировании. Необходимость доступа к элементам контейнеров по их индексам обсуждается далее, в описании класса //[[..:expr:|Expression]]//. Итак: typedef std::pair Entity; class EntityContainer { //... private: std::vector entities; }; class Schema { //... private: EntityContainer parameters; EntityContainer reactants; //... }; ===== SchemaInstance ===== В объекте "//Вариант схемы//" (//SchemaInstance//) хранятся лишь конкретные значения параметров для данного конкретного варианта, все имена параметров обнаруживаются на этапе анализа и параметризации //Схемы//. Поэтому в классе //SchemaInstance// для их используются контейнеры несколько иного типа //ExpressionContainer//: typedef std::vector ExpressionContainer; class SchemaInstance { //... private: ExpressionContainer parameterValues; ExpressionContainer reactantInitValues; //... }; Для единообразия в интерфейсах обоих классов введём методы доступа к значениям параметров((NB: под "Значением" здесь и далее понимается не численное значение, а объект //Expression//, который может быть "вычислен"/evaluated)): 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//) переключается между контекстами вариантов, а доступ к значениям параметров осуществляет не по имени, а через внутренние методы классов, используя индексацию элементов массивов.