Noodle
Loading...
Searching...
No Matches
noodle.h
Go to the documentation of this file.
1
48#pragma once
49
50#include <stdint.h>
51#ifdef ARDUINO
52#include <Arduino.h>
53#endif
54
55#include "noodle_config.h" // pooling mode & backend selection macros
56#include "noodle_fs.h" // NDL_File + NOODLE_FS wrappers
57
58#ifndef ARDUINO
59typedef unsigned char byte;
60#endif
61// ============================================================================
62
73enum Activation : uint8_t { ACT_NONE = 0, ACT_RELU = 1 , ACT_SOFTMAX = 2};
74
84struct Conv {
85 uint16_t K;
86 uint16_t P = 0;
87 uint16_t S = 1;
88
89 const char *weight_fn = nullptr;
90 const char *bias_fn = nullptr;
91
93};
94
103struct ConvMem {
104 uint16_t K;
105 uint16_t P = 0;
106 uint16_t S = 1;
107
108 const float *weight = nullptr;
109 const float *bias = nullptr;
110
112};
113
123struct Pool {
124 uint16_t M = 1;
125 uint16_t T = 1;
126};
127
133typedef void (*CBFPtr)(float progress);
134
163void noodle_setup_temp_buffers(void *b1, void *b2);
164
175
184bool noodle_fs_init(uint8_t clk_pin, uint8_t cmd_pin, uint8_t d0_pin);
189bool noodle_fs_init(uint8_t clk_pin, uint8_t cmd_pin, uint8_t d0_pin, uint8_t d1_pin, uint8_t d2_pin, uint8_t d3_pin);
194bool noodle_fs_init();
199bool noodle_fs_init(uint8_t cs_pin);
200
207void noodle_read_top_line(const char* fn, char *line, size_t maxlen);
208
212void noodle_delete_file(const char *fn);
213
223size_t noodle_read_bytes_until(NDL_File &file, char terminator, char *buffer, size_t length);
224
232void noodle_write_float(NDL_File &f, float d);
233
238float noodle_read_float(NDL_File &f);
239
244byte noodle_read_byte(NDL_File &f);
245
250void noodle_write_byte(NDL_File &f, byte d);
251
260float *noodle_create_buffer(uint16_t size);
261
266void noodle_delete_buffer(float *buffer);
267
272void noodle_reset_buffer(float *buffer, uint16_t n);
273
282float* noodle_slice(float* flat, size_t W, size_t z);
283
289void noodle_array_to_file(float *array, const char *fn, uint16_t n);
290
296void noodle_array_to_file(float *array, NDL_File &fo, uint16_t n);
297
303void noodle_grid_to_file(byte *grid, const char *fn, uint16_t n);
304
310void noodle_grid_to_file(byte *grid, NDL_File &fo, uint16_t n);
311
316void noodle_grid_to_file(float *grid, const char *fn, uint16_t n);
317
322void noodle_grid_to_file(float *grid, NDL_File &fo, uint16_t n);
323
328void noodle_array_from_file(const char *fn, float *buffer, uint16_t K);
329
334void noodle_array_from_file(NDL_File &fi, float *buffer, uint16_t K);
335
340void noodle_grid_from_file(const char *fn, byte *buffer, uint16_t K);
341
346void noodle_grid_from_file(NDL_File &fi, byte *buffer, uint16_t K);
347
352void noodle_grid_from_file(const char *fn, int8_t *buffer, uint16_t K);
353
358void noodle_grid_from_file(NDL_File &fi, int8_t *buffer, uint16_t K);
359
364void noodle_grid_from_file(const char *fn, float *buffer, uint16_t K);
365
370void noodle_grid_from_file(NDL_File &fi, float *buffer, uint16_t K);
371
388uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn);
393uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K, uint16_t S, NDL_File &fo);
398uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K, uint16_t S, float *output);
399
409uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn);
414uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S, NDL_File &fo);
415
438uint16_t noodle_conv_byte(const char *in_fn,
439 uint16_t n_inputs,
440 uint16_t n_outputs,
441 const char *out_fn,
442 uint16_t W,
443 const Conv &conv,
444 const Pool &pool,
445 CBFPtr progress_cb = NULL);
446
451uint16_t noodle_conv_float(const char *in_fn,
452 uint16_t n_inputs,
453 uint16_t n_outputs,
454 const char *out_fn,
455 uint16_t W,
456 const Conv &conv,
457 const Pool &pool,
458 CBFPtr progress_cb = NULL);
459
464uint16_t noodle_conv_float(const char *in_fn,
465 uint16_t n_inputs,
466 uint16_t n_outputs,
467 float *output,
468 uint16_t W,
469 const Conv &conv,
470 const Pool &pool,
471 CBFPtr progress_cb = NULL);
472
477uint16_t noodle_conv_float(float *input,
478 uint16_t n_inputs,
479 uint16_t n_outputs,
480 const char *out_fn,
481 uint16_t W,
482 const Conv &conv,
483 const Pool &pool,
484 CBFPtr progress_cb = NULL);
485
490uint16_t noodle_conv_float(float *input,
491 uint16_t n_inputs,
492 uint16_t n_outputs,
493 const char *out_fn,
494 uint16_t W,
495 const ConvMem &conv,
496 const Pool &pool,
497 CBFPtr progress_cb = NULL);
498
503uint16_t noodle_conv_float(float *input,
504 uint16_t n_inputs,
505 uint16_t n_outputs,
506 float *output,
507 uint16_t W,
508 const Conv &conv,
509 const Pool &pool,
510 CBFPtr progress_cb = NULL);
511
516uint16_t noodle_conv_float(float *input,
517 uint16_t n_inputs,
518 uint16_t n_outputs,
519 float *output,
520 uint16_t W,
521 const ConvMem &conv,
522 const Pool &pool,
523 CBFPtr progress_cb = NULL);
524
555uint16_t noodle_conv1d(const char *in_fn,
556 uint16_t n_inputs,
557 const char *out_fn,
558 uint16_t n_outputs,
559 uint16_t W,
560 const Conv &conv,
561 const Pool &pool,
562 CBFPtr progress_cb=NULL);
563
578uint16_t noodle_conv1d(const char *in_fn,
579 uint16_t n_inputs,
580 const char *out_fn,
581 uint16_t n_outputs,
582 uint16_t W,
583 const Conv &conv,
584 CBFPtr progress_cb=NULL);
585
586uint16_t noodle_conv1d(const char *in_fn,
587 uint16_t n_inputs,
588 const char *out_fn,
589 uint16_t n_outputs,
590 uint16_t W,
591 const ConvMem &conv,
592 CBFPtr progress_cb);
593
607uint16_t noodle_conv1d(float *in,
608 uint16_t n_inputs,
609 float *out,
610 uint16_t n_outputs,
611 uint16_t W,
612 const ConvMem &conv,
613 CBFPtr progress_cb=NULL);
614
615uint16_t noodle_conv1d(float *in,
616 uint16_t n_inputs,
617 const char *out_fn,
618 uint16_t n_outputs,
619 uint16_t W,
620 const ConvMem &conv,
621 CBFPtr progress_cb);
622
623uint16_t noodle_conv1d(const char *in_fn,
624 uint16_t n_inputs,
625 float *out, // packed output: [O][Vmax]
626 uint16_t n_outputs,
627 uint16_t W,
628 const ConvMem &conv,
629 CBFPtr progress_cb);
630
640uint16_t noodle_do_conv1d(float *input, float *kernel, uint16_t W, uint16_t K,
641 float *output, uint16_t P, uint16_t S);
642
653uint16_t noodle_do_conv(byte *grid, const float *kernel, uint16_t K, uint16_t W,
654 float *output, uint16_t P, uint16_t S);
659uint16_t noodle_do_conv(float *grid, const float *kernel, uint16_t K, uint16_t W,
660 float *output, uint16_t P, uint16_t S);
661
671uint16_t noodle_do_bias(float *output, float bias, uint16_t n);
672
682uint16_t noodle_do_bias_act(float *output, float bias, uint16_t n, Activation act);
683
693float noodle_get_padded_x(byte *grid, int16_t i, int16_t j, int16_t W, int16_t P);
694
700float noodle_get_padded_x(float *grid, int16_t i, int16_t j, int16_t W, int16_t P);
701
702
711uint16_t noodle_soft_max(float *input_output, uint16_t n);
716uint16_t noodle_sigmoid(float *input_output, uint16_t n);
721uint16_t noodle_relu(float *input_output, uint16_t n);
722
727struct FCN {
728 const char *weight_fn = nullptr;
729 const char *bias_fn = nullptr;
731};
732
737struct FCNFile {
738 const char *weight_fn = nullptr;
739 const char *bias_fn = nullptr;
741};
742
747struct FCNMem {
748 const float *weight = nullptr;
749 const float *bias = nullptr;
751};
752
769uint16_t noodle_fcn(const int8_t *input, uint16_t n_inputs, uint16_t n_outputs,
770 const char *out_fn, const FCNFile &fcn,
771 CBFPtr progress_cb = NULL);
772
773
787uint16_t noodle_fcn(const char *in_fn, uint16_t n_inputs, uint16_t n_outputs,
788 const char *out_fn, const FCNFile &fcn,
789 CBFPtr progress_cb = NULL);
790
791
804uint16_t noodle_fcn(const float *input, uint16_t n_inputs, uint16_t n_outputs,
805 float *output, const FCNMem &fcn,
806 CBFPtr progress_cb = NULL);
807
808
820uint16_t noodle_fcn(const byte *input, uint16_t n_inputs, uint16_t n_outputs,
821 float *output, const FCNFile &fcn,
822 CBFPtr progress_cb = NULL);
823
824
836uint16_t noodle_fcn(const int8_t *input, uint16_t n_inputs, uint16_t n_outputs,
837 float *output, const FCNFile &fcn,
838 CBFPtr progress_cb = NULL);
839
840
854uint16_t noodle_fcn(const char *in_fn, uint16_t n_inputs, uint16_t n_outputs,
855 float *output, const FCNFile &fcn,
856 CBFPtr progress_cb = NULL);
857
871uint16_t noodle_fcn(const float *input, uint16_t n_inputs, uint16_t n_outputs,
872 float *output, const FCNFile &fcn,
873 CBFPtr progress_cb);
874
887uint16_t noodle_fcn(const float *input, uint16_t n_inputs, uint16_t n_outputs,
888 const char *out_fn, const FCNFile &fcn,
889 CBFPtr progress_cb);
890
906uint16_t noodle_flat(const char *in_fn, float *output, uint16_t V, uint16_t n_filters);
907
917uint16_t noodle_flat(float *input, float *output, uint16_t V, uint16_t n_filters);
918
927uint16_t noodle_gap(float *inout,
928 uint16_t C,
929 uint16_t W);
930
939void noodle_find_max(float *input,
940 uint16_t n,
941 float &max_val,
942 uint16_t &max_idx);
943
965uint16_t noodle_dwconv_float(const char *in_fn,
966 uint16_t n_channels,
967 const char *out_fn,
968 uint16_t W,
969 const Conv &conv,
970 const Pool &pool,
971 CBFPtr progress_cb);
972
973
989uint16_t noodle_dwconv_float(float *input,
990 uint16_t n_channels,
991 float *output,
992 uint16_t W,
993 const Conv &conv,
994 const Pool &pool,
995 CBFPtr progress_cb);
1011uint16_t noodle_dwconv_float(float *input,
1012 uint16_t n_channels,
1013 float *output,
1014 uint16_t W,
1015 const ConvMem &conv,
1016 const Pool &pool,
1017 CBFPtr progress_cb);
1018
1029void noodle_unpack_bn_params(const float *bn_params,
1030 uint16_t C,
1031 const float **gamma,
1032 const float **beta,
1033 const float **mean,
1034 const float **var);
1035
1052uint16_t noodle_bn(float *x,
1053 uint16_t C,
1054 uint16_t W,
1055 const float *gamma,
1056 const float *beta,
1057 const float *mean,
1058 const float *var,
1059 float eps=1e-3);
1060
1072uint16_t noodle_bn_relu(float *x,
1073 uint16_t C,
1074 uint16_t W,
1075 const float *gamma,
1076 const float *beta,
1077 const float *mean,
1078 const float *var,
1079 float eps=1e-3);
1080
1090uint16_t noodle_bn(float *x,
1091 uint16_t C,
1092 uint16_t W,
1093 const float *bn_params,
1094 float eps=1e-3);
1095
1096/*
1097 * Batch Normalization followed by ReLU for a channel-first tensor in memory.
1098 * @param x Pointer to the input tensor in [C][W][W] layout.
1099 * @param C Number of channels.
1100 * @param W Width/height of each channel plane.
1101 * @param bn_params Pointer to the packed batch normalization parameters.
1102 * @param eps Small constant to avoid division by zero.
1103 */
1104uint16_t noodle_bn_relu(float *x,
1105 uint16_t C,
1106 uint16_t W,
1107 const float *bn_params,
1108 float eps=1e-3);
1109
byte noodle_read_byte(NDL_File &f)
Read a byte value fron an opened file handler and store as an integer text line.
Definition noodle.cpp:143
uint16_t noodle_do_pooling(const float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn)
2D pooling over a V×V map, writing results to a file (one float per line).Pooling mode (MAX or MEAN) ...
Definition noodle.cpp:274
void noodle_write_byte(NDL_File &f, byte d)
Write a byte value as an integer text line to an opend file.
Definition noodle.cpp:155
void noodle_write_float(NDL_File &f, float d)
Definition noodle.cpp:150
uint16_t noodle_do_pooling1d(float *input, uint16_t W, uint16_t K, uint16_t S, const char *fn)
Definition noodle.cpp:1273
float noodle_get_padded_x(byte *grid, int16_t i, int16_t j, int16_t W, int16_t P)
Get padded input sample from a byte grid with zero padding.Noodle uses symmetric, stride-independent ...
Definition noodle.cpp:236
uint16_t noodle_do_conv(byte *grid, const float *kernel, uint16_t K, uint16_t W, float *output, uint16_t P, uint16_t S)
2D valid/same convolution with zero padding and stride, accumulating into output.Output spatial size ...
Definition noodle.cpp:451
uint16_t noodle_do_conv1d(float *input, float *kernel, uint16_t W, uint16_t K, float *output, uint16_t P, uint16_t S)
Definition noodle.cpp:1251
uint16_t noodle_do_bias(float *output, float bias, uint16_t n)
Definition noodle.cpp:258
float noodle_read_float(NDL_File &f)
Read a float up to the next newline.
Definition noodle.cpp:136
uint16_t noodle_do_bias_act(float *output, float bias, uint16_t n, Activation act)
Add bias to each element of a V×V map (in-place) and optionally apply activation.
Definition noodle.cpp:1668
uint16_t noodle_flat(const char *in_fn, float *output, uint16_t V, uint16_t n_filters)
Definition noodle.cpp:898
uint16_t noodle_relu(float *input_output, uint16_t n)
Definition noodle.cpp:1243
uint16_t noodle_fcn(const int8_t *input, uint16_t n_inputs, uint16_t n_outputs, const char *out_fn, const FCNFile &fcn, CBFPtr progress_cb=NULL)
Definition noodle.cpp:937
uint16_t noodle_gap(float *inout, uint16_t C, uint16_t W)
Definition noodle.cpp:1841
float * noodle_create_buffer(uint16_t size)
Allocate a raw float buffer of size bytes.
Definition noodle.cpp:164
uint16_t noodle_conv_float(const char *in_fn, uint16_t n_inputs, uint16_t n_outputs, const char *out_fn, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb=NULL)
File→File 2D conv with FLOAT input feature maps.
Definition noodle.cpp:637
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=1e-3)
Definition noodle.cpp:1925
void noodle_delete_file(const char *fn)
Delete a file if it exists.
Definition noodle.cpp:160
void(* CBFPtr)(float progress)
Progress callback type used by long-running routines.
Definition noodle.h:133
void noodle_find_max(float *input, uint16_t n, float &max_val, uint16_t &max_idx)
Definition noodle.cpp:1949
uint16_t noodle_conv1d(const char *in_fn, uint16_t n_inputs, const char *out_fn, uint16_t n_outputs, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb=NULL)
Definition noodle.cpp:1311
void noodle_read_top_line(const char *fn, char *line, size_t maxlen)
Read the first line of a given text file.
Definition noodle.cpp:1683
void noodle_delete_buffer(float *buffer)
Free a buffer allocated by noodle_create_buffer.
Definition noodle.cpp:168
void noodle_reset_buffer(float *buffer, uint16_t n)
Fill buffer with zeros (n floats).
Definition noodle.cpp:581
void noodle_array_to_file(float *array, const char *fn, uint16_t n)
Write an array of n floats to fn, one value per line. File will be opened and closed.
Definition noodle.cpp:172
float * noodle_slice(float *flat, size_t W, size_t z)
Definition noodle.cpp:21
void noodle_unpack_bn_params(const float *bn_params, uint16_t C, const float **gamma, const float **beta, const float **mean, const float **var)
Definition noodle.cpp:1869
void noodle_grid_from_file(const char *fn, byte *buffer, uint16_t K)
Definition noodle.cpp:514
bool noodle_fs_init()
Definition noodle.cpp:94
void noodle_setup_temp_buffers(void *b1, void *b2)
Provide two reusable temporary buffers used internally by file-streaming operations....
Definition noodle.cpp:27
void noodle_array_from_file(const char *fn, float *buffer, uint16_t K)
Read a float array of length K from fn (one value per line).
Definition noodle.cpp:498
uint16_t noodle_conv_byte(const char *in_fn, uint16_t n_inputs, uint16_t n_outputs, const char *out_fn, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb=NULL)
File→File 2D conv with BYTE input feature maps.
Definition noodle.cpp:589
size_t noodle_read_bytes_until(NDL_File &file, char terminator, char *buffer, size_t length)
Read bytes from a file until a terminator or length-1 (NULL terminated).
Definition noodle.cpp:33
uint16_t noodle_soft_max(float *input_output, uint16_t n)
Definition noodle.cpp:1215
uint16_t noodle_dwconv_float(const char *in_fn, uint16_t n_channels, const char *out_fn, uint16_t W, const Conv &conv, const Pool &pool, CBFPtr progress_cb)
Definition noodle.cpp:1704
uint16_t noodle_sigmoid(float *input_output, uint16_t n)
Definition noodle.cpp:1235
void noodle_grid_to_file(byte *grid, const char *fn, uint16_t n)
Write an n×n byte grid to fn as bytes, row-major. File will be opened and closed.
Definition noodle.cpp:188
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=1e-3)
Definition noodle.cpp:1881
NDL_File fo
Definition noodle.cpp:16
NDL_File fi
Definition noodle.cpp:16
unsigned char byte
Minimal Arduino-compatible alias when not building for Arduino.
Definition noodle.h:59
Activation
Definition noodle.h:73
@ ACT_SOFTMAX
Definition noodle.h:73
@ ACT_RELU
Definition noodle.h:73
@ ACT_NONE
Definition noodle.h:73
Memory-backed convolution parameters.
Definition noodle.h:103
Activation act
Definition noodle.h:111
uint16_t P
Padding.
Definition noodle.h:105
uint16_t K
Kernel size.
Definition noodle.h:104
const float * weight
Definition noodle.h:108
uint16_t S
Stride.
Definition noodle.h:106
const float * bias
Definition noodle.h:109
File-backed convolution parameters.
Definition noodle.h:84
const char * bias_fn
Definition noodle.h:90
uint16_t S
Stride.
Definition noodle.h:87
uint16_t P
Padding.
Definition noodle.h:86
uint16_t K
Kernel size.
Definition noodle.h:85
Activation act
Definition noodle.h:92
const char * weight_fn
Definition noodle.h:89
Definition noodle.h:737
const char * weight_fn
Definition noodle.h:738
const char * bias_fn
Definition noodle.h:739
Activation act
Definition noodle.h:740
Definition noodle.h:747
Activation act
Definition noodle.h:750
const float * weight
Definition noodle.h:748
const float * bias
Definition noodle.h:749
Definition noodle.h:727
const char * weight_fn
Definition noodle.h:728
const char * bias_fn
Definition noodle.h:729
Activation act
Definition noodle.h:730
2D pooling parameters. Use M = 1 and T = 1 for identity (no pooling).
Definition noodle.h:123
uint16_t M
Pool kernel.
Definition noodle.h:124
uint16_t T
Pool stride.
Definition noodle.h:125