@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.
- package/dist/autodiff.d.ts +13 -0
- package/dist/autodiff.d.ts.map +1 -0
- package/dist/autodiff.js +91 -0
- package/dist/autodiff.js.map +1 -0
- package/dist/datasets.d.ts +16 -0
- package/dist/datasets.d.ts.map +1 -0
- package/dist/datasets.js +64 -0
- package/dist/datasets.js.map +1 -0
- package/dist/fast_ops.d.ts +23 -0
- package/dist/fast_ops.d.ts.map +1 -0
- package/dist/fast_ops.js +263 -0
- package/dist/fast_ops.js.map +1 -0
- package/dist/fast_ops_worker.d.ts +2 -0
- package/dist/fast_ops_worker.d.ts.map +1 -0
- package/dist/fast_ops_worker.js +119 -0
- package/dist/fast_ops_worker.js.map +1 -0
- package/dist/gpu_backend.d.ts +37 -0
- package/dist/gpu_backend.d.ts.map +1 -0
- package/dist/gpu_backend.js +163 -0
- package/dist/gpu_backend.js.map +1 -0
- package/dist/gpu_kernels.d.ts +74 -0
- package/dist/gpu_kernels.d.ts.map +1 -0
- package/dist/gpu_kernels.js +571 -0
- package/dist/gpu_kernels.js.map +1 -0
- package/dist/gpu_ops.d.ts +43 -0
- package/dist/gpu_ops.d.ts.map +1 -0
- package/dist/gpu_ops.js +365 -0
- package/dist/gpu_ops.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +23 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +97 -0
- package/dist/module.js.map +1 -0
- package/dist/nn.d.ts +63 -0
- package/dist/nn.d.ts.map +1 -0
- package/dist/nn.js +234 -0
- package/dist/nn.js.map +1 -0
- package/dist/operators.d.ts +29 -0
- package/dist/operators.d.ts.map +1 -0
- package/dist/operators.js +91 -0
- package/dist/operators.js.map +1 -0
- package/dist/optimizer.d.ts +15 -0
- package/dist/optimizer.d.ts.map +1 -0
- package/dist/optimizer.js +62 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/scalar.d.ts +42 -0
- package/dist/scalar.d.ts.map +1 -0
- package/dist/scalar.js +126 -0
- package/dist/scalar.js.map +1 -0
- package/dist/scalar_functions.d.ts +62 -0
- package/dist/scalar_functions.d.ts.map +1 -0
- package/dist/scalar_functions.js +127 -0
- package/dist/scalar_functions.js.map +1 -0
- package/dist/tensor.d.ts +58 -0
- package/dist/tensor.d.ts.map +1 -0
- package/dist/tensor.js +288 -0
- package/dist/tensor.js.map +1 -0
- package/dist/tensor_data.d.ts +29 -0
- package/dist/tensor_data.d.ts.map +1 -0
- package/dist/tensor_data.js +131 -0
- package/dist/tensor_data.js.map +1 -0
- package/dist/tensor_functions.d.ts +97 -0
- package/dist/tensor_functions.d.ts.map +1 -0
- package/dist/tensor_functions.js +465 -0
- package/dist/tensor_functions.js.map +1 -0
- package/dist/tensor_ops.d.ts +47 -0
- package/dist/tensor_ops.d.ts.map +1 -0
- package/dist/tensor_ops.js +249 -0
- package/dist/tensor_ops.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { indexToPosition, toIndex, shapeProduct, broadcastIndex } from './tensor_data.js';
|
|
2
|
+
import { Tensor } from './tensor.js';
|
|
3
|
+
import { shapeBroadcast } from './tensor_data.js';
|
|
4
|
+
export function tensorMap(fn) {
|
|
5
|
+
return (outStorage, outShape, outStrides, inStorage, inShape, inStrides) => {
|
|
6
|
+
const size = shapeProduct(outShape);
|
|
7
|
+
const outIndex = new Array(outShape.length).fill(0);
|
|
8
|
+
const inIndex = new Array(inShape.length).fill(0);
|
|
9
|
+
for (let ordinal = 0; ordinal < size; ordinal++) {
|
|
10
|
+
toIndex(ordinal, outShape, outIndex);
|
|
11
|
+
broadcastIndex(outIndex, outShape, inShape, inIndex);
|
|
12
|
+
const inPos = indexToPosition(inIndex, inStrides);
|
|
13
|
+
const outPos = indexToPosition(outIndex, outStrides);
|
|
14
|
+
outStorage[outPos] = fn(inStorage[inPos]);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function tensorZip(fn) {
|
|
19
|
+
return (outStorage, outShape, outStrides, aStorage, aShape, aStrides, bStorage, bShape, bStrides) => {
|
|
20
|
+
const size = shapeProduct(outShape);
|
|
21
|
+
const outIndex = new Array(outShape.length).fill(0);
|
|
22
|
+
const aIndex = new Array(aShape.length).fill(0);
|
|
23
|
+
const bIndex = new Array(bShape.length).fill(0);
|
|
24
|
+
for (let ordinal = 0; ordinal < size; ordinal++) {
|
|
25
|
+
toIndex(ordinal, outShape, outIndex);
|
|
26
|
+
broadcastIndex(outIndex, outShape, aShape, aIndex);
|
|
27
|
+
broadcastIndex(outIndex, outShape, bShape, bIndex);
|
|
28
|
+
const aPos = indexToPosition(aIndex, aStrides);
|
|
29
|
+
const bPos = indexToPosition(bIndex, bStrides);
|
|
30
|
+
const outPos = indexToPosition(outIndex, outStrides);
|
|
31
|
+
outStorage[outPos] = fn(aStorage[aPos], bStorage[bPos]);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function tensorReduce(fn) {
|
|
36
|
+
return (outStorage, outShape, outStrides, aStorage, aShape, aStrides, reduceDim) => {
|
|
37
|
+
const outSize = shapeProduct(outShape);
|
|
38
|
+
const reduceDimSize = aShape[reduceDim];
|
|
39
|
+
const outIndex = new Array(outShape.length).fill(0);
|
|
40
|
+
const aIndex = new Array(aShape.length).fill(0);
|
|
41
|
+
for (let ordinal = 0; ordinal < outSize; ordinal++) {
|
|
42
|
+
toIndex(ordinal, outShape, outIndex);
|
|
43
|
+
for (let i = 0; i < outShape.length; i++) {
|
|
44
|
+
aIndex[i] = outIndex[i];
|
|
45
|
+
}
|
|
46
|
+
const outPos = indexToPosition(outIndex, outStrides);
|
|
47
|
+
aIndex[reduceDim] = 0;
|
|
48
|
+
let acc = aStorage[indexToPosition(aIndex, aStrides)];
|
|
49
|
+
for (let j = 1; j < reduceDimSize; j++) {
|
|
50
|
+
aIndex[reduceDim] = j;
|
|
51
|
+
const aPos = indexToPosition(aIndex, aStrides);
|
|
52
|
+
acc = fn(acc, aStorage[aPos]);
|
|
53
|
+
}
|
|
54
|
+
outStorage[outPos] = acc;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Matrix multiply supporting 2D and 3D inputs with batch broadcasting.
|
|
60
|
+
* 2D inputs are padded to 3D internally; if both were 2D the output is squeezed back.
|
|
61
|
+
*/
|
|
62
|
+
export function tensorMatrixMultiply(A, B) {
|
|
63
|
+
// Index from end of tensor shape, such that length - 2 is rows, length -1 is cols
|
|
64
|
+
const [M, K] = [A.shape[A.shape.length - 2], A.shape[A.shape.length - 1]];
|
|
65
|
+
const [K2, N] = [B.shape[B.shape.length - 2], B.shape[B.shape.length - 1]];
|
|
66
|
+
if (!M || !K || !K2 || !N) {
|
|
67
|
+
return A;
|
|
68
|
+
}
|
|
69
|
+
if (K !== K2) {
|
|
70
|
+
throw new Error("A is of shape MxK. Expected B of shape K2xN");
|
|
71
|
+
}
|
|
72
|
+
let a = A;
|
|
73
|
+
let b = B;
|
|
74
|
+
// Make these always be exactly a 3 dimensional multiply, so the kernel only ever needs to deal with one batch loop + the 2D multiply
|
|
75
|
+
let Ais2D = false;
|
|
76
|
+
let Bis2D = false;
|
|
77
|
+
if (A.data.shape.length === 2) {
|
|
78
|
+
a = A.contiguous().view(1, M, K);
|
|
79
|
+
Ais2D = true;
|
|
80
|
+
}
|
|
81
|
+
if (B.data.shape.length === 2) {
|
|
82
|
+
b = B.contiguous().view(1, K2, N);
|
|
83
|
+
Bis2D = true;
|
|
84
|
+
}
|
|
85
|
+
// If both A and B had to be converted from 2D -> 3D, then we must remove a dimension at the end. Else it will simply just disappear as per mat mult
|
|
86
|
+
const both2D = Ais2D && Bis2D;
|
|
87
|
+
// Get resulting dimensions as array
|
|
88
|
+
const outShape = [...shapeBroadcast(a.shape.slice(0, -2), b.shape.slice(0, -2))];
|
|
89
|
+
outShape.push(M);
|
|
90
|
+
outShape.push(N);
|
|
91
|
+
let out = Tensor.zeros(outShape);
|
|
92
|
+
const size = shapeProduct(outShape);
|
|
93
|
+
const outIndex = new Array(outShape.length).fill(0);
|
|
94
|
+
const aIndex = new Array(a.shape.length).fill(0);
|
|
95
|
+
const bIndex = new Array(b.shape.length).fill(0);
|
|
96
|
+
for (let ordinal = 0; ordinal < size; ordinal++) {
|
|
97
|
+
toIndex(ordinal, outShape, outIndex);
|
|
98
|
+
broadcastIndex(outIndex, outShape, a.shape, aIndex);
|
|
99
|
+
broadcastIndex(outIndex, outShape, b.shape, bIndex);
|
|
100
|
+
let acc = 0;
|
|
101
|
+
for (let k = 0; k < K; k++) {
|
|
102
|
+
aIndex[aIndex.length - 1] = k; // K dim in A
|
|
103
|
+
bIndex[bIndex.length - 2] = k; // K dim in B
|
|
104
|
+
acc += a.get(aIndex) * b.get(bIndex);
|
|
105
|
+
}
|
|
106
|
+
out.set(outIndex, acc);
|
|
107
|
+
}
|
|
108
|
+
// Revert extra 3rd dimension
|
|
109
|
+
if (both2D) {
|
|
110
|
+
out = out.view(M, N);
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Low-level 1D convolution kernel operating on raw Storage/Shape/Strides.
|
|
116
|
+
*
|
|
117
|
+
* Input shape: [batch, in_channels, width]
|
|
118
|
+
* Weight shape: [out_channels, in_channels, kernel_width]
|
|
119
|
+
* Output shape: [batch, out_channels, out_width] (caller pre-allocates)
|
|
120
|
+
*
|
|
121
|
+
* When reverse=false: output[b,oc,t] = sum_{ic,k} input[b,ic,t+k] * weight[oc,ic,k]
|
|
122
|
+
* When reverse=true: output[b,oc,t] = sum_{ic,k} input[b,ic,t-k] * weight[oc,ic,k]
|
|
123
|
+
*
|
|
124
|
+
* Out-of-bounds input positions are treated as 0.
|
|
125
|
+
*/
|
|
126
|
+
export function _tensorConv1d(outStorage, outShape, outStrides, inputStorage, inputShape, inputStrides, weightStorage, weightShape, weightStrides, reverse) {
|
|
127
|
+
const outSize = shapeProduct(outShape);
|
|
128
|
+
const inChannels = inputShape[1];
|
|
129
|
+
const width = inputShape[2];
|
|
130
|
+
const kw = weightShape[2];
|
|
131
|
+
const outIndex = [0, 0, 0];
|
|
132
|
+
const inputIndex = [0, 0, 0];
|
|
133
|
+
const weightIndex = [0, 0, 0];
|
|
134
|
+
for (let ordinal = 0; ordinal < outSize; ordinal++) {
|
|
135
|
+
toIndex(ordinal, outShape, outIndex);
|
|
136
|
+
const b = outIndex[0];
|
|
137
|
+
const oc = outIndex[1];
|
|
138
|
+
const t = outIndex[2];
|
|
139
|
+
let val = 0;
|
|
140
|
+
for (let ic = 0; ic < inChannels; ic++) {
|
|
141
|
+
for (let k = 0; k < kw; k++) {
|
|
142
|
+
const s = reverse ? t - k : t + k;
|
|
143
|
+
if (s >= 0 && s < width) {
|
|
144
|
+
inputIndex[0] = b;
|
|
145
|
+
inputIndex[1] = ic;
|
|
146
|
+
inputIndex[2] = s;
|
|
147
|
+
weightIndex[0] = oc;
|
|
148
|
+
weightIndex[1] = ic;
|
|
149
|
+
weightIndex[2] = k;
|
|
150
|
+
val += inputStorage[indexToPosition(inputIndex, inputStrides)]
|
|
151
|
+
* weightStorage[indexToPosition(weightIndex, weightStrides)];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
outStorage[indexToPosition(outIndex, outStrides)] = val;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 1D convolution: input [batch, in_channels, width] x weight [out_channels, in_channels, kw]
|
|
160
|
+
* -> output [batch, out_channels, width].
|
|
161
|
+
*/
|
|
162
|
+
export function tensorConv1d(input, weight, reverse = false) {
|
|
163
|
+
const batch = input.shape[0];
|
|
164
|
+
const inChannels = input.shape[1];
|
|
165
|
+
const width = input.shape[2];
|
|
166
|
+
const outChannels = weight.shape[0];
|
|
167
|
+
const weightInChannels = weight.shape[1];
|
|
168
|
+
if (inChannels !== weightInChannels) {
|
|
169
|
+
throw new Error(`Conv1d channel mismatch: input has ${inChannels} channels but weight expects ${weightInChannels}`);
|
|
170
|
+
}
|
|
171
|
+
const outShape = [batch, outChannels, width];
|
|
172
|
+
const out = Tensor.zeros(outShape);
|
|
173
|
+
_tensorConv1d(out.data.storage, out.data.shape, out.data.strides, input.data.storage, input.data.shape, input.data.strides, weight.data.storage, weight.data.shape, weight.data.strides, reverse);
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Low-level 2D convolution kernel operating on raw Storage/Shape/Strides.
|
|
178
|
+
*
|
|
179
|
+
* Input shape: [batch, in_channels, height, width]
|
|
180
|
+
* Weight shape: [out_channels, in_channels, kH, kW]
|
|
181
|
+
* Output shape: [batch, out_channels, out_height, out_width] (caller pre-allocates)
|
|
182
|
+
*
|
|
183
|
+
* When reverse=false: output[b,oc,h,w] = sum_{ic,kh,kw} input[b,ic,h+kh,w+kw] * weight[oc,ic,kh,kw]
|
|
184
|
+
* When reverse=true: output[b,oc,h,w] = sum_{ic,kh,kw} input[b,ic,h-kh,w-kw] * weight[oc,ic,kh,kw]
|
|
185
|
+
*
|
|
186
|
+
* Out-of-bounds input positions are treated as 0.
|
|
187
|
+
*/
|
|
188
|
+
export function _tensorConv2d(outStorage, outShape, outStrides, inputStorage, inputShape, inputStrides, weightStorage, weightShape, weightStrides, reverse) {
|
|
189
|
+
const outSize = shapeProduct(outShape);
|
|
190
|
+
const inChannels = inputShape[1];
|
|
191
|
+
const height = inputShape[2];
|
|
192
|
+
const width = inputShape[3];
|
|
193
|
+
const kH = weightShape[2];
|
|
194
|
+
const kW = weightShape[3];
|
|
195
|
+
const outIndex = [0, 0, 0, 0];
|
|
196
|
+
const inputIndex = [0, 0, 0, 0];
|
|
197
|
+
const weightIndex = [0, 0, 0, 0];
|
|
198
|
+
for (let ordinal = 0; ordinal < outSize; ordinal++) {
|
|
199
|
+
toIndex(ordinal, outShape, outIndex);
|
|
200
|
+
const b = outIndex[0];
|
|
201
|
+
const oc = outIndex[1];
|
|
202
|
+
const h = outIndex[2];
|
|
203
|
+
const w = outIndex[3];
|
|
204
|
+
let val = 0;
|
|
205
|
+
for (let ic = 0; ic < inChannels; ic++) {
|
|
206
|
+
for (let kh = 0; kh < kH; kh++) {
|
|
207
|
+
const sh = reverse ? h - kh : h + kh;
|
|
208
|
+
if (sh < 0 || sh >= height)
|
|
209
|
+
continue;
|
|
210
|
+
for (let kw = 0; kw < kW; kw++) {
|
|
211
|
+
const sw = reverse ? w - kw : w + kw;
|
|
212
|
+
if (sw >= 0 && sw < width) {
|
|
213
|
+
inputIndex[0] = b;
|
|
214
|
+
inputIndex[1] = ic;
|
|
215
|
+
inputIndex[2] = sh;
|
|
216
|
+
inputIndex[3] = sw;
|
|
217
|
+
weightIndex[0] = oc;
|
|
218
|
+
weightIndex[1] = ic;
|
|
219
|
+
weightIndex[2] = kh;
|
|
220
|
+
weightIndex[3] = kw;
|
|
221
|
+
val += inputStorage[indexToPosition(inputIndex, inputStrides)]
|
|
222
|
+
* weightStorage[indexToPosition(weightIndex, weightStrides)];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
outStorage[indexToPosition(outIndex, outStrides)] = val;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 2D convolution: input [batch, in_channels, height, width] x weight [out_channels, in_channels, kH, kW]
|
|
232
|
+
* -> output [batch, out_channels, height, width].
|
|
233
|
+
*/
|
|
234
|
+
export function tensorConv2d(input, weight, reverse = false) {
|
|
235
|
+
const batch = input.shape[0];
|
|
236
|
+
const inChannels = input.shape[1];
|
|
237
|
+
const height = input.shape[2];
|
|
238
|
+
const width = input.shape[3];
|
|
239
|
+
const outChannels = weight.shape[0];
|
|
240
|
+
const weightInChannels = weight.shape[1];
|
|
241
|
+
if (inChannels !== weightInChannels) {
|
|
242
|
+
throw new Error(`Conv2d channel mismatch: input has ${inChannels} channels but weight expects ${weightInChannels}`);
|
|
243
|
+
}
|
|
244
|
+
const outShape = [batch, outChannels, height, width];
|
|
245
|
+
const out = Tensor.zeros(outShape);
|
|
246
|
+
_tensorConv2d(out.data.storage, out.data.shape, out.data.strides, input.data.storage, input.data.shape, input.data.strides, weight.data.storage, weight.data.shape, weight.data.strides, reverse);
|
|
247
|
+
return out;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=tensor_ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tensor_ops.js","sourceRoot":"","sources":["../src/tensor_ops.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mni-ml/framework",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"description": "A minimal machine learning library in TypeScript — autograd, tensors, neural network modules, and training utilities inspired by minitorch.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/r-chong/TSTorch.git",
|
|
10
|
+
"directory": "packages/framework"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"machine-learning",
|
|
14
|
+
"autograd",
|
|
15
|
+
"tensor",
|
|
16
|
+
"neural-network",
|
|
17
|
+
"deep-learning",
|
|
18
|
+
"typescript"
|
|
19
|
+
],
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@fast-check/jest": "^2.1.1",
|
|
31
|
+
"@jest/globals": "^30.2.0",
|
|
32
|
+
"@types/jest": "^30.0.0",
|
|
33
|
+
"@types/node": "^25.0.8",
|
|
34
|
+
"jest": "^30.2.0",
|
|
35
|
+
"ts-jest": "^29.4.6",
|
|
36
|
+
"typescript": "^5.9.3"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
40
|
+
"build": "tsc"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"webgpu": "^0.3.8"
|
|
44
|
+
}
|
|
45
|
+
}
|