FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

72
Evaluierung der Algorithmenbibliothek LEDA Marcus Riemer Fachhochschule Wedel University of Applied Sciences Wedel SS 2011

description

Am 27. April 2011 referiert Informatik-Student Marcus Riemer zu seiner Evaluierung der C++-Algorithmenbibliothek LEDA. Der Vortrag startet um 17 Uhr in Hörsaal 5.Die Algorithmenbibliothek LEDA (Library of Efficient Data types and Algorithms) entstand am Max-Planck-Institut für Informatik in Saarbrücken unter der Leitung von Prof. Kurt Mehlhorn. Sie wird seit Jahren kommerziell vertrieben. Der Referent studiert an der FH Wedel Informatik und hat mehrjährige C++-Erfahrung. Er führte eine ausführliche Evaluierung durch und vergleicht die Ergebnisse mit der C++-Standardbibliothek und der Open-Source-Bibliothek Boost.

Transcript of FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Page 1: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Evaluierung der Algorithmenbibliothek LEDA

Marcus Riemer

Fachhochschule WedelUniversity of Applied Sciences Wedel

SS 2011

Page 2: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Vortrag ”Evaluierung von LEDA”

I Fragen gerne sofort stellenI Lieber mehr als wenigerI Bei Verweisen kann grundsatzlich gut gefragt werden

I VorausgesetztI Teil ”Graphentheorie” der Vorlesung ”Diskrete Mathematik”I Grundlegende Kenntnisse der Programmierung

I HilfreichI Kenntnisse der objektorientierten ProgrammierungI Erfahrung mit C++

I Material zum VortragI Diese PrasentationI CodebeispieleI http://stud.fh-wedel.de/~inf8803/Seminar

Page 3: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Ablauf und Ziele

I Ein Uberblick uber LEDAI HistorieI Komponenten

I Vergleich der Graphenfunktionalitat von LEDA und BoostI Unterschiede und Gemeinsamkeiten in der DatenstrukturI Uberblick uber Algorithmen und PerformanceI Kurze, beispielhafte Losung Implementierung eines Netzplans

I Fazit und DiskussionI Grunde fur den Einsatz von LEDAI Mogliche Einsatzgebiete

Page 4: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Gliederung

LEDAUberblickNumerikContainerGeometrieSpeichermanagement

Graphen

Bewertung

Nahere Erlauterungen

Page 5: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

C++ damals

I Zur Zeit der initialen LEDA Entwicklung (um 1990) war derC++ ’Standard’ nur theoretisch portabel

I Entwicklung von C++ begann 1979I Erstmalige ”ernsthafte” Verwendung von C++ innerhalb des

entwickelnden Umfeldes etwa 1983I Veroffentlichung des Buches ”The C++ Programming

Language” 1985I Einfuhrung von Templates in den spaten 80ernI Standarisierungsprozess begann 1987 durch das ANSII→ ISO/IEC 14882:1998 (oder informell: C++ 98)

I Standard Template Library (STL) damals standarisiert in Formeiner Sammlung von Headern

I Art der Implementierung selten festgelegt

I Verschiedene Standardbibliotheken je CompilerI Zudem subtile Unterschiede zwischen Compilern

I bzw. brachiale Unterschiede bei Templates Was sind Templates?

Page 6: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Entstehung von LEDA

I Entstanden als Reaktion auf permanenteRe-Implementierungen von bekannten Algorithmen undDatenstrukturen ...

I ... die zudem nicht immer fehlerfrei waren.I Großer Zeitverlust → Langsamerer Fortschritt

I Vier DesignzieleI Ease of useI ExtensibilityI Correctness 1

I Efficiency

I Heute kommerzieller VertriebI Kostenlose Version ohne Algorithmen, nur DatentypenI Professional Edition und Research Edition

I Mit oder ohne QuellcodeI Kommerzielle Nutzung nur in der Professional Edition

1Siehe: Vortrag ’Certifying Algorithms’, Achenbach, WS2010, FH Wedel

Page 7: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Dokumentation

I LEDA BuchI ISBN-13: 978-0521563291, vergriffenI Auch zum Download, eine Postscript Datei je Kapitel

http://www.mpi-inf.mpg.de/~mehlhorn/LEDAbook.htmlI Keine aktuelle Auflage vorhandenI Weiterhin eine zuverlassige Quelle, gibt den Umfang von LEDA

jedoch nicht vollstandig wieder

I LEDA ManualI http://www.algorithmic-solutions.info/leda_manual/I Klassische API Dokumentation im Stile von Doxygen

I LEDA GuideI http://www.algorithmic-solutions.info/leda_guide/I Uberblick uber API mit hoherem Anteil an BeispielenI Verlinkt auf Manual

Page 8: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Dokumentation

Inoffizielles LEDA Tutorial von Joachim Ziegler

I http://www.leda-tutorial.org/en/unofficial/

I Praktische Einfuhrung aus Anwendersicht

Demos

I Kommen zusammen mit der Bibliothek

I Sehr einfach kompilierbar

I Oft verquickt mit visueller Darstellung

Page 9: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Umfang von LEDA

I NumerikI Real, Complex, RationalI Matrizen & Vektoren

sowie Operationen derlinearen Algebra

I Numerische Analysis furExtremstellen, Integrationund Nullstellen

I ContainerI Auswahl ahnlich der STLI Optimiert fur kleine

ElementeI Grundlage fur viele

Algorithmen

I GraphenI AlgorithmenI Graph Datenstruktur

