IMsCalculationChainEntries.AddTargetProblem

Синтаксис Fore

AddTargetProblem(TargetProblem: IMsTargetProblem;
                 Level: DimCalendarLevel
                 ): IMsCalculationChainTarget;

Синтаксис Fore.NET

AddTargetProblem(TargetProblem: Prognoz.Platform.Interop.Ms.IMsTargetProblem;
                 Level: Prognoz.Platform.Interop.Dimensions.DimCalendarLevel
                 ): Prognoz.Platform.Interop.Ms.IMsCalculationChainTarget;

Параметры

TargetProblem. Целевая задача, для которой добавляется целевая функция;

Level. Календарная динамика добавляемой целевой функции.

Описание

Метод AddTargetProblem добавляет целевую функцию в цепочку расчета метамодели.

Комментарии

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

Если TargetProblem принимает значение Null, то целевая функция будет создана автоматически и добавлена в коллекцию дополнительных параметров задачи. Для задания параметров созданной целевой функции используйте свойство IMsCalculationChainTarget.TargetProblem.

После добавления целевой функции в цепочку расчета необходимо задать сценарий оптимизационной задачи.

Пример Fore

Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего задачу моделирования с идентификатором «CHAIN_TARGET_CONSTRANT». Данная задача должна быть предназначена для веб-приложения и содержать несколько сценариев.

Добавьте ссылки на системные сборки: Dimensions, Metabase, Ms.

