sengpielto106561 committed 2026-11-05 15:34:15 +01:00
commit 6a05c997a6
2 files changed
+94 -12

No files matched your search

+22 -1
View File
@@ -1,10 +1,31 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "matrix.h"
Matrix createMatrix(unsigned int rows, unsigned int cols){
/*
unsigned int memory_depth = 0;
memory_depth = rows * cols; //Meine Speichertiefe ist die Anzahl meiner Spalten mal die Reihen
unsigned int memory_reservation = 0;
memory_reservation = memory_depth * sizeof(MatrixType); //Nimmt die Speichertiefe mal die größe der einzelnen Speicherinhalte (float)
Matrix.space = malloc(memory_reservation); //Reserviert den Speicher und gibt den Zeiger auf die erste Speicheradresse dem zeiger space
*/
Matrix matrix; //Matrix ist der Datentyp (im struct bestimmt). wir brauchen hier aber eine lokale variable (!NIX GLOBAL!) daher ist matrix eine Variable vom Typ Matrix.
matrix.rows = rows;
matrix.cols = cols;
matrix.space = malloc(rows * cols * sizeof(MatrixType));
if (matrix.space == NULL) {
fprintf(stderr, "Error, matrix could not be created...\n");
matrix.rows = 0;
matrix.cols = 0;
}
return matrix;
}
+72 -11
View File
@@ -4,13 +4,55 @@
#include <math.h>
#include "unity.h"
#include "neuralNetwork.h"
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn)
/*
---------------------------------------------------------------------------------------------------------
*/
// TODO Nico
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) //Exklusive Funktion ohne Rückgabewert mit Übergabewerten "path" für den Dateinamen und "nn" für das neuronale Netz dessen Daten abgespeichert werden soll
{
// TODO
/*---Datei zum Schreiben im Binärmodus öffnen---*/
FILE *file = fopen(path, "wb"); //Öffnet die Datei "path" als write Binary
if(file == NULL) //Wenn Datei nicht geöffnet werden kann, bringe einen Fehler und breche das Programm ab
{
return;
}
/*---Indifikationstag an den Anfang schreiben---*/
const char *fileTag = "info2_neural_network_file_format"; //Der Text der laut Angabe am Anfang der Datei stehen muss
fwrite(fileTag, sizeof(char), strlen(fileTag), file); //Schreibbefehl mit Parametern (Vorgegebener Text soll geschrieben werden (Adresse), Größe eines Buchstaben, Länge des Textes, Zielort "file")
/*---Anzahl der Layer speichern---*/
fwrite(&nn.numberOfLayers, sizeof(int), 1, file); //Schreibbefehl mit Parametern (Die Adresse von "nn.numberOfLayers" soll geschrieben werden, eine ganze Zahl als "int" wird abgespeichert, es wird genau eine solche Zahl geschrieben, Zielort "file")
/*---Schleife für jeden Layer um Gewichte und Bias zu speichern---*/
for(int i = 0; i < nn.numberOfLayers; i++) //Schleife von 0 bis Anzahl der Layer
{
Layer layer = nn.layers[i]; //Benutzt aktuellen Layer mit Nummer "i" und benutzt Hilfsvariable "layer"
/*---Weights speichern---*/
fwrite(&layer.weights.rows, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Zeilen Weights (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Zeilen Gewichts-Tabelle hat
fwrite(&layer.weights.cols, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Spalten Weights (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Spalten Gewichts-Tabelle hat
int weightCount = layer.weights.rows * layer.weights.cols; //Berechnet die Gesamtzahl der Zahlen in der Weight Tabelle
fwrite(layer.weights.buffer, sizeof(MatrixType), weightCount, file); //Schreibbefehl mit Parametern mit (Weight Buffer (Adresse), eine ganze Zahl in "MatrixType" abspeichern, es wird der zuvor berechnete Wert gespeichert, Zielort "file") --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&"
/*---Bias speichern---*/
fwrite(&layer.biases.rows, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Zeilen Bias (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Zeilen Bias-Tabelle hat
fwrite(&layer.biases.cols, sizeof(int), 1, file); //Schreibbefehl mit Parametern mit (Anzahl Spalten Bias (Adresse), eine ganze Zahl als "int" abspeichern, es wird genau eine solche Zahl gespeichert, Zielort "file") --> Speichert ab, wie viele Spalten Bias-Tabelle hat
int biasCount = layer.biases.rows * layer.biases.cols; //Berechnet die Gesamtzahl der Zahlen in der Bias Tabelle
fwrite(layer.biases.buffer, sizeof(MatrixType), biasCount, file); //Schreibbefehl mit Parametern mit (Bias Buffer (Adresse), eine ganze Zahl in "MatrixType" abspeichern, es wird der zuvor berechnete Wert gespeichert, Zielort "file") --> Speichert alle eigentlichen Zahlenwerte der Weights auf einmal in die Datei. Buffer ist bereits intern ein Zeiger, deswegen kein "&"
}
/*---Datei wieder schließen---*/
fclose(file); //Schließe die Datei wieder, wenn alle Daten sauber geschrieben wurden
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelReturnsCorrectNumberOfLayers(void)
{
const char *path = "some__nn_test_file.info2";
@@ -35,7 +77,9 @@ void test_loadModelReturnsCorrectNumberOfLayers(void)
TEST_ASSERT_EQUAL_INT(expectedNet.numberOfLayers, netUnderTest.numberOfLayers);
clearModel(&netUnderTest);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelReturnsCorrectWeightDimensions(void)
{
const char *path = "some__nn_test_file.info2";
@@ -59,6 +103,9 @@ void test_loadModelReturnsCorrectWeightDimensions(void)
clearModel(&netUnderTest);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelReturnsCorrectBiasDimensions(void)
{
const char *path = "some__nn_test_file.info2";
@@ -81,7 +128,9 @@ void test_loadModelReturnsCorrectBiasDimensions(void)
TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].biases.cols, netUnderTest.layers[0].biases.cols);
clearModel(&netUnderTest);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelReturnsCorrectWeights(void)
{
const char *path = "some__nn_test_file.info2";
@@ -106,7 +155,9 @@ void test_loadModelReturnsCorrectWeights(void)
TEST_ASSERT_EQUAL_INT_ARRAY(expectedNet.layers[0].weights.buffer, netUnderTest.layers[0].weights.buffer, n);
clearModel(&netUnderTest);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelReturnsCorrectBiases(void)
{
const char *path = "some__nn_test_file.info2";
@@ -131,7 +182,9 @@ void test_loadModelReturnsCorrectBiases(void)
TEST_ASSERT_EQUAL_INT_ARRAY(expectedNet.layers[0].biases.buffer, netUnderTest.layers[0].biases.buffer, n);
clearModel(&netUnderTest);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_loadModelFailsOnWrongFileTag(void)
{
const char *path = "some_nn_test_file.info2";
@@ -154,7 +207,9 @@ void test_loadModelFailsOnWrongFileTag(void)
TEST_ASSERT_NULL(netUnderTest.layers);
TEST_ASSERT_EQUAL_INT(0, netUnderTest.numberOfLayers);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_clearModelSetsMembersToNull(void)
{
const char *path = "some__nn_test_file.info2";
@@ -186,7 +241,9 @@ static void someActivation(Matrix *matrix)
matrix->buffer[i] = fabs(matrix->buffer[i]);
}
}
/*
---------------------------------------------------------------------------------------------------------
*/
void test_predictReturnsCorrectLabels(void)
{
const unsigned char expectedLabels[] = {4, 2};
@@ -215,15 +272,19 @@ void test_predictReturnsCorrectLabels(void)
TEST_ASSERT_EQUAL_UINT8_ARRAY(expectedLabels, predictedLabels, n);
free(predictedLabels);
}
/*
---------------------------------------------------------------------------------------------------------
*/
void setUp(void) {
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
}
void tearDown(void) {
// Hier kann Bereinigungsarbeit nach jedem Test durchgeführt werden
}
/*----------------------------------------------------------------------------------------------------------- */
int main()
{
UNITY_BEGIN();