Simulationsframework

Das Konzept der GeoStoch-Bibliothek soll auf dieser Seite erläutert werden. Im Besonderen wird ein Überblick über das Simulationsframework gegeben, gefolgt von einer Erläuterung der grundsätzlichen Ideen hinter diesem Framework.

Motivation

Es gibt verschiedene Programme zur Simulation bestimmter räumlicher stochastischer Modelle. Jedoch ist es nicht einfach, diese Modelle zu kombinieren; vielmehr ist dieses im Normalfall mit größerem Aufwand verbunden (z.B. die Simulation einer Voronoi-Tessellation eines Poisson-Hardcore-Punktprozesses). Man sieht leicht ein, dass auf diese Art und Weise Erweiterungen oft große Änderungen am Programmcode verursachen. Des Weiteren hängen viele Implementierungen von der Dimension des simulierten Modells ab. Um also eine Realisierung eines Modells in einer höheren Dimension zu erstellen, sind zumindest Änderungen im Programm nötig, wenn nicht sogar ein komplett neues Programm entwickelt werden muss. Das Simulationsframework der GeoStoch-Bibliothek hilft, diese Probleme zu beseitigen.

Überblick über das Simulationsframework

Das Framework für die Simulation zufälliger geometrischer Modelle besteht aus verschiedenen Teilen, deren Abhängigkeiten in untenstehenden Abbildungen dargestellt sind. Die Basis des Simulationsframeworks ist die Simulation reellwertiger Zufallsvariablen.

Ein Überblick über das Simulationsframework
Ein Überblick über das Simulationsframework
Ein detaillierterer Überblick
Ein detaillierterer Überblick

Wesentliche Grundsätze

  • Interfaces: Alle Modelle sind als Interfaces aufgebaut. Innerhalb der Implementierung werden (soweit möglich) auch nur Interfaces referenziert. Dies trägt dazu bei, die Unabhängigkeit zwischen der Implementierung und konkreten Implementierungen so gut wie möglich zu bewahren. Beispiel: Die Änderung einer Poisson-Voronoi-Tessellation hin zu einer Poisson-Delaunay-Tessellation innerhalb des Programms kann ohne weitere Änderungen erfolgen.  
  • Nutzen des Decorator Patterns: Ein bekanntes Problem bei der Simulation von Modellen ist der Umgang mit der kombinatorischen Komplexität. Beispiel: In einer iterierten Tessellation können die Basistessellation und die Komponententessellation beliebig und unabhängig voneinander gewählt werden. Des Weiteren hängt das Konzept der iterierten Tessellation nicht von den konkreten Tessellation ab. Anstatt also jeweils eine PoissonLinePoissonLineTessellation, eine PoissonLinePoissonVoronoiTessellation, usw. zu implementieren, genügt es, eine einzige IteratedTessellation zu halten, die mit einer beliebigen Basistesselation und einer beliebigen Komponententessellation kombiniert werden kann. Das Konzept der Interfaces ist also auch für diesen Zweck grundlegend. Die Implementierung von IteratedTessellation lässt einfach den Simulationsalgorithmus der Basistessellation eine Realisierung erzeugen, um diese dann anhand des Simulationsalgorithmus der Komponententessellation eine Realisierung in jeder Zelle der Basistessellation erzeugen zu lassen. Offensichtlich ist dies unabhängig von der Arten der Tessellation möglich. Darüberhinaus können verschiedene IteratedTessellation-Objekte verschachtelt werden, um tiefer iterierte Tessellationen zu erzeugen.
  • Namenskonventionen: Um das Framework leichter benutzbar zu machen, besitzt jedes Interface eines Modells eine Methode realise(), die eine Realisierung des Modells erzeugt. Klassen, die reellwertige Zufallsvariablen simulieren, verfügen ebenfalls über eine derartige Methode.

Reellwertige Zufallsvariablen

