PortfolioForm.vb

VBNet Example:


Imports Maximal.OptiMax


Public Class MplPortfolio

   Private _mpl As OptiMax
   Private _model As Model
   Private _solver As Solver
   Private _resultString As String
   Private _riskVariance As Double
   Private _investNames() As String
   Private _investAmounts() As Double
   Private _isSolving As Boolean


   Public Sub New()
      _mpl = Nothing
      _model = Nothing
      _solver = Nothing
      _resultString = ""
      _riskVariance = 0.0
      ReDim _investNames(0)
      ReDim _investAmounts(0)
      _isSolving = False
   End Sub


   Private Function loadModel(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.Add("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 SolveModel(ByVal solverName As String, 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("Portfolio")
      _solver = _mpl.Solvers.Add(solverName)
      If _solver Is Nothing Then
         _resultString = "Solver " & solverName & " was not found."
         Return False
      End If
      _mpl.Options("ModelType").ValueStr = "Quadratic"
      _model.WorkingDirectory = _mpl.ModelDirectory
      Dim result As ResultType = loadModel(_model, targetReturn, monthNames, stockNames, stockPrices)
      If Not result = ResultType.Success Then
         _resultString = _model.Error.ToString()
         Return False
      End If
      result = _model.Solve(_solver)
      If Not result = ResultType.Success Then
         _resultString = "Solver " & _solver.Name & ": " & _model.ResultString & vbCrLf & _model.Solution.ResultString
         Return False
      End If
      _resultString = _model.Solution.ResultString
      getSolutionValues(_model)
      Return True
   End Function


   Public Function ResolveModelForNewTarget(ByVal targetReturn As Double) As Boolean
      If _mpl Is Nothing Then
         _resultString = "Model has not been solved yet."
         Return False
      End If
      If _isSolving Then
         Return True
      End If
      _isSolving = True
      Dim conMeetTarget As Constraint = _model.PlainConstraints("MeetTarget")
      conMeetTarget.RHSValue = targetReturn
      Dim result As ResultType = _model.Solve(_solver)
      If Not result = ResultType.Success Then
         _resultString = "Solver " & _solver.Name & ": " & _model.ResultString & vbCrLf & _model.Solution.ResultString
         _isSolving = False
         Return False
      End If
      _resultString = _model.Solution.ResultString
      getSolutionValues(_model)
      _isSolving = False
      Return True
   End Function



   Private Sub getSolutionValues(ByVal model As Model)
      Dim investVect As VariableVector = model.VariableVectors("Invest")
      investVect.ZeroTol = 0.001
      Dim solNames As List(Of String) = New List(Of String)
      Dim solValues As List(Of Double) = New List(Of Double)
      For Each var As Variable In investVect.NonzeroVariables
         solNames.Add(investVect.Subscripts(1).ValueStr)
         solValues.Add(var.Activity)
      Next var
      _investAmounts = solValues.ToArray()
      _investNames = solNames.ToArray()
      _riskVariance = model.Solution.ObjectValue
   End Sub

   Public ReadOnly Property ResultString() As String
      Get
         Return _resultString
      End Get
   End Property

   Public ReadOnly Property RiskVariance() As Double
      Get
         Return _riskVariance
      End Get
   End Property

   Public ReadOnly Property InvestNames() As String()
      Get
         Return _investNames
      End Get
   End Property

   Public ReadOnly Property InvestAmounts() As Double()
      Get
         Return _investAmounts
      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


        

Back To Top | Maximal Home Page | List of Samples | Previous Page | Next Page