File size: 4,583 Bytes
8b41169 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | /* sk_matrix.h β SnapKitty MLC: row-major f32 matrix operations
*
* All operations take an explicit arena for allocation.
* Forward pass and gradient ops are separated.
* No hidden globals; all state is in the passed structs.
*
* Authors: Ahmad Ali Parr, Jessica L. Williams (SNAPKITTYWEST)
* Source: SNAPKITTYAGENT9NOVA/MLC
* License: BSL-1.1 / AGPL-3.0 / MPL-2.0
*/
#ifndef SK_MATRIX_H
#define SK_MATRIX_H
#include "sk_defs.h"
#include "sk_arena.h"
/* ββ Matrix βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
typedef struct {
u32 rows;
u32 cols;
f32* data; /* row-major, size = rows Γ cols Γ sizeof(f32) */
} sk_matrix;
/* ββ Lifecycle ββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
sk_matrix* sk_mat_create(sk_arena* arena, u32 rows, u32 cols);
sk_matrix* sk_mat_load(sk_arena* arena, u32 rows, u32 cols, const char* filename);
b32 sk_mat_copy(sk_matrix* dst, const sk_matrix* src);
/* ββ Fill βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
void sk_mat_clear(sk_matrix* mat);
void sk_mat_fill(sk_matrix* mat, f32 x);
void sk_mat_fill_rand(sk_matrix* mat, f32 lower, f32 upper);
/* ββ Reductions βββββββββββββββββββββββββββββββββββββββββββββββββββββ */
void sk_mat_scale(sk_matrix* mat, f32 scale);
f32 sk_mat_sum(const sk_matrix* mat);
u64 sk_mat_argmax(const sk_matrix* mat);
/* ββ Element-wise arithmetic ββββββββββββββββββββββββββββββββββββββββ */
b32 sk_mat_add(sk_matrix* out, const sk_matrix* a, const sk_matrix* b);
b32 sk_mat_sub(sk_matrix* out, const sk_matrix* a, const sk_matrix* b);
/* ββ Matrix multiply
* out = A(α΅?) Γ B(α΅?) zero_out: clear out before accumulating
* transpose_a/b: treat operand as its transpose (no copy)
* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */
b32 sk_mat_mul(
sk_matrix* out, const sk_matrix* a, const sk_matrix* b,
b8 zero_out, b8 transpose_a, b8 transpose_b
);
/* ββ Activation functions (forward) ββββββββββββββββββββββββββββββββ */
b32 sk_mat_relu(sk_matrix* out, const sk_matrix* in);
b32 sk_mat_softmax(sk_matrix* out, const sk_matrix* in);
/* ββ Loss function ββββββββββββββββββββββββββββββββββββββββββββββββββ */
b32 sk_mat_cross_entropy(sk_matrix* out, const sk_matrix* p, const sk_matrix* q);
/* ββ Gradient accumulation (adds into out, never overwrites) βββββββ */
b32 sk_mat_relu_add_grad(
sk_matrix* out, const sk_matrix* in, const sk_matrix* grad
);
b32 sk_mat_softmax_add_grad(
sk_matrix* out, const sk_matrix* softmax_out, const sk_matrix* grad
);
b32 sk_mat_cross_entropy_add_grad(
sk_matrix* p_grad, sk_matrix* q_grad,
const sk_matrix* p, const sk_matrix* q, const sk_matrix* grad
);
/* Compatibility aliases */
#define matrix sk_matrix
#define mat_create sk_mat_create
#define mat_load sk_mat_load
#define mat_copy sk_mat_copy
#define mat_clear sk_mat_clear
#define mat_fill sk_mat_fill
#define mat_fill_rand sk_mat_fill_rand
#define mat_scale sk_mat_scale
#define mat_sum sk_mat_sum
#define mat_argmax sk_mat_argmax
#define mat_add sk_mat_add
#define mat_sub sk_mat_sub
#define mat_mul sk_mat_mul
#define mat_relu sk_mat_relu
#define mat_softmax sk_mat_softmax
#define mat_cross_entropy sk_mat_cross_entropy
#define mat_relu_add_grad sk_mat_relu_add_grad
#define mat_softmax_add_grad sk_mat_softmax_add_grad
#define mat_cross_entropy_add_grad sk_mat_cross_entropy_add_grad
#endif /* SK_MATRIX_H */
|