I GeometrieI AlgorithmenI Spezielle Container

I Verlustfreie KompressionI Algorithmen

I KryptografieI Symmetrische Verfahren

I GUI

I Speichermanager

Page 10: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Zahldatentypen

I Sehr einfache Funktionf (x) = x

I Wird durch normaleFließkomma Datentypenstatisch diskretisiert

I 4 byte float mit 7-8signifikanten Stellen

I Treppeneffekt

I LEDA Typen mit theoretischbeliebig hohen Auflosung

I Spezielle Konstanten furz.B. π oder e

Page 11: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Zahldatentypen

I Implementierung der Zahlenraume N, Q, RI Fließkommadatentyp mit erhohter GenauigkeitI Matrizen und Vektoren als Basis fur geometrische Probleme

Grundlegende Operationen mit Matrizen

integer_matrix matrix (3,3);

integer_matrix result (3,3);

integer d = determinant(M); // Determinante

integer r = rank(M); // Rang

result = transpose(matrix ); // Transponieren

Fruher: Funktionen zum Losen von linearen Gleichungssystemen

I Kein Spezialgebiet und daher mit der kommerziellen Editionaufgegeben → lieber Funktionalitat streichen, alsmoglicherweise suboptimal zu Implementieren

I Im Buch noch Verweise auf diese Funktionen

Page 12: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Numerische Analysis

Grundlegende Operationen

// Function to analyze

double f(double x)

{

return (pow(x, 2) * log(x) - 1);

}

// xmin passed by reference

double ymin , xmin;

ymin = minimize_function(f, xmin);

// Compute root between 0.5 and 2.5

double zero = zero_of_function(f, 0.5, 2.5);

Berechnet Extrem- und Nullstellen

Page 13: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Numerische Analysis

1 2 3 4

5

10

15

20

x

f (x) = x2 ∗ log(x)− 1

Page 14: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Container

I LEDA trennt strikt zwischen Interface und ImplementierungI Interfaces beschreiben ubliche Operationen und geben

LaufzeitgarantienI Werden durch Vererbungen implementiert

I Blick in die Headerfiles: incl/LEDA/core/I impl/ab_tree.hI impl/avl_tree.hI impl/...I growing_array.hI list.hI ...

I Beispielhafte ”Abweichungen”I Dynamisches Array intern ein ab_treeI Baume keine oberste Abstraktionsebene, Implementierung z.B.

auch durch Skiplists denkbar

Page 15: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Sequenzielle Container

Vergleich der Container in STL und LEDA

Container LEDA STL

Array leda::array<T> 1

String leda::string std::string,std::wstring

Dynamic Array 2 std::vector<T>Stack leda::stack<T> std::stack<T>Queue leda::queue<T> std::queue<T>

Priority Queues leda::p_queue<P,T> 3 std::priority_queue<T>Set leda::set<T> std::set<T>List leda::list<T> std::list<T>

Tupel Zwei- bis Viertupel std::pair<K,V>

I LEDA bietet Implementierungen fur gangige sequenzielleContainer der STL

I ... diese sind jedoch keine ”drop-in replacements”1Kommender C++ Standard, siehe auch Boost2Hier im Sinne eines zu C kompatiblen Arrays ohne ’Lucken’ im Speicher3Getrennte Typen fur Prioritat und Objekt

Page 16: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Assoziative Container

STLI std::map<K,V> und

std::multimap<K,V> 1

I Strenge schwacheOrdnungsrelation

I Ublicherweise einBinarbaum

→ Kein unsortierter AssoziativerContainer

LEDAI d_array<K,V>

I Verlangt lineare OrdnungI Momentan ein ab-Baum

I h_array<K,V>

I HashedI UnsortiertI Verlangt Hashfunktion

I map<K,V>

I K muss Zeiger, Handleoder Integer sein

I Entfernen nicht moglichI Unsortiert

1”multi”Container erlauben identische Schlussel

Page 17: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Weitere LEDA Container

Integer Sets

I Mengen fur Ganzzahlen

I Alle ublichen MengenoperationenI Im Gegensatz zu std::bitset<n>

I Großenanderungen zur LaufzeitI Mehr Bits als (sizeof(unsigned long) * 8)

Partitionen

I same_block(p,q), union_blocks(p,q)

I Kein Aquivalenter Container in der STL

Baume

I dynamic_trees und tree_collection

I Unterschied ist der ”Ort” der GewichtungI Kantengewichtung → dynamic_treesI Knotengewichtung → tree_collection

Page 18: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

I Einige Hinweise zum PerformancevergleichI Der Benchmark entstammt den LEDA Demos und wurde nicht

angepasstI Es ist ein purer Performance Benchmark, keine Abbildung eines

konkreten AnwendungsszenariosI Jeder Test wurde mit 5.000.000 Elementen durchgefuhrt

I Eingesetzte HardwareI Intel(R) Core(TM) i5 CPU 750 @ 2.67GHzI 6 GB Arbeitsspeicher

I SoftwarekonfigurationI OpenSuSE 11.3

I g++ (SUSE Linux) 4.5.0

I Windows 7I Microsoft (R) C/C++ Optimizing Compiler Version

15.00.30729.01 for x64 (Visual Studio 2008)

Page 19: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

List<int> LEDA STL LEDA STL

