CriterionFunction: IExpression;
The CriterionFunction property returns criterion function.
To create a criterion function, use phase variables. To get the set of phase variables, use the IMsBaseOptimizationProblem.Operands property.
Executing the example requires that the repository contains a modeling container with the MS identifier containing a folder with the TARGET identifier and a metamodel with the TARGET_METAMODEL identifier. A calculation chain of this metamodel should contain a model with the TARGET_MODEL identifier.
Add links to the Cp, Cubes, Dimensions, Metabase, Ms system assemblies.
Sub UserProc;
Var
mb: IMetabase;
msObj, problemObj: IMetabaseObject;
crInfo: IMetabaseObjectCreateInfo;
problem: IMsProblem;
metaModel: IMsMetaModel;
forecastProblem: IMsProblemDetails;
targetProblem: IMsTargetProblem;
period: IMsModelPeriod;
calcChain: IMsCalculationChainEntries;
calcChainModel: IMsCalculationChainModel;
model, targetModel: IMsModel;
trans, targetTrans: IMsFormulaTransform;
transformVar, targetTransformVar: IMsFormulaTransformVariable;
slice, targetSlice, constrSlice: IMsFormulaTransformSlice;
operands, controlVariables, constrOperands: IMsFormulaTermList;
operTermX1, constrTermX1: IMsFormulaTerm;
controlTermX1: IMsTargetFormulaTerm;
tree: IMsFormulaTransformSlicesTree;
initApprox: Array Of double;
i: Integer;
varConstraints: IMsTargetVarConstraints;
varConstr: IMsTargetVarConstraint;
targetConstraints: IMsTargetConstraints;
targetConstr: IMsTargetConstraint;
targetConstrArray: IMsTargetConstraintInfoArray;
targetConstrInfo: IMsTargetConstraintInfo;
Begin
mb := MetabaseClass.Active;
msObj := mb.ItemById("MS").Bind;
crInfo := MB.CreateCreateInfo;
crInfo.ClassID := MetabaseObjectClass.KE_CLASS_MSPROBLEM;
crInfo.Id := mb.GenerateId("TARGETPROBLEM", msObj.Key);
crInfo.Name := "Criterion problem";
crInfo.Parent := mb.ItemByIdNamespace("TARGET", msObj.key);
problemObj := mb.CreateObject(crInfo).Edit;
problem := problemObj As IMsProblem;
// Set calculated metamodel
metaModel := Mb.ItemByIdNamespace("TARGET_METAMODEL", msObj.Key).Edit As IMsMetaModel;
problem.MetaModel := metaModel;
// Set forecasting parameters for problem
forecastProblem := New MsForecastingProblem.Create;
problem.Details := forecastProblem;
// Create criterion problem calculation parameters
targetProblem := New MsTargetProblem.Create;
// Set calculation periods
period := targetProblem.Period;
period.IdentificationStartDate := DateTime.Parse("01.01.2001");
period.IdentificationEndDate := DateTime.Parse("31.12.2014");
period.ForecastStartDate := DateTime.Parse("01.01.2015");
period.ForecastEndDate := DateTime.Parse("31.12.2019");
// Get a model calculated by problem
calcChain := metaModel.CalculationChain;
calcChainModel := calcChain.FindById("TARGET_MODEL") As IMsCalculationChainModel;
model := calcChainModel.Model;
// Get output variable slice
trans := model.Transform;
transformVar := trans.Outputs.Item(0);
slice := transformVar.Slices.Item(0);
// Set criterion problem parameters
problem.AdditionalDetails.AddDetails(targetProblem, slice);
// Add phase variables
operands := targetProblem.Operands;
operTermX1 := operands.Add(transformVar.Slices.Item(0));
// Set criterion function
targetProblem.CriterionFunction.AsString := operTermX1.TermToInnerText;
// Set criterion function calculation parameters
targetProblem.Extremum := ExtremumType.Maximum;
targetProblem.AutoSearchType := TargetAutoSearchType.ExactSol;
targetProblem.NodesCount := 4;
targetProblem.MethodType := CpNonLinearMethodType.GridSearch;
targetProblem.VariablesCalculationTechnique := StateVariablesCalculationTechniqueType.DirectEntirelySubstitution;
targetProblem.Level := DimCalendarLevel.Year;
// Set accuracy of solution and available number of iterations
targetProblem.Tolerance := 0.00001;
targetProblem.MaxIterationsCount := 150;
// Set controlling variables
controlVariables := targetProblem.ControlVariables;
targetTrans := targetProblem.ControlTransform;
targetTransformVar := targetTrans.Inputs.Add(transformVar.VariableStub);
tree := targetTransformVar.SlicesTree(targetTransformVar);
targetSlice := tree.CreateSlice(2);
controlTermX1 := controlVariables.Add(targetSlice) As IMsTargetFormulaTerm;
// Set initial values of controlling variable
initApprox := New Double[5];
For i := 0 To 4 Do
initApprox[i] := i * 0.14;
End For;
controlTermX1.InitApproximation := initApprox;
// Set fixation mode for controlling variable limits
controlTermX1.UpperBoundFixed := MsBoundFixType.NotFixed;
controlTermX1.LowerBoundFixed := MsBoundFixType.NotFixed;
// Set controlling variable constraints
varConstraints := controlTermX1.VarConstraints;
For i := 0 To 4 Do
varConstr := varConstraints.Add;
varConstr.TimeMoment := i;
varConstr.UseLowerBound := True;
varConstr.LowerBoundFixed := False;
varConstr.LowerBound := 0.44 + i * 0.1;
varConstr.UseUpperBound := True;
varConstr.UpperBoundFixed := False;
varConstr.UpperBound := 0.64 + i * 0.1;
End For;
// Set criterion function constraints
targetConstraints := targetProblem.Constraints;
// Create a constraint
targetConstr := targetConstraints.Add;
// Add a new operand into collection of criterion function operands
constrOperands := targetConstr.Operands;
targetTransformVar := targetTrans.Inputs.Add(transformVar.VariableStub);
tree := targetTransformVar.SlicesTree(targetTransformVar);
constrSlice := tree.CreateSlice(3);
constrTermX1 := constrOperands.Add(constrSlice);
// Set constraint expression
targetConstr.Expression.AsString := constrTermX1.TermToInnerText;
// Set fixation mode for constraint limits
targetConstr.LowerBoundFixed := MsBoundFixType.NotFixed;
targetConstr.UpperBoundFixed := MsBoundFixType.NotFixed;
// Set values of criterion function constraint
targetConstrArray := targetConstr.ConstraintInfoArray;
For i := 0 To 4 Do
targetConstrInfo := targetConstrArray.Add;
targetConstrInfo.TimeMoment := i;
targetConstrInfo.LowerBoundFixed := False;
targetConstrInfo.LowerBound := 0.74 + i * 0.1;
targetConstrInfo.UpperBoundFixed := False;
targetConstrInfo.UpperBound := 1.74 + i * 0.1;
End For;
// Save model
problemObj.Save;
End Sub UserProc;
After executing the example a criterion problem is created and set up in the folder with the TARGET identifier in the modeling container.
See also: