mathjs 14.8.2 → 14.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +12 -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/entry/dependenciesAny/dependenciesRange.generated.js +4 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesRangeTransform.generated.js +4 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRange.generated.js +4 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRangeTransform.generated.js +4 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +2 -0
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +2 -0
- package/lib/cjs/entry/pureFunctionsAny.generated.js +2 -0
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +2 -0
- package/lib/cjs/expression/transform/range.transform.js +5 -1
- package/lib/cjs/function/matrix/map.js +117 -40
- package/lib/cjs/function/matrix/range.js +3 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/type/matrix/Range.js +3 -0
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesRange.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesRangeTransform.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRange.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRangeTransform.generated.js +4 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +2 -0
- package/lib/esm/entry/impureFunctionsNumber.generated.js +2 -0
- package/lib/esm/entry/pureFunctionsAny.generated.js +2 -0
- package/lib/esm/entry/pureFunctionsNumber.generated.js +2 -0
- package/lib/esm/expression/transform/range.transform.js +5 -1
- package/lib/esm/function/matrix/map.js +123 -40
- package/lib/esm/function/matrix/range.js +3 -1
- package/lib/esm/type/matrix/Range.js +4 -1
- package/lib/esm/version.js +1 -1
- package/package.json +7 -7
@@ -76,58 +76,141 @@ export var createMap = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
76
76
|
throw new Error('Last argument must be a callback function');
|
77
77
|
}
|
78
78
|
var firstArrayIsMatrix = Arrays[0].isMatrix;
|
79
|
-
var
|
79
|
+
var sizes = Arrays.map(M => M.isMatrix ? M.size() : arraySize(M));
|
80
|
+
var newSize = broadcastSizes(...sizes);
|
81
|
+
var numberOfArrays = Arrays.length;
|
80
82
|
var _get = firstArrayIsMatrix ? (matrix, idx) => matrix.get(idx) : get;
|
81
|
-
var
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
var numberOfArrays = Arrays.length;
|
90
|
-
var _callbackCase = _getCallbackCase(multiCallback, numberOfArrays);
|
91
|
-
callback = _getLimitedCallback(_callbackCase);
|
83
|
+
var firstValues = Arrays.map((collection, i) => {
|
84
|
+
var firstIndex = sizes[i].map(() => 0);
|
85
|
+
return collection.isMatrix ? collection.get(firstIndex) : get(collection, firstIndex);
|
86
|
+
});
|
87
|
+
var callbackArgCount = typed.isTypedFunction(multiCallback) ? _getTypedCallbackArgCount(multiCallback, firstValues, newSize.map(() => 0), Arrays) : _getCallbackArgCount(multiCallback, numberOfArrays);
|
88
|
+
if (callbackArgCount < 2) {
|
89
|
+
var _callback = _getLimitedCallback(callbackArgCount, multiCallback, null);
|
90
|
+
return mapMultiple(Arrays, _callback);
|
92
91
|
}
|
93
|
-
var
|
92
|
+
var broadcastedArrays = firstArrayIsMatrix ? Arrays.map(M => M.isMatrix ? M.create(broadcastTo(M.toArray(), newSize), M.datatype()) : Arrays[0].create(broadcastTo(M.valueOf(), newSize))) : Arrays.map(M => M.isMatrix ? broadcastTo(M.toArray(), newSize) : broadcastTo(M, newSize));
|
93
|
+
var callback = _getLimitedCallback(callbackArgCount, multiCallback, broadcastedArrays);
|
94
|
+
var broadcastedArraysCallback = (x, idx) => callback([x, ...broadcastedArrays.slice(1).map(array => _get(array, idx))], idx);
|
94
95
|
if (firstArrayIsMatrix) {
|
95
96
|
return broadcastedArrays[0].map(broadcastedArraysCallback);
|
96
97
|
} else {
|
97
98
|
return _mapArray(broadcastedArrays[0], broadcastedArraysCallback);
|
98
99
|
}
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
100
|
+
}
|
101
|
+
function mapMultiple(collections, callback) {
|
102
|
+
// collections can be matrices or arrays
|
103
|
+
// callback must be a function of the form (collections, [index])
|
104
|
+
var firstCollection = collections[0];
|
105
|
+
var arrays = collections.map(collection => collection.isMatrix ? collection.valueOf() : collection);
|
106
|
+
var sizes = collections.map(collection => collection.isMatrix ? collection.size() : arraySize(collection));
|
107
|
+
var finalSize = broadcastSizes(...sizes);
|
108
|
+
// the offset means for each initial array, how much smaller is it than the final size
|
109
|
+
var offsets = sizes.map(size => finalSize.length - size.length);
|
110
|
+
var maxDepth = finalSize.length - 1;
|
111
|
+
var callbackUsesIndex = callback.length > 1;
|
112
|
+
var index = callbackUsesIndex ? [] : null;
|
113
|
+
var resultsArray = iterate(arrays, 0);
|
114
|
+
if (firstCollection.isMatrix) {
|
115
|
+
var resultsMatrix = firstCollection.create();
|
116
|
+
resultsMatrix._data = resultsArray;
|
117
|
+
resultsMatrix._size = finalSize;
|
118
|
+
return resultsMatrix;
|
119
|
+
} else {
|
120
|
+
return resultsArray;
|
108
121
|
}
|
109
|
-
function
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
122
|
+
function iterate(arrays) {
|
123
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
124
|
+
// each array can have different sizes
|
125
|
+
var currentDimensionSize = finalSize[depth];
|
126
|
+
var result = Array(currentDimensionSize);
|
127
|
+
if (depth < maxDepth) {
|
128
|
+
var _loop = function _loop(i) {
|
129
|
+
if (index) index[depth] = i;
|
130
|
+
// if there is an offset greater than the current dimension
|
131
|
+
// pass the array, if the size of the array is 1 pass the first
|
132
|
+
// element of the array
|
133
|
+
result[i] = iterate(arrays.map((array, arrayIndex) => offsets[arrayIndex] > depth ? array : array.length === 1 ? array[0] : array[i]), depth + 1);
|
134
|
+
};
|
135
|
+
for (var i = 0; i < currentDimensionSize; i++) {
|
136
|
+
_loop(i);
|
137
|
+
}
|
138
|
+
} else {
|
139
|
+
var _loop2 = function _loop2(_i) {
|
140
|
+
if (index) index[depth] = _i;
|
141
|
+
result[_i] = callback(arrays.map(a => a.length === 1 ? a[0] : a[_i]), index ? index.slice() : undefined);
|
142
|
+
};
|
143
|
+
for (var _i = 0; _i < currentDimensionSize; _i++) {
|
144
|
+
_loop2(_i);
|
145
|
+
}
|
115
146
|
}
|
116
|
-
return
|
147
|
+
return result;
|
117
148
|
}
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
149
|
+
}
|
150
|
+
|
151
|
+
/**
|
152
|
+
* Creates a limited callback based on the argument pattern.
|
153
|
+
* @param {number} callbackArgCount - The argument pattern (0, 1, or 2)
|
154
|
+
* @param {Function} multiCallback - The original callback function
|
155
|
+
* @param {Array} broadcastedArrays - The broadcasted arrays (for case 2)
|
156
|
+
* @returns {Function} The limited callback function
|
157
|
+
*/
|
158
|
+
function _getLimitedCallback(callbackArgCount, multiCallback, broadcastedArrays) {
|
159
|
+
switch (callbackArgCount) {
|
160
|
+
case 0:
|
161
|
+
return x => multiCallback(...x);
|
162
|
+
case 1:
|
163
|
+
return (x, idx) => multiCallback(...x, idx);
|
164
|
+
case 2:
|
165
|
+
return (x, idx) => multiCallback(...x, idx, ...broadcastedArrays);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
/**
|
170
|
+
* Determines the argument pattern of a regular callback function.
|
171
|
+
* @param {Function} callback - The callback function to analyze
|
172
|
+
* @param {number} numberOfArrays - Number of arrays being processed
|
173
|
+
* @returns {number} 0 = values only, 1 = values + index, 2 = values + index + arrays
|
174
|
+
*/
|
175
|
+
function _getCallbackArgCount(callback, numberOfArrays) {
|
176
|
+
var callbackStr = callback.toString();
|
177
|
+
// Check if the callback function uses `arguments`
|
178
|
+
if (/arguments/.test(callbackStr)) return 2;
|
179
|
+
|
180
|
+
// Extract the parameters of the callback function
|
181
|
+
var paramsStr = callbackStr.match(/\(.*?\)/);
|
182
|
+
// Check if the callback function uses rest parameters
|
183
|
+
if (/\.\.\./.test(paramsStr)) return 2;
|
184
|
+
if (callback.length > numberOfArrays + 1) {
|
185
|
+
return 2;
|
186
|
+
}
|
187
|
+
if (callback.length === numberOfArrays + 1) {
|
188
|
+
return 1;
|
189
|
+
}
|
190
|
+
return 0;
|
191
|
+
}
|
192
|
+
|
193
|
+
/**
|
194
|
+
* Determines the argument pattern of a typed callback function.
|
195
|
+
* @param {Function} callback - The typed callback function to analyze
|
196
|
+
* @param {Array} values - Sample values for signature resolution
|
197
|
+
* @param {Array} idx - Sample index for signature resolution
|
198
|
+
* @param {Array} arrays - Sample arrays for signature resolution
|
199
|
+
* @returns {number} 0 = values only, 1 = values + index, 2 = values + index + arrays
|
200
|
+
*/
|
201
|
+
|
202
|
+
function _getTypedCallbackArgCount(callback, values, idx, arrays) {
|
203
|
+
if (typed.resolve(callback, [...values, idx, ...arrays]) !== null) {
|
204
|
+
return 2;
|
205
|
+
}
|
206
|
+
if (typed.resolve(callback, [...values, idx]) !== null) {
|
207
|
+
return 1;
|
208
|
+
}
|
209
|
+
if (typed.resolve(callback, values) !== null) {
|
129
210
|
return 0;
|
130
211
|
}
|
212
|
+
// this should never happen
|
213
|
+
return 0;
|
131
214
|
}
|
132
215
|
/**
|
133
216
|
* Map for a multi dimensional array
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { factory } from '../../utils/factory.js';
|
2
2
|
import { noBignumber, noMatrix } from '../../utils/noop.js';
|
3
3
|
var name = 'range';
|
4
|
-
var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isPositive'];
|
4
|
+
var dependencies = ['typed', 'config', '?matrix', '?bignumber', 'equal', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isZero', 'isPositive'];
|
5
5
|
export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
|
6
6
|
var {
|
7
7
|
typed,
|
@@ -13,6 +13,7 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
13
13
|
larger,
|
14
14
|
largerEq,
|
15
15
|
add,
|
16
|
+
isZero,
|
16
17
|
isPositive
|
17
18
|
} = _ref;
|
18
19
|
/**
|
@@ -181,6 +182,7 @@ export var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
181
182
|
*/
|
182
183
|
function _range(start, end, step, includeEnd) {
|
183
184
|
var array = [];
|
185
|
+
if (isZero(step)) throw new Error('Step must be non-zero');
|
184
186
|
var ongoing = isPositive(step) ? includeEnd ? smallerEq : smaller : includeEnd ? largerEq : larger;
|
185
187
|
var x = start;
|
186
188
|
while (ongoing(x, end)) {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { isBigInt, isBigNumber } from '../../utils/is.js';
|
2
|
-
import { format, sign } from '../../utils/number.js';
|
2
|
+
import { format, sign, nearlyEqual } from '../../utils/number.js';
|
3
3
|
import { factory } from '../../utils/factory.js';
|
4
4
|
var name = 'Range';
|
5
5
|
var dependencies = [];
|
@@ -73,6 +73,9 @@ export var createRangeClass = /* #__PURE__ */factory(name, dependencies, () => {
|
|
73
73
|
this.start = hasStart ? parseFloat(start) : 0;
|
74
74
|
this.end = hasEnd ? parseFloat(end) : 0;
|
75
75
|
this.step = hasStep ? parseFloat(step) : 1;
|
76
|
+
if (hasStep && nearlyEqual(this.step, 0)) {
|
77
|
+
throw new Error('Step must not be zero');
|
78
|
+
}
|
76
79
|
}
|
77
80
|
|
78
81
|
/**
|
package/lib/esm/version.js
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "mathjs",
|
3
|
-
"version": "14.
|
3
|
+
"version": "14.9.1",
|
4
4
|
"description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
|
5
5
|
"author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
|
6
6
|
"homepage": "https://mathjs.org",
|
@@ -44,15 +44,15 @@
|
|
44
44
|
"@babel/register": "7.28.3",
|
45
45
|
"@types/assert": "1.5.11",
|
46
46
|
"@types/mocha": "10.0.10",
|
47
|
-
"@typescript-eslint/eslint-plugin": "8.
|
48
|
-
"@typescript-eslint/parser": "8.
|
47
|
+
"@typescript-eslint/eslint-plugin": "8.46.0",
|
48
|
+
"@typescript-eslint/parser": "8.46.0",
|
49
49
|
"assert": "2.1.0",
|
50
50
|
"babel-loader": "10.0.0",
|
51
51
|
"c8": "10.1.3",
|
52
52
|
"codecov": "3.8.3",
|
53
53
|
"del": "8.0.1",
|
54
54
|
"eigen": "0.2.2",
|
55
|
-
"es-check": "9.
|
55
|
+
"es-check": "9.4.4",
|
56
56
|
"eslint": "8.57.1",
|
57
57
|
"eslint-config-prettier": "9.1.0",
|
58
58
|
"eslint-config-standard": "17.1.0",
|
@@ -77,7 +77,7 @@
|
|
77
77
|
"karma-webdriver-launcher": "1.0.8",
|
78
78
|
"karma-webpack": "5.0.1",
|
79
79
|
"mkdirp": "3.0.1",
|
80
|
-
"mocha": "11.7.
|
80
|
+
"mocha": "11.7.4",
|
81
81
|
"mocha-junit-reporter": "2.2.1",
|
82
82
|
"ndarray": "1.0.19",
|
83
83
|
"ndarray-determinant": "1.0.0",
|
@@ -91,8 +91,8 @@
|
|
91
91
|
"sylvester": "0.0.21",
|
92
92
|
"tinybench": "5.0.1",
|
93
93
|
"ts-node": "10.9.2",
|
94
|
-
"typescript": "5.9.
|
95
|
-
"webpack": "5.
|
94
|
+
"typescript": "5.9.3",
|
95
|
+
"webpack": "5.102.1",
|
96
96
|
"zeros": "1.0.0"
|
97
97
|
},
|
98
98
|
"type": "module",
|