build list 0.040 sec 0.180 sec 0.074 sec 0.243 secpop and push 0.080 sec 0.200 sec 0.085 sec 0.298 secreversing 0.030 sec 0.030 sec 0.021 sec 0.054 seccopy constr 0.050 sec 0.260 sec 0.073 sec 0.377 secassignment 0.040 sec 0.120 sec 0.042 sec 0.255 secclearing 0.000 sec 0.100 sec 0.000 sec 0.110 secsorting 0.560 sec 3.280 sec 0.511 sec 3.671 secsorting again 0.670 sec 2.860 sec 0.688 sec 3.054 secmerging 0.460 sec 0.500 sec 0.458 sec 0.526 secunique 0.490 sec 0.590 sec 0.533 sec 0.753 secunique again 0.000 sec 0.000 sec 0.001 sec 0.001 seciteration 0.000 sec 0.000 sec 0.000 sec 0.001 sec

total 2.420 sec 8.120 sec 2.486 sec 9.343 secohne Sortierung 1.190 sec 1.980 sec 1.287 sec 2.618 sec

Page 20: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

List<float> LEDA STL LEDA STL

build list 0.260 sec 0.150 sec 0.253 sec 0.243 secpop and push 0.290 sec 0.200 sec 0.276 sec 0.290 secreversing 0.230 sec 0.040 sec 0.235 sec 0.058 seccopy constr 0.360 sec 0.250 sec 0.359 sec 0.371 secassignment 0.370 sec 0.120 sec 0.354 sec 0.253 secclearing 0.000 sec 0.090 sec 0.000 sec 0.104 secsorting 0.840 sec 3.310 sec 0.756 sec 3.691 secsorting again 0.700 sec 2.870 sec 0.702 sec 2.963 secmerging 0.680 sec 0.490 sec 0.663 sec 0.518 secunique 0.710 sec 0.570 sec 0.773 sec 0.791 secunique again 0.000 sec 0.000 sec 0.001 sec 0.001 seciteration 0.000 sec 0.000 sec 0.001 sec 0.001 sec

total 4.440 sec 8.090 sec 4.373 sec 9.284 secohne Sortierung 2.900 sec 1.910 sec 2.915 sec 2.630 sec

Page 21: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

List<double> LEDA STL LEDA STL

build list 0.370 sec 0.150 sec 0.362 sec 0.238 secpop and push 0.380 sec 0.210 sec 0.375 sec 0.289 secreversing 0.340 sec 0.040 sec 0.339 sec 0.057 seccopy constr 0.450 sec 0.250 sec 0.442 sec 0.381 secassignment 0.440 sec 0.120 sec 0.453 sec 0.257 secclearing 0.000 sec 0.100 sec 0.000 sec 0.106 secsorting 0.920 sec 3.290 sec 0.892 sec 3.662 secsorting again 0.710 sec 2.850 sec 0.717 sec 2.854 secmerging 0.780 sec 0.500 sec 0.781 sec 0.518 secunique 0.810 sec 0.580 sec 0.885 sec 0.765 secunique again 0.000 sec 0.000 sec 0.002 sec 0.000 seciteration 0.000 sec 0.000 sec 0.000 sec 0.000 sec

total 5.200 sec 8.090 sec 5.248 sec 9.127 secohne Sortierung 3.570 sec 1.950 sec 3.639 sec 2.611 sec

Page 22: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

List<class> LEDA STL LEDA STL

build list 0.060 sec 0.160 sec 0.092 sec 0.255 secpop and push 0.080 sec 0.210 sec 0.105 sec 0.299 secreversing 0.040 sec 0.040 sec 0.034 sec 0.065 seccopy constr 0.080 sec 0.280 sec 0.118 sec 0.408 secassignment 0.050 sec 0.130 sec 0.051 sec 0.270 secclearing 0.020 sec 0.100 sec 0.020 sec 0.153 secsorting 0.810 sec 3.590 sec 0.725 sec 3.993 secsorting again 0.860 sec 3.130 sec 0.824 sec 3.109 secmerging 0.490 sec 0.550 sec 0.477 sec 0.561 secunique 0.510 sec 0.610 sec 0.546 sec 0.900 secunique again 0.010 sec 0.000 sec 0.001 sec 0.000 seciteration 0.000 sec 0.000 sec 0.000 sec 0.000 sec

total 3.010 sec 8.800 sec 2.993 sec 10.013 secohne Sortierung 1.340 sec 2.080 sec 1.444 sec 2.911 sec

Page 23: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

Uberblick, unten ohne Sortierung

LEDA STL LEDA STL

List<int> 2.420 sec 8.120 sec 2.486 sec 9.343 secList<float> 4.440 sec 8.090 sec 4.373 sec 9.284 secList<double> 5.200 sec 8.090 sec 5.248 sec 9.127 secList<class> 3.010 sec 8.800 sec 2.993 sec 10.013 sec

List<int> 1.190 sec 1.980 sec 1.287 sec 2.618 secList<float> 2.900 sec 1.910 sec 2.915 sec 2.630 secList<double> 3.570 sec 1.950 sec 3.639 sec 2.611 secList<class> 1.340 sec 2.080 sec 1.444 sec 2.911 sec

Ergebnis

I Langsame Sortierung beider STL Implementierungen

I List<class> schnell, anders als im LEDA Buch behauptet

Page 24: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performancevergleich

leda::d_array ⇔ std::map mit 5.000.000 Elementen

with integer keys LEDA STL LEDA STL

ordered insertions 0.330 sec 2.430 sec 0.422 sec 1.051 secordered lookups 0.340 sec 1.560 sec 0.325 sec 0.595 secrandom insertions 0.340 sec 1.630 sec 0.328 sec 0.611 secrandom lookups 0.330 sec 1.570 sec 0.325 sec 0.608 sec

