@seanhogg/builderforce-memory-engine 2026.9.33 → 2026.10.1

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 (170) hide show
  1. package/dist/evermind/delta_wire.d.ts +10 -1
  2. package/dist/evermind/delta_wire.d.ts.map +1 -1
  3. package/dist/evermind/delta_wire.js +25 -3
  4. package/dist/evermind/delta_wire.js.map +1 -1
  5. package/dist/evermind/index.d.ts +4 -4
  6. package/dist/evermind/index.d.ts.map +1 -1
  7. package/dist/evermind/index.js +2 -2
  8. package/dist/evermind/index.js.map +1 -1
  9. package/dist/evermind/merge.d.ts +25 -0
  10. package/dist/evermind/merge.d.ts.map +1 -1
  11. package/dist/evermind/merge.js +30 -0
  12. package/dist/evermind/merge.js.map +1 -1
  13. package/dist/evermind/package.d.ts +9 -0
  14. package/dist/evermind/package.d.ts.map +1 -1
  15. package/dist/evermind/package.js +20 -0
  16. package/dist/evermind/package.js.map +1 -1
  17. package/dist/index.d.ts +6 -5
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +5 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/limbic/index.d.ts +3 -0
  22. package/dist/limbic/index.d.ts.map +1 -1
  23. package/dist/limbic/index.js +3 -0
  24. package/dist/limbic/index.js.map +1 -1
  25. package/dist/limbic/limbic_task.d.ts +22 -0
  26. package/dist/limbic/limbic_task.d.ts.map +1 -0
  27. package/dist/limbic/limbic_task.js +45 -0
  28. package/dist/limbic/limbic_task.js.map +1 -0
  29. package/dist/limbic/limbic_trainer.d.ts +17 -30
  30. package/dist/limbic/limbic_trainer.d.ts.map +1 -1
  31. package/dist/limbic/limbic_trainer.js +38 -144
  32. package/dist/limbic/limbic_trainer.js.map +1 -1
  33. package/dist/ml/classical/ewma.d.ts +32 -0
  34. package/dist/ml/classical/ewma.d.ts.map +1 -0
  35. package/dist/ml/classical/ewma.js +46 -0
  36. package/dist/ml/classical/ewma.js.map +1 -0
  37. package/dist/ml/classical/gbm.d.ts +42 -0
  38. package/dist/ml/classical/gbm.d.ts.map +1 -0
  39. package/dist/ml/classical/gbm.js +116 -0
  40. package/dist/ml/classical/gbm.js.map +1 -0
  41. package/dist/ml/classical/index.d.ts +48 -0
  42. package/dist/ml/classical/index.d.ts.map +1 -0
  43. package/dist/ml/classical/index.js +45 -0
  44. package/dist/ml/classical/index.js.map +1 -0
  45. package/dist/ml/classical/isolation_forest.d.ts +37 -0
  46. package/dist/ml/classical/isolation_forest.d.ts.map +1 -0
  47. package/dist/ml/classical/isolation_forest.js +72 -0
  48. package/dist/ml/classical/isolation_forest.js.map +1 -0
  49. package/dist/ml/classical/kmeans.d.ts +31 -0
  50. package/dist/ml/classical/kmeans.d.ts.map +1 -0
  51. package/dist/ml/classical/kmeans.js +93 -0
  52. package/dist/ml/classical/kmeans.js.map +1 -0
  53. package/dist/ml/classical/knn.d.ts +48 -0
  54. package/dist/ml/classical/knn.d.ts.map +1 -0
  55. package/dist/ml/classical/knn.js +68 -0
  56. package/dist/ml/classical/knn.js.map +1 -0
  57. package/dist/ml/classical/linear.d.ts +29 -0
  58. package/dist/ml/classical/linear.d.ts.map +1 -0
  59. package/dist/ml/classical/linear.js +114 -0
  60. package/dist/ml/classical/linear.js.map +1 -0
  61. package/dist/ml/classical/logistic.d.ts +39 -0
  62. package/dist/ml/classical/logistic.d.ts.map +1 -0
  63. package/dist/ml/classical/logistic.js +103 -0
  64. package/dist/ml/classical/logistic.js.map +1 -0
  65. package/dist/ml/classical/math.d.ts +26 -0
  66. package/dist/ml/classical/math.d.ts.map +1 -0
  67. package/dist/ml/classical/math.js +90 -0
  68. package/dist/ml/classical/math.js.map +1 -0
  69. package/dist/ml/classical/naive_bayes.d.ts +24 -0
  70. package/dist/ml/classical/naive_bayes.d.ts.map +1 -0
  71. package/dist/ml/classical/naive_bayes.js +67 -0
  72. package/dist/ml/classical/naive_bayes.js.map +1 -0
  73. package/dist/ml/classical/robust_z.d.ts +30 -0
  74. package/dist/ml/classical/robust_z.d.ts.map +1 -0
  75. package/dist/ml/classical/robust_z.js +46 -0
  76. package/dist/ml/classical/robust_z.js.map +1 -0
  77. package/dist/ml/dense_head.d.ts +33 -0
  78. package/dist/ml/dense_head.d.ts.map +1 -0
  79. package/dist/ml/dense_head.js +140 -0
  80. package/dist/ml/dense_head.js.map +1 -0
  81. package/dist/ml/features.d.ts +25 -0
  82. package/dist/ml/features.d.ts.map +1 -0
  83. package/dist/ml/features.js +46 -0
  84. package/dist/ml/features.js.map +1 -0
  85. package/dist/ml/federate.d.ts +70 -0
  86. package/dist/ml/federate.d.ts.map +1 -0
  87. package/dist/ml/federate.js +122 -0
  88. package/dist/ml/federate.js.map +1 -0
  89. package/dist/ml/head_trainer.d.ts +76 -0
  90. package/dist/ml/head_trainer.d.ts.map +1 -0
  91. package/dist/ml/head_trainer.js +182 -0
  92. package/dist/ml/head_trainer.js.map +1 -0
  93. package/dist/ml/index.d.ts +23 -0
  94. package/dist/ml/index.d.ts.map +1 -0
  95. package/dist/ml/index.js +11 -0
  96. package/dist/ml/index.js.map +1 -0
  97. package/dist/ml/registry.d.ts +20 -0
  98. package/dist/ml/registry.d.ts.map +1 -0
  99. package/dist/ml/registry.js +43 -0
  100. package/dist/ml/registry.js.map +1 -0
  101. package/dist/ml/run.d.ts +94 -0
  102. package/dist/ml/run.d.ts.map +1 -0
  103. package/dist/ml/run.js +130 -0
  104. package/dist/ml/run.js.map +1 -0
  105. package/dist/ml/tasks/experience.d.ts +90 -0
  106. package/dist/ml/tasks/experience.d.ts.map +1 -0
  107. package/dist/ml/tasks/experience.js +156 -0
  108. package/dist/ml/tasks/experience.js.map +1 -0
  109. package/dist/ml/tasks/index.d.ts +10 -0
  110. package/dist/ml/tasks/index.d.ts.map +1 -0
  111. package/dist/ml/tasks/index.js +28 -0
  112. package/dist/ml/tasks/index.js.map +1 -0
  113. package/dist/ml/tasks/local_success.d.ts +55 -0
  114. package/dist/ml/tasks/local_success.d.ts.map +1 -0
  115. package/dist/ml/tasks/local_success.js +77 -0
  116. package/dist/ml/tasks/local_success.js.map +1 -0
  117. package/dist/ml/tasks/run_anomaly.d.ts +51 -0
  118. package/dist/ml/tasks/run_anomaly.d.ts.map +1 -0
  119. package/dist/ml/tasks/run_anomaly.js +60 -0
  120. package/dist/ml/tasks/run_anomaly.js.map +1 -0
  121. package/dist/ml/train.d.ts +64 -0
  122. package/dist/ml/train.d.ts.map +1 -0
  123. package/dist/ml/train.js +101 -0
  124. package/dist/ml/train.js.map +1 -0
  125. package/dist/ml/types.d.ts +112 -0
  126. package/dist/ml/types.d.ts.map +1 -0
  127. package/dist/ml/types.js +23 -0
  128. package/dist/ml/types.js.map +1 -0
  129. package/dist/moe/moe_model.d.ts.map +1 -1
  130. package/dist/moe/moe_model.js +1 -16
  131. package/dist/moe/moe_model.js.map +1 -1
  132. package/dist/training/cpu_ops.d.ts +2 -0
  133. package/dist/training/cpu_ops.d.ts.map +1 -1
  134. package/dist/training/cpu_ops.js +16 -0
  135. package/dist/training/cpu_ops.js.map +1 -1
  136. package/package.json +1 -1
  137. package/src/evermind/delta_wire.ts +148 -114
  138. package/src/evermind/index.ts +35 -32
  139. package/src/evermind/merge.ts +53 -0
  140. package/src/evermind/package.ts +488 -464
  141. package/src/index.ts +15 -1
  142. package/src/limbic/index.ts +5 -0
  143. package/src/limbic/limbic_task.ts +62 -0
  144. package/src/limbic/limbic_trainer.ts +91 -258
  145. package/src/ml/classical/ewma.ts +68 -0
  146. package/src/ml/classical/gbm.ts +143 -0
  147. package/src/ml/classical/index.ts +76 -0
  148. package/src/ml/classical/isolation_forest.ts +88 -0
  149. package/src/ml/classical/kmeans.ts +102 -0
  150. package/src/ml/classical/knn.ts +98 -0
  151. package/src/ml/classical/linear.ts +119 -0
  152. package/src/ml/classical/logistic.ts +125 -0
  153. package/src/ml/classical/math.ts +93 -0
  154. package/src/ml/classical/naive_bayes.ts +77 -0
  155. package/src/ml/classical/robust_z.ts +65 -0
  156. package/src/ml/dense_head.ts +157 -0
  157. package/src/ml/features.ts +61 -0
  158. package/src/ml/federate.ts +160 -0
  159. package/src/ml/head_trainer.ts +268 -0
  160. package/src/ml/index.ts +57 -0
  161. package/src/ml/registry.ts +44 -0
  162. package/src/ml/run.ts +178 -0
  163. package/src/ml/tasks/experience.ts +214 -0
  164. package/src/ml/tasks/index.ts +30 -0
  165. package/src/ml/tasks/local_success.ts +118 -0
  166. package/src/ml/tasks/run_anomaly.ts +90 -0
  167. package/src/ml/train.ts +136 -0
  168. package/src/ml/types.ts +132 -0
  169. package/src/moe/moe_model.ts +1 -13
  170. package/src/training/cpu_ops.ts +141 -127
