VBNet Example:
Imports Maximal.OptiMax Public Class MplEFrontier Private _mpl As OptiMax Private _model As Model Private _solver As Solver Private _resultString As String Private _targetReturn As Double Private _riskVariance As Double Private _solCount As Integer Public Sub New() _mpl = Nothing _model = Nothing _solver = Nothing _resultString = "" _targetReturn = 0.0 _riskVariance = 0.0 _solCount = 0 End Sub Private Function loadModelWithData(ByVal model As Model, ByVal targetReturn As Double, ByVal monthNames() As String, _ ByVal stockNames() As String, ByVal stockPrices() As Double) As ResultType Const minInvest As Double = 0.0 Const maxInvest As Double = 1.0 Const minStock As Integer = 5 Const maxStock As Integer = 10 Try Dim idxStock As IndexSet = model.IndexSets.Add("stock", stockNames) model.IndexSets.AddAlias("stock2", idxStock) model.IndexSets.Add("month", monthNames) model.IndexSets.Add("period[month]", "month - (First(month))") model.DataConstants.Add("MinInvest", minInvest) model.DataConstants.Add("MaxInvest", maxInvest) model.DataConstants.Add("MinStocks", minStock) model.DataConstants.Add("MaxStocks", maxStock) model.DataConstants.Add("TargetReturn", targetReturn) model.DataVectors.Add("Price[stock,month]", stockPrices) model.ReadFilePart("Portfolio.mpl", "DATA_RETURN_MARKER") Catch ex As Exception Console.WriteLine(ex.Message) End Try Return model.LastResult End Function Public Function LoadModel(ByVal targetReturn As Double, ByVal monthNames() As String, _ ByVal stockNames() As String, ByVal stockPrices() As Double) As Boolean _mpl = New OptiMax() _model = _mpl.Models.Add("EFrontier") _mpl.Options("ModelStats").Value = 0 _mpl.Options("StatusMessages").Value = 0 _mpl.Options("ModelType").ValueStr = "Quadratic" _model.WorkingDirectory = _mpl.ModelDirectory Dim result As ResultType = loadModelWithData(_model, targetReturn, monthNames, stockNames, stockPrices) If Not result = ResultType.Success Then _resultString = _model.Error.ToString() Return False End If Return True End Function Public Function SolveFirstModel(ByVal solverName As String, ByVal origTarget As Double) As Boolean _solver = _mpl.Solvers.Add(solverName) If _solver.Name = "CPLEX" Then _solver.Options("BarrierIterLogInd").Value = 0 _solver.Options("SimplexIterLogInd").Value = 0 End If Return SolveModel(0, origTarget) End Function Public Function SolveModel(ByVal iter As Integer, ByVal targetReturn As Double) As Boolean Const CPLEX_OPTIMAL As Integer = 1 Const CPLEX_MIPOPTIMAL As Integer = 101 Dim conMeetTarget As Constraint = _model.PlainConstraints("MeetTarget") conMeetTarget.RHSValue = targetReturn Dim result As ResultType = _model.Solve(_solver) If Not result = ResultType.Success Then _resultString = _model.ResultString & vbCrLf & _model.Solution.ResultString Return False End If If (Not _model.Solution.ResultCode = CPLEX_OPTIMAL) And _ (Not _model.Solution.ResultCode = CPLEX_MIPOPTIMAL) Then _resultString = iter.ToString() & ") FINISHED: " & _model.Solution.ResultString Return False End If Dim macroVariance As Macro = _model.Macros("Variance") _riskVariance = macroVariance.Value _solCount = _solCount + 1 _resultString = iter.ToString() & ") " & _ "return = " & targetReturn.ToString() & "%, " & _ "risk = " & _riskVariance.ToString() Return True End Function Public ReadOnly Property ResultString() As String Get Return _resultString End Get End Property Public ReadOnly Property SolutionCount() As Integer Get Return _solCount End Get End Property Public ReadOnly Property RiskVariance() As Double Get Return _riskVariance End Get End Property Public ReadOnly Property TargetReturn() As Double Get Return _targetReturn End Get End Property Public ReadOnly Property DataDir() As String Get If _mpl Is Nothing Then Return GetDataDir() Else Return _mpl.ModelDirectory End If End Get End Property Public Shared Function GetDataDir() As String Dim tempMpl As OptiMax = New OptiMax() Dim dataDir As String = tempMpl.ModelDirectory tempMpl = Nothing Return dataDir End Function End Class