ISmQuadraticProgramming.PerformanceInfo

Syntax

PerformanceInfo: IPerformanceInfo;

PerformanceInfo: Prognoz.Platform.Interop.Stat.IPerformanceInfo;

Description

The PerformanceInfo property returns information about executed optimization.

Comments

To determine parameters of non-linear constraints, use the ISmQuadraticProgramming.LinearConstraints property.

Example

To execute the example, add a link to the Stat system assembly.

Sub UserProc;
Var
    QP: SmQuadraticProgramming;
    i, j, Res, N: Integer;
    d, time: double;
    CF, Lb, Ub, init: Array 
Of Double;
    LinC1: Array 
Of Double;
    H, A: Array 
Of Double;
    Bound: ISlBoundaryRegion;
    LinCons: ISlLinearConstraints;
    LCon1: ISlLinearConstraint;
    InitP, Sol, BoundL, PerformanceObj, PerformancePoint: Array 
Of Double;
Begin
    QP := 
New SmQuadraticProgramming.Create;
    N := 
7;
    CF := 
New Double[N];
    Lb := 
New Double[N];
    Ub := 
New Double[N];
    LinC1 := 
New Double[N];
    init := 
New double[N];
    // Definition area
    Lb[0] := -0.01; Ub[0] := 0.01;
    Lb[
1] := -0.10; Ub[1] := 0.15;
    Lb[
2] := -0.01; Ub[2] := 0.03;
    Lb[
3] := -0.04; Ub[3] := 0.02;
    Lb[
4] := -0.10; Ub[4] := 0.05;
    Lb[
5] := -0.01; Ub[5] := double.PositiveInfinity;
    Lb[
6] := -0.01; Ub[6] := Double.PositiveInfinity;
    
// Initial approximations
    init[0] := -0.01;
    init[
1] := -0.03;
    init[
2] := 0.0;
    init[
3] := -0.01;
    init[
4] := -0.1;
    init[
5] := 0.02;
    init[
6] := 0.01;
    QP.InitialApproximation.AutoCreate := 
False;
    QP.InitialApproximation.InitValues := init;
    
//Criterion function
    CF[0] := -0.02;
    CF[
1] := -0.2;
    CF[
2] := -0.2;
    CF[
3] := -0.2;
    CF[
4] := -0.2;
    CF[
5] := 0.04;
    CF[
6] := 0.04;

    H := New double[N, N];
    H[
00] := 2; H[01] := 0; H[02] := 0; H[03] := 0; H[04] := 0; H[05] := 0; H[06] := 0;

    H[10] := 0; H[11] := 2; H[12] := 0; H[13] := 0; H[14] := 0; H[15] := 0; H[16] := 0;
    H[
20] := 0; H[21] := 0; H[22] := 2; H[23] := 2; H[24] := 0; H[25] := 0; H[26] := 0;
    H[30] := 0; H[31] := 0; H[32] := 2; H[33] := 2; H[34] := 0; H[35] := 0; H[36] := 0;
    H[40] := 0; H[41] := 0; H[42] := 0; H[43] := 0; H[44] := 2; H[45] := 0; H[46] := 0;
    H[50] := 0; H[51] := 0; H[52] := 0; H[53] := 0; H[54] := 0; H[55] := -2; H[56] := -2;
    H[60] := 0; H[61] := 0; H[62] := 0; H[63] := 0; H[64] := 0; H[65] := -2; H[66] := -2;
    QP.CriterionFunction := CF;
    QP.QuadraticForm := H;

    
// Linear constraints
    A := New double[N, N];
    A[
00] := 1.00; A[01] := 1.00; A[02] := 1.00;
    A[03] := 1.00; A[04] := 1.00; A[05] := 1.00; A[06] := 1.00;
    A[
10] := 0.15; A[11] := 0.04; A[12] := 0.02;
    A[13] := 0.04; A[14] := 0.02; A[15] := 0.01; A[16] := 0.03;
    A[
20] := 0.03; A[21] := 0.05; A[22] := 0.08;
    A[23] := 0.02; A[24] := 0.06; A[25] := 0.01; A[26] := 0.00;
    A[
30] := 0.02; A[31] := 0.04; A[32] := 0.01;
    A[33] := 0.02; A[34] := 0.02; A[35] := 0.00; A[36] := 0.00;
    A[
40] := 0.02; A[41] := 0.03; A[42] := 0.00;
    A[43] := 0.00; A[44] := 0.01; A[45] := 0.00; A[46] := 0.00;
    A[
50] := 0.70; A[51] := 0.75; A[52] := 0.80;
    A[53] := 0.75; A[54] := 0.80; A[55] := 0.97; A[56] := 0.00;
    A[
60] := 0.02; A[61] := 0.06; A[62] := 0.08;
    A[63] := 0.12; A[64] := 0.02; A[65] := 0.01; A[66] := 0.97;
    
