diff options
| author | y-jan137 <yousefjan24000@gmail.com> | 2026-03-18 14:04:47 +0300 |
|---|---|---|
| committer | y-jan137 <yousefjan24000@gmail.com> | 2026-03-18 14:04:47 +0300 |
| commit | 063b20be98747ba0b288545e653ef9489bf14a54 (patch) | |
| tree | b655758d2361dda0c6ffd35d6add6c5ea0f5aba4 /src/dynmlp.c | |
| parent | c9583c9897120cea7357ebc78b621aac0440da2c (diff) | |
Replace DynMLP with DynNet
Diffstat (limited to 'src/dynmlp.c')
| -rw-r--r-- | src/dynmlp.c | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/src/dynmlp.c b/src/dynmlp.c deleted file mode 100644 index 70c9b75..0000000 --- a/src/dynmlp.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "dynmlp.h" - -#include <math.h> - -static void xavier_init(double *w, int fan_in, int fan_out, RNG *r) { - double limit = sqrt(6.0 / (fan_in + fan_out)); - int n = fan_in * fan_out; - for (int i = 0; i < n; i++) - w[i] = (2.0 * rng_uniform(r) - 1.0) * limit; -} - -int dynmlp_nparams(int D, int H) { - return (D + 1) * H + H + H * D + D; -} - -void dynmlp_init(DynMLP *net, int D, int H, double *theta, RNG *r) { - net->D = D; - net->H = H; - net->nparams = dynmlp_nparams(D, H); - xavier_init(theta + DYNMLP_W1(D, H), D + 1, H, r); - vec_zero(theta + DYNMLP_b1(D, H), H); - xavier_init(theta + DYNMLP_W2(D, H), H, D, r); - vec_zero(theta + DYNMLP_b2(D, H), D); -} - -void dynmlp_forward(const DynMLP *net, const double *theta, - const double *z, double t, double *out, - Workspace *ws) { - int D = net->D, H = net->H; - const double *W1 = theta + DYNMLP_W1(D, H); - const double *b1 = theta + DYNMLP_b1(D, H); - const double *W2 = theta + DYNMLP_W2(D, H); - const double *b2 = theta + DYNMLP_b2(D, H); - - double *x = ws->x; - double *h_pre = ws->h_pre; - double *h = ws->h; - - vec_copy(z, x, D); - x[D] = t; - - mat_vec(W1, x, h_pre, H, D + 1); - vec_add_scaled(h_pre, 1.0, b1, H); - - for (int i = 0; i < H; i++) h[i] = tanh(h_pre[i]); - - mat_vec(W2, h, out, D, H); - vec_add_scaled(out, 1.0, b2, D); -} - -void dynmlp_vjp(const DynMLP *net, const double *theta, - const double *z, double t, const double *v, - double *vjp_z, double *vjp_theta, - Workspace *ws) { - int D = net->D; - int H = net->H; - const double *W1 = theta + DYNMLP_W1(D, H); - const double *b1 = theta + DYNMLP_b1(D, H); - const double *W2 = theta + DYNMLP_W2(D, H); - double *dW1 = vjp_theta + DYNMLP_W1(D, H); - double *db1 = vjp_theta + DYNMLP_b1(D, H); - double *dW2 = vjp_theta + DYNMLP_W2(D, H); - double *db2 = vjp_theta + DYNMLP_b2(D, H); - - double *x = ws->x; - double *h_pre = ws->h_pre; - double *h = ws->h; - vec_copy(z, x, D); - x[D] = t; - mat_vec(W1, x, h_pre, H, D + 1); - vec_add_scaled(h_pre, 1.0, b1, H); - - for (int i = 0; i < H; i++) - h[i] = tanh(h_pre[i]); - - double *dh = ws->dh; - double *dh_pre = ws->dh_pre; - double *dx = ws->dx; - vec_zero(dh, H); - vec_zero(dx, D + 1); - - mat_vec_T(W2, v, dh, D, H); - mat_outer_add(dW2, 1.0, v, h, D, H); - vec_add_scaled(db2, 1.0, v, D); - - for (int i = 0; i < H; i++) - dh_pre[i] = (1.0 - h[i] * h[i]) * dh[i]; - - mat_vec_T(W1, dh_pre, dx, H, D + 1); - mat_outer_add(dW1, 1.0, dh_pre, x, H, D + 1); - vec_add_scaled(db1, 1.0, dh_pre, H); - - vec_copy(dx, vjp_z, D); -} |