@@ -0,0 +1,33 @@
1
+ import { type HeadParam, type TrainableHead } from "./head_trainer.js";
2
+ import type { MlPrediction, MlPredictor, MlSample } from "./types.js";
3
+ export interface DenseHeadConfig {
4
+ inputDim: number;
5
+ /** Hidden width; 0 = a linear head. */
6
+ hiddenDim: number;
7
+ /** Classes (softmax) or 1 (mse regression). */
8
+ outputDim: number;
9
+ /** `softmax` = classification over `outputDim` classes; `mse` = scalar regression. */
10
+ objective: "softmax" | "mse";
11
+ seed?: number;
12
+ }
13
+ export declare class DenseHead implements TrainableHead<MlSample>, MlPredictor {
14
+ readonly config: Required<DenseHeadConfig>;
15
+ private readonly _params;
16
+ private readonly _grads;
17
+ constructor(config: DenseHeadConfig);
18
+ private _p;
19
+ private _g;
20
+ parameters(): HeadParam[];
21
+ gradients(): HeadParam[];
22
+ zeroGrad(): void;
23
+ /** Hidden activation (or the input itself for a linear head) and the output logits/value. */
24
+ private _forward;
25
+ /** Loss and dLoss/dz of one sample (unweighted). */
26
+ private _lossGrad;
27
+ loss(s: MlSample): number;
28
+ accumulate(s: MlSample): number;
29
+ predict(x: Float32Array): MlPrediction;
30
+ exportParams(): Float32Array;
31
+ importParams(params: ArrayLike<number>): void;
32
+ }
33
+ //# sourceMappingURL=dense_head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dense_head.d.ts","sourceRoot":"","sources":["../../src/ml/dense_head.ts"],"names":[],"mappings":"AAUA,OAAO,EAA+B,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,SAAS,EAAE,SAAS,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAU,YAAW,aAAa,CAAC,QAAQ,CAAC,EAAE,WAAW;IACpE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,eAAe;IAsBnC,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,EAAE;IAIV,UAAU,IAAI,SAAS,EAAE;IAIzB,SAAS,IAAI,SAAS,EAAE;IAIxB,QAAQ,IAAI,IAAI;IAIhB,6FAA6F;IAC7F,OAAO,CAAC,QAAQ;IA0BhB,oDAAoD;IACpD,OAAO,CAAC,SAAS;IAUjB,IAAI,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM;IAIzB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM;IA6B/B,OAAO,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY;IAOtC,YAAY,IAAI,YAAY;IAI5B,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;CAG9C"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * ml/dense_head.ts — the catalog's trainable head: linear, or one tanh hidden layer,
3
+ * over a feature vector (usually an experience embedding).
4
+ *
5
+ * It is a {@link TrainableHead} (so the ONE {@link HeadTrainer} fits it, on the
6
+ * GPU when there is one) and an {@link MlPredictor} (so the runner answers with
7
+ * it). Its parameters flatten to one vector — the unit that federates.
8
+ */
9
+ import { gaussianArray, SeededRng } from "../utils/rng.js";
10
+ import { softmax } from "../training/cpu_ops.js";
11
+ import { assignParams, flattenParams } from "./head_trainer.js";
12
+ export class DenseHead {
13
+ config;
14
+ _params;
15
+ _grads;
16
+ constructor(config) {
17
+ this.config = { seed: 0x4e4d, ...config };
18
+ const { inputDim, hiddenDim, outputDim, objective } = this.config;
19
+ if (objective === "mse" && outputDim !== 1)
20
+ throw new Error("DenseHead: mse objective needs outputDim 1");
21
+ if (objective === "softmax" && outputDim < 2)
22
+ throw new Error("DenseHead: softmax objective needs outputDim ≥ 2");
23
+ const rng = new SeededRng(this.config.seed);
24
+ const next = () => rng.next();
25
+ const inner = hiddenDim > 0 ? hiddenDim : inputDim;
26
+ const shapes = [
27
+ ...(hiddenDim > 0
28
+ ? [
29
+ ["w1", hiddenDim * inputDim, 1 / Math.sqrt(inputDim)],
30
+ ["b1", hiddenDim, 0],
31
+ ]
32
+ : []),
33
+ ["w2", outputDim * inner, 1 / Math.sqrt(inner)],
34
+ ["b2", outputDim, 0],
35
+ ];
36
+ this._params = shapes.map(([name, n, std]) => ({ name, numel: n, data: std > 0 ? gaussianArray(n, std, next) : new Float32Array(n) }));
37
+ this._grads = shapes.map(([name, n]) => ({ name, numel: n, data: new Float32Array(n) }));
38
+ }
39
+ _p(name) {
40
+ return this._params.find((p) => p.name === name).data;
41
+ }
42
+ _g(name) {
43
+ return this._grads.find((p) => p.name === name).data;
44
+ }
45
+ parameters() {
46
+ return this._params;
47
+ }
48
+ gradients() {
49
+ return this._grads;
50
+ }
51
+ zeroGrad() {
52
+ for (const g of this._grads)
53
+ g.data.fill(0);
54
+ }
55
+ /** Hidden activation (or the input itself for a linear head) and the output logits/value. */
56
+ _forward(x) {
57
+ const { inputDim, hiddenDim, outputDim } = this.config;
58
+ let h;
59
+ if (hiddenDim > 0) {
60
+ const w1 = this._p("w1");
61
+ const b1 = this._p("b1");
62
+ h = new Float32Array(hiddenDim);
63
+ for (let j = 0; j < hiddenDim; j++) {
64
+ let s = b1[j];
65
+ for (let i = 0; i < inputDim; i++)
66
+ s += w1[j * inputDim + i] * (x[i] ?? 0);
67
+ h[j] = Math.tanh(s);
68
+ }
69
+ }
70
+ else {
71
+ h = Float32Array.from({ length: inputDim }, (_, i) => x[i] ?? 0);
72
+ }
73
+ const w2 = this._p("w2");
74
+ const b2 = this._p("b2");
75
+ const z = new Float32Array(outputDim);
76
+ for (let k = 0; k < outputDim; k++) {
77
+ let s = b2[k];
78
+ for (let j = 0; j < h.length; j++)
79
+ s += w2[k * h.length + j] * h[j];
80
+ z[k] = s;
81
+ }
82
+ return { h, z };
83
+ }
84
+ /** Loss and dLoss/dz of one sample (unweighted). */
85
+ _lossGrad(z, y) {
86
+ if (this.config.objective === "mse") {
87
+ const d = z[0] - y;
88
+ return { loss: 0.5 * d * d, dz: Float32Array.of(d) };
89
+ }
90
+ const p = softmax(z);
91
+ const dz = Float32Array.from(p, (v, k) => v - (k === y ? 1 : 0));
92
+ return { loss: -Math.log(Math.max(p[y] ?? 0, 1e-12)), dz };
93
+ }
94
+ loss(s) {
95
+ return (s.weight ?? 1) * this._lossGrad(this._forward(s.x).z, s.y).loss;
96
+ }
97
+ accumulate(s) {
98
+ const w = s.weight ?? 1;
99
+ const { inputDim, hiddenDim, outputDim } = this.config;
100
+ const { h, z } = this._forward(s.x);
101
+ const { loss, dz } = this._lossGrad(z, s.y);
102
+ const w2 = this._p("w2");
103
+ const gW2 = this._g("w2");
104
+ const gB2 = this._g("b2");
105
+ const dh = new Float32Array(h.length);
106
+ for (let k = 0; k < outputDim; k++) {
107
+ const g = w * dz[k];
108
+ gB2[k] = gB2[k] + g;
109
+ for (let j = 0; j < h.length; j++) {
110
+ gW2[k * h.length + j] = gW2[k * h.length + j] + g * h[j];
111
+ dh[j] = dh[j] + g * w2[k * h.length + j];
112
+ }
113
+ }
114
+ if (hiddenDim > 0) {
115
+ const gW1 = this._g("w1");
116
+ const gB1 = this._g("b1");
117
+ for (let j = 0; j < hiddenDim; j++) {
118
+ const dpre = dh[j] * (1 - h[j] * h[j]);
119
+ gB1[j] = gB1[j] + dpre;
120
+ for (let i = 0; i < inputDim; i++)
121
+ gW1[j * inputDim + i] = gW1[j * inputDim + i] + dpre * (s.x[i] ?? 0);
122
+ }
123
+ }
124
+ return w * loss;
125
+ }
126
+ predict(x) {
127
+ const { z } = this._forward(x);
128
+ if (this.config.objective === "mse")
129
+ return { scores: [z[0]], confidence: 1 };
130
+ const scores = Array.from(softmax(z));
131
+ return { scores, confidence: Math.max(...scores) };
132
+ }
133
+ exportParams() {
134
+ return flattenParams(this._params);
135
+ }
136
+ importParams(params) {
137
+ assignParams(this._params, params);
138
+ }
139
+ }
140
+ //# sourceMappingURL=dense_head.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dense_head.js","sourceRoot":"","sources":["../../src/ml/dense_head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ml/features.ts — how an input becomes a feature vector.
3
+ *
4
+ * Text goes through the existing CPU embedder seam ({@link TextEmbedder}, which
5
+ * `EvermindTextEmbedder` implements: the person's own Evermind turns text into
6
+ * an L2-normalised vector with no GPU and no network). Numeric fields are
7
+ * appended as the task supplies them — on a FIXED scale (see {@link logScale}),
8
+ * never one fitted to local data, so a federated weight means the same thing on
9
+ * every machine.
10
+ */
11
+ import type { TextEmbedder } from "../lm/text_embedder.js";
12
+ import type { FeatureSpec } from "./types.js";
13
+ export type { TextEmbedder } from "../lm/text_embedder.js";
14
+ /** Feature vector of one input: `[embed(text) …, numeric …]`. */
15
+ export declare function extractFeatures<I>(spec: FeatureSpec<I>, input: I, embedder?: TextEmbedder): Promise<Float32Array>;
16
+ /** Feature vectors of many inputs, in order. */
17
+ export declare function extractFeatureMatrix<I>(spec: FeatureSpec<I>, inputs: readonly I[], embedder?: TextEmbedder): Promise<Float32Array[]>;
18
+ /**
19
+ * A count or size on a fixed log scale: log1p(max(v, 0)) / log1p(ref). `ref` is
20
+ * the value that maps to 1 (e.g. 100k tokens), so the scale is the same everywhere.
21
+ */
22
+ export declare function logScale(v: number, ref: number): number;
23
+ /** A ratio clamped to [0, max] — fill fractions, success rates. */
24
+ export declare function clampRatio(numerator: number, denominator: number, max?: number): number;
25
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/ml/features.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,iEAAiE;AACjE,wBAAsB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAmBvH;AAED,gDAAgD;AAChD,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAIzB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,MAAM,CAGlF"}
@@ -0,0 +1,46 @@
1
+ /** Feature vector of one input: `[embed(text) …, numeric …]`. */
2
+ export async function extractFeatures(spec, input, embedder) {
3
+ const parts = [];
4
+ if (spec.text) {
5
+ if (!embedder)
6
+ throw new Error("extractFeatures: this task embeds text but no embedder was supplied");
7
+ parts.push(await embedder.embed(spec.text(input)));
8
+ }
9
+ if (spec.numeric) {
10
+ const nums = spec.numeric(input);
11
+ for (const v of nums)
12
+ if (!Number.isFinite(v))
13
+ throw new Error(`extractFeatures: non-finite numeric feature ${v}`);
14
+ parts.push(nums);
15
+ }
16
+ if (parts.length === 0)
17
+ throw new Error("extractFeatures: the feature spec has neither text nor numeric fields");
18
+ const out = new Float32Array(parts.reduce((n, p) => n + p.length, 0));
19
+ let o = 0;
20
+ for (const p of parts) {
21
+ out.set(p, o);
22
+ o += p.length;
23
+ }
24
+ return out;
25
+ }
26
+ /** Feature vectors of many inputs, in order. */
27
+ export async function extractFeatureMatrix(spec, inputs, embedder) {
28
+ const out = [];
29
+ for (const i of inputs)
30
+ out.push(await extractFeatures(spec, i, embedder));
31
+ return out;
32
+ }
33
+ /**
34
+ * A count or size on a fixed log scale: log1p(max(v, 0)) / log1p(ref). `ref` is
35
+ * the value that maps to 1 (e.g. 100k tokens), so the scale is the same everywhere.
36
+ */
37
+ export function logScale(v, ref) {
38
+ return Math.log1p(Math.max(0, v)) / Math.log1p(Math.max(ref, 1));
39
+ }
40
+ /** A ratio clamped to [0, max] — fill fractions, success rates. */
41
+ export function clampRatio(numerator, denominator, max = 4) {
42
+ if (!(denominator > 0))
43
+ return 0;
44
+ return Math.max(0, Math.min(max, numerator / denominator));
45
+ }
46
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ml/features.ts"],"names":[],"mappings":"AAeA,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,IAAoB,EAAE,KAAQ,EAAE,QAAuB;IAC9F,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACtG,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,EAAE,CAAC,CAAC;QACnH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACjH,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACd,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAoB,EACpB,MAAoB,EACpB,QAAuB;IAEvB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,GAAW;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,WAAmB,EAAE,GAAG,GAAG,CAAC;IACxE,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ml/federate.ts — trained ML heads federate like the model's own weights.
3
+ *
4
+ * A head's trained state is ONE flat f32 vector (`MlPredictor.exportParams`),
5
+ * stored as a CRC-trailed checkpoint so it is the same shape the delta pipeline
6
+ * already handles: a learner diffs its trained copy against the version it
7
+ * started from (`diffCheckpoints`), ships it on the existing delta wire with
8
+ * `target: "ml:<task>"`, and the writer folds N of them with the existing FedAvg
9
+ * (`mergeCheckpointDiffsGated` → `mergeCheckpointDiffs`), refusing a merge whose
10
+ * held-out loss regresses. No second wire, no second merge.
11
+ */
12
+ import { type DeltaLearnPayload } from "../evermind/delta_wire.js";
13
+ import { type GatedMergeResult, type MergeGateOptions } from "../evermind/merge.js";
14
+ import type { EvermindModelPackage } from "../evermind/package.js";
15
+ /**
16
+ * One trained ML-catalog head carried in a model's manifest (`mlHeads`): small, so
17
+ * it rides in the manifest, and versioned, so it federates — a delta against it is
18
+ * `target: "ml:<task>"`, `baseVersion: version` on the delta wire.
19
+ */
20
+ export interface EvermindMlHead {
21
+ /** Catalog task id, e.g. `run.local-success`. */
22
+ task: string;
23
+ /** Engine key, e.g. `local:classical:logistic`. */
24
+ engine: string;
25
+ /** Integer head version — what a federated delta for it is diffed against. */
26
+ version: number;
27
+ /** What a loader needs to rebuild the predictor (e.g. `{ dim, classes }`). */
28
+ shape: Record<string, number>;
29
+ /** base64 of the CRC-trailed f32 checkpoint of the head's flat parameters. */
30
+ params: string;
31
+ /** Held-out loss of this version, when measured. */
32
+ evalLoss?: number;
33
+ }
34
+ /** A head's flat parameters as a CRC-trailed f32 checkpoint. */
35
+ export declare function headCheckpoint(params: ArrayLike<number>): ArrayBuffer;
36
+ /** The flat parameters of a head checkpoint. Throws on a failed CRC. */
37
+ export declare function headParams(checkpoint: ArrayBuffer): Float32Array;
38
+ /** Why a manifest head entry is unusable, or null (the package's validate() calls this). */
39
+ export declare function mlHeadUnusableReason(h: EvermindMlHead): string | null;
40
+ /** A manifest entry for a head's current parameters. */
41
+ export declare function mlHeadEntry(task: string, engine: string, version: number, params: ArrayLike<number>, shape?: Record<string, number>, evalLoss?: number): EvermindMlHead;
42
+ /** The entry's flat parameters. */
43
+ export declare function mlHeadParams(entry: EvermindMlHead): Float32Array;
44
+ /** The head a package carries for `task`, if any. */
45
+ export declare function packageMlHead(pkg: EvermindModelPackage, task: string): EvermindMlHead | undefined;
46
+ /** `pkg` with `entry` as its head for `entry.task` (replacing the old one). */
47
+ export declare function withPackageMlHead(pkg: EvermindModelPackage, entry: EvermindMlHead): EvermindModelPackage;
48
+ /**
49
+ * The delta-wire payload for a locally trained head: its new parameters diffed
50
+ * against the version it started from. The caller owns the size guard, as for LM deltas.
51
+ */
52
+ export declare function buildMlHeadDelta(base: EvermindMlHead, trained: ArrayLike<number>, weight?: number, label?: string): DeltaLearnPayload;
53
+ export interface MlHeadMergeOutcome {
54
+ /** The head after the round: version + 1 when accepted, the base unchanged when refused. */
55
+ head: EvermindMlHead;
56
+ merge: GatedMergeResult;
57
+ /** Contributions left out of the batch, by index, with why. */
58
+ rejected: {
59
+ index: number;
60
+ reason: string;
61
+ }[];
62
+ }
63
+ /**
64
+ * One federated round for a head: validate each contribution ON ITS OWN (wrong
65
+ * target, stale base or a malformed diff costs only itself), FedAvg the rest, and
66
+ * keep the result only if `score` (held-out loss of a parameter vector, lower is
67
+ * better) does not regress.
68
+ */
69
+ export declare function mergeMlHeadDeltas(base: EvermindMlHead, payloads: readonly DeltaLearnPayload[], score: (params: Float32Array) => number | null, opts?: MergeGateOptions): MlHeadMergeOutcome;
70
+ //# sourceMappingURL=federate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federate.d.ts","sourceRoot":"","sources":["../../src/ml/federate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiF,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAClJ,OAAO,EAA6B,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAKnE;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,WAAW,CAIrE;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,UAAU,EAAE,WAAW,GAAG,YAAY,CAKhE;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EACzB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAShB;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAEhE;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEjG;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc,GAAG,oBAAoB,CAExG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAGrI;AAED,MAAM,WAAW,kBAAkB;IACjC,4FAA4F;IAC5F,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,GAAG,IAAI,EAC9C,IAAI,GAAE,gBAAqB,GAC1B,kBAAkB,CA8BpB"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * ml/federate.ts — trained ML heads federate like the model's own weights.
3
+ *
4
+ * A head's trained state is ONE flat f32 vector (`MlPredictor.exportParams`),
5
+ * stored as a CRC-trailed checkpoint so it is the same shape the delta pipeline
6
+ * already handles: a learner diffs its trained copy against the version it
7
+ * started from (`diffCheckpoints`), ships it on the existing delta wire with
8
+ * `target: "ml:<task>"`, and the writer folds N of them with the existing FedAvg
9
+ * (`mergeCheckpointDiffsGated` → `mergeCheckpointDiffs`), refusing a merge whose
10
+ * held-out loss regresses. No second wire, no second merge.
11
+ */
12
+ import { buildDeltaLearnPayload, decodeDeltaPayload, deltaUnusableReason, mlHeadTarget } from "../evermind/delta_wire.js";
13
+ import { mergeCheckpointDiffsGated } from "../evermind/merge.js";
14
+ import { base64ToBytes, bytesToBase64 } from "../utils/base64.js";
15
+ import { appendCrcTrailer, verifyCrcTrailer } from "../utils/crc32.js";
16
+ import { diffCheckpoints } from "../utils/delta.js";
17
+ /** A head's flat parameters as a CRC-trailed f32 checkpoint. */
18
+ export function headCheckpoint(params) {
19
+ const body = new ArrayBuffer(params.length * 4);
20
+ new Float32Array(body).set(Array.from(params));
21
+ return appendCrcTrailer(body);
22
+ }
23
+ /** The flat parameters of a head checkpoint. Throws on a failed CRC. */
24
+ export function headParams(checkpoint) {
25
+ const crc = verifyCrcTrailer(checkpoint);
26
+ if (!crc.ok)
27
+ throw new Error("headParams: checkpoint failed its CRC check");
28
+ if (crc.body.byteLength % 4 !== 0)
29
+ throw new Error("headParams: checkpoint is not f32");
30
+ return new Float32Array(crc.body);
31
+ }
32
+ /** Why a manifest head entry is unusable, or null (the package's validate() calls this). */
33
+ export function mlHeadUnusableReason(h) {
34
+ if (!h || typeof h.task !== "string" || typeof h.engine !== "string")
35
+ return "task and engine are required";
36
+ if (!Number.isInteger(h.version) || h.version < 0)
37
+ return "version must be a non-negative integer";
38
+ try {
39
+ const crc = verifyCrcTrailer(base64ToBytes(h.params));
40
+ if (!crc.hasTrailer || !crc.ok)
41
+ return "params checkpoint failed its CRC check";
42
+ if (crc.body.byteLength % 4 !== 0)
43
+ return "params checkpoint is not f32";
44
+ }
45
+ catch {
46
+ return "params is not base64";
47
+ }
48
+ return null;
49
+ }
50
+ /** A manifest entry for a head's current parameters. */
51
+ export function mlHeadEntry(task, engine, version, params, shape = {}, evalLoss) {
52
+ return {
53
+ task,
54
+ engine,
55
+ version,
56
+ shape,
57
+ params: bytesToBase64(headCheckpoint(params)),
58
+ ...(evalLoss != null && Number.isFinite(evalLoss) ? { evalLoss } : {}),
59
+ };
60
+ }
61
+ /** The entry's flat parameters. */
62
+ export function mlHeadParams(entry) {
63
+ return headParams(base64ToBytes(entry.params));
64
+ }
65
+ /** The head a package carries for `task`, if any. */
66
+ export function packageMlHead(pkg, task) {
67
+ return pkg.manifest.mlHeads?.find((h) => h.task === task);
68
+ }
69
+ /** `pkg` with `entry` as its head for `entry.task` (replacing the old one). */
70
+ export function withPackageMlHead(pkg, entry) {
71
+ return pkg.withMlHeads([...(pkg.manifest.mlHeads ?? []).filter((h) => h.task !== entry.task), entry]);
72
+ }
73
+ /**
74
+ * The delta-wire payload for a locally trained head: its new parameters diffed
75
+ * against the version it started from. The caller owns the size guard, as for LM deltas.
76
+ */
77
+ export function buildMlHeadDelta(base, trained, weight, label) {
78
+ const diff = diffCheckpoints(base64ToBytes(base.params), headCheckpoint(trained));
79
+ return buildDeltaLearnPayload(diff, base.version, weight, label ?? `ml head ${base.task}`, mlHeadTarget(base.task));
80
+ }
81
+ /**
82
+ * One federated round for a head: validate each contribution ON ITS OWN (wrong
83
+ * target, stale base or a malformed diff costs only itself), FedAvg the rest, and
84
+ * keep the result only if `score` (held-out loss of a parameter vector, lower is
85
+ * better) does not regress.
86
+ */
87
+ export function mergeMlHeadDeltas(base, payloads, score, opts = {}) {
88
+ const baseCp = base64ToBytes(base.params);
89
+ const target = mlHeadTarget(base.task);
90
+ const diffs = [];
91
+ const weights = [];
92
+ const rejected = [];
93
+ payloads.forEach((p, index) => {
94
+ if (p.target !== target)
95
+ return void rejected.push({ index, reason: `target ${p.target ?? "(model)"} is not ${target}` });
96
+ if (p.baseVersion !== base.version)
97
+ return void rejected.push({ index, reason: `stale base version ${p.baseVersion} (head is ${base.version})` });
98
+ let diff;
99
+ try {
100
+ diff = decodeDeltaPayload(p);
101
+ }
102
+ catch (error) {
103
+ return void rejected.push({ index, reason: `diff is not base64: ${error instanceof Error ? error.message : String(error)}` });
104
+ }
105
+ const why = deltaUnusableReason(diff, baseCp);
106
+ if (why)
107
+ return void rejected.push({ index, reason: why });
108
+ diffs.push(diff);
109
+ weights.push(p.weight ?? 1);
110
+ });
111
+ const merge = mergeCheckpointDiffsGated(baseCp, diffs, weights, (cp) => score(headParams(cp)), opts);
112
+ if (!merge.accepted)
113
+ return { head: base, merge, rejected };
114
+ const head = {
115
+ ...base,
116
+ version: base.version + 1,
117
+ params: bytesToBase64(merge.checkpoint),
118
+ ...(merge.newLoss != null ? { evalLoss: merge.newLoss } : {}),
119
+ };
120
+ return { head, merge, rejected };
121
+ }
122
+ //# sourceMappingURL=federate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federate.js","sourceRoot":"","sources":["../../src/ml/federate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ml/head_trainer.ts — HeadTrainer: the ONE gradient trainer for a small head over
3
+ * an embedding (extracted from the limbic affect trainer, which is now a thin
4
+ * registration over it).
5
+ *
6
+ * Full-batch gradient descent with AdamW. When a GPUDevice is supplied the
7
+ * optimiser step runs on the GPU via the shared WEIGHT_UPDATE_WGSL kernel; with
8
+ * no device it uses a numerically-equivalent CPU AdamW, so training works
9
+ * everywhere (CI, Node without @webgpu/node, a laptop with no GPU).
10
+ *
11
+ * The head owns its forward/backward and its loss (MSE for regression, BCE /
12
+ * softmax cross-entropy for classification); this file owns only the loop:
13
+ * zero → accumulate per sample → average → clip → AdamW step.
14
+ */
15
+ /** A named trainable tensor (flat row-major Float32Array). */
16
+ export interface HeadParam {
17
+ name: string;
18
+ data: Float32Array;
19
+ numel: number;
20
+ }
21
+ /** What a head must expose to be trained by {@link HeadTrainer}. */
22
+ export interface TrainableHead<S> {
23
+ /** Trainable parameters, in a stable order. */
24
+ parameters(): HeadParam[];
25
+ /** Gradient buffers, index-aligned with {@link parameters}. */
26
+ gradients(): HeadParam[];
27
+ zeroGrad(): void;
28
+ /** Accumulate gradients for one sample into {@link gradients}; returns its loss. */
29
+ accumulate(sample: S): number;
30
+ /** Forward-only loss of one sample. */
31
+ loss(sample: S): number;
32
+ }
33
+ export interface HeadTrainOptions {
34
+ learningRate?: number;
35
+ epochs?: number;
36
+ weightDecay?: number;
37
+ beta1?: number;
38
+ beta2?: number;
39
+ eps?: number;
40
+ /** Max global gradient L2 norm before the optimiser step. Default 1.0. */
41
+ maxGradNorm?: number;
42
+ /** Per-epoch hook. `gradNorm` is the pre-clip gradient L2 norm this epoch (the
43
+ * instability early-warning) — computed CPU-side so it's always available. */
44
+ onEpochEnd?: ((epoch: number, loss: number, gradNorm?: number) => void) | null;
45
+ }
46
+ export declare class HeadTrainer<S> {
47
+ /** Name used in error messages (the registration that owns this trainer). */
48
+ private readonly label;
49
+ readonly head: TrainableHead<S>;
50
+ readonly device: GPUDevice | null;
51
+ private _moments;
52
+ private _step;
53
+ private readonly _adamwPipeline;
54
+ constructor(head: TrainableHead<S>, device?: GPUDevice | null,
55
+ /** Name used in error messages (the registration that owns this trainer). */
56
+ label?: string);
57
+ /** Whether the optimiser step runs on the GPU. */
58
+ get gpuTraining(): boolean;
59
+ private _initMoments;
60
+ /**
61
+ * Train on `samples` for `epochs` passes; returns the per-epoch mean loss.
62
+ * Full-batch: grads accumulate over every sample, are averaged, clipped, then
63
+ * applied once per epoch.
64
+ */
65
+ train(samples: S[], opts?: HeadTrainOptions): Promise<number[]>;
66
+ /** Mean loss over samples (no weight update). 0 for an empty set. */
67
+ evaluate(samples: S[]): number;
68
+ private _adamwStepCpu;
69
+ /** AdamW on the GPU via the shared WEIGHT_UPDATE_WGSL kernel. Awaited per step. */
70
+ private _adamwStepGpu;
71
+ }
72
+ /** Concatenate a head's parameters into one flat vector (the federation unit). */
73
+ export declare function flattenParams(params: readonly HeadParam[]): Float32Array;
74
+ /** Write a flat vector back into a head's parameters (inverse of {@link flattenParams}). */
75
+ export declare function assignParams(params: readonly HeadParam[], flat: ArrayLike<number>): void;
76
+ //# sourceMappingURL=head_trainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head_trainer.d.ts","sourceRoot":"","sources":["../../src/ml/head_trainer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,+CAA+C;IAC/C,UAAU,IAAI,SAAS,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,SAAS,IAAI,SAAS,EAAE,CAAC;IACzB,QAAQ,IAAI,IAAI,CAAC;IACjB,oFAAoF;IACpF,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IAC9B,uCAAuC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;mFAC+E;IAC/E,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAChF;AAiCD,qBAAa,WAAW,CAAC,CAAC;IAUtB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,KAAK;IAVxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAGzD,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,MAAM,GAAE,SAAS,GAAG,IAAW;IAC/B,6EAA6E;IAC5D,KAAK,GAAE,MAAsB;IAShD,kDAAkD;IAClD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,CAAC,YAAY;IAQpB;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA8CzE,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM;IAO9B,OAAO,CAAC,aAAa;IAkBrB,mFAAmF;YACrE,aAAa;CA+B5B;AAcD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,YAAY,CAQxE;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAQxF"}