total 1.340 sec 7.190 sec 1.400 sec 2.865 sec

with double keys LEDA STL LEDA STL

ordered insertions 0.300 sec 3.830 sec 0.424 sec 1.321 secordered lookups 0.360 sec 1.680 sec 0.396 sec 0.742 secrandom insertions 0.360 sec 1.710 sec 0.390 sec 0.730 secrandom lookups 0.350 sec 1.660 sec 0.386 sec 0.743 sec

total 1.370 sec 8.880 sec 1.596 sec 3.536 sec

Page 25: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Geometrische Probleme mit LEDA

I Alle zweidimensionalenDatentypen implementiertfur double, Q und R

I PunktI Segment

Verbindung zweier Punkte,finite Lange

I StrahlPunkt und Richtung,unbegrenzte Lange

I LinieGerade durch zwei Punkte,finite Lange

I KreisI PolygonI DreieckI Rechteck

I Alle dreidimensionalenDatentypen implementiertfur double und R

I PunktI Segment, Strahl, LinieI EbeneI SphareI Simplex

Page 26: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Geometrische Probleme mit LEDA

Im Zweidimensionalen noch weitere DatentypenI d2_dictionary<K1,K2,I>

I Zweidimensonales DictionaryI Zuordnung von Punkten zu Daten

I POINT_SET fur double, Q und RI Planarer, bidirektionaler Graph in Gestalt einer Delaunay

TriangualationI Bietet alle fur konstante Graphen moglichen OperationenI Konstruktion durch einen Graphen oder eine Liste von Punkten

I POINT_LOCATOR fur double, Q und RI Zur schnellen Suche von Punkten in Delaunay Triangulationen

Page 27: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Geometrische Probleme mit LEDA

Im Zweidimensionalen noch weitere DatentypenI interval_set<I>

I insert(double x, double y, const I& i)I lookup(double x, double y)

I segment_set und rat_segment_set

I Menge von parallelen SegmentenI Schnelle Berechnung von Schnittpunkten

I subdivision<I>

I Planarer Graph in einer zweidimensionalen EbeneI Kanten sind ausschließlich gerade LinienI Schnelles auffinden von Punkten durch einen partiell

persistenten Suchbaum

Page 28: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Geometrische Probleme mit LEDA

Im Zweidimensionalen

I Affine TransformationenI Algorithmen

I Konvexe HulleI Triangulation auf Basis

von GraphenI Minkowski Summe und

DifferenzI Voronoi Diagramme

Im DreidimensionalenI Algorithmen

I Konvexe HulleI Triangulation auf Basis

von GraphenI Voronoi Diagramme

Ausfuhrliche Beschreibung der Implementierung im Buch

Page 29: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Speichermanagement von LEDA

I Implementierung der Operatoren new und delete

I new allokiert nicht bei jedem Aufruf tatsachlich Speicher,sondern bedient sich an einem pre-allokierten Pool

I delete stellt Speicher wieder dem Pool zur VerfugungI Daher weniger Aufrufe der betriebssystemeigenen

Speicherfunktionen

I Nutzung des RAII Prinzips Was ist RAII?

I Vermeidung von Speicherlecks

Bei LEDA als ’Garbage Collection’ bezeichnet, jedoch nicht mitz.B. Java oder C# vergleichbar!

Page 30: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Speichermanagement von LEDA

Benutzerdefinierte Klassen und LEDA Memory Management

class ImportantData

{

private:

double a,b,c;

unsigned int d,e,f;

/*

... More important data ...

*/

public:

/*

... Important functionality ...

*/

// "override" new and delete

LEDA_MEMORY(ImportantData );

}

Page 31: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Gliederung

LEDA

GraphenDatenstrukturAlgorithmenPerformance

Bewertung

Nahere Erlauterungen

Page 32: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Graphen in LEDA und boost

I Die Datenstruktur fur GraphenI GemeinsamkeitenI UnterschiedeI Einfache Beispiele

I High-Level Ubersicht uber Algorithmen

I Wenn wir Zeit haben: Beispielhafte Implementierung eines Netzplans

I Bewertung

Page 33: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Gemeinsamkeiten

I Templateklasse mit beliebigen Typen fur Knoten und KantenI Daher Annotationen fur bestimmte Algorithmen notwendig

I PositionI FarbeI Gewicht

I Parametrisierte Graphen ermoglichen Zugriff auf Knoten undKanten via operator []

I Eigene Indextypen fur Knoten und Kanten

I Mehrere logische SichtenI Schnittstellen um die Daten effizient fur ”bekannte” Aufgaben

bereitzustellenI Algorithmen setzen auf diese Sichten auf

Page 34: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA

I Ein zentraler Datentyp GRAPH

I Intern eine AdjazenzlisteI TypisierbarI Limitiert auf 10.000 Knoten

I Unterscheidung von gerichteten und ungerichteten GraphenI Standardmaßig gerichtet, ungerichtet ist UGRAPHI Konvertierung moglich via Graph::make_undirected() und

Graph::make_directed()

I Fur schnelle, lesende Zugriffe: static_graphI Keine Unterteilung nach Eigenschaften

I Zentrale MethodenI node GRAPH::new_node()

erstellt im Graphen einen KnotenI edge GRAPH::new_edge(node, node)

erstellt im Graphen eine Kante zwischen den gegebenen Knoten

Page 35: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA

Einfacher Graph mit LEDA

graph G;

