VB Constrained Least Squares Example

← All NMath Code Examples

 

Imports System

Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Analysis

Namespace CenterSpace.NMath.Analysis.Examples.VisualBasic

  ' <summary>
  ' A .NET example in Visual Basic showing how to use ConstrainedLeastSquares class to
  ' solve the constrained least squares problem
  ' Cx = d, subject to the constraints
  ' Ax &lt b
  ' </summary>
  Public Module ConstrainedLeastSquaresExample

    Sub Main()

      ' Solve, in the least squares sense, Cx = d, subject to Ax <= b 
      ' and -0.1 <= x[i] <= 2.0
      Dim C As New DoubleMatrix("5x4 [0.9501    0.7620    0.6153    0.4057 " &
                                              "0.2311    0.4564    0.7919    0.9354 " &
                                              "0.6068    0.0185    0.9218    0.9169 " &
                                              "0.4859    0.8214    0.7382    0.4102 " &
                                              "0.8912    0.4447    0.1762    0.8936]")

      Dim D As New DoubleVector(0.0578, 0.3528, 0.8131, 0.0098, 0.1388)

      ' Constraint coefficient matrix
      Dim A As New DoubleMatrix("3x4[0.2027    0.2721    0.7467    0.4659 " &
                                             "0.1987    0.1988    0.4450    0.4186 " &
                                             "0.6037    0.0152    0.9318    0.8462]")

      ' Constraints right hand sides.
      Dim B As New DoubleVector(0.5251, 0.2026, 0.6721)

      ' Create the constrained least squares problem for minimizing
      ' || Cx - d||^2 subject to Ax <= b and -0.1 <= x[i] <= 2.0
      ' We first construct the problem object from the matrix C and the
      ' vector d, we then add the constraints.
      Dim Problem = New ConstrainedLeastSquaresProblem(C, D)

      ' Add the inequality constraints Ax <= b using a constraint tolerance
      ' of 0.00001. This allows for small violations of the constraints. 
      ' Specifically the constraints will be considered satisfied for a 
      ' vector x if
      ' Ax <= b + 0.00001
      Dim ConstraintTolerance As Double = 0.00001

      Dim I As Integer
      For I = 0 To A.Rows - 1
        Problem.AddUpperBoundConstraint(A.Row(I), B(I), ConstraintTolerance)
      Next

      ' All variable values for the solution must satisfy the bounds
      ' -0.1 <= x[i] <= 2.0
      Dim LB As New DoubleVector(Problem.NumVariables, -0.1)
      Dim UB As New DoubleVector(Problem.NumVariables, 2.0)
      For I = 0 To Problem.NumVariables - 1
        Problem.AddBounds(I, LB(I), UB(I), 0.00001)
      Next

      ' Create the solver instance.
      Dim Solver As New ConstrainedLeastSquares()

      ' The ConstrainedLeastSquares solver uses a QP (Quadratic Programming) solver
      ' to solve the constrained least squares problem.
      ' The current default QP solver is the NMath active set quadratic programming
      ' solver with default options.
      Dim Success As Boolean = Solver.Solve(Problem)
      Console.WriteLine("Default solver success = " & Success)
      Console.WriteLine("Default solver solution x = " & Solver.X.ToString("0.0000"))
      Console.WriteLine("Default solver residual norm = " & Solver.ResidualNorm.ToString("0.0000"))
      Console.WriteLine("Default solver performed {0} iterations", solver.Iterations)

      ' You can pass in an instance of a quadratic programming solver for the 
      ' constrained least squares class to use. This allows you to set 
      ' option on the QP solver and inspect results of the QP
      ' solver.
      Dim InteriorPointQP As New InteriorPointQPSolver()
      Dim SolverParams As New InteriorPointQPSolverParams()
      SolverParams.MaxIterations = 10000
      SolverParams.PresolveLevel = InteriorPointQPSolverParams.PresolveLevelOption.None
      Solver.Solve(Problem, InteriorPointQP, SolverParams)
      Console.WriteLine()
      Console.WriteLine("Interior point solver success = " & Success)
      Console.WriteLine("Interior point QP result = " & InteriorPointQP.Result)
      Console.WriteLine("Interior point QP solver iteration count = " & Solver.Iterations)
      Console.WriteLine("Interior point solver solution x = " & Solver.X.ToString("0.0000"))
      Console.WriteLine("Interior point solver residual norm = " & Solver.ResidualNorm.ToString("0.0000"))

      ' If you use the active set QP solver you can determine which constraints
      ' are active in the solution by accessing the active set QP solvers 
      ' Lagrange multiplier property. A constraint is active if its corresponding
      ' Lagrange multiplier is nonzero.
      Dim ActiveSetQP As New ActiveSetQPSolver()
      Success = Solver.Solve(Problem, ActiveSetQP)
      Console.WriteLine()
      Console.WriteLine("Active set solver success = " & Success)
      Console.WriteLine("Active set solver solution x = " & Solver.X.ToString("0.0000"))
      Console.WriteLine("Active set solver residual norm = " & Solver.ResidualNorm.ToString("0.0000"))
      '' Print out the active constraints.
      For I = 0 To ActiveSetQP.LagrangeMultiplier.Length - 1
        If (ActiveSetQP.LagrangeMultiplier(I) <> 0.0) Then
          Console.WriteLine("Constraint {0} = {1} is active", I, Problem.Constraints(I).ToString())
        End If
      Next

      Console.WriteLine()
      Console.WriteLine("Press Enter Key")
      Console.Read()

    End Sub
  End Module
End Namespace

← All NMath Code Examples
Top