FinalVersion

This commit is contained in:
Niklas Popp 2025-11-27 15:59:51 +01:00
parent a7f3969682
commit 3caafaca8c

View File

@ -9,50 +9,48 @@
#define NN_HEADER "__info2_neural_network_file_format__\n" #define NN_HEADER "__info2_neural_network_file_format__\n"
//das auch zu machen
static void writeMatrix(FILE *file, const Matrix *m) {
unsigned short rows = (unsigned short)m->rows;
unsigned short cols = (unsigned short)m->cols;
fwrite(&rows, sizeof(unsigned short), 1, file);
fwrite(&cols, sizeof(unsigned short), 1, file);
fwrite(m->buffer, sizeof(MatrixType), rows * cols, file);
}
//erste FKt war zu machen! //erste FKt war zu machen!
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn) static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn)
{ {
// TODO if (path == NULL || nn.layers == NULL || nn.numberOfLayers == 0)
FILE *file = fopen(path, "wb"); return;
if (!file) return;
// 1. Header (ohne \n!) FILE *file = fopen(path, "wb");
const char *header = "__info2_neural_network_file_format__"; if (file == NULL)
fwrite(header, sizeof(char), strlen(header), file); return;
// 2. Schichten durchgehen // 1) Header schreiben muss zu FILE_HEADER_STRING in neuralNetwork.c passen
for (unsigned int i = 0; i < nn.numberOfLayers; i++) { const char *fileTag = "__info2_neural_network_file_format__";
unsigned int inputDim = (unsigned int)nn.layers[i].weights.cols; fwrite(fileTag, sizeof(char), strlen(fileTag), file);
unsigned int outputDim = (unsigned int)nn.layers[i].weights.rows;
// 3. Dimensionen schreiben // 2) Erste Eingabedimension: Spalten der ersten Gewichtsmatrix
fwrite(&inputDim, sizeof(unsigned int), 1, file); int inputDim = (int)nn.layers[0].weights.cols;
fwrite(&outputDim, sizeof(unsigned int), 1, file); fwrite(&inputDim, sizeof(int), 1, file);
// 4. Matrizen schreiben // 3) Für jede Schicht: Output-Dimension + Gewichte + Biases schreiben
writeMatrix(file, &nn.layers[i].weights); for (unsigned int i = 0; i < nn.numberOfLayers; i++)
writeMatrix(file, &nn.layers[i].biases); {
Matrix weights = nn.layers[i].weights;
Matrix biases = nn.layers[i].biases;
int outputDim = (int)weights.rows;
fwrite(&outputDim, sizeof(int), 1, file);
int nWeights = (int)(weights.rows * weights.cols);
int nBiases = (int)(biases.rows * biases.cols);
fwrite(weights.buffer, sizeof(MatrixType), nWeights, file);
fwrite(biases.buffer, sizeof(MatrixType), nBiases, file);
} }
// 5. Endsignal: letzte Output-Dimension = 0 // 4) Terminierende 0-Dimension, damit loadModel die Schleife beendet
unsigned int zero = 0; int zero = 0;
fwrite(&zero, sizeof(unsigned int), 1, file); fwrite(&zero, sizeof(int), 1, file);
fclose(file); fclose(file);
} }
void test_loadModelReturnsCorrectNumberOfLayers(void) void test_loadModelReturnsCorrectNumberOfLayers(void)
{ {
const char *path = "some__nn_test_file.info2"; const char *path = "some__nn_test_file.info2";