mathjs 14.9.0 → 15.0.0
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/HISTORY.md +29 -3
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +1 -1
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/config.js +5 -1
- package/lib/cjs/core/function/config.js +4 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
- package/lib/cjs/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
- package/lib/cjs/entry/impureFunctionsAny.generated.js +40 -40
- package/lib/cjs/entry/pureFunctionsAny.generated.js +143 -144
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +0 -2
- package/lib/cjs/expression/node/IndexNode.js +1 -1
- package/lib/cjs/expression/parse.js +38 -34
- package/lib/cjs/function/algebra/sylvester.js +6 -5
- package/lib/cjs/function/logical/nullish.js +2 -2
- package/lib/cjs/function/matrix/column.js +2 -1
- package/lib/cjs/function/matrix/dot.js +4 -9
- package/lib/cjs/function/matrix/flatten.js +6 -3
- package/lib/cjs/function/matrix/kron.js +31 -30
- package/lib/cjs/function/matrix/row.js +2 -1
- package/lib/cjs/function/matrix/size.js +11 -17
- package/lib/cjs/function/matrix/subset.js +21 -11
- package/lib/cjs/header.js +1 -1
- package/lib/cjs/type/matrix/DenseMatrix.js +52 -41
- package/lib/cjs/type/matrix/MatrixIndex.js +19 -20
- package/lib/cjs/type/matrix/SparseMatrix.js +13 -7
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/config.js +5 -1
- package/lib/esm/core/function/config.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSize.generated.js +0 -2
- package/lib/esm/entry/dependenciesNumber/dependenciesSize.generated.js +0 -2
- package/lib/esm/entry/impureFunctionsAny.generated.js +42 -42
- package/lib/esm/entry/pureFunctionsAny.generated.js +144 -145
- package/lib/esm/entry/pureFunctionsNumber.generated.js +0 -2
- package/lib/esm/expression/node/IndexNode.js +1 -1
- package/lib/esm/expression/parse.js +38 -34
- package/lib/esm/function/algebra/sylvester.js +6 -5
- package/lib/esm/function/logical/nullish.js +2 -2
- package/lib/esm/function/matrix/column.js +2 -1
- package/lib/esm/function/matrix/dot.js +4 -9
- package/lib/esm/function/matrix/flatten.js +6 -3
- package/lib/esm/function/matrix/kron.js +31 -30
- package/lib/esm/function/matrix/row.js +2 -1
- package/lib/esm/function/matrix/size.js +11 -17
- package/lib/esm/function/matrix/subset.js +21 -11
- package/lib/esm/type/matrix/DenseMatrix.js +52 -41
- package/lib/esm/type/matrix/MatrixIndex.js +20 -21
- package/lib/esm/type/matrix/SparseMatrix.js +13 -7
- package/lib/esm/version.js +1 -1
- package/package.json +1 -1
@@ -62,8 +62,8 @@ export var createNullish = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
62
62
|
'undefined, any': (_x, y) => y,
|
63
63
|
// SparseMatrix-first with collection RHS: enforce exact shape match
|
64
64
|
'SparseMatrix, Array | Matrix': (x, y) => {
|
65
|
-
var sx =
|
66
|
-
var sy =
|
65
|
+
var sx = size(x);
|
66
|
+
var sy = size(y);
|
67
67
|
if (deepEqual(sx, sy)) return x;
|
68
68
|
throw new DimensionError(sx, sy);
|
69
69
|
},
|
@@ -52,8 +52,9 @@ export var createColumn = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
52
52
|
}
|
53
53
|
validateIndex(column, value.size()[1]);
|
54
54
|
var rowRange = range(0, value.size()[0]);
|
55
|
-
var index = new Index(rowRange, column);
|
55
|
+
var index = new Index(rowRange, [column]);
|
56
56
|
var result = value.subset(index);
|
57
|
+
// once config.legacySubset just return result
|
57
58
|
return isMatrix(result) ? result : matrix([[result]]);
|
58
59
|
}
|
59
60
|
});
|
@@ -38,8 +38,8 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
38
38
|
'SparseMatrix, SparseMatrix': _sparseDot
|
39
39
|
});
|
40
40
|
function _validateDim(x, y) {
|
41
|
-
var xSize =
|
42
|
-
var ySize =
|
41
|
+
var xSize = size(x);
|
42
|
+
var ySize = size(y);
|
43
43
|
var xLen, yLen;
|
44
44
|
if (xSize.length === 1) {
|
45
45
|
xLen = xSize[0];
|
@@ -67,8 +67,8 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
67
67
|
var bdt = isMatrix(b) ? b._datatype || b.getDataType() : undefined;
|
68
68
|
|
69
69
|
// are these 2-dimensional column vectors? (as opposed to 1-dimensional vectors)
|
70
|
-
var aIsColumn =
|
71
|
-
var bIsColumn =
|
70
|
+
var aIsColumn = size(a).length === 2;
|
71
|
+
var bIsColumn = size(b).length === 2;
|
72
72
|
var add = addScalar;
|
73
73
|
var mul = multiplyScalar;
|
74
74
|
|
@@ -148,9 +148,4 @@ export var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
148
148
|
}
|
149
149
|
return c;
|
150
150
|
}
|
151
|
-
|
152
|
-
// TODO remove this once #1771 is fixed
|
153
|
-
function _size(x) {
|
154
|
-
return isMatrix(x) ? x.size() : size(x);
|
155
|
-
}
|
156
151
|
});
|
@@ -22,17 +22,20 @@ export var createFlatten = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
22
22
|
*
|
23
23
|
* concat, resize, size, squeeze
|
24
24
|
*
|
25
|
-
* @param {
|
26
|
-
* @return {
|
25
|
+
* @param {DenseMatrix | Array} x Matrix to be flattened
|
26
|
+
* @return {DenseMatrix | Array} Returns the flattened matrix
|
27
27
|
*/
|
28
28
|
return typed(name, {
|
29
29
|
Array: function Array(x) {
|
30
30
|
return flattenArray(x);
|
31
31
|
},
|
32
|
-
|
32
|
+
DenseMatrix: function DenseMatrix(x) {
|
33
33
|
// Return the same matrix type as x (Dense or Sparse Matrix)
|
34
34
|
// Return the same data type as x
|
35
35
|
return x.create(flattenArray(x.valueOf(), true), x.datatype());
|
36
|
+
},
|
37
|
+
SparseMatrix: function SparseMatrix(_x) {
|
38
|
+
throw new TypeError('SparseMatrix is not supported by function flatten ' + 'because it does not support 1D vectors. ' + 'Convert to a DenseMatrix or Array first. Example: flatten(x.toArray())');
|
36
39
|
}
|
37
40
|
});
|
38
41
|
});
|
@@ -25,7 +25,7 @@ export var createKron = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
25
25
|
* // returns [ [ 1, 2, 0, 0 ], [ 3, 4, 0, 0 ], [ 0, 0, 1, 2 ], [ 0, 0, 3, 4 ] ]
|
26
26
|
*
|
27
27
|
* math.kron([1,1], [2,3,4])
|
28
|
-
* // returns [
|
28
|
+
* // returns [2, 3, 4, 2, 3, 4]
|
29
29
|
*
|
30
30
|
* See also:
|
31
31
|
*
|
@@ -49,37 +49,38 @@ export var createKron = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
49
49
|
});
|
50
50
|
|
51
51
|
/**
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
* Calculate the Kronecker product of two (1-dimensional) vectors,
|
53
|
+
* with no dimension checking
|
54
|
+
* @param {Array} a First vector
|
55
|
+
* @param {Array} b Second vector
|
56
|
+
* @returns {Array} the 1-dimensional Kronecker product of a and b
|
57
|
+
* @private
|
58
|
+
*/
|
59
|
+
function _kron1d(a, b) {
|
60
|
+
// TODO in core overhaul: would be faster to see if we can choose a
|
61
|
+
// particular implementation of multiplyScalar at the beginning,
|
62
|
+
// rather than re-dispatch for _every_ ordered pair of entries.
|
63
|
+
return a.flatMap(x => b.map(y => multiplyScalar(x, y)));
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Calculate the Kronecker product of two possibly multidimensional arrays
|
68
|
+
* @param {Array} a First array
|
69
|
+
* @param {Array} b Second array
|
70
|
+
* @param {number} [d] common dimension; if missing, compute and match args
|
71
|
+
* @returns {Array} Returns the Kronecker product of x and y
|
72
|
+
* @private
|
57
73
|
*/
|
58
74
|
function _kron(a, b) {
|
59
|
-
|
60
|
-
if (
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
b = [b];
|
67
|
-
}
|
68
|
-
if (size(a).length > 2 || size(b).length > 2) {
|
69
|
-
throw new RangeError('Vectors with dimensions greater then 2 are not supported expected ' + '(Size x = ' + JSON.stringify(a.length) + ', y = ' + JSON.stringify(b.length) + ')');
|
75
|
+
var d = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
|
76
|
+
if (d < 0) {
|
77
|
+
var adim = size(a).length;
|
78
|
+
var bdim = size(b).length;
|
79
|
+
d = Math.max(adim, bdim);
|
80
|
+
while (adim++ < d) a = [a];
|
81
|
+
while (bdim++ < d) b = [b];
|
70
82
|
}
|
71
|
-
|
72
|
-
|
73
|
-
return a.map(function (a) {
|
74
|
-
return b.map(function (b) {
|
75
|
-
r = [];
|
76
|
-
t.push(r);
|
77
|
-
return a.map(function (y) {
|
78
|
-
return b.map(function (x) {
|
79
|
-
return r.push(multiplyScalar(y, x));
|
80
|
-
});
|
81
|
-
});
|
82
|
-
});
|
83
|
-
}) && t;
|
83
|
+
if (d === 1) return _kron1d(a, b);
|
84
|
+
return a.flatMap(aSlice => b.map(bSlice => _kron(aSlice, bSlice, d - 1)));
|
84
85
|
}
|
85
86
|
});
|
@@ -52,8 +52,9 @@ export var createRow = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
52
52
|
}
|
53
53
|
validateIndex(row, value.size()[0]);
|
54
54
|
var columnRange = range(0, value.size()[1]);
|
55
|
-
var index = new Index(row, columnRange);
|
55
|
+
var index = new Index([row], columnRange);
|
56
56
|
var result = value.subset(index);
|
57
|
+
// once config.legacySubset just return result
|
57
58
|
return isMatrix(result) ? result : matrix([[result]]);
|
58
59
|
}
|
59
60
|
});
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import { arraySize } from '../../utils/array.js';
|
2
2
|
import { factory } from '../../utils/factory.js';
|
3
|
-
import { noMatrix } from '../../utils/noop.js';
|
4
3
|
var name = 'size';
|
5
|
-
var dependencies = ['typed'
|
4
|
+
var dependencies = ['typed'];
|
6
5
|
export var createSize = /* #__PURE__ */factory(name, dependencies, _ref => {
|
7
6
|
var {
|
8
|
-
typed
|
9
|
-
config,
|
10
|
-
matrix
|
7
|
+
typed
|
11
8
|
} = _ref;
|
12
9
|
/**
|
13
|
-
* Calculate the size of a matrix or scalar.
|
10
|
+
* Calculate the size of a matrix or scalar. Always returns an Array containing numbers.
|
11
|
+
*
|
12
|
+
* Note that in mathjs v14 and older, function size could return a Matrix depending on
|
13
|
+
* the input type and configuration.
|
14
14
|
*
|
15
15
|
* Syntax:
|
16
16
|
*
|
@@ -30,19 +30,13 @@ export var createSize = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
30
30
|
* count, resize, squeeze, subset
|
31
31
|
*
|
32
32
|
* @param {boolean | number | Complex | Unit | string | Array | Matrix} x A matrix
|
33
|
-
* @return {Array
|
33
|
+
* @return {Array} A vector with size of `x`.
|
34
34
|
*/
|
35
35
|
return typed(name, {
|
36
|
-
Matrix:
|
37
|
-
return x.create(x.size(), 'number');
|
38
|
-
},
|
36
|
+
Matrix: x => x.size(),
|
39
37
|
Array: arraySize,
|
40
|
-
string:
|
41
|
-
|
42
|
-
|
43
|
-
'number | Complex | BigNumber | Unit | boolean | null': function number__Complex__BigNumber__Unit__boolean__null(x) {
|
44
|
-
// scalar
|
45
|
-
return config.matrix === 'Array' ? [] : matrix ? matrix([], 'dense', 'number') : noMatrix();
|
46
|
-
}
|
38
|
+
string: x => [x.length],
|
39
|
+
// scalar
|
40
|
+
'number | Complex | BigNumber | Unit | boolean | null': _x => []
|
47
41
|
});
|
48
42
|
});
|
@@ -25,8 +25,8 @@ export var createSubset = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
25
25
|
* // get a subset
|
26
26
|
* const d = [[1, 2], [3, 4]]
|
27
27
|
* math.subset(d, math.index(1, 0)) // returns 3
|
28
|
-
* math.subset(d, math.index([0, 1], 1)) // returns [[2], [4]]
|
29
|
-
* math.subset(d, math.index([false, true], 0)) // returns [[3]]
|
28
|
+
* math.subset(d, math.index([0, 1], [1])) // returns [[2], [4]]
|
29
|
+
* math.subset(d, math.index([false, true], [0])) // returns [[3]]
|
30
30
|
*
|
31
31
|
* // replace a subset
|
32
32
|
* const e = []
|
@@ -36,9 +36,9 @@ export var createSubset = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
36
36
|
*
|
37
37
|
* // get submatrix using ranges
|
38
38
|
* const M = [
|
39
|
-
* [1,2,3],
|
40
|
-
* [4,5,6],
|
41
|
-
* [7,8,9]
|
39
|
+
* [1, 2, 3],
|
40
|
+
* [4, 5, 6],
|
41
|
+
* [7, 8, 9]
|
42
42
|
* ]
|
43
43
|
* math.subset(M, math.index(math.range(0,2), math.range(0,3))) // [[1, 2, 3], [4, 5, 6]]
|
44
44
|
*
|
@@ -117,7 +117,7 @@ export var createSubset = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
117
117
|
if (typeof replacement === 'string') {
|
118
118
|
throw new Error('can\'t boradcast a string');
|
119
119
|
}
|
120
|
-
if (index.
|
120
|
+
if (index.isScalar()) {
|
121
121
|
return replacement;
|
122
122
|
}
|
123
123
|
var indexSize = index.size();
|
@@ -159,9 +159,14 @@ function _getSubstring(str, index) {
|
|
159
159
|
validateIndex(index.max()[0], strLen);
|
160
160
|
var range = index.dimension(0);
|
161
161
|
var substr = '';
|
162
|
-
|
162
|
+
function callback(v) {
|
163
163
|
substr += str.charAt(v);
|
164
|
-
}
|
164
|
+
}
|
165
|
+
if (Number.isInteger(range)) {
|
166
|
+
callback(range);
|
167
|
+
} else {
|
168
|
+
range.forEach(callback);
|
169
|
+
}
|
165
170
|
return substr;
|
166
171
|
}
|
167
172
|
|
@@ -195,7 +200,7 @@ function _setSubstring(str, index, replacement, defaultValue) {
|
|
195
200
|
defaultValue = ' ';
|
196
201
|
}
|
197
202
|
var range = index.dimension(0);
|
198
|
-
var len = range.size()[0];
|
203
|
+
var len = Number.isInteger(range) ? 1 : range.size()[0];
|
199
204
|
if (len !== replacement.length) {
|
200
205
|
throw new DimensionError(range.size()[0], replacement.length);
|
201
206
|
}
|
@@ -210,9 +215,14 @@ function _setSubstring(str, index, replacement, defaultValue) {
|
|
210
215
|
for (var i = 0; i < strLen; i++) {
|
211
216
|
chars[i] = str.charAt(i);
|
212
217
|
}
|
213
|
-
|
218
|
+
function callback(v, i) {
|
214
219
|
chars[v] = replacement.charAt(i[0]);
|
215
|
-
}
|
220
|
+
}
|
221
|
+
if (Number.isInteger(range)) {
|
222
|
+
callback(range, [0]);
|
223
|
+
} else {
|
224
|
+
range.forEach(callback);
|
225
|
+
}
|
216
226
|
|
217
227
|
// initialize undefined characters with a space
|
218
228
|
if (chars.length > strLen) {
|
@@ -8,10 +8,11 @@ import { DimensionError } from '../../error/DimensionError.js';
|
|
8
8
|
import { factory } from '../../utils/factory.js';
|
9
9
|
import { optimizeCallback } from '../../utils/optimizeCallback.js';
|
10
10
|
var name = 'DenseMatrix';
|
11
|
-
var dependencies = ['Matrix'];
|
11
|
+
var dependencies = ['Matrix', 'config'];
|
12
12
|
export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _ref => {
|
13
13
|
var {
|
14
|
-
Matrix
|
14
|
+
Matrix,
|
15
|
+
config
|
15
16
|
} = _ref;
|
16
17
|
/**
|
17
18
|
* Dense Matrix implementation. A regular, dense matrix, supporting multi-dimensional matrices. This is the default matrix type.
|
@@ -221,7 +222,7 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
221
222
|
if (!isIndex(index)) {
|
222
223
|
throw new TypeError('Invalid index');
|
223
224
|
}
|
224
|
-
var isScalar = index.isScalar();
|
225
|
+
var isScalar = config.legacySubset ? index.size().every(idx => idx === 1) : index.isScalar();
|
225
226
|
if (isScalar) {
|
226
227
|
// return a scalar
|
227
228
|
return matrix.get(index.min());
|
@@ -241,12 +242,12 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
241
242
|
}
|
242
243
|
|
243
244
|
// retrieve submatrix
|
244
|
-
var returnMatrix = new DenseMatrix(
|
245
|
+
var returnMatrix = new DenseMatrix();
|
245
246
|
var submatrix = _getSubmatrix(matrix._data, index);
|
246
247
|
returnMatrix._size = submatrix.size;
|
247
248
|
returnMatrix._datatype = matrix._datatype;
|
248
249
|
returnMatrix._data = submatrix.data;
|
249
|
-
return returnMatrix;
|
250
|
+
return config.legacySubset ? returnMatrix.reshape(index.size()) : returnMatrix;
|
250
251
|
}
|
251
252
|
}
|
252
253
|
|
@@ -264,22 +265,30 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
264
265
|
var size = Array(maxDepth);
|
265
266
|
return {
|
266
267
|
data: getSubmatrixRecursive(data),
|
267
|
-
size
|
268
|
+
size: size.filter(x => x !== null)
|
268
269
|
};
|
269
270
|
function getSubmatrixRecursive(data) {
|
270
271
|
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
271
|
-
var
|
272
|
-
|
272
|
+
var dims = index.dimension(depth);
|
273
|
+
function _mapIndex(dim, callback) {
|
274
|
+
// applies a callback for when the index is a Number or a Matrix
|
275
|
+
if (isNumber(dim)) return callback(dim);else return dim.map(callback).valueOf();
|
276
|
+
}
|
277
|
+
if (isNumber(dims)) {
|
278
|
+
size[depth] = null;
|
279
|
+
} else {
|
280
|
+
size[depth] = dims.size()[0];
|
281
|
+
}
|
273
282
|
if (depth < maxDepth) {
|
274
|
-
return
|
275
|
-
validateIndex(
|
276
|
-
return getSubmatrixRecursive(data[
|
277
|
-
})
|
283
|
+
return _mapIndex(dims, dimIndex => {
|
284
|
+
validateIndex(dimIndex, data.length);
|
285
|
+
return getSubmatrixRecursive(data[dimIndex], depth + 1);
|
286
|
+
});
|
278
287
|
} else {
|
279
|
-
return
|
280
|
-
validateIndex(
|
281
|
-
return data[
|
282
|
-
})
|
288
|
+
return _mapIndex(dims, dimIndex => {
|
289
|
+
validateIndex(dimIndex, data.length);
|
290
|
+
return data[dimIndex];
|
291
|
+
});
|
283
292
|
}
|
284
293
|
}
|
285
294
|
}
|
@@ -306,18 +315,18 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
306
315
|
var isScalar = index.isScalar();
|
307
316
|
|
308
317
|
// calculate the size of the submatrix, and convert it into an Array if needed
|
309
|
-
var
|
318
|
+
var submatrixSize;
|
310
319
|
if (isMatrix(submatrix)) {
|
311
|
-
|
320
|
+
submatrixSize = submatrix.size();
|
312
321
|
submatrix = submatrix.valueOf();
|
313
322
|
} else {
|
314
|
-
|
323
|
+
submatrixSize = arraySize(submatrix);
|
315
324
|
}
|
316
325
|
if (isScalar) {
|
317
326
|
// set a scalar
|
318
327
|
|
319
328
|
// check whether submatrix is a scalar
|
320
|
-
if (
|
329
|
+
if (submatrixSize.length !== 0) {
|
321
330
|
throw new TypeError('Scalar expected');
|
322
331
|
}
|
323
332
|
matrix.set(index.min(), submatrix, defaultValue);
|
@@ -325,26 +334,26 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
325
334
|
// set a submatrix
|
326
335
|
|
327
336
|
// broadcast submatrix
|
328
|
-
if (!deepStrictEqual(
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
337
|
+
if (!deepStrictEqual(submatrixSize, iSize)) {
|
338
|
+
if (submatrixSize.length === 0) {
|
339
|
+
submatrix = broadcastTo([submatrix], iSize);
|
340
|
+
} else {
|
341
|
+
try {
|
333
342
|
submatrix = broadcastTo(submatrix, iSize);
|
334
|
-
}
|
335
|
-
|
336
|
-
|
343
|
+
} catch (error) {}
|
344
|
+
}
|
345
|
+
submatrixSize = arraySize(submatrix);
|
337
346
|
}
|
338
347
|
|
339
348
|
// validate dimensions
|
340
349
|
if (iSize.length < matrix._size.length) {
|
341
350
|
throw new DimensionError(iSize.length, matrix._size.length, '<');
|
342
351
|
}
|
343
|
-
if (
|
352
|
+
if (submatrixSize.length < iSize.length) {
|
344
353
|
// calculate number of missing outer dimensions
|
345
354
|
var i = 0;
|
346
355
|
var outer = 0;
|
347
|
-
while (iSize[i] === 1 &&
|
356
|
+
while (iSize[i] === 1 && submatrixSize[i] === 1) {
|
348
357
|
i++;
|
349
358
|
}
|
350
359
|
while (iSize[i] === 1) {
|
@@ -353,12 +362,12 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
353
362
|
}
|
354
363
|
|
355
364
|
// unsqueeze both outer and inner dimensions
|
356
|
-
submatrix = unsqueeze(submatrix, iSize.length, outer,
|
365
|
+
submatrix = unsqueeze(submatrix, iSize.length, outer, submatrixSize);
|
357
366
|
}
|
358
367
|
|
359
368
|
// check whether the size of the submatrix matches the index size
|
360
|
-
if (!deepStrictEqual(iSize,
|
361
|
-
throw new DimensionError(iSize,
|
369
|
+
if (!deepStrictEqual(iSize, submatrixSize)) {
|
370
|
+
throw new DimensionError(iSize, submatrixSize, '>');
|
362
371
|
}
|
363
372
|
|
364
373
|
// enlarge matrix when needed
|
@@ -387,16 +396,18 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
387
396
|
function setSubmatrixRecursive(data, submatrix) {
|
388
397
|
var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
389
398
|
var range = index.dimension(depth);
|
399
|
+
var recursiveCallback = (rangeIndex, i) => {
|
400
|
+
validateIndex(rangeIndex, data.length);
|
401
|
+
setSubmatrixRecursive(data[rangeIndex], submatrix[i[0]], depth + 1);
|
402
|
+
};
|
403
|
+
var finalCallback = (rangeIndex, i) => {
|
404
|
+
validateIndex(rangeIndex, data.length);
|
405
|
+
data[rangeIndex] = submatrix[i[0]];
|
406
|
+
};
|
390
407
|
if (depth < maxDepth) {
|
391
|
-
range
|
392
|
-
validateIndex(rangeIndex, data.length);
|
393
|
-
setSubmatrixRecursive(data[rangeIndex], submatrix[i[0]], depth + 1);
|
394
|
-
});
|
408
|
+
if (isNumber(range)) recursiveCallback(range, [0]);else range.forEach(recursiveCallback);
|
395
409
|
} else {
|
396
|
-
range
|
397
|
-
validateIndex(rangeIndex, data.length);
|
398
|
-
data[rangeIndex] = submatrix[i[0]];
|
399
|
-
});
|
410
|
+
if (isNumber(range)) finalCallback(range, [0]);else range.forEach(finalCallback);
|
400
411
|
}
|
401
412
|
}
|
402
413
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { isArray, isMatrix, isRange } from '../../utils/is.js';
|
1
|
+
import { isArray, isMatrix, isRange, isNumber, isString } from '../../utils/is.js';
|
2
2
|
import { clone } from '../../utils/object.js';
|
3
3
|
import { isInteger } from '../../utils/number.js';
|
4
4
|
import { factory } from '../../utils/factory.js';
|
@@ -31,7 +31,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
31
31
|
* @Constructor Index
|
32
32
|
* @param {...*} ranges
|
33
33
|
*/
|
34
|
-
function Index(
|
34
|
+
function Index() {
|
35
35
|
if (!(this instanceof Index)) {
|
36
36
|
throw new SyntaxError('Constructor must be called with the new operator');
|
37
37
|
}
|
@@ -39,7 +39,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
39
39
|
this._sourceSize = [];
|
40
40
|
this._isScalar = true;
|
41
41
|
for (var i = 0, ii = arguments.length; i < ii; i++) {
|
42
|
-
var arg = arguments[i];
|
42
|
+
var arg = i < 0 || arguments.length <= i ? undefined : arguments[i];
|
43
43
|
var argIsArray = isArray(arg);
|
44
44
|
var argIsMatrix = isMatrix(arg);
|
45
45
|
var argType = typeof arg;
|
@@ -50,6 +50,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
50
50
|
} else if (argIsArray || argIsMatrix) {
|
51
51
|
// create matrix
|
52
52
|
var m = void 0;
|
53
|
+
this._isScalar = false;
|
53
54
|
if (getMatrixDataType(arg) === 'boolean') {
|
54
55
|
if (argIsArray) m = _createImmutableMatrix(_booleansArrayToNumbersForIndex(arg).valueOf());
|
55
56
|
if (argIsMatrix) m = _createImmutableMatrix(_booleansArrayToNumbersForIndex(arg._data).valueOf());
|
@@ -58,16 +59,10 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
58
59
|
m = _createImmutableMatrix(arg.valueOf());
|
59
60
|
}
|
60
61
|
this._dimensions.push(m);
|
61
|
-
// size
|
62
|
-
var size = m.size();
|
63
|
-
// scalar
|
64
|
-
if (size.length !== 1 || size[0] !== 1 || sourceSize !== null) {
|
65
|
-
this._isScalar = false;
|
66
|
-
}
|
67
62
|
} else if (argType === 'number') {
|
68
|
-
this._dimensions.push(
|
63
|
+
this._dimensions.push(arg);
|
69
64
|
} else if (argType === 'bigint') {
|
70
|
-
this._dimensions.push(
|
65
|
+
this._dimensions.push(Number(arg));
|
71
66
|
} else if (argType === 'string') {
|
72
67
|
// object property (arguments.count should be 1)
|
73
68
|
this._dimensions.push(arg);
|
@@ -87,12 +82,15 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
87
82
|
function _createImmutableMatrix(arg) {
|
88
83
|
// loop array elements
|
89
84
|
for (var i = 0, l = arg.length; i < l; i++) {
|
90
|
-
if (
|
85
|
+
if (!isNumber(arg[i]) || !isInteger(arg[i])) {
|
91
86
|
throw new TypeError('Index parameters must be positive integer numbers');
|
92
87
|
}
|
93
88
|
}
|
94
89
|
// create matrix
|
95
|
-
|
90
|
+
var matrix = new ImmutableDenseMatrix();
|
91
|
+
matrix._data = arg;
|
92
|
+
matrix._size = [arg.length];
|
93
|
+
return matrix;
|
96
94
|
}
|
97
95
|
|
98
96
|
/**
|
@@ -130,7 +128,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
130
128
|
var size = [];
|
131
129
|
for (var i = 0, ii = this._dimensions.length; i < ii; i++) {
|
132
130
|
var d = this._dimensions[i];
|
133
|
-
size[i] =
|
131
|
+
size[i] = isString(d) || isNumber(d) ? 1 : d.size()[0];
|
134
132
|
}
|
135
133
|
return size;
|
136
134
|
};
|
@@ -144,7 +142,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
144
142
|
var values = [];
|
145
143
|
for (var i = 0, ii = this._dimensions.length; i < ii; i++) {
|
146
144
|
var range = this._dimensions[i];
|
147
|
-
values[i] =
|
145
|
+
values[i] = isString(range) || isNumber(range) ? range : range.max();
|
148
146
|
}
|
149
147
|
return values;
|
150
148
|
};
|
@@ -158,7 +156,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
158
156
|
var values = [];
|
159
157
|
for (var i = 0, ii = this._dimensions.length; i < ii; i++) {
|
160
158
|
var range = this._dimensions[i];
|
161
|
-
values[i] =
|
159
|
+
values[i] = isString(range) || isNumber(range) ? range : range.min();
|
162
160
|
}
|
163
161
|
return values;
|
164
162
|
};
|
@@ -183,10 +181,11 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
183
181
|
* @returns {Range | null} range
|
184
182
|
*/
|
185
183
|
Index.prototype.dimension = function (dim) {
|
186
|
-
|
184
|
+
var _this$_dimensions$dim;
|
185
|
+
if (!isNumber(dim)) {
|
187
186
|
return null;
|
188
187
|
}
|
189
|
-
return this._dimensions[dim]
|
188
|
+
return (_this$_dimensions$dim = this._dimensions[dim]) !== null && _this$_dimensions$dim !== void 0 ? _this$_dimensions$dim : null;
|
190
189
|
};
|
191
190
|
|
192
191
|
/**
|
@@ -194,7 +193,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
194
193
|
* @returns {boolean} Returns true if the index is an object property
|
195
194
|
*/
|
196
195
|
Index.prototype.isObjectProperty = function () {
|
197
|
-
return this._dimensions.length === 1 &&
|
196
|
+
return this._dimensions.length === 1 && isString(this._dimensions[0]);
|
198
197
|
};
|
199
198
|
|
200
199
|
/**
|
@@ -228,7 +227,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
228
227
|
var array = [];
|
229
228
|
for (var i = 0, ii = this._dimensions.length; i < ii; i++) {
|
230
229
|
var dimension = this._dimensions[i];
|
231
|
-
array.push(
|
230
|
+
array.push(isString(dimension) || isNumber(dimension) ? dimension : dimension.toArray());
|
232
231
|
}
|
233
232
|
return array;
|
234
233
|
};
|
@@ -250,7 +249,7 @@ export var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
250
249
|
var strings = [];
|
251
250
|
for (var i = 0, ii = this._dimensions.length; i < ii; i++) {
|
252
251
|
var dimension = this._dimensions[i];
|
253
|
-
if (
|
252
|
+
if (isString(dimension)) {
|
254
253
|
strings.push(JSON.stringify(dimension));
|
255
254
|
} else {
|
256
255
|
strings.push(dimension.toString());
|