GA-FuL Architektur
Inhaltsverzeichnis
- Übersicht
- Komponenten-Schichten
- Algebra-Schicht
- Modellierungs-Schicht
- Metaprogrammierungs-Schicht
- System-Utilities-Schicht
- Datenfluss
Übersicht
Die Architektur von GA-FuL folgt einem geschichteten Design, bei dem jede Schicht spezifische Verantwortlichkeiten übernimmt und auf den Funktionalitäten der darunterliegenden Schichten aufbaut. Diese Architektur ermöglicht es Benutzern mit unterschiedlichem Hintergrund, die passende Abstraktionsebene für ihre Bedürfnisse zu wählen.
┌─────────────────────────────────────────────┐
│ Metaprogrammierungs-Schicht │
│ (Code-Generierung & Optimierung) │
├─────────────────────────────────────────────┤
│ Modellierungs-Schicht │
│ (Geometrie, Visualisierung, Kalkül) │
├─────────────────────────────────────────────┤
│ Algebra-Schicht │
│ (GA-Operationen, Skalare, Multivektoren) │
├─────────────────────────────────────────────┤
│ System-Utilities-Schicht │
│ (Datenstrukturen, Text, Code, Web) │
└─────────────────────────────────────────────┘
Komponenten-Schichten
1. Algebra-Schicht
Zweck: Grundlegende GA-Operationen und Datenstrukturen
Hauptkomponenten:
- Skalar-Prozessoren
- Basis-Blades
- Multivektoren
- Lineare Abbildungen
- Transformationen
Details: Siehe Algebra-Schicht
2. Modellierungs-Schicht
Zweck: Geometrische Modellierung und Visualisierung
Hauptkomponenten:
- Geometrie-Subsystem
- Visualisierungs-Subsystem
- Kalkül-Subsystem (in Entwicklung)
Details: Siehe Modellierungs-Schicht
3. Metaprogrammierungs-Schicht
Zweck: Code-Generierung und Optimierung
Hauptkomponenten:
- Meta-Kontext
- Expression Trees
- Code-Optimierer
- Code-Composer
Details: Siehe Metaprogrammierungs-Schicht
4. System-Utilities-Schicht
Zweck: Grundlegende Dienste für alle anderen Schichten
Hauptkomponenten:
- Datenstrukturen
- Text-Utilities
- Code-Utilities
- Web-Grafik-Utilities
Details: Siehe System-Utilities-Schicht
Algebra-Schicht
Die Algebra-Schicht ist die Grundlage von GA-FuL und erfüllt die Kern-Design-Intentionen CDI-1 und CDI-2.
Skalar-Repräsentation
IScalarProcessor<T>
├── INumericScalarProcessor<T>
│ ├── ScalarProcessorOfFloat32
│ ├── ScalarProcessorOfFloat64
│ ├── ScalarProcessorOfDecimal
│ ├── ScalarProcessorOfRational
│ └── ScalarProcessorOfComplex
└── ISymbolicScalarProcessor<T>
├── MathematicaScalarProcessor
└── [Zukünftige CAS-Integrationen]
Wichtige Klassen:
IScalarProcessor<T>
Generische Schnittstelle für Skalar-Operationen:
- Arithmetik (Addition, Subtraktion, Multiplikation, Division)
- Transzendentale Funktionen (Trigonometrie, Exponential, Logarithmus)
- Vergleichsoperationen
Scalar<T>
Thin-Wrapper-Klasse für einfachere API:
// Ohne Wrapper (kompliziert):
w = scalarProcessor.Add(x, scalarProcessor.Times(y, z));
// Mit Wrapper (einfach):
w = x + y * z;
Basis-Blades
Repräsentation:
Basis-Blades $e_{i_1, i_2, \ldots, i_k}$ werden intern durch eine sortierte Menge von Indizes dargestellt.
IIndexSet
├── EmptyIndexSet (leere Menge)
├── SingleIndexSet (ein Element)
├── UInt64IndexSet (für Dimensionen < 64)
├── DenseIndexSet (beliebige Größe, Array-basiert)
└── SparseIndexSet (beliebige Größe, HashSet-basiert)
Wichtige Klassen:
XGaBasisBlade
Thin-Wrapper um IIndexSet mit Methoden für:
- Geometrisches Produkt
- Äußeres Produkt
- Inneres Produkt
- Reverse-Operation
- Weitere bilineare Produkte
XGaSignedBasisBlade
Erweitert XGaBasisBlade um ein Vorzeichen (±1 oder 0)
XGaMetric
Verarbeitet Basis-Blades mit spezifischer Metrik-Signatur $(p, q, r)$:
- $p$: Anzahl Basisvektoren mit $e_i^2 = +1$
- $q$: Anzahl Basisvektoren mit $e_i^2 = -1$
- $r$: Anzahl Basisvektoren mit $e_i^2 = 0$
Multivektoren
Datenstruktur:
Multivektor
└── IReadOnlyDictionary<int, XGaKVector<T>>
└── Grade k → k-Vektor
└── IReadOnlyDictionary<IIndexSet, T>
└── Basis-Blade → Skalar
Vorteile dieser Struktur:
- Hochgradig sparse Repräsentation
- Effiziente Speichernutzung
- Flexible Dimensionalität
Wichtige Klassen:
XGaMultivector<T>
Generischer Multivektor mit beliebigem Skalartyp T
XGaKVector<T>
Repräsentiert einen k-Vektor (alle Komponenten haben denselben Grad)
XGaProcessor<T>
Hauptprozessor für Multivektor-Operationen:
- Algebraische Operationen
- Geometrische Produkte
- Grades-Extraktion
- Normalisierung
XGaMultivectorComposer<T>
Composer-Klasse für das Erstellen von Multivektoren (DOP-Prinzip 3)
Transformationen
GA-FuL bietet Klassen für gängige GA-Transformationen:
| Transformation | Klasse | Beschreibung |
|---|---|---|
| Outermorphism | XGaOutermorphism<T> |
Allgemeine lineare Transformation |
| Versor | XGaVersor<T> |
Orthogonale Operatoren |
| Rotor | XGaRotor<T> |
Rotationen |
| Reflektor | XGaReflector<T> |
Spiegelungen |
| Projektor | XGaProjector<T> |
Projektionen |
Optimierte Float64-Implementierung
Für Performance-kritische Anwendungen:
RGaFloat64Multivector
- Optimiert für 64-Bit-Gleitkommazahlen
- Unterstützt bis zu 64 Dimensionen
- Verwendet Lookup-Tabellen für Dimensionen ≤ 12
- Schnellere Operationen als generische Version
Modellierungs-Schicht
Die Modellierungs-Schicht erfüllt CDI-5 und bietet spezialisierte Abstraktionen für verschiedene Anwendungsbereiche.
Geometrie-Subsystem
Unterstützte GA-Typen:
1. Directional GA (Vektor-Algebra)
Standard-Vektor-Algebra mit äußerem Produkt
2. Conformal GA (CGA)
Modellierung von 3D-Geometrie in 5D-CGA-Raum
Klassen:
XGaConformalSpace<T>: Basis-KlasseXGaConformalSpace4D<T>: 4D-CGA (für 2D-Geometrie)XGaConformalSpace5D<T>: 5D-CGA (für 3D-Geometrie)
Funktionalitäten:
- Kodierung geometrischer Objekte (Punkte, Linien, Ebenen, Kreise, Sphären)
- Dekodierung von CGA-Blades
- Geometrische Operationen (Schnitte, Projektionen, Spiegelungen)
- Transformationen (Rotation, Translation, Inversion)
Beispiel:
var cga = CGaFloat64GeometricSpace5D.Instance;
// Kodiere einen Punkt
var point = cga.Encode.IpnsRound.Point(x, y, z);
// Kodiere eine Sphäre
var sphere = cga.Encode.IpnsRound.RealSphere(radius, centerX, centerY, centerZ);
// Schneide zwei Objekte
var intersection = sphere.Op(plane);
3. Projective GA (PGA)
Projektive Geometrie-Modellierung
Besonderheit in GA-FuL: CGA und PGA sind innerhalb desselben algebraischen Raums implementiert (basierend auf dem DPGA-Konzept), was es ermöglicht, beide Repräsentationen frei zu mischen.
Visualisierungs-Subsystem
Unterstützte Backends:
Babylon.js
- JavaScript-Code-Generierung für 3D-Visualisierung
- Unterstützung für statische und animierte Objekte
- Interaktive Szenen im Browser
Selenium WebDriver
- Browser-Automatisierung für Video-Erstellung
- Kombiniert einzelne Frames zu Videos
Beispiele:
Im Repository unter GeometricAlgebraFulcrumLib.Visualizations
Kalkül-Subsystem
Status: In Entwicklung
Geplante Funktionalitäten:
- Geometrischer Kalkül auf Multivektoren
- Ableitungen
- Integrale
- Differentialformen
Metaprogrammierungs-Schicht
Die Metaprogrammierungs-Schicht erfüllt CDI-3 und ermöglicht automatische Code-Generierung.
Workflow
1. MCO initialisieren
↓
2. Input-Parameter definieren
↓
3. GA-Operationen beschreiben
↓
4. Output-Variablen auswählen
↓
5. Variablennamen setzen
↓
6. Code optimieren
↓
7. CCO initialisieren
↓
8. Finalen Code generieren
Meta-Kontext
MetaContext: Hauptklasse für Metaprogrammierung
Funktionalitäten:
- Verwaltung von Meta-Expressions
- Automatische Konvertierung von GA-Operationen zu Skalar-Operationen
- Optimierungen
Meta-Expression-Hierarchie:
IMetaExpression
├── IMetaExpressionAtomic
│ ├── MetaExpressionNumber (Konstante)
│ └── MetaExpressionVariable (Parameter)
└── IMetaExpressionComposite
├── MetaExpressionNegative
├── MetaExpressionAdd
├── MetaExpressionSubtract
├── MetaExpressionTimes
├── MetaExpressionDivide
├── MetaExpressionPower
└── MetaExpressionFunction (sin, cos, exp, etc.)
Optimierungen
Der MCO führt folgende Optimierungen durch:
- Konstanten-Propagierung
- Berechnet konstante Ausdrücke zur Kompilierzeit
- Common Subexpression Elimination (CSE)
- Identifiziert wiederholte Teilausdrücke
- Extrahiert sie in Zwischenvariablen
- Symbolische Vereinfachung
- Optional: Verwendung externer CAS (z.B. Mathematica)
- Vereinfacht komplexe Ausdrücke
- Variable Pruning
- Entfernt ungenutzte Zwischenvariablen
- Entfernt redundante Berechnungen
- Reduktion der Berechnungsschritte
- Optional: Genetische Programmierung
- Evolutionsstrategie (4+1)
Code-Composer
CodeComposer: Konvertiert Meta-Expressions in Zielsprachen-Code
Unterstützte Sprachen:
- C/C++
- C#
- Java
- JavaScript
- Python
- MATLAB
Template-basierte Code-Generierung:
- Einzelne Code-Dateien
- Multi-File-Projekte
- Vollständige Bibliotheken mit Ordnerstruktur
Beispiel-Workflow:
// 1. MCO erstellen
var context = new MetaContext();
var scalarProcessor = context.ScalarProcessor;
// 2. Prozessor für Metaprogrammierung erstellen
var processor = XGaProcessor<IMetaExpression>.CreateEuclidean(scalarProcessor);
// 3. Input-Parameter
var x = context.CreateParameter("x");
var y = context.CreateParameter("y");
// 4. GA-Operationen (composer pattern)
var multivector1 = processor.CreateComposer()
.SetVectorTerm(0, x)
.SetVectorTerm(1, y)
.SetVectorTerm(2, 0)
.GetMultivector();
var multivector2 = processor.CreateComposer()
.SetVectorTerm(0, 1)
.SetVectorTerm(1, 1)
.SetVectorTerm(2, 1)
.GetMultivector();
var result = multivector1.Gp(multivector2);
// 5. Output definieren
context.SetOutput("result", result);
// 6. Optimieren
context.Optimize();
// 7. Code generieren
var codeComposer = new CSharpCodeComposer();
var code = codeComposer.Generate(context);
System-Utilities-Schicht
Die Utilities-Schicht bietet grundlegende Dienste für alle anderen Schichten.
Datenstrukturen-Subsystem
Wichtige Klassen:
IReadOnlyDictionary<TKey, TValue> Implementierungen
EmptyDictionary<TKey, TValue>: Leeres DictionarySingleItemDictionary<TKey, TValue>: Ein ElementDictionary<TKey, TValue>: Standard-Dictionary
Verwendung: Effiziente Speicherung von sparse Daten (Multivektoren, k-Vektoren)
Text-Utilities-Subsystem
Funktionalitäten:
- Formatierte Text-Generierung
- LaTeX-Code-Composition
- Parametrische Text-Templates
- Hierarchische Ordner/Datei-Erstellung
Wichtige Klassen:
LinearTextComposer: Lineare Text-ZusammenstellungParametricTextComposer: Template-basierte Text-GenerierungLaTeXComposer: LaTeX-Dokument-Erstellung
Code-Utilities-Subsystem
Funktionalitäten:
- Sprachunabhängige Abstract Syntax Trees (ASTs)
- Code-Generierung aus ASTs
- Code-Formatierung
Verwendung: Unterstützt die Metaprogrammierungs-Schicht
Web-Grafik-Utilities-Subsystem
Funktionalitäten:
- Web-basierter Grafik-Code-Generierung
- Unterstützung für Babylon.js
- SVG-Generierung
- HTML/CSS/JavaScript-Utilities
Verwendung: Unterstützt die Visualisierungs-Subsystem der Modellierungs-Schicht
Datenfluss
Typischer Workflow für numerische Berechnungen
1. Skalar-Prozessor wählen
↓
2. GA-Prozessor erstellen
↓
3. Multivektoren definieren
↓
4. GA-Operationen durchführen
↓
5. Ergebnisse extrahieren
Typischer Workflow für Code-Generierung
1. Symbolischer Skalar-Prozessor wählen
↓
2. Meta-Kontext erstellen
↓
3. Input-Parameter definieren
↓
4. GA-Operationen beschreiben
↓
5. Optimieren
↓
6. Code generieren
Typischer Workflow für Visualisierung
1. Geometrische Objekte modellieren
↓
2. Visualisierungs-Kontext erstellen
↓
3. Rendering-Code generieren
↓
4. In Browser/Framework rendern
Design-Entscheidungen
Warum geschichtete Architektur?
- Separation of Concerns: Jede Schicht hat klare Verantwortlichkeiten
- Wiederverwendbarkeit: Untere Schichten können unabhängig genutzt werden
- Erweiterbarkeit: Neue Funktionen können hinzugefügt werden ohne bestehende zu brechen
- Testbarkeit: Jede Schicht kann isoliert getestet werden
Warum Data-Oriented Programming?
- Reduzierte Komplexität: Trennung von Daten und Verhalten
- Bessere Wartbarkeit: Einfachere Code-Struktur
- Höhere Flexibilität: Generische Datenstrukturen
- Unveränderlichkeit: Thread-Sicherheit und Vorhersagbarkeit
Performance-Überlegungen
Optimierte Implementierungen
| Szenario | Implementierung | Performance |
|---|---|---|
| Kleine Dimensionen (< 12) | Lookup-Tabellen | Sehr schnell |
| Mittlere Dimensionen (< 64) | UInt64-basierte Indices | Schnell |
| Große Dimensionen | Sparse Dictionary | Moderate Performance |
| Float64-spezifisch | RGaFloat64Multivector |
Optimiert |
| High-Performance | Code-Generierung | Maximal |
Erweiterbarkeit
Neue Skalar-Typen hinzufügen
- Implementiere
IScalarProcessor<T>oderINumericScalarProcessor<T> - Registriere den Prozessor
- Verwende ihn mit
XGaProcessor<T>
Neue Geometrien hinzufügen
- Erweitere
XGaConformalSpace<T>oder erstelle neue Basis-Klasse - Implementiere Encoding/Decoding-Methoden
- Füge spezifische Operationen hinzu
Neue Zielsprachen für Code-Generierung
- Erweitere
CodeComposer - Implementiere sprach-spezifische Syntax
- Registriere den Composer
Zusammenfassung
Die GA-FuL-Architektur bietet:
✓ Flexibilität durch generische Skalare und Multivektoren ✓ Effizienz durch optimierte Datenstrukturen ✓ Erweiterbarkeit durch geschichtetes Design ✓ Wartbarkeit durch Data-Oriented Programming ✓ Leistung durch mehrere Optimierungsstufen ✓ Benutzerfreundlichkeit durch verschiedene Abstraktionsebenen