@seanhogg/builderforce-memory-engine 2026.6.30 → 2026.6.34

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 (90) hide show
  1. package/README.md +2 -0
  2. package/dist/bench/harness.d.ts +37 -0
  3. package/dist/bench/harness.d.ts.map +1 -0
  4. package/dist/bench/harness.js +171 -0
  5. package/dist/bench/harness.js.map +1 -0
  6. package/dist/bench/index.d.ts +11 -0
  7. package/dist/bench/index.d.ts.map +1 -0
  8. package/dist/bench/index.js +10 -0
  9. package/dist/bench/index.js.map +1 -0
  10. package/dist/bench/metrics.d.ts +36 -0
  11. package/dist/bench/metrics.d.ts.map +1 -0
  12. package/dist/bench/metrics.js +83 -0
  13. package/dist/bench/metrics.js.map +1 -0
  14. package/dist/bench/types.d.ts +119 -0
  15. package/dist/bench/types.d.ts.map +1 -0
  16. package/dist/bench/types.js +16 -0
  17. package/dist/bench/types.js.map +1 -0
  18. package/dist/export/gguf.d.ts +23 -0
  19. package/dist/export/gguf.d.ts.map +1 -0
  20. package/dist/export/gguf.js +158 -0
  21. package/dist/export/gguf.js.map +1 -0
  22. package/dist/export/hf.d.ts +32 -0
  23. package/dist/export/hf.d.ts.map +1 -0
  24. package/dist/export/hf.js +138 -0
  25. package/dist/export/hf.js.map +1 -0
  26. package/dist/export/index.d.ts +57 -0
  27. package/dist/export/index.d.ts.map +1 -0
  28. package/dist/export/index.js +85 -0
  29. package/dist/export/index.js.map +1 -0
  30. package/dist/export/onnx.d.ts +32 -0
  31. package/dist/export/onnx.d.ts.map +1 -0
  32. package/dist/export/onnx.js +265 -0
  33. package/dist/export/onnx.js.map +1 -0
  34. package/dist/export/protobuf.d.ts +34 -0
  35. package/dist/export/protobuf.d.ts.map +1 -0
  36. package/dist/export/protobuf.js +77 -0
  37. package/dist/export/protobuf.js.map +1 -0
  38. package/dist/export/safetensors.d.ts +22 -0
  39. package/dist/export/safetensors.d.ts.map +1 -0
  40. package/dist/export/safetensors.js +66 -0
  41. package/dist/export/safetensors.js.map +1 -0
  42. package/dist/export/tensors.d.ts +51 -0
  43. package/dist/export/tensors.d.ts.map +1 -0
  44. package/dist/export/tensors.js +76 -0
  45. package/dist/export/tensors.js.map +1 -0
  46. package/dist/index.d.ts +9 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +8 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/kernels/selective_scan.d.ts.map +1 -1
  51. package/dist/kernels/selective_scan.js +7 -3
  52. package/dist/kernels/selective_scan.js.map +1 -1
  53. package/dist/lm/evermind_lm.d.ts +17 -1
  54. package/dist/lm/evermind_lm.d.ts.map +1 -1
  55. package/dist/lm/evermind_lm.js +49 -5
  56. package/dist/lm/evermind_lm.js.map +1 -1
  57. package/dist/model/mamba_model.d.ts.map +1 -1
  58. package/dist/model/mamba_model.js +9 -1
  59. package/dist/model/mamba_model.js.map +1 -1
  60. package/dist/utils/crc32.d.ts +37 -0
  61. package/dist/utils/crc32.d.ts.map +1 -0
  62. package/dist/utils/crc32.js +70 -0
  63. package/dist/utils/crc32.js.map +1 -0
  64. package/dist/utils/delta.d.ts +37 -0
  65. package/dist/utils/delta.d.ts.map +1 -0
  66. package/dist/utils/delta.js +108 -0
  67. package/dist/utils/delta.js.map +1 -0
  68. package/dist/utils/gpu_utils.d.ts +21 -0
  69. package/dist/utils/gpu_utils.d.ts.map +1 -1
  70. package/dist/utils/gpu_utils.js +64 -5
  71. package/dist/utils/gpu_utils.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/bench/harness.ts +219 -0
  74. package/src/bench/index.ts +37 -0
  75. package/src/bench/metrics.ts +98 -0
  76. package/src/bench/types.ts +121 -0
  77. package/src/export/gguf.ts +168 -0
  78. package/src/export/hf.ts +155 -0
  79. package/src/export/index.ts +128 -0
  80. package/src/export/onnx.ts +331 -0
  81. package/src/export/protobuf.ts +86 -0
  82. package/src/export/safetensors.ts +77 -0
  83. package/src/export/tensors.ts +107 -0
  84. package/src/index.ts +63 -0
  85. package/src/kernels/selective_scan.ts +7 -3
  86. package/src/lm/evermind_lm.ts +53 -8
  87. package/src/model/mamba_model.ts +9 -1
  88. package/src/utils/crc32.ts +82 -0
  89. package/src/utils/delta.ts +117 -0
  90. package/src/utils/gpu_utils.ts +60 -5
