@mni-ml/framework 0.0.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 (73) hide show
  1. package/dist/autodiff.d.ts +13 -0
  2. package/dist/autodiff.d.ts.map +1 -0
  3. package/dist/autodiff.js +91 -0
  4. package/dist/autodiff.js.map +1 -0
  5. package/dist/datasets.d.ts +16 -0
  6. package/dist/datasets.d.ts.map +1 -0
  7. package/dist/datasets.js +64 -0
  8. package/dist/datasets.js.map +1 -0
  9. package/dist/fast_ops.d.ts +23 -0
  10. package/dist/fast_ops.d.ts.map +1 -0
  11. package/dist/fast_ops.js +263 -0
  12. package/dist/fast_ops.js.map +1 -0
  13. package/dist/fast_ops_worker.d.ts +2 -0
  14. package/dist/fast_ops_worker.d.ts.map +1 -0
  15. package/dist/fast_ops_worker.js +119 -0
  16. package/dist/fast_ops_worker.js.map +1 -0
  17. package/dist/gpu_backend.d.ts +37 -0
  18. package/dist/gpu_backend.d.ts.map +1 -0
  19. package/dist/gpu_backend.js +163 -0
  20. package/dist/gpu_backend.js.map +1 -0
  21. package/dist/gpu_kernels.d.ts +74 -0
  22. package/dist/gpu_kernels.d.ts.map +1 -0
  23. package/dist/gpu_kernels.js +571 -0
  24. package/dist/gpu_kernels.js.map +1 -0
  25. package/dist/gpu_ops.d.ts +43 -0
  26. package/dist/gpu_ops.d.ts.map +1 -0
  27. package/dist/gpu_ops.js +365 -0
  28. package/dist/gpu_ops.js.map +1 -0
  29. package/dist/index.d.ts +15 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +20 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/module.d.ts +23 -0
  34. package/dist/module.d.ts.map +1 -0
  35. package/dist/module.js +97 -0
  36. package/dist/module.js.map +1 -0
  37. package/dist/nn.d.ts +63 -0
  38. package/dist/nn.d.ts.map +1 -0
  39. package/dist/nn.js +234 -0
  40. package/dist/nn.js.map +1 -0
  41. package/dist/operators.d.ts +29 -0
  42. package/dist/operators.d.ts.map +1 -0
  43. package/dist/operators.js +91 -0
  44. package/dist/operators.js.map +1 -0
  45. package/dist/optimizer.d.ts +15 -0
  46. package/dist/optimizer.d.ts.map +1 -0
  47. package/dist/optimizer.js +62 -0
  48. package/dist/optimizer.js.map +1 -0
  49. package/dist/scalar.d.ts +42 -0
  50. package/dist/scalar.d.ts.map +1 -0
  51. package/dist/scalar.js +126 -0
  52. package/dist/scalar.js.map +1 -0
  53. package/dist/scalar_functions.d.ts +62 -0
  54. package/dist/scalar_functions.d.ts.map +1 -0
  55. package/dist/scalar_functions.js +127 -0
  56. package/dist/scalar_functions.js.map +1 -0
  57. package/dist/tensor.d.ts +58 -0
  58. package/dist/tensor.d.ts.map +1 -0
  59. package/dist/tensor.js +288 -0
  60. package/dist/tensor.js.map +1 -0
  61. package/dist/tensor_data.d.ts +29 -0
  62. package/dist/tensor_data.d.ts.map +1 -0
  63. package/dist/tensor_data.js +131 -0
  64. package/dist/tensor_data.js.map +1 -0
  65. package/dist/tensor_functions.d.ts +97 -0
  66. package/dist/tensor_functions.d.ts.map +1 -0
  67. package/dist/tensor_functions.js +465 -0
  68. package/dist/tensor_functions.js.map +1 -0
  69. package/dist/tensor_ops.d.ts +47 -0
  70. package/dist/tensor_ops.d.ts.map +1 -0
  71. package/dist/tensor_ops.js +249 -0
  72. package/dist/tensor_ops.js.map +1 -0
  73. package/package.json +45 -0