node v0 = G.new_node ();

node v1 = G.new_node ();

node v2 = G.new_node ();

node v3 = G.new_node ();

edge e0 = G.new_edge(v0 ,v1);

edge e1 = G.new_edge(v0 ,v2);

edge e2 = G.new_edge(v1 ,v2);

edge e3 = G.new_edge(v1 ,v3);

Erzeugt den Graph rechts

Page 36: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA

Typisierter Graph mit LEDA

GRAPH <string ,int > G;

// Creation as before

// vN is a vertex

G[v0] = "Hamburg";

G[v1] = "Pinneberg";

G[v2] = "Wedel";

G[v3] = "Appen";

// eN is a edge

G[e0] = 5;

G[e1] = 6;

G[e2] = 10;

G[e3] = 4;

Erzeugt den Graph rechts

Page 37: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA - Zugriff

I Iteration mit MakrosI Uber Graphen

I forall_nodes, forall_rev_nodesI forall_edges, forall_rev_edges

I Uber KnotenI forall_adj_edgesI forall_out_edges, forall_in_edges,

forall_inout_edges

I Iteration mit IteratorenI TypsicherI Mehr Kontroller uber IterationI Implementierung von STL ahnlichen Iteratoren

Page 38: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA - Zugriff

I ”intelligente” ZugriffsverfahrenI GIT_BFS und GIT_DFSI Topological Sort – GIT_TOPOSORTI Strongly Connected Components – GIT_SCCI Dijkstra – GIT_DIJKSTRA

I Zugriff uber spezielle Container fur Knoten und KantenI node_array, fur statische GraphenI node_mapI node_list, node_slistI node_pq (Priority Queue)I node_partition Beispiel Kruskal

Zugriff nach Erstellung eines beliebigen Graphen

Page 39: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

I Teil des Boost ProjektesI Grundlage fur die ”Technical Reports” des C++

StandarisierungskomiteesI Steht unter der Boost Software License

I Keine Beschrankung fur die Art der NutzungI Kein Copyleft

I Fokus auf Erweiterbarkeit und AnpassbarkeitI Keine vorgeschriebe DatenstrukturI Flexible ”Graph Adaptors”I Einfache Erweiterung durch eigene Visitors

I Intensive Nutzung von Templates / Concepts, potenziellungewohnt

I ”Header Only” Library, kein externes Linken notwendig

Page 40: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

I Eigenschaften vonGraphen und ihreinterne Darstellungzunachst getrennt

I Algorithmenarbeiten nur mitEigenschaften

I Validierungwahrend derKompilierung

Eigenschaften von Graphen bei Boost

Page 41: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

IncidenceGraph

I Schneller Zugriff auf ausgehende Kanten von Knoten

I source(edge, graph), target(edge, graph) undout_edges(vertex, graph) in Θ(1)

AdjacencyGraph

I Schneller Zugriff auf benachbarte Knoten eines Knotens (ohneBerucksichtigung der Kanten)

I adjacent_vertices(vertex, graph ) in Θ(1)

VertexListGraph

I Effiziente Iteration uber Knoten

I vertices(graph) in Θ(1)

EdgeListGraph

I Effiziente Iteration uber Kanten

I source(edge, graph), target(edge, graph) undedges(graph) in Θ(1)

Page 42: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

MutableGraph

I Kann nach Konstruktion verandert werden

I add_edge(source, target, graph),remove_edge(source, target, graph) undremove_edge(edge, graph)

I add_vertex(graph) und remove_vertex(vertex, graph)

PropertyGraph

I Unterstutzt im Prinzip beliebige Annotationen zu Knoten undKanten

→ Implementierungen von Graphen mussen nur die als relevanterachteten Interfaces bereitstellen

Page 43: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

compressed_sparse_row_graph

adjacency_matrix

adjacency_list

AdjacencyGraph

AdjacencyMatrix

IncidenceGraph

→ BidirectionalGraph

VertexAndEdgeListGraph

→ EdgeListGraph

→ VertexListGraph

MutableGraph

PropertyGraph

MutablePropertyGraph

CopyConstructable

Vergleich der Boost Graphenimplementierungen

Page 44: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

Untypisierter Graph mit boost

// C r e a t i n g t h e a p p r o p r i a t e t y p e stypedef b o o s t : : a d j a c e n c y l i s t <b o o s t : : vecS , b o o s t : : vecS ,

b o o s t : : d i r e c t e d S > Graph ;typedef b o o s t : : g r a p h t r a i t s <Graph > : : v e r t e x d e s c r i p t o r V e r t e x ;typedef b o o s t : : g r a p h t r a i t s <Graph > : : e d g e d e s c r i p t o r Edge ;// I n s t a n t i n a t eGraph G ;// Adding V e r t i c e sV e r t e x v0 = b o o s t : : a d d v e r t e x (G ) ;V e r t e x v1 = b o o s t : : a d d v e r t e x (G ) ;V e r t e x v2 = b o o s t : : a d d v e r t e x (G ) ;V e r t e x v3 = b o o s t : : a d d v e r t e x (G ) ;// Adding EdgesEdge e1 , e2 , e3 , e4 ;bool newVertex ; // t r u e i f new edge was c r e a t e d , unused h e r e// b o o s t : : t i e ( ) as a c o n v e n i e n c e f u n c t i o n to a s s i g n t u p l e sb o o s t : : t i e ( e1 , newVertex ) = b o o s t : : add edge ( v0 , v1 , G ) ;b o o s t : : t i e ( e2 , newVertex ) = b o o s t : : add edge ( v0 , v2 , G ) ;b o o s t : : t i e ( e3 , newVertex ) = b o o s t : : add edge ( v1 , v2 , G ) ;b o o s t : : t i e ( e4 , newVertex ) = b o o s t : : add edge ( v1 , v3 , G ) ;

