snapkitty
machine-learning
c
snapkitty-mlc / include /sk_matrix.h
SNAPKITTYWEST's picture
Upload folder using huggingface_hub
8b41169 verified
Raw History Blame Contribute Delete
4.58 kB
/* 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 */