IMsCalculationChainEntries.AddTargetTrajectory

Синтаксис Fore

AddTargetTrajectory(TargetEntry: IMsCalculationChainTarget): IMsCalculationChainTargetTrajectory;

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

AddTargetTrajectory(TargetEntry: Prognoz.Platform.Interop.Ms.IMsCalculationChainTarget): Prognoz.Platform.Interop.Ms.IMsCalculationChainTargetTrajectory;

Параметры

TargetEntry. Целевая функция.

Описание

Метод AddTargetTrajectory добавляет траекторию к указанной целевой функции.

Комментарии

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

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

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

Пример Fore

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

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

Sub UserProc;
Var
    mb: IMetabase;
    MsObj: IMetabaseObjectDescriptor;
    Ms: IMsModelSpace;
    Problem: IMsProblem;
    CalcChain: IMsCalculationChainEntries;
    I, j, TrajectoryScenarioKey: Integer;
    MetaTarget: IMsCalculationChainTarget;
    TargetProblem: IMsTargetProblem;
    MetaTrajectory: IMsCalculationChainTargetTrajectory;
    ScenarioTree: IMsScenarioTreeEntries;
    ScenElement: IMsScenarioTreeElement;
    Scenario: IMsScenario;
    Model: IMsModel;
    OutputsVar: IMsFormulaTransformVariables;
    CubeInst: ICubeInstance;
    Des: ICubeInstanceDestination;
    DimSS: IDimSelectionSet;
    DimS: IDimSelection;
    Elem: IDimElementArray;
    Elements: IDimElements;
    Mat: IMatrix;
    Coord: IMatrixCoord;
    Sto: ICubeInstanceStorage;
