Humboldt-Universität Berlin - Institut für Mathematik Projektpraktikum I - WS16/17 Dr. Hella Rabus 18. Oktober 2016 Serie 1 Abgabetermin 04.11.2016 1 Vorbereitung Aufgabe 1.1: Anmeldung – Frist 22.10.2016 • Bearbeiten Sie Anmeldung und Vorbereitung und beachten Sie die Hinweise auf der Webseite des Praktikums unter Abgabemodalitäten. • Sollten die vorbereitenden Arbeiten nicht korrekt erledigt sein, erhalten Sie über Ihre Mathe-E-Mailadresse hierzu eine Information. Die Einstellungen sind bis zur Abgabe der ersten Serie zu korrigieren. Falls Sie keine E-Mail geschickt haben, können Ihre Aufgaben nicht bewertet werden, da wir Ihren Login nicht kennen. 2 Erstellung einer Klasse Sparse 2.1 Informationstheoretischer Hintergrund – Dünn besetzte Matrizen und Vektoren Beim Speichern von Vektoren und Matrizen (z.B. für das Lösen von linearen Gleichungssystemen), die hauptsächlich Nullen enthalten, kann Speicherplatz eingespart werden. Es werden hierzu nicht alle indizierten Größen gespeichert, sondern lediglich die von Null verschiedenen Einträge und die zugehörigen Indizes vom Typ int. In der numerischen Bibliothek Scipy existiert das Paket scipy.sparse, das wir hier nicht benutzen. Ziel dieser Serie ist es eine Klasse in Python zu implementieren, deren Objekte Sparse-Vektoren sind. Sparse bedeutet soviel wie spärlich oder schwach besetzt. Für die Rechnung mit Sparse-Vektoren sollen verschiedene Operationen bereitgestellt werden, die nicht mit vollen Vektoren arbeiten, sondern mit den abgespeicherten Daten auskommen. Aufgabe 1.2: Eigene Sparse-Klasse in Python Implementieren Sie eine Klasse in Python, deren Objekte Sparse-Vektoren sind. Die Einträge der Vektoren seien Elemente eines geordneten Körpers auf denen die Standardoperationen +, −, ∗, / und ≤ bereits definiert seien. Zum Beispiel können dies Zahlentypen (float, numpy.float16, integer, Decimal ), aber auch character, gemeine Brüche oder Restklassenkörper sein. 1. Stellen Sie einen Konstruktor init (liste, laenge) für Objekte der Klasse bereit. Der Sparse-Vektor wird entsprechend durch eine Liste von Tupeln liste=[(index, wert),...] und der Vektorlänge laenge repräsentiert. 1 2. Definieren Sie folgende Klassenvariablen (sobald Sie ein (nichtleeres) Objekt zur Verfügung haben). • typ – Datentyp der Einträge im Sparse-Vektor • null – neutrales Element bzgl. Addition des verwendeten Datentyps. Das Element wird für eine spätere Aufgabe in Serie 3 benötigt und kann auch in der Addition benutzt werden. Der Einfachheit halber dürfen Sie nach einmaliger Festlegung des Datentyps, sich darauf beschränken nur noch Sparse-Objekte mit Einträgen dieses Typs zulassen. 3. Speichern Sie die Klasse in sparse.py. Aufgabe 1.3: Eigene Methoden auf Sparse-Objekten Stellen Sie Methoden in Ihrer Sparse-Klasse als magic-methods zur Verfügung, die folgenden Zweck erfüllen: 1. Berechnung der Summe zweier Objekte Ihrer Sparse-Klasse (d.h. zweier SparseVektoren). Hinweis Definieren Sie eine Methode add (), die die Elemente des SparseVektors addiert. add () realisiert dann die Addition in der Sparse-Klasse mittels +. Input sind zwei Objekte der Sparse-Klasse, Output ist ebenfalls ein SparseObjekt. 2. Überprüfung der Gleichheit zweier Sparse-Vektoren mittels ==. 3. Ausgabe eines Sparse-Vektors mittels print(). Es sollen nur die von Null verschiedenen Einträge und die Vektorlänge ausgegeben werden. Hinweis Recherchieren Sie, wie die Namen der Methoden gewählt werden müssen, damit sie bei dem Aufruf von == bzw. print() verwendet werden. Aufgabe 1.4: Testen der Implementierung Testen Sie Ihre Implementierung innerhalb von sparse.py, indem Sie die name ==main Abfrage verwenden. Erstellen Sie je einen Test für den Typ float (Gleitkommazahlen mit fester Mantissenlänge) und einen für Zahlen vom Typ Decimal (Gleitkommazahlen im Dezimalsystem mit wählbarer Mantissenlänge). Aufgabe 1.5: Dokumentation der Klasse Dokumentieren Sie Ihre Sparse-Klasse mittels Sphinx. Nutzen Sie dazu doc-Strings, die Sie für Ihre Methoden angeben. Ein Beispiel einer Sphinx-Dokumentation können Sie sich unter http://www.math. hu-berlin.de/~ccafm/lehre_BZQ_Numerik/allg/Python_Bibliotheken.shtml (Dokumentation des Paketes HUMath) ansehen. 2 3 Allgemeine Hinweise zur Bearbeitung und Abgabe 3.1 Python • Kommentieren Sie die Python-Dateien so, dass die automatisch erstellte Dokumentation den Zweck und die Anwendung der Methoden erläutert. • Verwenden Sie ausschließlich Zeichen der Unicodetabelle C0. Für die Ausgabe anderer Zeichen sorgen Sie für die korrekte Codierung. • Geben Sie alle notwendigen Informationen zur Verwendung des Programmes aus. • Lesen Sie benötigte Daten ein und prüfen Sie ihre Gültigkeit, informieren Sie bei fehlerhafter Eingabe. Verhindern Sie Programmabstürze! Sorgen Sie (z.B. durch geeeignetes Exception handling) dafür, dass Ihr Programm nie in einen undefinierten Zustand gerät, . • Geben Sie in jeder Python-Datei die Namen der Autoren an. 3.2 Sphinx • Eine Einleitung finden Sie unter http://www.math.hu-berlin.de/~ccafm/lehre_ BZQ_Numerik/allg/python_sphinx.shtml (NLA-Homepage → Bibliotheken für Python → Sphinx Tutorial) • Geben Sie im doc -String ausreichend viele Informationen an, sodass eine vollständige Dokumentation entsteht. • Benutzen Sie die sphinx-apidoc-Optionen -H (Dokumentname) und -A (Author). 3.3 Abgabe • Legen Sie die Quellen und die Doku termingerecht im NLA-Order des Gruppenpartners mit dem lexikographisch kleineren Login ab. Legen Sie darin passend Unterverzeichnisse (für Serien 1 und 3: serie1) an, in denen Sie die Lösungen ablegen. Verwenden Sie in Datei- und Verzeichnisnamen keine Leer- und Sonderzeichen. • Beachten Sie die Namensvorgaben (insb. Groß- und Kleinschreibung) für Dateien und Methoden. • Achten Sie auf korrekt eingestellte Zugriffsrechte. Tipp Wenden Sie den Befehl setfacl entsprechend den Hinweisen direkt vor Abgabe der Lösungen auf Ihr NLA Verzeichnis an. 3