diff --git a/matrix.c b/matrix.c index d3f9afb..1babd3e 100644 --- a/matrix.c +++ b/matrix.c @@ -1,9 +1,6 @@ #include #include #include "matrix.h" -#include - -// TODO Matrix-Funktionen implementieren Matrix createMatrix(size_t rows, size_t cols) { @@ -17,7 +14,7 @@ Matrix createMatrix(size_t rows, size_t cols) return m; } - // Single allocation for entire matrix + //Allocate Matrix buffer m.buffer = malloc(rows * cols * sizeof(MatrixType)); if(!m.buffer){ @@ -25,7 +22,7 @@ Matrix createMatrix(size_t rows, size_t cols) return m; } - // Initialize (optional) + //Initialize matrix with default value for(unsigned int i = 0; i < rows * cols; i++){ m.buffer[i] = UNDEFINED_MATRIX_VALUE; } @@ -75,7 +72,7 @@ MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int co Matrix add(const Matrix matrix1, const Matrix matrix2) { - bool doBroadcast = false; + unsigned int doBroadcast = 0; Matrix larger, smaller; if(matrix1.rows == matrix2.rows && matrix1.cols == matrix2.cols){ @@ -86,13 +83,13 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) { larger = matrix1; smaller = matrix2; - doBroadcast = true; + doBroadcast = 1; } else if (matrix1.rows == matrix2.rows && matrix1.cols == 1) { larger = matrix2; smaller = matrix1; - doBroadcast = true; + doBroadcast = 1; } else{ Matrix m = {NULL, 0, 0}; @@ -101,6 +98,7 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) Matrix outputMatrix = createMatrix(larger.rows, larger.cols); if(doBroadcast){ + //Broadcasting for(int i = 0; i < outputMatrix.rows; i++){ MatrixType broadcastValue = smaller.buffer[i]; for(int j = 0; j < outputMatrix.cols; j++){ @@ -108,6 +106,7 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) } } } else{ + //Classic execution for (int i = 0; i < matrix1.rows;i++) { for (int j = 0; j < matrix1.cols; j++) { // how this should work in normal Matrix version: diff --git a/neuralNetwork.c b/neuralNetwork.c index bd8f164..021d1e8 100644 --- a/neuralNetwork.c +++ b/neuralNetwork.c @@ -164,7 +164,6 @@ NeuralNetwork loadModel(const char *path) assignActivations(model); } - return model; } diff --git a/neuralNetwork.sh b/neuralNetwork.sh new file mode 100644 index 0000000..7e56cdd --- /dev/null +++ b/neuralNetwork.sh @@ -0,0 +1 @@ +make clean && make && make neuralNetworkTests diff --git a/neuralNetworkTests.c b/neuralNetworkTests.c index 21ab370..4f5c040 100644 --- a/neuralNetworkTests.c +++ b/neuralNetworkTests.c @@ -8,9 +8,41 @@ static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) { - // TODO -} + FILE *file = fopen(path, "wb"); + if(file != NULL){ + const char *fileTag = "__info2_neural_network_file_format__"; + + //Write header + fwrite(fileTag, sizeof(char), strlen(fileTag), file); + + //Write the input dimension of the first layer + if(nn.numberOfLayers > 0){ + fwrite(&nn.layers[0].weights.cols, sizeof(int), 1, file); + } + + //Write each layer into file + for(int i = 0; i < nn.numberOfLayers; i++){ + + //Write output dimension + fwrite(&nn.layers[i].weights.rows, sizeof(int), 1, file); + + //Write weight data + int weightSize = nn.layers[i].weights.rows * nn.layers[i].weights.cols; + fwrite(nn.layers[i].weights.buffer, sizeof(MatrixType), weightSize, file); + + //Write bias data + int biasSize = nn.layers[i].biases.rows * nn.layers[i].biases.cols; + fwrite(nn.layers[i].biases.buffer, sizeof(MatrixType), biasSize, file); + } + + //EOF Terminator + int zero = 0; + fwrite(&zero, sizeof(int), 1, file); + + fclose(file); + } +} void test_loadModelReturnsCorrectNumberOfLayers(void) { const char *path = "some__nn_test_file.info2";