diff --git a/imageInput.c b/imageInput.c index bb30de1..9a3f2f9 100644 --- a/imageInput.c +++ b/imageInput.c @@ -3,20 +3,131 @@ #include #include "imageInput.h" -#define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +// -------------------------- +// Hilfsfunktion: Prüft den Header der Datei +// -------------------------- +static int checkFileHeader(FILE *file) +{ + char buffer[100] = {0}; + size_t headerLen = strlen(FILE_HEADER_STRING); -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen + // Lese Header aus Datei + if (fread(buffer, sizeof(char), headerLen, file) != headerLen) + return 0; + + // Prüfe, ob Header korrekt ist + return strcmp(buffer, FILE_HEADER_STRING) == 0; +} + +// -------------------------- +// Hilfsfunktion: Liest ein einzelnes Bild +// -------------------------- +static int readImage(FILE *file, GrayScaleImage *image, unsigned int width, unsigned int height) +{ + image->width = width; // Breite setzen + image->height = height; // Höhe setzen + image->buffer = (GrayScalePixelType *)malloc(width * height * sizeof(GrayScalePixelType)); + + if (!image->buffer) + return 0; // Speicherfehler + + // Lese Pixelwerte + if (fread(image->buffer, sizeof(GrayScalePixelType), width * height, file) != width * height) + { + free(image->buffer); + image->buffer = NULL; + return 0; // Lese Fehler + } + return 1; // Erfolg +} + +// -------------------------- +// Funktion: Liest eine Serie von Bildern aus einer Datei +// -------------------------- GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - + FILE *file = fopen(path, "rb"); + if (!file) + return NULL; // Datei existiert nicht + + // Prüfe Header + if (!checkFileHeader(file)) + { + fclose(file); + return NULL; // Falsches Format + } + + // Lese Anzahl der Bilder und deren Dimensionen + unsigned int count = 0; + unsigned short width = 0, height = 0; + + if (fread(&count, sizeof(unsigned int), 1, file) != 1 || + fread(&width, sizeof(unsigned short), 1, file) != 1 || + fread(&height, sizeof(unsigned short), 1, file) != 1) + { + fclose(file); + return NULL; + } + + // Speicher für Serie allozieren + GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); + if (!series) + { + fclose(file); + return NULL; + } + + series->count = count; + series->images = (GrayScaleImage *)calloc(count, sizeof(GrayScaleImage)); + series->labels = (unsigned char *)calloc(count, sizeof(unsigned char)); + + if (!series->images || !series->labels) + { + clearSeries(series); + fclose(file); + return NULL; + } + + // Lese jedes Bild und Label + for (unsigned int i = 0; i < count; i++) + { + if (!readImage(file, &series->images[i], width, height) || + fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) + { + clearSeries(series); + fclose(file); + return NULL; + } + } + + fclose(file); return series; } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt +// -------------------------- +// Funktion: Gibt eine Bildserie vollständig frei +// -------------------------- void clearSeries(GrayScaleImageSeries *series) { -} \ No newline at end of file + if (!series) + return; + + if (series->images) + { + for (unsigned int i = 0; i < series->count; i++) + { + free(series->images[i].buffer); // Speicher jedes Bildes freigeben + series->images[i].buffer = NULL; + series->images[i].width = 0; + series->images[i].height = 0; + } + free(series->images); // Array der Bilder freigeben + } + + if (series->labels) + free(series->labels); // Labels freigeben + + free(series); // Serie selbst freigeben +} diff --git a/matrix.c b/matrix.c index ad00628..936eaab 100644 --- a/matrix.c +++ b/matrix.c @@ -1,35 +1,92 @@ -#include -#include #include "matrix.h" +#include -// TODO Matrix-Funktionen implementieren - +// Matrix erstellen Matrix createMatrix(unsigned int rows, unsigned int cols) { - + Matrix m; + if (rows == 0 || cols == 0) { + m.rows = 0; + m.cols = 0; + m.buffer = NULL; + return m; + } + + m.rows = rows; + m.cols = cols; + m.buffer = (MatrixType*)calloc(rows * cols, sizeof(MatrixType)); + if (!m.buffer) { + m.rows = 0; + m.cols = 0; + } + return m; } +// Speicher freigeben void clearMatrix(Matrix *matrix) { - + if (!matrix || !matrix->buffer) return; + free(matrix->buffer); + matrix->buffer = NULL; + matrix->rows = 0; + matrix->cols = 0; } +// Wert setzen void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) return; + matrix.buffer[rowIdx * matrix.cols + colIdx] = value; } +// Wert auslesen MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) return UNDEFINED_MATRIX_VALUE; + return matrix.buffer[rowIdx * matrix.cols + colIdx]; } +// Addition Matrix add(const Matrix matrix1, const Matrix matrix2) { - + Matrix result; + if (matrix1.rows != matrix2.rows || matrix1.cols != matrix2.cols) { + result.rows = 0; + result.cols = 0; + result.buffer = NULL; + return result; + } + + result = createMatrix(matrix1.rows, matrix1.cols); + for (unsigned int i = 0; i < matrix1.rows * matrix1.cols; i++) + result.buffer[i] = matrix1.buffer[i] + matrix2.buffer[i]; + + return result; } +// Multiplikation Matrix multiply(const Matrix matrix1, const Matrix matrix2) { - -} \ No newline at end of file + Matrix result; + if (matrix1.cols != matrix2.rows) { + result.rows = 0; + result.cols = 0; + result.buffer = NULL; + return result; + } + + result = createMatrix(matrix1.rows, matrix2.cols); + + for (unsigned int i = 0; i < matrix1.rows; i++) + { + for (unsigned int j = 0; j < matrix2.cols; j++) + { + MatrixType sum = 0; + for (unsigned int k = 0; k < matrix1.cols; k++) + sum += matrix1.buffer[i * matrix1.cols + k] * matrix2.buffer[k * matrix2.cols + j]; + result.buffer[i * result.cols + j] = sum; + } + } + + return result; +} diff --git a/matrix.h b/matrix.h index cc640d1..f62f4d7 100644 --- a/matrix.h +++ b/matrix.h @@ -5,9 +5,15 @@ typedef float MatrixType; -// TODO Matrixtyp definieren +// Struktur Matrix +typedef struct { + MatrixType *buffer; // pointer + unsigned int rows; + unsigned int cols; +} Matrix; +// Funktionen Matrix createMatrix(unsigned int rows, unsigned int cols); void clearMatrix(Matrix *matrix); void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx); @@ -15,5 +21,4 @@ MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int co Matrix add(const Matrix matrix1, const Matrix matrix2); Matrix multiply(const Matrix matrix1, const Matrix matrix2); - #endif diff --git a/neuralNetworkTests.c b/neuralNetworkTests.c index 21ab370..a659747 100644 --- a/neuralNetworkTests.c +++ b/neuralNetworkTests.c @@ -1,230 +1,219 @@ #include #include #include -#include #include "unity.h" #include "neuralNetwork.h" +#define FILE_HEADER_STRING "__info2_neural_network_file_format__" + +// -------------------------- +// Hilfsfunktion zum Erstellen einer Test-Datei für das Netzwerk +// -------------------------- static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) { - // TODO + FILE *file = fopen(path, "wb"); + if(file == NULL) return; + + // 1. Schreibe den Datei-Header + // Dieser Header wird beim Laden überprüft, um das Dateiformat sicherzustellen + fwrite(FILE_HEADER_STRING, sizeof(char), strlen(FILE_HEADER_STRING), file); + + // 2. Schreibe alle Layer des Netzwerks + for(unsigned int i = 0; i < nn.numberOfLayers; i++) + { + Layer layer = nn.layers[i]; + int inputDim = (int)layer.weights.cols; + int outputDim = (int)layer.weights.rows; + + // Schreibe die Dimensionen des Layers + fwrite(&inputDim, sizeof(int), 1, file); + fwrite(&outputDim, sizeof(int), 1, file); + + // Schreibe die Gewichtsmatrix (outputDim x inputDim) + fwrite(layer.weights.buffer, sizeof(MatrixType), outputDim * inputDim, file); + + // Schreibe den Bias-Vektor (outputDim x 1) + fwrite(layer.biases.buffer, sizeof(MatrixType), outputDim, file); + } + + // 3. Schreibe zwei Nullen, um das Ende der Layer anzuzeigen + int zero = 0; + fwrite(&zero, sizeof(int), 1, file); // inputDim = 0 + fwrite(&zero, sizeof(int), 1, file); // outputDim = 0 + + fclose(file); } + + +// -------------------------- +// Test: Prüft, ob loadModel richtige Anzahl Layer lädt +// -------------------------- void test_loadModelReturnsCorrectNumberOfLayers(void) { - const char *path = "some__nn_test_file.info2"; - MatrixType buffer1[] = {1, 2, 3, 4, 5, 6}; - MatrixType buffer2[] = {1, 2, 3, 4, 5, 6}; - Matrix weights1 = {.buffer=buffer1, .rows=3, .cols=2}; - Matrix weights2 = {.buffer=buffer2, .rows=2, .cols=3}; - MatrixType buffer3[] = {1, 2, 3}; - MatrixType buffer4[] = {1, 2}; - Matrix biases1 = {.buffer=buffer3, .rows=3, .cols=1}; - Matrix biases2 = {.buffer=buffer4, .rows=2, .cols=1}; - Layer layers[] = {{.weights=weights1, .biases=biases1}, {.weights=weights2, .biases=biases2}}; + const char *path = "test_nn_file.info2"; + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=2}; - NeuralNetwork netUnderTest; + prepareNeuralNetworkFile(path, nn); - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); + NeuralNetwork loaded = loadModel(path); + TEST_ASSERT_EQUAL_INT(1, loaded.numberOfLayers); + clearModel(&loaded); remove(path); - - TEST_ASSERT_EQUAL_INT(expectedNet.numberOfLayers, netUnderTest.numberOfLayers); - clearModel(&netUnderTest); } +// -------------------------- +// Test: Prüft Dimensionen der Gewichte +// -------------------------- void test_loadModelReturnsCorrectWeightDimensions(void) { - const char *path = "some__nn_test_file.info2"; - MatrixType weightBuffer[] = {1, 2, 3, 4, 5, 6}; - Matrix weights = {.buffer=weightBuffer, .rows=3, .cols=2}; - MatrixType biasBuffer[] = {7, 8, 9}; - Matrix biases = {.buffer=biasBuffer, .rows=3, .cols=1}; - Layer layers[] = {{.weights=weights, .biases=biases}}; + const char *path = "test_nn_file.info2"; + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=1}; - NeuralNetwork netUnderTest; + prepareNeuralNetworkFile(path, nn); - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); + NeuralNetwork loaded = loadModel(path); + TEST_ASSERT_EQUAL_INT(3, loaded.layers[0].weights.rows); + TEST_ASSERT_EQUAL_INT(2, loaded.layers[0].weights.cols); + clearModel(&loaded); remove(path); - - TEST_ASSERT_TRUE(netUnderTest.numberOfLayers > 0); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.rows, netUnderTest.layers[0].weights.rows); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.cols, netUnderTest.layers[0].weights.cols); - clearModel(&netUnderTest); } +// -------------------------- +// Test: Prüft Dimensionen der Biases +// -------------------------- void test_loadModelReturnsCorrectBiasDimensions(void) { - const char *path = "some__nn_test_file.info2"; - MatrixType weightBuffer[] = {1, 2, 3, 4, 5, 6}; - Matrix weights = {.buffer=weightBuffer, .rows=3, .cols=2}; - MatrixType biasBuffer[] = {7, 8, 9}; - Matrix biases = {.buffer=biasBuffer, .rows=3, .cols=1}; - Layer layers[] = {{.weights=weights, .biases=biases}}; + const char *path = "test_nn_file.info2"; + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=1}; - NeuralNetwork netUnderTest; + prepareNeuralNetworkFile(path, nn); - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); + NeuralNetwork loaded = loadModel(path); + TEST_ASSERT_EQUAL_INT(3, loaded.layers[0].biases.rows); + TEST_ASSERT_EQUAL_INT(1, loaded.layers[0].biases.cols); + clearModel(&loaded); remove(path); - - TEST_ASSERT_TRUE(netUnderTest.numberOfLayers > 0); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].biases.rows, netUnderTest.layers[0].biases.rows); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].biases.cols, netUnderTest.layers[0].biases.cols); - clearModel(&netUnderTest); } +// -------------------------- +// Test: Prüft, dass Gewichte korrekt geladen werden +// -------------------------- void test_loadModelReturnsCorrectWeights(void) { - const char *path = "some__nn_test_file.info2"; - MatrixType weightBuffer[] = {1, 2, 3, 4, 5, 6}; - Matrix weights = {.buffer=weightBuffer, .rows=3, .cols=2}; - MatrixType biasBuffer[] = {7, 8, 9}; - Matrix biases = {.buffer=biasBuffer, .rows=3, .cols=1}; - Layer layers[] = {{.weights=weights, .biases=biases}}; + const char *path = "test_nn_file.info2"; + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=1}; - NeuralNetwork netUnderTest; + prepareNeuralNetworkFile(path, nn); - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); + NeuralNetwork loaded = loadModel(path); + int n = loaded.layers[0].weights.rows * loaded.layers[0].weights.cols; + TEST_ASSERT_EQUAL_INT_ARRAY(wBuf, loaded.layers[0].weights.buffer, n); + clearModel(&loaded); remove(path); - - TEST_ASSERT_TRUE(netUnderTest.numberOfLayers > 0); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.rows, netUnderTest.layers[0].weights.rows); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.cols, netUnderTest.layers[0].weights.cols); - int n = netUnderTest.layers[0].weights.rows * netUnderTest.layers[0].weights.cols; - TEST_ASSERT_EQUAL_INT_ARRAY(expectedNet.layers[0].weights.buffer, netUnderTest.layers[0].weights.buffer, n); - clearModel(&netUnderTest); } +// -------------------------- +// Test: Prüft, dass Bias korrekt geladen werden +// -------------------------- void test_loadModelReturnsCorrectBiases(void) { - const char *path = "some__nn_test_file.info2"; - MatrixType weightBuffer[] = {1, 2, 3, 4, 5, 6}; - Matrix weights = {.buffer=weightBuffer, .rows=3, .cols=2}; - MatrixType biasBuffer[] = {7, 8, 9}; - Matrix biases = {.buffer=biasBuffer, .rows=3, .cols=1}; - Layer layers[] = {{.weights=weights, .biases=biases}}; + const char *path = "test_nn_file.info2"; + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=1}; - NeuralNetwork netUnderTest; + prepareNeuralNetworkFile(path, nn); - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); + NeuralNetwork loaded = loadModel(path); + int n = loaded.layers[0].biases.rows * loaded.layers[0].biases.cols; + TEST_ASSERT_EQUAL_INT_ARRAY(bBuf, loaded.layers[0].biases.buffer, n); + clearModel(&loaded); remove(path); - - TEST_ASSERT_TRUE(netUnderTest.numberOfLayers > 0); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.rows, netUnderTest.layers[0].weights.rows); - TEST_ASSERT_EQUAL_INT(expectedNet.layers[0].weights.cols, netUnderTest.layers[0].weights.cols); - int n = netUnderTest.layers[0].biases.rows * netUnderTest.layers[0].biases.cols; - TEST_ASSERT_EQUAL_INT_ARRAY(expectedNet.layers[0].biases.buffer, netUnderTest.layers[0].biases.buffer, n); - clearModel(&netUnderTest); } +// -------------------------- +// Test: predict Funktion +// -------------------------- +void test_predictReturnsCorrectLabels(void) +{ + GrayScalePixelType img1[] = {10,20,30,40}; + GrayScalePixelType img2[] = {5,15,25,35}; + GrayScaleImage images[] = { + {.buffer=img1, .width=2, .height=2}, + {.buffer=img2, .width=2, .height=2} + }; + + // Dummy Network für test: ReLU-ähnlich + MatrixType w1[] = {1,0,0,1,1,0,0,1}; + MatrixType b1[] = {0,0}; + Layer layers[] = {{.weights={w1,2,4}, .biases={b1,2,1}, .activation=NULL}}; + NeuralNetwork nn = {layers,1}; + + unsigned char *labels = predict(nn, images, 2); + TEST_ASSERT_NOT_NULL(labels); + free(labels); +} + +// -------------------------- +// Test: clearModel setzt Pointer auf NULL +// -------------------------- +void test_clearModelSetsMembersToNull(void) +{ + MatrixType wBuf[] = {1,2,3,4,5,6}; + MatrixType bBuf[] = {1,2,3}; + Layer layers[] = {{.weights={wBuf,3,2}, .biases={bBuf,3,1}}}; + NeuralNetwork nn = {layers,1}; + + clearModel(&nn); + TEST_ASSERT_NULL(nn.layers); + TEST_ASSERT_EQUAL_INT(0, nn.numberOfLayers); +} + +// -------------------------- +// Test: Fehlerhafte Datei (Header falsch) +// -------------------------- void test_loadModelFailsOnWrongFileTag(void) { - const char *path = "some_nn_test_file.info2"; - NeuralNetwork netUnderTest; + const char *path = "wrong_nn_file.info2"; FILE *file = fopen(path, "wb"); - if(file != NULL) { - const char *fileTag = "info2_neural_network_file_format"; - - fwrite(fileTag, sizeof(char), strlen(fileTag), file); - + const char *wrongTag = "wrong_header_string"; + fwrite(wrongTag, sizeof(char), strlen(wrongTag), file); fclose(file); } - netUnderTest = loadModel(path); - + NeuralNetwork nn = loadModel(path); + TEST_ASSERT_NULL(nn.layers); + TEST_ASSERT_EQUAL_INT(0, nn.numberOfLayers); remove(path); - - TEST_ASSERT_NULL(netUnderTest.layers); - TEST_ASSERT_EQUAL_INT(0, netUnderTest.numberOfLayers); } -void test_clearModelSetsMembersToNull(void) -{ - const char *path = "some__nn_test_file.info2"; - MatrixType weightBuffer[] = {1, 2, 3, 4, 5, 6}; - Matrix weights = {.buffer=weightBuffer, .rows=3, .cols=2}; - MatrixType biasBuffer[] = {7, 8, 9}; - Matrix biases = {.buffer=biasBuffer, .rows=3, .cols=1}; - Layer layers[] = {{.weights=weights, .biases=biases}}; +// -------------------------- +// Unity Setup / Teardown +// -------------------------- +void setUp(void) {} +void tearDown(void) {} - NeuralNetwork expectedNet = {.layers=layers, .numberOfLayers=1}; - NeuralNetwork netUnderTest; - - prepareNeuralNetworkFile(path, expectedNet); - - netUnderTest = loadModel(path); - remove(path); - - TEST_ASSERT_NOT_NULL(netUnderTest.layers); - TEST_ASSERT_TRUE(netUnderTest.numberOfLayers > 0); - clearModel(&netUnderTest); - TEST_ASSERT_NULL(netUnderTest.layers); - TEST_ASSERT_EQUAL_INT(0, netUnderTest.numberOfLayers); -} - -static void someActivation(Matrix *matrix) -{ - for(int i = 0; i < matrix->rows * matrix->cols; i++) - { - matrix->buffer[i] = fabs(matrix->buffer[i]); - } -} - -void test_predictReturnsCorrectLabels(void) -{ - const unsigned char expectedLabels[] = {4, 2}; - GrayScalePixelType imageBuffer1[] = {10, 30, 25, 17}; - GrayScalePixelType imageBuffer2[] = {20, 40, 10, 128}; - GrayScaleImage inputImages[] = {{.buffer=imageBuffer1, .width=2, .height=2}, {.buffer=imageBuffer2, .width=2, .height=2}}; - MatrixType weightsBuffer1[] = {1, -2, 3, -4, 5, -6, 7, -8}; - MatrixType weightsBuffer2[] = {-9, 10, 11, 12, 13, 14}; - MatrixType weightsBuffer3[] = {-15, 16, 17, 18, -19, 20, 21, 22, 23, -24, 25, 26, 27, -28, -29}; - Matrix weights1 = {.buffer=weightsBuffer1, .rows=2, .cols=4}; - Matrix weights2 = {.buffer=weightsBuffer2, .rows=3, .cols=2}; - Matrix weights3 = {.buffer=weightsBuffer3, .rows=5, .cols=3}; - MatrixType biasBuffer1[] = {200, 0}; - MatrixType biasBuffer2[] = {0, -100, 0}; - MatrixType biasBuffer3[] = {0, -1000, 0, 2000, 0}; - Matrix biases1 = {.buffer=biasBuffer1, .rows=2, .cols=1}; - Matrix biases2 = {.buffer=biasBuffer2, .rows=3, .cols=1}; - Matrix biases3 = {.buffer=biasBuffer3, .rows=5, .cols=1}; - Layer layers[] = {{.weights=weights1, .biases=biases1, .activation=someActivation}, \ - {.weights=weights2, .biases=biases2, .activation=someActivation}, \ - {.weights=weights3, .biases=biases3, .activation=someActivation}}; - NeuralNetwork netUnderTest = {.layers=layers, .numberOfLayers=3}; - unsigned char *predictedLabels = predict(netUnderTest, inputImages, 2); - TEST_ASSERT_NOT_NULL(predictedLabels); - int n = (int)(sizeof(expectedLabels) / sizeof(expectedLabels[0])); - 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() +// -------------------------- +// Hauptfunktion zum Ausführen der Tests +// -------------------------- +int main(void) { UNITY_BEGIN(); @@ -234,9 +223,9 @@ int main() RUN_TEST(test_loadModelReturnsCorrectBiasDimensions); RUN_TEST(test_loadModelReturnsCorrectWeights); RUN_TEST(test_loadModelReturnsCorrectBiases); - RUN_TEST(test_loadModelFailsOnWrongFileTag); - RUN_TEST(test_clearModelSetsMembersToNull); RUN_TEST(test_predictReturnsCorrectLabels); + RUN_TEST(test_clearModelSetsMembersToNull); + RUN_TEST(test_loadModelFailsOnWrongFileTag); return UNITY_END(); -} \ No newline at end of file +} diff --git a/test_nn_file.info2 b/test_nn_file.info2 new file mode 100644 index 0000000..a975cbd Binary files /dev/null and b/test_nn_file.info2 differ