@seanhogg/builderforce-memory-engine 2026.7.14 → 2026.9.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +14 -0
  2. package/dist/bench/adaptation.d.ts +57 -0
  3. package/dist/bench/adaptation.d.ts.map +1 -0
  4. package/dist/bench/adaptation.js +167 -0
  5. package/dist/bench/adaptation.js.map +1 -0
  6. package/dist/bench/harness.d.ts +2 -0
  7. package/dist/bench/harness.d.ts.map +1 -1
  8. package/dist/bench/harness.js +1 -1
  9. package/dist/bench/harness.js.map +1 -1
  10. package/dist/bench/index.d.ts +5 -3
  11. package/dist/bench/index.d.ts.map +1 -1
  12. package/dist/bench/index.js +4 -2
  13. package/dist/bench/index.js.map +1 -1
  14. package/dist/bench/types.d.ts +88 -0
  15. package/dist/bench/types.d.ts.map +1 -1
  16. package/dist/evermind/adapt.d.ts +40 -0
  17. package/dist/evermind/adapt.d.ts.map +1 -0
  18. package/dist/evermind/adapt.js +25 -0
  19. package/dist/evermind/adapt.js.map +1 -0
  20. package/dist/evermind/delta_wire.d.ts +43 -0
  21. package/dist/evermind/delta_wire.d.ts.map +1 -0
  22. package/dist/evermind/delta_wire.js +94 -0
  23. package/dist/evermind/delta_wire.js.map +1 -0
  24. package/dist/evermind/eval.d.ts +31 -0
  25. package/dist/evermind/eval.d.ts.map +1 -0
  26. package/dist/evermind/eval.js +36 -0
  27. package/dist/evermind/eval.js.map +1 -0
  28. package/dist/evermind/index.d.ts +16 -0
  29. package/dist/evermind/index.d.ts.map +1 -0
  30. package/dist/evermind/index.js +11 -0
  31. package/dist/evermind/index.js.map +1 -0
  32. package/dist/evermind/merge.d.ts +21 -0
  33. package/dist/evermind/merge.d.ts.map +1 -0
  34. package/dist/evermind/merge.js +79 -0
  35. package/dist/evermind/merge.js.map +1 -0
  36. package/dist/{moe/moe_package.d.ts → evermind/package.d.ts} +55 -5
  37. package/dist/evermind/package.d.ts.map +1 -0
  38. package/dist/{moe/moe_package.js → evermind/package.js} +118 -19
  39. package/dist/evermind/package.js.map +1 -0
  40. package/dist/import/foreign/adapter.d.ts +59 -0
  41. package/dist/import/foreign/adapter.d.ts.map +1 -0
  42. package/dist/import/foreign/adapter.js +76 -0
  43. package/dist/import/foreign/adapter.js.map +1 -0
  44. package/dist/import/foreign/apply.d.ts +23 -0
  45. package/dist/import/foreign/apply.d.ts.map +1 -0
  46. package/dist/import/foreign/apply.js +43 -0
  47. package/dist/import/foreign/apply.js.map +1 -0
  48. package/dist/import/foreign/codestral_mamba.d.ts +57 -0
  49. package/dist/import/foreign/codestral_mamba.d.ts.map +1 -0
  50. package/dist/import/foreign/codestral_mamba.js +174 -0
  51. package/dist/import/foreign/codestral_mamba.js.map +1 -0
  52. package/dist/import/foreign/falcon_mamba.d.ts +51 -0
  53. package/dist/import/foreign/falcon_mamba.d.ts.map +1 -0
  54. package/dist/import/foreign/falcon_mamba.js +131 -0
  55. package/dist/import/foreign/falcon_mamba.js.map +1 -0
  56. package/dist/import/foreign/index.d.ts +21 -0
  57. package/dist/import/foreign/index.d.ts.map +1 -0
  58. package/dist/import/foreign/index.js +18 -0
  59. package/dist/import/foreign/index.js.map +1 -0
  60. package/dist/import/foreign/plan.d.ts +122 -0
  61. package/dist/import/foreign/plan.d.ts.map +1 -0
  62. package/dist/import/foreign/plan.js +171 -0
  63. package/dist/import/foreign/plan.js.map +1 -0
  64. package/dist/import/foreign/registry.d.ts +35 -0
  65. package/dist/import/foreign/registry.d.ts.map +1 -0
  66. package/dist/import/foreign/registry.js +89 -0
  67. package/dist/import/foreign/registry.js.map +1 -0
  68. package/dist/import/index.d.ts +7 -0
  69. package/dist/import/index.d.ts.map +1 -1
  70. package/dist/import/index.js +7 -0
  71. package/dist/import/index.js.map +1 -1
  72. package/dist/index.d.ts +25 -12
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +21 -9
  75. package/dist/index.js.map +1 -1
  76. package/dist/kernels/selective_scan.d.ts.map +1 -1
  77. package/dist/kernels/selective_scan.js +15 -9
  78. package/dist/kernels/selective_scan.js.map +1 -1
  79. package/dist/kernels/slice.d.ts +26 -0
  80. package/dist/kernels/slice.d.ts.map +1 -0
  81. package/dist/kernels/slice.js +52 -0
  82. package/dist/kernels/slice.js.map +1 -0
  83. package/dist/kernels/weight_update.d.ts.map +1 -1
  84. package/dist/kernels/weight_update.js +30 -4
  85. package/dist/kernels/weight_update.js.map +1 -1
  86. package/dist/lm/evermind_lm.d.ts +110 -1
  87. package/dist/lm/evermind_lm.d.ts.map +1 -1
  88. package/dist/lm/evermind_lm.js +220 -35
  89. package/dist/lm/evermind_lm.js.map +1 -1
  90. package/dist/lm/index.d.ts +4 -2
  91. package/dist/lm/index.d.ts.map +1 -1
  92. package/dist/lm/index.js +3 -1
  93. package/dist/lm/index.js.map +1 -1
  94. package/dist/lm/text_embedder.d.ts +55 -0
  95. package/dist/lm/text_embedder.d.ts.map +1 -0
  96. package/dist/lm/text_embedder.js +62 -0
  97. package/dist/lm/text_embedder.js.map +1 -0
  98. package/dist/model/attention_block.d.ts.map +1 -1
  99. package/dist/model/attention_block.js +9 -5
  100. package/dist/model/attention_block.js.map +1 -1
  101. package/dist/model/mamba1_block.d.ts.map +1 -1
  102. package/dist/model/mamba1_block.js +28 -12
  103. package/dist/model/mamba1_block.js.map +1 -1
  104. package/dist/model/mamba2_block.d.ts.map +1 -1
  105. package/dist/model/mamba2_block.js +14 -9
  106. package/dist/model/mamba2_block.js.map +1 -1
  107. package/dist/model/mamba3_block.d.ts.map +1 -1
  108. package/dist/model/mamba3_block.js +14 -9
  109. package/dist/model/mamba3_block.js.map +1 -1
  110. package/dist/moe/index.d.ts +0 -2
  111. package/dist/moe/index.d.ts.map +1 -1
  112. package/dist/moe/index.js +0 -1
  113. package/dist/moe/index.js.map +1 -1
  114. package/dist/optim/adamw.d.ts +32 -0
  115. package/dist/optim/adamw.d.ts.map +1 -1
  116. package/dist/optim/adamw.js +34 -0
  117. package/dist/optim/adamw.js.map +1 -1
  118. package/dist/tokenizer/bpe.d.ts +28 -0
  119. package/dist/tokenizer/bpe.d.ts.map +1 -1
  120. package/dist/tokenizer/bpe.js +47 -0
  121. package/dist/tokenizer/bpe.js.map +1 -1
  122. package/dist/training/cpu_ops.d.ts +44 -0
  123. package/dist/training/cpu_ops.d.ts.map +1 -0
  124. package/dist/training/cpu_ops.js +111 -0
  125. package/dist/training/cpu_ops.js.map +1 -0
  126. package/dist/training/mamba1_cpu.d.ts +109 -0
  127. package/dist/training/mamba1_cpu.d.ts.map +1 -0
  128. package/dist/training/mamba1_cpu.js +316 -0
  129. package/dist/training/mamba1_cpu.js.map +1 -0
  130. package/dist/training/model_cpu.d.ts +100 -0
  131. package/dist/training/model_cpu.d.ts.map +1 -0
  132. package/dist/training/model_cpu.js +252 -0
  133. package/dist/training/model_cpu.js.map +1 -0
  134. package/dist/training/trainer.d.ts +156 -16
  135. package/dist/training/trainer.d.ts.map +1 -1
  136. package/dist/training/trainer.js +327 -101
  137. package/dist/training/trainer.js.map +1 -1
  138. package/dist/utils/base64.d.ts +12 -0
  139. package/dist/utils/base64.d.ts.map +1 -0
  140. package/dist/utils/base64.js +27 -0
  141. package/dist/utils/base64.js.map +1 -0
  142. package/package.json +3 -1
  143. package/src/bench/adaptation.ts +180 -0
  144. package/src/bench/harness.ts +1 -1
  145. package/src/bench/index.ts +13 -2
  146. package/src/bench/types.ts +93 -0
  147. package/src/evermind/adapt.ts +61 -0
  148. package/src/evermind/delta_wire.ts +114 -0
  149. package/src/evermind/eval.ts +62 -0
  150. package/src/evermind/index.ts +33 -0
  151. package/src/evermind/merge.ts +106 -0
  152. package/src/{moe/moe_package.ts → evermind/package.ts} +148 -17
  153. package/src/import/foreign/adapter.ts +106 -0
  154. package/src/import/foreign/apply.ts +54 -0
  155. package/src/import/foreign/codestral_mamba.ts +224 -0
  156. package/src/import/foreign/falcon_mamba.ts +173 -0
  157. package/src/import/foreign/index.ts +37 -0
  158. package/src/import/foreign/plan.ts +294 -0
  159. package/src/import/foreign/registry.ts +126 -0
  160. package/src/import/index.ts +30 -0
  161. package/src/index.ts +98 -13
  162. package/src/kernels/selective_scan.ts +15 -9
  163. package/src/kernels/slice.ts +64 -0
  164. package/src/kernels/weight_update.ts +30 -4
  165. package/src/lm/evermind_lm.ts +244 -34
  166. package/src/lm/index.ts +6 -2
  167. package/src/lm/text_embedder.ts +84 -0
  168. package/src/model/attention_block.ts +9 -5
  169. package/src/model/mamba1_block.ts +28 -12
  170. package/src/model/mamba2_block.ts +14 -9
  171. package/src/model/mamba3_block.ts +14 -9
  172. package/src/moe/index.ts +0 -9
  173. package/src/optim/adamw.ts +60 -0
  174. package/src/tokenizer/bpe.ts +55 -0
  175. package/src/training/cpu_ops.ts +127 -0
  176. package/src/training/mamba1_cpu.ts +421 -0
  177. package/src/training/model_cpu.ts +360 -0
  178. package/src/training/trainer.ts +397 -154
  179. package/src/utils/base64.ts +28 -0
  180. package/dist/model/mamba_block.d.ts +0 -64
  181. package/dist/model/mamba_block.d.ts.map +0 -1
  182. package/dist/model/mamba_block.js +0 -303
  183. package/dist/model/mamba_block.js.map +0 -1
  184. package/dist/moe/moe_package.d.ts.map +0 -1
  185. package/dist/moe/moe_package.js.map +0 -1
  186. package/src/model/mamba_block.ts +0 -401