// Area limits
    Bound := QP.Boundary;
    
//Lower area limit
    Bound.BoundaryLower := Lb;
    
//Upper area limit
    Bound.BoundaryUpper := Ub;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
0, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := -0.13;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.13;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
1,i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0049;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
2, i];
    
End For;
    LCon1.Value := LinC1;

    // Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0064;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
3, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0037;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
4, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0012;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
5, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := -0.0992;
    
// Upper linear constraint
    LCon1.BoundaryUpper := double.PositiveInfinity;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add;
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
6, i];
    
End For;
    LCon1.Value := LinC1;

    // Lower linear constraint
    LCon1.BoundaryLower := -0.003;
    
// Upper linear constraint
    LCon1.BoundaryUpper := 0.002;
    
// Calculate and display solution
    Res := QP.Execute;
    time := QP.PerformanceTime / 
1000;
    Debug.WriteLine(
"Execution time, sec " + time.ToString);
    Debug.WriteLine(
"Execution status: " + Res.ToString);
    Debug.WriteLine(QP.Errors);
    
If res = 0 Then
        Debug.WriteLine(
"== Criterion function value ==");
        Debug.WriteLine(QP.OptimalFunctionValue.ToString);
        Debug.WriteLine(
"Number of criterion function calls: "
        + qp.PerformanceInfo.ObjFunCalls.ToString);
        Debug.WriteLine(
"Number of constraints calls: "
        + qp.PerformanceInfo.ConstraintsCalls.ToString);
        Debug.WriteLine(
"Actual number of iterations: "
        + qp.PerformanceInfo.Iterations.ToString);
        Debug.WriteLine(
"== Solution ==");
        Sol := QP.Solution;
        
For i := 0 To Sol.Length - 1 Do
            Debug.WriteLine(i.ToString + 
": " + Sol[i].ToString);
        
End For;
        Debug.WriteLine(
"== Common constraints: ==");
        d := 
0;
        BoundL := Bound.LagrangeMultiplier;
        
For i := 0 To N - 1 Do //
            d := Sol[i];
            Debug.WriteLine(i.ToString + 
": ");
            Debug.WriteLine(Lb[i].ToString + 
"<=" + d.ToString +
            "<= " + Ub[i].ToString);
            Debug.WriteLine(
"Lagrange multiplier: " + BoundL[i].ToString);
            Debug.WriteLine(
"  ");
        
End For;
        Debug.WriteLine(
"   ");
        Debug.WriteLine(
"== Linear constraints ==");
        LinCons := QP.LinearConstraints;
        
For i := 0 To LinCons.Count - 1 Do
            LCon1 := LinCons.Item(i);
            Debug.WriteLine(i.ToString + 
": " + LCon1.BoundaryLower.ToString + " <= "
            + LCon1.Result.ToString + " <= " + LCon1.BoundaryUpper.ToString);
            Debug.WriteLine(
"Lagrange multiplier: " + LCon1.LagrangeMultiplier.ToString);
            Debug.WriteLine(
"  ");
        
End For;
    
End If;
    
    Debug.WriteLine(
"== Initial approximation ==");
    PerformancePoint := QP.PerformanceInfo.InitFeasiblePoint;
    
For i := 0 To PerformancePoint.Length - 1 Do
        Debug.WriteLine(i.ToString + 
": " + PerformancePoint[i].ToString);
    
End For;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    QP: SmQuadraticProgramming;
    i, j, Res, N: integer;
    d, time: double;
    CF, Lb, Ub, init: Array 
Of double;
    LinC1: Array 
