Informatik 2 Praktikum - Aufgabe 2: Neuronales Netz
Aufgabenverteilung
===================================================

Aufwand in Prozent vom Gesamtaufwand (inkl. optionaler Aufgabe),
geschaetzt anhand der Aufgabenstellung.

Gemeinsam (jeder einmal)
------------------------
- Projektstruktur anschauen: welche Module gibt es, welche Funktionen fehlen?
- Startprogramm bauen und testen:
    make mnist_initial
    ./mnist mnist_test.info2 mnist_model.info2


Maxi - Matrix-Modul (ca. 35 %)
------------------------------
- Struktur "Matrix" an geeigneter Stelle (matrix.h) anlegen:
  Anzahl Zeilen, Anzahl Spalten, Zeiger auf die Werte.
- Fehlende Funktionen in matrix.c implementieren (Hinweise aus den Unittests).
- Funktion add mit zwei Modi:
    * Elementweise Addition (gleiche Groesse)
    * Broadcasting: Matrix + Spaltenvektor (Spalten = 1, gleiche Zeilenanzahl),
      Vektorwert jeder Zeile wird auf alle Elemente der Zeile addiert.
- Fertig, wenn gruen:
    make matrixTests && ./runMatrixTests
- WICHTIG: Das Matrix-Struct moeglichst frueh pushen, David braucht es
  fuer die Tests des neuronalen Netzes.


Hannes - Bilder einlesen (ca. 35 %)
-----------------------------------
- readImages in imageInput.c implementieren (Strukturen stehen in imageInput.h).
- Dateiformat (Binaerdatei, im Binaermodus "rb" oeffnen):
    * String "__info2_image_file_format__"
    * Anzahl Bilder  (unsigned short)
    * Breite         (unsigned short)
    * Hoehe          (unsigned short)
    * pro Bild: Breite*Hoehe Pixel (unsigned char, 0-255), dann Label (unsigned char, 0-9)
- Zuerst sinnvolle Hilfsfunktionen als static in imageInput.c schreiben
  (z.B. Header pruefen, Header lesen, ein Bild lesen) und dafuer eigene
  Unittests in imageInputTests.c ergaenzen.
- Danach readImages mit den Hilfsfunktionen zusammenbauen.
- Fertig, wenn gruen:
    make imageInputTests && ./runImageInputTests
- Tipp: nach jedem Teilschritt testen und committen.


David - Neuronales Netz, Feinschliff, Optional (ca. 30 %)
---------------------------------------------------------
- prepareNeuralNetworkFile() in neuralNetworkTests.c implementieren (ca. 15 %):
  Erzeugt eine gueltige Testdatei. Dateiformat in neuralNetwork.c nachlesen
  (Lesefunktion) und genau spiegelbildlich schreiben.
  Datei beginnt mit "__info2_neural_network_file_format__", danach die Schichten.
- Fertig, wenn gruen:
    make neuralNetworkTests && ./runNeuralNetworkTests
- Feinschliff (ca. 5 %), wenn alle Teile da sind:
    * Projekt kompiliert ohne Warnungen
    * alle Unittests laufen durch
    * make mnist && ./mnist mnist_test.info2 mnist_model.info2
- Optional (ca. 10 %): Ziffern mit der Maus malen und erkennen lassen,
  in mnistVisualization.c mit Raylib.


Git-Regeln im Team
------------------
- Vor jedem Arbeiten: git pull
- Nur eigene Dateien committen: git add <datei>   (nicht git add .)
- Ordner und Dateien NICHT verschieben oder umbenennen.
- .idea/ und cmake-build-*/ nicht committen.