@@ -0,0 +1,111 @@
1
+ /**
2
+ * cpu_ops.ts — the small set of exact CPU primitives the reference forward and
3
+ * backward passes share (linear, RMSNorm, SiLU, softplus).
4
+ *
5
+ * Each one mirrors a WGSL kernel exactly, so a gradient computed here is the
6
+ * gradient of the function the GPU actually evaluates. They are deliberately
7
+ * plain loops over `Float32Array`: correctness first, and small enough that the
8
+ * finite-difference check in `tests/backprop.test.ts` is meaningful.
9
+ */
10
+ /** Epsilon used by `rmsnorm_forward` in `ACTIVATIONS_WGSL`. */
11
+ export const RMSNORM_EPS = 1e-6;
12
+ export function sigmoid(x) {
13
+ return 1 / (1 + Math.exp(-x));
14
+ }
15
+ /** SiLU(x) = x * sigmoid(x) — mirrors `silu_forward`. */
16
+ export function silu(x) {
17
+ return x / (1 + Math.exp(-x));
18
+ }
19
+ /** d/dx SiLU(x) = sigmoid(x) * (1 + x * (1 - sigmoid(x))). */
20
+ export function siluGrad(x) {
21
+ const s = sigmoid(x);
22
+ return s * (1 + x * (1 - s));
23
+ }
24
+ /** Numerically stable softplus — mirrors the kernel's `max(x,0) + log1p(exp(-|x|))`. */
25
+ export function softplus(x) {
26
+ return Math.max(x, 0) + Math.log1p(Math.exp(-Math.abs(x)));
27
+ }
28
+ /**
29
+ * Y = X @ W^T + b, mirroring `linear_forward`.
30
+ *
31
+ * @param X (M, K)
32
+ * @param W (N, K) row-major
33
+ * @param b (N,)
34
+ * @param out (M, N) — written, not accumulated
35
+ */
36
+ export function linearForward(X, W, b, M, K, N, out) {
37
+ for (let r = 0; r < M; r++) {
38
+ const xo = r * K;
39
+ const yo = r * N;
40
+ for (let n = 0; n < N; n++) {
41
+ let acc = b[n];
42
+ const wo = n * K;
43
+ for (let k = 0; k < K; k++)
44
+ acc += X[xo + k] * W[wo + k];
45
+ out[yo + n] = acc;
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Backward of {@link linearForward}. `dX` is written; `dW` and `db` are
51
+ * ACCUMULATED into (so one parameter can collect gradient from several call
52
+ * sites without a temporary).
53
+ */
54
+ export function linearBackward(dY, X, W, M, K, N, dX, dW, db) {
55
+ dX.fill(0);
56
+ for (let r = 0; r < M; r++) {
57
+ const xo = r * K;
58
+ const yo = r * N;
59
+ for (let n = 0; n < N; n++) {
60
+ const g = dY[yo + n];
61
+ if (g === 0)
62
+ continue;
63
+ db[n] = db[n] + g;
64
+ const wo = n * K;
65
+ for (let k = 0; k < K; k++) {
66
+ dX[xo + k] = dX[xo + k] + g * W[wo + k];
67
+ dW[wo + k] = dW[wo + k] + g * X[xo + k];
68
+ }
69
+ }
70
+ }
71
+ }
72
+ /**
73
+ * RMSNorm forward — mirrors `rmsnorm_forward`:
74
+ * inv[r] = 1 / sqrt(mean(x[r]²) + eps); y[r,i] = x[r,i] * inv[r] * w[i]
75
+ */
76
+ export function rmsNormForward(x, w, M, D, out, inv, eps = RMSNORM_EPS) {
77
+ for (let r = 0; r < M; r++) {
78
+ const base = r * D;
79
+ let sq = 0;
80
+ for (let i = 0; i < D; i++) {
81
+ const v = x[base + i];
82
+ sq += v * v;
83
+ }
84
+ const iv = 1 / Math.sqrt(sq / D + eps);
85
+ inv[r] = iv;
86
+ for (let i = 0; i < D; i++)
87
+ out[base + i] = x[base + i] * iv * w[i];
88
+ }
89
+ }
90
+ /**
91
+ * RMSNorm backward. `dx` and `dw` are ACCUMULATED into — `dx` in particular is
92
+ * usually the residual path, which already carries a gradient.
93
+ */
94
+ export function rmsNormBackward(dY, x, w, inv, M, D, dx, dw, _eps = RMSNORM_EPS) {
95
+ for (let r = 0; r < M; r++) {
96
+ const base = r * D;
97
+ const iv = inv[r];
98
+ let dot = 0; // Σ_i (dY[r,i] * w[i]) * x[r,i]
99
+ for (let i = 0; i < D; i++) {
100
+ const g = dY[base + i] * w[i];
101
+ dot += g * x[base + i];
102
+ dw[i] = dw[i] + dY[base + i] * x[base + i] * iv;
103
+ }
104
+ const scale = (iv * iv * iv) / D;
105
+ for (let i = 0; i < D; i++) {
106
+ const g = dY[base + i] * w[i];
107
+ dx[base + i] = dx[base + i] + g * iv - scale * dot * x[base + i];
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=cpu_ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu_ops.js","sourceRoot":"","sources":["../../src/training/cpu_ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * mamba1_cpu.ts — exact CPU forward + backward for a Mamba-1 (S6) block.
3
+ *
4
+ * This is the REFERENCE implementation of the same maths the WGSL kernels run
5
+ * (`rmsnorm_forward`, `linear_forward`, `conv1d_forward`, `silu_forward`,
6
+ * `forward_scan` + `forward_reduce`). It exists so real per-parameter gradients
7
+ * can be computed — and, crucially, PROVEN correct by finite differences —
8
+ * without a WebGPU device. {@link MambaTrainer} consumes it as its gradient
9
+ * engine: the optimizer (AdamW + trust region + NaN guard) stays on the GPU,
10
+ * the gradients are exact.
11
+ *
12
+ * Every formula below is a line-for-line mirror of the corresponding kernel; if
13
+ * a kernel changes, this file changes with it and `tests/backprop.test.ts`
14
+ * catches the drift (the gradient check fails the moment forward and backward
15
+ * disagree).
16
+ *
17
+ * Layout conventions (identical to the GPU buffers):
18
+ * x (M, dModel) M = batch * seqLen, row r = b * seqLen + t
19
+ * wInProj (2*dInner, dModel) row-major, Y = X @ W^T + b
20
+ * wConv (dInner, dConv) depthwise, causal
21
+ * wXProj (dtRank + 2*dState, dInner)
22
+ * wDtProj (dInner, dtRank)
23
+ * A_log (dInner, dState)
24
+ * wOutProj (dModel, dInner)
25
+ * hCache (B, L, dInner, dState)
26
+ */
27
+ /** The 13 learnable tensors of a Mamba-1 block, keyed by the SAME names
28
+ * {@link Mamba1Block.parameters} publishes. */
29
+ export interface Mamba1CpuWeights {
30
+ wInProj: Float32Array;
31
+ bInProj: Float32Array;
32
+ wConv: Float32Array;
33
+ bConv: Float32Array;
34
+ wXProj: Float32Array;
35
+ bXProj: Float32Array;
36
+ wDtProj: Float32Array;
37
+ bDtProj: Float32Array;
38
+ A_log: Float32Array;
39
+ D_vec: Float32Array;
40
+ wOutProj: Float32Array;
41
+ bOutProj: Float32Array;
42
+ normWeight: Float32Array;
43
+ }
44
+ /** Parameter names of a Mamba-1 block, in `parameters()` order. */
45
+ export declare const MAMBA1_PARAM_NAMES: readonly ["wInProj", "bInProj", "wConv", "bConv", "wXProj", "bXProj", "wDtProj", "bDtProj", "A_log", "D_vec", "wOutProj", "bOutProj", "normWeight"];
46
+ export interface Mamba1CpuDims {
47
+ dModel: number;
48
+ dState: number;
49
+ dConv: number;
50
+ dInner: number;
51
+ dtRank: number;
52
+ batch: number;
53
+ seqLen: number;
54
+ }
55
+ /** Everything the backward pass needs from the forward pass. */
56
+ export interface Mamba1CpuCache {
57
+ x: Float32Array;
58
+ normInv: Float32Array;
59
+ normOut: Float32Array;
60
+ xConvIn: Float32Array;
61
+ z: Float32Array;
62
+ convOut: Float32Array;
63
+ u: Float32Array;
64
+ dtRaw: Float32Array;
65
+ bRaw: Float32Array;
66
+ cRaw: Float32Array;
67
+ deltaFull: Float32Array;
68
+ dv: Float32Array;
69
+ aCont: Float32Array;
70
+ aBar: Float32Array;
71
+ bBar: Float32Array;
72
+ h: Float32Array;
73
+ scanY: Float32Array;
74
+ siluZ: Float32Array;
75
+ gated: Float32Array;
76
+ }
77
+ export interface Mamba1CpuForwardResult {
78
+ output: Float32Array;
79
+ cache: Mamba1CpuCache;
80
+ }
81
+ /** Gradients for every Mamba-1 parameter, same keys as {@link Mamba1CpuWeights}. */
82
+ export type Mamba1CpuGrads = Record<keyof Mamba1CpuWeights, Float32Array>;
83
+ /**
84
+ * Clamp bounds on `A_log` applied by `discretise_A`/`discretise_B` in
85
+ * `SELECTIVE_SCAN_FORWARD_WGSL`. Outside this range the kernel's output is
86
+ * constant in `A_log`, so the gradient is exactly zero — mirrored here so the
87
+ * analytic gradient matches the function the model actually computes.
88
+ */
89
+ export declare const A_LOG_CLAMP_LO = -10;
90
+ export declare const A_LOG_CLAMP_HI = 5;
91
+ /** Allocate a zeroed gradient set matching `dims`. */
92
+ export declare function zeroMamba1Grads(dims: Mamba1CpuDims): Mamba1CpuGrads;
93
+ /**
94
+ * Exact CPU forward for one Mamba-1 block.
95
+ *
96
+ * Mirrors `Mamba1Block.forward` step for step:
97
+ * RMSNorm → in_proj → split(x, z) → causal conv1d → SiLU → x_proj(Δ, B, C)
98
+ * → dt_proj → selective scan → gate by SiLU(z) → out_proj → residual add.
99
+ */
100
+ export declare function mamba1CpuForward(x: Float32Array, w: Mamba1CpuWeights, dims: Mamba1CpuDims): Mamba1CpuForwardResult;
101
+ /**
102
+ * Exact CPU backward for one Mamba-1 block.
103
+ *
104
+ * @param dOut dL/d(block output), (M, dModel)
105
+ * @param grads accumulator — parameter gradients are ADDED into it
106
+ * @returns dL/d(block input), (M, dModel)
107
+ */
108
+ export declare function mamba1CpuBackward(dOut: Float32Array, w: Mamba1CpuWeights, cache: Mamba1CpuCache, dims: Mamba1CpuDims, grads: Mamba1CpuGrads): Float32Array;
109
+ //# sourceMappingURL=mamba1_cpu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mamba1_cpu.d.ts","sourceRoot":"","sources":["../../src/training/mamba1_cpu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAcH;gDACgD;AAChD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAK,YAAY,CAAC;IACzB,OAAO,EAAK,YAAY,CAAC;IACzB,KAAK,EAAO,YAAY,CAAC;IACzB,KAAK,EAAO,YAAY,CAAC;IACzB,MAAM,EAAM,YAAY,CAAC;IACzB,MAAM,EAAM,YAAY,CAAC;IACzB,OAAO,EAAK,YAAY,CAAC;IACzB,OAAO,EAAK,YAAY,CAAC;IACzB,KAAK,EAAO,YAAY,CAAC;IACzB,KAAK,EAAO,YAAY,CAAC;IACzB,QAAQ,EAAI,YAAY,CAAC;IACzB,QAAQ,EAAI,YAAY,CAAC;IACzB,UAAU,EAAE,YAAY,CAAC;CAC5B;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,qJAG2B,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAG,MAAM,CAAC;IAChB,MAAM,EAAG,MAAM,CAAC;IAChB,KAAK,EAAI,MAAM,CAAC;IAChB,MAAM,EAAG,MAAM,CAAC;IAChB,MAAM,EAAG,MAAM,CAAC;IAChB,KAAK,EAAI,MAAM,CAAC;IAChB,MAAM,EAAG,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC3B,CAAC,EAAU,YAAY,CAAC;IACxB,OAAO,EAAI,YAAY,CAAC;IACxB,OAAO,EAAI,YAAY,CAAC;IACxB,OAAO,EAAI,YAAY,CAAC;IACxB,CAAC,EAAU,YAAY,CAAC;IACxB,OAAO,EAAI,YAAY,CAAC;IACxB,CAAC,EAAU,YAAY,CAAC;IACxB,KAAK,EAAM,YAAY,CAAC;IACxB,IAAI,EAAO,YAAY,CAAC;IACxB,IAAI,EAAO,YAAY,CAAC;IACxB,SAAS,EAAE,YAAY,CAAC;IACxB,EAAE,EAAS,YAAY,CAAC;IACxB,KAAK,EAAM,YAAY,CAAC;IACxB,IAAI,EAAO,YAAY,CAAC;IACxB,IAAI,EAAO,YAAY,CAAC;IACxB,CAAC,EAAU,YAAY,CAAC;IACxB,KAAK,EAAM,YAAY,CAAC;IACxB,KAAK,EAAM,YAAY,CAAC;IACxB,KAAK,EAAM,YAAY,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAG,cAAc,CAAC;CAC1B;AAED,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAiBnE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC5B,CAAC,EAAE,YAAY,EACf,CAAC,EAAE,gBAAgB,EACnB,IAAI,EAAE,aAAa,GACpB,sBAAsB,CAoHxB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,YAAY,EAClB,CAAC,EAAE,gBAAgB,EACnB,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,GACtB,YAAY,CAiJd"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * mamba1_cpu.ts — exact CPU forward + backward for a Mamba-1 (S6) block.
3
+ *
4
+ * This is the REFERENCE implementation of the same maths the WGSL kernels run
5
+ * (`rmsnorm_forward`, `linear_forward`, `conv1d_forward`, `silu_forward`,
6
+ * `forward_scan` + `forward_reduce`). It exists so real per-parameter gradients
7
+ * can be computed — and, crucially, PROVEN correct by finite differences —
8
+ * without a WebGPU device. {@link MambaTrainer} consumes it as its gradient
9
+ * engine: the optimizer (AdamW + trust region + NaN guard) stays on the GPU,
10
+ * the gradients are exact.
11
+ *
12
+ * Every formula below is a line-for-line mirror of the corresponding kernel; if
13
+ * a kernel changes, this file changes with it and `tests/backprop.test.ts`
14
+ * catches the drift (the gradient check fails the moment forward and backward
15
+ * disagree).
16
+ *
17
+ * Layout conventions (identical to the GPU buffers):
18
+ * x (M, dModel) M = batch * seqLen, row r = b * seqLen + t
19
+ * wInProj (2*dInner, dModel) row-major, Y = X @ W^T + b
20
+ * wConv (dInner, dConv) depthwise, causal
21
+ * wXProj (dtRank + 2*dState, dInner)
22
+ * wDtProj (dInner, dtRank)
23
+ * A_log (dInner, dState)
24
+ * wOutProj (dModel, dInner)
25
+ * hCache (B, L, dInner, dState)
26
+ */
27
+ import { linearForward, linearBackward, rmsNormForward, rmsNormBackward, silu, siluGrad, softplus, sigmoid, RMSNORM_EPS, } from './cpu_ops.js';
28
+ /** Parameter names of a Mamba-1 block, in `parameters()` order. */
29
+ export const MAMBA1_PARAM_NAMES = [
30
+ 'wInProj', 'bInProj', 'wConv', 'bConv', 'wXProj', 'bXProj',
31
+ 'wDtProj', 'bDtProj', 'A_log', 'D_vec', 'wOutProj', 'bOutProj', 'normWeight',
32
+ ];
33
+ /**
34
+ * Clamp bounds on `A_log` applied by `discretise_A`/`discretise_B` in
35
+ * `SELECTIVE_SCAN_FORWARD_WGSL`. Outside this range the kernel's output is
36
+ * constant in `A_log`, so the gradient is exactly zero — mirrored here so the
37
+ * analytic gradient matches the function the model actually computes.
38
+ */
39
+ export const A_LOG_CLAMP_LO = -10;
40
+ export const A_LOG_CLAMP_HI = 5;
41
+ /** Allocate a zeroed gradient set matching `dims`. */
42
+ export function zeroMamba1Grads(dims) {
43
+ const { dModel, dState: N, dConv: K, dInner: D, dtRank: R } = dims;
44
+ return {
45
+ wInProj: new Float32Array(2 * D * dModel),
46
+ bInProj: new Float32Array(2 * D),
47
+ wConv: new Float32Array(D * K),
48
+ bConv: new Float32Array(D),
49
+ wXProj: new Float32Array((R + 2 * N) * D),
50
+ bXProj: new Float32Array(R + 2 * N),
51
+ wDtProj: new Float32Array(D * R),
52
+ bDtProj: new Float32Array(D),
53
+ A_log: new Float32Array(D * N),
54
+ D_vec: new Float32Array(D),
55
+ wOutProj: new Float32Array(dModel * D),
56
+ bOutProj: new Float32Array(dModel),
57
+ normWeight: new Float32Array(dModel),
58
+ };
59
+ }
60
+ /**
61
+ * Exact CPU forward for one Mamba-1 block.
62
+ *
63
+ * Mirrors `Mamba1Block.forward` step for step:
64
+ * RMSNorm → in_proj → split(x, z) → causal conv1d → SiLU → x_proj(Δ, B, C)
65
+ * → dt_proj → selective scan → gate by SiLU(z) → out_proj → residual add.
66
+ */
67
+ export function mamba1CpuForward(x, w, dims) {
68
+ const { dModel, dState: N, dConv: K, dInner: D, dtRank: R, batch: B, seqLen: L } = dims;
69
+ const M = B * L;
70
+ const P = R + 2 * N;
71
+ // 1. Pre-block RMSNorm.
72
+ const normOut = new Float32Array(M * dModel);
73
+ const normInv = new Float32Array(M);
74
+ rmsNormForward(x, w.normWeight, M, dModel, normOut, normInv);
75
+ // 2. Input projection → (x, z).
76
+ const inProj = new Float32Array(M * 2 * D);
77
+ linearForward(normOut, w.wInProj, w.bInProj, M, dModel, 2 * D, inProj);
78
+ // 3. COLUMN split: x = inProj[:, 0:D], z = inProj[:, D:2D].
79
+ const xConvIn = new Float32Array(M * D);
80
+ const z = new Float32Array(M * D);
81
+ for (let r = 0; r < M; r++) {
82
+ for (let d = 0; d < D; d++) {
83
+ xConvIn[r * D + d] = inProj[r * 2 * D + d];
84
+ z[r * D + d] = inProj[r * 2 * D + D + d];
85
+ }
86
+ }
87
+ // 4. Depthwise causal conv1d over the sequence axis.
88
+ const convOut = new Float32Array(M * D);
89
+ for (let b = 0; b < B; b++) {
90
+ for (let t = 0; t < L; t++) {
91
+ const base = (b * L + t) * D;
92
+ for (let d = 0; d < D; d++) {
93
+ let acc = w.bConv[d];
94
+ for (let k = 0; k < K; k++) {
95
+ if (t >= k)
96
+ acc += w.wConv[d * K + k] * xConvIn[(b * L + t - k) * D + d];
97
+ }
98
+ convOut[base + d] = acc;
99
+ }
100
+ }
101
+ }
102
+ // 5. SiLU.
103
+ const u = new Float32Array(M * D);
104
+ for (let i = 0; i < M * D; i++)
105
+ u[i] = silu(convOut[i]);
106
+ // 6. x_proj → Δ_raw, B, C (COLUMN slices of the (M, R+2N) projection).
107
+ const xProj = new Float32Array(M * P);
108
+ linearForward(u, w.wXProj, w.bXProj, M, D, P, xProj);
109
+ const dtRaw = new Float32Array(M * R);
110
+ const bRaw = new Float32Array(M * N);
111
+ const cRaw = new Float32Array(M * N);
112
+ for (let r = 0; r < M; r++) {
113
+ for (let i = 0; i < R; i++)
114
+ dtRaw[r * R + i] = xProj[r * P + i];
115
+ for (let n = 0; n < N; n++) {
116
+ bRaw[r * N + n] = xProj[r * P + R + n];
117
+ cRaw[r * N + n] = xProj[r * P + R + N + n];
118
+ }
119
+ }
120
+ // 7. dt_proj: expand Δ to the inner dimension.
121
+ const deltaFull = new Float32Array(M * D);
122
+ linearForward(dtRaw, w.wDtProj, w.bDtProj, M, R, D, deltaFull);
123
+ // 8. Selective scan (S6). ZOH discretisation, exactly as the kernel does it.
124
+ const dv = new Float32Array(M * D);
125
+ for (let i = 0; i < M * D; i++)
126
+ dv[i] = softplus(deltaFull[i]);
127
+ const aCont = new Float32Array(D * N);
128
+ for (let i = 0; i < D * N; i++) {
129
+ aCont[i] = -Math.exp(Math.min(A_LOG_CLAMP_HI, Math.max(A_LOG_CLAMP_LO, w.A_log[i])));
130
+ }
131
+ const aBar = new Float32Array(M * D * N);
132
+ const bBar = new Float32Array(M * D * N);
133
+ const h = new Float32Array(M * D * N);
134
+ const scanY = new Float32Array(M * D);
135
+ for (let b = 0; b < B; b++) {
136
+ for (let t = 0; t < L; t++) {
137
+ const r = b * L + t;
138
+ for (let d = 0; d < D; d++) {
139
+ const dvv = dv[r * D + d];
140
+ const uv = u[r * D + d];
141
+ let acc = w.D_vec[d] * uv;
142
+ for (let n = 0; n < N; n++) {
143
+ const ac = aCont[d * N + n];
144
+ const ab = Math.exp(dvv * ac);
145
+ const bb = ((ab - 1) / ac) * bRaw[r * N + n];
146
+ const idx = (r * D + d) * N + n;
147
+ aBar[idx] = ab;
148
+ bBar[idx] = bb;
149
+ const hPrev = t === 0 ? 0 : h[((r - 1) * D + d) * N + n];
150
+ const hv = ab * hPrev + bb * uv;
151
+ h[idx] = hv;
152
+ acc += cRaw[r * N + n] * hv;
153
+ }
154
+ scanY[r * D + d] = acc;
155
+ }
156
+ }
157
+ }
158
+ // 9. Gate: y ⊗ SiLU(z).
159
+ const siluZ = new Float32Array(M * D);
160
+ const gated = new Float32Array(M * D);
161
+ for (let i = 0; i < M * D; i++) {
162
+ siluZ[i] = silu(z[i]);
163
+ gated[i] = scanY[i] * siluZ[i];
164
+ }
165
+ // 10 + 11. Output projection, then the residual add.
166
+ const output = new Float32Array(M * dModel);
167
+ linearForward(gated, w.wOutProj, w.bOutProj, M, D, dModel, output);
168
+ for (let i = 0; i < M * dModel; i++)
169
+ output[i] = output[i] + x[i];
170
+ return {
171
+ output,
172
+ cache: { x, normInv, normOut, xConvIn, z, convOut, u, dtRaw, bRaw, cRaw, deltaFull, dv, aCont, aBar, bBar, h, scanY, siluZ, gated },
173
+ };
174
+ }
175
+ /**
176
+ * Exact CPU backward for one Mamba-1 block.
177
+ *
178
+ * @param dOut dL/d(block output), (M, dModel)
179
+ * @param grads accumulator — parameter gradients are ADDED into it
180
+ * @returns dL/d(block input), (M, dModel)
181
+ */
182
+ export function mamba1CpuBackward(dOut, w, cache, dims, grads) {
183
+ const { dModel, dState: N, dConv: K, dInner: D, dtRank: R, batch: B, seqLen: L } = dims;
184
+ const M = B * L;
185
+ const P = R + 2 * N;
186
+ // 11. Residual: the block input receives dOut directly, plus whatever flows
187
+ // back through the mixer branch (accumulated at the very end).
188
+ const dx = new Float32Array(M * dModel);
189
+ dx.set(dOut);
190
+ // 10. out_proj.
191
+ const dGated = new Float32Array(M * D);
192
+ linearBackward(dOut, cache.gated, w.wOutProj, M, D, dModel, dGated, grads.wOutProj, grads.bOutProj);
193
+ // 9. Gate: gated = scanY * SiLU(z).
194
+ const dScanY = new Float32Array(M * D);
195
+ const dz = new Float32Array(M * D);
196
+ for (let i = 0; i < M * D; i++) {
197
+ dScanY[i] = dGated[i] * cache.siluZ[i];
198
+ dz[i] = dGated[i] * cache.scanY[i] * siluGrad(cache.z[i]);
199
+ }
200
+ // 8. Selective scan, walked backwards in time.
201
+ const du = new Float32Array(M * D);
202
+ const dBRaw = new Float32Array(M * N);
203
+ const dCRaw = new Float32Array(M * N);
204
+ const dDv = new Float32Array(M * D); // dL/d softplus(Δ)
205
+ const dACont = new Float32Array(D * N);
206
+ // dhNext[d*N+n] carries dL/dh_t propagated from step t+1 for the current batch row.
207
+ const dhNext = new Float32Array(D * N);
208
+ for (let b = 0; b < B; b++) {
209
+ dhNext.fill(0);
210
+ for (let t = L - 1; t >= 0; t--) {
211
+ const r = b * L + t;
212
+ for (let d = 0; d < D; d++) {
213
+ const dY = dScanY[r * D + d];
214
+ const uv = cache.u[r * D + d];
215
+ const dvv = cache.dv[r * D + d];
216
+ // Skip connection: y_t[d] += D_vec[d] * u_t[d].
217
+ grads.D_vec[d] = grads.D_vec[d] + dY * uv;
218
+ du[r * D + d] = du[r * D + d] + dY * w.D_vec[d];
219
+ let ddvAcc = 0;
220
+ for (let n = 0; n < N; n++) {
221
+ const idx = (r * D + d) * N + n;
222
+ const hv = cache.h[idx];
223
+ const ab = cache.aBar[idx];
224
+ const bb = cache.bBar[idx];
225
+ const ac = cache.aCont[d * N + n];
226
+ const cv = cache.cRaw[r * N + n];
227
+ // y_t[d] = Σ_n C_t[n] * h_t[d,n]
228
+ dCRaw[r * N + n] = dCRaw[r * N + n] + dY * hv;
229
+ const dh = dY * cv + dhNext[d * N + n];
230
+ // h_t = a_bar * h_{t-1} + b_bar * u_t
231
+ const hPrev = t === 0 ? 0 : cache.h[((r - 1) * D + d) * N + n];
232
+ const dABar = dh * hPrev;
233
+ const dBBar = dh * uv;
234
+ du[r * D + d] = du[r * D + d] + dh * bb;
235
+ dhNext[d * N + n] = dh * ab; // flows to step t-1
236
+ // a_bar = exp(dv * a_cont); b_bar = (a_bar - 1) / a_cont * B_raw
237
+ const bv = cache.bRaw[r * N + n];
238
+ ddvAcc += dABar * ac * ab + dBBar * ab * bv;
239
+ dACont[d * N + n] = dACont[d * N + n]
240
+ + dABar * dvv * ab
241
+ + dBBar * bv * ((dvv * ab * ac - (ab - 1)) / (ac * ac));
242
+ dBRaw[r * N + n] = dBRaw[r * N + n] + dBBar * ((ab - 1) / ac);
243
+ }
244
+ dDv[r * D + d] = dDv[r * D + d] + ddvAcc;
245
+ }
246
+ }
247
+ }
248
+ // a_cont = -exp(clamp(A_log)) ⇒ d a_cont / d A_log = a_cont inside the clamp,
249
+ // and exactly 0 outside it (the kernel's output is constant there).
250
+ for (let i = 0; i < D * N; i++) {
251
+ const al = w.A_log[i];
252
+ if (al <= A_LOG_CLAMP_LO || al >= A_LOG_CLAMP_HI)
253
+ continue;
254
+ grads.A_log[i] = grads.A_log[i] + dACont[i] * cache.aCont[i];
255
+ }
256
+ // softplus: dv = softplus(deltaFull)
257
+ const dDeltaFull = new Float32Array(M * D);
258
+ for (let i = 0; i < M * D; i++)
259
+ dDeltaFull[i] = dDv[i] * sigmoid(cache.deltaFull[i]);
260
+ // 7. dt_proj.
261
+ const dDtRaw = new Float32Array(M * R);
262
+ linearBackward(dDeltaFull, cache.dtRaw, w.wDtProj, M, R, D, dDtRaw, grads.wDtProj, grads.bDtProj);
263
+ // 6. x_proj — re-assemble the (M, P) column slices, then one linear backward.
264
+ const dXProj = new Float32Array(M * P);
265
+ for (let r = 0; r < M; r++) {
266
+ for (let i = 0; i < R; i++)
267
+ dXProj[r * P + i] = dDtRaw[r * R + i];
268
+ for (let n = 0; n < N; n++) {
269
+ dXProj[r * P + R + n] = dBRaw[r * N + n];
270
+ dXProj[r * P + R + N + n] = dCRaw[r * N + n];
271
+ }
272
+ }
273
+ const duFromXProj = new Float32Array(M * D);
274
+ linearBackward(dXProj, cache.u, w.wXProj, M, D, P, duFromXProj, grads.wXProj, grads.bXProj);
275
+ for (let i = 0; i < M * D; i++)
276
+ du[i] = du[i] + duFromXProj[i];
277
+ // 5. SiLU.
278
+ const dConvOut = new Float32Array(M * D);
279
+ for (let i = 0; i < M * D; i++)
280
+ dConvOut[i] = du[i] * siluGrad(cache.convOut[i]);
281
+ // 4. Depthwise causal conv1d.
282
+ const dXConvIn = new Float32Array(M * D);
283
+ for (let b = 0; b < B; b++) {
284
+ for (let t = 0; t < L; t++) {
285
+ const r = b * L + t;
286
+ for (let d = 0; d < D; d++) {
287
+ const g = dConvOut[r * D + d];
288
+ if (g === 0)
289
+ continue;
290
+ grads.bConv[d] = grads.bConv[d] + g;
291
+ for (let k = 0; k < K; k++) {
292
+ if (t < k)
293
+ continue;
294
+ const src = (b * L + t - k) * D + d;
295
+ grads.wConv[d * K + k] = grads.wConv[d * K + k] + g * cache.xConvIn[src];
296
+ dXConvIn[src] = dXConvIn[src] + g * w.wConv[d * K + k];
297
+ }
298
+ }
299
+ }
300
+ }
301
+ // 3. Un-split the (x, z) columns.
302
+ const dInProj = new Float32Array(M * 2 * D);
303
+ for (let r = 0; r < M; r++) {
304
+ for (let d = 0; d < D; d++) {
305
+ dInProj[r * 2 * D + d] = dXConvIn[r * D + d];
306
+ dInProj[r * 2 * D + D + d] = dz[r * D + d];
307
+ }
308
+ }
309
+ // 2. in_proj.
310
+ const dNormOut = new Float32Array(M * dModel);
311
+ linearBackward(dInProj, cache.normOut, w.wInProj, M, dModel, 2 * D, dNormOut, grads.wInProj, grads.bInProj);
312
+ // 1. RMSNorm — adds into the residual path already sitting in `dx`.
313
+ rmsNormBackward(dNormOut, cache.x, w.normWeight, cache.normInv, M, dModel, dx, grads.normWeight, RMSNORM_EPS);
314
+ return dx;
315
+ }
316
+ //# sourceMappingURL=mamba1_cpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mamba1_cpu.js","sourceRoot":"","sources":["../../src/training/mamba1_cpu.ts"],"names":[],"mappings":"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"}