@seanhogg/builderforce-memory-engine 2026.6.18

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 (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +393 -0
  3. package/dist/index.d.ts +32 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +40 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/kernels/activations.d.ts +5 -0
  8. package/dist/kernels/activations.d.ts.map +1 -0
  9. package/dist/kernels/activations.js +171 -0
  10. package/dist/kernels/activations.js.map +1 -0
  11. package/dist/kernels/attention.d.ts +19 -0
  12. package/dist/kernels/attention.d.ts.map +1 -0
  13. package/dist/kernels/attention.js +263 -0
  14. package/dist/kernels/attention.js.map +1 -0
  15. package/dist/kernels/complex_ssd.d.ts +33 -0
  16. package/dist/kernels/complex_ssd.d.ts.map +1 -0
  17. package/dist/kernels/complex_ssd.js +305 -0
  18. package/dist/kernels/complex_ssd.js.map +1 -0
  19. package/dist/kernels/conv1d.d.ts +3 -0
  20. package/dist/kernels/conv1d.d.ts.map +1 -0
  21. package/dist/kernels/conv1d.js +158 -0
  22. package/dist/kernels/conv1d.js.map +1 -0
  23. package/dist/kernels/linear_projection.d.ts +3 -0
  24. package/dist/kernels/linear_projection.d.ts.map +1 -0
  25. package/dist/kernels/linear_projection.js +219 -0
  26. package/dist/kernels/linear_projection.js.map +1 -0
  27. package/dist/kernels/selective_scan.d.ts +3 -0
  28. package/dist/kernels/selective_scan.d.ts.map +1 -0
  29. package/dist/kernels/selective_scan.js +348 -0
  30. package/dist/kernels/selective_scan.js.map +1 -0
  31. package/dist/kernels/ssd.d.ts +29 -0
  32. package/dist/kernels/ssd.d.ts.map +1 -0
  33. package/dist/kernels/ssd.js +276 -0
  34. package/dist/kernels/ssd.js.map +1 -0
  35. package/dist/kernels/weight_update.d.ts +3 -0
  36. package/dist/kernels/weight_update.d.ts.map +1 -0
  37. package/dist/kernels/weight_update.js +119 -0
  38. package/dist/kernels/weight_update.js.map +1 -0
  39. package/dist/model/attention_block.d.ts +48 -0
  40. package/dist/model/attention_block.d.ts.map +1 -0
  41. package/dist/model/attention_block.js +262 -0
  42. package/dist/model/attention_block.js.map +1 -0
  43. package/dist/model/mamba1_block.d.ts +70 -0
  44. package/dist/model/mamba1_block.d.ts.map +1 -0
  45. package/dist/model/mamba1_block.js +333 -0
  46. package/dist/model/mamba1_block.js.map +1 -0
  47. package/dist/model/mamba2_block.d.ts +44 -0
  48. package/dist/model/mamba2_block.d.ts.map +1 -0
  49. package/dist/model/mamba2_block.js +252 -0
  50. package/dist/model/mamba2_block.js.map +1 -0
  51. package/dist/model/mamba3_block.d.ts +51 -0
  52. package/dist/model/mamba3_block.d.ts.map +1 -0
  53. package/dist/model/mamba3_block.js +270 -0
  54. package/dist/model/mamba3_block.js.map +1 -0
  55. package/dist/model/mamba_block.d.ts +64 -0
  56. package/dist/model/mamba_block.d.ts.map +1 -0
  57. package/dist/model/mamba_block.js +303 -0
  58. package/dist/model/mamba_block.js.map +1 -0
  59. package/dist/model/mamba_model.d.ts +140 -0
  60. package/dist/model/mamba_model.d.ts.map +1 -0
  61. package/dist/model/mamba_model.js +527 -0
  62. package/dist/model/mamba_model.js.map +1 -0
  63. package/dist/model/sequence_layer.d.ts +25 -0
  64. package/dist/model/sequence_layer.d.ts.map +1 -0
  65. package/dist/model/sequence_layer.js +8 -0
  66. package/dist/model/sequence_layer.js.map +1 -0
  67. package/dist/tokenizer/bpe.d.ts +29 -0
  68. package/dist/tokenizer/bpe.d.ts.map +1 -0
  69. package/dist/tokenizer/bpe.js +164 -0
  70. package/dist/tokenizer/bpe.js.map +1 -0
  71. package/dist/training/autograd.d.ts +27 -0
  72. package/dist/training/autograd.d.ts.map +1 -0
  73. package/dist/training/autograd.js +120 -0
  74. package/dist/training/autograd.js.map +1 -0
  75. package/dist/training/trainer.d.ts +36 -0
  76. package/dist/training/trainer.d.ts.map +1 -0
  77. package/dist/training/trainer.js +183 -0
  78. package/dist/training/trainer.js.map +1 -0
  79. package/dist/utils/gpu_utils.d.ts +21 -0
  80. package/dist/utils/gpu_utils.d.ts.map +1 -0
  81. package/dist/utils/gpu_utils.js +111 -0
  82. package/dist/utils/gpu_utils.js.map +1 -0
  83. package/dist/utils/quantization.d.ts +26 -0
  84. package/dist/utils/quantization.d.ts.map +1 -0
  85. package/dist/utils/quantization.js +116 -0
  86. package/dist/utils/quantization.js.map +1 -0
  87. package/dist/utils/rng.d.ts +36 -0
  88. package/dist/utils/rng.d.ts.map +1 -0
  89. package/dist/utils/rng.js +61 -0
  90. package/dist/utils/rng.js.map +1 -0
  91. package/package.json +99 -0
  92. package/src/index.ts +114 -0
  93. package/src/kernels/activations.ts +174 -0
  94. package/src/kernels/attention.ts +268 -0
  95. package/src/kernels/complex_ssd.ts +307 -0
  96. package/src/kernels/conv1d.ts +159 -0
  97. package/src/kernels/linear_projection.ts +220 -0
  98. package/src/kernels/selective_scan.ts +350 -0
  99. package/src/kernels/ssd.ts +278 -0
  100. package/src/kernels/weight_update.ts +120 -0
  101. package/src/model/attention_block.ts +344 -0
  102. package/src/model/mamba1_block.ts +437 -0
  103. package/src/model/mamba2_block.ts +319 -0
  104. package/src/model/mamba3_block.ts +335 -0
  105. package/src/model/mamba_block.ts +401 -0
  106. package/src/model/mamba_model.ts +678 -0
  107. package/src/model/sequence_layer.ts +29 -0
  108. package/src/tokenizer/bpe.ts +186 -0
  109. package/src/training/autograd.ts +135 -0
  110. package/src/training/trainer.ts +309 -0
  111. package/src/utils/gpu_utils.ts +147 -0
  112. package/src/utils/quantization.ts +154 -0
  113. package/src/utils/rng.ts +65 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * gpu_utils.ts – WebGPU device management and buffer helpers.
3
+ */
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const _gpu = globalThis;
6
+ const UNIFORM = _gpu.GPUBufferUsage?.UNIFORM ?? 0x40;
7
+ const STORAGE = _gpu.GPUBufferUsage?.STORAGE ?? 0x80;
8
+ const COPY_SRC = _gpu.GPUBufferUsage?.COPY_SRC ?? 0x04;
9
+ const COPY_DST = _gpu.GPUBufferUsage?.COPY_DST ?? 0x08;
10
+ const MAP_READ = _gpu.GPUBufferUsage?.MAP_READ ?? 0x01;
11
+ export async function initWebGPU(opts = {}) {
12
+ if (typeof navigator === 'undefined' || !navigator.gpu) {
13
+ throw new Error('WebGPU is not available in this environment. ' +
14
+ 'Use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.');
15
+ }
16
+ const adapter = await navigator.gpu.requestAdapter({
17
+ powerPreference: opts.powerPreference ?? 'high-performance',
18
+ });
19
+ if (!adapter) {
20
+ throw new Error('Failed to acquire a GPUAdapter. Your GPU may not support WebGPU.');
21
+ }
22
+ const adapterLimits = adapter.limits;
23
+ const requested3GB = 3 * 1024 * 1024 * 1024;
24
+ const device = await adapter.requestDevice({
25
+ requiredLimits: {
26
+ maxBufferSize: Math.min(requested3GB, adapterLimits.maxBufferSize),
27
+ maxStorageBufferBindingSize: Math.min(requested3GB, adapterLimits.maxStorageBufferBindingSize),
28
+ maxComputeInvocationsPerWorkgroup: Math.min(256, adapterLimits.maxComputeInvocationsPerWorkgroup),
29
+ },
30
+ });
31
+ device.lost.then((info) => {
32
+ console.error('WebGPU device lost:', info.message);
33
+ });
34
+ return { device, adapter };
35
+ }
36
+ export function createStorageBuffer(device, data, readable = false) {
37
+ const arr = data instanceof Float32Array || data instanceof Uint32Array ? data : new Float32Array(data);
38
+ const usage = STORAGE | COPY_DST | (readable ? COPY_SRC : 0);
39
+ const buffer = device.createBuffer({ size: arr.byteLength, usage, mappedAtCreation: true });
40
+ if (arr instanceof Uint32Array) {
41
+ new Uint32Array(buffer.getMappedRange()).set(arr);
42
+ }
43
+ else {
44
+ new Float32Array(buffer.getMappedRange()).set(arr);
45
+ }
46
+ buffer.unmap();
47
+ return buffer;
48
+ }
49
+ export function createEmptyStorageBuffer(device, byteSize, readable = false) {
50
+ const usage = STORAGE | COPY_DST | (readable ? COPY_SRC : 0);
51
+ return device.createBuffer({ size: byteSize, usage });
52
+ }
53
+ export function createUniformBuffer(device, data) {
54
+ const bytes = ArrayBuffer.isView(data) ? data.buffer : data;
55
+ const buffer = device.createBuffer({
56
+ size: bytes.byteLength,
57
+ usage: UNIFORM | COPY_DST,
58
+ mappedAtCreation: true,
59
+ });
60
+ new Uint8Array(buffer.getMappedRange()).set(new Uint8Array(bytes));
61
+ buffer.unmap();
62
+ return buffer;
63
+ }
64
+ export async function readBuffer(device, srcBuffer, byteSize) {
65
+ const MAP_READ_FLAG = _gpu.GPUMapMode?.READ ?? 0x01;
66
+ const stagingBuffer = device.createBuffer({
67
+ size: byteSize,
68
+ usage: MAP_READ | COPY_DST,
69
+ });
70
+ const encoder = device.createCommandEncoder();
71
+ encoder.copyBufferToBuffer(srcBuffer, 0, stagingBuffer, 0, byteSize);
72
+ device.queue.submit([encoder.finish()]);
73
+ await stagingBuffer.mapAsync(MAP_READ_FLAG);
74
+ const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));
75
+ stagingBuffer.unmap();
76
+ stagingBuffer.destroy();
77
+ return result;
78
+ }
79
+ export function uploadBuffer(device, buffer, data, byteOffset = 0) {
80
+ device.queue.writeBuffer(buffer, byteOffset, data.buffer, data.byteOffset, data.byteLength);
81
+ }
82
+ export function createComputePipeline(device, wgslSource, entryPoint) {
83
+ const shaderModule = device.createShaderModule({ code: wgslSource });
84
+ return device.createComputePipeline({
85
+ layout: 'auto',
86
+ compute: { module: shaderModule, entryPoint },
87
+ });
88
+ }
89
+ export function createBindGroup(device, pipeline, buffers, groupIndex = 0) {
90
+ const entries = buffers.map((buf, i) => ({
91
+ binding: i,
92
+ resource: { buffer: buf },
93
+ }));
94
+ return device.createBindGroup({
95
+ layout: pipeline.getBindGroupLayout(groupIndex),
96
+ entries,
97
+ });
98
+ }
99
+ export function dispatchKernel(device, pipeline, bindGroup, workgroups) {
100
+ const encoder = device.createCommandEncoder();
101
+ const pass = encoder.beginComputePass();
102
+ pass.setPipeline(pipeline);
103
+ pass.setBindGroup(0, bindGroup);
104
+ pass.dispatchWorkgroups(...workgroups);
105
+ pass.end();
106
+ device.queue.submit([encoder.finish()]);
107
+ }
108
+ export function cdiv(a, b) {
109
+ return Math.ceil(a / b);
110
+ }
111
+ //# sourceMappingURL=gpu_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_utils.js","sourceRoot":"","sources":["../../src/utils/gpu_utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * quantization.ts – FP16 and Int8 quantization utilities.
3
+ */
4
+ export interface QuantizeInt8Result {
5
+ data: Int8Array;
6
+ scale: number;
7
+ }
8
+ export interface QuantizeInt8PerChannelResult {
9
+ data: Int8Array;
10
+ scales: Float32Array;
11
+ }
12
+ export interface MemoryEstimate {
13
+ fp32: number;
14
+ fp16: number;
15
+ int8: number;
16
+ }
17
+ export declare function floatToFp16(val: number): number;
18
+ export declare function fp16ToFloat(val: number): number;
19
+ export declare function quantizeFp16(f32: Float32Array): Uint16Array;
20
+ export declare function dequantizeFp16(fp16: Uint16Array): Float32Array;
21
+ export declare function quantizeInt8(f32: Float32Array): QuantizeInt8Result;
22
+ export declare function dequantizeInt8(int8: Int8Array, scale: number): Float32Array;
23
+ export declare function quantizeInt8PerChannel(f32: Float32Array, numChannels: number): QuantizeInt8PerChannelResult;
24
+ export declare function dequantizeInt8PerChannel(int8: Int8Array, scales: Float32Array, numChannels: number): Float32Array;
25
+ export declare function estimateMemory(numElements: number): MemoryEstimate;
26
+ //# sourceMappingURL=quantization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantization.d.ts","sourceRoot":"","sources":["../../src/utils/quantization.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4B/C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiB/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,WAAW,CAM3D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAM9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAelE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAM3E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,4BAA4B,CAqB3G;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAYjH;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAMlE"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * quantization.ts – FP16 and Int8 quantization utilities.
3
+ */
4
+ export function floatToFp16(val) {
5
+ const buf = new ArrayBuffer(4);
6
+ const f32 = new Float32Array(buf);
7
+ const u32 = new Uint32Array(buf);
8
+ f32[0] = val;
9
+ const bits = u32[0];
10
+ const sign = (bits >>> 31) & 0x1;
11
+ const exponent = (bits >>> 23) & 0xFF;
12
+ const mantissa = bits & 0x7FFFFF;
13
+ if (exponent === 255) {
14
+ return (sign << 15) | 0x7C00 | (mantissa ? 0x200 : 0);
15
+ }
16
+ const expAdj = exponent - 127 + 15;
17
+ if (expAdj >= 31) {
18
+ return (sign << 15) | 0x7C00;
19
+ }
20
+ if (expAdj <= 0) {
21
+ if (expAdj < -10) {
22
+ return sign << 15;
23
+ }
24
+ const shift = 14 - expAdj;
25
+ return (sign << 15) | ((mantissa | 0x800000) >> shift);
26
+ }
27
+ return (sign << 15) | (expAdj << 10) | (mantissa >> 13);
28
+ }
29
+ export function fp16ToFloat(val) {
30
+ const sign = (val >>> 15) & 0x1;
31
+ const exponent = (val >>> 10) & 0x1F;
32
+ const mantissa = val & 0x3FF;
33
+ if (exponent === 0) {
34
+ const f = mantissa / 1024.0;
35
+ return sign ? -f : f;
36
+ }
37
+ if (exponent === 31) {
38
+ return sign ? -Infinity : (mantissa ? NaN : Infinity);
39
+ }
40
+ const expUnbiased = exponent - 15;
41
+ const f = (1 + mantissa / 1024.0) * Math.pow(2, expUnbiased);
42
+ return sign ? -f : f;
43
+ }
44
+ export function quantizeFp16(f32) {
45
+ const out = new Uint16Array(f32.length);
46
+ for (let i = 0; i < f32.length; i++) {
47
+ out[i] = floatToFp16(f32[i]);
48
+ }
49
+ return out;
50
+ }
51
+ export function dequantizeFp16(fp16) {
52
+ const out = new Float32Array(fp16.length);
53
+ for (let i = 0; i < fp16.length; i++) {
54
+ out[i] = fp16ToFloat(fp16[i]);
55
+ }
56
+ return out;
57
+ }
58
+ export function quantizeInt8(f32) {
59
+ let maxAbs = 0;
60
+ for (let i = 0; i < f32.length; i++) {
61
+ const a = Math.abs(f32[i]);
62
+ if (a > maxAbs)
63
+ maxAbs = a;
64
+ }
65
+ const scale = maxAbs / 127.0 || 1.0;
66
+ const data = new Int8Array(f32.length);
67
+ for (let i = 0; i < f32.length; i++) {
68
+ data[i] = Math.max(-128, Math.min(127, Math.round(f32[i] / scale)));
69
+ }
70
+ return { data, scale };
71
+ }
72
+ export function dequantizeInt8(int8, scale) {
73
+ const out = new Float32Array(int8.length);
74
+ for (let i = 0; i < int8.length; i++) {
75
+ out[i] = int8[i] * scale;
76
+ }
77
+ return out;
78
+ }
79
+ export function quantizeInt8PerChannel(f32, numChannels) {
80
+ const channelSize = f32.length / numChannels;
81
+ const scales = new Float32Array(numChannels);
82
+ const data = new Int8Array(f32.length);
83
+ for (let c = 0; c < numChannels; c++) {
84
+ let maxAbs = 0;
85
+ const base = c * channelSize;
86
+ for (let j = 0; j < channelSize; j++) {
87
+ const a = Math.abs(f32[base + j]);
88
+ if (a > maxAbs)
89
+ maxAbs = a;
90
+ }
91
+ scales[c] = maxAbs / 127.0 || 1.0;
92
+ for (let j = 0; j < channelSize; j++) {
93
+ data[base + j] = Math.max(-128, Math.min(127, Math.round(f32[base + j] / scales[c])));
94
+ }
95
+ }
96
+ return { data, scales };
97
+ }
98
+ export function dequantizeInt8PerChannel(int8, scales, numChannels) {
99
+ const channelSize = int8.length / numChannels;
100
+ const out = new Float32Array(int8.length);
101
+ for (let c = 0; c < numChannels; c++) {
102
+ const base = c * channelSize;
103
+ for (let j = 0; j < channelSize; j++) {
104
+ out[base + j] = int8[base + j] * scales[c];
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ export function estimateMemory(numElements) {
110
+ return {
111
+ fp32: numElements * 4,
112
+ fp16: numElements * 2,
113
+ int8: numElements * 1,
114
+ };
115
+ }
116
+ //# sourceMappingURL=quantization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantization.js","sourceRoot":"","sources":["../../src/utils/quantization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * rng.ts – shared, optionally-seeded random source for weight initialisation.
3
+ *
4
+ * Weight init across the model and every block used to duplicate the same
5
+ * `Math.random()` Box–Muller draw. That made cold-start weights
6
+ * non-reproducible across machines. This module centralises the draw and lets
7
+ * the model install a deterministic seed for the duration of construction, so
8
+ * the same `seed` yields byte-identical initial weights everywhere.
9
+ *
10
+ * The default (unseeded) source delegates to `Math.random`, preserving the
11
+ * original behaviour for callers that don't request a seed.
12
+ *
13
+ * The seeded generator uses the same LCG constants as tools/generate-bin.js so
14
+ * tooling and runtime agree on what a "seed N" model looks like.
15
+ */
16
+ /** Deterministic linear-congruential generator (Numerical Recipes constants). */
17
+ export declare class SeededRng {
18
+ private _s;
19
+ constructor(seed: number);
20
+ /** Next float in [0, 1). */
21
+ next(): number;
22
+ }
23
+ /**
24
+ * Installs (or clears) the deterministic init seed.
25
+ * Pass a number to make subsequent `randn`/`gaussianArray` draws reproducible;
26
+ * pass `undefined` to restore the default `Math.random` source.
27
+ *
28
+ * Construction is synchronous, so a process-wide source is safe: seed before
29
+ * building a model and clear afterwards.
30
+ */
31
+ export declare function setInitSeed(seed: number | undefined): void;
32
+ /** Box–Muller Gaussian sample from the active source. */
33
+ export declare function randn(std?: number): number;
34
+ /** Returns a Float32Array of `n` Gaussian samples with the given standard deviation. */
35
+ export declare function gaussianArray(n: number, std: number): Float32Array;
36
+ //# sourceMappingURL=rng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.d.ts","sourceRoot":"","sources":["../../src/utils/rng.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iFAAiF;AACjF,qBAAa,SAAS;IAClB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,MAAM;IAKxB,4BAA4B;IAC5B,IAAI,IAAI,MAAM;CAIjB;AAKD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAO1D;AAED,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,GAAG,SAAI,GAAG,MAAM,CAIrC;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAIlE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * rng.ts – shared, optionally-seeded random source for weight initialisation.
3
+ *
4
+ * Weight init across the model and every block used to duplicate the same
5
+ * `Math.random()` Box–Muller draw. That made cold-start weights
6
+ * non-reproducible across machines. This module centralises the draw and lets
7
+ * the model install a deterministic seed for the duration of construction, so
8
+ * the same `seed` yields byte-identical initial weights everywhere.
9
+ *
10
+ * The default (unseeded) source delegates to `Math.random`, preserving the
11
+ * original behaviour for callers that don't request a seed.
12
+ *
13
+ * The seeded generator uses the same LCG constants as tools/generate-bin.js so
14
+ * tooling and runtime agree on what a "seed N" model looks like.
15
+ */
16
+ /** Deterministic linear-congruential generator (Numerical Recipes constants). */
17
+ export class SeededRng {
18
+ _s;
19
+ constructor(seed) {
20
+ // Avoid the zero fixed point; keep state in uint32 range.
21
+ this._s = (seed >>> 0) || 1;
22
+ }
23
+ /** Next float in [0, 1). */
24
+ next() {
25
+ this._s = (Math.imul(1664525, this._s) + 1013904223) >>> 0;
26
+ return this._s / 0x1_0000_0000;
27
+ }
28
+ }
29
+ /** Active uniform source. Swapped by setInitSeed; defaults to Math.random. */
30
+ let _next = Math.random;
31
+ /**
32
+ * Installs (or clears) the deterministic init seed.
33
+ * Pass a number to make subsequent `randn`/`gaussianArray` draws reproducible;
34
+ * pass `undefined` to restore the default `Math.random` source.
35
+ *
36
+ * Construction is synchronous, so a process-wide source is safe: seed before
37
+ * building a model and clear afterwards.
38
+ */
39
+ export function setInitSeed(seed) {
40
+ if (seed == null) {
41
+ _next = Math.random;
42
+ }
43
+ else {
44
+ const rng = new SeededRng(seed);
45
+ _next = () => rng.next();
46
+ }
47
+ }
48
+ /** Box–Muller Gaussian sample from the active source. */
49
+ export function randn(std = 1) {
50
+ const u1 = Math.max(_next(), 1e-12);
51
+ const u2 = _next();
52
+ return std * Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
53
+ }
54
+ /** Returns a Float32Array of `n` Gaussian samples with the given standard deviation. */
55
+ export function gaussianArray(n, std) {
56
+ const a = new Float32Array(n);
57
+ for (let i = 0; i < n; i++)
58
+ a[i] = randn(std);
59
+ return a;
60
+ }
61
+ //# sourceMappingURL=rng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.js","sourceRoot":"","sources":["../../src/utils/rng.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iFAAiF;AACjF,MAAM,OAAO,SAAS;IACV,EAAE,CAAS;IAEnB,YAAY,IAAY;QACpB,0DAA0D;QAC1D,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,4BAA4B;IAC5B,IAAI;QACA,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,EAAE,GAAG,aAAa,CAAC;IACnC,CAAC;CACJ;AAED,8EAA8E;AAC9E,IAAI,KAAK,GAAiB,IAAI,CAAC,MAAM,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAwB;IAChD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACf,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;AACL,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,KAAK,CAAC,GAAG,GAAG,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,GAAW;IAChD,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@seanhogg/builderforce-memory-engine",
3
+ "version": "2026.6.18",
4
+ "description": "BuilderForce Agent Memory — engine layer. TypeScript/WGSL Mamba SSM kernels, model blocks, autograd, training, and BPE tokenizer (zero runtime deps, WebGPU-native).",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "type": "module",
15
+ "files": [
16
+ "dist",
17
+ "src",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "keywords": [
22
+ "mamba",
23
+ "ssm",
24
+ "state-space-model",
25
+ "webgpu",
26
+ "wgsl",
27
+ "machine-learning",
28
+ "code-model",
29
+ "bpe",
30
+ "transformer-alternative",
31
+ "agent-memory",
32
+ "builderforce",
33
+ "typescript"
34
+ ],
35
+ "author": {
36
+ "name": "Sean Hogg",
37
+ "email": "seanhogg@gmail.com",
38
+ "url": "https://builderforce.ai"
39
+ },
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/SeanHogg/builderforce-memory.git",
44
+ "directory": "packages/memory-engine"
45
+ },
46
+ "bugs": {
47
+ "url": "https://github.com/SeanHogg/builderforce-memory/issues"
48
+ },
49
+ "homepage": "https://github.com/SeanHogg/builderforce-memory/tree/main/packages/memory-engine#readme",
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
53
+ "publishConfig": {
54
+ "access": "public",
55
+ "registry": "https://registry.npmjs.org"
56
+ },
57
+ "devDependencies": {
58
+ "@types/jest": "^29.5.0",
59
+ "@webgpu/types": "^0.1.49",
60
+ "eslint": "^8.57.0",
61
+ "jest": "^29.7.0",
62
+ "ts-jest": "^29.2.0",
63
+ "typescript": "^5.0.0"
64
+ },
65
+ "jest": {
66
+ "preset": "ts-jest/presets/default-esm",
67
+ "extensionsToTreatAsEsm": [
68
+ ".ts"
69
+ ],
70
+ "transform": {
71
+ "^.+\\.tsx?$": [
72
+ "ts-jest",
73
+ {
74
+ "useESM": true,
75
+ "tsconfig": {
76
+ "module": "ES2022",
77
+ "moduleResolution": "bundler",
78
+ "strict": true,
79
+ "esModuleInterop": true,
80
+ "skipLibCheck": true,
81
+ "types": [
82
+ "@webgpu/types",
83
+ "jest"
84
+ ]
85
+ }
86
+ }
87
+ ]
88
+ },
89
+ "moduleNameMapper": {
90
+ "^(\\.{1,2}/.*)\\.js$": "$1"
91
+ }
92
+ },
93
+ "scripts": {
94
+ "build": "tsc",
95
+ "serve": "node serve.js",
96
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
97
+ "lint": "eslint src/ tests/"
98
+ }
99
+ }
package/src/index.ts ADDED
@@ -0,0 +1,114 @@
1
+ /**
2
+ * MambaCode.js – Entry Point (v2.0.0)
3
+ */
4
+
5
+ // ── Model classes ─────────────────────────────────────────────────────────────
6
+
7
+ export { HybridMambaModel, MambaModel } from './model/mamba_model.js';
8
+
9
+ // New block classes
10
+ export { Mamba1Block } from './model/mamba1_block.js';
11
+ export { Mamba2Block } from './model/mamba2_block.js';
12
+ export { Mamba3Block } from './model/mamba3_block.js';
13
+ export { AttentionBlock } from './model/attention_block.js';
14
+
15
+ // Deprecated alias — kept until 3.0.0
16
+ export { MambaBlock } from './model/mamba1_block.js';
17
+
18
+ // ── Training ──────────────────────────────────────────────────────────────────
19
+
20
+ export { MambaTrainer } from './training/trainer.js';
21
+ export {
22
+ Tensor,
23
+ backward,
24
+ enableGrad,
25
+ noGrad,
26
+ clearTape,
27
+ recordOperation,
28
+ crossEntropyLoss,
29
+ crossEntropyGrad,
30
+ } from './training/autograd.js';
31
+
32
+ // ── Tokenizer ─────────────────────────────────────────────────────────────────
33
+
34
+ export { BPETokenizer } from './tokenizer/bpe.js';
35
+
36
+ // ── Seeded RNG (reproducible weight init) ─────────────────────────────────────
37
+
38
+ export { SeededRng, setInitSeed, randn, gaussianArray } from './utils/rng.js';
39
+
40
+ // ── Types ─────────────────────────────────────────────────────────────────────
41
+
42
+ export type {
43
+ HybridMambaModelConfig,
44
+ MambaModelConfig,
45
+ ModelForwardResult,
46
+ SamplingOptions,
47
+ LayerSpec,
48
+ } from './model/mamba_model.js';
49
+
50
+ export type { SequenceLayer, LayerParam, LayerType, LayerForwardResult } from './model/sequence_layer.js';
51
+ export type { Mamba1BlockConfig, BlockParam, BlockCache, BlockForwardResult, MambaBlockConfig } from './model/mamba1_block.js';
52
+ export type { Mamba2BlockConfig, Mamba2Cache } from './model/mamba2_block.js';
53
+ export type { Mamba3BlockConfig, Mamba3Cache } from './model/mamba3_block.js';
54
+ export type { AttentionBlockConfig, AttentionCache } from './model/attention_block.js';
55
+
56
+ // ── GPU utilities ─────────────────────────────────────────────────────────────
57
+
58
+ export {
59
+ initWebGPU,
60
+ createStorageBuffer,
61
+ createEmptyStorageBuffer,
62
+ createUniformBuffer,
63
+ createComputePipeline,
64
+ createBindGroup,
65
+ dispatchKernel,
66
+ readBuffer,
67
+ uploadBuffer,
68
+ cdiv,
69
+ } from './utils/gpu_utils.js';
70
+
71
+ // ── Quantization ──────────────────────────────────────────────────────────────
72
+
73
+ export {
74
+ quantizeFp16,
75
+ dequantizeFp16,
76
+ floatToFp16,
77
+ fp16ToFloat,
78
+ quantizeInt8,
79
+ dequantizeInt8,
80
+ quantizeInt8PerChannel,
81
+ dequantizeInt8PerChannel,
82
+ estimateMemory,
83
+ } from './utils/quantization.js';
84
+
85
+ // ── WGSL kernel sources ───────────────────────────────────────────────────────
86
+
87
+ // Mamba-1 kernels (unchanged)
88
+ export { SELECTIVE_SCAN_FORWARD_WGSL, SELECTIVE_SCAN_BACKWARD_WGSL }
89
+ from './kernels/selective_scan.js';
90
+ export { CONV1D_FORWARD_WGSL, CONV1D_BACKWARD_WGSL }
91
+ from './kernels/conv1d.js';
92
+ export { LINEAR_FORWARD_WGSL, LINEAR_BACKWARD_WGSL }
93
+ from './kernels/linear_projection.js';
94
+ export { WEIGHT_UPDATE_WGSL, GRAD_CLIP_WGSL }
95
+ from './kernels/weight_update.js';
96
+ export { ACTIVATIONS_WGSL, ACTIVATIONS_BACKWARD_WGSL, SOFTMAX_FORWARD_WGSL, SOFTMAX_BACKWARD_WGSL }
97
+ from './kernels/activations.js';
98
+
99
+ // Mamba-2 SSD kernels
100
+ export { SSD_FORWARD_WGSL, SSD_BACKWARD_WGSL }
101
+ from './kernels/ssd.js';
102
+
103
+ // Mamba-3 complex SSD kernels
104
+ export { COMPLEX_SSD_FORWARD_WGSL, COMPLEX_SSD_BACKWARD_WGSL }
105
+ from './kernels/complex_ssd.js';
106
+
107
+ // Attention kernels
108
+ export { ATTENTION_FORWARD_WGSL, ATTENTION_BACKWARD_WGSL, SOFTMAX_WGSL }
109
+ from './kernels/attention.js';
110
+
111
+ // ── Version ───────────────────────────────────────────────────────────────────
112
+
113
+ export const VERSION = '2.0.0';
114
+ export const DESCRIPTION = 'MambaCode.js: WebGPU-accelerated Mamba-1/2/3 and Hybrid SSM for browser code models';