Sub UserProc;
Var
    mb: IMetabase;
    MsObj: IMetabaseObjectDescriptor;
    Ms: IMsModelSpace;
    Problem: IMsProblem;
    MetaModel: IMsMetaModel;
    CalcChain: IMsCalculationChainEntries;
    Transform: IMsFormulaTransform;
    TransformVarables: IMsFormulaTransformVariables;
    TransVar: IMsFormulaTransformVariable;
    Slice: IMsFormulaTransformSlice;
    Target: IMsTargetProblem;
    AdditionalDetails: IMsProblemDetailsArray;
    MetaTarget: IMsCalculationChainTarget;
    OperandTerm: IMsFormulaTerm;
    exVar: Boolean;
    MetaVisual: IMsMetaModelVisualController;
    VarOutp: IMsCalculationChainVariable;
    VarEx: Boolean;
    InVarKey, InModelKey: Integer;
    InpKeys: Array[1Of Integer;
    SimpleModel: IMsModel;
    Operands: IMsFormulaTermList;
Begin
    // Получаем текущий репозиторий
    mb := MetabaseClass.Active;
    // Получаем контейнер моделирования
    MsObj := mb.ItemById("MS");
    Ms := MsObj.Bind As IMsModelSpace;
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace("CHAIN_TARGET_CONSTRANT", MsObj.Key).Edit As IMsProblem;
    // Получаем цепочку расчёта и очищаем её
    MetaModel := Problem.EditMetaModel;
    CalcChain := MetaModel.CalculationChain;
    CalcChain.Clear;
    // Если необходимо, то создаем для метамодели внутреннюю БД временных рядов
    MetaVisual := MetaModel.VisualController;
    If Not MetaVisual.HasVariableRubricator Then
        MetaVisual.HasVariableRubricator := True;
    End If;
    // Создаем внутреннюю переменную
    VarOutp := MetaVisual.CreateVariable("Внутренняя переменная""", DimCalendarLevel.Year, VarEx);
    InpKeys[0] := VarOutp.Key;
    // Создаем внутреннюю модель
    SimpleModel := MetaVisual.CreateSimpleModel(-1, InpKeys, VarOutp.Key, MsFormulaKind.LinearRegression, "", InVarKey, InModelKey, -1, -1True);
    // Создаем целевую задачу
    Target := New MsTargetProblem.Create;
    // Устанавливаем параметры целевой задачи
    AdditionalDetails := Problem.AdditionalDetails;
    AdditionalDetails.Clear;
    AdditionalDetails.AddDetails(Target, VarOutp.Slice);
    // Задаем сценарий оптимизационной задачи
    Target.OptimisticScenario := Problem.Scenarios.Item(0);
    // Добавляем переменные целевой функции
    Operands := Target.Operands;
    Transform := SimpleModel.Transform;
    TransformVarables := Transform.Outputs;
    TransVar := TransformVarables.Item(0);
    Slice := TransVar.Slices.Item(0);
    OperandTerm := Operands.Add(Slice);
    // Задаем целевую функцию
    Target.CriterionFunction.AsString := OperandTerm.TermToInnerText;
    // Добавляем целевую задачу в цепочку расчета
    MetaTarget := CalcChain.AddTargetProblem(Target, DimCalendarLevel.Year);
    // Задаем пользовательское имя целевой задачи
    MetaTarget.UseCustomName := True;
    MetaTarget.Name := "Новая целевая функция";
    // Сохраняем изменения      
    (Problem As IMetabaseObject).Save;
End Sub UserProc;

В результате выполнения примера в задачу моделирования будет добавлена внутренняя модель и целевая функция.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Ms;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    MsObj: IMetabaseObjectDescriptor;
    Ms: IMsModelSpace;
    Problem: IMsProblem;
    MetaModel: IMsMetaModel;
    CalcChain: IMsCalculationChainEntries;
    Transform: IMsFormulaTransform;
    TransformVarables: IMsFormulaTransformVariables;
    TransVar: IMsFormulaTransformVariable;
    Slice: IMsFormulaTransformSlice;
    Target: MsTargetProblem;
    AdditionalDetails: IMsProblemDetailsArray;
    MetaTarget: IMsCalculationChainTarget;
    OperandTerm: IMsFormulaTerm;
    exVar: Boolean;
    MetaVisual: IMsMetaModelVisualController;
    VarOutp: IMsCalculationChainVariable;
    VarEx: Boolean;
    InVarKey, InModelKey: Integer;
    InpKeys: Array[1Of integer;
    SimpleModel: IMsModel;
    Operands: IMsFormulaTermList;
Begin
    // Получаем текущий репозиторий
    mb := Params.Metabase;
    // Получаем контейнер моделирования
    MsObj := mb.ItemById["MS"];
    Ms := MsObj.Bind() As IMsModelSpace;
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace["CHAIN_TARGET_CONSTRANT", MsObj.Key].Edit() As IMsProblem;
    // Получаем цепочку расчёта и очищаем её
    MetaModel := Problem.EditMetaModel;
    CalcChain := MetaModel.CalculationChain;
    CalcChain.Clear();
    // Если необходимо, то создаем для метамодели внутреннюю БД временных рядов
    MetaVisual := MetaModel.VisualController;
    If Not MetaVisual.HasVariableRubricator Then
        MetaVisual.HasVariableRubricator := True;
    End If;
    // Создаем внутреннюю переменную
    VarOutp := MetaVisual.CreateVariable("Внутренняя переменная""", DimCalendarLevel.dclYear,
        Var VarEx, uinteger.maxValue, False);
    InpKeys[0] := VarOutp.Key As integer;
    // Создаем внутреннюю модель
    SimpleModel := MetaVisual.CreateSimpleModel(-1, InpKeys, VarOutp.Key As integer, MsFormulaKind.mfkLinearRegression,
        "" , Var InVarKey, Var InModelKey, uinteger.maxValue, uinteger.maxValue, True);
    // Создаем целевую задачу
    Target := New MsTargetProblem.Create();
    // Устанавливаем параметры целевой задачи
    AdditionalDetails := Problem.AdditionalDetails;
    AdditionalDetails.Clear();
    AdditionalDetails.AddDetails(Target, VarOutp.Slice);
    // Задаем сценарий оптимизационной задачи
    Target.OptimisticScenario := Problem.Scenarios.Item[0];
    // Добавляем переменные целевой функции
    Operands := Target.Operands;
    Transform := SimpleModel.Transform;
    TransformVarables := Transform.Outputs;
    TransVar := TransformVarables.Item[0];
    Slice := TransVar.Slices.Item[0];
    OperandTerm := Operands.Add(Slice);
    // Задаем целевую функцию
    Target.CriterionFunction.AsString := OperandTerm.TermToInnerText();
    // Добавляем целевую задачу в цепочку расчета
    MetaTarget := CalcChain.AddTargetProblem(Target, DimCalendarLevel.dclYear);
    // Задаем пользовательское имя целевой задачи
    MetaTarget.UseCustomName := True;
    MetaTarget.Name := "Новая целевая функция";
    // Сохраняем изменения      
    (Problem As IMetabaseObject).Save();
End Sub;

См. также:

IMsCalculationChainEntries