März 2004 - Posts

Math.NET: Arbeit wieder aufgenommen
12 März 04 08:55 | Christoph Rüegg | with no comments

Endlich tut sich wieder etwas bei diesem Projekt. Seit zwei drei Tagen arbeite ich wieder an der neuen Release, jetzt aber mit dem Schwerpunkt auf dem symbolischen Teil, der Math.NET Symbolical Library. Diese Bibliothek wird zusammen mit der auch neuen Math.NET Numerical Library die alte Math.NET Library ablösen.

Durch die sehr zahlreichen und massiven Änderungen an der Architektur des symbolischen Teils habe ich mich entschieden, die Infrastruktur von Grund auf neu zu Strukturieren (wobei zu einem späteren Zeitpunkt alle die alten bestehenden Operatorklassen ohne viel Aufwand in die neue Infrastruktur übernommen werden können).

Einige bisher feste Eckpunkte der neuen symbolischen Bibliothek (teilweise geplant, teilweise bereits umgesetzt):

  • Vorbereitet für die Übertragung auf Generics, sobald Whidbey kommt ... (wird einiges stark vereinfachen) ... in der Zwischenzeit erkauft mit einem leichen typisierungsverlust.
  • Etwas weniger Abstrakt (so sind z.b. Variablen neu fester im Kern eingebaut und es muss nicht mehr für jeden neuen Typen auch noch z.b. einen Zuweisungsoperator geschriebenwerden)
  • Hierarchisches Typensystem (wie schon länger angekündigt) erlaubt z.b. das Definieren von Operatoren auf algebraischen Ringen.
  • Mengen/Sets - u.a. auch für Domain- und Wertebereich von ausdrücken
  • Late Binding für Operatoren, erlaubt auch das Arbeiten mit abstrakten Operatoren, was u.a. Objekte wie Funktionale oder Systeme, die auf Funktionen arbeiten, ermöglicht. Besonders nützlich vielleicht auch in der Vektoranalysis oder linearen Algebra.
  • Bessere interne Darstellung der Ausdrücke, die endlich auch aufwändige algebraische Operationen erlaubt/vereinfacht, wie beispielsweise die Integration und das Lösen von Gleichungen.
  • Komplett neuer, viel robusterer Parser, der viele neue Möglichkeiten mit sich bringt (u.a. auch einen Interpreter für ganze Batches mit üblichen Erweiterungen wie Schleifen und Bedingungen).
  • Hierarchisches Kontextsystem mit Master-, Session- und (rekursive) LocalContext, das zusammen mit dem neuen Parser auch einen Scope bei grösseren Batches/Scripts erlaubt
  • Funktionen können auch direkt in einer Session definiert (bei Bedarf auch überschrieben) werden, auch abstrakte Funktionen sind möglich (ohne Implementation).
  • Keine Unterscheidung mehr zwischen reellen und komplexen Skalaren.
  • Vereinfachung durch Variablen im Alias Mode. Falls beispielsweise a als sin(c)/c definiert ist, dann wird zweiteres in der Ausgabe automatisch mit a ersetzt (per default deaktiviert).

Einige neue Möglichkeiten des Parsers (teilweise geplant, teilweise bereits umgesetzt):

  • A := {C|1,I+1,-I,I} //Definiert eine neue Skalare Menge aufbauend auf der internen Menge C (komplexe Ebene)
  • B := {R:x|2<x<=10,odd(x)} //Definiert die Skalare Menge (aus R) mit den Werten 3,5,7,9
  • D := {C|A,B,{R|-1,-2},-3,-4} //Definiert eine neue Zusammengesetzte Menge
  • sinc := x -> sin(x)/x //Definiert eine neue skalare Funktion mit einem skalaren Prameter.
  • T := f(x) -> int(f(x),x=0..1) //Definiert ein Funktional auf eine skalare Funktion
  • diff(f(g(x)),x) //Wendet die allgemeine Kettenregel auf zwei abstrakte Funktionen an.
  • (2*sin*cos)(x) //Wendet x auf die anonyme Funktion 2*sin(x)*cos(x) an
  • diff(sin)(Pi) //Wendet Pi auf die anonyme Ableitung von sin ab - entsprich cos(Pi), also -1;
  • a(2) := a(0) //Setz den Wert der dritten Komponente eines Vektors auf den Wert der ersten Komponente
Filed under: ,