Page 45: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

Typisierter Graph mit boost

// C r e a t i n g t h e a p p r o p r i a t e t y p e stypedef b o o s t : : a d j a c e n c y l i s t <b o o s t : : vecS , b o o s t : : vecS ,

b o o s t : : d i r e c t e d S ,s t d : : s t r i n g , int> Graph ;

typedef b o o s t : : g r a p h t r a i t s <Graph > : : v e r t e x d e s c r i p t o r V e r t e x ;typedef b o o s t : : g r a p h t r a i t s <Graph > : : e d g e d e s c r i p t o r Edge ;// I n s t a n t i n a t eGraph G ;// C r e a t i o n as b e f o r e// vN i s a v e r t e xG [ v0 ] = "Hamburg" ;G [ v1 ] = "Pinneberg" ;G [ v2 ] = "Wedel" ;G [ v3 ] = "Appen" ;

// eN i s a edgeG [ e0 ] = 5 ;G [ e1 ] = 6 ;G [ e2 ] = 1 0 ;G [ e3 ] = 4 ;

Page 46: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

Boost Graph AdaptorsI Legen eine weitere logische Sicht uber einen bestehenden

GraphenI subgraph erlaubt die logische Unterteilung eines GraphenI reverse_graph vertauscht eingehende und ausgehende Kanten

bei einem bidirektionalen GraphenI filtered_graph erhalt ein Pradikat und erlaubt nur Zugriff

auf Knoten oder Kanten die dieses Pradikat erfullen

I ”Wrappen” andere Datenstrukturen in ein Boost InterfaceI edge_list modeliert einen EdgeListGraph fur Arrays aus

PaarenI Undokumentiert: std::vector als VertexListGraphI Undokumentiert: Matrix als GraphI Undokumentiert: LEDA Graph (erlaubt die Verwendung von

boost Algorithmen auf einem Leda Graphen)I Undokumentiert: Stanford GraphBase

Page 47: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Boost Graph Library

I Visitors iterieren nach einem bestimmten Schema uberGraphen und nutzen Callbacks (genauer Funktoren)

I Event VisitorI DFS und BFS VisitorsI Dijkstra, A* und Bellman Ford VisitorsI Planar Face VisitorI TSP Tour Visitor

Page 48: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Uberblick Algorithmen

Diese Ubersichten enthalten keine Wertung uber die Qualitatder Implementierungen und sind nicht zwingend vollstandig!

Implementierungen ”bekannter” Algorithmen wie z.B:

I Kurzeste Wege (single source) mit Dijkstra oder Bellman-Ford

I Kurzeste Wege fur alle Paare

I Spannende Baume / Walder mit Kruskal oder Prim

I Maximum-Flow mit z.B. Edmonds Karp

I Allgemeines Layouting

I Minimale Schnitte mit Stoer-Wagner

I Tests auf Planaritat

Page 49: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Uberblick Algorithmen

Zusatzlich bei LEDA

I Euler-Touren

I Morphismen

I Geometrischer Schwerpunkt(Triangulation)

I Korrektheitsnachweise furviele Algorithmen

Zusatzlich bei Boost

I A* Algorithmus

I Resourcenbeschrankte Suche

I Sortierung dunn besetzterMatrizen

I Umfangreichere LayoutingAlgorithmen

Fazit

I Boost etwas ”praktischer” aufgestellt als LEDA ...

I ... oder LEDA etwas ”mathematischer” aufgestellt als Boost?

Page 50: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performance

Allgemein

I Leider keine Zeit fur umfangreiches Benchmarking

I Daher nur einige ”lose” Beobachtungen

Performance der AlgorithmenI Kein nennenswerter Unterschied bei

I Kurzeste Wege mit DijkstraI Topologischer Sortierung

Drastische Perfomancegewinne bei ”statischen” Graphen

I Speziell LEDA ermoglicht sehr schnelles kopieren in einenstatischen Graphen

Page 51: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Performance

Einfaches hinzufugen von Knoten

LEDA Boost 1

1 Knoten 0.000 sec 0.000 sec10 Knoten 0.000 sec 0.000 sec100 Knoten 0.000 sec 0.014 sec1000 Knoten 0.023 sec 1.302 sec5000 Knoten 0.582 sec 34.88 sec

Hinzufugen und Kanten von Vorganger → Nachfolger

LEDA Boost 1

1 Knoten 0.000 sec 0.000 sec10 Knoten 0.000 sec 0.004 sec100 Knoten 0.001 sec 0.155 sec1000 Knoten 0.109 sec 15.23 sec5000 Knoten 2.863 sec 492.9 sec

1boost::adjacency_list<boost::vecS, boost::vecS>

Page 52: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Gliederung

LEDA

Graphen

Bewertung

Nahere Erlauterungen

Page 53: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Allgemeine Bewertung

Mit Bezug auf C++I Bildet einen ”Mikrokosmos”

I Alle grundlegenden Datentypen vorhanden → Einarbeitung inweitere Libraries (inklusive der STL) nur selten notig

I Verzicht auf Nutzung von modernen C++ AspektenI Gewohnungsbedurftiger Umgang mit Templates (*.t Dateien)I Vorhandene, aber sparliche Interoperabilitat im Sinne der STL

