ae2f_docs
SlpTrainAND.c
1#include "ae2f/Float.h"
2#include "ae2f/errGlob.h"
3#include <ae2f/Ann/Slp.h>
4#include <stdio.h>
5#include <math.h>
6
7static ae2f_AnnActFFN_t Act, ActDeriv;
8
9static void
10Act(ae2f_float_t* r, const ae2f_float_t* x, size_t i, size_t c) {
11 r[0] = 1.0 / (1.0 + exp(-x[i]));
12}
13
14static void
15ActDeriv(ae2f_float_t* r, const ae2f_float_t* _output, size_t i, size_t c) {
16 const ae2f_float_t output = _output[i] + 1e-7;
17 r[0] = output * (1.0 - output);
18}
19
20static ae2f_AnnLossFFN_t LossDeriv;
21
22/** Cross entrophy */
23static void
24LossDeriv(ae2f_float_t* r, const ae2f_float_t* output, const ae2f_float_t* target, size_t i, size_t c) {
25 printf("output: %f, goal: %f\n", output[i], target[i]);
26
27 const ae2f_float_t epsilon = 1e-7; // Small value to prevent division by zero
28 ae2f_float_t o_i = output[i];
29 // Clip output to avoid log(0) or division by zero
30 o_i = o_i < epsilon ? epsilon : (o_i > 1.0 - epsilon ? 1.0 - epsilon : o_i);
31 r[0] = (o_i - target[i]) / (c * o_i * (1.0 - o_i));
32}
33
34const ae2f_float_t prm_inp[4][2] = { 1, 1, 0, 0, 0, 1, 1, 0 };
35const ae2f_float_t goal_andor[4][2] = {
36 {1, 1},
37 {0, 0},
38 {0, 1},
39 {0, 1}
40};
41
42ae2f_float_t output[2] = {0, };
43
44ae2f_err_t err = 0;
45ae2f_AnnSlp* slp = 0;
46
47size_t i, j;
48bool mismatch = 0;
49
50#define THRESHOLD 0.01
51#define DIFF_GOOD(a, b) (((a) - (b)) * ((a) - (b))) < THRESHOLD
52
53int tryand() {
54 puts("Trial: tryand");
55 err = 0;
56
57 do {
59 NULL, NULL, NULL
60 , 2
61 , 2, 3, 4
62 , &slp
63 , Act, ActDeriv, LossDeriv
64 , 0.1, 0.1
65 , &err
66 );
67
68 printf("Learningrate dump: %f, %f\n", slp->m_learningrate, slp->m_learningrate_bias);
69 printf("function points: %p %p %p\n", slp->m_act, slp->m_actderiv, slp->m_lossderiv);
70
71 if(err) break;
72
73 for(i = 0 ; i < 2 * 1 + 1; ++i) {
74 slp->m_weight[i << 1] = 0.2;
75 slp->m_weight[(i << 1) + 1] = 0.2;
76 }
77
78 for(i = 0; i < 3000; ++i) {
79 for(j = 0; j < sizeof(prm_inp) / sizeof(prm_inp[0]); ++j) {
80 ae2f_AnnSlpTrain(&err, slp, prm_inp[j], goal_andor[j]);
81 if(err) break;
82 }
83 }
84
85 for(j = 0; j < sizeof(prm_inp) / sizeof(prm_inp[0]); ++j) {
86 ae2f_AnnSlpPredict(&err, slp, prm_inp[j], output);
87 if(err) break;
88
89 printf("Got %f, %f\n", *output, output[1]);
90 if(DIFF_GOOD(output[0], goal_andor[j][0])) {
91 printf("Match. Expected %f\n.", goal_andor[j][0]);
92 } else {
93 printf("Expected %f. Unexpected.\n", goal_andor[j][0]);
94 mismatch = 1;
95 }
96 }
97 } while(0);
98
99 if(mismatch) {
100 err |= ae2f_errGlob_NFOUND;
101 }
102
103 if(slp) ae2f_AnnSlpDel(slp);
104 printf("Code from tryand: %d\n", err);
105
106 return err;
107}
108
109int main() {
110 return tryand();
111}
#define ae2f_errGlob_NFOUND
Found some errors, but not by parameters. The operation has failed.
Definition errGlob.h:50
uint8_t ae2f_err_t
Informs that this number represents the error.
Definition errGlob.h:19
#define THRESHOLD
#define DIFF_GOOD(a, b)
#define ae2f_AnnSlpMk
Definition Slp.h:263
#define ae2f_AnnSlpDel
Definition Slp.h:264
#define ae2f_AnnSlpTrain
Definition Slp.h:268
#define ae2f_AnnSlpPredict
Definition Slp.h:265