# 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
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
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")