I Komplett auf make ausgerichtetes Buildsystem

Fazit

I Angenehm fur Leute die keinen vertieften Umgang mit C++hatten, da auf sehr spezielle Techniken verzichtet wird

I Im Umkehrschluss fur Leute die auf modernere Aspekte vonC++ setzen ungewohnt

I Hohe Qualitat der Algorithmen und Datenstrukturen

Page 54: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA gemessen an den vier Designzielen

Ease of UseI LEDA lasst sich in der Tat auch nach kurzer

Eingewohnungszeit gut benutzenI Die Dokumentation ist alles in allem sehr hilfreich

ExtensibilityI Quellcode Lizenz fur eigene Erweiterung notwendig

I Speziell bei Templateklassen allgemein kritisch

CorrectnessI ”Certifying Algorithms” eine sehr gute Grundlage

EfficiencyI Wesentlich effizienter als STLI In meinen Augen LEDAs starkstes Argument

Kombination aus Effizienz und Korrektheit fur eine C++

Bibliothek einzigartig

Page 55: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Mogliche Einsatzfelder von LEDA

I LEDA in Konkurenz zu mathematischer Standardsoftware?I Schwerer zuganglich, aber sehr flexibel

I LEDA in der SpieleentwicklungI Sehr effiziente Algorithmen, die Spieleentwickler oft

stiefmutterlich behandelnI Triangulation + Wegfindung = Einfache Wegfindung in

dreidimensionalen Welten?

I Nutzung der hocheffizienten DatenstrukturenI Leider nur sehr begrenzt STL kompatibelI Gute grundlage fur AlgorithmenI Kostenlose Version nicht mit voller Effizienz

I ... Ideen aus dem Plenum?

Page 56: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Weitere Themen?

Mogliche Themen fur weitere VortrageI Graphen

I Explizite Vergleiche einzelner Algorithmen mit der Boost GraphLibrary

I Weitere Teilbereiche von LEDAI Geometrie (vermutlich am Spannendsten ;-) )I KryptographieI Kompression

Sehr offene und gute Zusammenarbeit mit dem LEDA Team!

Page 57: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Gliederung

LEDA

Graphen

Bewertung

Nahere ErlauterungenTemplatesRAIILEDA AlgorithmusAnwendung - Netzplan

Page 58: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was sind Templates? Zuruck

I Mechanismus fur Programmierung unabhangig von Datentypenohne Aufgabe von Sicherheiten zur Kompilierungszeit

I Sollten Datentypen wie void* (C) oder variant(Pascal)uberflussig machen

I Starke Ahnlichkeiten mit generics in JAVA oder C#I Aber durch das fehlen einer VM vollig anders implementiert

(”verzuckertes define”)I Auch heute nur von einem Compiler (Comeau) komplett

unterstutzt

Page 59: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was sind Templates? Zuruck

Typische Nutzung von Templates

// Works for every T with a "Name" method

// that returns something useful for operator +

int addNames <T>( T first , T second )

{

return first.Name() + second.Name ();

}

struct Person { std:: string Name (); };

struct Animal { std:: string Name (); };

Person p1 , p2;

Animal a1 , a2;

addNames <Person >(p1 , p2);

addNames <Animal >(a1 , a2);

Ahnlich wie in Java oder C#

Page 60: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was sind Templates? Zuruck

Rekursive Templates

template <unsigned int N>

struct product

{

static unsigned int const VALUE =

N * product <N - 1>::VALUE;

};

template <>

struct product <1>

{

static unsigned int const VALUE = 1;

};

// Usage:

unsigned int const p5 = product <5>:: VALUE;

Unmoglich mit Java oder C#

Page 61: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was ist RAII? Zuruck

Beispiel fur Code ohne RAII

bool solveHaltingProblem(Device d)

{

throw NotPossibleException ();

}

bool myFunction ()

{

Device d = getPowerfulDevice ();

HANDLE h = lockDevice(d);

bool result = compute(d);

unlockDevice(h);

return (result );

}

Page 62: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was ist RAII? Zuruck

I Kopplung der Belegung und Freigabe von Resourcen anGultigkeitsbereiche von Variablen

I Nutzung von Konstruktoren und DestruktorenI Anders als in vielen anderen Sprachen erfolgt der

Destruktoraufruf implizit (uber den Stack)I C++ verhindert dadurch nicht nur einfaches ”vergessen” von

Freigaben, sondern garantiert Freigaben auch inAusnahmesituationen

I Java: try {...} finally {...}I C#: using (var) {...}I Common-Lisp: ”Unwind protected macros”

I Damit ist in C++ trotzdem kein MemoryManagement wie inJava oder C# moglich

I new SomeManagedType() kann von MemoryManager kaumfreigegeben, aber durchaus erkannt, werden

I C++ erlaubt keine Freigabe von Speicher uber Assemblygrenzenhinweg

Page 63: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Was ist RAII? Zuruck

Losung mit RAII

class LockWrapper

{

private:

Handle mHandle;

public:

LockWrapper(Device d)

{

mHandle = lockDevice(h);

}

virtual ~LockWrapper ()

{

unlockDevice(mHandle );

}

}

Der Aufruf von unlockDevice() im Destruktor garantiert, dassunser Gerat benutzbar bleibt!

Page 64: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

LEDA Zuruck

Algorithmus von Kruskal

#include <LEDA/ graph . h>#include <LEDA/ n o d e p a r t i t i o n . h>l i s t <edge> MIN SPANNING TREE( const graph& graph ,

