Noodle
Loading...
Searching...
No Matches
noodle_internal.h
Go to the documentation of this file.
1
11
17
18#pragma once
19
20#include "noodle.h"
21#include <math.h>
22#include <float.h>
23#include <stdint.h>
24#include <stdlib.h>
25
26#if defined(NOODLE_USE_SDFAT)
28extern SdFat NOODLE_FS;
29#endif
30
32extern NDL_File fw;
34extern NDL_File fb;
36extern NDL_File fo;
38extern NDL_File fi;
39
41extern void *temp_buff1;
43extern void *temp_buff2;
44
55float *noodle_temp1_require(size_t required_floats);
56
67float *noodle_temp2_require(size_t required_floats);
68
74
83float *noodle_slice(float *flat, size_t W, size_t z);
84
93size_t noodle_read_raw(NDL_File &f, void *dst, size_t n);
94
103size_t noodle_write_raw(NDL_File &f, const void *src, size_t n);
104
117size_t noodle_read_float_block(NDL_File &f, float *dst, size_t n_floats);
118
127float noodle_dot_float_block(const float *x, const float *w, uint16_t n);
128
129// ============================================================
130// Private convolution/math helpers
131// ============================================================
132
148uint16_t noodle_do_conv1d(float *input, float *kernel, uint16_t W, uint16_t K,
149 float *output, uint16_t P, uint16_t S);
150
161uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S,
162 const char *fn);
163
174uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S,
175 NDL_File &fo);
176
192uint16_t noodle_do_pooling1d(const float *input, uint16_t W, uint16_t K,
193 uint16_t S, float *output);
194
206float noodle_get_padded_x(byte *grid, int16_t i, int16_t j, int16_t W,
207 int16_t P0, int16_t P1);
208
220float noodle_get_padded_x(float *grid, int16_t i, int16_t j, int16_t W,
221 int16_t P0, int16_t P1);
222
231uint16_t noodle_do_bias(float *output, float bias, uint16_t n);
232
247uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K,
248 uint16_t S, const char *fn);
249
260uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K,
261 uint16_t S, NDL_File &fo);
262
273uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K,
274 uint16_t S, float *output);
275
292uint16_t noodle_do_conv(byte *grid, const float *kernel, uint16_t K,
293 uint16_t W, float *output, uint16_t P, uint16_t S);
294
311uint16_t noodle_do_conv(float *grid, const float *kernel, uint16_t K,
312 uint16_t W, float *output, uint16_t P, uint16_t S);
313
320void noodle_reset_buffer(float *buffer, uint16_t n);
321
335uint16_t noodle_do_bias_act(float *output, float bias, uint16_t n, Activation act);
336
358uint16_t noodle_do_conv_transpose(float *input, const float *kernel, uint16_t K,
359 uint16_t W, float *output, uint16_t P,
360 uint16_t S, uint16_t OP);
361
370void noodle_find_max(float *input, uint16_t n, float &max_val, uint16_t &max_idx);
371
383void noodle_unpack_bn_params(const float *bn_params, uint16_t N,
384 const float **gamma, const float **beta,
385 const float **mean, const float **var);
386
402uint16_t noodle_bn1d(float *x, uint16_t N, const float *gamma,
403 const float *beta, const float *mean, const float *var,
404 float eps);
405
418uint16_t noodle_bn1d(float *x, uint16_t N, const float *bn_params, float eps);
419
435uint16_t noodle_bn1d_relu(float *x, uint16_t N, const float *gamma,
436 const float *beta, const float *mean,
437 const float *var, float eps);
438
451uint16_t noodle_bn1d_relu(float *x, uint16_t N, const float *bn_params, float eps);
452
470uint16_t noodle_bn2d(float *x, uint16_t C, uint16_t W, const float *gamma,
471 const float *beta, const float *mean, const float *var,
472 float eps);
473
488uint16_t noodle_bn2d(float *x, uint16_t C, uint16_t W, const float *bn_params,
489 float eps);
490
508uint16_t noodle_bn2d_relu(float *x, uint16_t C, uint16_t W,
509 const float *gamma, const float *beta,
510 const float *mean, const float *var, float eps);
511
526uint16_t noodle_bn2d_relu(float *x, uint16_t C, uint16_t W,
527 const float *bn_params, float eps);
528
538uint16_t noodle_compute_V(uint16_t K, uint16_t W, uint16_t P, uint16_t S);
539
551uint16_t noodle_compute_V_and_P(uint16_t K, uint16_t W, uint16_t P,
552 uint16_t S, uint16_t &P0, uint16_t &P1);
553
563uint16_t noodle_valid_max_pool(float *inplace, uint16_t W, uint16_t C,
564 const Pool &pool);
565
581uint16_t noodle_compute_Vt(uint16_t K, uint16_t W, uint16_t P, uint16_t S,
582 uint16_t OP);
583
602uint16_t noodle_compute_Vt_and_P(uint16_t K, uint16_t W, uint16_t P,
603 uint16_t S, uint16_t OP, uint16_t &P0,
604 uint16_t &P1);
605
606// ============================================================
607// Private raw RAM/mixed layer implementations
608// ============================================================
609
614uint16_t noodle_conv1d(float *in, uint16_t n_inputs,
615 float *out, uint16_t n_outputs,
616 uint16_t W, const ConvMem &conv,
617 CBFPtr progress_cb);
618
623uint16_t noodle_conv1d(float *in, uint16_t n_inputs,
624 float *out, uint16_t n_outputs,
625 uint16_t W, const ConvMem &conv,
626 const Pool &pool,
627 CBFPtr progress_cb);
628
633uint16_t noodle_conv1d(float *in, uint16_t n_inputs,
634 const char *out_fn, uint16_t n_outputs,
635 uint16_t W, const ConvMem &conv,
636 CBFPtr progress_cb);
637
642uint16_t noodle_conv1d(const char *in_fn, uint16_t n_inputs,
643 float *out, uint16_t n_outputs,
644 uint16_t W, const ConvMem &conv,
645 CBFPtr progress_cb);
646
651uint16_t noodle_conv_float(const char *in_fn, uint16_t n_inputs,
652 uint16_t n_outputs, float *output,
653 uint16_t W, const Conv &conv,
654 const Pool &pool, CBFPtr progress_cb);
655
660uint16_t noodle_conv_float(float *input, uint16_t n_inputs,
661 uint16_t n_outputs, const char *out_fn,
662 uint16_t W, const Conv &conv,
663 const Pool &pool, CBFPtr progress_cb);
664
669uint16_t noodle_conv_float(float *input, uint16_t n_inputs,
670 uint16_t n_outputs, const char *out_fn,
671 uint16_t W, const ConvMem &conv,
672 const Pool &pool, CBFPtr progress_cb);
673
678uint16_t noodle_conv_float(float *input, uint16_t n_inputs,
679 uint16_t n_outputs, float *output,
680 uint16_t W, const Conv &conv,
681 const Pool &pool, CBFPtr progress_cb);
682
687uint16_t noodle_conv_float(float *input, uint16_t n_inputs,
688 uint16_t n_outputs, float *output,
689 uint16_t W, const ConvMem &conv,
690 const Pool &pool, CBFPtr progress_cb);
691
696uint16_t noodle_conv_float(float *input, uint16_t n_inputs,
697 uint16_t n_outputs, float *output,
698 uint16_t W, const ConvProgmem &conv,
699 const Pool &pool, CBFPtr progress_cb);
700
719uint16_t noodle_conv_transpose_float(float *input,
720 uint16_t n_inputs,
721 uint16_t n_outputs,
722 float *output,
723 uint16_t W,
724 const ConvMem &conv,
725 CBFPtr progress_cb);
726
731uint16_t noodle_dwconv_float(float *input, uint16_t n_channels,
732 float *output, uint16_t W,
733 const Conv &conv, const Pool &pool,
734 CBFPtr progress_cb);
735
740uint16_t noodle_dwconv_float(float *input, uint16_t n_channels,
741 float *output, uint16_t W,
742 const ConvMem &conv, const Pool &pool,
743 CBFPtr progress_cb);
744
749uint16_t noodle_dwconv_float(float *input, uint16_t n_channels,
750 float *output, uint16_t W,
751 const ConvProgmem &conv, const Pool &pool,
752 CBFPtr progress_cb);
753
758uint16_t noodle_fcn(const byte *input, uint16_t n_inputs,
759 uint16_t n_outputs, float *output,
760 const FCNFile &fcn, CBFPtr progress_cb);
761
766uint16_t noodle_fcn(const int8_t *input, uint16_t n_inputs,
767 uint16_t n_outputs, float *output,
768 const FCNFile &fcn, CBFPtr progress_cb);
769
774uint16_t noodle_fcn(const float *input, uint16_t n_inputs,
775 uint16_t n_outputs, float *output,
776 const FCNFile &fcn, CBFPtr progress_cb);
777
782uint16_t noodle_fcn(const float *input, uint16_t n_inputs,
783 uint16_t n_outputs, const char *out_fn,
784 const FCNFile &fcn, CBFPtr progress_cb);
785
790uint16_t noodle_fcn(const char *in_fn, uint16_t n_inputs,
791 uint16_t n_outputs, float *output,
792 const FCNFile &fcn, CBFPtr progress_cb);
793
798uint16_t noodle_fcn(const float *input, uint16_t n_inputs,
799 uint16_t n_outputs, float *output,
800 const FCNMem &fcn, CBFPtr progress_cb);
801
806uint16_t noodle_fcn(const float *input, uint16_t n_inputs,
807 uint16_t n_outputs, float *output,
808 const FCNProgmem &fcn, CBFPtr progress_cb);
809
814uint16_t noodle_fcn_progmem(const float *input, uint16_t n_inputs,
815 uint16_t n_outputs, float *output,
816 const float *weight, const float *bias,
817 Activation act, CBFPtr progress_cb);
818
823void noodle_array_to_file(float *array, NDL_File &fo, uint16_t n);
824
829void noodle_grid_to_file(byte *grid, NDL_File &fo, uint16_t n);
830
835void noodle_grid_to_file(float *grid, NDL_File &fo, uint16_t n);
836
841void noodle_array_from_file(NDL_File &fi, float *buffer, uint16_t K);
842
847void noodle_grid_from_file(NDL_File &fi, byte *buffer, uint16_t K);
848
853void noodle_grid_from_file(NDL_File &fi, int8_t *buffer, uint16_t K);
854
859void noodle_grid_from_file(NDL_File &fi, float *buffer, uint16_t K);
860
870void noodle_copy_kernel_progmem(const float *w, uint32_t base,
871 uint16_t K, float *kernel);
872
873
874// ============================================================
875// Raw tensor utilities and activations
876// ============================================================
877// These raw-pointer functions are implementation-facing. User sketches should
878// prefer the NoodleBuffer overloads declared in noodle.h.
879
893uint16_t noodle_flat(const char *in_fn, float *output,
894 uint16_t V, uint16_t n_filters);
895
909uint16_t noodle_flat(float *input, float *output,
910 uint16_t V, uint16_t n_filters);
911
925uint16_t noodle_reshape(const float *src_hwc, float *dst_chw,
926 uint16_t W, uint16_t C);
927
940uint16_t noodle_gap(float *inout, uint16_t C, uint16_t W);
941
954uint16_t noodle_gmp(float *inout, uint16_t C, uint16_t W);
955
963uint16_t noodle_soft_max(float *input_output, uint16_t n);
964
972uint16_t noodle_sigmoid(float *input_output, uint16_t n);
973
980float noodle_sigmoidf(float x);
981
989uint16_t noodle_logit(float *input_output, uint16_t n);
990
998uint16_t noodle_relu(float *input_output, uint16_t n);
999
1016uint16_t noodle_bn(float *x, uint16_t C, uint16_t W,
1017 const float *gamma, const float *beta,
1018 const float *mean, const float *var, float eps);
1019
1034uint16_t noodle_bn(float *x, uint16_t C, uint16_t W,
1035 const float *bn_params, float eps);
1036
1053uint16_t noodle_bn_relu(float *x, uint16_t C, uint16_t W,
1054 const float *gamma, const float *beta,
1055 const float *mean, const float *var, float eps);
1056
1071uint16_t noodle_bn_relu(float *x, uint16_t C, uint16_t W,
1072 const float *bn_params, float eps);
void noodle_array_to_file(float *array, NDL_File &fo, uint16_t n)
Write a float array to an already-open file.
Definition noodle_io.cpp:236
uint16_t noodle_flat(const char *in_fn, float *output, uint16_t V, uint16_t n_filters)
Flatten a packed file tensor into an HWC-like raw vector.
Definition noodle_shape.cpp:9
uint16_t noodle_valid_max_pool(float *inplace, uint16_t W, uint16_t C, const Pool &pool)
Apply valid max pooling to a packed channel-first tensor in place.
Definition noodle_internal.cpp:504
size_t noodle_read_float_block(NDL_File &f, float *dst, size_t n_floats)
Read a block of floats using the configured scalar file format.
Definition noodle_io.cpp:164
uint16_t noodle_bn(float *x, uint16_t C, uint16_t W, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Backward-compatible raw alias for noodle_bn2d().
Definition noodle_math.cpp:176
size_t noodle_write_raw(NDL_File &f, const void *src, size_t n)
Write raw bytes to a backend file handle.
Definition noodle_io.cpp:155
float * noodle_temp2_require(size_t required_floats)
Ensure temp buffer 2 can hold a number of floats.
Definition noodle_memory.cpp:71
uint16_t noodle_conv_float(const char *in_fn, uint16_t n_inputs, uint16_t n_outputs, float *output, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb)
File-to-memory 2D convolution with file-backed parameters.
Definition noodle_conv.cpp:657
uint16_t noodle_relu(float *input_output, uint16_t n)
Apply ReLU in place.
Definition noodle_math.cpp:275
uint16_t noodle_conv1d(float *in, uint16_t n_inputs, float *out, uint16_t n_outputs, uint16_t W, const ConvMem &conv, CBFPtr progress_cb)
Raw memory-to-memory 1D convolution without pooling.
Definition noodle_conv.cpp:195
uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn)
Apply 2D pooling and write to a file.
Definition noodle_internal.cpp:176
uint16_t noodle_bn1d(float *x, uint16_t N, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Apply 1D batch normalization in place to a raw vector.
Definition noodle_math.cpp:57
void noodle_array_from_file(NDL_File &fi, float *buffer, uint16_t K)
Read a float array from an already-open file.
Definition noodle_io.cpp:302
float * noodle_temp1_require(size_t required_floats)
Ensure temp buffer 1 can hold a number of floats.
Definition noodle_memory.cpp:67
uint16_t noodle_gap(float *inout, uint16_t C, uint16_t W)
Apply global average pooling in place to packed channel-first maps.
Definition noodle_shape.cpp:65
uint16_t noodle_bn2d(float *x, uint16_t C, uint16_t W, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Apply 2D channel-wise batch normalization in place.
Definition noodle_math.cpp:108
uint16_t noodle_fcn(const byte *input, uint16_t n_inputs, uint16_t n_outputs, float *output, const FCNFile &fcn, CBFPtr progress_cb)
Byte-input fully connected layer with file-backed parameters.
Definition noodle_fcn.cpp:69
float noodle_get_padded_x(byte *grid, int16_t i, int16_t j, int16_t W, int16_t P0, int16_t P1)
Read a byte grid sample with asymmetric zero padding.
Definition noodle_internal.cpp:122
uint16_t noodle_compute_V(uint16_t K, uint16_t W, uint16_t P, uint16_t S)
Compute 2D convolution output width.
Definition noodle_internal.cpp:469
uint16_t noodle_logit(float *input_output, uint16_t n)
Apply logistic sigmoid in place.
Definition noodle_math.cpp:260
void noodle_find_max(float *input, uint16_t n, float &max_val, uint16_t &max_idx)
Find the maximum value and its index in a vector.
Definition noodle_math.cpp:31
uint16_t noodle_dwconv_float(float *input, uint16_t n_channels, float *output, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb)
Raw memory-to-memory depthwise convolution with file-backed parameters.
Definition noodle_dw.cpp:72
void noodle_copy_kernel_progmem(const float *w, uint32_t base, uint16_t K, float *kernel)
Copy one square kernel from near-PROGMEM into RAM.
Definition noodle_internal.cpp:622
uint16_t noodle_bn2d_relu(float *x, uint16_t C, uint16_t W, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Apply 2D channel-wise batch normalization followed by ReLU.
Definition noodle_math.cpp:140
uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn)
Apply valid 1D max pooling and write to a file.
Definition noodle_internal.cpp:44
uint16_t noodle_do_conv(byte *grid, const float *kernel, uint16_t K, uint16_t W, float *output, uint16_t P, uint16_t S)
Accumulate one byte-input 2D convolution plane.
Definition noodle_internal.cpp:355
float noodle_dot_float_block(const float *x, const float *w, uint16_t n)
Compute a dot product with a small unrolled loop.
Definition noodle_math.cpp:9
void noodle_reset_buffer(float *buffer, uint16_t n)
Clear a float buffer.
Definition noodle_internal.cpp:407
float * noodle_slice(float *flat, size_t W, size_t z)
Return a channel plane from a packed [Z][W][W] tensor.
Definition noodle_memory.cpp:96
float noodle_sigmoidf(float x)
Compute sigmoid for one scalar.
Definition noodle_math.cpp:249
uint16_t noodle_do_conv1d(float *input, float *kernel, uint16_t W, uint16_t K, float *output, uint16_t P, uint16_t S)
Accumulate one 1D convolution into an output sequence.
Definition noodle_internal.cpp:22
uint16_t noodle_conv_transpose_float(float *input, uint16_t n_inputs, uint16_t n_outputs, float *output, uint16_t W, const ConvMem &conv, CBFPtr progress_cb)
Raw memory-to-memory 2D transpose convolution.
Definition noodle_conv.cpp:961
uint16_t noodle_reshape(const float *src_hwc, float *dst_chw, uint16_t W, uint16_t C)
Convert HWC-like raw data to packed channel-first raw data.
Definition noodle_shape.cpp:47
uint16_t noodle_do_bias(float *output, float bias, uint16_t n)
Add bias to a square output map and apply ReLU.
Definition noodle_internal.cpp:160
void noodle_grid_from_file(NDL_File &fi, byte *buffer, uint16_t K)
Read a byte grid from an already-open file.
Definition noodle_io.cpp:321
uint16_t noodle_compute_V_and_P(uint16_t K, uint16_t W, uint16_t P, uint16_t S, uint16_t &P0, uint16_t &P1)
Compute 2D convolution output width and effective asymmetric padding.
Definition noodle_internal.cpp:477
void noodle_grid_to_file(byte *grid, NDL_File &fo, uint16_t n)
Write a byte grid to an already-open file.
Definition noodle_io.cpp:256
size_t noodle_read_raw(NDL_File &f, void *dst, size_t n)
Read raw bytes from a backend file handle.
Definition noodle_io.cpp:146
uint16_t noodle_do_bias_act(float *output, float bias, uint16_t n, Activation act)
Add bias to a square output map and apply the requested activation.
Definition noodle_internal.cpp:414
uint16_t noodle_bn_relu(float *x, uint16_t C, uint16_t W, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Backward-compatible raw alias for noodle_bn2d_relu().
Definition noodle_math.cpp:195
uint16_t noodle_gmp(float *inout, uint16_t C, uint16_t W)
Apply global max pooling in place to packed channel-first data.
Definition noodle_shape.cpp:79
uint16_t noodle_soft_max(float *input_output, uint16_t n)
Apply numerically stabilized softmax in place.
Definition noodle_math.cpp:214
uint16_t noodle_sigmoid(float *input_output, uint16_t n)
Apply sigmoid in place.
Definition noodle_math.cpp:234
uint16_t noodle_compute_Vt(uint16_t K, uint16_t W, uint16_t P, uint16_t S, uint16_t OP)
Compute transpose-convolution output width.
Definition noodle_internal.cpp:555
void noodle_unpack_bn_params(const float *bn_params, uint16_t N, const float **gamma, const float **beta, const float **mean, const float **var)
Split packed batch-normalization parameters into four arrays.
Definition noodle_math.cpp:45
uint16_t noodle_fcn_progmem(const float *input, uint16_t n_inputs, uint16_t n_outputs, float *output, const float *weight, const float *bias, Activation act, CBFPtr progress_cb)
Float-input fully connected layer with near-PROGMEM parameters.
Definition noodle_fcn.cpp:404
void noodle_temp_buffers_free(void)
Free Noodle-owned scratch buffers and detach external scratch buffers.
Definition noodle_memory.cpp:75
uint16_t noodle_do_conv_transpose(float *input, const float *kernel, uint16_t K, uint16_t W, float *output, uint16_t P, uint16_t S, uint16_t OP)
Accumulate one 2D transpose-convolution plane.
Definition noodle_internal.cpp:429
uint16_t noodle_compute_Vt_and_P(uint16_t K, uint16_t W, uint16_t P, uint16_t S, uint16_t OP, uint16_t &P0, uint16_t &P1)
Compute transpose-convolution output width and effective padding.
Definition noodle_internal.cpp:564
uint16_t noodle_bn1d_relu(float *x, uint16_t N, const float *gamma, const float *beta, const float *mean, const float *var, float eps)
Apply 1D batch normalization followed by ReLU in place.
Definition noodle_math.cpp:82
void(* CBFPtr)(float progress)
Progress callback used by long-running layer routines.
Definition noodle.h:208
Activation
Activation applied after bias where supported.
Definition noodle.h:94
Public Noodle API for small CNN/ML inference on microcontrollers.
NDL_File fb
Shared bias file handle used by streaming layer implementations.
Definition noodle_internal.cpp:14
NDL_File fo
Shared output file handle used by streaming layer implementations.
Definition noodle_internal.cpp:14
NDL_File fw
Shared weight file handle used by streaming layer implementations.
Definition noodle_internal.cpp:14
NDL_File fi
Shared input file handle used by streaming layer implementations.
Definition noodle_internal.cpp:14
void * temp_buff1
Global input scratch buffer, either Noodle-owned or caller-owned.
Definition noodle_internal.cpp:15
void * temp_buff2
Global accumulation scratch buffer, either Noodle-owned or caller-owned.
Definition noodle_internal.cpp:16
SdFat NOODLE_FS
SdFat filesystem object used by the SdFat backend.
Definition noodle_internal.cpp:10
Memory-backed convolution parameter bundle.
Definition noodle.h:158
Near-PROGMEM convolution parameter bundle.
Definition noodle.h:177
File-backed convolution parameter bundle.
Definition noodle.h:112
File-backed fully connected parameter bundle alias.
Definition noodle.h:227
Memory-backed fully connected parameter bundle.
Definition noodle.h:237
Far-PROGMEM fully connected parameter bundle for AVR.
Definition noodle.h:251
Valid-pooling parameter bundle.
Definition noodle.h:198