@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
package/dist/nn.js ADDED
@@ -0,0 +1,234 @@
1
+ import { Tensor } from "./tensor.js";
2
+ import { TensorData, shapeProduct } from "./tensor_data.js";
3
+ import { TensorFunction, TensorContext } from "./tensor_functions.js";
4
+ import { Module, Parameter } from "./module.js";
5
+ // ============================================================
6
+ // Modules
7
+ // ============================================================
8
+ export class Linear extends Module {
9
+ weight;
10
+ bias;
11
+ inFeatures;
12
+ outFeatures;
13
+ constructor(inFeatures, outFeatures) {
14
+ super();
15
+ this.inFeatures = inFeatures;
16
+ this.outFeatures = outFeatures;
17
+ const bound = 1 / Math.sqrt(inFeatures);
18
+ this.weight = new Parameter(randRange([inFeatures, outFeatures], -bound, bound));
19
+ this.bias = new Parameter(randRange([outFeatures], -bound, bound));
20
+ }
21
+ forward(input) {
22
+ return input.matmul(this.weight.value).add(this.bias.value);
23
+ }
24
+ }
25
+ export class ReLU extends Module {
26
+ forward(input) {
27
+ return input.relu();
28
+ }
29
+ }
30
+ export class Sigmoid extends Module {
31
+ forward(input) {
32
+ return input.sigmoid();
33
+ }
34
+ }
35
+ export class Tanh extends Module {
36
+ forward(input) {
37
+ return input.mul(2).sigmoid().mul(2).sub(1);
38
+ }
39
+ }
40
+ export class Conv1d extends Module {
41
+ weight;
42
+ inChannels;
43
+ outChannels;
44
+ kernelWidth;
45
+ constructor(inChannels, outChannels, kernelWidth) {
46
+ super();
47
+ this.inChannels = inChannels;
48
+ this.outChannels = outChannels;
49
+ this.kernelWidth = kernelWidth;
50
+ const bound = 1 / Math.sqrt(inChannels * kernelWidth);
51
+ this.weight = new Parameter(randRange([outChannels, inChannels, kernelWidth], -bound, bound));
52
+ }
53
+ forward(input) {
54
+ return input.conv1d(this.weight.value);
55
+ }
56
+ }
57
+ export class Conv2d extends Module {
58
+ weight;
59
+ inChannels;
60
+ outChannels;
61
+ kernelHeight;
62
+ kernelWidth;
63
+ constructor(inChannels, outChannels, kernelSize) {
64
+ super();
65
+ this.inChannels = inChannels;
66
+ this.outChannels = outChannels;
67
+ this.kernelHeight = kernelSize[0];
68
+ this.kernelWidth = kernelSize[1];
69
+ const bound = 1 / Math.sqrt(inChannels * this.kernelHeight * this.kernelWidth);
70
+ this.weight = new Parameter(randRange([outChannels, inChannels, this.kernelHeight, this.kernelWidth], -bound, bound));
71
+ }
72
+ forward(input) {
73
+ return input.conv2d(this.weight.value);
74
+ }
75
+ }
76
+ /**
77
+ * Creates a TensorFunction for embedding lookup with efficient O(B*S*D) backward
78
+ * instead of the naive O(B*S*V*D) one-hot matmul approach.
79
+ */
80
+ function EmbeddingLookupFn(indices, batch, seqLen, numEmb, embDim) {
81
+ function validateIndices() {
82
+ for (let b = 0; b < batch; b++) {
83
+ for (let s = 0; s < seqLen; s++) {
84
+ const idx = indices[b][s];
85
+ if (idx < 0 || idx >= numEmb) {
86
+ throw new RangeError(`Embedding index ${idx} out of range [0, ${numEmb}) at position [${b}, ${s}]`);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ return class EmbeddingLookup extends TensorFunction {
92
+ static forward(ctx, weight) {
93
+ validateIndices();
94
+ ctx.saveForBackward(weight);
95
+ const wStorage = weight.data.storage;
96
+ const storage = new Float64Array(batch * seqLen * embDim);
97
+ let offset = 0;
98
+ for (let b = 0; b < batch; b++) {
99
+ for (let s = 0; s < seqLen; s++) {
100
+ const wBase = indices[b][s] * embDim;
101
+ for (let d = 0; d < embDim; d++) {
102
+ storage[offset++] = wStorage[wBase + d];
103
+ }
104
+ }
105
+ }
106
+ return new Tensor(new TensorData(storage, [batch, seqLen, embDim]));
107
+ }
108
+ static backward(ctx, gradOutput) {
109
+ const go = gradOutput.contiguous();
110
+ const goStorage = go.data.storage;
111
+ const gradWeight = new Float64Array(numEmb * embDim);
112
+ let offset = 0;
113
+ for (let b = 0; b < batch; b++) {
114
+ for (let s = 0; s < seqLen; s++) {
115
+ const wBase = indices[b][s] * embDim;
116
+ for (let d = 0; d < embDim; d++) {
117
+ gradWeight[wBase + d] = gradWeight[wBase + d] + goStorage[offset++];
118
+ }
119
+ }
120
+ }
121
+ return [new Tensor(new TensorData(gradWeight, [numEmb, embDim]))];
122
+ }
123
+ };
124
+ }
125
+ export class Embedding extends Module {
126
+ weight;
127
+ numEmbeddings;
128
+ embeddingDim;
129
+ constructor(numEmbeddings, embeddingDim, weights) {
130
+ super();
131
+ this.numEmbeddings = numEmbeddings;
132
+ this.embeddingDim = embeddingDim;
133
+ this.weight = new Parameter(weights ?? randRange([numEmbeddings, embeddingDim], -0.1, 0.1));
134
+ }
135
+ static fromPretrained(weights) {
136
+ const [numEmb, embDim] = weights.shape;
137
+ return new Embedding(numEmb, embDim, weights);
138
+ }
139
+ forward(indices) {
140
+ const batch = indices.length;
141
+ const seqLen = indices[0].length;
142
+ const fn = EmbeddingLookupFn(indices, batch, seqLen, this.numEmbeddings, this.embeddingDim);
143
+ return Tensor.apply(fn, this.weight.value);
144
+ }
145
+ }
146
+ // ============================================================
147
+ // Loss functions
148
+ // ============================================================
149
+ export function mseLoss(input, target) {
150
+ const diff = input.sub(target);
151
+ return diff.mul(diff).mean();
152
+ }
153
+ export function crossEntropyLoss(input, target) {
154
+ const lsm = logsoftmax(input, input.dims - 1);
155
+ return lsm.mul(target).neg().sum(input.dims - 1).mean();
156
+ }
157
+ // ============================================================
158
+ // Initialization helpers
159
+ // ============================================================
160
+ export function randRange(shape, low, high) {
161
+ const size = shapeProduct(shape);
162
+ const storage = new Float64Array(size);
163
+ for (let i = 0; i < size; i++) {
164
+ storage[i] = Math.random() * (high - low) + low;
165
+ }
166
+ return new Tensor(new TensorData(storage, [...shape]));
167
+ }
168
+ // ============================================================
169
+ // Functional NN ops
170
+ // ============================================================
171
+ /**
172
+ * Reshape an image tensor for 2D pooling.
173
+ *
174
+ * input: batch x channel x height x width
175
+ * kernel: [kh, kw]
176
+ * returns: tensor of shape [batch, channel, newHeight, newWidth, kh*kw],
177
+ * plus the newHeight and newWidth values.
178
+ */
179
+ export function tile(input, kernel) {
180
+ const [batch, channel, height, width] = input.shape;
181
+ const [kh, kw] = kernel;
182
+ if (!batch)
183
+ throw new Error("input batch undefined");
184
+ if (!channel)
185
+ throw new Error("input channel undefined");
186
+ if (!height)
187
+ throw new Error("input height undefined");
188
+ if (!width)
189
+ throw new Error("input width undefined");
190
+ if (height % kh !== 0) {
191
+ throw new Error("input height must be divisible by kernel height");
192
+ }
193
+ if (width % kw !== 0) {
194
+ throw new Error("input width must be divisible by kernel width");
195
+ }
196
+ const newHeight = height / kh;
197
+ const newWidth = width / kw;
198
+ const tiled = input.contiguous()
199
+ .view(batch, channel, newHeight, kh, newWidth, kw)
200
+ .permute(0, 1, 2, 4, 3, 5)
201
+ .contiguous()
202
+ .view(batch, channel, newHeight, newWidth, kh * kw);
203
+ return [tiled, newHeight, newWidth];
204
+ }
205
+ export function avgpool2d(input, kernel) {
206
+ const [batch, channel] = input.shape;
207
+ const [tiled, newHeight, newWidth] = tile(input, kernel);
208
+ return tiled.mean(4).view(batch, channel, newHeight, newWidth);
209
+ }
210
+ export function maxpool2d(input, kernel) {
211
+ const [batch, channel] = input.shape;
212
+ const [tiled, newHeight, newWidth] = tile(input, kernel);
213
+ return tiled.max(4).view(batch, channel, newHeight, newWidth);
214
+ }
215
+ export function softmax(input, dim) {
216
+ const m = input.max(dim);
217
+ const e = input.sub(m).exp();
218
+ return e.mul(e.sum(dim).inv());
219
+ }
220
+ export function logsoftmax(input, dim) {
221
+ const m = input.max(dim);
222
+ const shifted = input.sub(m);
223
+ const logSumExp = shifted.exp().sum(dim).log();
224
+ return shifted.sub(logSumExp);
225
+ }
226
+ export function dropout(input, rate = 0.5, ignore = false) {
227
+ if (ignore || rate === 0.0)
228
+ return input;
229
+ if (rate >= 1.0)
230
+ return Tensor.zeros(input.shape);
231
+ const mask = Tensor.rand(input.shape).gt(rate);
232
+ return input.mul(mask).mul(1 / (1 - rate));
233
+ }
234
+ //# sourceMappingURL=nn.js.map
package/dist/nn.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nn.js","sourceRoot":"","sources":["../src/nn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare function mul(x: number, y: number): number;
2
+ export declare function id(x: number): number;
3
+ export declare function add(x: number, y: number): number;
4
+ export declare function neg(x: number): number;
5
+ export declare function lt(x: number, y: number): number;
6
+ export declare function eq(x: number, y: number): number;
7
+ export declare function max(x: number, y: number): number;
8
+ export declare function isClose(x: number, y: number): number;
9
+ export declare function sigmoid(x: number): number;
10
+ export declare function relu(x: number): number;
11
+ export declare function log(x: number): number;
12
+ export declare function exp(x: number): number;
13
+ export declare function logBack(x: number, d: number): number;
14
+ export declare function inv(x: number): number;
15
+ export declare function invBack(x: number, d: number): number;
16
+ export declare function reluBack(x: number, d: number): number;
17
+ type MapExportFn = (ls: number[]) => number[];
18
+ export declare function map(fn: (num: number) => number): MapExportFn;
19
+ export declare function negList(ls: number[]): number[];
20
+ type ZipWithExportFn = (ls1: number[], ls2: number[]) => number[];
21
+ export declare function zipWith(fn: (num1: number, num2: number) => number): ZipWithExportFn;
22
+ export declare function zip<A, B>(arr1: A[], arr2: B[]): [A, B][];
23
+ export declare function addLists(ls1: number[], ls2: number[]): number[];
24
+ type ReduceType = (ls: number[]) => number;
25
+ export declare function reduce(fn: (num1: number, num2: number) => number, start: number): ReduceType;
26
+ export declare function sum(ls: number[]): number;
27
+ export declare function prod(ls: number[]): number;
28
+ export {};
29
+ //# sourceMappingURL=operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../src/operators.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAE/C;AAED,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAEnC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAE/C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAEpC;AAED,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAE9C;AAED,wBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAE9C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAE/C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAC,MAAM,GAAE,MAAM,CAIlD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAOxC;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAErC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAIpC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAEpC;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAE,MAAM,CAGpC;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAGpD;AAED,KAAK,WAAW,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;AAE9C,wBAAgB,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,WAAW,CAE5D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9C;AAED,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;AAElE,wBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAE,eAAe,CAElF;AAGD,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAExD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE/D;AAED,KAAK,UAAU,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAE3C,wBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,GAAE,UAAU,CAO3F;AAED,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAE,MAAM,CAEvC;AAED,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAE,MAAM,CAExC"}
@@ -0,0 +1,91 @@
1
+ const EPS = 1e-12;
2
+ export function mul(x, y) {
3
+ return x * y;
4
+ }
5
+ export function id(x) {
6
+ return x;
7
+ }
8
+ export function add(x, y) {
9
+ return x + y;
10
+ }
11
+ export function neg(x) {
12
+ return -x;
13
+ }
14
+ export function lt(x, y) {
15
+ return x < y ? 1 : 0;
16
+ }
17
+ export function eq(x, y) {
18
+ return x === y ? 1 : 0;
19
+ }
20
+ export function max(x, y) {
21
+ return x > y ? x : y;
22
+ }
23
+ export function isClose(x, y) {
24
+ // "$f(x) = |x - y| < 1e-2$"
25
+ // assumed that this meant, return 1.0 if true else 0.0
26
+ return Math.abs(x - y) < 1e-2 ? 1 : 0;
27
+ }
28
+ export function sigmoid(x) {
29
+ if (x >= 0) {
30
+ return (1 / (1 + Math.exp(-x)));
31
+ }
32
+ else {
33
+ const ex = Math.exp(x);
34
+ return (ex / (1 + ex));
35
+ }
36
+ }
37
+ export function relu(x) {
38
+ return x > 0 ? x : 0;
39
+ }
40
+ export function log(x) {
41
+ // numerical stabilization with JS math
42
+ const safe = Math.max(x, EPS);
43
+ return Math.log(safe);
44
+ }
45
+ export function exp(x) {
46
+ return Math.exp(x);
47
+ }
48
+ export function logBack(x, d) {
49
+ return d * (1 / max(x, EPS));
50
+ }
51
+ export function inv(x) {
52
+ // guard this?
53
+ return 1 / x;
54
+ }
55
+ export function invBack(x, d) {
56
+ return -d / (x * x);
57
+ }
58
+ export function reluBack(x, d) {
59
+ // Although relu_back is d * relu(x), JavaScript differentiates -0 and 0, so we instead do:
60
+ return x > 0 ? d : 0;
61
+ }
62
+ export function map(fn) {
63
+ return (ls) => ls.map(num => fn(num));
64
+ }
65
+ export function negList(ls) {
66
+ return map(neg)(ls);
67
+ }
68
+ export function zipWith(fn) {
69
+ return (ls1, ls2) => ls1.map((num, idx) => fn(ls1[idx], ls2[idx]));
70
+ }
71
+ // generic zipping function
72
+ export function zip(arr1, arr2) {
73
+ return arr1.map((x, i) => [x, arr2[i]]);
74
+ }
75
+ export function addLists(ls1, ls2) {
76
+ return zipWith(add)(ls1, ls2);
77
+ }
78
+ export function reduce(fn, start) {
79
+ return (ls) => {
80
+ let res = start;
81
+ ls.forEach((num, idx) => res = fn(num, res));
82
+ return res;
83
+ };
84
+ }
85
+ export function sum(ls) {
86
+ return reduce(add, 0)(ls);
87
+ }
88
+ export function prod(ls) {
89
+ return reduce(mul, 1)(ls);
90
+ }
91
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../src/operators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Scalar } from "./scalar.js";
2
+ import { Parameter } from "./module.js";
3
+ import { Tensor } from "./tensor.js";
4
+ export type ParameterValue = Scalar | Tensor;
5
+ export declare class Optimizer {
6
+ parameters: Parameter<ParameterValue>[];
7
+ constructor(parameters: Parameter<ParameterValue>[]);
8
+ }
9
+ export declare class SGD extends Optimizer {
10
+ lr: number;
11
+ constructor(parameters: Parameter<ParameterValue>[], lr?: number);
12
+ zeroGrad(): void;
13
+ step(): void;
14
+ }
15
+ //# sourceMappingURL=optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,qBAAa,SAAS;IAClB,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;gBAE5B,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE;CAGtD;AAED,qBAAa,GAAI,SAAQ,SAAS;IAC9B,EAAE,EAAE,MAAM,CAAC;gBAEC,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,GAAE,MAAY;IAKrE,QAAQ;IAkBR,IAAI;CA2BP"}
@@ -0,0 +1,62 @@
1
+ import { Scalar } from "./scalar.js";
2
+ import { Parameter } from "./module.js";
3
+ import { Tensor } from "./tensor.js";
4
+ import { TensorData } from "./tensor_data.js";
5
+ export class Optimizer {
6
+ parameters;
7
+ constructor(parameters) {
8
+ this.parameters = parameters;
9
+ }
10
+ }
11
+ export class SGD extends Optimizer {
12
+ lr;
13
+ constructor(parameters, lr = 1.0) {
14
+ super(parameters);
15
+ this.lr = lr;
16
+ }
17
+ zeroGrad() {
18
+ for (let p of this.parameters) {
19
+ if (!p.value || typeof p.value !== 'object') {
20
+ continue;
21
+ }
22
+ if ("derivative" in p.value) {
23
+ if (p.value.derivative !== null && p.value.derivative !== undefined) {
24
+ p.value.derivative = 0;
25
+ }
26
+ }
27
+ if ("grad" in p.value) {
28
+ if (p.value.grad !== null && p.value.grad !== undefined) {
29
+ p.value.grad = null;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ step() {
35
+ for (let p of this.parameters) {
36
+ if (!p.value || typeof p.value !== 'object') {
37
+ continue;
38
+ }
39
+ if (p.value instanceof Tensor) {
40
+ const rawGrad = p.value.grad;
41
+ if (rawGrad) {
42
+ // Ensure contiguous layout before raw storage access —
43
+ // gradients from permute backward etc. may have non-trivial strides.
44
+ const grad = rawGrad.contiguous();
45
+ const val = p.value.contiguous();
46
+ const valStorage = val.data.storage;
47
+ const gradStorage = grad.data.storage;
48
+ const newStorage = new Float64Array(val.size);
49
+ for (let i = 0; i < val.size; i++) {
50
+ newStorage[i] = valStorage[i] - this.lr * gradStorage[i];
51
+ }
52
+ p.update(new Tensor(new TensorData(newStorage, [...val.shape])));
53
+ }
54
+ }
55
+ else if (p.value instanceof Scalar) {
56
+ const grad = p.value.derivative ?? 0;
57
+ p.value.data -= this.lr * grad;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { ScalarHistory, ScalarFunction } from "./scalar_functions.js";
2
+ export type ScalarLike = number | Scalar;
3
+ export type GradPair = [Scalar, number];
4
+ /**
5
+ * Scalar: A number that tracks its computation history.
6
+ * Behaves like a regular number but records operations for autodiff.
7
+ */
8
+ export declare class Scalar {
9
+ data: number;
10
+ readonly history: ScalarHistory | null;
11
+ readonly uniqueId: number;
12
+ readonly name: string;
13
+ derivative: number | null;
14
+ constructor(value: number, history?: ScalarHistory | null, name?: string);
15
+ toString(): string;
16
+ /**
17
+ * Apply a ScalarFunction to the given values.
18
+ * Handles unwrapping Scalars to numbers, calling forward, and wrapping the result.
19
+ */
20
+ static apply(fn: typeof ScalarFunction, ...vals: ScalarLike[]): Scalar;
21
+ add(b: ScalarLike): Scalar;
22
+ mul(b: ScalarLike): Scalar;
23
+ div(b: ScalarLike): Scalar;
24
+ rdiv(b: ScalarLike): Scalar;
25
+ sub(b: ScalarLike): Scalar;
26
+ neg(): Scalar;
27
+ lt(b: ScalarLike): Scalar;
28
+ eq(b: ScalarLike): Scalar;
29
+ gt(b: ScalarLike): Scalar;
30
+ log(): Scalar;
31
+ exp(): Scalar;
32
+ sigmoid(): Scalar;
33
+ relu(): Scalar;
34
+ chainRule(dOut: number): Iterable<GradPair>;
35
+ backward(dOut?: number): void;
36
+ isLeaf(): boolean;
37
+ isConstant(): boolean;
38
+ get parents(): Scalar[];
39
+ accumulateDerivative(d: number): void;
40
+ }
41
+ export { ScalarHistory };
42
+ //# sourceMappingURL=scalar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.d.ts","sourceRoot":"","sources":["../src/scalar.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,aAAa,EACb,cAAc,EAWjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AACzC,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIxC;;;GAGG;AACH,qBAAa,MAAM;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAG7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAa,GAAG,IAAW,EACpC,IAAI,CAAC,EAAE,MAAM;IASjB,QAAQ,IAAI,MAAM;IAIlB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,cAAc,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM;IAsBtE,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,IAAI,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI3B,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,GAAG,IAAI,MAAM;IAIb,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAIzB,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAIzB,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAIzB,GAAG,IAAI,MAAM;IAIb,GAAG,IAAI,MAAM;IAIb,OAAO,IAAI,MAAM;IAIjB,IAAI,IAAI,MAAM;IAId,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAa3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAOtB,MAAM,IAAI,OAAO;IAIjB,UAAU,IAAI,OAAO;IAIrB,IAAI,OAAO,IAAI,MAAM,EAAE,CAEtB;IAED,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;CASxC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/dist/scalar.js ADDED
@@ -0,0 +1,126 @@
1
+ import { backPropagate, Context } from "./autodiff.js";
2
+ import { zip } from "./operators.js";
3
+ import { ScalarHistory, ScalarFunction, Add, Log, Mul, Inv, Neg, Sigmoid, Relu, Exp, LT, EQ, } from "./scalar_functions.js";
4
+ let _varCount = 0;
5
+ /**
6
+ * Scalar: A number that tracks its computation history.
7
+ * Behaves like a regular number but records operations for autodiff.
8
+ */
9
+ export class Scalar {
10
+ data;
11
+ history;
12
+ uniqueId;
13
+ name;
14
+ derivative = null; // Filled in during backward pass
15
+ constructor(value, history = null, name) {
16
+ _varCount++;
17
+ this.uniqueId = _varCount;
18
+ this.data = value;
19
+ this.history = history;
20
+ this.name = name ?? `var${this.uniqueId}`;
21
+ }
22
+ toString() {
23
+ return `Scalar(${this.data})`;
24
+ }
25
+ /**
26
+ * Apply a ScalarFunction to the given values.
27
+ * Handles unwrapping Scalars to numbers, calling forward, and wrapping the result.
28
+ */
29
+ static apply(fn, ...vals) {
30
+ const rawVals = [];
31
+ const scalars = [];
32
+ for (const v of vals) {
33
+ if (v instanceof Scalar) {
34
+ scalars.push(v);
35
+ rawVals.push(v.data);
36
+ }
37
+ else {
38
+ scalars.push(new Scalar(v));
39
+ rawVals.push(v);
40
+ }
41
+ }
42
+ const ctx = new Context();
43
+ const result = fn.forward(ctx, ...rawVals);
44
+ const history = new ScalarHistory(fn, ctx, scalars);
45
+ return new Scalar(result, history);
46
+ }
47
+ add(b) {
48
+ return Scalar.apply(Add, this, b);
49
+ }
50
+ mul(b) {
51
+ return Scalar.apply(Mul, this, b);
52
+ }
53
+ div(b) {
54
+ return Scalar.apply(Mul, this, Scalar.apply(Inv, b));
55
+ }
56
+ rdiv(b) {
57
+ return Scalar.apply(Mul, b, Scalar.apply(Inv, this));
58
+ }
59
+ sub(b) {
60
+ return Scalar.apply(Add, this, Scalar.apply(Neg, b));
61
+ }
62
+ neg() {
63
+ return Scalar.apply(Neg, this);
64
+ }
65
+ lt(b) {
66
+ return Scalar.apply(LT, this, b);
67
+ }
68
+ eq(b) {
69
+ return Scalar.apply(EQ, this, b);
70
+ }
71
+ gt(b) {
72
+ return Scalar.apply(LT, b, this);
73
+ }
74
+ log() {
75
+ return Scalar.apply(Log, this);
76
+ }
77
+ exp() {
78
+ return Scalar.apply(Exp, this);
79
+ }
80
+ sigmoid() {
81
+ return Scalar.apply(Sigmoid, this);
82
+ }
83
+ relu() {
84
+ return Scalar.apply(Relu, this);
85
+ }
86
+ chainRule(dOut) {
87
+ const h = this.history;
88
+ if (!h)
89
+ throw new Error("Missing scalar history");
90
+ if (!h.lastFn)
91
+ throw new Error("Missing lastFn in scalar history");
92
+ if (!h.ctx)
93
+ throw new Error("Missing ctx in scalar history");
94
+ if (!h.inputs)
95
+ throw new Error("Missing inputs in scalar history");
96
+ const gradients = h.lastFn.backward(h.ctx, dOut);
97
+ const inputs = h.inputs;
98
+ return zip(inputs, gradients);
99
+ }
100
+ backward(dOut) {
101
+ if (dOut == null || dOut == undefined) {
102
+ dOut = 1.0;
103
+ }
104
+ backPropagate(this, dOut);
105
+ }
106
+ isLeaf() {
107
+ return !this.history?.lastFn;
108
+ }
109
+ isConstant() {
110
+ return !this.history;
111
+ }
112
+ get parents() {
113
+ return this.history?.inputs ?? [];
114
+ }
115
+ accumulateDerivative(d) {
116
+ if (!this.isLeaf()) {
117
+ throw new Error("Cannot accumulate derivative of a non-leaf scalar");
118
+ }
119
+ if (this.derivative === null) {
120
+ this.derivative = 0;
121
+ }
122
+ this.derivative += d;
123
+ }
124
+ }
125
+ export { ScalarHistory };
126
+ //# sourceMappingURL=scalar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalar.js","sourceRoot":"","sources":["../src/scalar.ts"],"names":[],"mappings":"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"}