@seanhogg/builderforce-memory-engine 2026.7.12 → 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 (196) 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 +29 -12
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +24 -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 +180 -4
  87. package/dist/lm/evermind_lm.d.ts.map +1 -1
  88. package/dist/lm/evermind_lm.js +433 -116
  89. package/dist/lm/evermind_lm.js.map +1 -1
  90. package/dist/lm/index.d.ts +8 -2
  91. package/dist/lm/index.d.ts.map +1 -1
  92. package/dist/lm/index.js +6 -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 +58 -1
  115. package/dist/optim/adamw.d.ts.map +1 -1
  116. package/dist/optim/adamw.js +69 -4
  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/lora.d.ts +153 -0
  127. package/dist/training/lora.d.ts.map +1 -0
  128. package/dist/training/lora.js +324 -0
  129. package/dist/training/lora.js.map +1 -0
  130. package/dist/training/mamba1_cpu.d.ts +109 -0
  131. package/dist/training/mamba1_cpu.d.ts.map +1 -0
  132. package/dist/training/mamba1_cpu.js +316 -0
  133. package/dist/training/mamba1_cpu.js.map +1 -0
  134. package/dist/training/mixed_precision.d.ts +67 -0
  135. package/dist/training/mixed_precision.d.ts.map +1 -0
  136. package/dist/training/mixed_precision.js +101 -0
  137. package/dist/training/mixed_precision.js.map +1 -0
  138. package/dist/training/model_cpu.d.ts +100 -0
  139. package/dist/training/model_cpu.d.ts.map +1 -0
  140. package/dist/training/model_cpu.js +252 -0
  141. package/dist/training/model_cpu.js.map +1 -0
  142. package/dist/training/trainer.d.ts +156 -16
  143. package/dist/training/trainer.d.ts.map +1 -1
  144. package/dist/training/trainer.js +327 -101
  145. package/dist/training/trainer.js.map +1 -1
  146. package/dist/utils/base64.d.ts +12 -0
  147. package/dist/utils/base64.d.ts.map +1 -0
  148. package/dist/utils/base64.js +27 -0
  149. package/dist/utils/base64.js.map +1 -0
  150. package/package.json +3 -1
  151. package/src/bench/adaptation.ts +180 -0
  152. package/src/bench/harness.ts +1 -1
  153. package/src/bench/index.ts +13 -2
  154. package/src/bench/types.ts +93 -0
  155. package/src/evermind/adapt.ts +61 -0
  156. package/src/evermind/delta_wire.ts +114 -0
  157. package/src/evermind/eval.ts +62 -0
  158. package/src/evermind/index.ts +33 -0
  159. package/src/evermind/merge.ts +106 -0
  160. package/src/{moe/moe_package.ts → evermind/package.ts} +148 -17
  161. package/src/import/foreign/adapter.ts +106 -0
  162. package/src/import/foreign/apply.ts +54 -0
  163. package/src/import/foreign/codestral_mamba.ts +224 -0
  164. package/src/import/foreign/falcon_mamba.ts +173 -0
  165. package/src/import/foreign/index.ts +37 -0
  166. package/src/import/foreign/plan.ts +294 -0
  167. package/src/import/foreign/registry.ts +126 -0
  168. package/src/import/index.ts +30 -0
  169. package/src/index.ts +104 -13
  170. package/src/kernels/selective_scan.ts +15 -9
  171. package/src/kernels/slice.ts +64 -0
  172. package/src/kernels/weight_update.ts +30 -4
  173. package/src/lm/evermind_lm.ts +470 -116
  174. package/src/lm/index.ts +12 -2
  175. package/src/lm/text_embedder.ts +84 -0
  176. package/src/model/attention_block.ts +9 -5
  177. package/src/model/mamba1_block.ts +28 -12
  178. package/src/model/mamba2_block.ts +14 -9
  179. package/src/model/mamba3_block.ts +14 -9
  180. package/src/moe/index.ts +0 -9
  181. package/src/optim/adamw.ts +115 -7
  182. package/src/tokenizer/bpe.ts +55 -0
  183. package/src/training/cpu_ops.ts +127 -0
  184. package/src/training/lora.ts +365 -0
  185. package/src/training/mamba1_cpu.ts +421 -0
  186. package/src/training/mixed_precision.ts +119 -0
  187. package/src/training/model_cpu.ts +360 -0
  188. package/src/training/trainer.ts +397 -154
  189. package/src/utils/base64.ts +28 -0
  190. package/dist/model/mamba_block.d.ts +0 -64
  191. package/dist/model/mamba_block.d.ts.map +0 -1
  192. package/dist/model/mamba_block.js +0 -303
  193. package/dist/model/mamba_block.js.map +0 -1
  194. package/dist/moe/moe_package.d.ts.map +0 -1
  195. package/dist/moe/moe_package.js.map +0 -1
  196. package/src/model/mamba_block.ts +0 -401
