Wolfram NetLink
Wolfram NetLink
Introduzione
La piattaforma su cui sto lavorando da alcuni mesi si
occupa di eseguire calcoli, talvolta piuttosto complessi, per la determinazione
del premio di polizze assicurative. Il linguaggio con cui è stata scritta è C#,
e sebbene si sia rivelato perfetto, per la scrittura dei primi alogoritmi di
calcolo, con l’aumentare della complessità dei prodotti abbiamo sentito il
bisogno di uno strumento “nativamente” matematico.
Per questo motivo abbiamo adottato Wolfram Mathematica,
uno strumento con cui è diventato molto più naturale implementare gli algoritmi
richiesti dalle compagnie assicurative, anche laddove si sia dovuto lavorare
con calcoli di tipo attuariale.
Wolfram Mathematica
Mathematica è un ambiente di calcolo simbolico e numerico multipiattaforma ideato da
Stephen Wolfram; supporta svariati paradigmi di programmazione, tra cui la programmazione
funzionale e la programmazione logica. Questo articolo non vuole occuparsi di spiegare
il linguaggio interno di Mathematica e viene data per scontata una certa familiarità
con il medesimo; dirò solo che i nostri algoritmi vengono scritti all’interno
di package (file con estensione “.m”) che possono essere richiamati
dall’esterno.
Immaginiamo di aver creato un semplice package
(come quello nell’esempio che segue) e di volerlo richiamare da C#. L’idea è
quella di sfruttare i servizi di calcolo dell’engine
di Mathematica per eseguire l’algoritmo contenuto nel package e recuperare il
risultato dell’elaborazione al fine di gestirlo nel nostro programma C#.
Wolfram ci mette a disposizione una libreria, la .NET/LINK che permette di
stabilire la connessione con il kernel di Mathematica
(deve essere installato sulla stessa macchina su cui gira l’applicazione C#). La
libreria .NET/Link sfrutta il protocollo WSTP (Wolfram Symbolic
Transfer Protocol) per mandare dati e comandi al kernel di Mathematica e ricevere il risultato delle
elaborazioni eseguite.
BeginPackage["TEST`"]
QuadratoBin::usage = "MainFunctions[ x] computes a simple function."
Begin["Private`"]
QuadratoBin[ a_, b_] := Module[ {y},
y = (a+b)^2;
y ]
End[]
EndPackage[]
QuadratoBin::usage = "MainFunctions[ x] computes a simple function."
Begin["Private`"]
QuadratoBin[ a_, b_] := Module[ {y},
y = (a+b)^2;
y ]
End[]
EndPackage[]
Si ricorda che
una volta creato il package è necessario salvarlo in una delle cartelle esposte
dalla funzione $Path di Mathematica.
.NET/LINK
Le interfacce IMathLink e
la sua derivata IKernelLink forniscono l’accesso al kernel e si occupano di nascondere (tramite le classi che
le implementano) i dettagli di comunicazione con il medesimo. La prima
interfaccia è ignorante rispetto a quale sia il kernel
dall’altra parte, mentre, la seconda, dà per assodato che sia il kernel di Wolfram. Nel successivo esempio utilizzeremo la
classe MathKernel come
implementazione dell’interfaccia.
La principale dll da referenziare nel progetto si
chiama Wolfram.NETLink.dll e si
trova nella cartella “<Wolfram dir>\SystemFiles\Links\NETLink” sul proprio file system.
È necessario inoltre referenziare anche la libreria ml32i3.dll per il corretto funzionamento dell’applicazione a runtime.
Il codice che segue dimostra quanto sia semplice
richiamare da C# la funzione che abbiamo creato nel package “TEST” nel
precedente paragrafo.
MathKernel kernelInstance = new MathKernel();
kernelInstance.Compute(“<< TEST`”);
kernelInstance.Compute(“QuadratoBin[2, 3]”);
kernelInstance.Compute(“<< TEST`”);
kernelInstance.Compute(“QuadratoBin[2, 3]”);
if (kernelInstance.ResultFormat == MathKernel.ResultFormatType.OutputForm)
Console.WriteLine(KernelInstance.Result);
kernelInstance.Clear();
Console.WriteLine(KernelInstance.Result);
kernelInstance.Clear();
Dopo aver creato un’istanza della classe MathKernel, chiamiamo il metodo “Compute” una prima volta
per caricare il package, ed una seconda volta per eseguire la nostra funzione “QuadratoBin”. Al
termine del calcolo leggiamo la proprietà Result per
accedere al risultato restituito. L’oggetto Result è
di tipo Object ed è necessario seguire un accorgimento per capire il tipo di
dato realmente restituito.
La proprietà ResultFormat indica
il formato dell’output ottenuto ed è possibile confrontarla con i valori
presenti all’interno dell’enum MathKernel.ResultFormatType.
La documentazione riporta uno schema da cui possiamo dedurre che la funzione da
noi chiamata restituirà un object che è in realtà una
string (vedi link http://reference.wolfram.com/language/NETLink/ref/net/Wolfram.NETLink.MathKernel.ResultFormat.html).
All’interno della stringa troveremo il risultato
del calcolo e dovremo implementare l’opportuna logica di conversione.
Commenti
Posta un commento