int (∗cmp) ( const edge &, const edge &)){

l i s t <edge> r e s u l t ; // Beginne mit dem l e e r e n Wald// Fuer a l l e Kanten des Graphen ( s o r t i e r t )l i s t <edge> edges = graph . a l l e d g e s ( ) ;edges . s o r t (cmp ) ;// W i e d e r h o l e f u e r a l l e Kanten des Graphenedge c u r r e n t E d g e ;n o d e p a r t i t i o n p a r t i t i o n ( graph ) ;f o r a l l ( c u r r e n t E d g e , graph ){

node u = s o u r c e ( c u r r e n t E d g e ) ;node v = t a r g e t ( c u r r e n t E d g e ) ;// Untersuche , ob d i e Kante z u g e f u e g t werden kann ,// s o d a s s d e r Wald w e i t e r h i n k r e i s f r e i b l e i b tif ( ! p a r t i t i o n . s a m e b l o c k ( u , v ) ){

r e s u l t . append ( c u r r e n t E d g e ) ;p a r t i t i o n . u n i o n b l o c k s ( u , v ) ;

}}// Der so k o n s t r u i e r t e Wald i s t e i n min imal s p a n n e n d e r// Baum f u e r den Graphenreturn ( r e s u l t ) ;

}

Page 65: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

Beispiel fur einen Netzplan

I Verschiedene Vorgangemit Abhangigkeiten

I Jeder Vorgang mit einerbestimmten Dauer

I Aus der Dauer lassen sichfruheste und spatesteAnfangs- undEndzeitpunkte errechnen

Bau einer Garage

Anwendung als ”Fingerubung” um ein Gefuhl fur LEDA zubekommen

Page 66: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

Implementierung eines Netzplans

I Fur Windows und Linux

I Befehlsorientiertes Dateiformat

Probleme und Fragestellungen

I Was ist der ”kritische Pfad”, bei dem eine Verzogerung dasgesamte Projekt verzogern wurde?

I Ist der Graph Zyklenfrei?

I Welche Vorgange hangen von einem bestimmten Vorgang ab?

I Was ist eine mogliche Reihenfolge in der man den Planabarbeiten konnte?

I Errechnung der fruhestmoglichen Anfangszeitpunkte

Fazit: Grundsatzliches Vorgehen sehr ahnlich!

Page 67: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

Kritischer Pfad

I Ein kritischer Pfad enthalt alle Vorgange im Netzplan, derenVerlangerung das gesamte Projekt gefahrden wurde

I Gesucht sind also alle langsten PfadeI Weder LEDA noch Boost bieten dafur eine fertige LosungI Beide Bibliotheken finden jedoch kurzeste Wege

I Ansatz: ”Invertierung” der Vorgangsdauern durch Subtraktionvon konstantem Maximum

I Ein kurzester Weg in diesem ”invertierten” Graphen ist einlangster Weg im Ursprungsgraphen

Implementierung durch Algorithmus von Dijkstra

Page 68: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

ZyklenfreiheitI Ein Netzplan bei dem sich ein Zyklus bilden kann konnte per

Definition nie erfullt werdenI Wir untersuchen den Graphen also nach dem hinzufugen jeder

Kante auf KreisfreiheitI LEDA bietet dafur die Methode graph.Is_Acyclic()I Boost bietet dafur keine Methode, es wird eine Tiefensuche

angewendet

Kreis in einem Netzplan

Page 69: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

Abhangigkeit von einem bestimmten Vorgang

I Alle Nachfolger eines bestimmten Knotens

I Breiten- oder Tiefensuche, Implementierung mit beidenBibliotheken trivial

Mogliche Abarbeitungsreihenfolge

I Reihenfolge in der eine einzelne Person die Garage bauenkonnte

I Topologische Sortierung, Implementierung mit beidenBibliotheken trivial

Page 70: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Anwendung

Vorwartsrechnung - Definition

I Fruhester Anfangszeitpunkt = FAZ

I Fruhester Endzeitpunkt = FAZ + Dauer = FEZ

I FAZ (x) = max(pred(x),FEZ )

I FAZ (”Begin”) = 0

Vorwartsrechnung - Im Graphen

I Wegfindungsalgorithmen arbeiten mit Kanten

Page 71: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Netzplan Dateiformat

AllgemeinI add,<Name>,<Dauer>

→ Fugt dem Netzplan einen Vorgang hinzuI bulkadd,<n>

→ Fugt dem Netzplan n Vorgange hinzu und fugt Kanten vonVorgangern zu Nachfolgern hinzu

I link,<Name>,<Name>

→ Macht den zweiten Eintrag zu einem Nachfolger des ErstenI show,<Name>

→ Zeigt alle Nachfolger des angegebenen VorgangsI critical

→ Zeigt den kritischen Pfad des NetzplansI order

→ Zeigt eine mogliche Reihenfolge, in der die Vorgangebearbeitet werden konnen

I clear

→ Leert den Graphen

Page 72: FH Wedel - SS11 - Seminar - Marcus Riemer - LEDA

Netzplan Dateiformat

Meta

I wait

→ Pausiert die Ausgabe bis der Benutzer ENTER druckt

I menu

→ Zeigt das interaktive Menu, mit dem der Benutzer denGraphen untersuchen und bearbeiten kann

I message,<Text>

→ Gibt den Text zur Laufzeit aus

I timer,<start|print>,<index>

→ Hilfsmittel fur einfache Benchmarks