mathjs 14.4.0 → 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.
Files changed (40) hide show
  1. package/HISTORY.md +11 -0
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/constants.js +12 -12
  7. package/lib/cjs/core/create.js +1 -2
  8. package/lib/cjs/defaultInstance.js +1 -2
  9. package/lib/cjs/entry/allFactoriesAny.js +1 -2
  10. package/lib/cjs/entry/allFactoriesNumber.js +1 -2
  11. package/lib/cjs/expression/embeddedDocs/construction/index.js +1 -1
  12. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  13. package/lib/cjs/expression/embeddedDocs/function/expression/compile.js +14 -0
  14. package/lib/cjs/expression/embeddedDocs/function/expression/evaluate.js +1 -1
  15. package/lib/cjs/expression/embeddedDocs/function/expression/parse.js +14 -0
  16. package/lib/cjs/expression/embeddedDocs/function/expression/parser.js +14 -0
  17. package/lib/cjs/expression/embeddedDocs/function/statistics/sum.js +1 -1
  18. package/lib/cjs/expression/function/parser.js +1 -1
  19. package/lib/cjs/expression/parse.js +3 -2
  20. package/lib/cjs/function/arithmetic/add.js +33 -33
  21. package/lib/cjs/header.js +2 -2
  22. package/lib/cjs/type/matrix/DenseMatrix.js +127 -91
  23. package/lib/cjs/type/unit/Unit.js +19 -4
  24. package/lib/cjs/utils/snapshot.js +1 -2
  25. package/lib/cjs/version.js +1 -1
  26. package/lib/esm/constants.js +12 -12
  27. package/lib/esm/expression/embeddedDocs/construction/index.js +1 -1
  28. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
  29. package/lib/esm/expression/embeddedDocs/function/expression/compile.js +8 -0
  30. package/lib/esm/expression/embeddedDocs/function/expression/evaluate.js +1 -1
  31. package/lib/esm/expression/embeddedDocs/function/expression/parse.js +8 -0
  32. package/lib/esm/expression/embeddedDocs/function/expression/parser.js +8 -0
  33. package/lib/esm/expression/embeddedDocs/function/statistics/sum.js +1 -1
  34. package/lib/esm/expression/function/parser.js +1 -1
  35. package/lib/esm/expression/parse.js +3 -2
  36. package/lib/esm/function/arithmetic/add.js +33 -33
  37. package/lib/esm/type/matrix/DenseMatrix.js +133 -97
  38. package/lib/esm/type/unit/Unit.js +19 -4
  39. package/lib/esm/version.js +1 -1
  40. package/package.json +17 -17
@@ -76,47 +76,47 @@ const createLOG2E = exports.createLOG2E = /* #__PURE__ */recreateFactory('LOG2E'
76
76
  } = _ref9;
77
77
  return config.number === 'BigNumber' ? new BigNumber(1).div(new BigNumber(2).ln()) : Math.LOG2E;
78
78
  });
