From a6c6cb393eff8ba255e201404b35b7286f5785fe Mon Sep 17 00:00:00 2001 From: Boltpawn <167917163+HumanBodyMacAndCheese@users.noreply.github.com> Date: Sun, 16 Nov 2025 17:45:08 -0500 Subject: [PATCH 1/3] Replace original Genann files with modified ones --- genann.c | 25 +++++++++++++++++++------ genann.h | 15 +++++++++++++-- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/genann.c b/genann.c index b05fa4f..43d5d1c 100644 --- a/genann.c +++ b/genann.c @@ -73,6 +73,12 @@ double genann_act_sigmoid(const genann *ann unused, double a) { return 1.0 / (1 + exp(-a)); } +double genann_act_sigmoid_derivative(const genann *ann unused, double a) { + const double result = genann_act_sigmoid(ann, a); + return result * (1 - result); + +} + void genann_init_sigmoid_lookup(const genann *ann) { const double f = (sigmoid_dom_max - sigmoid_dom_min) / LOOKUP_SIZE; int i; @@ -120,7 +126,7 @@ genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs) { /* Allocate extra size for weights, outputs, and deltas. */ const int size = sizeof(genann) + sizeof(double) * (total_weights + total_neurons + (total_neurons - inputs)); - genann *ret = malloc(size); + genann *ret = GENANN_MALLOC(size); if (!ret) return 0; ret->inputs = inputs; @@ -140,6 +146,9 @@ genann *genann_init(int inputs, int hidden_layers, int hidden, int outputs) { ret->activation_hidden = genann_act_sigmoid_cached; ret->activation_output = genann_act_sigmoid_cached; + + ret->activation_hidden_derivative = genann_act_sigmoid_derivative; + ret->activation_output_derivative = genann_act_sigmoid_derivative; genann_init_sigmoid_lookup(ret); @@ -178,7 +187,7 @@ genann *genann_read(FILE *in) { genann *genann_copy(genann const *ann) { const int size = sizeof(genann) + sizeof(double) * (ann->total_weights + ann->total_neurons + (ann->total_neurons - ann->inputs)); - genann *ret = malloc(size); + genann *ret = GENANN_MALLOC(size); if (!ret) return 0; memcpy(ret, ann, size); @@ -204,7 +213,7 @@ void genann_randomize(genann *ann) { void genann_free(genann *ann) { /* The weight, output, and delta pointers go to the same buffer. */ - free(ann); + GENANN_FREE(ann); } @@ -296,7 +305,7 @@ void genann_train(genann const *ann, double const *inputs, double const *desired } } else { for (j = 0; j < ann->outputs; ++j) { - *d++ = (*t - *o) * *o * (1.0 - *o); + *d++ = (*t - *o) * ann->activation_output_derivative(ann, *o); ++o; ++t; } } @@ -327,8 +336,7 @@ void genann_train(genann const *ann, double const *inputs, double const *desired const double forward_weight = ww[windex]; delta += forward_delta * forward_weight; } - - *d = *o * (1.0-*o) * delta; + *d = ann->activation_hidden_derivative(ann, *o) * delta; ++d; ++o; } } @@ -394,6 +402,11 @@ void genann_train(genann const *ann, double const *inputs, double const *desired void genann_write(genann const *ann, FILE *out) { + /* Safety check if file is invalid */ + if (!out) { + return; + + } fprintf(out, "%d %d %d %d", ann->inputs, ann->hidden_layers, ann->hidden, ann->outputs); int i; diff --git a/genann.h b/genann.h index e4b7383..7cdd025 100644 --- a/genann.h +++ b/genann.h @@ -28,6 +28,7 @@ #define GENANN_H #include +#include #ifdef __cplusplus extern "C" { @@ -39,6 +40,10 @@ extern "C" { #define GENANN_RANDOM() (((double)rand())/RAND_MAX) #endif +/* Memory management; Redefine these to change the internal malloc/free system. */ +#define GENANN_MALLOC(sz) malloc(sz) +#define GENANN_FREE(sz) free(sz) + struct genann; typedef double (*genann_actfun)(const struct genann *ann, double a); @@ -47,12 +52,18 @@ typedef struct genann { /* How many inputs, outputs, and hidden neurons. */ int inputs, hidden_layers, hidden, outputs; - /* Which activation function to use for hidden neurons. Default: gennann_act_sigmoid_cached*/ + /* Which activation function to use for hidden neurons. Default: genann_act_sigmoid_cached*/ genann_actfun activation_hidden; - /* Which activation function to use for output. Default: gennann_act_sigmoid_cached*/ + /* Which activation function to use for output. Default: genann_act_sigmoid_cached*/ genann_actfun activation_output; + /* Which activation function to use for the hidden layer's derivative. Default: genann_act_sigmoid_derivative */ + genann_actfun activation_hidden_derivative; + + /* Which activation function to use for the output layer's derivative. Default: genann_act_sigmoid_derivative */ + genann_actfun activation_output_derivative; + /* Total number of weights, and size of weights buffer. */ int total_weights; From e9627cd6c489e1ccb4c137b6ebcabae3b096c985 Mon Sep 17 00:00:00 2001 From: Boltpawn <167917163+HumanBodyMacAndCheese@users.noreply.github.com> Date: Sun, 16 Nov 2025 18:54:50 -0500 Subject: [PATCH 2/3] Fixed sigmoid derivative and added it to genann.h --- genann.c | 3 +-- genann.h | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/genann.c b/genann.c index 43d5d1c..45fa80c 100644 --- a/genann.c +++ b/genann.c @@ -74,8 +74,7 @@ double genann_act_sigmoid(const genann *ann unused, double a) { } double genann_act_sigmoid_derivative(const genann *ann unused, double a) { - const double result = genann_act_sigmoid(ann, a); - return result * (1 - result); + return a * (1 - a); } diff --git a/genann.h b/genann.h index 7cdd025..0c7a9fc 100644 --- a/genann.h +++ b/genann.h @@ -108,6 +108,7 @@ void genann_write(genann const *ann, FILE *out); void genann_init_sigmoid_lookup(const genann *ann); double genann_act_sigmoid(const genann *ann, double a); double genann_act_sigmoid_cached(const genann *ann, double a); +double genann_act_sigmoid_derivative(const genann *ann unused, double a); double genann_act_threshold(const genann *ann, double a); double genann_act_linear(const genann *ann, double a); From 8b7f479030346a654f2470e08fcd2c28f51df33a Mon Sep 17 00:00:00 2001 From: Boltpawn <167917163+HumanBodyMacAndCheese@users.noreply.github.com> Date: Sun, 16 Nov 2025 18:57:20 -0500 Subject: [PATCH 3/3] Removed error involving macro in genann.h --- genann.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genann.h b/genann.h index 0c7a9fc..b74059f 100644 --- a/genann.h +++ b/genann.h @@ -108,7 +108,7 @@ void genann_write(genann const *ann, FILE *out); void genann_init_sigmoid_lookup(const genann *ann); double genann_act_sigmoid(const genann *ann, double a); double genann_act_sigmoid_cached(const genann *ann, double a); -double genann_act_sigmoid_derivative(const genann *ann unused, double a); +double genann_act_sigmoid_derivative(const genann *ann, double a); double genann_act_threshold(const genann *ann, double a); double genann_act_linear(const genann *ann, double a);