@@ -0,0 +1,365 @@
1
+ import { shapeProduct, strides as computeStrides } from './tensor_data.js';
2
+ import { getDevice, getTensorCoreDevice, uploadBuffer, createOutputBuffer, readbackBuffer, createUniformBuffer, createStorageParamsBuffer, getOrCreatePipeline, } from './gpu_backend.js';
3
+ import { WORKGROUP_SIZE, BLOCK_SIZE, TC_TILE, UNARY_OPS, BINARY_OPS, REDUCE_IDENTITY, resolveUnaryOp, resolveBinaryOp, buildAlignedMapShader, buildBroadcastMapShader, buildAlignedZipShader, buildBroadcastZipShader, buildSumPracticeShader, buildReduceShader, buildMatMulShader, buildTensorCoreMatMulShader, } from './gpu_kernels.js';
4
+ const MAX_DIMS = 6;
5
+ // ---- Helpers ----
6
+ function shapesEqual(a, b) {
7
+ if (a.length !== b.length)
8
+ return false;
9
+ for (let i = 0; i < a.length; i++) {
10
+ if (a[i] !== b[i])
11
+ return false;
12
+ }
13
+ return true;
14
+ }
15
+ function stridesEqual(a, b) {
16
+ if (a.length !== b.length)
17
+ return false;
18
+ for (let i = 0; i < a.length; i++) {
19
+ if (a[i] !== b[i])
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ /**
25
+ * Pack a u32 params struct into an ArrayBuffer for a uniform buffer.
26
+ * All values are packed as u32; shape/stride arrays are zero-padded to MAX_DIMS.
27
+ */
28
+ function packU32(...values) {
29
+ const buf = new ArrayBuffer(values.length * 4);
30
+ const view = new Uint32Array(buf);
31
+ for (let i = 0; i < values.length; i++) {
32
+ view[i] = values[i];
33
+ }
34
+ return buf;
35
+ }
36
+ function padToMax(arr) {
37
+ const result = new Array(MAX_DIMS).fill(0);
38
+ for (let i = 0; i < arr.length; i++) {
39
+ result[i] = arr[i];
40
+ }
41
+ return result;
42
+ }
43
+ function destroyAll(...bufs) {
44
+ for (const b of bufs)
45
+ b.destroy();
46
+ }
47
+ // ---- _sumPractice ----
48
+ /**
49
+ * Practice sum kernel: given array of length `size`, produce ceil(size / WORKGROUP_SIZE)
50
+ * partial sums. Each workgroup sums WORKGROUP_SIZE contiguous elements using shared memory.
51
+ */
52
+ export async function _sumPractice(out, a, size) {
53
+ const device = await getDevice();
54
+ const numBlocks = Math.ceil(size / WORKGROUP_SIZE);
55
+ const shaderCode = buildSumPracticeShader();
56
+ const pipeline = getOrCreatePipeline(device, shaderCode);
57
+ const aBuf = uploadBuffer(device, a.subarray(0, size));
58
+ const outBuf = createOutputBuffer(device, numBlocks);
59
+ const paramBuf = createUniformBuffer(device, packU32(size));
60
+ const bindGroup = device.createBindGroup({
61
+ layout: pipeline.getBindGroupLayout(0),
62
+ entries: [
63
+ { binding: 0, resource: { buffer: aBuf } },
64
+ { binding: 1, resource: { buffer: outBuf } },
65
+ { binding: 2, resource: { buffer: paramBuf } },
66
+ ],
67
+ });
68
+ const encoder = device.createCommandEncoder();
69
+ const pass = encoder.beginComputePass();
70
+ pass.setPipeline(pipeline);
71
+ pass.setBindGroup(0, bindGroup);
72
+ pass.dispatchWorkgroups(numBlocks);
73
+ pass.end();
74
+ device.queue.submit([encoder.finish()]);
75
+ const result = await readbackBuffer(device, outBuf, numBlocks);
76
+ for (let i = 0; i < numBlocks; i++) {
77
+ out[i] = result[i];
78
+ }
79
+ destroyAll(aBuf, outBuf, paramBuf);
80
+ }
81
+ // ---- gpuTensorMap ----
82
+ /**
83
+ * GPU higher-order tensor map. fn must be a known operator from operators.ts.
84
+ */
85
+ export function gpuTensorMap(fn) {
86
+ const opName = resolveUnaryOp(fn);
87
+ const opBody = UNARY_OPS[opName];
88
+ return async (outStorage, outShape, outStrides, inStorage, inShape, inStrides) => {
89
+ const device = await getDevice();
90
+ const size = shapeProduct(outShape);
91
+ const aligned = shapesEqual(outShape, inShape) && stridesEqual(outStrides, inStrides);
92
+ let shaderCode;
93
+ let paramBuf;
94
+ if (aligned) {
95
+ shaderCode = buildAlignedMapShader(opBody);
96
+ paramBuf = createUniformBuffer(device, packU32(size));
97
+ }
98
+ else {
99
+ shaderCode = buildBroadcastMapShader(opBody);
100
+ paramBuf = createStorageParamsBuffer(device, packU32(size, outShape.length, inShape.length, 0, // padding
101
+ ...padToMax(outShape), ...padToMax(outStrides), ...padToMax(inShape), ...padToMax(inStrides)));
102
+ }
103
+ const pipeline = getOrCreatePipeline(device, shaderCode);
104
+ const inBuf = uploadBuffer(device, inStorage);
105
+ const outBuf = createOutputBuffer(device, size);
106
+ const bindGroup = device.createBindGroup({
107
+ layout: pipeline.getBindGroupLayout(0),
108
+ entries: [
109
+ { binding: 0, resource: { buffer: inBuf } },
110
+ { binding: 1, resource: { buffer: outBuf } },
111
+ { binding: 2, resource: { buffer: paramBuf } },
112
+ ],
113
+ });
114
+ const encoder = device.createCommandEncoder();
115
+ const pass = encoder.beginComputePass();
116
+ pass.setPipeline(pipeline);
117
+ pass.setBindGroup(0, bindGroup);
118
+ pass.dispatchWorkgroups(Math.ceil(size / WORKGROUP_SIZE));
119
+ pass.end();
120
+ device.queue.submit([encoder.finish()]);
121
+ const result = await readbackBuffer(device, outBuf, size);
122
+ for (let i = 0; i < size; i++) {
123
+ outStorage[i] = result[i];
124
+ }
125
+ destroyAll(inBuf, outBuf, paramBuf);
126
+ };
127
+ }
128
+ // ---- gpuTensorZip ----
129
+ /**
130
+ * GPU higher-order tensor zip (binary map). fn must be a known binary operator.
131
+ */
132
+ export function gpuTensorZip(fn) {
133
+ const opName = resolveBinaryOp(fn);
134
+ const opBody = BINARY_OPS[opName];
135
+ return async (outStorage, outShape, outStrides, aStorage, aShape, aStrides, bStorage, bShape, bStrides) => {
136
+ const device = await getDevice();
137
+ const size = shapeProduct(outShape);
138
+ const aligned = shapesEqual(outShape, aShape) &&
139
+ shapesEqual(outShape, bShape) &&
140
+ stridesEqual(outStrides, aStrides) &&
141
+ stridesEqual(outStrides, bStrides);
142
+ let shaderCode;
143
+ let paramBuf;
144
+ if (aligned) {
145
+ shaderCode = buildAlignedZipShader(opBody);
146
+ paramBuf = createUniformBuffer(device, packU32(size));
147
+ }
148
+ else {
149
+ shaderCode = buildBroadcastZipShader(opBody);
150
+ paramBuf = createStorageParamsBuffer(device, packU32(size, outShape.length, aShape.length, bShape.length, ...padToMax(outShape), ...padToMax(outStrides), ...padToMax(aShape), ...padToMax(aStrides), ...padToMax(bShape), ...padToMax(bStrides)));
151
+ }
152
+ const pipeline = getOrCreatePipeline(device, shaderCode);
153
+ const aBuf = uploadBuffer(device, aStorage);
154
+ const bBuf = uploadBuffer(device, bStorage);
155
+ const outBuf = createOutputBuffer(device, size);
156
+ const bindGroup = device.createBindGroup({
157
+ layout: pipeline.getBindGroupLayout(0),
158
+ entries: [
159
+ { binding: 0, resource: { buffer: aBuf } },
160
+ { binding: 1, resource: { buffer: bBuf } },
161
+ { binding: 2, resource: { buffer: outBuf } },
162
+ { binding: 3, resource: { buffer: paramBuf } },
163
+ ],
164
+ });
165
+ const encoder = device.createCommandEncoder();
166
+ const pass = encoder.beginComputePass();
167
+ pass.setPipeline(pipeline);
168
+ pass.setBindGroup(0, bindGroup);
169
+ pass.dispatchWorkgroups(Math.ceil(size / WORKGROUP_SIZE));
170
+ pass.end();
171
+ device.queue.submit([encoder.finish()]);
172
+ const result = await readbackBuffer(device, outBuf, size);
173
+ for (let i = 0; i < size; i++) {
174
+ outStorage[i] = result[i];
175
+ }
176
+ destroyAll(aBuf, bBuf, outBuf, paramBuf);
177
+ };
178
+ }
179
+ // ---- gpuTensorReduce ----
180
+ /**
181
+ * GPU higher-order tensor reduce. fn must be a known binary operator
182
+ * with an entry in REDUCE_IDENTITY.
183
+ * One workgroup per output element; threads cooperatively reduce
184
+ * the target dimension using shared memory tree reduction.
185
+ */
186
+ export function gpuTensorReduce(fn) {
187
+ const opName = resolveBinaryOp(fn);
188
+ const opBody = BINARY_OPS[opName];
189
+ const identity = REDUCE_IDENTITY[opName];
190
+ if (identity === undefined) {
191
+ throw new Error(`No reduce identity for op: ${opName}`);
192
+ }
193
+ return async (outStorage, outShape, outStrides, aStorage, aShape, aStrides, reduceDim) => {
194
+ const device = await getDevice();
195
+ const outSize = shapeProduct(outShape);
196
+ const reduceDimSize = aShape[reduceDim];
197
+ const reduceStride = aStrides[reduceDim];
198
+ const shaderCode = buildReduceShader(opBody, identity);
199
+ const pipeline = getOrCreatePipeline(device, shaderCode);
200
+ const paramBuf = createStorageParamsBuffer(device, packU32(outSize, outShape.length, aShape.length, reduceDim, reduceDimSize, reduceStride, 0, // _pad0
201
+ 0, // _pad1
202
+ ...padToMax(outShape), ...padToMax(outStrides), ...padToMax(aShape), ...padToMax(aStrides)));
203
+ const aBuf = uploadBuffer(device, aStorage);
204
+ const outBuf = createOutputBuffer(device, outSize);
205
+ const bindGroup = device.createBindGroup({
206
+ layout: pipeline.getBindGroupLayout(0),
207
+ entries: [
208
+ { binding: 0, resource: { buffer: aBuf } },
209
+ { binding: 1, resource: { buffer: outBuf } },
210
+ { binding: 2, resource: { buffer: paramBuf } },
211
+ ],
212
+ });
213
+ const encoder = device.createCommandEncoder();
214
+ const pass = encoder.beginComputePass();
215
+ pass.setPipeline(pipeline);
216
+ pass.setBindGroup(0, bindGroup);
217
+ pass.dispatchWorkgroups(outSize);
218
+ pass.end();
219
+ device.queue.submit([encoder.finish()]);
220
+ const result = await readbackBuffer(device, outBuf, outSize);
221
+ for (let i = 0; i < outSize; i++) {
222
+ outStorage[i] = result[i];
223
+ }
224
+ destroyAll(aBuf, outBuf, paramBuf);
225
+ };
226
+ }
227
+ // ---- gpuTensorMatrixMultiply ----
228
+ /**
229
+ * GPU tiled matrix multiplication with shared memory.
230
+ * Supports arbitrary broadcast batch dimensions as long as
231
+ * aShape[-1] === bShape[-2].
232
+ */
233
+ export async function gpuTensorMatrixMultiply(outStorage, outShape, outStrides, outSize, aStorage, aShape, aStrides, bStorage, bShape, bStrides) {
234
+ const device = await getDevice();
235
+ const aDims = aShape.length;
236
+ const bDims = bShape.length;
237
+ const M = aShape[aDims - 2];
238
+ const K = aShape[aDims - 1];
239
+ const N = bShape[bDims - 1];
240
+ let batchSize = 1;
241
+ for (let i = 0; i < outShape.length - 2; i++) {
242
+ batchSize *= outShape[i];
243
+ }
244
+ const shaderCode = buildMatMulShader();
245
+ const pipeline = getOrCreatePipeline(device, shaderCode);
246
+ const paramBuf = createStorageParamsBuffer(device, packU32(batchSize, M, N, K, outShape.length, aDims, bDims, 0, ...padToMax(outShape), ...padToMax(outStrides), ...padToMax(aShape), ...padToMax(aStrides), ...padToMax(bShape), ...padToMax(bStrides)));
247
+ const aBuf = uploadBuffer(device, aStorage);
248
+ const bBuf = uploadBuffer(device, bStorage);
249
+ const outBuf = createOutputBuffer(device, outSize);
250
+ const bindGroup = device.createBindGroup({
251
+ layout: pipeline.getBindGroupLayout(0),
252
+ entries: [
253
+ { binding: 0, resource: { buffer: aBuf } },
254
+ { binding: 1, resource: { buffer: bBuf } },
255
+ { binding: 2, resource: { buffer: outBuf } },
256
+ { binding: 3, resource: { buffer: paramBuf } },
257
+ ],
258
+ });
259
+ const encoder = device.createCommandEncoder();
260
+ const pass = encoder.beginComputePass();
261
+ pass.setPipeline(pipeline);
262
+ pass.setBindGroup(0, bindGroup);
263
+ pass.dispatchWorkgroups(Math.ceil(N / BLOCK_SIZE), Math.ceil(M / BLOCK_SIZE), batchSize);
264
+ pass.end();
265
+ device.queue.submit([encoder.finish()]);
266
+ const result = await readbackBuffer(device, outBuf, outSize);
267
+ for (let i = 0; i < outSize; i++) {
268
+ outStorage[i] = result[i];
269
+ }
270
+ destroyAll(aBuf, bBuf, outBuf, paramBuf);
271
+ }
272
+ // ---- gpuTensorMatrixMultiplyTensorCore ----
273
+ function isContiguous(shape, strides) {
274
+ const natural = computeStrides(shape);
275
+ for (let i = 0; i < shape.length; i++) {
276
+ if (strides[i] !== natural[i])
277
+ return false;
278
+ }
279
+ return true;
280
+ }
281
+ function batchShapesEqual(a, b) {
282
+ const aBatch = a.slice(0, -2);
283
+ const bBatch = b.slice(0, -2);
284
+ return shapesEqual(aBatch, bBatch);
285
+ }
286
+ let _tcPipeline = null;
287
+ let _tcPipelineSubgroupSize = 0;
288
+ /**
289
+ * Experimental tensor-core-accelerated matrix multiply.
290
+ *
291
+ * Uses the Dawn `chromium_experimental_subgroup_matrix` extension which maps
292
+ * to Apple simdgroup_matrix (8x8 f32) on Metal and VK_KHR_cooperative_matrix
293
+ * on Vulkan. Returns true if the fast path executed, false if a precondition
294
+ * was not met and the caller should fall back to `gpuTensorMatrixMultiply`.
295
+ *
296
+ * Preconditions (returns false when any is violated):
297
+ * - Tensor core device available (hardware + experimental feature)
298
+ * - All tensors contiguous (natural row-major strides)
299
+ * - M, N, K all divisible by 8
300
+ * - Batch dimensions of A and B identical (no broadcasting)
301
+ */
302
+ export async function gpuTensorMatrixMultiplyTensorCore(outStorage, outShape, outStrides, outSize, aStorage, aShape, aStrides, bStorage, bShape, bStrides) {
303
+ const aDims = aShape.length;
304
+ const bDims = bShape.length;
305
+ const M = aShape[aDims - 2];
306
+ const K = aShape[aDims - 1];
307
+ const N = bShape[bDims - 1];
308
+ if (M % TC_TILE !== 0 || N % TC_TILE !== 0 || K % TC_TILE !== 0)
309
+ return false;
310
+ if (!isContiguous(aShape, aStrides) || !isContiguous(bShape, bStrides))
311
+ return false;
312
+ if (!isContiguous(outShape, outStrides))
313
+ return false;
314
+ if (!batchShapesEqual(aShape, bShape))
315
+ return false;
316
+ const device = await getTensorCoreDevice();
317
+ if (!device)
318
+ return false;
319
+ let batchSize = 1;
320
+ for (let i = 0; i < outShape.length - 2; i++) {
321
+ batchSize *= outShape[i];
322
+ }
323
+ // Query maxSubgroupSize from the device (exposed when subgroups feature is active)
324
+ const maxSubgroupSize = device.limits['maxSubgroupSize'] ?? 64;
325
+ try {
326
+ if (!_tcPipeline || _tcPipelineSubgroupSize !== maxSubgroupSize) {
327
+ const shaderCode = buildTensorCoreMatMulShader(maxSubgroupSize);
328
+ _tcPipeline = getOrCreatePipeline(device, shaderCode);
329
+ _tcPipelineSubgroupSize = maxSubgroupSize;
330
+ }
331
+ const pipeline = _tcPipeline;
332
+ const paramBuf = createUniformBuffer(device, packU32(batchSize, M, N, K));
333
+ const aBuf = uploadBuffer(device, aStorage);
334
+ const bBuf = uploadBuffer(device, bStorage);
335
+ const outBuf = createOutputBuffer(device, outSize);
336
+ const bindGroup = device.createBindGroup({
337
+ layout: pipeline.getBindGroupLayout(0),
338
+ entries: [
339
+ { binding: 0, resource: { buffer: aBuf } },
340
+ { binding: 1, resource: { buffer: bBuf } },
341
+ { binding: 2, resource: { buffer: outBuf } },
342
+ { binding: 3, resource: { buffer: paramBuf } },
343
+ ],
344
+ });
345
+ const encoder = device.createCommandEncoder();
346
+ const pass = encoder.beginComputePass();
347
+ pass.setPipeline(pipeline);
348
+ pass.setBindGroup(0, bindGroup);
349
+ pass.dispatchWorkgroups(N / TC_TILE, M / TC_TILE, batchSize);
350
+ pass.end();
351
+ device.queue.submit([encoder.finish()]);
352
+ const result = await readbackBuffer(device, outBuf, outSize);
353
+ for (let i = 0; i < outSize; i++) {
354
+ outStorage[i] = result[i];
355
+ }
356
+ destroyAll(aBuf, bBuf, outBuf, paramBuf);
357
+ return true;
358
+ }
359
+ catch {
360
+ _tcPipeline = null;
361
+ _tcPipelineSubgroupSize = 0;
362
+ return false;
363
+ }
364
+ }
365
+ //# sourceMappingURL=gpu_ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu_ops.js","sourceRoot":"","sources":["../src/gpu_ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export * from "./autodiff.js";
2
+ export * from "./operators.js";
3
+ export * from "./scalar.js";
4
+ export * from "./scalar_functions.js";
5
+ export * from "./datasets.js";
6
+ export * from "./optimizer.js";
7
+ export * from "./module.js";
8
+ export { Tensor, type TensorLike } from "./tensor.js";
9
+ export { TensorData, IndexingError, type Shape, type Strides, type Index, type OutIndex, type Storage, indexToPosition, toIndex, shapeProduct, strides, shapeBroadcast, broadcastIndex } from "./tensor_data.js";
10
+ export { TensorContext, TensorHistory, TensorFunction, Neg as TensorNeg, Sigmoid as TensorSigmoid, ReLU as TensorReLU, Log as TensorLog, Exp as TensorExp, Inv as TensorInv, Add as TensorAdd, Mul as TensorMul, LT as TensorLT, EQ as TensorEQ, Sum as TensorSum, Permute as TensorPermute, View as TensorView, Contiguous as TensorContiguous, MatMul as TensorMatMul, Conv1d as TensorConv1d, Conv2d as TensorConv2d } from "./tensor_functions.js";
11
+ export * as tensorFunctions from "./tensor_functions.js";
12
+ export { tensorMap, tensorZip, tensorReduce, tensorConv1d, tensorConv2d } from "./tensor_ops.js";
13
+ export { fastTensorMap, fastTensorZip, fastTensorReduce, destroyPool } from "./fast_ops.js";
14
+ export { Linear, ReLU, Sigmoid as SigmoidModule, Tanh, Conv1d as Conv1dModule, Conv2d as Conv2dModule, Embedding, mseLoss, crossEntropyLoss, randRange, tile, avgpool2d, maxpool2d, softmax, logsoftmax, dropout } from "./nn.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AAGtC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjN,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvb,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ // Core autodiff and operators
2
+ export * from "./autodiff.js";
3
+ export * from "./operators.js";
4
+ // Scalar module
5
+ export * from "./scalar.js";
6
+ export * from "./scalar_functions.js";
7
+ // Data & training
8
+ export * from "./datasets.js";
9
+ export * from "./optimizer.js";
10
+ export * from "./module.js";
11
+ // Tensor module
12
+ export { Tensor } from "./tensor.js";
13
+ export { TensorData, IndexingError, indexToPosition, toIndex, shapeProduct, strides, shapeBroadcast, broadcastIndex } from "./tensor_data.js";
14
+ export { TensorContext, TensorHistory, TensorFunction, Neg as TensorNeg, Sigmoid as TensorSigmoid, ReLU as TensorReLU, Log as TensorLog, Exp as TensorExp, Inv as TensorInv, Add as TensorAdd, Mul as TensorMul, LT as TensorLT, EQ as TensorEQ, Sum as TensorSum, Permute as TensorPermute, View as TensorView, Contiguous as TensorContiguous, MatMul as TensorMatMul, Conv1d as TensorConv1d, Conv2d as TensorConv2d } from "./tensor_functions.js";
15
+ export * as tensorFunctions from "./tensor_functions.js";
16
+ export { tensorMap, tensorZip, tensorReduce, tensorConv1d, tensorConv2d } from "./tensor_ops.js";
17
+ export { fastTensorMap, fastTensorZip, fastTensorReduce, destroyPool } from "./fast_ops.js";
18
+ // Neural network layers and functions
19
+ export { Linear, ReLU, Sigmoid as SigmoidModule, Tanh, Conv1d as Conv1dModule, Conv2d as Conv2dModule, Embedding, mseLoss, crossEntropyLoss, randRange, tile, avgpool2d, maxpool2d, softmax, logsoftmax, dropout } from "./nn.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AAEtC,kBAAkB;AAClB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAE5B,gBAAgB;AAChB,OAAO,EAAE,MAAM,EAAmB,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjN,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvb,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5F,sCAAsC;AACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Tensor } from "./tensor.js";
2
+ export declare class Module<P extends BaseParameter = BaseParameter> {
3
+ protected _modules: Record<string, Module<P>>;
4
+ protected _parameters: Record<string, P>;
5
+ training: boolean;
6
+ constructor();
7
+ parameters(): P[];
8
+ namedParameters(): Array<[string, P]>;
9
+ modules(): Module<P>[];
10
+ children(): Module<P>[];
11
+ train(): void;
12
+ eval(): void;
13
+ }
14
+ export declare abstract class BaseParameter {
15
+ name?: string | undefined;
16
+ }
17
+ export declare class Parameter<T = Tensor> extends BaseParameter {
18
+ value: T;
19
+ constructor(value: T, name?: string);
20
+ get grad(): number | Tensor | null;
21
+ update(v: T): void;
22
+ }
23
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,qBAAa,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACvD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAM;IACnD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAM;IAC9C,QAAQ,EAAE,OAAO,CAAQ;;IAiBzB,UAAU,IAAI,CAAC,EAAE;IAcjB,eAAe,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAYrC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;IAQtB,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;IAIvB,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;CAMf;AAGD,8BAAsB,aAAa;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,qBAAa,SAAS,CAAC,CAAC,GAAC,MAAM,CAAE,SAAQ,aAAa;IAClD,KAAK,EAAE,CAAC,CAAC;gBAEG,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM;IASnC,IAAI,IAAI,2BAQP;IAED,MAAM,CAAC,CAAC,EAAE,CAAC;CAGd"}
package/dist/module.js ADDED
@@ -0,0 +1,97 @@
1
+ /*
2
+ Modules form a tree that store parameters and other
3
+ submodules. They make up the basis of neural network stacks.
4
+
5
+ Attributes:
6
+ modules : Storage of the child modules
7
+ parameters : Storage of the module's parameters
8
+ training : Whether the module is in training mode or evaluation mode
9
+ */
10
+ import { Tensor } from "./tensor.js";
11
+ import { Scalar } from "./scalar.js";
12
+ export class Module {
13
+ _modules = {};
14
+ _parameters = {};
15
+ training = true;
16
+ constructor() {
17
+ return new Proxy(this, {
18
+ set: (target, key, value, receiver) => {
19
+ if (value instanceof Module) {
20
+ target._modules[key] = value;
21
+ }
22
+ else if (value instanceof BaseParameter) {
23
+ target._parameters[key] = value;
24
+ }
25
+ return Reflect.set(target, key, value, receiver);
26
+ }
27
+ });
28
+ }
29
+ parameters() {
30
+ let params = [];
31
+ for (const p of Object.values(this._parameters)) {
32
+ params.push(p);
33
+ }
34
+ for (const m of Object.values(this._modules)) {
35
+ params.push(...m.parameters());
36
+ }
37
+ return params;
38
+ }
39
+ namedParameters() {
40
+ const named = Object.entries(this._parameters);
41
+ for (const [moduleName, module] of Object.entries(this._modules)) {
42
+ for (const [name, param] of module.namedParameters()) {
43
+ named.push([`${moduleName}.${name}`, param]);
44
+ }
45
+ }
46
+ return named;
47
+ }
48
+ modules() {
49
+ const all = [this];
50
+ for (const child of this.children()) {
51
+ all.push(...child.modules());
52
+ }
53
+ return all;
54
+ }
55
+ children() {
56
+ return Object.values(this._modules);
57
+ }
58
+ train() {
59
+ this.training = true;
60
+ for (const module of this.children()) {
61
+ module.train();
62
+ }
63
+ }
64
+ eval() {
65
+ this.training = false;
66
+ for (const module of this.children()) {
67
+ module.eval();
68
+ }
69
+ }
70
+ }
71
+ // Non-generic base class to type Parameter class yet not Module class
72
+ export class BaseParameter {
73
+ name;
74
+ }
75
+ export class Parameter extends BaseParameter {
76
+ value;
77
+ constructor(value, name) {
78
+ super();
79
+ this.value = value;
80
+ if (name) {
81
+ this.name = name;
82
+ }
83
+ }
84
+ get grad() {
85
+ if (this.value instanceof Scalar) {
86
+ return this.value.derivative ?? 0;
87
+ }
88
+ if (this.value instanceof Tensor) {
89
+ return this.value.grad;
90
+ }
91
+ return 0;
92
+ }
93
+ update(v) {
94
+ this.value = v;
95
+ }
96
+ }
97
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
package/dist/nn.d.ts ADDED
@@ -0,0 +1,63 @@
1
+ import { Tensor } from "./tensor.js";
2
+ import { type Shape } from "./tensor_data.js";
3
+ import { Module, Parameter } from "./module.js";
4
+ export declare class Linear extends Module {
5
+ weight: Parameter<Tensor>;
6
+ bias: Parameter<Tensor>;
7
+ inFeatures: number;
8
+ outFeatures: number;
9
+ constructor(inFeatures: number, outFeatures: number);
10
+ forward(input: Tensor): Tensor;
11
+ }
12
+ export declare class ReLU extends Module {
13
+ forward(input: Tensor): Tensor;
14
+ }
15
+ export declare class Sigmoid extends Module {
16
+ forward(input: Tensor): Tensor;
17
+ }
18
+ export declare class Tanh extends Module {
19
+ forward(input: Tensor): Tensor;
20
+ }
21
+ export declare class Conv1d extends Module {
22
+ weight: Parameter<Tensor>;
23
+ inChannels: number;
24
+ outChannels: number;
25
+ kernelWidth: number;
26
+ constructor(inChannels: number, outChannels: number, kernelWidth: number);
27
+ forward(input: Tensor): Tensor;
28
+ }
29
+ export declare class Conv2d extends Module {
30
+ weight: Parameter<Tensor>;
31
+ inChannels: number;
32
+ outChannels: number;
33
+ kernelHeight: number;
34
+ kernelWidth: number;
35
+ constructor(inChannels: number, outChannels: number, kernelSize: [number, number]);
36
+ forward(input: Tensor): Tensor;
37
+ }
38
+ export declare class Embedding extends Module {
39
+ weight: Parameter<Tensor>;
40
+ numEmbeddings: number;
41
+ embeddingDim: number;
42
+ constructor(numEmbeddings: number, embeddingDim: number, weights?: Tensor);
43
+ static fromPretrained(weights: Tensor): Embedding;
44
+ forward(indices: number[][]): Tensor;
45
+ }
46
+ export declare function mseLoss(input: Tensor, target: Tensor): Tensor;
47
+ export declare function crossEntropyLoss(input: Tensor, target: Tensor): Tensor;
48
+ export declare function randRange(shape: Shape, low: number, high: number): Tensor;
49
+ /**
50
+ * Reshape an image tensor for 2D pooling.
51
+ *
52
+ * input: batch x channel x height x width
53
+ * kernel: [kh, kw]
54
+ * returns: tensor of shape [batch, channel, newHeight, newWidth, kh*kw],
55
+ * plus the newHeight and newWidth values.
56
+ */
57
+ export declare function tile(input: Tensor, kernel: [number, number]): [Tensor, number, number];
58
+ export declare function avgpool2d(input: Tensor, kernel: [number, number]): Tensor;
59
+ export declare function maxpool2d(input: Tensor, kernel: [number, number]): Tensor;
60
+ export declare function softmax(input: Tensor, dim: number): Tensor;
61
+ export declare function logsoftmax(input: Tensor, dim: number): Tensor;
62
+ export declare function dropout(input: Tensor, rate?: number, ignore?: boolean): Tensor;
63
+ //# sourceMappingURL=nn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nn.d.ts","sourceRoot":"","sources":["../src/nn.ts"],"names":[],"mappings":"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"}