'********************************************************
'* Mosel Library Examples *
'* ====================== *
'* *
'* file ExDrvsCallback.vb *
'* ``````````````````` *
'* Example for the use of the Mosel libraries *
'* (using dotnet: I/O driver for data exchange via *
'* callbacks *
'* *
'* (c) 2011 Fair Isaac Corporation *
'* author: J.Farmer, Y. Colombani, 2011 *
'********************************************************
Imports System
Imports System.IO
Imports Mosel
Module ExDrvsCallback
Private OutputLog As TextWriter
' Define the Mosel source of our model
Private source_of_model As String = _
"model tstcb" & vbCrLf & _
"uses 'mmsystem'" & vbCrLf & _
"parameters" & vbCrLf & _
" ICB_INITFROM=''" & vbCrLf & _
" ICB_INITTO=''" & vbCrLf & _
"end-parameters" & vbCrLf & _
_
"declarations" & vbCrLf & _
" v_i:integer" & vbCrLf & _
" v_r:real" & vbCrLf & _
" v_s:string" & vbCrLf & _
" v_b:boolean" & vbCrLf & _
" v_d:date" & vbCrLf & _
_
" s_i:set of integer" & vbCrLf & _
" l_i:list of integer" & vbCrLf & _
_
" s_d:set of date" & vbCrLf & _
" l_d:list of date" & vbCrLf & _
_
" a_i:array(range) of integer" & vbCrLf & _
" Rx:range" & vbCrLf & _
" a_s:array(Rx) of string" & vbCrLf & _
" a_r:array(Rx) of real" & vbCrLf & _
_
" R=record" & vbCrLf & _
" i:integer" & vbCrLf & _
" s:set of integer" & vbCrLf & _
" end-record" & vbCrLf & _
" r:R" & vbCrLf & _
" a_R:array(range) of R" & vbCrLf & _
"end-declarations" & vbCrLf & _
_
"initialisations from ICB_INITFROM" & vbCrLf & _
" v_i" & vbCrLf & _
" v_r" & vbCrLf & _
" v_s" & vbCrLf & _
" v_b" & vbCrLf & _
" v_d" & vbCrLf & _
_
" s_i" & vbCrLf & _
" l_i" & vbCrLf & _
_
" s_d" & vbCrLf & _
" l_d" & vbCrLf & _
_
" a_i" & vbCrLf & _
" [a_s,a_r] as 'ax'" & vbCrLf & _
_
" r" & vbCrLf & _
" a_R" & vbCrLf & _
"end-initialisations" & vbCrLf & _
_
" writeln('v_i=',v_i)" & vbCrLf & _
" writeln('v_r=',v_r)" & vbCrLf & _
" writeln('v_s=',v_s)" & vbCrLf & _
" writeln('v_b=',v_b)" & vbCrLf & _
" writeln('v_d=',v_d)" & vbCrLf & _
" writeln('s_i=',s_i)" & vbCrLf & _
" writeln('l_i=',l_i)" & vbCrLf & _
" writeln('s_d=',s_d)" & vbCrLf & _
" writeln('l_d=',l_d)" & vbCrLf & _
" writeln('a_i=',a_i)" & vbCrLf & _
" writeln('a_r=',a_r)" & vbCrLf & _
" writeln('a_s=',a_s)" & vbCrLf & _
" writeln('r=',r)" & vbCrLf & _
" writeln('a_R=',a_R)" & vbCrLf & _
_
"initialisations to ICB_INITTO" & vbCrLf & _
" v_i" & vbCrLf & _
" v_r" & vbCrLf & _
" v_s" & vbCrLf & _
" v_b" & vbCrLf & _
" v_d" & vbCrLf & _
_
" s_i" & vbCrLf & _
" l_i" & vbCrLf & _
_
" s_d" & vbCrLf & _
" l_d" & vbCrLf & _
_
" a_i" & vbCrLf & _
_
" r" & vbCrLf & _
" a_R" & vbCrLf & _
"end-initialisations" & vbCrLf & _
"end-model"
' A function to initialize the Mosel data-structures via callback
Private Function initializeFrom(ByVal ictx As XPRMInitializeContext, ByVal label As String, ByVal type As XPRMTyped) As Boolean
Try
Select Case label
Case "v_i" ' v_i:999
ictx.Send(999)
Return True
Case "v_r" ' v_r:999.99
ictx.Send(999.99)
Return True
Case "v_b" ' v_b:false
ictx.Send(False)
Return True
Case "v_s" ' v_s:"tralala"
ictx.Send("tralala")
Return True
Case "v_d" ' v_d:"2012-12-12"
ictx.Send("2012-12-12")
Return True
Case "s_i", "l_i" ' s_d:[10 20 30 ... ]
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 10
ictx.Send(i * 10)
Next
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case "s_d", "l_d" ' s_d:["2001-01-11" "2002-02-21" ... ]
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 10
ictx.Send(String.Format("{0}-{1}-{2}", 2000 + i, i, i + 1))
Next
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case "a_i" ' // a_i:[ (1) 10 (2) 20 ... ]
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 10
ictx.Send(XPRMInitializeControl.OpenIndices)
ictx.Send(i)
ictx.Send(XPRMInitializeControl.CloseIndices)
ictx.Send(i * 10)
Next
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case "ax" ' ax:[ (1) [ "aa1" 1.23 ] (2) [ "aa2" 2.46 ] ... ]
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 10
ictx.Send(XPRMInitializeControl.OpenIndices)
ictx.Send(i)
ictx.Send(XPRMInitializeControl.CloseIndices)
ictx.Send(XPRMInitializeControl.OpenList)
ictx.Send(String.Format("aa{0}", i))
ictx.Send(CType(i * 1.23, Double))
ictx.Send(XPRMInitializeControl.CloseList)
Next
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case "r" ' r:[ 123 [ 10 20 30 ] ]
ictx.Send(XPRMInitializeControl.OpenList)
ictx.Send(123)
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 3
ictx.Send(i * 10)
Next
ictx.Send(XPRMInitializeControl.CloseList)
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case "a_R" ' a_R:[ (1) [10 [10 20 30] ] (1) [20 [20 40 60] ] ... ]
ictx.Send(XPRMInitializeControl.OpenList)
For i As Integer = 1 To 10
ictx.Send(XPRMInitializeControl.OpenIndices)
ictx.Send(i)
ictx.Send(XPRMInitializeControl.CloseIndices)
ictx.Send(XPRMInitializeControl.OpenList)
ictx.Send(i * 10)
ictx.Send(XPRMInitializeControl.OpenList)
For j As Integer = 1 To 3
ictx.Send(j * i * 10)
Next
ictx.Send(XPRMInitializeControl.CloseList)
ictx.Send(XPRMInitializeControl.CloseList)
Next
ictx.Send(XPRMInitializeControl.CloseList)
Return True
Case Else
OutputLog.WriteLine("Label '{0}' not found", label)
Return False
End Select
Catch e As Exception
OutputLog.WriteLine("Label '{0}' could not be initialized - {1}", label, e.Message)
Return False
End Try
End Function
' A method to retrieve data from Mosel
Private Function initializeTo(ByVal label As String, ByVal val As XPRMValue) As Boolean
OutputLog.WriteLine(".NET: {0} = {1}", label, val)
Return True
End Function
' Main function
Public Sub RunExDrvsCallback(ByVal Log As TextWriter)
' Initialize mosel
Dim mosel As XPRM = XPRM.Init
' Set default output stream to stdout
mosel.SetDefaultStream(XPRMStreamType.F_OUTPUT_LINEBUF, Log)
mosel.SetDefaultStream(XPRMStreamType.F_ERROR, Log)
OutputLog = Log
' Compile and load the model
Dim model As XPRMModel = mosel.CompileAndLoad(New StringReader(source_of_model))
' Set the execution parameters and bind the variables
model.SetExecParam("ICB_INITFROM", "dotnet:cbinitfrom")
model.SetExecParam("ICB_INITTO", "dotnet:cbinitto")
model.Bind("cbinitfrom", New XPRMInitializationFrom(AddressOf initializeFrom))
model.Bind("cbinitto", New XPRMInitializationTo(AddressOf initializeTo))
' Run the model
model.Run()
End Sub
End Module
|
Imports System.IO
Imports Mosel
' Example for use of Mosel libraries (using 'dotnetstream' IOdriver for data exchange)
Module ExDrvsRaw
' Defines the Mosel source of our model
Private source_of_model As String = _
"model drivers" & vbCrLf & _
_
"parameters" & vbCrLf & _
" DATA=''" & vbCrLf & _
" SOL=''" & vbCrLf & _
"end-parameters" & vbCrLf & _
_
"declarations" & vbCrLf & _
" S:set of string" & vbCrLf & _
" R:range" & vbCrLf & _
" data:array(S,R) of real" & vbCrLf & _
" sol:array(1..10) of real" & vbCrLf & _
"end-declarations" & vbCrLf & _
_
"initialisations from 'dotnetraw:'" & vbCrLf & _
" data as 'DATA(s,r,v)'" & vbCrLf & _
"end-initialisations" & vbCrLf & _
_
"writeln('set S=',S)" & vbCrLf & _
"writeln('range R=',R)" & vbCrLf & _
"writeln('array data=',data)" & vbCrLf & _
_
"forall(i in 1..10) sol(i):=i^2" & vbCrLf & _
_
"initialisations to 'dotnetraw:noindex'" & vbCrLf & _
" sol as 'SOL'" & vbCrLf & _
"end-initialisations" & vbCrLf & _
_
"end-model"
' Define a structure to store initial values for the array 'data'
Public Class ModelDataElement
Public s As String
Public r As Integer
Public v As Double
Public Sub New(ByVal s As String, ByVal r As Integer, ByVal v As Double)
Me.s = s
Me.r = r
Me.v = v
End Sub
End Class
Public Sub RunExDrvsRaw(ByVal Log As TextWriter)
' Initialize Mosel
Dim moselRT As XPRM = XPRM.Init
' Use a StringReader to compile and load the Mosel model directly from a .NET string
Log.WriteLine("Compiling from memory...")
Dim modelSourceReader As New StringReader(source_of_model)
Dim model As XPRMModel = moselRT.CompileAndLoad(modelSourceReader)
' Send the model's output directly to the log
model.SetDefaultStream(XPRMStreamType.F_OUTPUT_LINEBUF, Log)
' Create an array containing the initialization data
Dim ModelData(3) As ModelDataElement
ModelData(0) = New ModelDataElement("one", 2, 12.5)
ModelData(1) = New ModelDataElement("two", 1, 15)
ModelData(2) = New ModelDataElement("three", 16, 9)
ModelData(3) = New ModelDataElement("hundred", 2, 17)
' Bind this array to the name "DATA"
moselRT.Bind("DATA", ModelData)
' Create an array to receive solution data and bind it to the name 'SOL'
Dim Solution(9) As Double
moselRT.Bind("SOL", Solution)
' Run the model
model.Run()
' Print the solution
Log.WriteLine()
Log.WriteLine()
Log.Write("Solution values: ")
Dim i As Integer
For i = 0 To 9
Log.Write(" {0}", Solution(i))
Next
Log.WriteLine()
Log.WriteLine()
End Sub
End Module
|