Reellwertige Zufallsvariablen sind für verschiedene Zwecke nötig, z.B. sind viele Implementierungen von Simulationen stochastisch-geometrischer Modelle auf das Erzeugen reellwertiger Zufallsvariablen angewiesen. Eine konkrete reellwertige Zufallsvariable implementiert das Interface RandomVariable. Mithilfe der Methode realise() erhält man eine neue Realisierung der Zufallsvariable. Die Methoden getInfimum() und getSupremum() geben die unteren bzw. oberen Schranken des Wertebereichs der Zufallsvariablen zurück. Da eine Implementierung einer deterministischen Zufallsvariablen durch die Klasse Deterministic zur Verfügung gestellt wird, können sich reellwertige Zufallsvariablen auch wie double-Variablen verhalten. Dies ergibt ein Maximum an Flexibilität.

Die Implementierungen der konkreten Klassen für reellwertige Zufallsvariablen basieren auf der Java-Klasse java.util.Random. Um von dieser Klasse und ihrem Generator für Pseudo-Zufallszahlen unabhängig zu sein, und um den Gebrauch anderer Pseudo-Zufallszahlengeneratoren zu ermöglichen, wurde die (eigene) Unterklasse Random der erwähnten Klasse eingeführt. Diese Klasse stellt eine Methode zur Verfügung, um einen eigenen Pseudo-Zufallszahlengenerator (vom Typ Generator) zu setzen. Der Generator StreamGenerator, der dieses Interface zur Verfügung stellt, liest die Zufallszahlen aus einem Stream. Für den Fall, dass ein anderer Generator verwendet werden soll oder sich der Pseudo-Zufallszahlengenerator von Java als schlecht erweisen sollte, kann er also leicht ersetzt werden. Aus diesem Grund sollten die Klassen Random und java.util.Random nur für die Implementierung der Klassen Uniform und Gaussian benutzt werden. Die Implementierung aller anderen Klassen, wie z.B. Discrete, darf nur auf anderen Zufallsvariablen (d.h. Objekte des Typs RandomVariable, z.B. Uniform) basieren.

Elementare Datenstrukturen

Die Interfaces des gesamten Frameworks sind unabhängig von der Dimension. Daher muss die grundlegende Datenstruktur, wie die Hilfsklassen DoubleBox, die einen Hyperquader repräsentiert, ConvexPolytope, die ein konvexes Polytop darstellt, sowie die Klasse RandomSet, für beliebige Dimensionen implementiert werden, da sie in den Interfaces verwendet werden. Darüberhinaus ist das Ergebnis der Simulation eines Modells ein Objekt der Klasse RandomSet, das von einer DoubleBox umgeben ist und Objekte vom Typ RandomSetElement enthält. Bei diesen Elementen handelt es sich um deterministische geometrische Objekte, wie Punkte (Klasse Point), Linien (Klasse Line) usw. Ein RandomSet ist selbst ein RandomSetElement, so dass z.B. iterierte Tessellationen als Bäume repräsentiert werden können, wobei jede Ebene die Zellen eines Iterationslevels enthält. Die Methoden von RandomSet sind einfache Containermethoden.

Wohlgemerkt gibt es Klassen, die elementare geometrische Objekte, wie z.B. Linien, Liniensegmente, konvexe Polygone, usw., repräsentieren sowie Algorithmen z.B. für die Vereinigung und den Schnitt solcher Objekte zur  Verfügung stellen.

Zusammenfassung

Das Simulationsframework, ein Kernstück der GeoStoch-Bibliothek, ist ein hochentwickeltes Werkzeug für die Simulation räumlicher stochastischer Modelle, wie zufällige Punktprozesse, zufällige Tessellationen und deren typischen Zellen. Das Framework enthält die nötigen Bausteine, die für die Simulation konkreter Modelle lediglich noch kombiniert werden müssen. Die konsequente Verwendung von Interfaces ermöglicht die Wiederbenutzbarkeit des Codes. Die Anwendung des Decorator Patterns erlaubt Klassen als möglichst allgemeine Kombination anderer Klassen und stellt sicher, dass beliebige Kombinationen möglich sind.

Die GeoStoch-Bibliothek kann leicht an die unterschiedlichen Bedürfnisse in verschiedenen Projekten angepasst werden. Zum Beispiel wird die GeoStoch-Bibliothek in all unseren Projekten (siehe die Projektliste) für Simulation, Schätzung und andere Zwecke benutzt.