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[]
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]”);
if (kernelInstance.ResultFormat == MathKernel.ResultFormatType.OutputForm)
     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

Post popolari in questo blog

Azure Service Bus Topics

R – regressione lineare semplice

Polly.NET