Begin
    // Получаем текущий репозиторий
    mb := MetabaseClass.Active;
    // Получаем контейнер моделирования
    MsObj := mb.ItemById("MS");
    Ms := MsObj.Edit As IMsModelSpace;
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace("CHAIN_TARGET_TRAJECTORY", MsObj.Key).Edit As IMsProblem;
    // Получаем цепочку расчета
    CalcChain := Problem.MetaModel.CalculationChain;
    j := CalcChain.Count - 1;
    i := 0;
    Repeat
        // Ищем в цепочке расчета целевую функцию
        If CalcChain.Item(i).Type = MsCalculationChainEntryType.Target Then
            MetaTarget := CalcChain.Item(i) As IMsCalculationChainTarget;
        End If;
        // Удаляем существующие траектории из цепочки расчета
        If CalcChain.Item(i).Type = MsCalculationChainEntryType.TargetTrajectory Then
            CalcChain.Remove(i);
            j := j - 1;
        End If;
        i := i + 1;
    Until i > j;
    // Добавляем в цепочку расчета траекторию целевой задачи
    MetaTrajectory := CalcChain.AddTargetTrajectory(MetaTarget);
    TargetProblem := MetaTrajectory.TargetEntry.TargetProblem;
    // Получаем сценарии контейнера моделирования
    ScenarioTree := Ms.ScenarioTree;
    // Добавляем сценарий для траектории целевой функции
    ScenElement := ScenarioTree.AddScenario;
    ScenElement.Name := "Сценарий для траектории целевой функции";
    Scenario := ScenElement.Scenario;
    // Получаем ключ данного сценария
    TrajectoryScenarioKey := Scenario.InternalKey;
    // Указываем созданный сценарий в целевой задаче
    Problem.Scenarios.AddScenario(Scenario);
    TargetProblem.TrajectoryScenario := Scenario;
    // Добавляем сценарий для целевой задачи
    ScenElement := ScenarioTree.AddScenario;
    ScenElement.Name := "Сценарий для целевой задачи";
    Scenario := ScenElement.Scenario;
    // Указываем созданный сценарий в целевой задаче
    Problem.Scenarios.AddScenario(Scenario);
    TargetProblem.TargetScenario := Scenario;
    // Сохраняем изменения в сценариях контейнера моделирования
    (Ms As IMetabaseObject).Save;
    // Получаем модель, содержащую параметры целевой функции
    Model := TargetProblem.Model;
    // Получаем данные моделируемой переменной, соответствующие данным траектории целевой функции
    OutputsVar := Model.Transform.Outputs;
    CubeInst := (OutputsVar.Item(0).VariableStub As IMetabaseObject).Open(NullAs ICubeInstance;
    // Изменяем данные траектории целевой функции по сценарному измерению
    Des := CubeInst.Destinations.Item(2);
    DimSS := Des.CreateDimSelectionSet;
    // Указываем, что меняем данные на годовой динамике
    DimS := DimSS.Item(0);
    Elem := DimS.Dimension.Levels.Item(0).Elements;
    For Each i In Elem Do
        DimS.SelectElement(i, False);
    End For;
    // Указываем, что меняем данные по сценарию, созданному для траектории целевой задачи
    DimS := DimSS.Item(1);
    DimS.DeselectAll;
    Elements := DimS.Dimension.Elements;
    For i := 0 To Elements.Count - 1 Do
        If Elements.Id(i) = TrajectoryScenarioKey.ToString Then
            DimS.SelectElement(i, False);
            j := i;
        End If;
    End For;
    DimSS.Item(2).SelectAll;
    // Получаем текущие данные
    Mat := Des.Execute(DimSS);
    Mat.ValueFlag := Mat.ValueFlag + 1;
    Coord := Mat.CreateCoord;
    Coord.Item(1) := j;
    Coord.Item(2) := 0;
    // Изменяем текущие данные
    For Each i In Elem Do
        Coord.Item(0) := i;
        Mat.Item(Coord) := 10 + 0.1 * i;
    End For;
    Sto := Des.CreateStorage;
    // Сохраняем изменения в данных траектории целевой функции
    Sto.SaveMatrix(Mat, Mat.ValueFlag);
    // Сохраняем изменения в задаче моделирования
    (Problem As IMetabaseObject).Save;
End Sub UserProc;

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

Пример Fore.NET

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

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

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    MsObj: IMetabaseObjectDescriptor;
    Ms: IMsModelSpace;
    Problem: IMsProblem;
    CalcChain: IMsCalculationChainEntries;
    I, j: Integer;
    TrajectoryScenarioKey: uinteger;
    MetaTarget: IMsCalculationChainTarget;
    TargetProblem: IMsTargetProblem;
    MetaTrajectory: IMsCalculationChainTargetTrajectory;
    ScenarioTree: IMsScenarioTreeEntries;
    ScenElement: IMsScenarioTreeElement;
    Scenario: IMsScenario;
    Model: IMsModel;
    OutputsVar: IMsFormulaTransformVariables;
    CubeInst: ICubeInstance;
    Des: ICubeInstanceDestination;
    DimSS: IDimSelectionSet;
    DimS: IDimSelection;
    Elem: IDimElementArray;
    Elements: IDimElements;
    Mat: IMatrix;
    Coord: IMatrixCoord;
    Sto: ICubeInstanceStorage;
Begin
    // Получаем текущий репозиторий
    mb := Params.Metabase;
    // Получаем контейнер моделирования
    MsObj := mb.ItemById["MS"];
    Ms := MsObj.Edit() As IMsModelSpace;
    // Получаем задачу моделирования
    Problem := mb.ItemByIdNamespace["CHAIN_TARGET_TRAJECTORY", MsObj.Key].Edit() As IMsProblem;
    // Получаем цепочку расчета
    CalcChain := Problem.MetaModel.CalculationChain;
    j := CalcChain.Count - 1;
    i := 0;
    Repeat
        // Ищем в цепочке расчета целевую функцию
        If CalcChain.Item[i].Type = MsCalculationChainEntryType.mccetTarget Then
            MetaTarget := CalcChain.Item[i] As IMsCalculationChainTarget;
        End If;
        // Удаляем существующие траектории из цепочки расчета
        If CalcChain.Item[i].Type = MsCalculationChainEntryType.mccetTargetTrajectory Then
            CalcChain.Remove(i);
            j := j - 1;
        End If;
        i := i + 1;
    Until i > j;
    // Добавляем в цепочку расчета траекторию целевой функции
    MetaTrajectory := CalcChain.AddTargetTrajectory(MetaTarget);
    TargetProblem := MetaTrajectory.TargetEntry.TargetProblem;
    // Получаем сценарии контейнера моделирования
    ScenarioTree := Ms.ScenarioTree;
    // Добавляем сценарий для траектории целевой функции
    ScenElement := ScenarioTree.AddScenario(FalseTrue);
    ScenElement.Name := "Сценарий для траектории целевой задачи";
    Scenario := ScenElement.Scenario;
    // Получаем ключ данного сценария
    TrajectoryScenarioKey := Scenario.InternalKey;
    // Указываем созданный сценарий в целевой задаче
    Problem.Scenarios.AddScenario(Scenario);
    TargetProblem.TrajectoryScenario := Scenario;
    // Добавляем сценарий для целевой задачи
    ScenElement := ScenarioTree.AddScenario(FalseTrue);
    ScenElement.Name := "Сценарий для целевой задачи";
    Scenario := ScenElement.Scenario;
    // Указываем созданный сценарий в целевой задаче
    Problem.Scenarios.AddScenario(Scenario);
    TargetProblem.TargetScenario := Scenario;
    // Сохраняем изменения в сценариях контейнера моделирования
    (Ms As IMetabaseObject).Save();
    // Получаем модель, содержащую параметры целевой функции
    Model := TargetProblem.Model;
    // Получаем данные моделируемой переменной, соответствующие данным траектории целевой функции
    OutputsVar := Model.Transform.Outputs;
    CubeInst := (OutputsVar.Item[0].VariableStub As IMetabaseObject).Open(NullAs ICubeInstance;
    // Изменяем данные траектории целевой функции по сценарному измерению
    Des := CubeInst.Destinations.Item[2];
    DimSS := Des.CreateDimSelectionSet();
    // Указываем, что меняем данные на годовой динамике
    DimS := DimSS.Item[0];
    Elem := DimS.Dimension.Levels.Item[0].Elements;
    For i := 0 To Elem.Count - 1 Do
        DimS.SelectElement(i As uinteger, False);
    End For;
    // Указываем, что меняем данные по сценарию, созданному для траектории целевой задачи
    DimS := DimSS.Item[1];
    DimS.DeselectAll();
    Elements := DimS.Dimension.Elements;
    For i := 0 To Elements.Count - 1 Do
        If Elements.Id[i As uinteger] = TrajectoryScenarioKey.ToString() Then
            DimS.SelectElement(i As uinteger, False);
            j := i;
        End If;
    End For;
    DimSS.Item[2].SelectAll();
    // Получаем текущие данные
    Mat := Des.Execute(DimSS, uinteger.MaxValue);
    Mat.ValueFlag := Mat.ValueFlag + 1;
    Coord := Mat.CreateCoord();
    Coord.Item[1] := j;
    Coord.Item[2] := 0;
    // Изменяем текущие данные
    For i := 0 To Elem.Count - 1 Do
        Coord.Item[0] := i;
        Mat.Item[Coord] := 10 + 0.1 * i;
    End For;
    Sto := Des.CreateStorage(CubeInstanceStorageOptions.cisoNone);
    // Сохраняем изменения в данных траектории целевой функции
    Sto.SaveMatrix(Mat, Mat.ValueFlag);
    // Сохраняем изменения в задаче моделирования
    (Problem As IMetabaseObject).Save();
End Sub;

См. также:

IMsCalculationChainEntries