#include "fadiff.h" #include #include using namespace std; #define N_SAMPLES 4 #define N_IN 2 #define N_OUT 1 #define LAYERS 2 #define ELEMENTS_LAYER1 2 #define ELEMENTS_LAYER2 1 #define ELEMENTS_LAYER_MAX 2 #define WEIGHTS 3 struct w_layer { int n; int w; F **layer;}; F magnitude_squared(int n_x, F *x) { F r = 0.0; int j; for (j = 0; j *activities, struct w_layer ws_layer, F *out) { int i, j; for (i = 0; i *in, int n_out, F *out) { int i, j; F temp_in[ELEMENTS_LAYER_MAX]; F temp_out[ELEMENTS_LAYER_MAX]; for (i = 0; i error_on_dataset(int n_ws_layers, struct w_layer *ws_layers) { F xor_data[N_SAMPLES][N_IN+N_OUT]; int i, j; F error; F in[N_IN]; F out[N_OUT], absolute_error[N_OUT]; xor_data[0][0] = 0.0; xor_data[0][1] = 0.0; xor_data[0][2] = 0.0; xor_data[1][0] = 0.0; xor_data[1][1] = 1.0; xor_data[1][2] = 1.0; xor_data[2][0] = 1.0; xor_data[2][1] = 0.0; xor_data[2][2] = 1.0; xor_data[3][0] = 1.0; xor_data[3][1] = 1.0; xor_data[3][2] = 0.0; error = 0.0; for (i = 0; i f(int, struct w_layer *), int n_ws_layers, struct w_layer *ws_layers, struct w_layer *grad_f) { int i, j, k, n, count; F result; n = 0; for (i = 0; i f(int, struct w_layer *), int n_w0, struct w_layer *w0, int n, double eta) { int i, j, k, l; struct w_layer grad_f[n_w0]; for (i = 0; i * [grad_f[i].n]; for (j = 0; j [grad_f[i].w];} for (i = 0; i error; xor_ws0[0].n = ELEMENTS_LAYER1; xor_ws0[1].n = ELEMENTS_LAYER2; xor_ws0[0].w = WEIGHTS; xor_ws0[1].w = WEIGHTS; for (i = 0; i * [xor_ws0[i].n]; for (j = 0; j [xor_ws0[i].w];} xor_ws0[0].layer[0][0] = 0.0; xor_ws0[0].layer[0][1] = -0.284227; xor_ws0[0].layer[0][2] = 1.16054; xor_ws0[0].layer[1][0] = 0.0; xor_ws0[0].layer[1][1] = 0.617194; xor_ws0[0].layer[1][2] = 1.30467; xor_ws0[1].layer[0][0] = 0.0; xor_ws0[1].layer[0][1] = -0.084395; xor_ws0[1].layer[0][2] = 0.648461; vanilla(error_on_dataset, LAYERS, xor_ws0, 1000000, 0.3); error = error_on_dataset(LAYERS, xor_ws0); for (i = 0; i