mathjs 10.5.2 → 10.5.3

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 (303) hide show
  1. package/HISTORY.md +8 -0
  2. package/lib/browser/math.js +3 -3
  3. package/lib/browser/math.js.map +1 -1
  4. package/lib/cjs/header.js +2 -2
  5. package/lib/cjs/version.js +1 -1
  6. package/lib/esm/version.js +1 -1
  7. package/package.json +6 -11
  8. package/docs/command_line_interface.md +0 -87
  9. package/docs/core/chaining.md +0 -41
  10. package/docs/core/configuration.md +0 -144
  11. package/docs/core/extension.md +0 -263
  12. package/docs/core/index.md +0 -21
  13. package/docs/core/serialization.md +0 -50
  14. package/docs/custom_bundling.md +0 -116
  15. package/docs/datatypes/bignumbers.md +0 -102
  16. package/docs/datatypes/complex_numbers.md +0 -168
  17. package/docs/datatypes/fractions.md +0 -75
  18. package/docs/datatypes/index.md +0 -67
  19. package/docs/datatypes/matrices.md +0 -375
  20. package/docs/datatypes/numbers.md +0 -106
  21. package/docs/datatypes/units.md +0 -444
  22. package/docs/expressions/algebra.md +0 -110
  23. package/docs/expressions/customization.md +0 -379
  24. package/docs/expressions/expression_trees.md +0 -710
  25. package/docs/expressions/html_classes.md +0 -38
  26. package/docs/expressions/index.md +0 -21
  27. package/docs/expressions/parsing.md +0 -224
  28. package/docs/expressions/security.md +0 -89
  29. package/docs/expressions/syntax.md +0 -706
  30. package/docs/getting_started.md +0 -124
  31. package/docs/index.md +0 -39
  32. package/docs/reference/classes/densematrix.md +0 -247
  33. package/docs/reference/classes/fibonacciheap.md +0 -70
  34. package/docs/reference/classes/matrixindex.md +0 -133
  35. package/docs/reference/classes/matrixrange.md +0 -158
  36. package/docs/reference/classes/resultset.md +0 -47
  37. package/docs/reference/classes/sparsematrix.md +0 -245
  38. package/docs/reference/classes/unit.md +0 -242
  39. package/docs/reference/classes.md +0 -86
  40. package/docs/reference/constants.md +0 -29
  41. package/docs/reference/functions/abs.md +0 -46
  42. package/docs/reference/functions/acos.md +0 -49
  43. package/docs/reference/functions/acosh.md +0 -47
  44. package/docs/reference/functions/acot.md +0 -48
  45. package/docs/reference/functions/acoth.md +0 -46
  46. package/docs/reference/functions/acsc.md +0 -49
  47. package/docs/reference/functions/acsch.md +0 -46
  48. package/docs/reference/functions/add.md +0 -59
  49. package/docs/reference/functions/and.md +0 -53
  50. package/docs/reference/functions/apply.md +0 -56
  51. package/docs/reference/functions/arg.md +0 -53
  52. package/docs/reference/functions/asec.md +0 -49
  53. package/docs/reference/functions/asech.md +0 -46
  54. package/docs/reference/functions/asin.md +0 -49
  55. package/docs/reference/functions/asinh.md +0 -46
  56. package/docs/reference/functions/atan.md +0 -49
  57. package/docs/reference/functions/atan2.md +0 -56
  58. package/docs/reference/functions/atanh.md +0 -46
  59. package/docs/reference/functions/bellNumbers.md +0 -45
  60. package/docs/reference/functions/bignumber.md +0 -47
  61. package/docs/reference/functions/bin.md +0 -45
  62. package/docs/reference/functions/bitAnd.md +0 -51
  63. package/docs/reference/functions/bitNot.md +0 -51
  64. package/docs/reference/functions/bitOr.md +0 -52
  65. package/docs/reference/functions/bitXor.md +0 -51
  66. package/docs/reference/functions/boolean.md +0 -50
  67. package/docs/reference/functions/catalan.md +0 -45
  68. package/docs/reference/functions/cbrt.md +0 -60
  69. package/docs/reference/functions/ceil.md +0 -63
  70. package/docs/reference/functions/chain.md +0 -54
  71. package/docs/reference/functions/clone.md +0 -43
  72. package/docs/reference/functions/column.md +0 -45
  73. package/docs/reference/functions/combinations.md +0 -49
  74. package/docs/reference/functions/combinationsWithRep.md +0 -49
  75. package/docs/reference/functions/compare.md +0 -67
  76. package/docs/reference/functions/compareNatural.md +0 -92
  77. package/docs/reference/functions/compareText.md +0 -54
  78. package/docs/reference/functions/compile.md +0 -56
  79. package/docs/reference/functions/complex.md +0 -17
  80. package/docs/reference/functions/composition.md +0 -46
  81. package/docs/reference/functions/concat.md +0 -56
  82. package/docs/reference/functions/config.md +0 -44
  83. package/docs/reference/functions/conj.md +0 -50
  84. package/docs/reference/functions/cos.md +0 -51
  85. package/docs/reference/functions/cosh.md +0 -46
  86. package/docs/reference/functions/cot.md +0 -47
  87. package/docs/reference/functions/coth.md +0 -49
  88. package/docs/reference/functions/count.md +0 -45
  89. package/docs/reference/functions/createUnit.md +0 -52
  90. package/docs/reference/functions/cross.md +0 -58
  91. package/docs/reference/functions/csc.md +0 -47
  92. package/docs/reference/functions/csch.md +0 -49
  93. package/docs/reference/functions/ctranspose.md +0 -50
  94. package/docs/reference/functions/cube.md +0 -51
  95. package/docs/reference/functions/cumsum.md +0 -57
  96. package/docs/reference/functions/deepEqual.md +0 -53
  97. package/docs/reference/functions/derivative.md +0 -61
  98. package/docs/reference/functions/det.md +0 -49
  99. package/docs/reference/functions/diag.md +0 -61
  100. package/docs/reference/functions/diff.md +0 -70
  101. package/docs/reference/functions/distance.md +0 -80
  102. package/docs/reference/functions/divide.md +0 -55
  103. package/docs/reference/functions/dot.md +0 -48
  104. package/docs/reference/functions/dotDivide.md +0 -52
  105. package/docs/reference/functions/dotMultiply.md +0 -52
  106. package/docs/reference/functions/dotPow.md +0 -49
  107. package/docs/reference/functions/eigs.md +0 -54
  108. package/docs/reference/functions/equal.md +0 -75
  109. package/docs/reference/functions/equalText.md +0 -53
  110. package/docs/reference/functions/erf.md +0 -49
  111. package/docs/reference/functions/evaluate.md +0 -56
  112. package/docs/reference/functions/exp.md +0 -54
  113. package/docs/reference/functions/expm.md +0 -49
  114. package/docs/reference/functions/expm1.md +0 -54
  115. package/docs/reference/functions/factorial.md +0 -49
  116. package/docs/reference/functions/fft.md +0 -35
  117. package/docs/reference/functions/filter.md +0 -50
  118. package/docs/reference/functions/fix.md +0 -62
  119. package/docs/reference/functions/flatten.md +0 -46
  120. package/docs/reference/functions/floor.md +0 -66
  121. package/docs/reference/functions/forEach.md +0 -41
  122. package/docs/reference/functions/format.md +0 -127
  123. package/docs/reference/functions/fraction.md +0 -45
  124. package/docs/reference/functions/gamma.md +0 -49
  125. package/docs/reference/functions/gcd.md +0 -50
  126. package/docs/reference/functions/getMatrixDataType.md +0 -59
  127. package/docs/reference/functions/hasNumericValue.md +0 -55
  128. package/docs/reference/functions/help.md +0 -42
  129. package/docs/reference/functions/hex.md +0 -45
  130. package/docs/reference/functions/hypot.md +0 -51
  131. package/docs/reference/functions/identity.md +0 -57
  132. package/docs/reference/functions/ifft.md +0 -35
  133. package/docs/reference/functions/im.md +0 -53
  134. package/docs/reference/functions/import.md +0 -68
  135. package/docs/reference/functions/index.md +0 -55
  136. package/docs/reference/functions/intersect.md +0 -50
  137. package/docs/reference/functions/inv.md +0 -45
  138. package/docs/reference/functions/invmod.md +0 -47
  139. package/docs/reference/functions/isInteger.md +0 -55
  140. package/docs/reference/functions/isNaN.md +0 -56
  141. package/docs/reference/functions/isNegative.md +0 -55
  142. package/docs/reference/functions/isNumeric.md +0 -55
  143. package/docs/reference/functions/isPositive.md +0 -57
  144. package/docs/reference/functions/isPrime.md +0 -54
  145. package/docs/reference/functions/isZero.md +0 -59
  146. package/docs/reference/functions/kldivergence.md +0 -41
  147. package/docs/reference/functions/kron.md +0 -53
  148. package/docs/reference/functions/larger.md +0 -60
  149. package/docs/reference/functions/largerEq.md +0 -56
  150. package/docs/reference/functions/lcm.md +0 -54
  151. package/docs/reference/functions/leafCount.md +0 -52
  152. package/docs/reference/functions/leftShift.md +0 -52
  153. package/docs/reference/functions/lgamma.md +0 -46
  154. package/docs/reference/functions/log.md +0 -57
  155. package/docs/reference/functions/log10.md +0 -50
  156. package/docs/reference/functions/log1p.md +0 -54
  157. package/docs/reference/functions/log2.md +0 -50
  158. package/docs/reference/functions/lsolve.md +0 -51
  159. package/docs/reference/functions/lsolveAll.md +0 -51
  160. package/docs/reference/functions/lup.md +0 -52
  161. package/docs/reference/functions/lusolve.md +0 -59
  162. package/docs/reference/functions/mad.md +0 -50
  163. package/docs/reference/functions/map.md +0 -65
  164. package/docs/reference/functions/matrix.md +0 -56
  165. package/docs/reference/functions/matrixFromColumns.md +0 -49
  166. package/docs/reference/functions/matrixFromFunction.md +0 -54
  167. package/docs/reference/functions/matrixFromRows.md +0 -49
  168. package/docs/reference/functions/max.md +0 -61
  169. package/docs/reference/functions/mean.md +0 -57
  170. package/docs/reference/functions/median.md +0 -57
  171. package/docs/reference/functions/min.md +0 -61
  172. package/docs/reference/functions/mod.md +0 -59
  173. package/docs/reference/functions/mode.md +0 -50
  174. package/docs/reference/functions/multinomial.md +0 -46
  175. package/docs/reference/functions/multiply.md +0 -60
  176. package/docs/reference/functions/norm.md +0 -59
  177. package/docs/reference/functions/not.md +0 -50
  178. package/docs/reference/functions/nthRoot.md +0 -53
  179. package/docs/reference/functions/nthRoots.md +0 -58
  180. package/docs/reference/functions/number.md +0 -49
  181. package/docs/reference/functions/numeric.md +0 -52
  182. package/docs/reference/functions/oct.md +0 -45
  183. package/docs/reference/functions/ones.md +0 -59
  184. package/docs/reference/functions/or.md +0 -53
  185. package/docs/reference/functions/parse.md +0 -56
  186. package/docs/reference/functions/parser.md +0 -70
  187. package/docs/reference/functions/partitionSelect.md +0 -53
  188. package/docs/reference/functions/permutations.md +0 -51
  189. package/docs/reference/functions/pickRandom.md +0 -59
  190. package/docs/reference/functions/pinv.md +0 -44
  191. package/docs/reference/functions/pow.md +0 -65
  192. package/docs/reference/functions/print.md +0 -64
  193. package/docs/reference/functions/prod.md +0 -55
  194. package/docs/reference/functions/qr.md +0 -65
  195. package/docs/reference/functions/quantileSeq.md +0 -62
  196. package/docs/reference/functions/random.md +0 -54
  197. package/docs/reference/functions/randomInt.md +0 -53
  198. package/docs/reference/functions/range.md +0 -70
  199. package/docs/reference/functions/rationalize.md +0 -68
  200. package/docs/reference/functions/re.md +0 -53
  201. package/docs/reference/functions/reshape.md +0 -60
  202. package/docs/reference/functions/resize.md +0 -51
  203. package/docs/reference/functions/resolve.md +0 -46
  204. package/docs/reference/functions/rightArithShift.md +0 -52
  205. package/docs/reference/functions/rightLogShift.md +0 -52
  206. package/docs/reference/functions/rotate.md +0 -53
  207. package/docs/reference/functions/rotationMatrix.md +0 -57
  208. package/docs/reference/functions/round.md +0 -61
  209. package/docs/reference/functions/row.md +0 -45
  210. package/docs/reference/functions/sec.md +0 -47
  211. package/docs/reference/functions/sech.md +0 -49
  212. package/docs/reference/functions/setCartesian.md +0 -49
  213. package/docs/reference/functions/setDifference.md +0 -47
  214. package/docs/reference/functions/setDistinct.md +0 -43
  215. package/docs/reference/functions/setIntersect.md +0 -46
  216. package/docs/reference/functions/setIsSubset.md +0 -47
  217. package/docs/reference/functions/setMultiplicity.md +0 -46
  218. package/docs/reference/functions/setPowerset.md +0 -43
  219. package/docs/reference/functions/setSize.md +0 -47
  220. package/docs/reference/functions/setSymDifference.md +0 -47
  221. package/docs/reference/functions/setUnion.md +0 -46
  222. package/docs/reference/functions/sign.md +0 -52
  223. package/docs/reference/functions/simplify.md +0 -130
  224. package/docs/reference/functions/simplifyConstant.md +0 -52
  225. package/docs/reference/functions/simplifyCore.md +0 -50
  226. package/docs/reference/functions/sin.md +0 -51
  227. package/docs/reference/functions/sinh.md +0 -46
  228. package/docs/reference/functions/size.md +0 -50
  229. package/docs/reference/functions/slu.md +0 -57
  230. package/docs/reference/functions/smaller.md +0 -60
  231. package/docs/reference/functions/smallerEq.md +0 -56
  232. package/docs/reference/functions/sort.md +0 -56
  233. package/docs/reference/functions/sparse.md +0 -51
  234. package/docs/reference/functions/splitUnit.md +0 -37
  235. package/docs/reference/functions/sqrt.md +0 -50
  236. package/docs/reference/functions/sqrtm.md +0 -46
  237. package/docs/reference/functions/square.md +0 -51
  238. package/docs/reference/functions/squeeze.md +0 -53
  239. package/docs/reference/functions/std.md +0 -76
  240. package/docs/reference/functions/stirlingS2.md +0 -52
  241. package/docs/reference/functions/string.md +0 -49
  242. package/docs/reference/functions/subset.md +0 -65
  243. package/docs/reference/functions/subtract.md +0 -54
  244. package/docs/reference/functions/sum.md +0 -54
  245. package/docs/reference/functions/symbolicEqual.md +0 -62
  246. package/docs/reference/functions/tan.md +0 -49
  247. package/docs/reference/functions/tanh.md +0 -50
  248. package/docs/reference/functions/to.md +0 -47
  249. package/docs/reference/functions/trace.md +0 -50
  250. package/docs/reference/functions/transpose.md +0 -49
  251. package/docs/reference/functions/typeOf.md +0 -81
  252. package/docs/reference/functions/typed.md +0 -56
  253. package/docs/reference/functions/unaryMinus.md +0 -49
  254. package/docs/reference/functions/unaryPlus.md +0 -48
  255. package/docs/reference/functions/unequal.md +0 -74
  256. package/docs/reference/functions/unit.md +0 -48
  257. package/docs/reference/functions/usolve.md +0 -51
  258. package/docs/reference/functions/usolveAll.md +0 -51
  259. package/docs/reference/functions/variance.md +0 -78
  260. package/docs/reference/functions/xgcd.md +0 -47
  261. package/docs/reference/functions/xor.md +0 -53
  262. package/docs/reference/functions/zeros.md +0 -57
  263. package/docs/reference/functions.md +0 -297
  264. package/docs/reference/index.md +0 -5
  265. package/examples/advanced/convert_fraction_to_bignumber.js +0 -59
  266. package/examples/advanced/custom_argument_parsing.js +0 -98
  267. package/examples/advanced/custom_datatype.js +0 -56
  268. package/examples/advanced/custom_evaluate_using_factories.js +0 -19
  269. package/examples/advanced/custom_evaluate_using_import.js +0 -18
  270. package/examples/advanced/custom_loading.js +0 -33
  271. package/examples/advanced/custom_relational_functions.js +0 -62
  272. package/examples/advanced/custom_scope_objects.js +0 -115
  273. package/examples/advanced/expression_trees.js +0 -55
  274. package/examples/advanced/function_transform.js +0 -50
  275. package/examples/advanced/more_secure_eval.js +0 -36
  276. package/examples/advanced/use_bigint.js +0 -43
  277. package/examples/advanced/web_server/math_worker.js +0 -24
  278. package/examples/advanced/web_server/server.js +0 -80
  279. package/examples/algebra.js +0 -34
  280. package/examples/basic_usage.js +0 -49
  281. package/examples/bignumbers.js +0 -52
  282. package/examples/browser/angle_configuration.html +0 -134
  283. package/examples/browser/basic_usage.html +0 -39
  284. package/examples/browser/currency_conversion.html +0 -125
  285. package/examples/browser/custom_separators.html +0 -81
  286. package/examples/browser/plot.html +0 -78
  287. package/examples/browser/pretty_printing_with_mathjax.html +0 -122
  288. package/examples/browser/printing_html.html +0 -170
  289. package/examples/browser/requirejs_loading.html +0 -20
  290. package/examples/browser/rocket_trajectory_optimization.html +0 -301
  291. package/examples/browser/webworkers/webworkers.html +0 -80
  292. package/examples/browser/webworkers/worker.js +0 -28
  293. package/examples/chaining.js +0 -56
  294. package/examples/complex_numbers.js +0 -67
  295. package/examples/expressions.js +0 -188
  296. package/examples/fractions.js +0 -74
  297. package/examples/import.js +0 -95
  298. package/examples/matrices.js +0 -101
  299. package/examples/objects.js +0 -35
  300. package/examples/package.json +0 -3
  301. package/examples/serialization.js +0 -16
  302. package/examples/sparse_matrices.js +0 -19
  303. package/examples/units.js +0 -108
