mathjs 9.4.0 → 9.4.4

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 (38) hide show
  1. package/HISTORY.md +39 -0
  2. package/README.md +1 -3
  3. package/docs/expressions/expression_trees.md +2 -1
  4. package/docs/expressions/parsing.md +1 -1
  5. package/docs/reference/functions/intersect.md +1 -1
  6. package/examples/advanced/custom_datatype.js +7 -4
  7. package/lib/browser/math.js +7 -7
  8. package/lib/browser/math.js.map +1 -1
  9. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +6 -9
  10. package/lib/cjs/entry/dependenciesAny/dependenciesIntersect.generated.js +3 -0
  11. package/lib/cjs/entry/impureFunctionsAny.generated.js +41 -41
  12. package/lib/cjs/entry/pureFunctionsAny.generated.js +128 -128
  13. package/lib/cjs/expression/node/ArrayNode.js +15 -15
  14. package/lib/cjs/expression/parse.js +1 -0
  15. package/lib/cjs/function/geometry/intersect.js +93 -58
  16. package/lib/cjs/function/matrix/eigs/complexEigs.js +168 -18
  17. package/lib/cjs/function/matrix/eigs.js +7 -9
  18. package/lib/cjs/header.js +2 -2
  19. package/lib/cjs/type/bignumber/BigNumber.js +3 -3
  20. package/lib/cjs/utils/is.js +13 -1
  21. package/lib/cjs/version.js +1 -1
  22. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -6
  23. package/lib/esm/entry/dependenciesAny/dependenciesIntersect.generated.js +2 -0
  24. package/lib/esm/entry/impureFunctionsAny.generated.js +38 -38
  25. package/lib/esm/entry/pureFunctionsAny.generated.js +107 -107
  26. package/lib/esm/expression/node/ArrayNode.js +16 -16
  27. package/lib/esm/expression/parse.js +1 -0
  28. package/lib/esm/function/geometry/intersect.js +91 -58
  29. package/lib/esm/function/matrix/eigs/complexEigs.js +152 -18
  30. package/lib/esm/function/matrix/eigs.js +7 -9
  31. package/lib/esm/type/bignumber/BigNumber.js +2 -3
  32. package/lib/esm/utils/is.js +13 -1
  33. package/lib/esm/version.js +1 -1
  34. package/package.json +22 -20
  35. package/types/index.d.ts +4772 -0
  36. package/types/index.ts +597 -0
  37. package/types/tsconfig.json +18 -0
  38. package/types/tslint.json +6 -0
