Initializing help system before first use

Retrieving data from a Mosel model


Type: Programming
Rating: 3 (intermediate)
Description: ExSet.vb: Using sets in Mosel (requires burglari.bim)
  • retrieve a set by its model name
  • get the set size
  • get first and last set element
  • get the name or index of a set element
ExAs.vb: Using arrays with index sets (requires trans.bim)
  • get indexing sets of an array
  • get array type
  • enumerate array entries in usual and transposed order
  • enumerate true array entries
ExProb.vb: Accessing problems and solution information with Mosel (requires blend2.bim)
  • export problem to a file (MPS or LP format)
  • get problem status
  • get objective function value
  • get primal/dual solution values, and constraint activity
Note that these examples require the provided mos files to be pre-compiled.
These .vb files can be run from the VB.NET project Mosel-VB.NET.vbproj (required auxiliary files: AssemblyInfo.vb, frmMain.vb, frmMain.resx, OptimizerLog.vb).
File(s): ExSet.vb, ExAs.vb, ExProb.vb
Data file(s): burglari.mos, trans.mos, blend2.mos


ExSet.vb
Imports System.IO
Imports Mosel

' Example of accessing sets in Mosel
Module ExSet

    Public Sub RunExSet(ByVal Log As TextWriter)
        Dim mosel As XPRM
        Dim model As XPRMModel
        Dim mySet As XPRMSet
        Dim first, last, i As Integer

        ' Initialise Mosel
        mosel = XPRM.Init
        ' Load a BIM file
        model = mosel.LoadModel("Models/burglari.bim")
        ' And run it
        model.Run()

        ' Get the model object named 'ITEMS'
        ' (it must be a set)
        mySet = model.FindIdentifier("ITEMS")

        If (Not mySet.IsEmpty) Then
            ' Items in a set are indexed by numbers
            ' So get the first and last indexes
            first = mySet.FirstIndex
            last = mySet.LastIndex
            Log.WriteLine("Elements of set ITEMS:")
            For i = first To last
                Log.Write(" {0}, ", mySet.GetAsString(i))
            Next
            Log.WriteLine()

            ' We've written this out explicitly to demonstrate set access, but the
            ' set actually knows how to output itself.  Uncomment the following line
            ' to see this in action
            ' Log.WriteLine(mySet.ToString)

            If (mySet.GetIndex("CD player") < 0) Then
                Log.WriteLine("'CD player' is not contained in 'ITEMS'")
            End If

        End If
    End Sub

End Module

ExAs.vb
Imports System.IO
Imports Mosel

' Example of using arrays with index sets; different ways of enumerating arrays

Module ExAs
    Public Sub RunExAs(ByVal Log As TextWriter)
        Dim mosel As XPRM
        Dim model As XPRMModel
        Dim varr As XPRMArray
        Dim sets() As XPRMSet
        Dim vindex() As XPRMValue
        Dim indices() As Integer
        Dim dimensions As Integer
        Dim i As Integer

        ' Initialise Mosel
        mosel = XPRM.Init
        ' Load a BIM file
        model = mosel.LoadModel("Models/trans.bim")
        ' Run the model
        model.Run()

        ' Get the model object named 'x'
        ' It must be an array
        varr = model.FindIdentifier("x")
        ' Get the number of dimensions of the array
        dimensions = varr.Dim
        ' Get the indexing sets
        sets = varr.IndexSets

        ' We could use varr.ToString to obtain a summary of the array contents,
        ' but instead we'll demonstrate how to interate over the array's content
        ' directly
        Log.WriteLine("1. Logic entries:")
        ' Get the first entry of varr
        For Each indices In varr.Indices
            Log.Write("x(")
            ' Get the values for this index
            vindex = varr.DereferenceIndex(indices)
            ' Now, output them.  Note that we could call the utility method
            ' varr.IndexToString(indices) instead of doing all this, but again
            ' this wouldn't be such a useful demonstration
            If (dimensions > 1) Then
                For i = 0 To dimensions - 2
                    Log.Write(vindex(i).AsString & ",")
                Next
            End If
            Log.Write(vindex(dimensions - 1).AsString & "), ")
        Next
        Log.WriteLine()

        ' Now enumerate over the true entries - in a dense array this would
        ' be no different from the previous demonstration, so only do it for
        ' a dynamic array
        If (varr.IsDynamic) Then
            Log.WriteLine("2. True entries:")
            For Each indices In varr.TEIndices
                ' Functionally the same as above, but this time we'll demonstrate
                ' using IndexToStringrasExAs
                Log.Write("x" & varr.IndexToString(indices) & ", ")
            Next
        End If
        Log.WriteLine()

        model.Reset()
    End Sub

End Module

ExProb.vb
Imports System.IO
Imports Mosel

' Example of accessing problems and solution information

Module ExProb
    Public Sub RunExProb(ByVal Log As TextWriter)
        Dim mosel As XPRM
        Dim model As XPRMModel
        Dim varr, darr As XPRMArray
        Dim lgrade As XPRMLinCtr

        ' Initialise Mosel
        mosel = XPRM.Init
        ' Load a BIM file
        model = mosel.LoadModel("Models/blend2.bim")
        ' Run the model (it includes optimization)
        model.Run()

        ' Export the problem to a file in LP format (maximization)
        model.ExportProblem("p", "blend")

        ' Test whether optimal is found
        If (model.ProblemStatus = XPRMProblemStatus.PB_OPTIMAL) Then
            Log.WriteLine("Solution is optimal.")
        End If

        ' Print out the objective function value
        Log.WriteLine("Objective value: {0}", model.ObjectiveValue)

        ' Get the model objects 'x' and 'COST' (both arrays)
        varr = model.FindIdentifier("x")
        darr = model.FindIdentifier("COST")

        ' For each entry in array var, display solution value and corresponding
        ' cost
        Dim indices() As Integer
        For Each indices In varr.Indices
            Log.WriteLine( _
                "x{0}={1} (COST: {2})", _
                varr.IndexToString(indices), _
                varr.Get(indices).AsMPVar.Solution, _
                darr.GetAsReal(indices) _
            )
        Next

        ' Get the model object 'LoGrade'
        ' It must be a reference to a linear constraint
        lgrade = CType(model.FindIdentifier("LoGrade"), XPRMReference).Value.AsLinCtr
        Log.WriteLine( _
            "LoGrade: activity={0}, dual={1}", _
            lgrade.Activity, _
            lgrade.Dual _
        )

        model.Reset()
    End Sub
End Module