@thi.ng/tensors 0.10.14 → 0.11.2

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/tensor.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { NumericArray } from "@thi.ng/api";
2
- import type { ITensor, ITensorStorage, Nested, NestedTensor, NumType, Shape, ShapeTensor, TensorCtor, TensorData, TensorFromArrayOpts, TensorOpts, Type, TypeMap } from "./api.js";
2
+ import type { ITensor, ITensor0, ITensor1, ITensor2, ITensor3, ITensor4, ITensorStorage, Nested, NestedTensor, NumType, Shape, ShapeTensor, TensorCtor, TensorData, TensorFromArrayOpts, TensorOpts, Type, TypeMap } from "./api.js";
3
3
  export declare abstract class ATensor<T = number> implements ITensor<T> {
4
4
  type: Type;
5
5
  storage: ITensorStorage<T>;
@@ -8,12 +8,13 @@ export declare abstract class ATensor<T = number> implements ITensor<T> {
8
8
  stride: number[];
9
9
  offset: number;
10
10
  constructor(type: Type, storage: ITensorStorage<T>, data: TensorData<T>, shape: number[], stride: number[], offset?: number);
11
+ protected _n: number;
11
12
  abstract get dim(): number;
12
13
  abstract get length(): number;
13
14
  get order(): number[];
14
15
  get orderedShape(): number[];
15
16
  get orderedStride(): number[];
16
- abstract [Symbol.iterator](): IterableIterator<T>;
17
+ [Symbol.iterator](): IterableIterator<T>;
17
18
  broadcast<S extends Shape>(shape: S, stride: S): ShapeTensor<S, T>;
18
19
  copy(): typeof this;
19
20
  empty(storage?: ITensorStorage<T>): typeof this;
@@ -23,7 +24,9 @@ export declare abstract class ATensor<T = number> implements ITensor<T> {
23
24
  release(): boolean;
24
25
  equiv(o: any): boolean;
25
26
  eqDelta(o: ITensor<T>, eps?: number): boolean;
27
+ fill(value: T): this;
26
28
  abstract index(pos: NumericArray): number;
29
+ abstract indices(): IterableIterator<number>;
27
30
  position(index: number): number[];
28
31
  abstract get(pos: NumericArray): T;
29
32
  abstract set(pos: NumericArray, v: T): this;
@@ -43,12 +46,13 @@ export declare abstract class ATensor<T = number> implements ITensor<T> {
43
46
  stride: number[];
44
47
  };
45
48
  }
46
- export declare class Tensor0<T = number> extends ATensor<T> {
47
- [Symbol.iterator](): IterableIterator<T>;
48
- get dim(): number;
49
+ export declare class Tensor0<T = number> extends ATensor<T> implements ITensor0<T> {
50
+ get dim(): 0;
49
51
  get order(): number[];
50
52
  get length(): number;
53
+ fill(x: T): this;
51
54
  index(): number;
55
+ indices(): Generator<number, void, unknown>;
52
56
  position(): number[];
53
57
  get(): T;
54
58
  set(_: NumericArray, v: T): this;
@@ -57,12 +61,12 @@ export declare class Tensor0<T = number> extends ATensor<T> {
57
61
  transpose(_: number[]): this;
58
62
  toString(): string;
59
63
  }
60
- export declare class Tensor1<T = number> extends ATensor<T> {
61
- [Symbol.iterator](): IterableIterator<T>;
62
- get dim(): number;
64
+ export declare class Tensor1<T = number> extends ATensor<T> implements ITensor1<T> {
65
+ get dim(): 1;
63
66
  get order(): number[];
64
67
  get length(): number;
65
68
  index([x]: NumericArray): number;
69
+ indices(): Generator<number, void, unknown>;
66
70
  position(index: number): number[];
67
71
  get([x]: NumericArray): T;
68
72
  set([x]: NumericArray, v: T): this;
@@ -71,35 +75,32 @@ export declare class Tensor1<T = number> extends ATensor<T> {
71
75
  transpose(_: number[]): this;
72
76
  toString(): string;
73
77
  }
74
- export declare class Tensor2<T = number> extends ATensor<T> {
75
- protected _n: number;
76
- [Symbol.iterator](): Generator<T, void, unknown>;
78
+ export declare class Tensor2<T = number> extends ATensor<T> implements ITensor2<T> {
77
79
  get length(): number;
78
- get dim(): number;
80
+ get dim(): 2;
79
81
  get order(): number[];
80
82
  index(pos: NumericArray): number;
83
+ indices(): Generator<number, void, unknown>;
81
84
  get(pos: NumericArray): T;
82
85
  set(pos: NumericArray, v: T): this;
83
86
  resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
84
87
  toString(): string;
85
88
  }
86
- export declare class Tensor3<T = number> extends ATensor<T> {
87
- protected _n: number;
88
- [Symbol.iterator](): Generator<T, void, unknown>;
89
+ export declare class Tensor3<T = number> extends ATensor<T> implements ITensor3<T> {
89
90
  get length(): number;
90
- get dim(): number;
91
+ get dim(): 3;
91
92
  index(pos: NumericArray): number;
93
+ indices(): Generator<number, void, unknown>;
92
94
  get(pos: NumericArray): T;
93
95
  set(pos: NumericArray, v: T): this;
94
96
  resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
95
97
  toString(): string;
96
98
  }
97
- export declare class Tensor4<T = number> extends ATensor<T> {
98
- protected _n: number;
99
- [Symbol.iterator](): Generator<T, void, unknown>;
99
+ export declare class Tensor4<T = number> extends ATensor<T> implements ITensor4<T> {
100
100
  get length(): number;
101
- get dim(): number;
101
+ get dim(): 4;
102
102
  index(pos: NumericArray): number;
103
+ indices(): Generator<number, void, unknown>;
103
104
  get(pos: NumericArray): T;
104
105
  set(pos: NumericArray, v: T): this;
105
106
  resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
package/tensor.js CHANGED
@@ -20,6 +20,7 @@ class ATensor {
20
20
  this.stride = stride;
21
21
  this.offset = offset;
22
22
  }
23
+ _n;
23
24
  get order() {
24
25
  return strideOrder(this.stride);
25
26
  }
@@ -29,6 +30,10 @@ class ATensor {
29
30
  get orderedStride() {
30
31
  return swizzle(this.order)(this.stride);
31
32
  }
33
+ *[Symbol.iterator]() {
34
+ const { data } = this;
35
+ for (let i of this.indices()) yield data[i];
36
+ }
32
37
  broadcast(shape, stride) {
33
38
  return new TENSOR_IMPLS[shape.length](
34
39
  this.type,
@@ -70,6 +75,11 @@ class ATensor {
70
75
  eqDelta(o, eps = 1e-6) {
71
76
  return this === o || equiv(this.shape, o.shape) && _eqDelta([...this], [...o], this.length, eps);
72
77
  }
78
+ fill(value) {
79
+ const { data } = this;
80
+ for (let i of this.indices()) data[i] = value;
81
+ return this;
82
+ }
73
83
  position(index) {
74
84
  const { order, stride } = this;
75
85
  index |= 0;
@@ -174,9 +184,6 @@ class ATensor {
174
184
  }
175
185
  }
176
186
  class Tensor0 extends ATensor {
177
- *[Symbol.iterator]() {
178
- yield this.data[this.offset];
179
- }
180
187
  get dim() {
181
188
  return 0;
182
189
  }
@@ -186,9 +193,16 @@ class Tensor0 extends ATensor {
186
193
  get length() {
187
194
  return 1;
188
195
  }
196
+ fill(x) {
197
+ this.data[this.offset] = x;
198
+ return this;
199
+ }
189
200
  index() {
190
201
  return this.offset;
191
202
  }
203
+ *indices() {
204
+ yield this.offset;
205
+ }
192
206
  position() {
193
207
  return [0];
194
208
  }
@@ -229,15 +243,6 @@ class Tensor0 extends ATensor {
229
243
  }
230
244
  }
231
245
  class Tensor1 extends ATensor {
232
- *[Symbol.iterator]() {
233
- let {
234
- data,
235
- shape: [sx],
236
- stride: [tx],
237
- offset
238
- } = this;
239
- for (; sx-- > 0; offset += tx) yield data[offset];
240
- }
241
246
  get dim() {
242
247
  return 1;
243
248
  }
@@ -250,6 +255,14 @@ class Tensor1 extends ATensor {
250
255
  index([x]) {
251
256
  return this.offset + x * this.stride[0];
252
257
  }
258
+ *indices() {
259
+ let {
260
+ shape: [sx],
261
+ stride: [tx],
262
+ offset
263
+ } = this;
264
+ for (; sx-- > 0; offset += tx) yield offset;
265
+ }
253
266
  position(index) {
254
267
  return [~~(((index | 0) - this.offset) / this.stride[0])];
255
268
  }
@@ -300,22 +313,8 @@ class Tensor1 extends ATensor {
300
313
  }
301
314
  }
302
315
  class Tensor2 extends ATensor {
303
- _n;
304
- *[Symbol.iterator]() {
305
- const {
306
- data,
307
- shape: [sx, sy],
308
- stride: [tx, ty]
309
- } = this;
310
- let ox, x, y;
311
- for (ox = this.offset, x = 0; x < sx; x++, ox += tx) {
312
- for (y = 0; y < sy; y++) {
313
- yield data[ox + y * ty];
314
- }
315
- }
316
- }
317
316
  get length() {
318
- return this._n || (this._n = product2(this.shape));
317
+ return this._n ?? (this._n = product2(this.shape));
319
318
  }
320
319
  get dim() {
321
320
  return 2;
@@ -326,6 +325,18 @@ class Tensor2 extends ATensor {
326
325
  index(pos) {
327
326
  return this.offset + dot2(pos, this.stride);
328
327
  }
328
+ *indices() {
329
+ const {
330
+ shape: [sx, sy],
331
+ stride: [tx, ty]
332
+ } = this;
333
+ let ox, x, y;
334
+ for (ox = this.offset, x = 0; x < sx; x++, ox += tx) {
335
+ for (y = 0; y < sy; y++) {
336
+ yield ox + y * ty;
337
+ }
338
+ }
339
+ }
329
340
  get(pos) {
330
341
  return this.data[this.offset + dot2(pos, this.stride)];
331
342
  }
@@ -364,10 +375,17 @@ class Tensor2 extends ATensor {
364
375
  }
365
376
  }
366
377
  class Tensor3 extends ATensor {
367
- _n;
368
- *[Symbol.iterator]() {
378
+ get length() {
379
+ return this._n ?? (this._n = product3(this.shape));
380
+ }
381
+ get dim() {
382
+ return 3;
383
+ }
384
+ index(pos) {
385
+ return this.offset + dot3(pos, this.stride);
386
+ }
387
+ *indices() {
369
388
  const {
370
- data,
371
389
  shape: [sx, sy, sz],
372
390
  stride: [tx, ty, tz]
373
391
  } = this;
@@ -375,20 +393,11 @@ class Tensor3 extends ATensor {
375
393
  for (ox = this.offset, x = 0; x < sx; x++, ox += tx) {
376
394
  for (oy = ox, y = 0; y < sy; y++, oy += ty) {
377
395
  for (z = 0; z < sz; z++) {
378
- yield data[oy + z * tz];
396
+ yield oy + z * tz;
379
397
  }
380
398
  }
381
399
  }
382
400
  }
383
- get length() {
384
- return this._n || (this._n = product3(this.shape));
385
- }
386
- get dim() {
387
- return 3;
388
- }
389
- index(pos) {
390
- return this.offset + dot3(pos, this.stride);
391
- }
392
401
  get(pos) {
393
402
  return this.data[this.offset + dot3(pos, this.stride)];
394
403
  }
@@ -429,10 +438,17 @@ class Tensor3 extends ATensor {
429
438
  }
430
439
  }
431
440
  class Tensor4 extends ATensor {
432
- _n;
433
- *[Symbol.iterator]() {
441
+ get length() {
442
+ return this._n ?? (this._n = product4(this.shape));
443
+ }
444
+ get dim() {
445
+ return 4;
446
+ }
447
+ index(pos) {
448
+ return this.offset + dot4(pos, this.stride);
449
+ }
450
+ *indices() {
434
451
  const {
435
- data,
436
452
  shape: [sx, sy, sz, sw],
437
453
  stride: [tx, ty, tz, tw],
438
454
  offset
@@ -442,21 +458,12 @@ class Tensor4 extends ATensor {
442
458
  for (oy = ox, y = 0; y < sy; y++, oy += ty) {
443
459
  for (oz = oy, z = 0; z < sz; z++, oz += tz) {
444
460
  for (w = 0; w < sw; w++) {
445
- yield data[oz + w * tw];
461
+ yield oz + w * tw;
446
462
  }
447
463
  }
448
464
  }
449
465
  }
450
466
  }
451
- get length() {
452
- return this._n || (this._n = product4(this.shape));
453
- }
454
- get dim() {
455
- return 4;
456
- }
457
- index(pos) {
458
- return this.offset + dot4(pos, this.stride);
459
- }
460
467
  get(pos) {
461
468
  return this.data[this.offset + dot4(pos, this.stride)];
462
469
  }