ILNumerics
# ILNumerics

ILNumerics ist eine Programmbibliothek, die Funktionen für numerische Berechnungen für die .NET-Plattform bereitstellt, um komplexe mathematische Algorithmen direkt in einer General Purpose Language zu formulieren.

## Überblick

ILNumerics erweitert das .Net-Framework um komplexe Zahlen, ermöglicht das Rechnen mit Skalaren, Vektoren, Matrizen oder beliebig dimensionalen Daten. Diese Arrays bieten alle Möglichkeiten der Manipulationen und Operationen, wie sie im mathematischen Umfeld etabliert sind. Häufig benötigte Algorithmen der linearen Algebra, zum Beispiel lineare Gleichungssysteme, Eigenwerte und -vektoren, sowie FFT-Funktionen sind ebenso implementiert wie Klassen zur graphischen Ausgabe in 2D und 3D. Für lineare Algebra-Routinen sind prozessoroptimierte LAPACK-Bibliotheken des MIT sowie prozessoroptimierte Implementierungen (MKL) eingebunden.

ILNumerics ist selbst eine .NET-Assembly. Algorithmen können als normale .NET-Klassen erstellt und zu Intermediate Language (IL) übersetzt werden. Programme des .NET Frameworks können unter Windows und mit Hilfe des Mono-Projektes auch auf Unix, Linux, BSD-Derivaten, macOS und Solaris 8 ausgeführt werden.

## Performance

Das Design der Bibliothek realisiert ein deterministisches Aufräumen von genutzten Speicher in Verbindung mit einem schnellen Memory-Pool. Dadurch sollen die Nachteile der Speicherverwaltung mittels Garbage-Collector ausgeräumt werden. Diese Maßnahmen führen dazu, dass die numerischen Algorithmen mit derselben Leistung ausgeführt werden wie Algorithmen, welche unter Verwendung von Fortran oder C/C++ erstellt wurden. Der Trend zur Verwendung höherer Programmiersprachen für numerische Berechnungen geht einher mit der Entwicklung der Hardware: Für die optimale Nutzung der Computer-Ressourcen müssen Techniken der Parallelisierung angewendet werden. Höhere Programmiersprachen bieten eine einfachere Möglichkeit der Abstraktion der verschiedenen Hardware-Plattformen (CPU/GPU) und sind somit zunehmend auch interessant für den Bereich des Number-Crunching. Gleichzeitig bieten sie durch den höheren Bedienkomfort einen drastisch verringerten Aufwand bei der Erstellung.

## Besonderheiten

Die Sprache zum Erstellen und Manipulieren der n-dimensionalen Objekte lehnt sich sehr stark an die etablierten Skriptsprachen im wissenschaftlichen Umfeld an. So sind fast alle Funktionen parameterkompatibel zu MATLAB. Der größte Unterschied im Vergleich zu Skriptsprachen besteht in der starken Typsicherheit des Codes.

## Geschichte

ILNumerics begann an der TU Berlin als Sammlung mathematischer Routinen und wurde in wissenschaftlich-industriellen Projekten eingesetzt. Im Jahre 2005 wurde begonnen, die Software als eigenständige Bibliothek mit eigenem Objektdesign auszurichten. 2007 wurde sie dann auf eine Veröffentlichung vorbereitet und zunächst als proprietäre Bibliothek angeboten. Im gleichen Jahr gewann das Projekt den mit 10.000 Euro dotierten BASTA! Innovation Award 2007, der im Rahmen der vom Software & Support Verlag (S&S) veranstalteten Softwareentwickler-Konferenz BASTA! vergeben wurde. Von August 2007 bis November 2011 wurde die Bibliothek als eigenständiges Projekt gepflegt und kostenlos unter der LGPL Version 3 zur Verfügung gestellt. Innerhalb dieser Zeit wurden mehr als 1000 Projekte mit ihrer Hilfe realisiert. Nach sechs Jahren unter der Open-Source-Lizenz wird ILNumerics seit 2011 unter einer proprietären Lizenz vertrieben. Die Zielgruppe bilden akademische und professionelle Entwickler.

## Alternativen

Einige Mathematik-Programme bieten ebenfalls die Möglichkeit, die mit ihnen erstellten Algorithmen in eigenen Programmen zu verwenden. Das prominenteste proprietäre Beispiel ist wohl Matlab der Firma MathWorks mit Compiler für C und Builder für .NET, oder die IMSL von Rogue Wave Software. Andere Projekte, z. B. „Extreme Optimization“, „dnAnalytics“ oder Center Space „NMath“, verfolgen konsequent den Ansatz, nur für die .NET-Plattform zu entwickeln. Während Erstere wesentlich etablierter sind, verwenden sie oft native Bibliotheken, was häufiges Verlassen des verwalteten Codes bei der Ausführung nötig macht. Letztere dagegen können durch die Beschränkung auf verwalteten Code ohne eigene Speicherverwaltung oft nicht die Performance nativer Codes bieten.

