#include "cppad/cppad.hpp" #include #include using namespace std; using CppAD::AD; #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_LAYER_MAX 6 #define WEIGHTS 3 struct w_layer { int n; int w;}; AD magnitude_squared(int n_x, AD *x) { AD r; r = 0.0; int j; for (j = 0; j *activities, int n_elements, int n_weights, AD *weights, AD *out) { int i, j; for (i = 0; i *ws_layers, int n_layers_format, struct w_layer *layers_format, int n_in, AD *in, int n_out, AD *out) { int i, j, count; AD temp_in[ELEMENTS_LAYER_MAX]; AD temp_out[ELEMENTS_LAYER_MAX]; AD temp_weights[WEIGHTS_LAYER_MAX]; count = 0; for (i = 0; i error_on_dataset(int n_ws_layers, AD *ws_layers, int n_layers_format, struct w_layer *layers_format) { double xor_data[N_SAMPLES][N_IN+N_OUT]; int i, j; AD error; AD in[N_IN]; AD 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 *ws, int n_layers, struct w_layer *w0_format, double *grad_f) { int i, j; CppAD::vector< AD > w0(n_w0); CppAD::vector< AD > error(1); for (i = 0; i f(w0, error); CppAD::vector dws(n_w0); CppAD::vector derror(1); derror[0] = 1; dws = f.Reverse(1, derror); for (i = 0; i *ws, int n_layers, struct w_layer *w0_format, int n, double eta) { int i, j; AD error; double *grad_f; grad_f = new double[n_w0]; for (i = 0; i *xor_ws0; xor_ws0 = new AD[n_xor_ws0]; xor_ws0[0] = 0.0; xor_ws0[1] = -0.284227; xor_ws0[2] = 1.16054; xor_ws0[3] = 0.0; xor_ws0[4] = 0.617194; xor_ws0[5] = 1.30467; xor_ws0[6] = 0.0; xor_ws0[7] = -0.084395; xor_ws0[8] = 0.648461; vanilla(n_xor_ws0, xor_ws0, LAYERS, &xor_ws0_format[0], 1000000, 0.3); delete[] xor_ws0; return EXIT_SUCCESS;}