ae2f_docs
Slp.auto.h
Go to the documentation of this file.
1#undef __ae2f_MACRO_GENERATED
2#define __ae2f_MACRO_GENERATED 1
3#ifndef ae2f_Ann_Slp_c
5#include <ae2f/Ann/Slp.h>
6#undef __ae2f_MACRO_GENERATED
7#define __ae2f_MACRO_GENERATED 1
8#endif
9
10#define ae2f_Ann_Slp_c
11
13#include <stdlib.h>
14#undef __ae2f_MACRO_GENERATED
15#define __ae2f_MACRO_GENERATED 1
16#include <assert.h>
17#undef __ae2f_MACRO_GENERATED
18#define __ae2f_MACRO_GENERATED 1
19#endif /** for non-builds */
20
21#define __ae2f_AnnSlpDel free
22#define __ae2f_AnnSlpDel_C free
23
25#define __ae2f_AnnSlpInitInpSz_imp(
26 /** tparam */
27
28
29 /** param */
30 /* , size_t */ v_init,
31 /* ae2f_float_t* const */ weight_opt,
32 /* ae2f_float_t* const */ bias_opt,
33 /* ae2f_float_t* const */ cache_opt,
34 /* const size_t */ inc,
35 /* const size_t */ outc \
36)\
37{
38 (v_init) =
39 sizeof(ae2f_AnnSlp)
40 + ((weight_opt) ? 0 : (inc) * (outc)) * sizeof(ae2f_float_t)
41 + ((bias_opt) ? 0 : (outc)) * sizeof(ae2f_float_t)
42 + ((cache_opt) ? 0 : (outc) * sizeof(ae2f_float_t))
43 ; \
44}
45
46#define __ae2f_AnnSlpInit_imp(
47 /** tparam */
48
49
50 /** param */
51 /* , size_t */ v_init,
52 /* ae2f_AnnSlp_t */ _this,
53 /* const size_t */ inc,
54 /* const size_t */ outc,
55 /* const size_t */ incmax_opt \
56)\
57{
58 /* Calculate maximum input size */
59 unless(incmax_opt) {
61 v_init, 0, 0, 0, inc, outc
62 );
63 (_this).m_inc = (inc);
64 } else {
65 (_this).m_inc = (incmax_opt);
66 }
67
68 (_this).m_outc = (outc); \
69}
70
71
72#define __ae2f_AnnSlpInit(
73 /** tparam */
74
75
76 /** param */
77 /* ,ae2f_AnnSlp_t* const */ _this,
78 /* const size_t */ inc,
79 /* const size_t */ outc,
80 /* const size_t */ offset_opt,
81 /* ae2f_err_t* const */ err_opt,
82 /* size_t* const */ initsz_opt \
83)\
84{
85 if((err_opt) && *(err_opt))
86 ;
87 unless(_this)
88 (err_opt) && (*(err_opt) |= ae2f_errGlob_PTR_IS_NULL);
89 else {
90 size_t v_init;
92 v_init
93 , *(_this)
94 , inc, outc
95 , 0
96 );
97 (initsz_opt) && (*(initsz_opt) = v_init + offset_opt);
98 } \
99}
100
101#else
102#undef __ae2f_AnnSlpInitInpSz_imp
103#define __ae2f_AnnSlpInitInpSz_imp(...)
104 typedef char NO_ae2f_NEED_CLASS[-1]
105
106#undef __ae2f_AnnSlpInit_imp
107#define __ae2f_AnnSlpInit_imp(...)
108 typedef char NO_ae2f_NEED_CLASS[-1]
109
110#undef __ae2f_AnnSlpInit
111#define __ae2f_AnnSlpInit(...)
112 typedef char NO_ae2f_NEED_CLASS[-1]
113#endif
114
115
116
117#define __ae2f_AnnSlpInit_C __ae2f_AnnSlpInit
118
120#define __ae2f_AnnSlpMk_imp(
121 /** tparam */
122
123
124 /** param */
125 /* , ae2f_AnnSlpMk_t */ v_mk,
126 /* ae2f_float_t* const */ weight_opt,
127 /* ae2f_float_t* const */ bias_opt,
128 /* ae2f_float_t* const */ cache_opt,
129 /* const size_t */ inc,
130 /* const size_t */ outc,
131 /* const size_t */ offset_opt,
132 /* const size_t */ extra_opt,
133 /* ae2f_optae2f_AnnAct_t* const */ act,
134 /* ae2f_optae2f_AnnAct_t* const */ actderiv,
135 /* ae2f_AnnLoss_t* const */ lossderiv,
136 /* ae2f_float_t */ learningrate,
137 /* ae2f_float_t */ learningrate_bias \
138)\
139{
140 __ae2f_AnnSlpInitInpSz_imp(v_mk.m_stack, weight_opt, bias_opt, cache_opt, inc, outc);
141 if((v_mk.m_ptr = ae2f_reinterpret_cast(
142 ae2f_AnnSlp*
143 , calloc((v_mk).m_stack + (offset_opt) + (extra_opt), 1)))
144 ) {
145 (v_mk).m_alloccount = 0;
146 (v_mk).m_fieldptr.b = (v_mk).m_ptr + 1;
147 (v_mk).m_fieldptr.b = ae2f_reinterpret_cast(
148 ae2f_AnnSlp*
149 , ae2f_reinterpret_cast(char*, (v_mk).m_fieldptr.b) + (offset_opt)
150 );
151
152 if(weight_opt) {
153 (v_mk).m_ptr->m_weight = (weight_opt);
154 } else {
155 (v_mk).m_ptr->m_weight = ((v_mk).m_fieldptr.a);
156 (v_mk).m_fieldptr.a += (inc) * (outc);
157 }
158
159 if(bias_opt) {
160 (v_mk).m_ptr->m_bias = (bias_opt);
161 } else {
162 (v_mk).m_ptr->m_bias = (v_mk).m_fieldptr.a;
163 (v_mk).m_fieldptr.a += (outc);
164 }
165
166 if(cache_opt) {
167 (v_mk).m_ptr->m_cache = (cache_opt);
168 } else {
169 (v_mk).m_ptr->m_cache = (v_mk).m_fieldptr.a;
170 }
171
173 (v_mk).m_stack
174 , v_mk.m_ptr->m_Slp[0]
175 , inc
176 , outc
177 , inc
178 );
179
180 (v_mk).m_ptr[0].m_act = act;
181 (v_mk).m_ptr[0].m_actderiv = actderiv;
182 (v_mk).m_ptr[0].m_lossderiv = lossderiv;
183 (v_mk).m_ptr[0].m_learningrate = learningrate;
184 (v_mk).m_ptr[0].m_learningrate_bias = learningrate_bias;
185 } \
186}
187
188#define __ae2f_AnnSlpMk(
189 /** tparam */
190
191
192 /** param */
193 /* ,ae2f_float_t* const */ weight_opt,
194 /* ae2f_float_t* const */ bias_opt,
195 /* ae2f_float_t* const */ cache_opt,
196 /* const size_t */ inc,
197 /* const size_t */ outc,
198 /* const size_t */ offset_opt,
199 /* const size_t */ extra_opt,
200 /* ae2f_AnnSlp** const */ slp,
201 /* ae2f_optae2f_AnnAct_t* const */ act,
202 /* ae2f_optae2f_AnnAct_t* const */ actderiv,
203 /* ae2f_AnnLoss_t* const */ lossderiv,
204 /* ae2f_float_t */ learningrate,
205 /* ae2f_float_t */ learningrate_bias,
206 /* ae2f_optae2f_err_t* const */ err_opt \
207)\
208{
209 if((err_opt) && *(err_opt))
210 ;
211 else unless(slp)
212 (err_opt) && (*(err_opt) |= ae2f_errGlob_PTR_IS_NULL);
213 else {
214 ae2f_AnnSlpMk_t v_mk;
216 v_mk
217 , weight_opt, bias_opt, cache_opt
218 , inc
219 , outc, offset_opt, extra_opt
220
221 , act, actderiv, lossderiv
222
223 , learningrate, learningrate_bias
224 );
225
226 (err_opt) && !(*(slp) = v_mk.m_ptr) &&
227 (*(err_opt) |= ae2f_errGlob_PTR_IS_NULL);
228 } \
229}
230#else
231#undef __ae2f_AnnSlpMk_imp
232#define __ae2f_AnnSlpMk_imp(...)
233 typedef char NO_ae2f_NEED_CLASS[-1]
234
235#undef __ae2f_AnnSlpMk
236#define __ae2f_AnnSlpMk(...)
237 typedef char NO_ae2f_NEED_CLASS[-1]
238#endif
239
240#define __ae2f_AnnSlpMk_C __ae2f_AnnSlpMk
241
242/** @param v_predict has m_ret. That is the return value. */
243#define __ae2f_AnnSlpPredictOne_imp(
244 /** tparam */
245
246
247 /** param */
248 /* , ae2f_AnnSlpPredictOne_t */ v_predict,
249 /* constae2f_float_t* const */ prm_in,
250 /* constae2f_float_t* const */ weight,
251 /* const ae2f_float_t */ bias,
252 /* ae2f_AnnAct_t */ act_opt,
253 /* const size_t */ oidx,
254 /* const size_t */ isz \
255)\
256{
257 (v_predict).m_tmp = 0;
258
259 for((v_predict).m_j = (isz); (v_predict).m_j--; ) {
260 (v_predict).m_tmp
261 += (prm_in)[(v_predict).m_j]
262 * ((weight) + (oidx) * (isz))[(v_predict).m_j];
263 }
264
265 act_opt((&(v_predict).m_ret), ((v_predict).m_tmp + (bias))); \
266}
267
268#define __ae2f_AnnSlpPredict_imp(
269 /** tparam */
270
271
272 /** param */
273 /* , ae2f_AnnSlpPredict_t */ v_predict,
274 /* const ae2f_AnnSlp_t */ _this,
275 /* constae2f_float_t* const */ prm_in,
276 /* ae2f_float_t* const */ out,
277 /* constae2f_float_t* const */ weight,
278 /* constae2f_float_t* const */ bias,
279 /* ae2f_AnnAct_t */ act_opt \
280)\
281{
282 for((v_predict).m_i = (_this).m_outc; (v_predict).m_i--; )
283 {
285 v_predict
286 , prm_in
287 , weight
288 , (bias)[(v_predict).m_i]
289 , act_opt
290 , (v_predict).m_i
291 , (_this).m_inc
292 );
293
294 (out)[(v_predict).m_i] = (v_predict).m_ret;
295 } \
296}
297
298#define __ae2f_AnnSlpPredict(
299 /** tparam */
300
301
302 /** param */
303 /* ,ae2f_err_t* const */ err_opt,
304 /* constae2f_AnnSlp_t* const */ _this,
305 /* constae2f_float_t* const */ prm_in,
306 /* ae2f_float_t* const */ out,
307 /* constae2f_float_t* const */ weight,
308 /* constae2f_float_t* const */ bias,
309 /* ae2f_AnnAct_t */ act_opt \
310)\
311{
312 if((err_opt) && *(err_opt))
313 ;
314 else unless((_this) && (prm_in) && (out) && (weight) && (bias))
315 (err_opt) && ((err_opt) && (*(err_opt) |= ae2f_errGlob_PTR_IS_NULL));
316 else {
317 ae2f_AnnSlpPredict_t v_predict;
318
319 if(act_opt) {
321 (v_predict)
322 , *(_this), (prm_in), out
323 , weight, bias, act_opt
324 );
325 } else {
327 (v_predict)
328 , *(_this), prm_in, out
329 , weight, bias,
330 );
331 }
332 } \
333}
334
336#define __ae2f_AnnSlpPredict_C(
337 /** tparam */
338
339
340 /** param */
341 /* ,ae2f_err_t* const */ err_opt,
342 /* constae2f_AnnSlp* const */ _this,
343 /* constae2f_float_t* const */ prm_in,
344 /* ae2f_float_t* const */ out \
345)\
346{
347 unless(_this)
348 (err_opt) && (*(err_opt) |= ae2f_errGlob_PTR_IS_NULL);
349 else {
351 err_opt, (_this)->m_Slp
352 , prm_in, out
353 , (_this)->m_weight
354 , (_this)->m_bias
355 , (_this)->m_act
356 );
357 } \
358}
359#else
360#undef __ae2f_AnnSlpPredict_C
361#define __ae2f_AnnSlpPredict_C(...)
362 typedef char NO_ae2f_NEED_CLASS[-1]
363#endif
364
365/** @brief Weights */
366#define __ae2f_AnnSlpFollowOneW_imp(
367 /** tparam */
368
369
370 /** param */
371 /* , const ae2f_float_t */ inp,
372 /* const ae2f_float_t */ delta,
373 /* ae2f_float_t* const */ weight,
374 /* const ae2f_float_t */ learningrate,
375 /* const size_t */ inp_sz,
376 /* const size_t */ inp_idx,
377 /* const size_t */ out_sz,
378 /* const size_t */ out_idx \
379)\
380{
381 ((weight) + (inp_sz) * (out_idx))[(inp_idx)]
382 -= (delta) * (inp) * (learningrate); \
383}
384
385#define __ae2f_AnnSlpFollowOneB_imp(
386 /** tparam */
387
388
389 /** param */
390 /* , ae2f_float_t */ r_bias,
391 /* const ae2f_float_t */ delta,
392 /* const ae2f_float_t */ learningrate_bias \
393){ (r_bias) -= (delta) * (learningrate_bias); }
394
395#define __ae2f_AnnSlpFollowOne_imp(
396 /** tparam */
397
398
399 /** param */
400 /* , ae2f_AnnSlpFollowOne_t */ v_follow,
401 /* constae2f_float_t* */ prm_in,
402 /* const ae2f_float_t */ delta,
403 /* ae2f_float_t* const */ weight,
404 /* const ae2f_float_t */ learningrate,
405 /* const ae2f_float_t */ learningrate_bias,
406 /* const size_t */ inp_sz,
407 /* const size_t */ out_idx,
408 /* ae2f_float_t */ v_bias \
409)\
410{
411 for((v_follow).m_j = 0; (v_follow).m_j < (inp_sz); ++(v_follow).m_j) {
412 ((weight) + (inp_sz) * (out_idx))[(v_follow).m_j]
413 -= (delta) * (prm_in)[(v_follow).m_j] * (learningrate);
414 }
415
416 (v_bias) -= (delta) * (learningrate_bias); \
417}
418
419
420#define __ae2f_AnnSlpFollow_imp(
421 /** tparam */
422
423
424 /** param */
425 /* , ae2f_AnnSlpFollow_t */ v_follow,
426 /* const ae2f_AnnSlp_t */ _this,
427 /* constae2f_float_t* const */ prm_in,
428 /* constae2f_float_t* const */ delta,
429 /* ae2f_float_t* const */ weight,
430 /* ae2f_float_t* const */ bias,
431 /* const ae2f_float_t */ learningrate,
432 /* const ae2f_float_t */ learningrate_bias \
433)\
434{
435 for(v_follow.m_i = (_this).m_outc; (v_follow).m_i--; ) {
437 v_follow
438 , prm_in
439 , (delta)[v_follow.m_i]
440 , ((weight))
441 , learningrate, learningrate_bias
442 , (_this).m_inc
443 , (v_follow).m_i
444 , (bias)[v_follow.m_i]
445 );
446 } \
447}
448
449#define __ae2f_AnnSlpFollow(
450 /** tparam */
451
452
453 /** param */
454 /* ,ae2f_err_t* const */ reterr_opt,
455 /* constae2f_AnnSlp_t* const */ _this,
456 /* constae2f_float_t* const */ prm_in,
457 /* constae2f_float_t* const */ delta,
458 /* ae2f_float_t* const */ weight,
459 /* ae2f_float_t* const */ bias,
460 /* const ae2f_float_t */ learningrate,
461 /* const ae2f_float_t */ learningrate_bias \
462)\
463{
464 if((reterr_opt) && *(reterr_opt))
465 ;
466 else if(learningrate == 0 && learningrate_bias == 0)
467 ;
468 else unless((_this) && (prm_in) && (delta) && (weight) && (bias))
469 (reterr_opt) && (*(reterr_opt) |= ae2f_errGlob_PTR_IS_NULL);
470 else {
471 ae2f_AnnSlpFollow_t v_follow;
473 v_follow
474 , *(_this)
475 , prm_in
476 , delta
477 , weight, bias
478 , learningrate
479 , learningrate_bias
480 );
481 } \
482}
483
485#define __ae2f_AnnSlpFollow_C(
486 /** tparam */
487
488
489 /** param */
490 /* ,ae2f_err_t* const */ reterr_opt,
491 /* constae2f_AnnSlp* const */ _this,
492 /* constae2f_float_t* const */ prm_in,
493 /* constae2f_float_t* const */ delta \
494){
495 unless((_this))
496 (reterr_opt) && (*(reterr_opt) |= ae2f_errGlob_PTR_IS_NULL);
497 else {
499 reterr_opt, _this->m_Slp
500 , prm_in, delta
501 , _this->m_weight
502 , (_this)->m_bias
503 , (_this)->m_learningrate, (_this)->m_learningrate_bias
504 );
505 } \
506}
507#else
508#undef __ae2f_AnnSlpFollow_C
509#define __ae2f_AnnSlpFollow_C(...)
510 typedef char NO_ae2f_NEED_CLASS[-1]
511#endif
512
513#define __ae2f_AnnSlpFetchDeltaOne_imp(
514 /** tparam */
515
516
517 /** param */
518 /* , ae2f_float_t */ v_fetchdelta_0,
519 /* ae2f_float_t */ v_fetchdelta_1,
520 /* constae2f_float_t* const */ out,
521 /* constae2f_float_t* const */ out_desired,
522 /* ae2f_AnnAct_t */ actderiv_opt,
523 /* ae2f_AnnLoss_t */ lossderiv,
524 /* ae2f_float_t */ retdelta,
525 /* const size_t */ oidx,
526 /* const size_t */ osz \
527)\
528{
529 actderiv_opt(&(v_fetchdelta_0), (out)[oidx]);
530 lossderiv((&(v_fetchdelta_1)), (out), (out_desired), (oidx), (osz));
531
532 (retdelta) =
533 (v_fetchdelta_0) *
534 (v_fetchdelta_1)
535 ; \
536}
537
538#define __ae2f_AnnSlpFetchDelta_imp(
539 /** tparam */
540
541
542 /** param */
543 /* , ae2f_AnnSlpFetchDelta_t */ v_delta,
544 /* const ae2f_AnnSlp_t */ slp,
545 /* constae2f_float_t* const */ out,
546 /* constae2f_float_t* const */ out_desired,
547 /* ae2f_AnnAct_t */ actderiv_opt,
548 /* ae2f_AnnLoss_t */ lossderiv,
549 /* ae2f_float_t* const */ retdelta \
550)\
551{
552 for((v_delta).m_i = (slp).m_outc; (v_delta).m_i--; )
554 (v_delta).m_tmp, (v_delta).m_tmp1
555 , out, out_desired
556 , actderiv_opt, lossderiv
557 , (retdelta)[v_delta.m_i]
558 , (v_delta).m_i
559 , (slp).m_outc
560 ); \
561}
562
563#define __ae2f_AnnSlpFetchDelta(
564 /** tparam */
565
566
567 /** param */
568 /* , ae2f_optae2f_err_t* const */ err,
569 /* constae2f_AnnSlp_t* const */ slp,
570 /* constae2f_float_t* const */ out,
571 /* constae2f_float_t* const */ out_desired,
572 /* ae2f_AnnAct_t */ actderiv_opt,
573 /* ae2f_AnnLoss_t */ lossderiv,
574 /* ae2f_float_t* const */ retdelta \
575) \
576{
577 if((err) && *(err))
578 ;
579 else unless((slp) && (out) && (out_desired) && (retdelta))
580 (err) && (*(err) |= ae2f_errGlob_PTR_IS_NULL);
581 else unless(lossderiv)
582 (err) && (*(err) |= ae2f_errGlob_IMP_NOT_FOUND);
583
584 else if(actderiv_opt) {
585 ae2f_AnnSlpFetchDelta_t v_delta;
587 v_delta, (*(slp))
588 , out, out_desired
589 , actderiv_opt
590 , lossderiv
591 , retdelta
592 );
593 } else {
594 ae2f_AnnSlpFetchDelta_t v_delta;
596 v_delta, (*(slp))
597 , out, out_desired
598 , , lossderiv
599 , retdelta
600 );
601 } \
602}
603
605#define __ae2f_AnnSlpFetchDelta_C(
606 /** tparam */
607
608
609 /** param */
610 /* , ae2f_optae2f_err_t* const */ err,
611 /* constae2f_AnnSlp* const */ slp,
612 /* constae2f_float_t* const */ out,
613 /* constae2f_float_t* const */ out_desired,
614 /* ae2f_float_t* const */ retdelta \
615)\
616{
617 if((err) && *(err))
618 ;
619 else unless((slp) && (out) && (out_desired) && (retdelta))
620 (err) && (*(err) |= ae2f_errGlob_PTR_IS_NULL);
621 else unless((slp)->m_lossderiv)
622 (err) && (*(err) |= ae2f_errGlob_IMP_NOT_FOUND);
623 else {
624 if((slp)->m_actderiv) {
625 ae2f_AnnSlpFetchDelta_t v_delta;
627 v_delta, (slp)->m_Slp[0]
628 , out, out_desired
629 , (slp)->m_actderiv, (slp)->m_lossderiv
630 , retdelta
631 );
632 } else {
633 ae2f_AnnSlpFetchDelta_t v_delta;
635 v_delta, (slp)->m_Slp[0]
636 , out, out_desired
637 , , (slp)->m_lossderiv
638 , retdelta
639 );
640 }
641 } \
642}
643#else
644#undef __ae2f_AnnSlpFetchDelta_C
645#define __ae2f_AnnSlpFetchDelta_C(...)
646 typedef char NO_ae2f_NEED_CLASS[-1]
647#endif
648
649#define __ae2f_AnnSlpFitOne_imp(
650 /** tparam */
651
652
653 /** param */
654 /* , ae2f_AnnSlpFitOne_t */ v_fit,
655 /* constae2f_float_t* const */ inp,
656 /* constae2f_float_t* const */ out,
657 /* constae2f_float_t* const */ out_desired,
658 /* ae2f_float_t* const */ weight,
659 /* ae2f_float_t */ r_bias,
660 /* ae2f_float_t */ r_cachedelta,
661 /* ae2f_AnnAct_t */ actderiv_opt,
662 /* ae2f_AnnLoss_t */ lossderiv,
663 /* const ae2f_float_t */ learningrate,
664 /* const ae2f_float_t */ learningrate_bias,
665 /* const size_t */ iidx,
666 /* const size_t */ oidx,
667 /* const size_t */ isz,
668 /* const size_t */ osz \
669)\
670{
672 (v_fit).m_tmp, (v_fit).m_tmp1
673 , out, out_desired
674 , actderiv_opt, lossderiv
675 , r_cachedelta
676 , oidx, osz
677 );
678
679
681 v_fit, inp, r_cachedelta, weight
682 , learningrate, learningrate_bias
683 , isz, oidx, r_bias
684 ); \
685}
686
687#define __ae2f_AnnSlpFit_imp(
688 /** tparam */
689
690
691 /** param */
692 /* , ae2f_AnnSlpFit_t */ v_fit,
693 /* const ae2f_AnnSlp_t */ slp,
694 /* constae2f_float_t* const */ inp,
695 /* constae2f_float_t* const */ out,
696 /* constae2f_float_t* const */ out_desired,
697 /* ae2f_float_t* const */ weights,
698 /* ae2f_float_t* const */ bias,
699 /* ae2f_float_t* const */ cachedelta,
700 /* ae2f_AnnAct_t */ actderiv_opt,
701 /* ae2f_AnnLoss_t */ lossderiv,
702 /* const ae2f_float_t */ learningrate,
703 /* const ae2f_float_t */ learningrate_bias \
704)\
705{
707 v_fit, slp
708 , out, out_desired
709 , actderiv_opt, lossderiv
710 , cachedelta
711 );
712
714 v_fit, slp, inp
715 , cachedelta, weights, bias
716 , learningrate, learningrate_bias
717 ); \
718}
719
720#define __ae2f_AnnSlpFit(
721 /** tparam */
722
723
724 /** param */
725 /* ,ae2f_err_t* const ae2f_opt */ reterr_opt,
726 /* constae2f_AnnSlp_t* */ _this,
727 /* constae2f_float_t* const */ prm_inp,
728 /* constae2f_float_t* const */ prm_out,
729 /* constae2f_float_t* const */ prm_out_desired,
730 /* ae2f_float_t* const */ weights,
731 /* ae2f_float_t* const */ bias,
732 /* ae2f_float_t* const */ cachedelta,
733 /* ae2f_AnnAct_t ae2f_opt */ actderiv_opt,
734 /* ae2f_AnnLoss_t */ lossderiv,
735 /* const ae2f_float_t */ learningrate,
736 /* const ae2f_float_t */ learningrate_bias \
737)\
738{
739 if((reterr_opt) && *(reterr_opt))
740 ;
741 else unless((_this) && (prm_inp) && (prm_out_desired) && (weights) && (bias) && (cachedelta))
742 (reterr_opt) && (*(reterr_opt) |= ae2f_errGlob_PTR_IS_NULL);
743 else unless(lossderiv)
744 (reterr_opt) && (*(reterr_opt) |= ae2f_errGlob_IMP_NOT_FOUND);
745 else if ((learningrate) == 0 && (learningrate_bias) == 0)
746 ;
747 else {
748 ae2f_AnnSlpFit_t v_fit;
749 if(actderiv_opt) {
751 v_fit
752 , (*(_this))
753 , prm_inp
754 , prm_out
755 , prm_out_desired
756 , weights
757 , bias
758 , cachedelta
759 , actderiv_opt
760 , lossderiv
761 , learningrate
762 , learningrate_bias
763 );
764 } else {
766 v_fit
767 , (*(_this))
768 , prm_inp
769 , prm_out
770 , prm_out_desired
771 , weights
772 , bias
773 , cachedelta
774 ,
775 , lossderiv
776 , learningrate
777 , learningrate_bias
778 );
779 }
780 } \
781}
782
784#define __ae2f_AnnSlpFit_C(
785 /** tparam */
786
787
788 /** param */
789 /* ,ae2f_err_t* const */ reterr_opt,
790 /* constae2f_AnnSlp* const */ _this,
791 /* constae2f_float_t* const */ prm_inp,
792 /* constae2f_float_t* const */ prm_out,
793 /* constae2f_float_t* const */ prm_out_desired \
794){
795 unless(_this) {
796 ((reterr_opt) && (*(reterr_opt)|= ae2f_errGlob_PTR_IS_NULL));
797 }
798 else {
800 reterr_opt
801 , (_this)->m_Slp
802 , prm_inp
803 , prm_out
804 , prm_out_desired
805 , (_this)->m_weight
806 , (_this)->m_bias
807 , (_this)->m_cache
808 , (_this)->m_actderiv
809 , (_this)->m_lossderiv
810 , (_this)->m_learningrate
811 , (_this)->m_learningrate_bias
812 );
813 } \
814}
815#else
816#undef __ae2f_AnnSlpFit_C
817#define __ae2f_AnnSlpFit_C(...)
818 typedef char NO_ae2f_NEED_CLASS[-1]
819#endif
820
821#define __ae2f_AnnSlpTrainOne_imp(
822 /** tparam */
823
824
825 /** param */
826 /* , ae2f_AnnSlpTrainOne_t */ v_train,
827 /* ae2f_opt ae2f_AnnAct_t */ act,
828 /* ae2f_opt ae2f_AnnAct_t */ actderiv,
829 /* ae2f_AnnLoss_t */ lossderiv,
830 /* constae2f_float_t* const */ inp,
831 /* ae2f_float_t* const */ out_cache,
832 /* constae2f_float_t* const */ out_desired,
833 /* ae2f_float_t* const */ weight,
834 /* ae2f_float_t */ v_bias,
835 /* ae2f_float_t */ r_cachedelta,
836 /* const ae2f_float_t */ learningrate,
837 /* const ae2f_float_t */ learningrate_bias,
838 /* const size_t */ oidx,
839 /* const size_t */ osz,
840 /* const size_t */ isz \
841)\
842{
844 v_train
845 , inp
846 , weight
847 , v_bias
848 , act
849 , oidx
850 , isz
851 );
852
853 (out_cache)[oidx] = (v_train).m_ret;
854
856 v_train
857 , inp
858 , out_cache, out_desired
859 , weight
860 , v_bias
861 , r_cachedelta
862 , actderiv, lossderiv
863 , learningrate, learningrate_bias
864 , iidx, oidx, isz, osz
865 ); \
866}
867
868#define __ae2f_AnnSlpTrain_imp(
869 /** tparam */
870
871
872 /** param */
873 /* , ae2f_AnnSlpTrain_t */ v_train,
874 /* const ae2f_AnnSlp_t */ slp,
875 /* constae2f_float_t* const */ inp,
876 /* ae2f_float_t* const */ out_cache,
877 /* constae2f_float_t* const */ out_desired,
878 /* ae2f_float_t* const */ weights,
879 /* ae2f_float_t* const */ bias,
880 /* ae2f_float_t* const */ cachedelta,
881 /* ae2f_opt ae2f_AnnAct_t */ act,
882 /* ae2f_opt ae2f_AnnAct_t */ actderiv,
883 /* ae2f_AnnLoss_t */ lossderiv,
884 /* const ae2f_float_t */ learningrate,
885 /* const ae2f_float_t */ learningrate_bias \
886)\
887{
888 __ae2f_AnnSlpPredict_imp(v_train, slp, inp, out_cache, weights, bias, act);
890 v_train, slp, inp, out_cache, out_desired
891 , weights, bias, cachedelta
892 , actderiv, lossderiv
893 , learningrate, learningrate_bias
894 ); \
895}
896
898#define __ae2f_AnnSlpTrain_C(
899 /** tparam */
900
901
902 /** param */
903 /* ,ae2f_err_t* const */ err,
904 /* ae2f_AnnSlp* */ slp,
905 /* constae2f_float_t* */ inp,
906 /* constae2f_float_t* */ out_desired \
907)\
908{
909 unless(slp)
910 (err) && (*(err) |= ae2f_errGlob_PTR_IS_NULL);
911 else {
913 err, (slp)->m_Slp, inp
914 , (slp)->m_cache
915 , out_desired
916 , (slp)->m_weight
917 , (slp)->m_bias
918 , (slp)->m_cache
919 , (slp)->m_act
920 , (slp)->m_actderiv
921 , (slp)->m_lossderiv
922 , (slp)->m_learningrate
923 , (slp)->m_learningrate_bias
924 );
925 } \
926}
927#else
928#undef __ae2f_AnnSlpTrain_C
929#define __ae2f_AnnSlpTrain_C
930 typedef char NO_ae2f_NEED_CLASS[-1]
931
932#endif
933
934#define __ae2f_AnnSlpTrain(
935 /** tparam */
936
937
938 /** param */
939 /* ,ae2f_err_t* const */ err,
940 /* constae2f_AnnSlp_t* const */ slp,
941 /* constae2f_float_t* const */ inp,
942 /* ae2f_float_t* const */ out_cache,
943 /* constae2f_float_t* const */ out_desired,
944 /* ae2f_float_t* const */ weights,
945 /* ae2f_float_t* const */ bias,
946 /* ae2f_float_t* const */ cachedelta,
947 /* ae2f_optae2f_AnnAct_t* const */ act,
948 /* ae2f_optae2f_AnnAct_t* const */ actderiv,
949 /* ae2f_AnnLoss_t* const */ lossderiv,
950 /* const ae2f_float_t */ learningrate,
951 /* const ae2f_float_t */ learningrate_bias \
952)\
953{
954 if((err) && *(err))
955 ;
956 else unless((slp) && (inp) && (out_cache) && (out_desired) && (weights) && (bias) && (cachedelta))
957 (err) && (*(err) |= ae2f_errGlob_PTR_IS_NULL);
958 else unless(lossderiv)
959 (err) && (*(err) |= ae2f_errGlob_IMP_NOT_FOUND);
960 else if((learningrate) == 0 && (learningrate_bias) == 0)
961 ;
962 else {
963 ae2f_AnnSlpTrain_t v_train;
964 if (act) {
965 if(actderiv) {
967 v_train, (*slp), inp, out_cache
968 , out_desired, weights, bias
969 , cachedelta, act, actderiv, lossderiv
970 , learningrate, learningrate_bias
971 );
972 } else {
974 v_train, (*slp), inp, out_cache
975 , out_desired, weights, bias
976 , cachedelta, act, , lossderiv
977 , learningrate, learningrate_bias
978 );
979
980 }
981 } else {
982 if(actderiv) {
984 v_train, (*slp), inp, out_cache
985 , out_desired, weights, bias
986 , cachedelta, , actderiv, lossderiv
987 , learningrate, learningrate_bias
988 );
989 } else {
991 v_train, (*slp), inp, out_cache
992 , out_desired, weights, bias
993 , cachedelta, , , lossderiv
994 , learningrate, learningrate_bias
995 );
996
997 }
998 }
999 } \
1000}
1001
1002
1003#endif
1004
1005#undef __ae2f_MACRO_GENERATED
1006
1007#define __ae2f_MACRO_GENERATED 0
void ae2f_AnnAct_t(ae2f_float_t *ret, ae2f_float_t x)
Customisable activasion function type.
Definition Act.h:19
void ae2f_AnnLoss_t(ae2f_float_t *ret, const ae2f_float_t *out, const ae2f_float_t *goal, size_t index, size_t count)
Specify the way of calculating loss.
Definition Act.h:29
#define ae2f_AnnUtilV2Name(A_t, B_t)
Definition Util.h:11
#define ae2f_AnnUtilV2(A_LEFT, A_t, A_POST, B_LEFT, B_t, B_POST)
Definition Util.h:14
#define ae2f_AnnUtilPtr2Name(A_t, B_t)
Definition Util.h:8
#define ON
Definition cmake.hpp:5
#define ae2f_structdef(key, name)
Definition Cast.h:110
#define ae2f_reinterpret_cast(t, v)
Definition Cast.h:52
#define unless(...)
Invokes when condition is false.
Definition Cast.h:103
#define ae2f_extern
Suggests the existence of external variable or function, in naming of C. [non-mangling].
Definition Cast.h:88
#define ae2f_structdef_n(key, name,...)
Definition Cast.h:109
#define ae2f_WhenCXX(...)
Appears when the current language is C.
Definition Cxx.h:34
#define ae2f_NONE
Literally nothing.
Definition Cxx.h:13
ae2f_float ae2f_float_t
Definition Float.h:38
#define ae2f_LP(...)
Desired count required.
Definition Guide.h:23
#define ae2f_FREE(...)
Use this marker to show the desired functions to effectively free the resources.
Definition Guide.h:33
#define ae2f_opt
Definition Guide.h:26
#define ae2f_MAC_BUILD
Definition Util.h:4
#define ae2f_NEED_CLASS
Definition Mlp.cl.c:1
const ae2f_AnnMlp_t const ae2f_float_t *const inp
Definition Mlp.def.cc:318
size_t const ae2f_AnnSlp_t ae2f_float_t *const const ae2f_float_t *const ae2f_AnnAct_t actderiv_then
Definition Mlp.def.cc:508
const ae2f_AnnMlp_t mlp
Definition Mlp.def.cc:317
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const const ae2f_float_t *const const ae2f_float_t *const bias
Definition Mlp.def.cc:323
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const sz
Definition Mlp.def.cc:321
const ae2f_AnnSlp_t slp
Definition Mlp.def.cc:484
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const const ae2f_float_t *const const ae2f_float_t *const ae2f_float_t *const outcache
Definition Mlp.def.cc:325
const ae2f_AnnSlp_t const ae2f_float_t *const const ae2f_float_t *const delta
Definition Mlp.def.cc:486
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const const ae2f_float_t *const weight
Definition Mlp.def.cc:322
const ae2f_AnnSlp_t const ae2f_float_t *const const ae2f_float_t *const const size_t iidx
Definition Mlp.def.cc:488
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const out
Definition Mlp.def.cc:320
size_t const ae2f_AnnSlp_t slp_then
Definition Mlp.def.cc:503
size_t const ae2f_AnnSlp_t ae2f_float_t *const const ae2f_float_t *const deltaseed
Definition Mlp.def.cc:506
#define OPER_NONE
Definition Mlp.def.cc:21
size_t v_send
Definition Mlp.def.cc:502
size_t const ae2f_AnnSlp_t ae2f_float_t *const retdelta_then
Definition Mlp.def.cc:505
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const const ae2f_float_t *const const ae2f_float_t *const ae2f_float_t *const ae2f_AnnAct_t *const *const act_opt
Definition Mlp.def.cc:327
#define OPER_NEG
Definition Mlp.def.cc:20
ae2f_SHAREDEXPORT void ae2f_AnnSlpFit(ae2f_err_t *restrict const reterr_opt, const ae2f_AnnSlp *restrict const _this, ae2f_LP(_this::inc) const ae2f_float_t *restrict const prm_inp, ae2f_LP(_this::outc) const ae2f_float_t *restrict const prm_out, ae2f_LP(_this::outc) const ae2f_float_t *restrict const prm_out_desired) noexcept
Definition Slp.imp.c:82
ae2f_SHAREDEXPORT void ae2f_AnnSlpFetchDelta(ae2f_opt ae2f_err_t *restrict const err, const ae2f_AnnSlp *restrict slp, ae2f_LP(slp::outc) const ae2f_float_t *restrict const out, ae2f_LP(slp::outc) const ae2f_float_t *restrict const out_desired, ae2f_LP(slp::outc) ae2f_float_t *restrict const retdelta) noexcept
Definition Slp.imp.c:97
ae2f_SHAREDEXPORT void ae2f_AnnSlpTrain(ae2f_err_t *restrict const err, ae2f_AnnSlp *restrict slp, ae2f_LP(slp::inc) const ae2f_float_t *restrict inp, ae2f_LP(slp::outc) const ae2f_float_t *restrict out_desired) noexcept
Definition Slp.imp.c:110
ae2f_SHAREDEXPORT void ae2f_AnnSlpPredict(ae2f_err_t *restrict const err_opt, const ae2f_AnnSlp *restrict const _this, const ae2f_float_t *restrict const prm_in, ae2f_float_t *restrict const out) noexcept
Definition Slp.imp.c:59
ae2f_SHAREDEXPORT void ae2f_AnnSlpDel(ae2f_AnnSlp *restrict const slp) noexcept
Definition Slp.imp.c:55
ae2f_SHAREDEXPORT void ae2f_AnnSlpFollow(ae2f_err_t *const restrict reterr_opt, const ae2f_AnnSlp *restrict const _this, const ae2f_float_t *restrict const prm_in, const ae2f_float_t *restrict const delta) noexcept
Definition Slp.imp.c:73
ae2f_SHAREDEXPORT void ae2f_AnnSlpMk(ae2f_LP(inc *outc) ae2f_float_t *restrict const weight_opt, ae2f_LP(outc) ae2f_float_t *restrict const bias_opt, ae2f_LP(outc) ae2f_float_t *restrict const cache_opt, const size_t inc, const size_t outc, const size_t offset_opt, const size_t extra_opt, ae2f_FREE(ae2f_AnnSlpDel, __ae2f_AnnSlpDel) ae2f_AnnSlp *restrict *restrict const slp, ae2f_opt ae2f_AnnAct_t *const act, ae2f_opt ae2f_AnnAct_t *const actderiv, ae2f_AnnLoss_t *const lossderiv, ae2f_float_t learningrate, ae2f_float_t learningrate_bias, ae2f_opt ae2f_err_t *restrict const err_opt) noexcept
Definition Slp.imp.c:26
ae2f_SHAREDEXPORT void ae2f_AnnSlpInit(ae2f_AnnSlp_t *restrict const _this, const size_t inc, const size_t outc, const size_t offset_opt, ae2f_err_t *restrict const err_opt, size_t *restrict const initsz_opt) noexcept __ae2f_AnnSlpInit_C(_this
#define ae2f_errGlob_ALLOC_FAILED
stdlib allocating functions (malloc, calloc, realloc) has been failed.
Definition errGlob.h:40
uint8_t ae2f_err_t
Informs that this number represents the error.
Definition errGlob.h:19
#define ae2f_errGlob_PTR_IS_NULL
Failed to refer the pointer either l-value inside the function.
Definition errGlob.h:32
#define ae2f_errGlob_IMP_NOT_FOUND
Failed to find the function on preprocessor which is callable for some reason No operation has beed d...
Definition errGlob.h:28
#define __ae2f_AnnMlpFollowPrimal(...)
Definition Mlp.auto.h:756
#define __ae2f_AnnMlpHidDeltaSingle_imp(v_single, slp, weight, delta, iidx)
Definition Mlp.auto.h:503
#define __ae2f_MACRO_GENERATED
Definition Mlp.auto.h:2
#define __ae2f_AnnMlpTrainAutoPrimal(...)
Definition Mlp.auto.h:897
#define __ae2f_AnnMlpPropagate_imp(v_tmp, v_send, slp_then, retdelta_then, deltaseed, actderiv_then, inp)
delta to delta
Definition Mlp.auto.h:525
#define __ae2f_AnnMlpPredictStream_imp(...)
Definition Mlp.auto.h:491
#define __ae2f_AnnMlpFollowPrimal_imp(OPER_NEG, OPER_NONE, v_follow, mlp, inp, delta, lenv, outstream, deltacache, weight, bias, learningrate, learningrate_bias, actderiv)
Definition Mlp.auto.h:552
#define __ae2f_AnnMlpPredictPrimal(...)
Definition Mlp.auto.h:485
#define __ae2f_AnnMlpPredictPrimal_imp(OPER_NEG, OPER_NONE, v_predict, mlp, inp, out, sz, weight, bias, outcache, act_opt)
layer must be more than 2
Definition Mlp.auto.h:330
#define __ae2f_AnnMlpInitWithOutSz_imp(...)
Definition Mlp.auto.h:321
#define __ae2f_AnnMlpTrainPrimal(...)
Definition Mlp.auto.h:894
#define __ae2f_AnnMlpSz_imp(...)
Definition Mlp.auto.h:318
#define __ae2f_AnnMlpTrainPrimal_imp(OPER_NEG, OPER_NONE, v_train, mlp, inp, out, out_desired, lenv, outstream, deltacache, weight, bias, learningrate, learningrate_bias, act, actderiv, lossderiv)
Definition Mlp.auto.h:767
#define __ae2f_AnnMlpMk_imp(...)
Definition Mlp.auto.h:315
#define __ae2f_AnnSlpPredict(err_opt, _this, prm_in, out, weight, bias, act_opt)
Definition Slp.auto.h:298
#define __ae2f_AnnSlpInit_imp(...)
Definition Slp.auto.h:107
#define __ae2f_AnnSlpMk_imp(...)
Definition Slp.auto.h:232
#define __ae2f_AnnSlpTrain_imp(v_train, slp, inp, out_cache, out_desired, weights, bias, cachedelta, act, actderiv, lossderiv, learningrate, learningrate_bias)
Definition Slp.auto.h:868
#define __ae2f_AnnSlpInit(...)
Definition Slp.auto.h:111
#define __ae2f_AnnSlpFit(reterr_opt, _this, prm_inp, prm_out, prm_out_desired, weights, bias, cachedelta, actderiv_opt, lossderiv, learningrate, learningrate_bias)
Definition Slp.auto.h:720
#define __ae2f_AnnSlpFit_imp(v_fit, slp, inp, out, out_desired, weights, bias, cachedelta, actderiv_opt, lossderiv, learningrate, learningrate_bias)
Definition Slp.auto.h:687
#define __ae2f_AnnSlpFitOne_imp(v_fit, inp, out, out_desired, weight, r_bias, r_cachedelta, actderiv_opt, lossderiv, learningrate, learningrate_bias, iidx, oidx, isz, osz)
Definition Slp.auto.h:649
#define __ae2f_AnnSlpPredictOne_imp(v_predict, prm_in, weight, bias, act_opt, oidx, isz)
Definition Slp.auto.h:243
#define __ae2f_AnnSlpFollow_imp(v_follow, _this, prm_in, delta, weight, bias, learningrate, learningrate_bias)
Definition Slp.auto.h:420
#define __ae2f_AnnSlpFollow(reterr_opt, _this, prm_in, delta, weight, bias, learningrate, learningrate_bias)
Definition Slp.auto.h:449
#define __ae2f_AnnSlpTrain(err, slp, inp, out_cache, out_desired, weights, bias, cachedelta, act, actderiv, lossderiv, learningrate, learningrate_bias)
Definition Slp.auto.h:934
#define __ae2f_AnnSlpInitInpSz_imp(...)
Definition Slp.auto.h:103
#define __ae2f_AnnSlpFollowOne_imp(v_follow, prm_in, delta, weight, learningrate, learningrate_bias, inp_sz, out_idx, v_bias)
Definition Slp.auto.h:395
#define __ae2f_AnnSlpMk(...)
Definition Slp.auto.h:236
#define __ae2f_AnnSlpFetchDelta_imp(v_delta, slp, out, out_desired, actderiv_opt, lossderiv, retdelta)
Definition Slp.auto.h:538
#define __ae2f_AnnSlpPredict_imp(v_predict, _this, prm_in, out, weight, bias, act_opt)
Definition Slp.auto.h:268
#define __ae2f_AnnSlpFetchDeltaOne_imp(v_fetchdelta_0, v_fetchdelta_1, out, out_desired, actderiv_opt, lossderiv, retdelta, oidx, osz)
Definition Slp.auto.h:513
#define ae2f_MAC()
delta to delta
Definition mac.h:4