@@ -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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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * mixed_precision.ts — mixed-precision training discipline (AMP) for the CPU
3
+ * reference, faithful to the cookbook's recipe:
4
+ *
5
+ * • fp16 compute, fp32 MASTER weights. The model's Float32Array params ARE the
6
+ * master copy; the forward runs on an fp16-rounded view, so tiny weight
7
+ * updates still accumulate in fp32 instead of vanishing.
8
+ * • Dynamic LOSS SCALING. fp16 gradients underflow to zero below ~6e-5; scaling
9
+ * the loss by a large factor S lifts them into fp16 range, then we unscale by
10
+ * S before the optimiser step. On overflow (inf/nan) we skip the step and back
11
+ * the scale off; after a clean streak we grow it. This is the mechanism that
12
+ * makes fp16 training numerically stable.
13
+ *
14
+ * The payoff is memory/throughput: activations and gradients at half precision.
15
+ * On CPU we can't reclaim the bytes, so this module models the NUMERICS exactly
16
+ * (fp16 rounding + loss scaling) — the property the WGSL path will inherit — and
17
+ * its tests prove a small gradient survives WITH scaling and underflows WITHOUT.
18
+ */
19
+ /** Round a value to what fp16 storage would preserve (half-precision simulation). */
20
+ export declare function roundFp16(x: number): number;
21
+ /** Round every element of a copy to fp16 precision (leaves the input untouched). */
22
+ export declare function fp16View(a: Float32Array): Float32Array;
23
+ export interface LossScalerOptions {
24
+ /** Initial scale. Default 2^14 = 16384. */
25
+ initScale?: number;
26
+ /** Multiply the scale by this after `growthInterval` clean steps. Default 2. */
27
+ growthFactor?: number;
28
+ /** Multiply the scale by this on overflow. Default 0.5. */
29
+ backoffFactor?: number;
30
+ /** Clean steps between growth attempts. Default 200. */
31
+ growthInterval?: number;
32
+ /** Floor for the scale so it can't collapse to zero. Default 1. */
33
+ minScale?: number;
34
+ }
35
+ /**
36
+ * Dynamic loss scaler — the standard AMP controller. Scale the loss/grads up
37
+ * before backward, {@link check} them for overflow, {@link unscale} the good ones,
38
+ * and {@link update} the scale based on whether this step overflowed.
39
+ */
40
+ export declare class DynamicLossScaler {
41
+ private _scale;
42
+ private readonly growthFactor;
43
+ private readonly backoffFactor;
44
+ private readonly growthInterval;
45
+ private readonly minScale;
46
+ private cleanStreak;
47
+ private _overflows;
48
+ private _skipped;
49
+ constructor(opts?: LossScalerOptions);
50
+ get scale(): number;
51
+ get overflows(): number;
52
+ get skipped(): number;
53
+ /** True if any gradient is inf/nan (an fp16 overflow) — such a step must be skipped. */
54
+ check(grads: {
55
+ data: Float32Array;
56
+ }[]): boolean;
57
+ /** Divide gradients back down by the current scale, in place. */
58
+ unscale(grads: {
59
+ data: Float32Array;
60
+ }[]): void;
61
+ /**
62
+ * Advance the scale controller. Pass whether this step overflowed. Returns
63
+ * `true` if the optimiser step should PROCEED, `false` if it must be skipped.
64
+ */
65
+ update(overflow: boolean): boolean;
66
+ }
67
+ //# sourceMappingURL=mixed_precision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixed_precision.d.ts","sourceRoot":"","sources":["../../src/training/mixed_precision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAItD;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAK;gBAET,IAAI,GAAE,iBAAsB;IAQxC,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,IAAI,SAAS,IAAI,MAAM,CAEtB;IACD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,wFAAwF;IACxF,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,CAAA;KAAE,EAAE,GAAG,OAAO;IAW/C,iEAAiE;IACjE,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,CAAA;KAAE,EAAE,GAAG,IAAI;IAQ9C;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;CAcnC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * mixed_precision.ts — mixed-precision training discipline (AMP) for the CPU
3
+ * reference, faithful to the cookbook's recipe:
4
+ *
5
+ * • fp16 compute, fp32 MASTER weights. The model's Float32Array params ARE the
6
+ * master copy; the forward runs on an fp16-rounded view, so tiny weight
7
+ * updates still accumulate in fp32 instead of vanishing.
8
+ * • Dynamic LOSS SCALING. fp16 gradients underflow to zero below ~6e-5; scaling
9
+ * the loss by a large factor S lifts them into fp16 range, then we unscale by
10
+ * S before the optimiser step. On overflow (inf/nan) we skip the step and back
11
+ * the scale off; after a clean streak we grow it. This is the mechanism that
12
+ * makes fp16 training numerically stable.
13
+ *
14
+ * The payoff is memory/throughput: activations and gradients at half precision.
15
+ * On CPU we can't reclaim the bytes, so this module models the NUMERICS exactly
16
+ * (fp16 rounding + loss scaling) — the property the WGSL path will inherit — and
17
+ * its tests prove a small gradient survives WITH scaling and underflows WITHOUT.
18
+ */
19
+ import { floatToFp16, fp16ToFloat } from "../utils/quantization.js";
20
+ /** Round a value to what fp16 storage would preserve (half-precision simulation). */
21
+ export function roundFp16(x) {
22
+ return fp16ToFloat(floatToFp16(x));
23
+ }
24
+ /** Round every element of a copy to fp16 precision (leaves the input untouched). */
25
+ export function fp16View(a) {
26
+ const out = new Float32Array(a.length);
27
+ for (let i = 0; i < a.length; i++)
28
+ out[i] = roundFp16(a[i]);
29
+ return out;
30
+ }
31
+ /**
32
+ * Dynamic loss scaler — the standard AMP controller. Scale the loss/grads up
33
+ * before backward, {@link check} them for overflow, {@link unscale} the good ones,
34
+ * and {@link update} the scale based on whether this step overflowed.
35
+ */
36
+ export class DynamicLossScaler {
37
+ _scale;
38
+ growthFactor;
39
+ backoffFactor;
40
+ growthInterval;
41
+ minScale;
42
+ cleanStreak = 0;
43
+ _overflows = 0;
44
+ _skipped = 0;
45
+ constructor(opts = {}) {
46
+ this._scale = opts.initScale ?? 16384;
47
+ this.growthFactor = opts.growthFactor ?? 2;
48
+ this.backoffFactor = opts.backoffFactor ?? 0.5;
49
+ this.growthInterval = opts.growthInterval ?? 200;
50
+ this.minScale = opts.minScale ?? 1;
51
+ }
52
+ get scale() {
53
+ return this._scale;
54
+ }
55
+ get overflows() {
56
+ return this._overflows;
57
+ }
58
+ get skipped() {
59
+ return this._skipped;
60
+ }
61
+ /** True if any gradient is inf/nan (an fp16 overflow) — such a step must be skipped. */
62
+ check(grads) {
63
+ for (const g of grads) {
64
+ const a = g.data;
65
+ for (let i = 0; i < a.length; i++) {
66
+ const x = a[i];
67
+ if (!Number.isFinite(x))
68
+ return true;
69
+ }
70
+ }
71
+ return false;
72
+ }
73
+ /** Divide gradients back down by the current scale, in place. */
74
+ unscale(grads) {
75
+ const inv = 1 / this._scale;
76
+ for (const g of grads) {
77
+ const a = g.data;
78
+ for (let i = 0; i < a.length; i++)
79
+ a[i] = a[i] * inv;
80
+ }
81
+ }
82
+ /**
83
+ * Advance the scale controller. Pass whether this step overflowed. Returns
84
+ * `true` if the optimiser step should PROCEED, `false` if it must be skipped.
85
+ */
86
+ update(overflow) {
87
+ if (overflow) {
88
+ this._overflows++;
89
+ this._skipped++;
90
+ this._scale = Math.max(this.minScale, this._scale * this.backoffFactor);
91
+ this.cleanStreak = 0;
92
+ return false;
93
+ }
94
+ if (++this.cleanStreak >= this.growthInterval) {
95
+ this._scale *= this.growthFactor;
96
+ this.cleanStreak = 0;
97
+ }
98
+ return true;
99
+ }
100
+ }
101
+ //# sourceMappingURL=mixed_precision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixed_precision.js","sourceRoot":"","sources":["../../src/training/mixed_precision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * model_cpu.ts — the exact CPU forward + backward for a whole
3
+ * {@link HybridMambaModel}: token embedding → layer stack → final RMSNorm →
4
+ * tied LM head → cross-entropy.
5
+ *
6
+ * This is the gradient engine {@link MambaTrainer} uses. Before it existed the
7
+ * trainer handed the SAME `dLogits` buffer to AdamW for every parameter, so no
8
+ * parameter ever received its own gradient — `learn()` was safe but inert. Now
9
+ * the backward pass is real, and `tests/backprop.test.ts` proves it against
10
+ * finite differences without needing a GPU.
11
+ *
12
+ * Parameter names match {@link HybridMambaModel.parameters} exactly
13
+ * (`embedding`, `layer{i}.{name}`, `final_norm`), which is how the trainer
14
+ * pairs each parameter with its OWN gradient.
15
+ */
16
+ import { type Mamba1CpuWeights, type Mamba1CpuGrads } from './mamba1_cpu.js';
17
+ /** Layer types the CPU gradient engine can differentiate today. */
18
+ export declare const CPU_GRADIENT_LAYER_TYPES: readonly ["mamba1"];
19
+ export type CpuGradientLayerType = (typeof CPU_GRADIENT_LAYER_TYPES)[number];
20
+ export interface CpuModelDims {
21
+ vocabSize: number;
22
+ dModel: number;
23
+ dState: number;
24
+ dConv: number;
25
+ dInner: number;
26
+ dtRank: number;
27
+ numLayers: number;
28
+ }
29
+ /** Every tensor the CPU model reads, mirrored out of the GPU buffers. */
30
+ export interface CpuModelWeights {
31
+ embedding: Float32Array;
32
+ finalNorm: Float32Array;
33
+ lmHeadBias: Float32Array;
34
+ layers: Mamba1CpuWeights[];
35
+ }
36
+ export interface CpuModelGrads {
37
+ embedding: Float32Array;
38
+ finalNorm: Float32Array;
39
+ lmHeadBias: Float32Array;
40
+ layers: Mamba1CpuGrads[];
41
+ }
42
+ /** Knobs on one backward pass. */
43
+ export interface CpuBackwardOptions {
44
+ /**
45
+ * Recompute each layer's activations during the backward pass instead of
46
+ * retaining every layer's cache from the forward. Trades one extra forward per
47
+ * layer for O(1) instead of O(layers) retained activations; the gradients are
48
+ * numerically identical (`tests/peft_trainer.test.ts` asserts bit equality).
49
+ */
50
+ activationCheckpointing?: boolean;
51
+ }
52
+ /** Loss + the gradient of every parameter, keyed by `parameters()` name. */
53
+ export interface CpuBackwardResult {
54
+ loss: number;
55
+ grads: Map<string, Float32Array>;
56
+ }
57
+ export declare function zeroCpuModelGrads(dims: CpuModelDims): CpuModelGrads;
58
+ /** Flatten a {@link CpuModelGrads} into the `parameters()` naming the optimizer uses. */
59
+ export declare function toNamedGrads(g: CpuModelGrads): Map<string, Float32Array>;
60
+ /** The model's tensors keyed the same way — the inverse of {@link cpuWeightsFromNamed}. */
61
+ export declare function namedWeights(w: CpuModelWeights): Map<string, Float32Array>;
62
+ /**
63
+ * Assemble a {@link CpuModelWeights} from tensors keyed by `parameters()` name —
64
+ * how {@link MambaTrainer} mirrors the GPU buffers into the gradient engine.
65
+ * Throws on a missing or wrongly-sized tensor rather than training on garbage.
66
+ */
67
+ export declare function cpuWeightsFromNamed(named: Map<string, Float32Array>, dims: CpuModelDims): CpuModelWeights;
68
+ /** Logits only — the CPU mirror of `HybridMambaModel.forward`. */
69
+ export declare function cpuModelForward(tokenIds: ArrayLike<number>, w: CpuModelWeights, dims: CpuModelDims, batch: number, seqLen: number): Float32Array;
70
+ /** Mean next-token cross-entropy over the sequence — the trainer's loss. */
71
+ export declare function cpuModelLoss(tokenIds: ArrayLike<number>, targets: ArrayLike<number>, w: CpuModelWeights, dims: CpuModelDims, batch: number, seqLen: number): number;
72
+ /**
73
+ * Forward + backward. Returns the mean cross-entropy loss and the gradient of
74
+ * EVERY parameter, keyed by its `parameters()` name.
75
+ *
76
+ * The loss is averaged over the `batch * seqLen` predicted positions, so the
77
+ * gradients are the gradients of that mean — the quantity the trainer reports.
78
+ */
79
+ export declare function cpuModelBackward(tokenIds: ArrayLike<number>, targets: ArrayLike<number>, w: CpuModelWeights, dims: CpuModelDims, batch: number, seqLen: number, opts?: CpuBackwardOptions): CpuBackwardResult;
80
+ /**
81
+ * The 2-D shape of a parameter, or `null` when it is a vector (bias / norm gain
82
+ * / `D_vec`).
83
+ *
84
+ * Low-rank adaptation only means anything over a matrix, so this is the single
85
+ * place that says which parameters an adapter can cover — and it derives the
86
+ * shapes from `dims` rather than restating the block's layout, so it cannot
87
+ * drift from {@link cpuWeightsFromNamed}.
88
+ */
89
+ export declare function paramMatrixShape(name: string, dims: CpuModelDims): [rows: number, cols: number] | null;
90
+ /**
91
+ * Parameters a low-rank adapter covers by default: the four projections inside
92
+ * each block.
93
+ *
94
+ * Deliberately NOT the token embedding (by far the largest tensor, and tied to
95
+ * the output head — adapting it low-rank changes the head too) and NOT `A_log`
96
+ * (the state-transition decay, which WSLA freezes precisely because drifting it
97
+ * destabilises the SSM).
98
+ */
99
+ export declare const DEFAULT_LORA_TARGETS: readonly ["wInProj", "wXProj", "wDtProj", "wOutProj"];
100
+ //# sourceMappingURL=model_cpu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model_cpu.d.ts","sourceRoot":"","sources":["../../src/training/model_cpu.ts"],"names":[],"mappings":"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"}