package/types/index.ts ADDED
@@ -0,0 +1,597 @@
1
+ import {
2
+ create,
3
+ factory,
4
+ all,
5
+ MathJsFunctionName,
6
+ fractionDependencies,
7
+ addDependencies,
8
+ divideDependencies,
9
+ formatDependencies,
10
+ } from 'mathjs';
11
+
12
+ /*
13
+ Basic usage examples
14
+ */
15
+ {
16
+ const math = create(all);
17
+
18
+ // functions and constants
19
+ math.round(math.e, 3);
20
+ math.round(100.123, 3);
21
+ math.atan2(3, -3) / math.pi;
22
+ math.log(10000, 10);
23
+ math.sqrt(-4);
24
+ math.pow([[-1, 2], [3, 1]], 2);
25
+ const angle = 0.2;
26
+ math.add(math.pow(math.sin(angle), 2), math.pow(math.cos(angle), 2));
27
+
28
+ // expressions
29
+ math.evaluate('1.2 * (2 + 4.5)');
30
+
31
+ // chained operations
32
+ const a = math.chain(3).add(4).multiply(2).done(); // 14
33
+
34
+ // mixed use of different data types in functions
35
+ math.add(4, [5, 6]); // number + Array, [9, 10]
36
+ math.multiply(math.unit('5 mm'), 3); // Unit * number, 15 mm
37
+ math.subtract([2, 3, 4], 5); // Array - number, [-3, -2, -1]
38
+ math.add(math.matrix([2, 3]), [4, 5]); // Matrix + Array, [6, 8]
39
+ }
40
+
41
+ /*
42
+ Bignumbers examples
43
+ */
44
+ {
45
+ // configure the default type of numbers as BigNumbers
46
+ const math = create(all, {
47
+ number: 'BigNumber',
48
+ precision: 20,
49
+ });
50
+
51
+ {
52
+ math.add(math.bignumber(0.1), math.bignumber(0.2)); // BigNumber, 0.3
53
+ math.divide(math.bignumber(0.3), math.bignumber(0.2)); // BigNumber, 1.5
54
+ }
55
+ }
56
+
57
+ /*
58
+ Chaining examples
59
+ */
60
+ {
61
+ const math = create(all, {});
62
+ const a = math.chain(3).add(4).multiply(2).done(); // 14
63
+
64
+ // Another example, calculate square(sin(pi / 4))
65
+ const b = math.chain(math.pi).divide(4).sin().square().done();
66
+
67
+ // toString will return a string representation of the chain's value
68
+ const chain = math.chain(2).divide(3);
69
+ const str: string = chain.toString(); // "0.6666666666666666"
70
+
71
+ chain.valueOf();
72
+
73
+ // the function subset can be used to get or replace sub matrices
74
+ const array = [
75
+ [1, 2],
76
+ [3, 4],
77
+ ];
78
+ const v = math.chain(array).subset(math.index(1, 0)).done(); // 3
79
+
80
+ const m = math.chain(array).subset(math.index(0, 0), 8).multiply(3).done();
81
+
82
+ // filtering
83
+ math
84
+ .chain([-1, 0, 1.1, 2, 3, 1000])
85
+ .filter(math.isPositive)
86
+ .filter(math.isInteger)
87
+ .filter((n) => n !== 1000)
88
+ .done(); // [2, 3]
89
+ }
90
+
91
+ /*
92
+ Simplify examples
93
+ */
94
+ {
95
+ const math = create(all);
96
+
97
+ math.simplify("2 * 1 * x ^ (2 - 1)");
98
+ math.simplify("2 * 3 * x", { x: 4 });
99
+
100
+ const f = math.parse("2 * 1 * x ^ (2 - 1)");
101
+ math.simplify(f);
102
+
103
+ math.simplify("0.4 * x", {}, { exactFractions: true });
104
+ math.simplify("0.4 * x", {}, { exactFractions: false });
105
+ }
106
+
107
+ /*
108
+ Complex numbers examples
109
+ */
110
+ {
111
+ const math = create(all, {});
112
+ const a = math.complex(2, 3);
113
+ // create a complex number by providing a string with real and complex parts
114
+ const b = math.complex('3 - 7i');
115
+
116
+ // read the real and complex parts of the complex number
117
+ {
118
+ const x: number = a.re;
119
+ const y: number = a.im;
120
+
121
+ // adjust the complex value
122
+ a.re = 5;
123
+ }
124
+
125
+ // clone a complex value
126
+ {
127
+ const clone = a.clone();
128
+ }
129
+
130
+ // perform operations with complex numbers
131
+ {
132
+ math.add(a, b);
133
+ math.multiply(a, b);
134
+ math.sin(a);
135
+ }
136
+
137
+ // create a complex number from polar coordinates
138
+ {
139
+ const p: math.PolarCoordinates = { r: math.sqrt(2), phi: math.pi / 4 };
140
+ const c: math.Complex = math.complex(p);
141
+ }
142
+
143
+ // get polar coordinates of a complex number
144
+ {
145
+ const p: math.PolarCoordinates = math.complex(3, 4).toPolar();
146
+ }
147
+ }
148
+
149
+ /*
150
+ Expressions examples
151
+ */
152
+ {
153
+ const math = create(all, {});
154
+ // evaluate expressions
155
+ {
156
+ math.evaluate('sqrt(3^2 + 4^2)');
157
+ }
158
+
159
+ // evaluate multiple expressions at once
160
+ {
161
+ math.evaluate(['f = 3', 'g = 4', 'f * g']);
162
+ }
163
+
164
+ // get content of a parenthesis node
165
+ {
166
+ const node = math.parse('(1)');
167
+ const innerNode = node.content;
168
+ }
169
+
170
+ // scope can contain both variables and functions
171
+ {
172
+ const scope = { hello: (name: string) => `hello, ${name}!` };
173
+ math.evaluate('hello("hero")', scope); // "hello, hero!"
174
+ }
175
+
176
+ // define a function as an expression
177
+ {
178
+ const scope: any = {
179
+ a: 3,
180
+ b: 4,
181
+ };
182
+ const f = math.evaluate('f(x) = x ^ a', scope);
183
+ f(2);
184
+ scope.f(2);
185
+ }
186
+
187
+ {
188
+ const node2 = math.parse('x^a');
189
+ const code2: math.EvalFunction = node2.compile();
190
+ node2.toString();
191
+ }
192
+
193
+ // 3. using function math.compile
194
+ // parse an expression
195
+ {
196
+ // provide a scope for the variable assignment
197
+ const code2 = math.compile('a = a + 3');
198
+ const scope = { a: 7 };
199
+ code2.evaluate(scope);
200
+ }
201
+ // 4. using a parser
202
+ const parser = math.parser();
203
+
204
+ // get and set variables and functions
205
+ {
206
+ parser.evaluate('x = 7 / 2'); // 3.5
207
+ parser.evaluate('x + 3'); // 6.5
208
+ parser.evaluate('f(x, y) = x^y'); // f(x, y)
209
+ parser.evaluate('f(2, 3)'); // 8
210
+
211
+ const x = parser.get('x');
212
+ const f = parser.get('f');
213
+ const y = parser.getAll();
214
+ const g = f(3, 3);
215
+
216
+ parser.set('h', 500);
217
+ parser.set('hello', (name: string) => `hello, ${name}!`);
218
+ }
219
+
220
+ // clear defined functions and variables
221
+ parser.clear();
222
+ }
223
+
224
+ /*
225
+ Fractions examples
226
+ */
227
+ {
228
+ // configure the default type of numbers as Fractions
229
+ const math = create(all, {
230
+ number: 'Fraction',
231
+ });
232
+
233
+ const x = math.fraction(0.125);
234
+ const y = math.fraction('1/3');
235
+ math.fraction(2, 3);
236
+
237
+ math.add(x, y);
238
+ math.divide(x, y);
239
+
240
+ // output formatting
241
+ const a = math.fraction('2/3');
242
+ }
243
+
244
+ /*
245
+ Matrices examples
246
+ */
247
+ {
248
+ const math = create(all, {});
249
+
250
+ // create matrices and arrays. a matrix is just a wrapper around an Array,
251
+ // providing some handy utilities.
252
+ const a: math.Matrix = math.matrix([1, 4, 9, 16, 25]);
253
+ const b: math.Matrix = math.matrix(math.ones([2, 3]));
254
+ b.size();
255
+
256
+ // the Array data of a Matrix can be retrieved using valueOf()
257
+ const array = a.valueOf();
258
+
259
+ // Matrices can be cloned
260
+ const clone: math.Matrix = a.clone();
261
+
262
+ // perform operations with matrices
263
+ math.sqrt(a);
264
+ math.factorial(a);
265
+
266
+ // create and manipulate matrices. Arrays and Matrices can be used mixed.
267
+ {
268
+ const a = [
269
+ [1, 2],
270
+ [3, 4],
271
+ ];
272
+ const b: math.Matrix = math.matrix([
273
+ [5, 6],
274
+ [1, 1],
275
+ ]);
276
+
277
+ b.subset(math.index(1, [0, 1]), [[7, 8]]);
278
+ const c = math.multiply(a, b);
279
+ const f: math.Matrix = math.matrix([1, 0]);
280
+ const d: math.Matrix = f.subset(math.index(1, 0));
281
+ }
282
+
283
+ // get a sub matrix
284
+ {
285
+ const a: math.Matrix = math.diag(math.range(1, 4));
286
+ a.subset(math.index([1, 2], [1, 2]));
287
+ const b: math.Matrix = math.range(1, 6);
288
+ b.subset(math.index(math.range(1, 4)));
289
+ }
290
+
291
+ // resize a multi dimensional matrix
292
+ {
293
+ const a = math.matrix();
294
+ a.resize([2, 2, 2], 0);
295
+ a.size();
296
+ a.resize([2, 2]);
297
+ a.size();
298
+ }
299
+
300
+ // can set a subset of a matrix to uninitialized
301
+ {
302
+ const m = math.matrix();
303
+ m.subset(math.index(2), 6, math.uninitialized);
304
+ }
305
+
306
+ // create ranges
307
+ {
308
+ math.range(1, 6);
309
+ math.range(0, 18, 3);
310
+ math.range('2:-1:-3');
311
+ math.factorial(math.range('1:6'));
312
+ }
313
+
314
+ // map matrix
315
+ {
316
+ math.map([1, 2, 3], function (value) {
317
+ return value * value;
318
+ }); // returns [1, 4, 9]
319
+ }
320
+
321
+ // filter matrix
322
+ {
323
+ math.filter([6, -2, -1, 4, 3], function (x) {
324
+ return x > 0;
325
+ }); // returns [6, 4, 3]
326
+ math.filter(['23', 'foo', '100', '55', 'bar'], /[0-9]+/); // returns ["23", "100", "55"]
327
+ }
328
+
329
+ // concat matrix
330
+ {
331
+ math.concat([[0, 1, 2]], [[1, 2, 3]]); // returns [[ 0, 1, 2, 1, 2, 3 ]]
332
+ math.concat([[0, 1, 2]], [[1, 2, 3]], 0); // returns [[ 0, 1, 2 ], [ 1, 2, 3 ]]
333
+ }
334
+ }
335
+
336
+ /*
337
+ Sparse matrices examples
338
+ */
339
+ {
340
+ const math = create(all, {});
341
+
342
+ // create a sparse matrix
343
+ const a = math.identity(1000, 1000, 'sparse');
344
+
345
+ // do operations with a sparse matrix
346
+ const b = math.multiply(a, a);
347
+ const c = math.multiply(b, math.complex(2, 2));
348
+ const d = math.matrix([0, 1]);
349
+ const e = math.transpose(d);
350
+ const f = math.multiply(e, a);
351
+ }
352
+
353
+ /*
354
+ Units examples
355
+ */
356
+ {
357
+ const math = create(all, {});
358
+
359
+ // units can be created by providing a value and unit name, or by providing
360
+ // a string with a valued unit.
361
+ const a = math.unit(45, 'cm'); // 450 mm
362
+ const b = math.unit('0.1m'); // 100 mm
363
+
364
+ // creating units
365
+ math.createUnit('foo');
366
+ math.createUnit('furlong', '220 yards');
367
+ math.createUnit('furlong', '220 yards', { override: true });
368
+ math.createUnit('testunit', { definition: '0.555556 kelvin', offset: 459.67 });
369
+ math.createUnit('testunit', { definition: '0.555556 kelvin', offset: 459.67 }, { override: true });
370
+ math.createUnit('knot', { definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts'] });
371
+ math.createUnit('knot', { definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts'] }, { override: true });
372
+ math.createUnit(
373
+ 'knot',
374
+ {
375
+ definition: '0.514444 m/s',
376
+ aliases: ['knots', 'kt', 'kts'],
377
+ prefixes: 'long',
378
+ },
379
+ { override: true }
380
+ );
381
+ math.createUnit(
382
+ {
383
+ foo_2: {
384
+ prefixes: 'long',
385
+ },
386
+ bar: '40 foo',
387
+ baz: {
388
+ definition: '1 bar/hour',
389
+ prefixes: 'long',
390
+ },
391
+ },
392
+ {
393
+ override: true,
394
+ }
395
+ );
396
+ // use Unit as definition
397
+ math.createUnit('c', { definition: b });
398
+ math.createUnit('c', { definition: b }, { override: true });
399
+
400
+ // units can be added, subtracted, and multiplied or divided by numbers and by other units
401
+ math.add(a, b);
402
+ math.multiply(b, 2);
403
+ math.divide(math.unit('1 m'), math.unit('1 s'));
404
+ math.pow(math.unit('12 in'), 3);
405
+
406
+ // units can be converted to a specific type, or to a number
407
+ b.to('cm');
408
+ math.to(b, 'inch');
409
+ b.toNumber('cm');
410
+ math.number(b, 'cm');
411
+
412
+ // the expression parser supports units too
413
+ math.evaluate('2 inch to cm');
414
+
415
+ // units can be converted to SI
416
+ math.unit('1 inch').toSI();
417
+
418
+ // units can be split into other units
419
+ math.unit('1 m').splitUnit(['ft', 'in']);
420
+ }
421
+
422
+ /*
423
+ Expression tree examples
424
+ */
425
+ {
426
+ const math = create(all, {});
427
+
428
+ // Filter an expression tree
429
+ const node: math.MathNode = math.parse('x^2 + x/4 + 3*y');
430
+ const filtered: math.MathNode[] = node.filter((node: math.MathNode) => node.isSymbolNode && node.name === 'x');
431
+
432
+ const arr: string[] = filtered.map((node: math.MathNode) => node.toString());
433
+
434
+ // Traverse an expression tree
435
+ const node1: math.MathNode = math.parse('3 * x + 2');
436
+ node1.traverse((node: math.MathNode, path: string, parent: math.MathNode) => {
437
+ switch (node.type) {
438
+ case 'OperatorNode':
439
+ return node.type === 'OperatorNode';
440
+ case 'ConstantNode':
441
+ return node.type === 'ConstantNode';
442
+ case 'SymbolNode':
443
+ return node.type === 'SymbolNode';
444
+ default:
445
+ return node.type === 'any string at all';
446
+ }
447
+ });
448
+ }
449
+
450
+ /*
451
+ Function floor examples
452
+ */
453
+ {
454
+ const math = create(all, {});
455
+
456
+ // number input
457
+ math.floor(3.2); // returns number 3
458
+ math.floor(-4.2); // returns number -5
459
+
460
+ // number input
461
+ // roundoff result to 2 decimals
462
+ math.floor(3.212, 2); // returns number 3.21
463
+ math.floor(-4.212, 2); // returns number -4.22
464
+
465
+ // Complex input
466
+ const c = math.complex(3.24, -2.71); // returns Complex 3 - 3i
467
+ math.floor(c); // returns Complex 3 - 3i
468
+ math.floor(c, 1); // returns Complex 3.2 - 2.8i
469
+
470
+ //array input
471
+ math.floor([3.2, 3.8, -4.7]); // returns Array [3, 3, -5]
472
+ math.floor([3.21, 3.82, -4.71], 1); // returns Array [3.2, 3.8, -4.8]
473
+ }
474
+
475
+
476
+ /*
477
+ JSON serialization/deserialization
478
+ */
479
+ {
480
+ const math = create(all, {});
481
+
482
+ const data = {
483
+ bigNumber: math.bignumber('1.5'),
484
+ };
485
+ const stringified = JSON.stringify(data);
486
+ const parsed = JSON.parse(stringified, math.json.reviver);
487
+ parsed.bigNumber === math.bignumber('1.5'); // true
488
+ }
489
+
490
+ /*
491
+ Extend functionality with import
492
+ */
493
+
494
+ declare module 'mathjs' {
495
+ interface MathJsStatic {
496
+ testFun(): number;
497
+ value: number;
498
+ }
499
+ }
500
+
501
+ {
502
+ const math = create(all, {});
503
+ const testFun = () => 5;
504
+
505
+ math.import(
506
+ {
507
+ testFun,
508
+ value: 10,
509
+ },
510
+ {}
511
+ );
512
+
513
+ math.testFun();
514
+
515
+ const a = math.value * 2;
516
+ }
517
+
518
+ /*
519
+ Renamed functions from v5 => v6
520
+ */
521
+ {
522
+ const math = create(all, {});
523
+ math.typeOf(1);
524
+ math.variance([1, 2, 3, 4]);
525
+ math.evaluate('1 + 2');
526
+
527
+ // chained operations
528
+ math.chain(3).typeOf().done();
529
+ math.chain([1, 2, 3]).variance().done();
530
+ math.chain('1 + 2').evaluate().done();
531
+ }
532
+
533
+ /*
534
+ Factory Test
535
+ */
536
+ {
537
+ // create a factory function
538
+ const name = 'negativeSquare';
539
+ const dependencies: MathJsFunctionName[] = ['multiply', 'unaryMinus'];
540
+ const createNegativeSquare = factory(name, dependencies, (injected) => {
541
+ const { multiply, unaryMinus } = injected;
542
+ return function negativeSquare(x: number): number {
543
+ return unaryMinus(multiply(x, x));
544
+ };
545
+ });
546
+
547
+ // create an instance of the function yourself:
548
+ const multiply = (a: number, b: number) => a * b;
549
+ const unaryMinus = (a: number) => -a;
550
+ const negativeSquare = createNegativeSquare({ multiply, unaryMinus });
551
+ negativeSquare(3);
552
+ }
553
+
554
+ /**
555
+ * Dependency map typing test from mathjs official document:
556
+ * https://mathjs.org/docs/custom_bundling.html#using-just-a-few-functions
557
+ */
558
+ {
559
+ const config = {
560
+ // optionally, you can specify configuration
561
+ };
562
+
563
+ // Create just the functions we need
564
+ const { fraction, add, divide, format } = create(
565
+ {
566
+ fractionDependencies,
567
+ addDependencies,
568
+ divideDependencies,
569
+ formatDependencies,
570
+ },
571
+ config
572
+ );
573
+
574
+ // Use the created functions
575
+ const a = fraction(1, 3);
576
+ const b = fraction(3, 7);
577
+ const c = add(a, b);
578
+ const d = divide(a, b);
579
+ console.log('c =', format(c)); // outputs "c = 16/21"
580
+ console.log('d =', format(d)); // outputs "d = 7/9"
581
+ }
582
+
583
+ /**
584
+ * Custom parsing functions
585
+ * https://mathjs.org/docs/expressions/customization.html#customize-supported-characters
586
+ */
587
+ {
588
+ const math = create(all, {});
589
+ const isAlphaOriginal = math.parse.isAlpha;
590
+ math.parse.isAlpha = (c, cPrev, cNext) => {
591
+ return isAlphaOriginal(c, cPrev, cNext) || c === "\u260E";
592
+ };
593
+
594
+ // now we can use the \u260E (phone) character in expressions
595
+ const result = math.evaluate("\u260Efoo", { "\u260Efoo": 42 }); // returns 42
596
+ console.log(result);
597
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+ "paths": {
5
+ "mathjs": ["./index.d.ts"]
6
+ },
7
+ "typeRoots": [],
8
+ "types": [],
9
+ "lib": ["ES6", "DOM"],
10
+ "module": "commonjs",
11
+ "noEmit": true,
12
+ "noImplicitAny": true,
13
+ "noImplicitThis": true,
14
+ "strictNullChecks": false,
15
+ "strictFunctionTypes": true,
16
+ "forceConsistentCasingInFileNames": true
17
+ }
18
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "dtslint/dtslint.json",
3
+ "rules": {
4
+ "no-redundant-jsdoc": false
5
+ }
6
+ }