79
- const createLOG10E = exports.createLOG10E = /* #__PURE__ */recreateFactory('LOG10E', ['config', '?BigNumber'], _ref10 => {
79
+ const createLOG10E = exports.createLOG10E = /* #__PURE__ */recreateFactory('LOG10E', ['config', '?BigNumber'], _ref0 => {
80
80
  let {
81
81
  config,
82
82
  BigNumber
83
- } = _ref10;
83
+ } = _ref0;
84
84
  return config.number === 'BigNumber' ? new BigNumber(1).div(new BigNumber(10).ln()) : Math.LOG10E;
85
85
  });
86
86
  const createSQRT1_2 = exports.createSQRT1_2 = /* #__PURE__ */recreateFactory(
87
87
  // eslint-disable-line camelcase
88
- 'SQRT1_2', ['config', '?BigNumber'], _ref11 => {
88
+ 'SQRT1_2', ['config', '?BigNumber'], _ref1 => {
89
89
  let {
90
90
  config,
91
91
  BigNumber
92
- } = _ref11;
92
+ } = _ref1;
93
93
  return config.number === 'BigNumber' ? new BigNumber('0.5').sqrt() : Math.SQRT1_2;
94
94
  });
95
- const createSQRT2 = exports.createSQRT2 = /* #__PURE__ */recreateFactory('SQRT2', ['config', '?BigNumber'], _ref12 => {
95
+ const createSQRT2 = exports.createSQRT2 = /* #__PURE__ */recreateFactory('SQRT2', ['config', '?BigNumber'], _ref10 => {
96
96
  let {
97
97
  config,
98
98
  BigNumber
99
- } = _ref12;
99
+ } = _ref10;
100
100
  return config.number === 'BigNumber' ? new BigNumber(2).sqrt() : Math.SQRT2;
101
101
  });
102
- const createI = exports.createI = /* #__PURE__ */recreateFactory('i', ['Complex'], _ref13 => {
102
+ const createI = exports.createI = /* #__PURE__ */recreateFactory('i', ['Complex'], _ref11 => {
103
103
  let {
104
104
  Complex
105
- } = _ref13;
105
+ } = _ref11;
106
106
  return Complex.I;
107
107
  });
108
108
 
109
109
  // for backward compatibility with v5
110
- const createUppercasePi = exports.createUppercasePi = /* #__PURE__ */(0, _factory.factory)('PI', ['pi'], _ref14 => {
110
+ const createUppercasePi = exports.createUppercasePi = /* #__PURE__ */(0, _factory.factory)('PI', ['pi'], _ref12 => {
111
111
  let {
112
112
  pi
113
- } = _ref14;
113
+ } = _ref12;
114
114
  return pi;
115
115
  });
116
- const createUppercaseE = exports.createUppercaseE = /* #__PURE__ */(0, _factory.factory)('E', ['e'], _ref15 => {
116
+ const createUppercaseE = exports.createUppercaseE = /* #__PURE__ */(0, _factory.factory)('E', ['e'], _ref13 => {
117
117
  let {
118
118
  e
119
- } = _ref15;
119
+ } = _ref13;
120
120
  return e;
121
121
  });
122
122
  const createVersion = exports.createVersion = /* #__PURE__ */(0, _factory.factory)('version', [], () => _version.version);
@@ -17,8 +17,7 @@ var emitter = _interopRequireWildcard(require("./../utils/emitter.js"));
17
17
  var _config = require("./config.js");
18
18
  var _config2 = require("./function/config.js");
19
19
  var _import = require("./function/import.js");
20
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
22
21
  /**
23
22
  * Create a mathjs instance from given factory functions and optionally config
24
23
  *
@@ -6,6 +6,5 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var all = _interopRequireWildcard(require("./factoriesAny.js"));
8
8
  var _create = require("./core/create.js");
9
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
9
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
10
  var _default = exports.default = (0, _create.create)(all);
@@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.all = void 0;
7
7
  var allFactories = _interopRequireWildcard(require("../factoriesAny.js"));
8
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
9
  // creating all factories here in a separate file is needed to get tree-shaking working
11
10
 
12
11
  const all = exports.all = allFactories;
@@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.all = void 0;
7
7
  var allFactories = _interopRequireWildcard(require("../factoriesNumber.js"));
8
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
9
  // creating all factories here in a separate file is needed to get tree-shaking working
11
10
 
12
11
  const all = exports.all = allFactories;
@@ -10,5 +10,5 @@ const indexDocs = exports.indexDocs = {
10
10
  syntax: ['[start]', '[start:end]', '[start:step:end]', '[start1, start 2, ...]', '[start1:end1, start2:end2, ...]', '[start1:step1:end1, start2:step2:end2, ...]'],
11
11
  description: 'Create an index to get or replace a subset of a matrix',
12
12
  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]'],
13
- seealso: ['bignumber', 'boolean', 'complex', 'matrix,', 'number', 'range', 'string', 'unit']
13
+ seealso: ['bignumber', 'boolean', 'complex', 'matrix', 'number', 'range', 'string', 'unit']
14
14
  };
@@ -110,6 +110,9 @@ var _conj = require("./function/complex/conj.js");
110
110
  var _im = require("./function/complex/im.js");
111
111
  var _re = require("./function/complex/re.js");
112
112
  var _evaluate = require("./function/expression/evaluate.js");
113
+ var _parser = require("./function/expression/parser.js");
114
+ var _parse = require("./function/expression/parse.js");
115
+ var _compile = require("./function/expression/compile.js");
113
116
  var _help = require("./function/expression/help.js");
114
117
  var _distance = require("./function/geometry/distance.js");
115
118
  var _intersect = require("./function/geometry/intersect.js");
@@ -570,6 +573,9 @@ const embeddedDocs = exports.embeddedDocs = {
570
573
  // functions - expression
571
574
  evaluate: _evaluate.evaluateDocs,
572
575
  help: _help.helpDocs,
576
+ parse: _parse.parseDocs,
577
+ parser: _parser.parserDocs,
578
+ compile: _compile.compileDocs,
573
579
  // functions - geometry
574
580
  distance: _distance.distanceDocs,
575
581
  intersect: _intersect.intersectDocs,
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.compileDocs = void 0;
7
+ const compileDocs = exports.compileDocs = {
8
+ name: 'compile',
9
+ category: 'Expression',
10
+ syntax: ['compile(expr) ', 'compile([expr1, expr2, expr3, ...])'],
11
+ description: 'Parse and compile an expression. Returns a an object with a function evaluate([scope]) to evaluate the compiled expression.',
12
+ examples: ['code1 = compile("sqrt(3^2 + 4^2)")', 'code1.evaluate() ', 'code2 = compile("a * b")', 'code2.evaluate({a: 3, b: 4})'],
13
+ seealso: ['parser', 'parse', 'evaluate']
14
+ };
@@ -10,5 +10,5 @@ const evaluateDocs = exports.evaluateDocs = {
10
10
  syntax: ['evaluate(expression)', 'evaluate(expression, scope)', 'evaluate([expr1, expr2, expr3, ...])', 'evaluate([expr1, expr2, expr3, ...], scope)'],
11
11
  description: 'Evaluate an expression or an array with expressions.',
12
12
  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"])'],
13
- seealso: []
13
+ seealso: ['parser', 'parse', 'compile']
14
14
  };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseDocs = void 0;
7
+ const parseDocs = exports.parseDocs = {
8
+ name: 'parse',
9
+ category: 'Expression',
10
+ syntax: ['parse(expr)', 'parse(expr, options)', 'parse([expr1, expr2, expr3, ...])', 'parse([expr1, expr2, expr3, ...], options)'],
11
+ 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().',
12
+ 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)'],
13
+ seealso: ['parser', 'evaluate', 'compile']
14
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parserDocs = void 0;
7
+ const parserDocs = exports.parserDocs = {
8
+ name: 'parser',
9
+ category: 'Expression',
10
+ syntax: ['parser()'],
11
+ description: 'Create a parser object that keeps a context of variables and their values, allowing the evaluation of expressions in that context.',
12
+ 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")'],
13
+ seealso: ['evaluate', 'parse', 'compile']
14
+ };
@@ -10,5 +10,5 @@ const sumDocs = exports.sumDocs = {
10
10
  syntax: ['sum(a, b, c, ...)', 'sum(A)', 'sum(A, dimension)'],
11
11
  description: 'Compute the sum of all values.',
12
12
  examples: ['sum(2, 3, 4, 1)', 'sum([2, 3, 4, 1])', 'sum([2, 5; 4, 3])'],
13
- seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']
13
+ seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'variance']
14
14
  };
@@ -13,7 +13,7 @@ const createParser = exports.createParser = /* #__PURE__ */(0, _factory.factory)
13
13
  Parser
14
14
  } = _ref;
15
15
  /**
16
- * Create a parser. The function creates a new `math.Parser` object.
16
+ * Create a `math.Parser` object that keeps a context of variables and their values, allowing the evaluation of expressions in that context.
17
17
  *
18
18
  * Syntax:
19
19
  *
@@ -36,7 +36,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
36
36
  } = _ref;
37
37
  /**
38
38
  * Parse an expression. Returns a node tree, which can be evaluated by
39
- * invoking node.evaluate().
39
+ * invoking node.evaluate() or transformed into a functional object via node.compile().
40
40
  *
41
41
  * Note the evaluating arbitrary expressions may involve security risks,
42
42
  * see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information.
@@ -55,6 +55,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
55
55
  *
56
56
  * let scope = {a:3, b:4}
57
57
  * const node2 = math.parse('a * b') // 12
58
+ * node2.evaluate(scope) // 12
58
59
  * const code2 = node2.compile()
59
60
  * code2.evaluate(scope) // 12
60
61
  * scope.a = 5
@@ -877,7 +878,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
877
878
  name = state.token;
878
879
  fn = operators[name];
879
880
  getTokenSkipNewline(state);
880
- if (name === 'in' && state.token === '') {
881
+ if (name === 'in' && '])},;'.includes(state.token)) {
881
882
  // end of expression -> this is the unit 'in' ('inch')
882
883
  node = new OperatorNode('*', 'multiply', [node, new SymbolNode('in')], true);
883
884
  } else {
@@ -38,39 +38,39 @@ const createAdd = exports.createAdd = /* #__PURE__ */(0, _factory.factory)(name,
38
38
  concat
39
39
  });
40
40
  /**
41
- * Add two or more values, `x + y`.
42
- * For matrices, the function is evaluated element wise.
43
- *
44
- * Syntax:
45
- *
46
- * math.add(x, y)
47
- * math.add(x, y, z, ...)
48
- *
49
- * Examples:
50
- *
51
- * math.add(2, 3) // returns number 5
52
- * math.add(2, 3, 4) // returns number 9
53
- *
54
- * const a = math.complex(2, 3)
55
- * const b = math.complex(-4, 1)
56
- * math.add(a, b) // returns Complex -2 + 4i
57
- *
58
- * math.add([1, 2, 3], 4) // returns Array [5, 6, 7]
59
- *
60
- * const c = math.unit('5 cm')
61
- * const d = math.unit('2.1 mm')
62
- * math.add(c, d) // returns Unit 52.1 mm
63
- *
64
- * math.add("2.3", "4") // returns number 6.3
65
- *
66
- * See also:
67
- *
68
- * subtract, sum
69
- *
70
- * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} x First value to add
71
- * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} y Second value to add
72
- * @return {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`
73
- */
41
+ * Add two or more values, `x + y`.
42
+ * For matrices, the function is evaluated element wise.
43
+ *
44
+ * Syntax:
45
+ *
46
+ * math.add(x, y)
47
+ * math.add(x, y, z, ...)
48
+ *
49
+ * Examples:
50
+ *
51
+ * math.add(2, 3) // returns number 5
52
+ * math.add(2, 3, 4) // returns number 9
53
+ *
54
+ * const a = math.complex(2, 3)
55
+ * const b = math.complex(-4, 1)
56
+ * math.add(a, b) // returns Complex -2 + 4i
57
+ *
58
+ * math.add([1, 2, 3], 4) // returns Array [5, 6, 7]
59
+ *
60
+ * const c = math.unit('5 cm')
61
+ * const d = math.unit('2.1 mm')
62
+ * math.add(c, d) // returns Unit 52.1 mm
63
+ *
64
+ * math.add("2.3", "4") // returns number 6.3
65
+ *
66
+ * See also:
67
+ *
68
+ * subtract, sum
69
+ *
70
+ * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} x First value to add
71
+ * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} y Second value to add
72
+ * @return {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`
73
+ */
74
74
  return typed(name, {
75
75
  'any, any': addScalar,
76
76
  'any, any, ...any': typed.referToSelf(self => (x, y, rest) => {
package/lib/cjs/header.js CHANGED
@@ -6,8 +6,8 @@
6
6
  * It features real and complex numbers, units, matrices, a large set of
7
7
  * mathematical functions, and a flexible expression parser.
8
8
  *
9
- * @version 14.4.0
10
- * @date 2025-03-28
9
+ * @version 14.5.0
10
+ * @date 2025-05-21
11
11
  *
12
12
  * @license
13
13
  * Copyright (C) 2013-2025 Jos de Jong <wjosdejong@gmail.com>
@@ -248,36 +248,46 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
248
248
  }
249
249
 
250
250
  // retrieve submatrix
251
- // TODO: more efficient when creating an empty matrix and setting _data and _size manually
252
- return new DenseMatrix(_getSubmatrix(matrix._data, index, size.length, 0), matrix._datatype);
251
+ const returnMatrix = new DenseMatrix([]);
252
+ const submatrix = _getSubmatrix(matrix._data, index);
253
+ returnMatrix._size = submatrix.size;
254
+ returnMatrix._datatype = matrix._datatype;
255
+ returnMatrix._data = submatrix.data;
256
+ return returnMatrix;
253
257
  }
254
258
  }
255
259
 
256
260
  /**
257
- * Recursively get a submatrix of a multi dimensional matrix.
261
+ * Get a submatrix of a multi dimensional matrix.
258
262
  * Index is not checked for correct number or length of dimensions.
259
263
  * @memberof DenseMatrix
260
264
  * @param {Array} data
261
265
  * @param {Index} index
262
- * @param {number} dims Total number of dimensions
263
- * @param {number} dim Current dimension
264
266
  * @return {Array} submatrix
265
267
  * @private
266
268
  */
267
- function _getSubmatrix(data, index, dims, dim) {
268
- const last = dim === dims - 1;
269
- const range = index.dimension(dim);
270
- if (last) {
271
- return range.map(function (i) {
272
- (0, _array.validateIndex)(i, data.length);
273
- return data[i];
274
- }).valueOf();
275
- } else {
276
- return range.map(function (i) {
277
- (0, _array.validateIndex)(i, data.length);
278
- const child = data[i];
279
- return _getSubmatrix(child, index, dims, dim + 1);
280
- }).valueOf();
269
+ function _getSubmatrix(data, index) {
270
+ const maxDepth = index.size().length - 1;
271
+ const size = Array(maxDepth);
272
+ return {
273
+ data: getSubmatrixRecursive(data),
274
+ size
275
+ };
276
+ function getSubmatrixRecursive(data) {
277
+ let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
278
+ const ranges = index.dimension(depth);
279
+ size[depth] = ranges.size()[0];
280
+ if (depth < maxDepth) {
281
+ return ranges.map(rangeIndex => {
282
+ (0, _array.validateIndex)(rangeIndex, data.length);
283
+ return getSubmatrixRecursive(data[rangeIndex], depth + 1);
284
+ }).valueOf();
285
+ } else {
286
+ return ranges.map(rangeIndex => {
287
+ (0, _array.validateIndex)(rangeIndex, data.length);
288
+ return data[rangeIndex];
289
+ }).valueOf();
290
+ }
281
291
  }
282
292
  }
283
293
 
@@ -365,9 +375,7 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
365
375
  _fit(matrix, size, defaultValue);
366
376
 
367
377
  // insert the sub matrix
368
- const dims = iSize.length;
369
- const dim = 0;
370
- _setSubmatrix(matrix._data, index, submatrix, dims, dim);
378
+ _setSubmatrix(matrix._data, index, submatrix);
371
379
  }
372
380
  return matrix;
373
381
  }
@@ -378,23 +386,25 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
378
386
  * @param {Array} data
379
387
  * @param {Index} index
380
388
  * @param {Array} submatrix
381
- * @param {number} dims Total number of dimensions
382
- * @param {number} dim
383
389
  * @private
384
390
  */
385
- function _setSubmatrix(data, index, submatrix, dims, dim) {
386
- const last = dim === dims - 1;
387
- const range = index.dimension(dim);
388
- if (last) {
389
- range.forEach(function (dataIndex, subIndex) {
390
- (0, _array.validateIndex)(dataIndex);
391
- data[dataIndex] = submatrix[subIndex[0]];
392
- });
393
- } else {
394
- range.forEach(function (dataIndex, subIndex) {
395
- (0, _array.validateIndex)(dataIndex);
396
- _setSubmatrix(data[dataIndex], index, submatrix[subIndex[0]], dims, dim + 1);
397
- });
391
+ function _setSubmatrix(data, index, submatrix) {
392
+ const maxDepth = index.size().length - 1;
393
+ setSubmatrixRecursive(data, submatrix);
394
+ function setSubmatrixRecursive(data, submatrix) {
395
+ let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
396
+ const range = index.dimension(depth);
397
+ if (depth < maxDepth) {
398
+ range.forEach((rangeIndex, i) => {
399
+ (0, _array.validateIndex)(rangeIndex, data.length);
400
+ setSubmatrixRecursive(data[rangeIndex], submatrix[i[0]], depth + 1);
401
+ });
402
+ } else {
403
+ range.forEach((rangeIndex, i) => {
404
+ (0, _array.validateIndex)(rangeIndex, data.length);
405
+ data[rangeIndex] = submatrix[i[0]];
406
+ });
407
+ }
398
408
  }
399
409
  }
400
410
 
@@ -525,84 +535,75 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
525
535
  };
526
536
 
527
537
  /**
528
- * Applies a callback function to a reference to each element of the matrix
538
+ * Create a new matrix with the results of the callback function executed on
539
+ * each entry of the matrix.
529
540
  * @memberof DenseMatrix
530
541
  * @param {Function} callback The callback function is invoked with three
531
- * parameters: the array containing the element,
532
- * the index of the element within that array (as an integer),
533
- * and for non unarry callbacks copy of the current index (as an array of integers).
542
+ * parameters: the value of the element, the index
543
+ * of the element, and the Matrix being traversed.
544
+ * @param {boolean} skipZeros If true, the callback function is invoked only for non-zero entries
545
+ * @param {boolean} isUnary If true, the callback function is invoked with one parameter
546
+ *
547
+ * @return {DenseMatrix} matrix
534
548
  */
535
- DenseMatrix.prototype._forEach = function (callback) {
536
- const isUnary = callback.length === 2; // callback has 2 parameters: value, index
537
- const maxDepth = this._size.length - 1;
538
- if (maxDepth < 0) return;
539
- if (isUnary) {
540
- iterateUnary(this._data);
541
- return;
549
+ DenseMatrix.prototype.map = function (callback) {
550
+ let skipZeros = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
551
+ let isUnary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
552
+ const me = this;
553
+ const maxDepth = me._size.length - 1;
554
+ if (maxDepth < 0) return me.clone();
555
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me, 'map', isUnary);
556
+ const fastCallbackFn = fastCallback.fn;
557
+ const result = me.create(undefined, me._datatype);
558
+ result._size = me._size;
559
+ if (isUnary || fastCallback.isUnary) {
560
+ result._data = iterateUnary(me._data);
561
+ return result;
542
562
  }
543
563
  if (maxDepth === 0) {
544
- for (let i = 0; i < this._data.length; i++) {
545
- callback(this._data, i, [i]);
564
+ const inputData = me.valueOf();
565
+ const data = Array(inputData.length);
566
+ for (let i = 0; i < inputData.length; i++) {
567
+ data[i] = fastCallbackFn(inputData[i], [i], me);
546
568
  }
547
- return;
569
+ result._data = data;
570
+ return result;
548
571
  }
549
- const index = new Array(maxDepth + 1);
550
- iterate(this._data);
572
+ const index = [];
573
+ result._data = iterate(me._data);
574
+ return result;
551
575
  function iterate(data) {
552
576
  let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
577
+ const result = Array(data.length);
553
578
  if (depth < maxDepth) {
554
579
  for (let i = 0; i < data.length; i++) {
555
580
  index[depth] = i;
556
- iterate(data[i], depth + 1);
581
+ result[i] = iterate(data[i], depth + 1);
557
582
  }
558
583
  } else {
559
584
  for (let i = 0; i < data.length; i++) {
560
585
  index[depth] = i;
561
- callback(data, i, index.slice());
586
+ result[i] = fastCallbackFn(data[i], index.slice(), me);
562
587
  }
563
588
  }
589
+ return result;
564
590
  }
565
591
  function iterateUnary(data) {
566
592
  let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
593
+ const result = Array(data.length);
567
594
  if (depth < maxDepth) {
568
595
  for (let i = 0; i < data.length; i++) {
569
- iterateUnary(data[i], depth + 1);
596
+ result[i] = iterateUnary(data[i], depth + 1);
570
597
  }
571
598
  } else {
572
599
  for (let i = 0; i < data.length; i++) {
573
- callback(data, i);
600
+ result[i] = fastCallbackFn(data[i]);
574
601
  }
575
602
  }
603
+ return result;
576
604
  }
577
605
  };
578
606
 
579
- /**
580
- * Create a new matrix with the results of the callback function executed on
581
- * each entry of the matrix.
582
- * @memberof DenseMatrix
583
- * @param {Function} callback The callback function is invoked with three
584
- * parameters: the value of the element, the index
585
- * of the element, and the Matrix being traversed.
586
- * @param {boolean} skipZeros If true, the callback function is invoked only for non-zero entries
587
- * @param {boolean} isUnary If true, the callback function is invoked with one parameter
588
- *
589
- * @return {DenseMatrix} matrix
590
- */
591
- DenseMatrix.prototype.map = function (callback) {
592
- let skipZeros = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
593
- let isUnary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
594
- const me = this;
595
- const result = new DenseMatrix(me);
596
- const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me._data, 'map', isUnary);
597
- const applyCallback = isUnary || fastCallback.isUnary ? (arr, i) => {
598
- arr[i] = fastCallback.fn(arr[i]);
599
- } : (arr, i, index) => {
600
- arr[i] = fastCallback.fn(arr[i], index, me);
601
- };
602
- result._forEach(applyCallback);
603
- return result;
604
- };
605
-
606
607
  /**
607
608
  * Execute a callback function on each entry of the matrix.
608
609
  * @memberof DenseMatrix
@@ -616,13 +617,48 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
616
617
  let skipZeros = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
617
618
  let isUnary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
618
619
  const me = this;
619
- const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me._data, 'map', isUnary);
620
- const applyCallback = isUnary || fastCallback.isUnary ? (arr, i) => {
621
- fastCallback.fn(arr[i]);
622
- } : (arr, i, index) => {
623
- fastCallback.fn(arr[i], index, me);
624
- };
625
- me._forEach(applyCallback);
620
+ const maxDepth = me._size.length - 1;
621
+ if (maxDepth < 0) return;
622
+ const fastCallback = (0, _optimizeCallback.optimizeCallback)(callback, me, 'map', isUnary);
623
+ const fastCallbackFn = fastCallback.fn;
624
+ if (isUnary || fastCallback.isUnary) {
625
+ iterateUnary(me._data);
626
+ return;
627
+ }
628
+ if (maxDepth === 0) {
629
+ for (let i = 0; i < me._data.length; i++) {
630
+ fastCallbackFn(me._data[i], [i], me);
631
+ }
632
+ return;
633
+ }
634
+ const index = [];
635
+ iterate(me._data);
636
+ function iterate(data) {
637
+ let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
638
+ if (depth < maxDepth) {
639
+ for (let i = 0; i < data.length; i++) {
640
+ index[depth] = i;
641
+ iterate(data[i], depth + 1);
642
+ }
643
+ } else {
644
+ for (let i = 0; i < data.length; i++) {
645
+ index[depth] = i;
646
+ fastCallbackFn(data[i], index.slice(), me);
647
+ }
648
+ }
649
+ }
650
+ function iterateUnary(data) {
651
+ let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
652
+ if (depth < maxDepth) {
653
+ for (let i = 0; i < data.length; i++) {
654
+ iterateUnary(data[i], depth + 1);
655
+ }
656
+ } else {
657
+ for (let i = 0; i < data.length; i++) {
658
+ fastCallbackFn(data[i]);
659
+ }
660
+ }
661
+ }
626
662
  };
627
663
 
628
664
  /**