mathjs 14.3.1 → 14.5.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 +28 -6
- package/README.md +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +2 -2
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/constants.js +12 -12
- package/lib/cjs/core/create.js +1 -2
- package/lib/cjs/defaultInstance.js +1 -2
- package/lib/cjs/entry/allFactoriesAny.js +1 -2
- package/lib/cjs/entry/allFactoriesNumber.js +1 -2
- package/lib/cjs/expression/embeddedDocs/construction/index.js +1 -1
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/cjs/expression/embeddedDocs/function/expression/compile.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/expression/evaluate.js +1 -1
- package/lib/cjs/expression/embeddedDocs/function/expression/parse.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/expression/parser.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/statistics/sum.js +1 -1
- package/lib/cjs/expression/function/parser.js +1 -1
- package/lib/cjs/expression/parse.js +4 -3
- package/lib/cjs/function/arithmetic/add.js +33 -33
- package/lib/cjs/function/arithmetic/hypot.js +1 -1
- package/lib/cjs/function/matrix/filter.js +4 -1
- package/lib/cjs/function/matrix/flatten.js +1 -1
- package/lib/cjs/function/matrix/forEach.js +2 -1
- package/lib/cjs/function/matrix/map.js +2 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/type/matrix/DenseMatrix.js +144 -81
- package/lib/cjs/type/matrix/SparseMatrix.js +4 -3
- package/lib/cjs/type/unit/Unit.js +19 -4
- package/lib/cjs/utils/array.js +31 -7
- package/lib/cjs/utils/collection.js +3 -3
- package/lib/cjs/utils/latex.js +4 -1
- package/lib/cjs/utils/optimizeCallback.js +61 -13
- package/lib/cjs/utils/snapshot.js +1 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/constants.js +12 -12
- package/lib/esm/expression/embeddedDocs/construction/index.js +1 -1
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/esm/expression/embeddedDocs/function/expression/compile.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/expression/evaluate.js +1 -1
- package/lib/esm/expression/embeddedDocs/function/expression/parse.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/expression/parser.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/statistics/sum.js +1 -1
- package/lib/esm/expression/function/parser.js +1 -1
- package/lib/esm/expression/parse.js +4 -3
- package/lib/esm/function/arithmetic/add.js +33 -33
- package/lib/esm/function/arithmetic/hypot.js +1 -1
- package/lib/esm/function/matrix/filter.js +4 -1
- package/lib/esm/function/matrix/flatten.js +1 -1
- package/lib/esm/function/matrix/forEach.js +2 -1
- package/lib/esm/function/matrix/map.js +2 -1
- package/lib/esm/type/matrix/DenseMatrix.js +150 -87
- package/lib/esm/type/matrix/SparseMatrix.js +4 -3
- package/lib/esm/type/unit/Unit.js +19 -4
- package/lib/esm/utils/array.js +33 -9
- package/lib/esm/utils/collection.js +3 -3
- package/lib/esm/utils/latex.js +4 -1
- package/lib/esm/utils/optimizeCallback.js +61 -13
- package/lib/esm/version.js +1 -1
- package/package.json +20 -20
@@ -4,5 +4,5 @@ export var indexDocs = {
|
|
4
4
|
syntax: ['[start]', '[start:end]', '[start:step:end]', '[start1, start 2, ...]', '[start1:end1, start2:end2, ...]', '[start1:step1:end1, start2:step2:end2, ...]'],
|
5
5
|
description: 'Create an index to get or replace a subset of a matrix',
|
6
6
|
examples: ['A = [1, 2, 3; 4, 5, 6]', 'A[1, :]', 'A[1, 2] = 50', 'A[1:2, 1:2] = 1', 'B = [1, 2, 3]', 'B[B>1 and B<3]'],
|
7
|
-
seealso: ['bignumber', 'boolean', 'complex', 'matrix
|
7
|
+
seealso: ['bignumber', 'boolean', 'complex', 'matrix', 'number', 'range', 'string', 'unit']
|
8
8
|
};
|
@@ -104,6 +104,9 @@ import { conjDocs } from './function/complex/conj.js';
|
|
104
104
|
import { imDocs } from './function/complex/im.js';
|
105
105
|
import { reDocs } from './function/complex/re.js';
|
106
106
|
import { evaluateDocs } from './function/expression/evaluate.js';
|
107
|
+
import { parserDocs } from './function/expression/parser.js';
|
108
|
+
import { parseDocs } from './function/expression/parse.js';
|
109
|
+
import { compileDocs } from './function/expression/compile.js';
|
107
110
|
import { helpDocs } from './function/expression/help.js';
|
108
111
|
import { distanceDocs } from './function/geometry/distance.js';
|
109
112
|
import { intersectDocs } from './function/geometry/intersect.js';
|
@@ -564,6 +567,9 @@ export var embeddedDocs = {
|
|
564
567
|
// functions - expression
|
565
568
|
evaluate: evaluateDocs,
|
566
569
|
help: helpDocs,
|
570
|
+
parse: parseDocs,
|
571
|
+
parser: parserDocs,
|
572
|
+
compile: compileDocs,
|
567
573
|
// functions - geometry
|
568
574
|
distance: distanceDocs,
|
569
575
|
intersect: intersectDocs,
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var compileDocs = {
|
2
|
+
name: 'compile',
|
3
|
+
category: 'Expression',
|
4
|
+
syntax: ['compile(expr) ', 'compile([expr1, expr2, expr3, ...])'],
|
5
|
+
description: 'Parse and compile an expression. Returns a an object with a function evaluate([scope]) to evaluate the compiled expression.',
|
6
|
+
examples: ['code1 = compile("sqrt(3^2 + 4^2)")', 'code1.evaluate() ', 'code2 = compile("a * b")', 'code2.evaluate({a: 3, b: 4})'],
|
7
|
+
seealso: ['parser', 'parse', 'evaluate']
|
8
|
+
};
|
@@ -4,5 +4,5 @@ export var evaluateDocs = {
|
|
4
4
|
syntax: ['evaluate(expression)', 'evaluate(expression, scope)', 'evaluate([expr1, expr2, expr3, ...])', 'evaluate([expr1, expr2, expr3, ...], scope)'],
|
5
5
|
description: 'Evaluate an expression or an array with expressions.',
|
6
6
|
examples: ['evaluate("2 + 3")', 'evaluate("sqrt(16)")', 'evaluate("2 inch to cm")', 'evaluate("sin(x * pi)", { "x": 1/2 })', 'evaluate(["width=2", "height=4","width*height"])'],
|
7
|
-
seealso: []
|
7
|
+
seealso: ['parser', 'parse', 'compile']
|
8
8
|
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var parseDocs = {
|
2
|
+
name: 'parse',
|
3
|
+
category: 'Expression',
|
4
|
+
syntax: ['parse(expr)', 'parse(expr, options)', 'parse([expr1, expr2, expr3, ...])', 'parse([expr1, expr2, expr3, ...], options)'],
|
5
|
+
description: 'Parse an expression. Returns a node tree, which can be evaluated by invoking node.evaluate() or transformed into a functional object via node.compile().',
|
6
|
+
examples: ['node1 = parse("sqrt(3^2 + 4^2)")', 'node1.evaluate()', 'code1 = node1.compile()', 'code1.evaluate()', 'scope = {a: 3, b: 4}', 'node2 = parse("a * b")', 'node2.evaluate(scope)', 'code2 = node2.compile()', 'code2.evaluate(scope)'],
|
7
|
+
seealso: ['parser', 'evaluate', 'compile']
|
8
|
+
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var parserDocs = {
|
2
|
+
name: 'parser',
|
3
|
+
category: 'Expression',
|
4
|
+
syntax: ['parser()'],
|
5
|
+
description: 'Create a parser object that keeps a context of variables and their values, allowing the evaluation of expressions in that context.',
|
6
|
+
examples: ['myParser = parser()', 'myParser.evaluate("sqrt(3^2 + 4^2)")', 'myParser.set("x", 3)', 'myParser.evaluate("y = x + 3")', 'myParser.evaluate(["y = x + 3", "y = y + 1"])', 'myParser.get("y")'],
|
7
|
+
seealso: ['evaluate', 'parse', 'compile']
|
8
|
+
};
|
@@ -4,5 +4,5 @@ export var sumDocs = {
|
|
4
4
|
syntax: ['sum(a, b, c, ...)', 'sum(A)', 'sum(A, dimension)'],
|
5
5
|
description: 'Compute the sum of all values.',
|
6
6
|
examples: ['sum(2, 3, 4, 1)', 'sum([2, 3, 4, 1])', 'sum([2, 5; 4, 3])'],
|
7
|
-
seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', '
|
7
|
+
seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'variance']
|
8
8
|
};
|
@@ -7,7 +7,7 @@ export var createParser = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
7
7
|
Parser
|
8
8
|
} = _ref;
|
9
9
|
/**
|
10
|
-
* Create a
|
10
|
+
* Create a `math.Parser` object that keeps a context of variables and their values, allowing the evaluation of expressions in that context.
|
11
11
|
*
|
12
12
|
* Syntax:
|
13
13
|
*
|
@@ -29,7 +29,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
29
29
|
} = _ref;
|
30
30
|
/**
|
31
31
|
* Parse an expression. Returns a node tree, which can be evaluated by
|
32
|
-
* invoking node.evaluate().
|
32
|
+
* invoking node.evaluate() or transformed into a functional object via node.compile().
|
33
33
|
*
|
34
34
|
* Note the evaluating arbitrary expressions may involve security risks,
|
35
35
|
* see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information.
|
@@ -48,6 +48,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
48
48
|
*
|
49
49
|
* let scope = {a:3, b:4}
|
50
50
|
* const node2 = math.parse('a * b') // 12
|
51
|
+
* node2.evaluate(scope) // 12
|
51
52
|
* const code2 = node2.compile()
|
52
53
|
* code2.evaluate(scope) // 12
|
53
54
|
* scope.a = 5
|
@@ -389,7 +390,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
389
390
|
if (parse.isDecimalMark(currentCharacter(state), nextCharacter(state))) {
|
390
391
|
throw createSyntaxError(state, 'Digit expected, got "' + currentCharacter(state) + '"');
|
391
392
|
}
|
392
|
-
} else if (nextCharacter(state)
|
393
|
+
} else if (parse.isDecimalMark(nextCharacter(state), state.expression.charAt(state.index + 2))) {
|
393
394
|
next(state);
|
394
395
|
throw createSyntaxError(state, 'Digit expected, got "' + currentCharacter(state) + '"');
|
395
396
|
}
|
@@ -870,7 +871,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
870
871
|
name = state.token;
|
871
872
|
fn = operators[name];
|
872
873
|
getTokenSkipNewline(state);
|
873
|
-
if (name === 'in' && state.token
|
874
|
+
if (name === 'in' && '])},;'.includes(state.token)) {
|
874
875
|
// end of expression -> this is the unit 'in' ('inch')
|
875
876
|
node = new OperatorNode('*', 'multiply', [node, new SymbolNode('in')], true);
|
876
877
|
} else {
|
@@ -32,39 +32,39 @@ export var createAdd = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
32
32
|
concat
|
33
33
|
});
|
34
34
|
/**
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
35
|
+
* Add two or more values, `x + y`.
|
36
|
+
* For matrices, the function is evaluated element wise.
|
37
|
+
*
|
38
|
+
* Syntax:
|
39
|
+
*
|
40
|
+
* math.add(x, y)
|
41
|
+
* math.add(x, y, z, ...)
|
42
|
+
*
|
43
|
+
* Examples:
|
44
|
+
*
|
45
|
+
* math.add(2, 3) // returns number 5
|
46
|
+
* math.add(2, 3, 4) // returns number 9
|
47
|
+
*
|
48
|
+
* const a = math.complex(2, 3)
|
49
|
+
* const b = math.complex(-4, 1)
|
50
|
+
* math.add(a, b) // returns Complex -2 + 4i
|
51
|
+
*
|
52
|
+
* math.add([1, 2, 3], 4) // returns Array [5, 6, 7]
|
53
|
+
*
|
54
|
+
* const c = math.unit('5 cm')
|
55
|
+
* const d = math.unit('2.1 mm')
|
56
|
+
* math.add(c, d) // returns Unit 52.1 mm
|
57
|
+
*
|
58
|
+
* math.add("2.3", "4") // returns number 6.3
|
59
|
+
*
|
60
|
+
* See also:
|
61
|
+
*
|
62
|
+
* subtract, sum
|
63
|
+
*
|
64
|
+
* @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} x First value to add
|
65
|
+
* @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} y Second value to add
|
66
|
+
* @return {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`
|
67
|
+
*/
|
68
68
|
return typed(name, {
|
69
69
|
'any, any': addScalar,
|
70
70
|
'any, any, ...any': typed.referToSelf(self => (x, y, rest) => {
|
@@ -45,7 +45,7 @@ export var createHypot = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
45
45
|
return typed(name, {
|
46
46
|
'... number | BigNumber': _hypot,
|
47
47
|
Array: _hypot,
|
48
|
-
Matrix: M => _hypot(flatten(M.toArray()))
|
48
|
+
Matrix: M => _hypot(flatten(M.toArray(), true))
|
49
49
|
});
|
50
50
|
|
51
51
|
/**
|
@@ -64,8 +64,11 @@ export var createFilter = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
64
64
|
*/
|
65
65
|
function _filterCallback(x, callback) {
|
66
66
|
var fastCallback = optimizeCallback(callback, x, 'filter');
|
67
|
+
if (fastCallback.isUnary) {
|
68
|
+
return filter(x, fastCallback.fn);
|
69
|
+
}
|
67
70
|
return filter(x, function (value, index, array) {
|
68
71
|
// invoke the callback function with the right number of arguments
|
69
|
-
return fastCallback(value, [index], array);
|
72
|
+
return fastCallback.fn(value, [index], array);
|
70
73
|
});
|
71
74
|
}
|
@@ -32,7 +32,7 @@ export var createFlatten = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
32
32
|
Matrix: function Matrix(x) {
|
33
33
|
// Return the same matrix type as x (Dense or Sparse Matrix)
|
34
34
|
// Return the same data type as x
|
35
|
-
return x.create(flattenArray(x.valueOf()), x.datatype());
|
35
|
+
return x.create(flattenArray(x.valueOf(), true), x.datatype());
|
36
36
|
}
|
37
37
|
});
|
38
38
|
});
|
@@ -52,5 +52,6 @@ export var createForEach = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
52
52
|
* @private
|
53
53
|
*/
|
54
54
|
function _forEach(array, callback) {
|
55
|
-
|
55
|
+
var fastCallback = optimizeCallback(callback, array, name);
|
56
|
+
deepForEach(array, fastCallback.fn, fastCallback.isUnary);
|
56
57
|
}
|
@@ -137,6 +137,7 @@ export var createMap = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
137
137
|
* @private
|
138
138
|
*/
|
139
139
|
function _mapArray(array, callback) {
|
140
|
-
|
140
|
+
var fastCallback = optimizeCallback(callback, array, name);
|
141
|
+
return deepMap(array, fastCallback.fn, fastCallback.isUnary);
|
141
142
|
}
|
142
143
|
});
|
@@ -241,36 +241,46 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
241
241
|
}
|
242
242
|
|
243
243
|
// retrieve submatrix
|
244
|
-
|
245
|
-
|
244
|
+
var returnMatrix = new DenseMatrix([]);
|
245
|
+
var submatrix = _getSubmatrix(matrix._data, index);
|
246
|
+
returnMatrix._size = submatrix.size;
|
247
|
+
returnMatrix._datatype = matrix._datatype;
|
248
|
+
returnMatrix._data = submatrix.data;
|
249
|
+
return returnMatrix;
|
246
250
|
}
|
247
251
|
}
|
248
252
|
|
249
253
|
/**
|
250
|
-
*
|
254
|
+
* Get a submatrix of a multi dimensional matrix.
|
251
255
|
* Index is not checked for correct number or length of dimensions.
|
252
256
|
* @memberof DenseMatrix
|
253
257
|
* @param {Array} data
|
254
258
|
* @param {Index} index
|
255
|
-
* @param {number} dims Total number of dimensions
|
256
|
-
* @param {number} dim Current dimension
|
257
259
|
* @return {Array} submatrix
|
258
260
|
* @private
|
259
261
|
*/
|
260
|
-
function _getSubmatrix(data, index
|
261
|
-
var
|
262
|
-
var
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
return
|
273
|
-
|
262
|
+
function _getSubmatrix(data, index) {
|
263
|
+
var maxDepth = index.size().length - 1;
|
264
|
+
var size = Array(maxDepth);
|
265
|
+
return {
|
266
|
+
data: getSubmatrixRecursive(data),
|
267
|
+
size
|
268
|
+
};
|
269
|
+
function getSubmatrixRecursive(data) {
|
270
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
271
|
+
var ranges = index.dimension(depth);
|
272
|
+
size[depth] = ranges.size()[0];
|
273
|
+
if (depth < maxDepth) {
|
274
|
+
return ranges.map(rangeIndex => {
|
275
|
+
validateIndex(rangeIndex, data.length);
|
276
|
+
return getSubmatrixRecursive(data[rangeIndex], depth + 1);
|
277
|
+
}).valueOf();
|
278
|
+
} else {
|
279
|
+
return ranges.map(rangeIndex => {
|
280
|
+
validateIndex(rangeIndex, data.length);
|
281
|
+
return data[rangeIndex];
|
282
|
+
}).valueOf();
|
283
|
+
}
|
274
284
|
}
|
275
285
|
}
|
276
286
|
|
@@ -358,9 +368,7 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
358
368
|
_fit(matrix, size, defaultValue);
|
359
369
|
|
360
370
|
// insert the sub matrix
|
361
|
-
|
362
|
-
var dim = 0;
|
363
|
-
_setSubmatrix(matrix._data, index, submatrix, dims, dim);
|
371
|
+
_setSubmatrix(matrix._data, index, submatrix);
|
364
372
|
}
|
365
373
|
return matrix;
|
366
374
|
}
|
@@ -371,23 +379,25 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
371
379
|
* @param {Array} data
|
372
380
|
* @param {Index} index
|
373
381
|
* @param {Array} submatrix
|
374
|
-
* @param {number} dims Total number of dimensions
|
375
|
-
* @param {number} dim
|
376
382
|
* @private
|
377
383
|
*/
|
378
|
-
function _setSubmatrix(data, index, submatrix
|
379
|
-
var
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
384
|
+
function _setSubmatrix(data, index, submatrix) {
|
385
|
+
var maxDepth = index.size().length - 1;
|
386
|
+
setSubmatrixRecursive(data, submatrix);
|
387
|
+
function setSubmatrixRecursive(data, submatrix) {
|
388
|
+
var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
389
|
+
var range = index.dimension(depth);
|
390
|
+
if (depth < maxDepth) {
|
391
|
+
range.forEach((rangeIndex, i) => {
|
392
|
+
validateIndex(rangeIndex, data.length);
|
393
|
+
setSubmatrixRecursive(data[rangeIndex], submatrix[i[0]], depth + 1);
|
394
|
+
});
|
395
|
+
} else {
|
396
|
+
range.forEach((rangeIndex, i) => {
|
397
|
+
validateIndex(rangeIndex, data.length);
|
398
|
+
data[rangeIndex] = submatrix[i[0]];
|
399
|
+
});
|
400
|
+
}
|
391
401
|
}
|
392
402
|
}
|
393
403
|
|
@@ -518,62 +528,73 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
518
528
|
};
|
519
529
|
|
520
530
|
/**
|
521
|
-
*
|
531
|
+
* Create a new matrix with the results of the callback function executed on
|
532
|
+
* each entry of the matrix.
|
522
533
|
* @memberof DenseMatrix
|
523
534
|
* @param {Function} callback The callback function is invoked with three
|
524
|
-
* parameters:
|
525
|
-
*
|
535
|
+
* parameters: the value of the element, the index
|
536
|
+
* of the element, and the Matrix being traversed.
|
537
|
+
* @param {boolean} skipZeros If true, the callback function is invoked only for non-zero entries
|
538
|
+
* @param {boolean} isUnary If true, the callback function is invoked with one parameter
|
539
|
+
*
|
540
|
+
* @return {DenseMatrix} matrix
|
526
541
|
*/
|
527
|
-
DenseMatrix.prototype.
|
542
|
+
DenseMatrix.prototype.map = function (callback) {
|
543
|
+
var skipZeros = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
544
|
+
var isUnary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
528
545
|
var me = this;
|
529
|
-
var
|
530
|
-
|
531
|
-
|
532
|
-
|
546
|
+
var maxDepth = me._size.length - 1;
|
547
|
+
if (maxDepth < 0) return me.clone();
|
548
|
+
var fastCallback = optimizeCallback(callback, me, 'map', isUnary);
|
549
|
+
var fastCallbackFn = fastCallback.fn;
|
550
|
+
var result = me.create(undefined, me._datatype);
|
551
|
+
result._size = me._size;
|
552
|
+
if (isUnary || fastCallback.isUnary) {
|
553
|
+
result._data = iterateUnary(me._data);
|
554
|
+
return result;
|
533
555
|
}
|
534
556
|
if (maxDepth === 0) {
|
535
|
-
var
|
536
|
-
|
537
|
-
|
557
|
+
var inputData = me.valueOf();
|
558
|
+
var data = Array(inputData.length);
|
559
|
+
for (var i = 0; i < inputData.length; i++) {
|
560
|
+
data[i] = fastCallbackFn(inputData[i], [i], me);
|
538
561
|
}
|
539
|
-
|
562
|
+
result._data = data;
|
563
|
+
return result;
|
540
564
|
}
|
541
|
-
var index =
|
542
|
-
|
543
|
-
|
565
|
+
var index = [];
|
566
|
+
result._data = iterate(me._data);
|
567
|
+
return result;
|
568
|
+
function iterate(data) {
|
569
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
570
|
+
var result = Array(data.length);
|
544
571
|
if (depth < maxDepth) {
|
545
|
-
for (var _i = 0; _i <
|
572
|
+
for (var _i = 0; _i < data.length; _i++) {
|
546
573
|
index[depth] = _i;
|
547
|
-
|
574
|
+
result[_i] = iterate(data[_i], depth + 1);
|
548
575
|
}
|
549
576
|
} else {
|
550
|
-
for (var _i2 = 0; _i2 <
|
577
|
+
for (var _i2 = 0; _i2 < data.length; _i2++) {
|
551
578
|
index[depth] = _i2;
|
552
|
-
|
579
|
+
result[_i2] = fastCallbackFn(data[_i2], index.slice(), me);
|
553
580
|
}
|
554
581
|
}
|
582
|
+
return result;
|
583
|
+
}
|
584
|
+
function iterateUnary(data) {
|
585
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
586
|
+
var result = Array(data.length);
|
587
|
+
if (depth < maxDepth) {
|
588
|
+
for (var _i3 = 0; _i3 < data.length; _i3++) {
|
589
|
+
result[_i3] = iterateUnary(data[_i3], depth + 1);
|
590
|
+
}
|
591
|
+
} else {
|
592
|
+
for (var _i4 = 0; _i4 < data.length; _i4++) {
|
593
|
+
result[_i4] = fastCallbackFn(data[_i4]);
|
594
|
+
}
|
595
|
+
}
|
596
|
+
return result;
|
555
597
|
}
|
556
|
-
recurse(me._data, 0);
|
557
|
-
};
|
558
|
-
|
559
|
-
/**
|
560
|
-
* Create a new matrix with the results of the callback function executed on
|
561
|
-
* each entry of the matrix.
|
562
|
-
* @memberof DenseMatrix
|
563
|
-
* @param {Function} callback The callback function is invoked with three
|
564
|
-
* parameters: the value of the element, the index
|
565
|
-
* of the element, and the Matrix being traversed.
|
566
|
-
*
|
567
|
-
* @return {DenseMatrix} matrix
|
568
|
-
*/
|
569
|
-
DenseMatrix.prototype.map = function (callback) {
|
570
|
-
var me = this;
|
571
|
-
var result = new DenseMatrix(me);
|
572
|
-
var fastCallback = optimizeCallback(callback, me._data, 'map');
|
573
|
-
result._forEach(function (arr, i, index) {
|
574
|
-
arr[i] = fastCallback(arr[i], index, me);
|
575
|
-
});
|
576
|
-
return result;
|
577
598
|
};
|
578
599
|
|
579
600
|
/**
|
@@ -582,13 +603,55 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
582
603
|
* @param {Function} callback The callback function is invoked with three
|
583
604
|
* parameters: the value of the element, the index
|
584
605
|
* of the element, and the Matrix being traversed.
|
606
|
+
* @param {boolean} skipZeros If true, the callback function is invoked only for non-zero entries
|
607
|
+
* @param {boolean} isUnary If true, the callback function is invoked with one parameter
|
585
608
|
*/
|
586
609
|
DenseMatrix.prototype.forEach = function (callback) {
|
610
|
+
var skipZeros = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
611
|
+
var isUnary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
587
612
|
var me = this;
|
588
|
-
var
|
589
|
-
|
590
|
-
|
591
|
-
|
613
|
+
var maxDepth = me._size.length - 1;
|
614
|
+
if (maxDepth < 0) return;
|
615
|
+
var fastCallback = optimizeCallback(callback, me, 'map', isUnary);
|
616
|
+
var fastCallbackFn = fastCallback.fn;
|
617
|
+
if (isUnary || fastCallback.isUnary) {
|
618
|
+
iterateUnary(me._data);
|
619
|
+
return;
|
620
|
+
}
|
621
|
+
if (maxDepth === 0) {
|
622
|
+
for (var i = 0; i < me._data.length; i++) {
|
623
|
+
fastCallbackFn(me._data[i], [i], me);
|
624
|
+
}
|
625
|
+
return;
|
626
|
+
}
|
627
|
+
var index = [];
|
628
|
+
iterate(me._data);
|
629
|
+
function iterate(data) {
|
630
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
631
|
+
if (depth < maxDepth) {
|
632
|
+
for (var _i5 = 0; _i5 < data.length; _i5++) {
|
633
|
+
index[depth] = _i5;
|
634
|
+
iterate(data[_i5], depth + 1);
|
635
|
+
}
|
636
|
+
} else {
|
637
|
+
for (var _i6 = 0; _i6 < data.length; _i6++) {
|
638
|
+
index[depth] = _i6;
|
639
|
+
fastCallbackFn(data[_i6], index.slice(), me);
|
640
|
+
}
|
641
|
+
}
|
642
|
+
}
|
643
|
+
function iterateUnary(data) {
|
644
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
645
|
+
if (depth < maxDepth) {
|
646
|
+
for (var _i7 = 0; _i7 < data.length; _i7++) {
|
647
|
+
iterateUnary(data[_i7], depth + 1);
|
648
|
+
}
|
649
|
+
} else {
|
650
|
+
for (var _i8 = 0; _i8 < data.length; _i8++) {
|
651
|
+
fastCallbackFn(data[_i8]);
|
652
|
+
}
|
653
|
+
}
|
654
|
+
}
|
592
655
|
};
|
593
656
|
|
594
657
|
/**
|
@@ -612,15 +675,15 @@ export var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _
|
|
612
675
|
var index = [];
|
613
676
|
var _recurse = function* recurse(value, depth) {
|
614
677
|
if (depth < maxDepth) {
|
615
|
-
for (var
|
616
|
-
index[depth] =
|
617
|
-
yield* _recurse(value[
|
678
|
+
for (var _i9 = 0; _i9 < value.length; _i9++) {
|
679
|
+
index[depth] = _i9;
|
680
|
+
yield* _recurse(value[_i9], depth + 1);
|
618
681
|
}
|
619
682
|
} else {
|
620
|
-
for (var
|
621
|
-
index[depth] =
|
683
|
+
for (var _i0 = 0; _i0 < value.length; _i0++) {
|
684
|
+
index[depth] = _i0;
|
622
685
|
yield {
|
623
|
-
value: value[
|
686
|
+
value: value[_i0],
|
624
687
|
index: index.slice()
|
625
688
|
};
|
626
689
|
}
|
@@ -876,7 +876,7 @@ export var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies,
|
|
876
876
|
// invoke callback
|
877
877
|
var invoke = function invoke(v, i, j) {
|
878
878
|
// invoke callback
|
879
|
-
return fastCallback(v, [i, j], me);
|
879
|
+
return fastCallback.fn(v, [i, j], me);
|
880
880
|
};
|
881
881
|
// invoke _map
|
882
882
|
return _map(this, 0, rows - 1, 0, columns - 1, invoke, skipZeros);
|
@@ -994,7 +994,8 @@ export var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies,
|
|
994
994
|
var i = this._index[k];
|
995
995
|
|
996
996
|
// value @ k
|
997
|
-
fastCallback
|
997
|
+
// TODO apply a non indexed version of algorithm in case fastCallback is not optimized
|
998
|
+
fastCallback.fn(this._values[k], [i, j], me);
|
998
999
|
}
|
999
1000
|
} else {
|
1000
1001
|
// create a cache holding all defined values
|
@@ -1008,7 +1009,7 @@ export var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies,
|
|
1008
1009
|
// and either read the value or zero
|
1009
1010
|
for (var _i7 = 0; _i7 < rows; _i7++) {
|
1010
1011
|
var value = _i7 in values ? values[_i7] : 0;
|
1011
|
-
fastCallback(value, [_i7, j], me);
|
1012
|
+
fastCallback.fn(value, [_i7, j], me);
|
1012
1013
|
}
|
1013
1014
|
}
|
1014
1015
|
}
|
@@ -618,8 +618,8 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
618
618
|
|
619
619
|
// If at least one operand has a value, then the result should also have a value
|
620
620
|
if (this.value !== null || other.value !== null) {
|
621
|
-
var valThis = this.value === null ? this._normalize(
|
622
|
-
var valOther = other.value === null ? other._normalize(
|
621
|
+
var valThis = this.value === null ? this._normalize(one(other.value)) : this.value;
|
622
|
+
var valOther = other.value === null ? other._normalize(one(this.value)) : other.value;
|
623
623
|
res.value = multiplyScalar(valThis, valOther);
|
624
624
|
} else {
|
625
625
|
res.value = null;
|
@@ -666,8 +666,8 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
666
666
|
|
667
667
|
// If at least one operand has a value, the result should have a value
|
668
668
|
if (this.value !== null || other.value !== null) {
|
669
|
-
var valThis = this.value === null ? this._normalize(
|
670
|
-
var valOther = other.value === null ? other._normalize(
|
669
|
+
var valThis = this.value === null ? this._normalize(one(other.value)) : this.value;
|
670
|
+
var valOther = other.value === null ? other._normalize(one(this.value)) : other.value;
|
671
671
|
res.value = divideScalar(valThis, valOther);
|
672
672
|
} else {
|
673
673
|
res.value = null;
|
@@ -723,6 +723,21 @@ export var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
723
723
|
}
|
724
724
|
}
|
725
725
|
|
726
|
+
/**
|
727
|
+
* Create a value one with the numeric type of `typeOfValue`.
|
728
|
+
* For example, `one(new BigNumber(3))` returns `BigNumber(1)`
|
729
|
+
* @param {number | Fraction | BigNumber} typeOfValue
|
730
|
+
* @returns {number | Fraction | BigNumber}
|
731
|
+
*/
|
732
|
+
function one(typeOfValue) {
|
733
|
+
// TODO: this is a workaround to prevent the following BigNumber conversion error from throwing:
|
734
|
+
// "TypeError: Cannot implicitly convert a number with >15 significant digits to BigNumber"
|
735
|
+
// see https://github.com/josdejong/mathjs/issues/3450
|
736
|
+
// https://github.com/josdejong/mathjs/pull/3375
|
737
|
+
var convert = Unit._getNumberConverter(typeOf(typeOfValue));
|
738
|
+
return convert(1);
|
739
|
+
}
|
740
|
+
|
726
741
|
/**
|
727
742
|
* Calculate the absolute value of a unit
|
728
743
|
* @memberof Unit
|