@@ -0,0 +1,265 @@
1
+ /**
2
+ * export/onnx.ts — export a trained {@link EvermindLM} to a runnable ONNX graph.
3
+ *
4
+ * Produces a standard causal-LM ONNX `ModelProto`: input `input_ids` [batch,seq]
5
+ * (int64) → output `logits` [batch,seq,vocab] (float). No KV cache — the model is
6
+ * stateless and recomputes the full context each step, so a host (onnxruntime-web,
7
+ * onnxruntime-node, or transformers.js driving the generation loop) re-runs the
8
+ * whole sequence per token. The graph reproduces the CPU reference forward
9
+ * EXACTLY:
10
+ *
11
+ * • embedding → Gather(emb, input_ids)
12
+ * • RMSNorm → Mul/ReduceMean/Add/Sqrt/Div/Mul (eps = 1e-5)
13
+ * • causal → Transpose → Conv(group=D, pads=[K-1,0], kernel reversed) → Transpose
14
+ * depthwise conv (so out[t] = Σⱼ ker[j]·x[t−j], matching the reference tap order)
15
+ * • MoE → router MatMul → TopK → Softmax → ScatterElements (dense top-k mask)
16
+ * → shared FFN + Σₑ combineₑ · expertₑ(x) (numerically identical to
17
+ * the sparse reference: non-selected experts get combine 0)
18
+ * • tied head → MatMul(x, embᵀ)
19
+ *
20
+ * Opset 18 / IR v8. Weights are emitted as raw little-endian f32 initializers that
21
+ * are byte-identical to {@link namedTensors} (matmul weights are transposed by a
22
+ * graph node at runtime, not duplicated on disk).
23
+ *
24
+ * Zero dependencies — the protobuf is hand-encoded by {@link ./protobuf}.
25
+ */
26
+ import { archOf, namedTensors } from "./tensors.js";
27
+ import { ProtoWriter, float32ToBytes } from "./protobuf.js";
28
+ const OPSET = 18;
29
+ const IR_VERSION = 8;
30
+ const ELEM_FLOAT = 1;
31
+ const ELEM_INT64 = 7;
32
+ // AttributeProto.AttributeType
33
+ const ATTR_FLOAT = 1;
34
+ const ATTR_INT = 2;
35
+ const ATTR_STRING = 3;
36
+ const ATTR_INTS = 7;
37
+ /** Accumulates a single ONNX GraphProto (nodes + initializers) with auto-naming. */
38
+ class GraphBuilder {
39
+ nodes = [];
40
+ inits = [];
41
+ uid = 0;
42
+ /** A fresh intermediate value name. */
43
+ tmp(hint) {
44
+ return `${hint}_${this.uid++}`;
45
+ }
46
+ initFloat(name, dims, data) {
47
+ this.inits.push({ name, dims, dataType: ELEM_FLOAT, raw: float32ToBytes(data) });
48
+ return name;
49
+ }
50
+ initInt64(name, dims, values) {
51
+ this.inits.push({ name, dims, dataType: ELEM_INT64, int64: values });
52
+ return name;
53
+ }
54
+ node(op, inputs, outputs, attrs = []) {
55
+ this.nodes.push({ op, inputs, outputs, name: `${op}_${this.uid++}`, attrs });
56
+ return outputs;
57
+ }
58
+ /** Single-output convenience: returns the output value name. */
59
+ op(op, inputs, hint, attrs = []) {
60
+ const out = this.tmp(hint);
61
+ this.node(op, inputs, [out], attrs);
62
+ return out;
63
+ }
64
+ }
65
+ /** Transpose a 2-D row-major matrix [rows, cols] → [cols, rows]. */
66
+ function transpose2d(data, rows, cols) {
67
+ const out = new Float32Array(data.length);
68
+ for (let r = 0; r < rows; r++)
69
+ for (let c = 0; c < cols; c++)
70
+ out[c * rows + r] = data[r * cols + c];
71
+ return out;
72
+ }
73
+ /** RMSNorm(x, gain) as graph ops. Returns the normalised value name. */
74
+ function rmsNorm(g, x, gainInit, eps, axes) {
75
+ const sq = g.op("Mul", [x, x], "rms_sq");
76
+ const ms = g.op("ReduceMean", [sq, axes], "rms_mean", [{ kind: "i", name: "keepdims", value: 1 }]);
77
+ const msE = g.op("Add", [ms, eps], "rms_eps");
78
+ const r = g.op("Sqrt", [msE], "rms_r");
79
+ const div = g.op("Div", [x, r], "rms_div");
80
+ return g.op("Mul", [div, gainInit], "rms_y");
81
+ }
82
+ /** A 2-layer FFN expert: y = (relu(x·W1ᵀ + b1))·W2ᵀ + b2. Weights transposed at runtime. */
83
+ function ffn(g, x, w1, b1, w2, b2) {
84
+ const w1t = g.op("Transpose", [w1], "w1t", [{ kind: "ints", name: "perm", value: [1, 0] }]);
85
+ const pre = g.op("Add", [g.op("MatMul", [x, w1t], "ffn_mm1"), b1], "ffn_pre");
86
+ const h = g.op("Relu", [pre], "ffn_h");
87
+ const w2t = g.op("Transpose", [w2], "w2t", [{ kind: "ints", name: "perm", value: [1, 0] }]);
88
+ return g.op("Add", [g.op("MatMul", [h, w2t], "ffn_mm2"), b2], "ffn_y");
89
+ }
90
+ /** Build the ONNX bytes for a trained LM. */
91
+ export function exportOnnx(lm, opts = {}) {
92
+ const arch = archOf(lm);
93
+ const tensors = namedTensors(lm);
94
+ const byName = new Map(tensors.map((t) => [t.name, t]));
95
+ const get = (name) => {
96
+ const t = byName.get(name);
97
+ if (!t)
98
+ throw new Error(`export/onnx: missing tensor ${name}`);
99
+ return t;
100
+ };
101
+ const g = new GraphBuilder();
102
+ const { vocabSize: V, dModel: D, numLayers: L, convKernel: K, numExperts: E, topK } = arch;
103
+ // Shared scalar/axis initializers.
104
+ const emb = g.initFloat("token_embedding.weight", [V, D], get("token_embedding.weight").data);
105
+ const eps = g.initFloat("rms_eps", [1], new Float32Array([1e-5]));
106
+ const axesLast = g.initInt64("axes_last", [1], [2]); // feature axis of [B,S,*]
107
+ const topkK = g.initInt64("topk_k", [1], [topK]);
108
+ // input_ids → embedded [B,S,D]
109
+ let x = g.op("Gather", [emb, "input_ids"], "embedded", [{ kind: "i", name: "axis", value: 0 }]);
110
+ for (let l = 0; l < L; l++) {
111
+ const p = `layers.${l}`;
112
+ // ── Causal depthwise conv sub-block ──────────────────────────────────────
113
+ const nConv = g.initFloat(`${p}.norm_conv.weight`, [D], get(`${p}.norm_conv.weight`).data);
114
+ const normedC = rmsNorm(g, x, nConv, eps, axesLast);
115
+ // Conv weight: reference ker[c,j] → ONNX W[c,0,K-1-j] (reverse taps), shape [D,1,K].
116
+ const ker = get(`${p}.conv.weight`).data; // [D,K]
117
+ const cw = new Float32Array(D * K);
118
+ for (let c = 0; c < D; c++)
119
+ for (let j = 0; j < K; j++)
120
+ cw[c * K + (K - 1 - j)] = ker[c * K + j];
121
+ const convW = g.initFloat(`${p}.conv.onnx_weight`, [D, 1, K], cw);
122
+ const xt = g.op("Transpose", [normedC], "conv_in", [{ kind: "ints", name: "perm", value: [0, 2, 1] }]); // [B,D,S]
123
+ const cOut = g.op("Conv", [xt, convW], "conv_out", [
124
+ { kind: "i", name: "group", value: D },
125
+ { kind: "ints", name: "kernel_shape", value: [K] },
126
+ { kind: "ints", name: "pads", value: [K - 1, 0] },
127
+ { kind: "ints", name: "strides", value: [1] },
128
+ { kind: "ints", name: "dilations", value: [1] },
129
+ ]);
130
+ const cOutT = g.op("Transpose", [cOut], "conv_back", [{ kind: "ints", name: "perm", value: [0, 2, 1] }]); // [B,S,D]
131
+ const afterConv = g.op("Add", [x, cOutT], "after_conv");
132
+ // ── MoE channel-mixer sub-block ──────────────────────────────────────────
133
+ const nMoe = g.initFloat(`${p}.norm_moe.weight`, [D], get(`${p}.norm_moe.weight`).data);
134
+ const normedM = rmsNorm(g, afterConv, nMoe, eps, axesLast);
135
+ const wr = g.initFloat(`${p}.moe.router.weight`, [E, D], get(`${p}.moe.router.weight`).data);
136
+ const wrT = g.op("Transpose", [wr], "router_t", [{ kind: "ints", name: "perm", value: [1, 0] }]); // [D,E]
137
+ const routerLogits = g.op("MatMul", [normedM, wrT], "router_logits"); // [B,S,E]
138
+ const topkV = g.tmp("topk_v");
139
+ const topkI = g.tmp("topk_i");
140
+ g.node("TopK", [routerLogits, topkK], [topkV, topkI], [
141
+ { kind: "i", name: "axis", value: 2 },
142
+ { kind: "i", name: "largest", value: 1 },
143
+ { kind: "i", name: "sorted", value: 1 },
144
+ ]);
145
+ const gates = g.op("Softmax", [topkV], "gates", [{ kind: "i", name: "axis", value: 2 }]); // [B,S,k]
146
+ const zeros = g.op("Sub", [routerLogits, routerLogits], "zeros"); // [B,S,E]
147
+ const combine = g.op("ScatterElements", [zeros, topkI, gates], "combine", [{ kind: "i", name: "axis", value: 2 }]); // [B,S,E]
148
+ // shared expert (always active)
149
+ const sharedY = ffn(g, normedM, g.initFloat(`${p}.moe.shared.w1`, [arch.hiddenDim, D], get(`${p}.moe.shared.w1`).data), g.initFloat(`${p}.moe.shared.b1`, [arch.hiddenDim], get(`${p}.moe.shared.b1`).data), g.initFloat(`${p}.moe.shared.w2`, [D, arch.hiddenDim], get(`${p}.moe.shared.w2`).data), g.initFloat(`${p}.moe.shared.b2`, [D], get(`${p}.moe.shared.b2`).data));
150
+ // per-expert combine weight: split [B,S,E] → E × [B,S,1]
151
+ const splitOuts = Array.from({ length: E }, (_, e) => g.tmp(`combine_${e}`));
152
+ g.node("Split", [combine], splitOuts, [
153
+ { kind: "i", name: "axis", value: 2 },
154
+ { kind: "i", name: "num_outputs", value: E },
155
+ ]);
156
+ let moeOut = sharedY;
157
+ for (let e = 0; e < E; e++) {
158
+ const ep = `${p}.moe.experts.${e}`;
159
+ const ye = ffn(g, normedM, g.initFloat(`${ep}.w1`, [arch.hiddenDim, D], get(`${ep}.w1`).data), g.initFloat(`${ep}.b1`, [arch.hiddenDim], get(`${ep}.b1`).data), g.initFloat(`${ep}.w2`, [D, arch.hiddenDim], get(`${ep}.w2`).data), g.initFloat(`${ep}.b2`, [D], get(`${ep}.b2`).data));
160
+ const weighted = g.op("Mul", [splitOuts[e], ye], "expert_w"); // [B,S,1]·[B,S,D] broadcast
161
+ moeOut = g.op("Add", [moeOut, weighted], "moe_acc");
162
+ }
163
+ x = g.op("Add", [afterConv, moeOut], "after_moe");
164
+ }
165
+ // Tied head: logits = x · embᵀ.
166
+ const embT = g.op("Transpose", [emb], "emb_t", [{ kind: "ints", name: "perm", value: [1, 0] }]); // [D,V]
167
+ g.node("MatMul", [x, embT], ["logits"]);
168
+ return encodeModel(g, arch, opts);
169
+ }
170
+ // ── protobuf encoding ──────────────────────────────────────────────────────────
171
+ function attrProto(a) {
172
+ const w = new ProtoWriter();
173
+ w.string(1, a.name);
174
+ switch (a.kind) {
175
+ case "i":
176
+ w.varint(20, ATTR_INT);
177
+ w.varint(3, a.value);
178
+ break;
179
+ case "ints":
180
+ w.varint(20, ATTR_INTS);
181
+ for (const v of a.value)
182
+ w.varint(8, v); // repeated (unpacked) int64
183
+ break;
184
+ case "f":
185
+ w.varint(20, ATTR_FLOAT);
186
+ w.float(2, a.value);
187
+ break;
188
+ case "s":
189
+ w.varint(20, ATTR_STRING);
190
+ w.string(4, a.value);
191
+ break;
192
+ }
193
+ return w;
194
+ }
195
+ function nodeProto(n) {
196
+ const w = new ProtoWriter();
197
+ for (const i of n.inputs)
198
+ w.string(1, i);
199
+ for (const o of n.outputs)
200
+ w.string(2, o);
201
+ w.string(3, n.name);
202
+ w.string(4, n.op);
203
+ for (const a of n.attrs)
204
+ w.message(5, attrProto(a));
205
+ return w;
206
+ }
207
+ function tensorProto(t) {
208
+ const w = new ProtoWriter();
209
+ for (const d of t.dims)
210
+ w.varint(1, d); // repeated int64 dims
211
+ w.varint(2, t.dataType);
212
+ w.string(8, t.name);
213
+ if (t.int64)
214
+ for (const v of t.int64)
215
+ w.varint(7, v); // int64_data (unpacked)
216
+ if (t.raw)
217
+ w.bytes(9, t.raw); // raw_data (TensorProto field 9)
218
+ return w;
219
+ }
220
+ function dimParam(name) {
221
+ const w = new ProtoWriter();
222
+ w.string(2, name); // Dimension.dim_param
223
+ return w;
224
+ }
225
+ function dimValue(v) {
226
+ const w = new ProtoWriter();
227
+ w.varint(1, v); // Dimension.dim_value
228
+ return w;
229
+ }
230
+ /** ValueInfoProto for a tensor of the given element type and (symbolic) dims. */
231
+ function valueInfo(name, elemType, dims) {
232
+ const shape = new ProtoWriter();
233
+ for (const d of dims)
234
+ shape.message(1, typeof d === "string" ? dimParam(d) : dimValue(d));
235
+ const tensorType = new ProtoWriter();
236
+ tensorType.varint(1, elemType); // elem_type
237
+ tensorType.message(2, shape); // shape
238
+ const type = new ProtoWriter();
239
+ type.message(1, tensorType); // tensor_type
240
+ const vi = new ProtoWriter();
241
+ vi.string(1, name);
242
+ vi.message(2, type);
243
+ return vi;
244
+ }
245
+ function encodeModel(g, arch, opts) {
246
+ const graph = new ProtoWriter();
247
+ for (const n of g.nodes)
248
+ graph.message(1, nodeProto(n));
249
+ graph.string(2, "evermind");
250
+ for (const t of g.inits)
251
+ graph.message(5, tensorProto(t));
252
+ graph.message(11, valueInfo("input_ids", ELEM_INT64, ["batch", "seq"]));
253
+ graph.message(12, valueInfo("logits", ELEM_FLOAT, ["batch", "seq", arch.vocabSize]));
254
+ const opset = new ProtoWriter();
255
+ opset.string(1, ""); // default domain
256
+ opset.varint(2, OPSET);
257
+ const model = new ProtoWriter();
258
+ model.varint(1, IR_VERSION);
259
+ model.string(2, opts.producerName ?? "builderforce-memory-engine");
260
+ model.string(3, opts.producerVersion ?? "evermind");
261
+ model.message(7, graph);
262
+ model.message(8, opset);
263
+ return model.finish();
264
+ }
265
+ //# sourceMappingURL=onnx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onnx.js","sourceRoot":"","sources":["../../src/export/onnx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * export/protobuf.ts — a minimal, dependency-free protobuf (proto3) wire writer.
3
+ *
4
+ * Just enough of the encoding to emit an ONNX `ModelProto` (see {@link ./onnx}):
5
+ * varint, fixed32 (for float tensors), and length-delimited (string / bytes /
6
+ * nested message) fields. Keeping it tiny and self-contained preserves the
7
+ * engine's zero-runtime-dependency guarantee — no `protobufjs`, no `onnx` proto.
8
+ *
9
+ * Only non-negative integers are emitted (all ONNX ids here are ≥ 0), so the
10
+ * varint path uses plain division and stays correct up to 2^53.
11
+ */
12
+ /** Accumulates protobuf-encoded bytes for one message. */
13
+ export declare class ProtoWriter {
14
+ private readonly parts;
15
+ private byte;
16
+ private rawVarint;
17
+ private tag;
18
+ private rawBytes;
19
+ /** A varint field (int32 / int64 / bool / enum). */
20
+ varint(field: number, value: number): void;
21
+ /** A 32-bit IEEE-754 float field (wire type fixed32, little-endian). */
22
+ float(field: number, value: number): void;
23
+ /** A length-delimited raw-bytes field. */
24
+ bytes(field: number, data: Uint8Array): void;
25
+ /** A length-delimited UTF-8 string field. */
26
+ string(field: number, value: string): void;
27
+ /** A nested-message field (the sub-message encoded as length-delimited bytes). */
28
+ message(field: number, sub: ProtoWriter): void;
29
+ /** The encoded bytes of this message. */
30
+ finish(): Uint8Array;
31
+ }
32
+ /** Pack a Float32Array into little-endian raw bytes (for TensorProto.raw_data). */
33
+ export declare function float32ToBytes(data: Float32Array): Uint8Array;
34
+ //# sourceMappingURL=protobuf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protobuf.d.ts","sourceRoot":"","sources":["../../src/export/protobuf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,0DAA0D;AAC1D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IAEtC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,QAAQ;IAIhB,oDAAoD;IACpD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C,wEAAwE;IACxE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOzC,0CAA0C;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAM5C,6CAA6C;IAC7C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1C,kFAAkF;IAClF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IAI9C,yCAAyC;IACzC,MAAM,IAAI,UAAU;CAGrB;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,CAK7D"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * export/protobuf.ts — a minimal, dependency-free protobuf (proto3) wire writer.
3
+ *
4
+ * Just enough of the encoding to emit an ONNX `ModelProto` (see {@link ./onnx}):
5
+ * varint, fixed32 (for float tensors), and length-delimited (string / bytes /
6
+ * nested message) fields. Keeping it tiny and self-contained preserves the
7
+ * engine's zero-runtime-dependency guarantee — no `protobufjs`, no `onnx` proto.
8
+ *
9
+ * Only non-negative integers are emitted (all ONNX ids here are ≥ 0), so the
10
+ * varint path uses plain division and stays correct up to 2^53.
11
+ */
12
+ const WIRE_VARINT = 0;
13
+ const WIRE_FIXED32 = 5;
14
+ const WIRE_LEN = 2;
15
+ /** Accumulates protobuf-encoded bytes for one message. */
16
+ export class ProtoWriter {
17
+ parts = [];
18
+ byte(b) {
19
+ this.parts.push(b & 0xff);
20
+ }
21
+ rawVarint(value) {
22
+ if (value < 0 || !Number.isFinite(value))
23
+ throw new Error(`ProtoWriter: bad varint ${value}`);
24
+ let v = value;
25
+ while (v >= 0x80) {
26
+ this.byte((v % 0x80) | 0x80);
27
+ v = Math.floor(v / 0x80);
28
+ }
29
+ this.byte(v);
30
+ }
31
+ tag(field, wire) {
32
+ this.rawVarint(field * 8 + wire);
33
+ }
34
+ rawBytes(bytes) {
35
+ for (let i = 0; i < bytes.length; i++)
36
+ this.byte(bytes[i]);
37
+ }
38
+ /** A varint field (int32 / int64 / bool / enum). */
39
+ varint(field, value) {
40
+ this.tag(field, WIRE_VARINT);
41
+ this.rawVarint(value);
42
+ }
43
+ /** A 32-bit IEEE-754 float field (wire type fixed32, little-endian). */
44
+ float(field, value) {
45
+ this.tag(field, WIRE_FIXED32);
46
+ const buf = new ArrayBuffer(4);
47
+ new DataView(buf).setFloat32(0, value, true);
48
+ this.rawBytes(new Uint8Array(buf));
49
+ }
50
+ /** A length-delimited raw-bytes field. */
51
+ bytes(field, data) {
52
+ this.tag(field, WIRE_LEN);
53
+ this.rawVarint(data.length);
54
+ this.rawBytes(data);
55
+ }
56
+ /** A length-delimited UTF-8 string field. */
57
+ string(field, value) {
58
+ this.bytes(field, new TextEncoder().encode(value));
59
+ }
60
+ /** A nested-message field (the sub-message encoded as length-delimited bytes). */
61
+ message(field, sub) {
62
+ this.bytes(field, sub.finish());
63
+ }
64
+ /** The encoded bytes of this message. */
65
+ finish() {
66
+ return Uint8Array.from(this.parts);
67
+ }
68
+ }
69
+ /** Pack a Float32Array into little-endian raw bytes (for TensorProto.raw_data). */
70
+ export function float32ToBytes(data) {
71
+ const out = new Uint8Array(data.length * 4);
72
+ const dv = new DataView(out.buffer);
73
+ for (let i = 0; i < data.length; i++)
74
+ dv.setFloat32(i * 4, data[i], true);
75
+ return out;
76
+ }
77
+ //# sourceMappingURL=protobuf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protobuf.js","sourceRoot":"","sources":["../../src/export/protobuf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * export/safetensors.ts — export weights to the HF-native `.safetensors` format.
3
+ *
4
+ * Layout (the safetensors spec): an 8-byte little-endian u64 header length, then a
5
+ * JSON header mapping each tensor name → {dtype, shape, data_offsets:[start,end]}
6
+ * (offsets relative to the start of the byte buffer that follows the header), then
7
+ * the concatenated raw tensor bytes. Round-trips losslessly in F32; F16 halves the
8
+ * size. Loadable by `safetensors`, `transformers`, and transformers.js.
9
+ */
10
+ import type { EvermindLM } from "../lm/evermind_lm.js";
11
+ import { type NamedTensor } from "./tensors.js";
12
+ export interface SafetensorsOptions {
13
+ /** Store tensors as float16 (half the size). Default false (float32). */
14
+ fp16?: boolean;
15
+ /** Extra `__metadata__` string entries (e.g. format provenance). */
16
+ metadata?: Record<string, string>;
17
+ }
18
+ /** Serialise the given named tensors to a `.safetensors` byte buffer. */
19
+ export declare function tensorsToSafetensors(tensors: NamedTensor[], opts?: SafetensorsOptions): Uint8Array;
20
+ /** Export a trained LM's weights to `.safetensors`. */
21
+ export declare function exportSafetensors(lm: EvermindLM, opts?: SafetensorsOptions): Uint8Array;
22
+ //# sourceMappingURL=safetensors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safetensors.d.ts","sourceRoot":"","sources":["../../src/export/safetensors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG9D,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAeD,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,kBAAuB,GAAG,UAAU,CAiCtG;AAED,uDAAuD;AACvD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,GAAE,kBAAuB,GAAG,UAAU,CAK3F"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * export/safetensors.ts — export weights to the HF-native `.safetensors` format.
3
+ *
4
+ * Layout (the safetensors spec): an 8-byte little-endian u64 header length, then a
5
+ * JSON header mapping each tensor name → {dtype, shape, data_offsets:[start,end]}
6
+ * (offsets relative to the start of the byte buffer that follows the header), then
7
+ * the concatenated raw tensor bytes. Round-trips losslessly in F32; F16 halves the
8
+ * size. Loadable by `safetensors`, `transformers`, and transformers.js.
9
+ */
10
+ import { namedTensors } from "./tensors.js";
11
+ import { floatToFp16 } from "../utils/quantization.js";
12
+ function tensorBytes(data, fp16) {
13
+ if (!fp16) {
14
+ const out = new Uint8Array(data.length * 4);
15
+ const dv = new DataView(out.buffer);
16
+ for (let i = 0; i < data.length; i++)
17
+ dv.setFloat32(i * 4, data[i], true);
18
+ return out;
19
+ }
20
+ const out = new Uint8Array(data.length * 2);
21
+ const dv = new DataView(out.buffer);
22
+ for (let i = 0; i < data.length; i++)
23
+ dv.setUint16(i * 2, floatToFp16(data[i]), true);
24
+ return out;
25
+ }
26
+ /** Serialise the given named tensors to a `.safetensors` byte buffer. */
27
+ export function tensorsToSafetensors(tensors, opts = {}) {
28
+ const fp16 = opts.fp16 ?? false;
29
+ const dtype = fp16 ? "F16" : "F32";
30
+ const bytesPer = fp16 ? 2 : 4;
31
+ const header = {};
32
+ if (opts.metadata)
33
+ header.__metadata__ = opts.metadata;
34
+ const chunks = [];
35
+ let offset = 0;
36
+ for (const t of tensors) {
37
+ const nbytes = t.data.length * bytesPer;
38
+ header[t.name] = { dtype, shape: t.shape, data_offsets: [offset, offset + nbytes] };
39
+ chunks.push(tensorBytes(t.data, fp16));
40
+ offset += nbytes;
41
+ }
42
+ let headerJson = JSON.stringify(header);
43
+ // safetensors requires the header be padded to an 8-byte boundary (with spaces).
44
+ const headerBytesRaw = new TextEncoder().encode(headerJson);
45
+ const pad = (8 - (headerBytesRaw.length % 8)) % 8;
46
+ if (pad > 0)
47
+ headerJson += " ".repeat(pad);
48
+ const headerBytes = new TextEncoder().encode(headerJson);
49
+ const out = new Uint8Array(8 + headerBytes.length + offset);
50
+ new DataView(out.buffer).setBigUint64(0, BigInt(headerBytes.length), true);
51
+ out.set(headerBytes, 8);
52
+ let p = 8 + headerBytes.length;
53
+ for (const c of chunks) {
54
+ out.set(c, p);
55
+ p += c.length;
56
+ }
57
+ return out;
58
+ }
59
+ /** Export a trained LM's weights to `.safetensors`. */
60
+ export function exportSafetensors(lm, opts = {}) {
61
+ return tensorsToSafetensors(namedTensors(lm), {
62
+ ...opts,
63
+ metadata: { format: "pt", producer: "builderforce-memory-engine", ...(opts.metadata ?? {}) },
64
+ });
65
+ }
66
+ //# sourceMappingURL=safetensors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safetensors.js","sourceRoot":"","sources":["../../src/export/safetensors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * export/tensors.ts — the canonical named-tensor view of an EvermindLM.
3
+ *
4
+ * Every export format (safetensors / ONNX / GGUF / HF) consumes the SAME named,
5
+ * shaped tensor list — defined ONCE here so the formats never disagree about a
6
+ * weight's name, shape, or order. The runtime is left untouched: we read the
7
+ * model purely through its public {@link EvermindLM.config} and
8
+ * {@link EvermindLM.parameters} (the AdamW-ordered flat buffers), and re-attach
9
+ * the names/shapes that order implies.
10
+ *
11
+ * Parameter order (must mirror EvermindLM.parameters / SharedExpertMoE.parameters):
12
+ * emb,
13
+ * per layer l: conv[l], normConv[l], normMoe[l],
14
+ * moe: router, shared.{w1,b1,w2,b2}, expert{e}.{w1,b1,w2,b2}…
15
+ */
16
+ import type { EvermindLM } from "../lm/evermind_lm.js";
17
+ /** A named, shaped weight tensor (row-major, flat f32). */
18
+ export interface NamedTensor {
19
+ name: string;
20
+ /** Row-major dimensions, e.g. [vocab, dModel]. */
21
+ shape: number[];
22
+ data: Float32Array;
23
+ }
24
+ /** The flat numeric architecture an export needs (a superset of the LM config). */
25
+ export interface EvermindArch {
26
+ vocabSize: number;
27
+ dModel: number;
28
+ numLayers: number;
29
+ convKernel: number;
30
+ hiddenDim: number;
31
+ numExperts: number;
32
+ topK: number;
33
+ }
34
+ /** Pull the architecture out of a live LM (or any config-shaped object). */
35
+ export declare function archOf(lm: EvermindLM): EvermindArch;
36
+ /** A weight name + its expected shape, in canonical parameter order. */
37
+ export interface TensorSpec {
38
+ name: string;
39
+ shape: number[];
40
+ }
41
+ /** The name+shape of every parameter, in EvermindLM.parameters() order. */
42
+ export declare function evermindTensorSpec(a: EvermindArch): TensorSpec[];
43
+ /**
44
+ * The full named/shaped tensor list of a trained LM, zipping the deterministic
45
+ * {@link evermindTensorSpec} against the live {@link EvermindLM.parameters}. The
46
+ * data buffers are the model's own (no copy) — treat them as read-only.
47
+ */
48
+ export declare function namedTensors(lm: EvermindLM): NamedTensor[];
49
+ /** Total trainable scalar parameters (for sizing / model-card display). */
50
+ export declare function paramCount(lm: EvermindLM): number;
51
+ //# sourceMappingURL=tensors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tensors.d.ts","sourceRoot":"","sources":["../../src/export/tensors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,YAAY,CAWnD;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,GAAG,UAAU,EAAE,CAmBhE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,WAAW,EAAE,CAiB1D;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * export/tensors.ts — the canonical named-tensor view of an EvermindLM.
3
+ *
4
+ * Every export format (safetensors / ONNX / GGUF / HF) consumes the SAME named,
5
+ * shaped tensor list — defined ONCE here so the formats never disagree about a
6
+ * weight's name, shape, or order. The runtime is left untouched: we read the
7
+ * model purely through its public {@link EvermindLM.config} and
8
+ * {@link EvermindLM.parameters} (the AdamW-ordered flat buffers), and re-attach
9
+ * the names/shapes that order implies.
10
+ *
11
+ * Parameter order (must mirror EvermindLM.parameters / SharedExpertMoE.parameters):
12
+ * emb,
13
+ * per layer l: conv[l], normConv[l], normMoe[l],
14
+ * moe: router, shared.{w1,b1,w2,b2}, expert{e}.{w1,b1,w2,b2}…
15
+ */
16
+ /** Pull the architecture out of a live LM (or any config-shaped object). */
17
+ export function archOf(lm) {
18
+ const c = lm.config;
19
+ return {
20
+ vocabSize: c.vocabSize,
21
+ dModel: c.dModel,
22
+ numLayers: c.numLayers,
23
+ convKernel: c.convKernel,
24
+ hiddenDim: c.hiddenDim,
25
+ numExperts: c.numExperts,
26
+ topK: c.topK,
27
+ };
28
+ }
29
+ /** The name+shape of every parameter, in EvermindLM.parameters() order. */
30
+ export function evermindTensorSpec(a) {
31
+ const { vocabSize: V, dModel: D, numLayers: L, convKernel: K, hiddenDim: H, numExperts: E } = a;
32
+ const specs = [{ name: "token_embedding.weight", shape: [V, D] }];
33
+ const ffn = (prefix) => [
34
+ { name: `${prefix}.w1`, shape: [H, D] },
35
+ { name: `${prefix}.b1`, shape: [H] },
36
+ { name: `${prefix}.w2`, shape: [D, H] },
37
+ { name: `${prefix}.b2`, shape: [D] },
38
+ ];
39
+ for (let l = 0; l < L; l++) {
40
+ const p = `layers.${l}`;
41
+ specs.push({ name: `${p}.conv.weight`, shape: [D, K] });
42
+ specs.push({ name: `${p}.norm_conv.weight`, shape: [D] });
43
+ specs.push({ name: `${p}.norm_moe.weight`, shape: [D] });
44
+ specs.push({ name: `${p}.moe.router.weight`, shape: [E, D] });
45
+ specs.push(...ffn(`${p}.moe.shared`));
46
+ for (let e = 0; e < E; e++)
47
+ specs.push(...ffn(`${p}.moe.experts.${e}`));
48
+ }
49
+ return specs;
50
+ }
51
+ /**
52
+ * The full named/shaped tensor list of a trained LM, zipping the deterministic
53
+ * {@link evermindTensorSpec} against the live {@link EvermindLM.parameters}. The
54
+ * data buffers are the model's own (no copy) — treat them as read-only.
55
+ */
56
+ export function namedTensors(lm) {
57
+ const specs = evermindTensorSpec(archOf(lm));
58
+ const params = lm.parameters();
59
+ if (specs.length !== params.length) {
60
+ throw new Error(`export/tensors: parameter-count drift (spec ${specs.length} vs model ${params.length}) — ` +
61
+ `EvermindLM.parameters() order changed; update evermindTensorSpec`);
62
+ }
63
+ return specs.map((s, i) => {
64
+ const numel = s.shape.reduce((n, d) => n * d, 1);
65
+ const data = params[i].data;
66
+ if (data.length !== numel) {
67
+ throw new Error(`export/tensors: shape mismatch for ${s.name} (expected ${numel}, got ${data.length})`);
68
+ }
69
+ return { name: s.name, shape: s.shape, data };
70
+ });
71
+ }
72
+ /** Total trainable scalar parameters (for sizing / model-card display). */
73
+ export function paramCount(lm) {
74
+ return lm.parameters().reduce((n, p) => n + p.data.length, 0);
75
+ }
76
+ //# sourceMappingURL=tensors.js.map