All tests Pass Programm works

This commit is contained in:
Sara Stark 2025-11-16 17:27:23 +01:00
parent 4b2cbfb836
commit 49977a86c5
2 changed files with 36 additions and 37 deletions

View File

@ -153,7 +153,7 @@ NeuralNetwork loadModel(const char *path)
unsigned int inputDimension = readDimension(file);
unsigned int outputDimension = readDimension(file);
fprintf(stderr, "[loadModel] first dims: input=%u output=%u\n", inputDimension, outputDimension);
//fprintf(stderr, "[loadModel] first dims: input=%u output=%u\n", inputDimension, outputDimension);
while (inputDimension > 0 && outputDimension > 0)
{
@ -177,16 +177,16 @@ NeuralNetwork loadModel(const char *path)
model.layers[model.numberOfLayers] = layer;
model.numberOfLayers++;
fprintf(stderr, "[loadModel] loaded layer %d: weights %u x %u, biases %u x %u\n",
/* fprintf(stderr, "[loadModel] loaded layer %d: weights %u x %u, biases %u x %u\n",
model.numberOfLayers,
layer.weights.rows, layer.weights.cols,
layer.biases.rows, layer.biases.cols);
layer.biases.rows, layer.biases.cols); */
/* Lese das nächste Dimensions-Paar (writer schreibt für jede Schicht ein Paar) */
unsigned int nextInput = readDimension(file);
unsigned int nextOutput = readDimension(file);
fprintf(stderr, "[loadModel] next raw dims read: nextInput=%u nextOutput=%u\n", nextInput, nextOutput);
//fprintf(stderr, "[loadModel] next raw dims read: nextInput=%u nextOutput=%u\n", nextInput, nextOutput);
/* Wenn nächstes Paar (0,0) -> Ende */
if (nextInput == 0 || nextOutput == 0)
@ -200,7 +200,7 @@ NeuralNetwork loadModel(const char *path)
inputDimension = nextInput;
outputDimension = nextOutput;
fprintf(stderr, "[loadModel] next dims: input=%u output=%u\n", inputDimension, outputDimension);
//fprintf(stderr, "[loadModel] next dims: input=%u output=%u\n", inputDimension, outputDimension);
}
fclose(file);

View File

@ -10,47 +10,46 @@
static void prepareNeuralNetworkFile(const char *path, const NeuralNetwork nn)
{
// TODO
FILE *file = fopen(path, "wb"); // Binärmodus zum Schreiben öffnen
FILE *file = fopen(path, "wb");
if (!file) return;
if (file != NULL)
// 1) Header-Tag WORTGENAU (OHNE Nullterminator) schreiben
fwrite(FILE_HEADER_STRING, sizeof(char), strlen(FILE_HEADER_STRING), file);
// 2) Für jeden Layer die Paare (inputDim, outputDim) und dann Gewichte & Biases schreiben
// inputDim == weights.cols
// outputDim == weights.rows
for (unsigned int i = 0; i < nn.numberOfLayers; ++i)
{
// 1. Identifikationstag schreiben
const char *fileTag = FILE_HEADER_STRING;
fwrite(fileTag, sizeof(char), strlen(fileTag), file);
const Layer *lay = &nn.layers[i];
// 2. Schichten (Layer) sequenziell schreiben
for (unsigned int i = 0; i < nn.numberOfLayers; i++)
{
const Layer currentLayer = nn.layers[i];
unsigned int inputDim = lay->weights.cols;
unsigned int outputDim = lay->weights.rows;
unsigned int inputDimension = currentLayer.weights.cols;
unsigned int outputDimension = currentLayer.weights.rows;
// schreibe Dimensionen (4-Byte int / unsigned int)
fwrite(&inputDim, sizeof(unsigned int), 1, file);
fwrite(&outputDim, sizeof(unsigned int), 1, file);
// Schreibe Input Dimension. Wichtig: Nutze sizeof(int)
// da readDimension in neuralNetwork.c in einen int liest.
fwrite(&inputDimension, sizeof(int), 1, file);
// Schreibe Output Dimension.
fwrite(&outputDimension, sizeof(int), 1, file);
// Schreibe Gewichtsmatrix (Weights) Daten
size_t numWeights = currentLayer.weights.rows * currentLayer.weights.cols;
fwrite(currentLayer.weights.buffer, sizeof(MatrixType), numWeights, file);
// Schreibe Biasmatrix (Biases) Daten
size_t numBiases = currentLayer.biases.rows * currentLayer.biases.cols;
fwrite(currentLayer.biases.buffer, sizeof(MatrixType), numBiases, file);
// schreibe Gewichtsmatrix (row-major: rows*cols Elemente vom Typ MatrixType)
size_t weightCount = (size_t)lay->weights.rows * (size_t)lay->weights.cols;
if (weightCount > 0 && lay->weights.buffer != NULL) {
fwrite(lay->weights.buffer, sizeof(MatrixType), weightCount, file);
}
// 3. Ende des Modells signalisieren
// schreibe Biasmatrix (rows * cols) - normalerweise rows x 1
size_t biasCount = (size_t)lay->biases.rows * (size_t)lay->biases.cols;
if (biasCount > 0 && lay->biases.buffer != NULL) {
fwrite(lay->biases.buffer, sizeof(MatrixType), biasCount, file);
}
}
// 3) Endmarkierung: nächstes Input / Output = 0, damit loadModel() die Schleife beendet
unsigned int zero = 0;
// Wichtig: Auch hier sizeof(int) verwenden
fwrite(&zero, sizeof(int), 1, file); // Input Dimension = 0
fwrite(&zero, sizeof(int), 1, file); // Output Dimension = 0
fwrite(&zero, sizeof(unsigned int), 1, file);
fwrite(&zero, sizeof(unsigned int), 1, file);
fclose(file);
}
}
void test_loadModelReturnsCorrectNumberOfLayers(void)
{