ae2f_docs
Slp.h
Go to the documentation of this file.
1#ifndef ae2f_NEED_CLASS
2#define ae2f_NEED_CLASS 1
3#endif
4
5
6#ifndef ae2f_Ann_Slp_h
7#define ae2f_Ann_Slp_h
8
9#include "./Slp.core.h"
10#include <ae2f/Pack/Beg.h>
11
12/**
13 * @brief
14 * # Single Layered Perceptron
15 *
16 * This is the main structure for the SLP.
17 */
18ae2f_structdef(struct, ae2f_AnnSlp)
20{
21 /**
22 * @brief
23 * Weights of the network.
24 */
25 ae2f_float_t* restrict m_weight;
26 /**
27 * @brief
28 * Biases of the network.
29 */
30 ae2f_float_t* restrict m_bias;
31 /**
32 * @brief
33 * Cache for layer outputs.
34 */
35 ae2f_float_t* restrict m_cache;
36
37 /**
38 * @brief
39 * SLP data.
40 */
41 ae2f_AnnSlp_t m_Slp[1];
42
43 /**
44 * @brief
45 * Activation function.
46 */
47 ae2f_AnnAct_t * m_act;
48 /**
49 * @brief
50 * Derivative of the activation function.
51 */
52 ae2f_AnnAct_t * m_actderiv;
53 /**
54 * @brief
55 * Derivative of the loss function.
56 */
57 ae2f_AnnLoss_t* m_lossderiv;
58
59 /**
60 * @brief
61 * Learning rate for weights.
62 */
63 ae2f_float_t m_learningrate;
64 /**
65 * @brief
66 * Learning rate for biases.
67 */
68 ae2f_float_t m_learningrate_bias;
69
70#if ae2f_WhenCXX(!)0
71#define ae2f_TMP
72
73 inline static void ae2f_TMP operator delete(void* end);
74 inline static void* ae2f_TMP operator new(
75 size_t oneonly
76 , ae2f_LP(inc * outc) ae2f_float_t* restrict const weight_opt,
77 ae2f_LP(outc) ae2f_float_t* restrict const bias_opt,
78 ae2f_LP(outc) ae2f_float_t* restrict const cache_opt,
79
80 const size_t inc,
81 const size_t outc,
82 const size_t offset_opt,
83
84 ae2f_opt ae2f_AnnAct_t* const act,
85 ae2f_opt ae2f_AnnAct_t* const actderiv,
86 ae2f_AnnLoss_t* const lossderiv,
87 ae2f_float_t learningrate,
88 ae2f_float_t learningrate_bias,
89 ae2f_opt ae2f_err_t* restrict const err_opt
90 ) throw();
91
92 inline void ae2f_TMP Predict(
93 ae2f_err_t* const err_opt
94 , ae2f_LP(_this::inc)
95 const ae2f_float_t* const prm_in
96 , ae2f_LP(_this::outc)
97 ae2f_float_t* const out
98 ) const;
99
100 inline void ae2f_TMP Follow(
101 ae2f_err_t* const reterr_opt
102 , ae2f_LP(_this::inc)
103 const ae2f_float_t* const prm_in
104 , ae2f_LP(_this::outc)
105 const ae2f_float_t* const delta
106 );
107
108 inline void ae2f_TMP Fit(
109 ae2f_err_t* const reterr_opt
110 , ae2f_LP(_this::inc) const ae2f_float_t* const prm_inp
111 , ae2f_LP(_this::outc) const ae2f_float_t* const prm_out
112 , ae2f_LP(_this::outc) const ae2f_float_t* const prm_out_desired
113 );
114
115 inline void ae2f_TMP Train(
116 ae2f_err_t* const err
117 , ae2f_LP(slp::inc) const ae2f_float_t* inp
118 , ae2f_LP(slp::outc) const ae2f_float_t* out_desired
119 );
120
121#undef ae2f_TMP
122#endif
123}
124#endif
125;
126
127#include <ae2f/Pack/End.h>
128
129
130/* @memberof ae2f_mAnnSlp
131 * @brief
132 * Desired least byte size for initialising.
133 *
134 * Cache (output size)
135 * Bias (output size)
136 * Weight (input * output)
137 */
138#define ae2f_AnnSlpFieldSz(inc, outc) ((((inc) + 2) * ((outc)) * sizeof(ae2f_float_t)) + sizeof(ae2f_AnnSlp))
139
141
142/**
143 * @brief
144 * Initiator
145 *
146 * No allocation is occurred on this function.
147 */
148ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpInit(
149 ae2f_AnnSlp_t* restrict _this,
150 const size_t inc,
151 const size_t outc,
152 const size_t offset_opt,
153 ae2f_err_t* restrict const err_opt,
154 size_t* restrict const initsz_opt
155 ) noexcept;
156
157/*
158 * @memberof ae2f_AnnSlp
159 * @brief
160 * Makes a typical( @ref ae2f_mAnnSp::expected ) perceptron.
161 * See @ref ae2f_mAnnSlpInit.
162 *
163 * It is heap-allocated. pass the output @ref ae2f_mAnnSpDel after use.
164 */
165ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpMk(
166 ae2f_LP(inc * outc) ae2f_float_t* restrict const weight_opt,
167 ae2f_LP(outc) ae2f_float_t* restrict const bias_opt,
168 ae2f_LP(outc) ae2f_float_t* restrict const cache_opt,
169
170 const size_t inc,
171 const size_t outc,
172 const size_t offset_opt,
173 const size_t extra_opt,
174 ae2f_FREE(ae2f_AnnSlpDel, __ae2f_AnnSlpDel)
175 ae2f_AnnSlp* restrict * restrict const slp,
176 ae2f_opt ae2f_AnnAct_t* const act,
177 ae2f_opt ae2f_AnnAct_t* const actderiv,
178 ae2f_AnnLoss_t* const lossderiv,
179 ae2f_float_t learningrate,
180 ae2f_float_t learningrate_bias,
181 ae2f_opt ae2f_err_t* restrict const err_opt
182 ) noexcept;
183
184ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpDel(
185 ae2f_AnnSlp* restrict const slp
186 ) noexcept;
187
188ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpPredict(
189 ae2f_err_t* restrict const err_opt
190 , const ae2f_AnnSlp* restrict const _this
191 , ae2f_LP(_this::inc)
192 const ae2f_float_t* restrict const prm_in
193 , ae2f_LP(_this::outc)
194 ae2f_float_t* restrict const out
195 ) noexcept;
196
197 /**
198 * @brief
199 * Adjusts the field based on delta
200 *
201 * @param delta
202 *
203 * @param prm_in
204 *
205 * @param field
206 * Contains weights and biases
207 *
208 * @param learningrate
209 * Learning rate for weights
210 *
211 * @param learningrate_bias
212 * Learning rate for biases
213 * */
214ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpFollow(
215 ae2f_err_t* restrict const reterr_opt
216 , const ae2f_AnnSlp* restrict const _this
217 , ae2f_LP(_this::inc)
218 const ae2f_float_t* restrict const prm_in
219 , ae2f_LP(_this::outc)
220 const ae2f_float_t* restrict const delta
221 ) noexcept;
222
223 /**
224 * @brief
225 * Adjusts the delta based on output and desired output.
226 * */
227 ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpFit(
228 ae2f_err_t* const reterr_opt
229 , const ae2f_AnnSlp* const _this
230 , ae2f_LP(_this::inc) const ae2f_float_t* restrict const prm_inp
231 , ae2f_LP(_this::outc) const ae2f_float_t* restrict const prm_out
232 , ae2f_LP(_this::outc) const ae2f_float_t* restrict const prm_out_desired
233 ) noexcept;
234
235 /** @brief Calculates the delta based on output and desired output. */
236 ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpFetchDelta(
237 ae2f_opt ae2f_err_t* restrict const err
238 , const ae2f_AnnSlp* restrict slp
239
240 , ae2f_LP(slp::outc) const ae2f_float_t* restrict const out
241 , ae2f_LP(slp::outc) const ae2f_float_t* restrict const out_desired
242
243 , ae2f_LP(slp::outc) ae2f_float_t* restrict const retdelta
244 ) noexcept;
245
246 /** @brief Adjusts the weights and biases based on predicted output from input and desired outpu. */
247 ae2f_extern ae2f_SHAREDCALL void ae2f_AnnSlpTrain(
248 ae2f_err_t* const restrict err
249 , ae2f_AnnSlp* restrict slp
250 , ae2f_LP(slp::inc) const ae2f_float_t* restrict inp
251 , ae2f_LP(slp::outc) const ae2f_float_t* restrict out_desired
252 ) noexcept;
253
254#endif
255
256#if !(ae2f_MAC_BUILD)
257
258#define ae2f_AnnSlpInit __ae2f_AnnSlpInit_C
259#define ae2f_AnnSlpMk __ae2f_AnnSlpMk_C
260#define ae2f_AnnSlpDel __ae2f_AnnSlpDel_C
261#define ae2f_AnnSlpPredict __ae2f_AnnSlpPredict_C
262#define ae2f_AnnSlpFollow __ae2f_AnnSlpFollow_C
263#define ae2f_AnnSlpFit __ae2f_AnnSlpFit_C
264#define ae2f_AnnSlpTrain __ae2f_AnnSlpTrain_C
265#define ae2f_AnnSlpFetchDelta __ae2f_AnnSlpFetchDelta_C
266
267
268#endif /** macbuild */
269#endif
270
271#if !defined(ae2f_Ann_Slp_imp_h)
272#define ae2f_Ann_Slp_imp_h
273
274#include <ae2f/Pack/Beg.h>
275
276
277ae2f_AnnUtilV2(,ae2f_float_t,*restrict, ,ae2f_AnnSlp, *restrict);
278
279/**
280 * @brief
281 * Structure for SLP creation data.
282 */
283ae2f_structdef(struct, ae2f_AnnSlpMk_t) {
284 /**
285 * @brief
286 * Stack size and allocation count.
287 */
288 size_t m_stack, m_alloccount;
289 /**
290 * @brief
291 * Pointer to the created SLP.
292 */
293 ae2f_AnnSlp* restrict m_ptr;
294 /**
295 * @brief
296 * Field pointer for SLP data.
297 */
298 ae2f_AnnUtilV2Name(ae2f_float_t, ae2f_AnnSlp) m_fieldptr;
299};
300
301#include <ae2f/Pack/End.h>
302#endif
303
304#include "./Slp.auto.h"
305
306#if ae2f_WhenCXX(!)0 && !defined(ae2f_Ann_Slp_cc) && ae2f_NEED_CLASS
307#define ae2f_Ann_Slp_cc
308
309#define ae2f_TMP ae2f_AnnSlp::
310
311inline void ae2f_TMP operator delete(void* end) {
313}
314
315inline void* ae2f_TMP operator new(
316 size_t oneonly
317 , ae2f_LP(inc * outc) ae2f_float_t* const weight_opt,
318 ae2f_LP(outc) ae2f_float_t* const bias_opt,
319 ae2f_LP(outc) ae2f_float_t* const cache_opt,
320
321 const size_t inc,
322 const size_t outc,
323 const size_t offset_opt,
324
325 ae2f_opt ae2f_AnnAct_t* const act,
326 ae2f_opt ae2f_AnnAct_t* const actderiv,
327 ae2f_AnnLoss_t* const lossderiv,
328 ae2f_float_t learningrate,
329 ae2f_float_t learningrate_bias,
330 ae2f_opt ae2f_err_t* const err_opt
331 ) throw()
332{
333 if(oneonly != sizeof(ae2f_AnnSlp)) return 0;
334 ae2f_AnnSlp* __v[1] = { NULL };
335
337 weight_opt, bias_opt, cache_opt, inc, outc, offset_opt, 0
338 , __v, act, actderiv, lossderiv, learningrate, learningrate_bias, err_opt);
339
340 return __v[0];
341}
342
343inline void ae2f_TMP Predict(
344 ae2f_err_t* const err_opt
345 , ae2f_LP(_this::inc)
346 const ae2f_float_t* const prm_in
347 , ae2f_LP(_this::outc)
348 ae2f_float_t* const out
349 ) const
350{
351 ae2f_AnnSlpPredict(err_opt, this, prm_in, out);
352}
353
354inline void ae2f_TMP Follow(
355 ae2f_err_t* const reterr_opt
356 , ae2f_LP(_this::inc)
357 const ae2f_float_t* const prm_in
358 , ae2f_LP(_this::outc)
359 const ae2f_float_t* const delta
360 )
361{
362 ae2f_AnnSlpFollow(reterr_opt, this, prm_in, delta);
363}
364
365inline void ae2f_TMP Fit(
366 ae2f_err_t* const reterr_opt
367 , ae2f_LP(_this::inc) const ae2f_float_t* const prm_inp
368 , ae2f_LP(_this::outc) const ae2f_float_t* const prm_out
369 , ae2f_LP(_this::outc) const ae2f_float_t* const prm_out_desired
370 )
371{
372 ae2f_AnnSlpFit(reterr_opt, this, prm_inp, prm_out, prm_out_desired);
373}
374
375inline void ae2f_TMP Train(
376 ae2f_err_t* const err
377 , ae2f_LP(slp::inc) const ae2f_float_t* inp
378 , ae2f_LP(slp::outc) const ae2f_float_t* out_desired
379 )
380{
381 ae2f_AnnSlpTrain(err, this, inp, out_desired);
382}
383
384#undef ae2f_TMP
385
386#endif
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_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_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_AnnSlpFollow_imp(v_follow, _this, prm_in, delta, weight, bias, learningrate, learningrate_bias)
Definition Slp.auto.h:420
#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_MAC()
delta to delta
Definition mac.h:4