Serie 1 - Institut für Mathematik

Werbung
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
Herunterladen