Of double;
    H, A: Array[
77Of double;
    Bound: ISlBoundaryRegion;
    LinCons: ISlLinearConstraints;
    LCon1: ISlLinearConstraint;
    InitP, Sol, BoundL, PerformanceObj, PerformancePoint: System.Array;
Begin
    QP := 
New SmQuadraticProgramming.Create();
    N := 
7;
    CF := 
New Double[N];
    Lb := 
New Double[N];
    Ub := 
New Double[N];
    LinC1 := 
New Double[N];
    init := 
New double[N];
    // Definition area
    Lb[0] := -0.01; Ub[0] := 0.01;
    Lb[
1] := -0.10; Ub[1] := 0.15;
    Lb[
2] := -0.01; Ub[2] := 0.03;
    Lb[
3] := -0.04; Ub[3] := 0.02;
    Lb[
4] := -0.10; Ub[4] := 0.05;
    Lb[
5] := -0.01; Ub[5] := double.PositiveInfinity;
    Lb[
6] := -0.01; Ub[6] := Double.PositiveInfinity;
    
// Initial approximations
    init[0] := -0.01;
    init[
1] := -0.03;
    init[
2] := 0.0;
    init[
3] := -0.01;
    init[
4] := -0.1;
    init[
5] := 0.02;
    init[
6] := 0.01;
    QP.InitialApproximation.AutoCreate := 
False;
    QP.InitialApproximation.InitValues := init;

    //Criterion function
    CF[0] := -0.02;
    CF[
1] := -0.2;
    CF[
2] := -0.2;
    CF[
3] := -0.2;
    CF[
4] := -0.2;
    CF[
5] := 0.04;
    CF[
6] := 0.04;
    H := 
New double[N, N];
    H[00] := 2; H[01] := 0; H[02] := 0; H[03] := 0; H[04] := 0; H[05] := 0; H[06] := 0;
    H[10] := 0; H[11] := 2; H[12] := 0; H[13] := 0; H[14] := 0; H[15] := 0; H[16] := 0;
    H[
20] := 0; H[21] := 0; H[22] := 2; H[23] := 2; H[24] := 0; H[25] := 0; H[26] := 0;
    H[30] := 0; H[31] := 0; H[32] := 2; H[33] := 2; H[34] := 0; H[35] := 0; H[36] := 0;
    H[40] := 0; H[41] := 0; H[42] := 0; H[43] := 0; H[44] := 2; H[45] := 0; H[46] := 0;
    H[50] := 0; H[51] := 0; H[52] := 0; H[53] := 0; H[54] := 0; H[55] := -2; H[56] := -2;
    H[60] := 0; H[61] := 0; H[62] := 0; H[63] := 0; H[64] := 0; H[65] := -2; H[66] := -2;
    QP.CriterionFunction := CF;
    QP.QuadraticForm := H;

    
// Linear constraints
    A := New double[N, N];
    A[
00] := 1.00; A[01] := 1.00; A[02] := 1.00;
    A[
03] := 1.00; A[04] := 1.00; A[05] := 1.00; A[06] := 1.00;
    A[
10] := 0.15; A[11] := 0.04; A[12] := 0.02;
    A[
13] := 0.04; A[14] := 0.02; A[15] := 0.01; A[16] := 0.03;
    A[
20] := 0.03; A[21] := 0.05; A[22] := 0.08;
    A[
23] := 0.02; A[24] := 0.06; A[25] := 0.01; A[26] := 0.00;
    A[
30] := 0.02; A[31] := 0.04; A[32] := 0.01;
    A[
33] := 0.02; A[34] := 0.02; A[35] := 0.00; A[36] := 0.00;
    A[
40] := 0.02; A[41] := 0.03; A[42] := 0.00;
    A[
43] := 0.00; A[44] := 0.01; A[45] := 0.00; A[46] := 0.00;
    A[
50] := 0.70; A[51] := 0.75; A[52] := 0.80;
    A[
53] := 0.75; A[54] := 0.80; A[55] := 0.97; A[56] := 0.00;
    A[
60] := 0.02; A[61] := 0.06; A[62] := 0.08;
    
A[63] := 0.12; A[64] := 0.02; A[65] := 0.01; A[66] := 0.97;
    
    
// Area limits
    Bound := QP.Boundary;
    
//Lower area limit
    Bound.BoundaryLower := Lb;
    
//Upper area limit
    Bound.BoundaryUpper := Ub;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i := 0 To N - 1 Do
        LinC1[i] := A[
0, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := -0.13;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.13;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
1, i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0049;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
2,i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0064;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
3,i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0037;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
4,i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := double.NegativeInfinity;
    
// Upper linear constraint
    LCon1.BoundaryUpper := -0.0012;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
5,i];
    
End For;
    LCon1.Value := LinC1;
    
// Lower linear constraint
    LCon1.BoundaryLower := -0.0992;
    
// Upper linear constraint
    LCon1.BoundaryUpper := double.PositiveInfinity;
    
// Linear constraint coefficient
    LCon1 := QP.LinearConstraints.Add();
    
For i:=0 To N-1 Do
        LinC1[i] := A[
6, i];
    
End For;
    LCon1.Value := LinC1;


   
// Lower linear constraint
    LCon1.BoundaryLower := -0.003;
    
// Upper linear constraint
    LCon1.BoundaryUpper := 0.002;
    
// Calculate and display solution
    Res := QP.Execute();
    time := QP.PerformanceTime / 
1000;
    System.Diagnostics.Debug.WriteLine(
"Execution time, sec " + time.ToString());
    System.Diagnostics.Debug.WriteLine(
"Execution status: " + Res.ToString());
    System.Diagnostics.Debug.WriteLine(QP.Errors);
    
If res = 0 Then
        System.Diagnostics.Debug.WriteLine(
"== Criterion function value ==");
        System.Diagnostics.Debug.WriteLine(QP.OptimalFunctionValue.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of criterion function calls: "
        + qp.PerformanceInfo.ObjFunCalls.ToString());
        System.Diagnostics.Debug.WriteLine(
"Number of constraints calls: "
        + qp.PerformanceInfo.ConstraintsCalls.ToString());
        System.Diagnostics.Debug.WriteLine(
"Actual number of iterations: "
        
+ qp.PerformanceInfo.Iterations.ToString());
        System.Diagnostics.Debug.WriteLine(
"== Solution ==");
        Sol := QP.Solution;
        
For i := 0 To Sol.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(i.ToString() + 
": " + Sol[i].ToString());
        
End For;
        System.Diagnostics.Debug.WriteLine(
"== General constraints: ==");
        d := 
0;
        BoundL := Bound.LagrangeMultiplier;
        
For i := 0 To N - 1 Do //
            d := Sol[i] As double;
            System.Diagnostics.Debug.WriteLine(i.ToString() + 
": ");
            System.Diagnostics.Debug.WriteLine(Lb[i].ToString() + 
"<="
            + d.ToString() + "<= " + Ub[i].ToString());
            System.Diagnostics.Debug.WriteLine(
"Lagrange multiplier: " + BoundL[i].ToString());
            System.Diagnostics.Debug.WriteLine(
"  ");
        
End For;
        System.Diagnostics.Debug.WriteLine(
"   ");
        System.Diagnostics.Debug.WriteLine(
"== Linear constraints ==");
        LinCons := QP.LinearConstraints;
        
For i := 0 To LinCons.Count - 1 Do
            LCon1 := LinCons.Item[i];
            System.Diagnostics.Debug.WriteLine(i.ToString() + 
": "
            + LCon1.BoundaryLower.ToString() + " <= " + LCon1.Result.ToString() +
            
" <= " + LCon1.BoundaryUpper.ToString());
            System.Diagnostics.Debug.WriteLine(
"Lagrange multiplier: " + LCon1.LagrangeMultiplier.ToString());
            System.Diagnostics.Debug.WriteLine(
"  ");
        
End For;
    
End If;
    
    System.Diagnostics.Debug.WriteLine(
"== Initial approximation ==");
    PerformancePoint := QP.PerformanceInfo.InitFeasiblePoint;
    
For i := 0 To PerformancePoint.Length - 1 Do
        System.Diagnostics.Debug.WriteLine(i.ToString() + 
": " + PerformancePoint[i].ToString());
    
End For;
End Sub;     

 
 
 

After executing the example the console window displays:

See also:

ISmQuadraticProgramming