snapkitty
machine-learning
c
snapkitty-mlc / include /sk_model.h
SNAPKITTYWEST's picture
Upload folder using huggingface_hub
8b41169 verified
Raw History Blame Contribute Delete
6.57 kB
/* sk_model.h β€” SnapKitty MLC: computation graph, autograd, training
*
* Design:
* - All allocation is arena-based (no malloc/free in the hot path)
* - Computation graph is built by composing sk_mv_* constructors
* - Topological sort in sk_model_prog_create β†’ forward/backward in O(n)
* - Training: mini-batch SGD with Fisher-Yates shuffle per epoch
*
* Authors: Ahmad Ali Parr, Jessica L. Williams (SNAPKITTYWEST)
* Source: SNAPKITTYAGENT9NOVA/MLC
* License: BSL-1.1 / AGPL-3.0 / MPL-2.0
*/
#ifndef SK_MODEL_H
#define SK_MODEL_H
#include "sk_defs.h"
#include "sk_arena.h"
#include "sk_matrix.h"
/* ── Variable flags ───────────────────────────────────────────────── */
typedef enum {
SK_MV_NONE = 0,
SK_MV_REQUIRES_GRAD = (1 << 0), /* accumulate gradients */
SK_MV_PARAMETER = (1 << 1), /* updated during training */
SK_MV_INPUT = (1 << 2), /* model input slot */
SK_MV_OUTPUT = (1 << 3), /* model output slot */
SK_MV_DESIRED_OUTPUT = (1 << 4), /* ground-truth label slot */
SK_MV_COST = (1 << 5), /* scalar loss slot */
} sk_mv_flags;
/* ── Operation type ───────────────────────────────────────────────── */
typedef enum {
SK_OP_NULL = 0,
SK_OP_CREATE,
_SK_OP_UNARY_START,
SK_OP_RELU,
SK_OP_SOFTMAX,
_SK_OP_BINARY_START,
SK_OP_ADD,
SK_OP_SUB,
SK_OP_MATMUL,
SK_OP_CROSS_ENTROPY,
} sk_mv_op;
#define SK_MV_MAX_INPUTS 2
#define SK_MV_NUM_INPUTS(op) \
((op) < _SK_OP_UNARY_START ? 0 : ((op) < _SK_OP_BINARY_START ? 1 : 2))
/* ── Model variable (node in the computation graph) ──────────────── */
typedef struct sk_model_var {
u32 index;
u32 flags;
sk_matrix* val;
sk_matrix* grad;
sk_mv_op op;
struct sk_model_var* inputs[SK_MV_MAX_INPUTS];
} sk_model_var;
/* ── Ordered execution program (topological sort output) ─────────── */
typedef struct {
sk_model_var** vars;
u32 size;
} sk_model_prog;
/* ── Model context ────────────────────────────────────────────────── */
typedef struct {
u32 num_vars;
sk_model_var* input;
sk_model_var* output;
sk_model_var* desired_output;
sk_model_var* cost;
sk_model_prog forward_prog;
sk_model_prog cost_prog;
} sk_model;
/* ── Training descriptor ──────────────────────────────────────────── */
typedef struct {
sk_matrix* train_images;
sk_matrix* train_labels;
sk_matrix* test_images;
sk_matrix* test_labels;
u32 epochs;
u32 batch_size;
f32 learning_rate;
} sk_training_desc;
/* ── Variable constructors ────────────────────────────────────────── */
sk_model_var* sk_mv_create(
sk_arena* arena, sk_model* model, u32 rows, u32 cols, u32 flags
);
sk_model_var* sk_mv_relu(
sk_arena* arena, sk_model* model, sk_model_var* input, u32 flags
);
sk_model_var* sk_mv_softmax(
sk_arena* arena, sk_model* model, sk_model_var* input, u32 flags
);
sk_model_var* sk_mv_add(
sk_arena* arena, sk_model* model,
sk_model_var* a, sk_model_var* b, u32 flags
);
sk_model_var* sk_mv_sub(
sk_arena* arena, sk_model* model,
sk_model_var* a, sk_model_var* b, u32 flags
);
sk_model_var* sk_mv_matmul(
sk_arena* arena, sk_model* model,
sk_model_var* a, sk_model_var* b, u32 flags
);
sk_model_var* sk_mv_cross_entropy(
sk_arena* arena, sk_model* model,
sk_model_var* p, sk_model_var* q, u32 flags
);
/* ── Program execution ────────────────────────────────────────────── */
sk_model_prog sk_model_prog_create(
sk_arena* arena, sk_model* model, sk_model_var* out_var
);
void sk_model_prog_compute(sk_model_prog* prog);
void sk_model_prog_compute_grads(sk_model_prog* prog);
/* ── Model lifecycle ──────────────────────────────────────────────── */
sk_model* sk_model_create(sk_arena* arena);
void sk_model_compile(sk_arena* arena, sk_model* model);
void sk_model_feedforward(sk_model* model);
void sk_model_train(sk_model* model, const sk_training_desc* desc);
/* Compatibility aliases (original names) */
#define MV_FLAG_NONE SK_MV_NONE
#define MV_FLAG_REQUIRES_GRAD SK_MV_REQUIRES_GRAD
#define MV_FLAG_PARAMETER SK_MV_PARAMETER
#define MV_FLAG_INPUT SK_MV_INPUT
#define MV_FLAG_OUTPUT SK_MV_OUTPUT
#define MV_FLAG_DESIRED_OUTPUT SK_MV_DESIRED_OUTPUT
#define MV_FLAG_COST SK_MV_COST
#define MV_OP_NULL SK_OP_NULL
#define MV_OP_CREATE SK_OP_CREATE
#define _MV_OP_UNARY_START _SK_OP_UNARY_START
#define MV_OP_RELU SK_OP_RELU
#define MV_OP_SOFTMAX SK_OP_SOFTMAX
#define _MV_OP_BINARY_START _SK_OP_BINARY_START
#define MV_OP_ADD SK_OP_ADD
#define MV_OP_SUB SK_OP_SUB
#define MV_OP_MATMUL SK_OP_MATMUL
#define MV_OP_CROSS_ENTROPY SK_OP_CROSS_ENTROPY
#define MODEL_VAR_MAX_INPUTS SK_MV_MAX_INPUTS
#define MV_NUM_INPUTS SK_MV_NUM_INPUTS
#define model_var sk_model_var
#define model_var_flags sk_mv_flags
#define model_var_op sk_mv_op
#define model_program sk_model_prog
#define model_context sk_model
#define model_training_desc sk_training_desc
#define mv_create sk_mv_create
#define mv_relu sk_mv_relu
#define mv_softmax sk_mv_softmax
#define mv_add sk_mv_add
#define mv_sub sk_mv_sub
#define mv_matmul sk_mv_matmul
#define mv_cross_entropy sk_mv_cross_entropy
#define model_prog_create sk_model_prog_create
#define model_prog_compute sk_model_prog_compute
#define model_prog_compute_grads sk_model_prog_compute_grads
#define model_create sk_model_create
#define model_compile sk_model_compile
#define model_feedforward sk_model_feedforward
#define model_train sk_model_train
#endif /* SK_MODEL_H */