1#include <ae2f/Ann/Util.h>
8#if !__ae2f_MACRO_GENERATED
10#include <ae2f/Ann/Slp.h>
16#include <ae2f/Ann/Mlp.h>
32 , ae2f_AnnMlp**
const retmk
35 ,
const size_t*
const szvector
53 if((reterr) && *(reterr)) {}
54 else unless((szvector) && (lossderiv) && (retmk))
60 , depth, szvector, szswap_opt
61 , act, actderiv, lossderiv
62 , deltastream, outcache, weight
63 , bias, learningrate, learningrate_bias
67 assert(v_mk.m_mkbase &&
"Initialising has failed");
68 *(retmk) = v_mk.m_mkbase;
77#define __ae2f_AnnMlpDel_C(...)
78 typedef char NO_ae2f_NEED_CLASS[-1
]
80#define __ae2f_AnnMlpMk_C(...)
81 typedef char NO_ae2f_NEED_CLASS[-1
]
92 ,
const size_t*
const szvector
93 , size_t*
const szswap_opt
111 assert((szvector) &&
"Size vector is null");
112 assert((lossderiv) &&
"Loss deriv must be initialised");
113 assert((depth) > 2 &&
"Depth must be greater than 2");
116 for((v_mk).m_i = (depth); (v_mk).m_i--; ) {
117 assert((szvector)[(v_mk).m_i] &&
"Zero value is permitted");
118 (v_mk).m_outc < (szvector)[(v_mk).m_i] && ((v_mk).m_outc = (szvector)[(v_mk).m_i]);
126 , deltastream, outcache
130 (v_mk).m_mkptr.m_void = calloc(1, (v_mk).m_i + (offset) + (extra));
131 (v_mk).m_mkbase = (v_mk).m_mkptr.m_mlp;
133 if((v_mk).m_mkptr.m_void) {
135 *(v_mk).m_mkptr.m_mlp
142 , (v_mk).m_mkptr.m_mlp + 1)
154 (v_mk).m_mkptr.m_mlp += 1;
155 (v_mk).m_mkptr.m_byte += (offset);
156 (v_mk).m_mkptr.m_sz += (depth);
159 (v_mk).m_mkbase->m_act = (v_mk).m_mkptr.m_Act;
160 (v_mk).m_mkptr.m_Act += (depth) - 1;
164 (v_mk).m_mkbase->m_actderiv = (v_mk).m_mkptr.m_Act;
165 (v_mk).m_mkptr.m_Act += (depth) - 1;
169 (v_mk).m_mkbase->m_deltastream = (v_mk).m_mkptr.m_f;
170 (v_mk).m_mkptr.m_f += ((depth) - 1) * (v_mk).m_outc;
174 (v_mk).m_mkbase->m_outcache = (v_mk).m_mkptr.m_f;
175 (v_mk).m_mkptr.m_f += ((depth) - 1) * (v_mk).m_outc;
179 (v_mk).m_mkbase->m_bias = (v_mk).m_mkptr.m_f;
180 (v_mk).m_mkptr.m_f += ((depth) - 1) * (v_mk).m_outc;
184 (v_mk).m_mkbase->m_weight = (v_mk).m_mkptr.m_f;
193 ,
ae2f_opt const size_t*
const szswap
204 (ret_sz) =
sizeof(ae2f_AnnMlp) + (!(szswap)) *
sizeof(size_t);
205 (ret_sz) += (
sizeof(
void*) * ((depth) - 1)) * (!(act) + !(actderiv));
209 !(deltastream) + !(outcache) + !(bias)
210 + ((!(weight)) * (outc))
214ae2f_MAC() _ae2f_AnnMlpInitWithOutSz_imp(
220 ,
const size_t*
const szvector
221 , size_t*
const szswap_opt
236 assert((depth) >= 2 &&
"At lest you need input and output layer");
237 (v_mlp).m_depth = (depth);
238 (v_mlp).m_outc = (outsz);
240 assert((lossderiv) &&
"loss deriv is null");
241 (v_mlp).m_lossderiv = lossderiv;
243 (v_mlp).m_sz = (szswap_opt);
244 (v_mlp).m_act = (act);
245 (v_mlp).m_actderiv = (actderiv);
247 (v_mlp).m_deltastream = deltastream;
248 (v_mlp).m_outcache = outcache;
249 (v_mlp).m_weight = weight;
250 (v_mlp).m_bias = bias;
252 (v_mlp).m_learningrate = learningrate;
253 (v_mlp).m_learningrate_bias = learningrate_bias;
255 if((szswap_opt) && (szswap_opt) != (szvector))
256 for((v_init) = (depth); (v_init)--; ) {
257 (szswap_opt)[(v_init)] = (szvector)[(v_init)];
263 , ae2f_AnnMlpInit_t v_init
265 ,
const size_t*
const szvector
266 , size_t*
const szswap_opt
283 assert((szvector) &&
"Size vector is null");
284 for((v_init).m_i = (depth); (v_init).m_i--; ) {
285 assert((szvector)[(v_init).m_i] &&
"Zero value is permitted");
286 (v_init).m_outc < (szvector)[(v_init).m_i] && ((v_init).m_outc = (szvector)[(v_init).m_i]);
290 v_mlp, (v_init).m_i, depth, (v_mlp).m_outc
291 , szvector, szswap_opt, act, actderiv, lossderiv
292 , deltastream, outcache, weight, bias, learningrate, learningrate_bias
298#define __ae2f_AnnMlpMk_imp(...)
299 typedef char NO_ae2f_NEED_CLASS[-1
]
301#define __ae2f_AnnMlpSz_imp(...)
302 typedef char NO_ae2f_NEED_CLASS[-1
]
304#define __ae2f_AnnMlpInitWithOutSz_imp(...)
305 typedef char NO_ae2f_NEED_CLASS[-1
]
307#define __ae2f_AnnMlpInit_imp(...)
308 typedef char NO_ae2f_NEED_CLASS[-1
]
313ae2f_MAC(OPER_NEG, OPER_NONE, ) _ae2f_AnnMlpPredictPrimal_imp(
314 ae2f_AnnMlpPredict_t v_predict
320 ,
const size_t*
const sz
328 assert((
mlp).m_depth > 2);
330 (v_predict).m_depth = (
mlp).m_depth - 1;
331 (v_predict).m_outc_max = (
mlp).m_outc;
333 (v_predict).m_inc = (
sz)[0];
334 (v_predict).m_outc = (
sz)[1];
361 (v_predict).m_k < (v_predict).m_depth - 1;
365 (v_predict).m_inc = (v_predict).m_outc;
366 (v_predict).m_outc = (
sz)[(v_predict).m_k + 1];
368 if((
act_opt)[(v_predict).m_k]) {
369 assert((v_predict).m_k);
379 , (
weight) + ((v_predict).m_k) * (
380 (v_predict).m_outc_max
381 * (v_predict).m_outc_max
383 , (
bias) + ((v_predict).m_k) * (v_predict).m_outc_max
392 * (v_predict).m_outc_max
396 * (v_predict).m_outc_max
400 * (v_predict).m_outc_max
401 * (v_predict).m_outc_max)
402 , (
bias) + ((v_predict).m_k) * (v_predict).m_outc_max
408 (v_predict).m_inc = (v_predict).m_outc;
409 (v_predict).m_outc = (
sz)[(v_predict).m_k + 1];
410 assert((v_predict).m_k == (
mlp).m_depth - 2);
418 , (
weight) + ((v_predict).m_k) * (v_predict).m_outc_max * (v_predict).m_outc_max
419 , (
bias) + ((v_predict).m_k) * (v_predict).m_outc_max
428 , ((
weight) + ((v_predict).m_k) * (v_predict).m_outc_max * (v_predict).m_outc_max)
429 , ((
bias) + ((v_predict).m_k) * (v_predict).m_outc_max)
436ae2f_MAC(OPER_NEG, OPER_NONE, ) _ae2f_AnnMlpPredictPrimal(
438 ,
const ae2f_AnnMlp*
const mlp
443 if((reterr) && *(reterr))
445 else unless((mlp) && (inp) && (out)) {
449 ae2f_AnnMlpPredict_t v_predict;
455 , (mlp)->m_sz, (mlp)->m_weight
456 , (mlp)->m_bias, (mlp)->m_outcache
463#define __ae2f_AnnMlpPredictPrimal(...)
464 typedef char NO_ae2f_NEED_CLASS[-1
]
469#define __ae2f_AnnMlpPredictStream_imp(...)
472#define __ae2f_AnnMlpPredictStream_C(reterr, mlp, inp, out)
475#define __ae2f_AnnMlpPredict_imp(...)
478#define __ae2f_AnnMlpPredict_C(...)
482 ae2f_AnnMlpHidDeltaSingle_t v_single
489 (v_single).m_ret = 0;
491 for((v_single).m_i = (
slp).m_outc; (v_single).m_i--; )
494 ((weight) + (
slp).m_inc * (v_single).m_i)[
iidx] * (
delta)[(v_single).m_i];
499ae2f_MAC() _ae2f_AnnMlpPropagate_imp(
517#define __ae2f_AnnMlpFollowStream_imp(...)
521#define __ae2f_AnnMlpFollow_imp(...)
524ae2f_MAC(OPER_NEG, OPER_NONE,) _ae2f_AnnMlpFollowPrimal_imp(
525 ae2f_AnnMlpFollow_t v_follow
526 ,
const ae2f_AnnMlp_t mlp
530 ,
const size_t*
const lenv
544 assert(((mlp).m_depth > 2) &&
"m_depth must be more than 1.");
545 assert((inp) &&
"inp is null");
546 assert((weight) &&
"weight is null");
547 assert((bias) &&
"bias is null");
548 assert((actderiv) &&
"actderiv list is null");
549 assert((delta) &&
"delta is null");
553 (v_follow).m_k = (mlp).m_depth - 2;
556 (v_follow).m_pg_weight = (v_follow).m_pg_out = (mlp).m_outc;
557 (v_follow).m_pg_weight *= (v_follow).m_pg_out;
559 (v_follow).m_outc = (lenv)[(v_follow).m_k + 1];
560 (v_follow).m_inc = (lenv)[(v_follow).m_k];
563
564
568 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
570 , ((weight) + ((v_follow).m_pg_weight * ((v_follow).m_k)))
571 , ((bias) + ((v_follow).m_pg_out * ((v_follow).m_k)))
576 (v_follow).m_j = (v_follow).m_inc;
577 while((v_follow).m_j--) {
581 , ((weight) + ((v_follow).m_pg_weight * (v_follow).m_k))
586 ((deltacache) + (v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG))[(v_follow).m_j]
590 (v_follow).m_outc = (lenv)[(v_follow).m_k];
591 (v_follow).m_inc = (lenv)[(v_follow).m_k - 1];
594 if((actderiv)[(v_follow).m_k - 1]) {
597 , (v_follow).m_stack.m_send
599 , ((deltacache) + ((v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG)))
600 , ((deltacache) + ((v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG)))
601 , (actderiv)[(v_follow).m_k - 1]
602 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
607 , (v_follow).m_stack.m_send
609 , ((deltacache) + (((v_follow).m_pg_out) * ((v_follow).m_k
OPER_NEG)))
610 , ((deltacache) + (((v_follow).m_pg_out) * ((v_follow).m_k
OPER_NEG)))
612 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
617 while(--(v_follow).m_k) {
618 assert((v_follow).m_k);
624
625
629 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
630 , ((deltacache) + (v_follow).m_pg_out * ((v_follow).m_k
OPER_NONE))
631 , ((weight) + ((v_follow).m_pg_weight * (v_follow).m_k))
632 , ((bias) + ((v_follow).m_pg_out * ((v_follow).m_k)))
637 (v_follow).m_j = (v_follow).m_inc;
638 assert((v_follow).m_inc == (lenv)[(v_follow).m_k]);
640 while((v_follow).m_j--) {
641 (v_follow).m_ret = 0;
646 , ((weight) + (v_follow).m_pg_weight * ((v_follow).m_k))
647 , ((deltacache) + (v_follow).m_pg_out * ((v_follow).m_k
OPER_NONE))
651 ((deltacache) + (v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG))[(v_follow).m_j]
655 (v_follow).m_outc = (v_follow).m_inc;
656 (v_follow).m_inc = (lenv)[(v_follow).m_k - 1];
657 assert((v_follow).m_outc == (lenv)[(v_follow).m_k]);
660 if((actderiv)[(v_follow).m_k - 1]) {
663 , (v_follow).m_stack.m_send
665 , ((deltacache) + ((v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG)))
666 , ((deltacache) + ((v_follow).m_pg_out * ((v_follow).m_k
OPER_NEG)))
667 , (actderiv)[(v_follow).m_k - 1]
668 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
673 , (v_follow).m_stack.m_send
675 , ((deltacache) + (((v_follow).m_pg_out) * ((v_follow).m_k
OPER_NEG)))
676 , ((deltacache) + (((v_follow).m_pg_out) * ((v_follow).m_k
OPER_NEG)))
678 , ((outstream) + (v_follow).m_pg_out * ((v_follow).m_k - 1))
683 assert(((v_follow).m_k) == 0 &&
"(v_follow).m_k must be zero.");
684 assert((v_follow).m_inc == (lenv)[0] &&
"inc must be same as first element of lenv.");
685 assert((v_follow).m_outc == (lenv)[1] &&
"outc must be same as second element of lenv.");
691 , ((deltacache) + (v_follow).m_pg_out * ((v_follow).m_k
OPER_NONE))
700ae2f_MAC(OPER_NEG, OPER_NONE,) _ae2f_AnnMlpFollowPrimal(
702 ,
const ae2f_AnnMlp* mlp
708 if((reterr) && *(reterr)) {}
709 else unless((mlp) && (inp) && (delta)) {
710 assert(0 &&
"nullref");
713 ae2f_AnnMlpFollow_t v_follow;
718 , *(mlp), inp, delta, (mlp)->m_sz
719 , (mlp)->m_outcache, (mlp)->m_deltastream
722 , (mlp)->m_learningrate, (mlp)->m_learningrate_bias
730#define __ae2f_AnnMlpFollowPrimal(...)
731 typedef char NO_ae2f_NEED_CLASS[-1
]
735#define __ae2f_AnnMlpFollow_C(...)
738#define __ae2f_AnnMlpFollowStream_C(...)
741ae2f_MAC(OPER_NEG, OPER_NONE, ) _ae2f_AnnMlpTrainPrimal_imp(
742 ae2f_AnnMlpTrain_t v_train
743 ,
const ae2f_AnnMlp_t mlp
748 ,
const size_t*
const lenv
764 assert((lenv) &&
"lengh vector nil");
765 assert(((mlp).m_depth > 2) &&
"I see no hidden layer");
767 assert((actderiv) &&
"actderiv list");
769 (v_train).m_inc = (lenv)[(mlp).m_depth - 3];
770 (v_train).m_outc = (lenv)[(mlp).m_depth - 2];
773 (v_train), mlp, inp, out, lenv,
774 weight, bias, outstream, act
777 if((actderiv)[(mlp).m_depth - 2]) {
779 (v_train), (v_train), (out), (out_desired)
780 , (actderiv)[(mlp).m_depth - 2]
782 , (&((deltacache)[(mlp).m_outc * (((mlp).m_depth - 2)
OPER_NONE)]))
786 (v_train), (v_train), (out), (out_desired)
789 , (&((deltacache)[(mlp).m_outc * (((mlp).m_depth - 2)
OPER_NONE)]))
797 , (&((deltacache)[(mlp).m_outc * (((mlp).m_depth - 2)
OPER_NONE)]))
799 , deltacache, weight, bias
800 , learningrate, learningrate_bias
806ae2f_MAC(OPER_NEG, OPER_NONE, ) _ae2f_AnnMlpTrainPrimal(
808 , ae2f_AnnMlp*
const mlp
814 if((reterr) && *(reterr));
815 else unless((mlp) && (out) && (out_desired) && (inp)) {
816 assert(0 &&
"nullref");
819 ae2f_AnnMlpTrain_t v_train;
822 , v_train, *(mlp), inp
824 , (mlp)->m_sz, (mlp)->m_outcache
825 , (mlp)->m_deltastream
826 , (mlp)->m_weight, (mlp)->m_bias
827 , (mlp)->m_learningrate, (mlp)->m_learningrate_bias
828 , (mlp)->m_act, (mlp)->m_actderiv, (mlp)->m_lossderiv
833ae2f_MAC(OPER_NEG, OPER_NONE, ) _ae2f_AnnMlpTrainAutoPrimal(
835 , ae2f_AnnMlp*
const mlp
840 if((reterr) && *(reterr));
841 else unless((mlp) && (out_desired) && (inp)) {
842 assert(0 &&
"nullref");
845 ae2f_AnnMlpTrain_t v_train;
848 , v_train, *(mlp), inp
849 , &(mlp)->m_outcache[((mlp)->m_outc) * ((mlp)->m_depth - 2)]
851 , (mlp)->m_sz, (mlp)->m_outcache
852 , (mlp)->m_deltastream
853 , (mlp)->m_weight, (mlp)->m_bias
854 , (mlp)->m_learningrate, (mlp)->m_learningrate_bias
855 , (mlp)->m_act, (mlp)->m_actderiv, (mlp)->m_lossderiv
861#define __ae2f_AnnMlpTrainPrimal(...)
862 typedef char NO_ae2f_NEED_CLASS[-1
]
864#define __ae2f_AnnMlpTrainAutoPrimal(...)
865 typedef char NO_ae2f_NEED_CLASS[-1
]
870#define __ae2f_AnnMlpTrain_C(reterr, mlp, inp, out, out_desired)
873#define __ae2f_AnnMlpTrainStream_C(reterr, mlp, inp, out, out_desired)
876#define __ae2f_AnnMlpTrain_imp(...)
879#define __ae2f_AnnMlpTrainStream_imp(...)
884#define __ae2f_AnnMlpTrainAuto_C(reterr, mlp, inp, out_desired)
888#define __ae2f_AnnMlpTrainAutoStream_C(reterr, mlp, inp, out_desired)
void ae2f_AnnAct_t(ae2f_float_t *ret, ae2f_float_t x)
Customisable activasion function type.
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.
#define ae2f_reinterpret_cast(t, v)
#define unless(...)
Invokes when condition is false.
#define ae2f_NONE
Literally nothing.
const ae2f_AnnMlp_t const ae2f_float_t *const inp
size_t const ae2f_AnnSlp_t ae2f_float_t *const const ae2f_float_t *const ae2f_AnnAct_t actderiv_then
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
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const sz
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
const ae2f_AnnSlp_t const ae2f_float_t *const const ae2f_float_t *const delta
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const const size_t *const const ae2f_float_t *const weight
const ae2f_AnnSlp_t const ae2f_float_t *const const ae2f_float_t *const const size_t iidx
const ae2f_AnnMlp_t const ae2f_float_t *const ae2f_float_t *const out
size_t const ae2f_AnnSlp_t slp_then
size_t const ae2f_AnnSlp_t ae2f_float_t *const const ae2f_float_t *const deltaseed
size_t const ae2f_AnnSlp_t ae2f_float_t *const retdelta_then
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
#define ae2f_errGlob_ALLOC_FAILED
stdlib allocating functions (malloc, calloc, realloc) has been failed.
uint8_t ae2f_err_t
Informs that this number represents the error.
#define ae2f_errGlob_PTR_IS_NULL
Failed to refer the pointer either l-value inside the function.
#define __ae2f_AnnMlpFollowPrimal(...)
#define __ae2f_AnnMlpHidDeltaSingle_imp(v_single, slp, weight, delta, iidx)
#define __ae2f_MACRO_GENERATED
#define __ae2f_AnnMlpTrainAutoPrimal(...)
#define __ae2f_AnnMlpPropagate_imp(v_tmp, v_send, slp_then, retdelta_then, deltaseed, actderiv_then, inp)
delta to delta
#define __ae2f_AnnMlpPredictStream_imp(...)
#define __ae2f_AnnMlpFollowPrimal_imp(OPER_NEG, OPER_NONE, v_follow, mlp, inp, delta, lenv, outstream, deltacache, weight, bias, learningrate, learningrate_bias, actderiv)
#define __ae2f_AnnMlpPredictPrimal(...)
#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
#define __ae2f_AnnMlpInitWithOutSz_imp(...)
#define __ae2f_AnnMlpTrainPrimal(...)
#define __ae2f_AnnMlpSz_imp(...)
#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)
#define __ae2f_AnnMlpMk_imp(...)
#define __ae2f_AnnSlpFollow_imp(v_follow, _this, prm_in, delta, weight, bias, learningrate, learningrate_bias)
#define __ae2f_AnnSlpFetchDelta_imp(v_delta, slp, out, out_desired, actderiv_opt, lossderiv, retdelta)
#define __ae2f_AnnSlpPredict_imp(v_predict, _this, prm_in, out, weight, bias, act_opt)
#define ae2f_MAC()
delta to delta