@@ -1,62 +0,0 @@
1
- const { create, all, factory } = require('../..')
2
-
3
- // First let's see what the default behavior is:
4
- // strings are compared by their numerical value
5
- console.log('default (compare string by their numerical value)')
6
- const { evaluate } = create(all)
7
- evaluateAndLog(evaluate, '2 < 10') // true
8
- evaluateAndLog(evaluate, '"2" < "10"') // true
9
- evaluateAndLog(evaluate, '"a" == "b"') // Error: Cannot convert "a" to a number
10
- evaluateAndLog(evaluate, '"a" == "a"') // Error: Cannot convert "a" to a number
11
- console.log('')
12
-
13
- // Suppose we want different behavior for string comparisons. To achieve
14
- // this we can replace the factory functions for all relational functions
15
- // with our own. In this simple example we use the JavaScript implementation.
16
- console.log('custom (compare strings lexically)')
17
-
18
- const allWithCustomFunctions = {
19
- ...all,
20
-
21
- createEqual: factory('equal', [], () => function equal (a, b) {
22
- return a === b
23
- }),
24
-
25
- createUnequal: factory('unequal', [], () => function unequal (a, b) {
26
- return a !== b
27
- }),
28
-
29
- createSmaller: factory('smaller', [], () => function smaller (a, b) {
30
- return a < b
31
- }),
32
-
33
- createSmallerEq: factory('smallerEq', [], () => function smallerEq (a, b) {
34
- return a <= b
35
- }),
36
-
37
- createLarger: factory('larger', [], () => function larger (a, b) {
38
- return a > b
39
- }),
40
-
41
- createLargerEq: factory('largerEq', [], () => function largerEq (a, b) {
42
- return a >= b
43
- }),
44
-
45
- createCompare: factory('compare', [], () => function compare (a, b) {
46
- return a > b ? 1 : a < b ? -1 : 0
47
- })
48
- }
49
- const evaluateCustom = create(allWithCustomFunctions).evaluate
50
- evaluateAndLog(evaluateCustom, '2 < 10') // true
51
- evaluateAndLog(evaluateCustom, '"2" < "10"') // false
52
- evaluateAndLog(evaluateCustom, '"a" == "b"') // false
53
- evaluateAndLog(evaluateCustom, '"a" == "a"') // true
54
-
55
- // helper function to evaluate an expression and print the results
56
- function evaluateAndLog (evaluate, expression) {
57
- try {
58
- console.log(expression, evaluate(expression))
59
- } catch (err) {
60
- console.error(expression, err.toString())
61
- }
62
- }
@@ -1,115 +0,0 @@
1
- const { create, all } = require('../..')
2
-
3
- const math = create(all)
4
-
5
- // The expression evaluator accepts an optional scope object.
6
- // This is the symbol table for variable defintions and function declations.
7
-
8
- // Scope can be a bare object.
9
- function withObjectScope () {
10
- const scope = { x: 3 }
11
-
12
- math.evaluate('x', scope) // 1
13
- math.evaluate('y = 2 x', scope)
14
- math.evaluate('scalar = 1', scope)
15
- math.evaluate('area(length, width) = length * width * scalar', scope)
16
- math.evaluate('A = area(x, y)', scope)
17
-
18
- console.log('Object scope:', scope)
19
- }
20
-
21
- // Where flexibility is important, scope can duck type appear to be a Map.
22
- function withMapScope (scope, name) {
23
- scope.set('x', 3)
24
-
25
- math.evaluate('x', scope) // 1
26
- math.evaluate('y = 2 x', scope)
27
- math.evaluate('scalar = 1', scope)
28
- math.evaluate('area(length, width) = length * width * scalar', scope)
29
- math.evaluate('A = area(x, y)', scope)
30
-
31
- console.log(`Map-like scope (${name}):`, scope.localScope)
32
- }
33
-
34
- // This is a minimal set of functions to look like a Map.
35
- class MapScope {
36
- constructor () {
37
- this.localScope = new Map()
38
- }
39
-
40
- get (key) {
41
- // Remember to sanitize your inputs, or use
42
- // a datastructure that isn't a footgun.
43
- return this.localScope.get(key)
44
- }
45
-
46
- set (key, value) {
47
- return this.localScope.set(key, value)
48
- }
49
-
50
- has (key) {
51
- return this.localScope.has(key)
52
- }
53
-
54
- keys () {
55
- return this.localScope.keys()
56
- }
57
- }
58
-
59
- /*
60
- * This is a more fully featured example, with all methods
61
- * used in mathjs.
62
- *
63
- */
64
- class AdvancedMapScope extends MapScope {
65
- constructor (parent) {
66
- super()
67
- this.parentScope = parent
68
- }
69
-
70
- get (key) {
71
- return this.localScope.get(key) ?? this.parentScope?.get(key)
72
- }
73
-
74
- has (key) {
75
- return this.localScope.has(key) ?? this.parentScope?.get(key)
76
- }
77
-
78
- keys () {
79
- if (this.parentScope) {
80
- return new Set([...this.localScope.keys(), ...this.parentScope.keys()])
81
- } else {
82
- return this.localScope.keys()
83
- }
84
- }
85
-
86
- delete () {
87
- return this.localScope.delete()
88
- }
89
-
90
- clear () {
91
- return this.localScope.clear()
92
- }
93
-
94
- /**
95
- * Creates a child scope from this one. This is used in function calls.
96
- *
97
- * @returns a new Map scope that has access to the symbols in the parent, but
98
- * cannot overwrite them.
99
- */
100
- createSubScope () {
101
- return new AdvancedMapScope(this)
102
- }
103
-
104
- toString () {
105
- return this.localScope.toString()
106
- }
107
- }
108
-
109
- withObjectScope()
110
- // Where safety is important, scope can also be a Map
111
- withMapScope(new Map(), 'simple Map')
112
- // Where flexibility is important, scope can duck type appear to be a Map.
113
- withMapScope(new MapScope(), 'MapScope example')
114
- // Extra methods allow even finer grain control.
115
- withMapScope(new AdvancedMapScope(), 'AdvancedScope example')
@@ -1,55 +0,0 @@
1
- const { parse, ConstantNode } = require('../..')
2
-
3
- // Filter an expression tree
4
- console.log('Filter all symbol nodes "x" in the expression "x^2 + x/4 + 3*y"')
5
- const node = parse('x^2 + x/4 + 3*y')
6
- const filtered = node.filter(function (node) {
7
- return node.isSymbolNode && node.name === 'x'
8
- })
9
- // returns an array with two entries: two SymbolNodes 'x'
10
-
11
- filtered.forEach(function (node) {
12
- console.log(node.type, node.toString())
13
- })
14
- // outputs:
15
- // SymbolNode x
16
- // SymbolNode x
17
-
18
- // Traverse an expression tree
19
- console.log()
20
- console.log('Traverse the expression tree of expression "3 * x + 2"')
21
- const node1 = parse('3 * x + 2')
22
- node1.traverse(function (node, path, parent) {
23
- switch (node.type) {
24
- case 'OperatorNode':
25
- console.log(node.type, node.op)
26
- break
27
- case 'ConstantNode':
28
- console.log(node.type, node.value)
29
- break
30
- case 'SymbolNode':
31
- console.log(node.type, node.name)
32
- break
33
- default: console.log(node.type)
34
- }
35
- })
36
- // outputs:
37
- // OperatorNode +
38
- // OperatorNode *
39
- // ConstantNode 3
40
- // SymbolNode x
41
- // ConstantNode 2
42
-
43
- // transform an expression tree
44
- console.log()
45
- console.log('Replace all symbol nodes "x" in expression "x^2 + 5*x" with a constant 3')
46
- const node2 = parse('x^2 + 5*x')
47
- const transformed = node2.transform(function (node, path, parent) {
48
- if (node.isSymbolNode && node.name === 'x') {
49
- return new ConstantNode(3)
50
- } else {
51
- return node
52
- }
53
- })
54
- console.log(transformed.toString())
55
- // outputs: '3 ^ 2 + 5 * 3'
@@ -1,50 +0,0 @@
1
- /**
2
- * Function transforms
3
- *
4
- * When using functions via the expression parser, it is possible to preprocess
5
- * function arguments and post process a functions return value by writing a
6
- * *transform* for the function. A transform is a function wrapping around a
7
- * function to be transformed or completely replaces a function.
8
- */
9
- const { create, all } = require('../..')
10
- const math = create(all)
11
-
12
- // create a function
13
- function addIt (a, b) {
14
- return a + b
15
- }
16
-
17
- // attach a transform function to the function addIt
18
- addIt.transform = function (a, b) {
19
- console.log('input: a=' + a + ', b=' + b)
20
- // we can manipulate the input arguments here before executing addIt
21
-
22
- const res = addIt(a, b)
23
-
24
- console.log('result: ' + res)
25
- // we can manipulate the result here before returning
26
-
27
- return res
28
- }
29
-
30
- // import the function into math.js
31
- math.import({
32
- addIt: addIt
33
- })
34
-
35
- // use the function via the expression parser
36
- console.log('Using expression parser:')
37
- console.log('2+4=' + math.evaluate('addIt(2, 4)'))
38
- // This will output:
39
- //
40
- // input: a=2, b=4
41
- // result: 6
42
- // 2+4=6
43
-
44
- // when used via plain JavaScript, the transform is not invoked
45
- console.log('')
46
- console.log('Using plain JavaScript:')
47
- console.log('2+4=' + math.addIt(2, 4))
48
- // This will output:
49
- //
50
- // 6
@@ -1,36 +0,0 @@
1
- // Expression parser security
2
- //
3
- // Executing arbitrary expressions like enabled by the expression parser of
4
- // mathjs involves a risk in general. When you're using mathjs to let users
5
- // execute arbitrary expressions, it's good to take a moment to think about
6
- // possible security and stability implications, especially when running the
7
- // code server side.
8
- //
9
- // There is a small number of functions which yield the biggest security risk
10
- // in the expression parser of math.js:
11
- //
12
- // - `import` and `createUnit` which alter the built-in functionality and allow
13
- // overriding existing functions and units.
14
- // - `evaluate`, `parse`, `simplify`, and `derivative` which parse arbitrary input
15
- // into a manipulable expression tree.
16
- //
17
- // To make the expression parser less vulnerable whilst still supporting most
18
- // functionality, these functions can be disabled, as demonstrated in this
19
- // example.
20
-
21
- const { create, all } = require('../..')
22
- const math = create(all)
23
-
24
- const limitedEvaluate = math.evaluate
25
-
26
- math.import({
27
- import: function () { throw new Error('Function import is disabled') },
28
- createUnit: function () { throw new Error('Function createUnit is disabled') },
29
- evaluate: function () { throw new Error('Function evaluate is disabled') },
30
- parse: function () { throw new Error('Function parse is disabled') },
31
- simplify: function () { throw new Error('Function simplify is disabled') },
32
- derivative: function () { throw new Error('Function derivative is disabled') }
33
- }, { override: true })
34
-
35
- console.log(limitedEvaluate('sqrt(16)')) // Ok, 4
36
- console.log(limitedEvaluate('parse("2+3")')) // Error: Function parse is disabled
@@ -1,43 +0,0 @@
1
- // This example demonstrates how you could integrate support for BigInt
2
- // in mathjs. It's just a proof of concept, for full support you will
3
- // have to defined more functions and define conversions from and to
4
- // other data types.
5
-
6
- const { create, all, factory } = require('../..')
7
- const math = create(all)
8
-
9
- // we can also add conversions here from number or string to BigInt
10
- // and vice versa using math.typed.addConversion(...)
11
-
12
- math.import([
13
- factory('BigInt', ['typed'], function createBigInt ({ typed }) {
14
- typed.addType({
15
- name: 'BigInt',
16
- test: (x) => typeof x === 'bigint' // eslint-disable-line
17
- })
18
-
19
- return BigInt // eslint-disable-line
20
- }, { lazy: false }),
21
-
22
- factory('bigint', ['typed', 'BigInt'], function createBigint ({ typed, BigInt }) {
23
- return typed('bigint', {
24
- 'number | string ': (x) => BigInt(x) // eslint-disable-line
25
- })
26
- }),
27
-
28
- factory('add', ['typed'], function createBigIntAdd ({ typed }) {
29
- return typed('add', {
30
- 'BigInt, BigInt': (a, b) => a + b
31
- })
32
- }),
33
-
34
- factory('pow', ['typed'], function createBigIntPow ({ typed }) {
35
- return typed('pow', {
36
- 'BigInt, BigInt': (a, b) => a ** b
37
- })
38
- })
39
- ])
40
-
41
- console.log(math.evaluate('4349 + 5249'))
42
- console.log(math.evaluate('bigint(4349) + bigint(5249)'))
43
- console.log(math.evaluate('bigint(4349) ^ bigint(5249)'))
@@ -1,24 +0,0 @@
1
- const { create, all } = require('../../..')
2
- const workerpool = require('workerpool')
3
- const math = create(all)
4
-
5
- // disable the import function so the math.js instance cannot be changed
6
- function noImport () {
7
- throw new Error('function import is disabled.')
8
- }
9
- math.import({ import: noImport }, { override: true })
10
-
11
- /**
12
- * Evaluate an expression
13
- * @param {string} expr
14
- * @return {string} result
15
- */
16
- function evaluate (expr) {
17
- const ans = math.evaluate(expr)
18
- return math.format(ans)
19
- }
20
-
21
- // create a worker and register public functions
22
- workerpool.worker({
23
- evaluate: evaluate
24
- })
@@ -1,80 +0,0 @@
1
- /**
2
- * This example demonstrates how to run math.js in a child process with limited
3
- * execution time.
4
- *
5
- * Prerequisites:
6
- *
7
- * npm install express workerpool
8
- *
9
- * Start the server:
10
- *
11
- * node ./server.js
12
- *
13
- * Make a request to the server:
14
- *
15
- * GET http://localhost:8080/mathjs?expr=sqrt(16)
16
- *
17
- * Note that the query parameter `expr` should be properly url encoded.
18
- */
19
- const path = require('path')
20
-
21
- let express
22
- let workerpool
23
- try {
24
- express = require('express')
25
- workerpool = require('workerpool')
26
- } catch (err) {
27
- console.log('Error: To run this example, install express and workerpool first via:\n\n' +
28
- ' npm install express workerpool\n')
29
- process.exit()
30
- }
31
-
32
- const app = express()
33
- const pool = workerpool.pool(path.join(__dirname, '/math_worker.js'))
34
-
35
- const TIMEOUT = 10000 // milliseconds
36
-
37
- /**
38
- * GET /mathjs?expr=...
39
- */
40
- app.get('/mathjs', function (req, res) {
41
- const expr = req.query.expr
42
- if (expr === undefined) {
43
- return res.status(400).send('Error: Required query parameter "expr" missing in url.')
44
- }
45
-
46
- pool.exec('evaluate', [expr])
47
- .timeout(TIMEOUT)
48
- .then(function (result) {
49
- res.send(result)
50
- })
51
- .catch(function (err) {
52
- res.status(400).send(formatError(err))
53
- })
54
- })
55
-
56
- /**
57
- * Format error messages as string
58
- * @param {Error} err
59
- * @return {String} message
60
- */
61
- function formatError (err) {
62
- if (err instanceof workerpool.Promise.TimeoutError) {
63
- return 'TimeoutError: Evaluation exceeded maximum duration of ' + TIMEOUT / 1000 + ' seconds'
64
- } else {
65
- return err.toString()
66
- }
67
- }
68
-
69
- // handle uncaught exceptions so the application cannot crash
70
- process.on('uncaughtException', function (err) {
71
- console.log('Caught exception: ' + err)
72
- console.trace()
73
- })
74
-
75
- // start the server
76
- const PORT = process.env.PORT || 8080
77
- app.listen(PORT, function () {
78
- console.log('Listening at http://localhost:' + PORT)
79
- console.log('Example request:\n GET http://localhost:' + PORT + '/mathjs?expr=sqrt(16)')
80
- })
@@ -1,34 +0,0 @@
1
- // algebra
2
- //
3
- // math.js has support for symbolic computation (CAS). It can parse
4
- // expressions in an expression tree and do algebraic operations like
5
- // simplification and derivation on this tree.
6
-
7
- // load math.js (using node.js)
8
- const { simplify, parse, derivative } = require('..')
9
-
10
- // simplify an expression
11
- console.log('simplify expressions')
12
- console.log(simplify('3 + 2 / 4').toString()) // '7 / 2'
13
- console.log(simplify('2x + 3x').toString()) // '5 * x'
14
- console.log(simplify('2 * 3 * x', { x: 4 }).toString()) // '24'
15
- console.log(simplify('x^2 + x + 3 + x^2').toString()) // '2 * x ^ 2 + x + 3'
16
- console.log(simplify('x * y * -x / (x ^ 2)').toString()) // '-y'
17
-
18
- // work with an expression tree, evaluate results
19
- const f = parse('2x + x')
20
- const simplified = simplify(f)
21
- console.log(simplified.toString()) // '3 * x'
22
- console.log(simplified.evaluate({ x: 4 })) // 12
23
- console.log()
24
-
25
- // calculate a derivative
26
- console.log('calculate derivatives')
27
- console.log(derivative('2x^2 + 3x + 4', 'x').toString()) // '4 * x + 3'
28
- console.log(derivative('sin(2x)', 'x').toString()) // '2 * cos(2 * x)'
29
-
30
- // work with an expression tree, evaluate results
31
- const h = parse('x^2 + x')
32
- const dh = derivative(h, 'x')
33
- console.log(dh.toString()) // '2 * x + 1'
34
- console.log(dh.evaluate({ x: 3 })) // '7'
@@ -1,49 +0,0 @@
1
- // basic usage
2
-
3
- // load math.js (using node.js)
4
- const math = require('..')
5
-
6
- // functions and constants
7
- console.log('functions and constants')
8
- print(math.round(math.e, 3)) // 2.718
9
- print(math.atan2(3, -3) / math.pi) // 0.75
10
- print(math.log(10000, 10)) // 4
11
- print(math.sqrt(-4)) // 2i
12
- print(math.pow([[-1, 2], [3, 1]], 2)) // [[7, 0], [0, 7]]
13
- print(math.derivative('x^2 + x', 'x')) // 2 * x + 1
14
- console.log()
15
-
16
- // expressions
17
- console.log('expressions')
18
- print(math.evaluate('1.2 * (2 + 4.5)')) // 7.8
19
- print(math.evaluate('12.7 cm to inch')) // 5 inch
20
- print(math.evaluate('sin(45 deg) ^ 2')) // 0.5
21
- print(math.evaluate('9 / 3 + 2i')) // 3 + 2i
22
- print(math.evaluate('det([-1, 2; 3, 1])')) // -7
23
- console.log()
24
-
25
- // chained operations
26
- console.log('chained operations')
27
- const a = math.chain(3)
28
- .add(4)
29
- .multiply(2)
30
- .done()
31
- print(a) // 14
32
- console.log()
33
-
34
- // mixed use of different data types in functions
35
- console.log('mixed use of data types')
36
- print(math.add(4, [5, 6])) // number + Array, [9, 10]
37
- print(math.multiply(math.unit('5 mm'), 3)) // Unit * number, 15 mm
38
- print(math.subtract([2, 3, 4], 5)) // Array - number, [-3, -2, -1]
39
- print(math.add(math.matrix([2, 3]), [4, 5])) // Matrix + Array, [6, 8]
40
- console.log()
41
-
42
- /**
43
- * Helper function to output a value in the console. Value will be formatted.
44
- * @param {*} value
45
- */
46
- function print (value) {
47
- const precision = 14
48
- console.log(math.format(value, precision))
49
- }
@@ -1,52 +0,0 @@
1
- /* eslint-disable no-loss-of-precision */
2
-
3
- // BigNumbers
4
-
5
- const { create, all } = require('..')
6
-
7
- // configure the default type of numbers as BigNumbers
8
- const config = {
9
- // Default type of number
10
- // Available options: 'number' (default), 'BigNumber', or 'Fraction'
11
- number: 'BigNumber',
12
-
13
- // Number of significant digits for BigNumbers
14
- precision: 20
15
- }
16
- const math = create(all, config)
17
-
18
- console.log('round-off errors with numbers')
19
- print(math.add(0.1, 0.2)) // number, 0.30000000000000004
20
- print(math.divide(0.3, 0.2)) // number, 1.4999999999999998
21
- console.log()
22
-
23
- console.log('no round-off errors with BigNumbers')
24
- print(math.add(math.bignumber(0.1), math.bignumber(0.2))) // BigNumber, 0.3
25
- print(math.divide(math.bignumber(0.3), math.bignumber(0.2))) // BigNumber, 1.5
26
- console.log()
27
-
28
- console.log('create BigNumbers from strings when exceeding the range of a number')
29
- print(math.bignumber(1.2e+500)) // BigNumber, Infinity WRONG
30
- print(math.bignumber('1.2e+500')) // BigNumber, 1.2e+500
31
- console.log()
32
-
33
- console.log('BigNumbers still have a limited precision and are no silve bullet')
34
- const third = math.divide(math.bignumber(1), math.bignumber(3))
35
- const total = math.add(third, third, third)
36
- print(total) // BigNumber, 0.99999999999999999999
37
- console.log()
38
-
39
- // one can work conveniently with BigNumbers using the expression parser.
40
- // note though that BigNumbers are only supported in arithmetic functions
41
- console.log('use BigNumbers in the expression parser')
42
- print(math.evaluate('0.1 + 0.2')) // BigNumber, 0.3
43
- print(math.evaluate('0.3 / 0.2')) // BigNumber, 1.5
44
- console.log()
45
-
46
- /**
47
- * Helper function to output a value in the console. Value will be formatted.
48
- * @param {*} value
49
- */
50
- function print (value) {
51
- console.log(math.format(value))
52
- }