mathjs 10.6.2 → 11.0.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 (436) hide show
  1. package/HISTORY.md +74 -1
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +2 -41
  4. package/lib/browser/math.js.LICENSE.txt +43 -0
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/core/create.js +6 -5
  7. package/lib/cjs/core/function/import.js +4 -14
  8. package/lib/cjs/core/function/typed.js +54 -12
  9. package/lib/cjs/defaultInstance.js +3 -3
  10. package/lib/cjs/entry/allFactoriesAny.js +1 -1
  11. package/lib/cjs/entry/allFactoriesNumber.js +1 -1
  12. package/lib/cjs/entry/configReadonly.js +1 -1
  13. package/lib/cjs/entry/dependenciesAny/dependenciesChainClass.generated.js +3 -0
  14. package/lib/cjs/entry/dependenciesAny/dependenciesKldivergence.generated.js +3 -0
  15. package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +3 -0
  16. package/lib/cjs/entry/dependenciesAny/dependenciesResolve.generated.js +3 -0
  17. package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +3 -0
  18. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +56 -0
  19. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +6 -0
  20. package/lib/cjs/entry/dependenciesAny/dependenciesSqrtm.generated.js +3 -0
  21. package/lib/cjs/entry/dependenciesAny/dependenciesStd.generated.js +3 -0
  22. package/lib/cjs/entry/dependenciesAny/dependenciesStdTransform.generated.js +3 -0
  23. package/lib/cjs/entry/dependenciesAny.generated.js +8 -0
  24. package/lib/cjs/entry/dependenciesNumber/dependenciesChainClass.generated.js +3 -0
  25. package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +3 -0
  26. package/lib/cjs/entry/dependenciesNumber/dependenciesResolve.generated.js +3 -0
  27. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +3 -0
  28. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +50 -0
  29. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +6 -0
  30. package/lib/cjs/entry/dependenciesNumber/dependenciesStd.generated.js +3 -0
  31. package/lib/cjs/entry/dependenciesNumber/dependenciesStdTransform.generated.js +3 -0
  32. package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
  33. package/lib/cjs/entry/impureFunctionsAny.generated.js +87 -61
  34. package/lib/cjs/entry/impureFunctionsNumber.generated.js +93 -69
  35. package/lib/cjs/entry/pureFunctionsAny.generated.js +50 -45
  36. package/lib/cjs/entry/pureFunctionsNumber.generated.js +22 -19
  37. package/lib/cjs/expression/Parser.js +1 -1
  38. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +8 -5
  39. package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyConstant.js +15 -0
  40. package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyCore.js +1 -1
  41. package/lib/cjs/expression/node/AccessorNode.js +216 -173
  42. package/lib/cjs/expression/node/ArrayNode.js +206 -160
  43. package/lib/cjs/expression/node/AssignmentNode.js +321 -270
  44. package/lib/cjs/expression/node/BlockNode.js +223 -172
  45. package/lib/cjs/expression/node/ConditionalNode.js +253 -193
  46. package/lib/cjs/expression/node/ConstantNode.js +216 -171
  47. package/lib/cjs/expression/node/FunctionAssignmentNode.js +258 -196
  48. package/lib/cjs/expression/node/FunctionNode.js +456 -416
  49. package/lib/cjs/expression/node/IndexNode.js +256 -210
  50. package/lib/cjs/expression/node/Node.js +411 -378
  51. package/lib/cjs/expression/node/ObjectNode.js +223 -178
  52. package/lib/cjs/expression/node/OperatorNode.js +474 -397
  53. package/lib/cjs/expression/node/ParenthesisNode.js +189 -143
  54. package/lib/cjs/expression/node/RangeNode.js +272 -224
  55. package/lib/cjs/expression/node/RelationalNode.js +246 -195
  56. package/lib/cjs/expression/node/SymbolNode.js +219 -172
  57. package/lib/cjs/expression/node/utils/access.js +1 -1
  58. package/lib/cjs/expression/node/utils/assign.js +1 -1
  59. package/lib/cjs/expression/operators.js +117 -23
  60. package/lib/cjs/expression/parse.js +37 -19
  61. package/lib/cjs/expression/transform/std.transform.js +3 -1
  62. package/lib/cjs/factoriesAny.js +8 -0
  63. package/lib/cjs/factoriesNumber.js +10 -1
  64. package/lib/cjs/function/algebra/decomposition/qr.js +1 -1
  65. package/lib/cjs/function/algebra/derivative.js +22 -30
  66. package/lib/cjs/function/algebra/leafCount.js +0 -3
  67. package/lib/cjs/function/algebra/rationalize.js +78 -108
  68. package/lib/cjs/function/algebra/resolve.js +53 -16
  69. package/lib/cjs/function/algebra/simplify/util.js +1 -1
  70. package/lib/cjs/function/algebra/simplify.js +87 -114
  71. package/lib/cjs/function/algebra/{simplify/simplifyConstant.js → simplifyConstant.js} +44 -10
  72. package/lib/cjs/function/algebra/simplifyCore.js +196 -93
  73. package/lib/cjs/function/algebra/solver/lsolveAll.js +2 -2
  74. package/lib/cjs/function/algebra/solver/usolveAll.js +2 -2
  75. package/lib/cjs/function/algebra/symbolicEqual.js +9 -26
  76. package/lib/cjs/function/arithmetic/abs.js +7 -14
  77. package/lib/cjs/function/arithmetic/add.js +26 -70
  78. package/lib/cjs/function/arithmetic/addScalar.js +17 -9
  79. package/lib/cjs/function/arithmetic/cbrt.js +7 -11
  80. package/lib/cjs/function/arithmetic/ceil.js +56 -46
  81. package/lib/cjs/function/arithmetic/cube.js +5 -10
  82. package/lib/cjs/function/arithmetic/divide.js +7 -7
  83. package/lib/cjs/function/arithmetic/divideScalar.js +4 -18
  84. package/lib/cjs/function/arithmetic/dotDivide.js +22 -65
  85. package/lib/cjs/function/arithmetic/dotMultiply.js +16 -61
  86. package/lib/cjs/function/arithmetic/dotPow.js +30 -63
  87. package/lib/cjs/function/arithmetic/exp.js +8 -12
  88. package/lib/cjs/function/arithmetic/expm1.js +10 -10
  89. package/lib/cjs/function/arithmetic/fix.js +33 -27
  90. package/lib/cjs/function/arithmetic/floor.js +56 -46
  91. package/lib/cjs/function/arithmetic/gcd.js +27 -68
  92. package/lib/cjs/function/arithmetic/hypot.js +9 -5
  93. package/lib/cjs/function/arithmetic/invmod.js +1 -1
  94. package/lib/cjs/function/arithmetic/lcm.js +27 -68
  95. package/lib/cjs/function/arithmetic/log.js +10 -12
  96. package/lib/cjs/function/arithmetic/log10.js +5 -3
  97. package/lib/cjs/function/arithmetic/log1p.js +11 -7
  98. package/lib/cjs/function/arithmetic/log2.js +5 -3
  99. package/lib/cjs/function/arithmetic/mod.js +22 -64
  100. package/lib/cjs/function/arithmetic/multiply.js +40 -35
  101. package/lib/cjs/function/arithmetic/multiplyScalar.js +2 -9
  102. package/lib/cjs/function/arithmetic/norm.js +1 -5
  103. package/lib/cjs/function/arithmetic/nthRoot.js +80 -92
  104. package/lib/cjs/function/arithmetic/round.js +56 -42
  105. package/lib/cjs/function/arithmetic/sign.js +14 -10
  106. package/lib/cjs/function/arithmetic/sqrt.js +5 -9
  107. package/lib/cjs/function/arithmetic/square.js +6 -10
  108. package/lib/cjs/function/arithmetic/subtract.js +44 -100
  109. package/lib/cjs/function/arithmetic/unaryMinus.js +14 -16
  110. package/lib/cjs/function/arithmetic/unaryPlus.js +6 -4
  111. package/lib/cjs/function/bitwise/bitAnd.js +17 -61
  112. package/lib/cjs/function/bitwise/bitNot.js +5 -3
  113. package/lib/cjs/function/bitwise/bitOr.js +16 -60
  114. package/lib/cjs/function/bitwise/bitXor.js +17 -61
  115. package/lib/cjs/function/bitwise/leftShift.js +68 -81
  116. package/lib/cjs/function/bitwise/rightArithShift.js +68 -81
  117. package/lib/cjs/function/bitwise/rightLogShift.js +68 -81
  118. package/lib/cjs/function/bitwise/useMatrixForArrayScalar.js +36 -0
  119. package/lib/cjs/function/complex/arg.js +5 -3
  120. package/lib/cjs/function/complex/conj.js +6 -7
  121. package/lib/cjs/function/complex/im.js +7 -8
  122. package/lib/cjs/function/complex/re.js +6 -10
  123. package/lib/cjs/function/logical/and.js +74 -80
  124. package/lib/cjs/function/logical/not.js +13 -6
  125. package/lib/cjs/function/logical/or.js +21 -63
  126. package/lib/cjs/function/logical/xor.js +21 -63
  127. package/lib/cjs/function/matrix/diff.js +10 -7
  128. package/lib/cjs/function/matrix/eigs/complexEigs.js +5 -5
  129. package/lib/cjs/function/matrix/fft.js +2 -2
  130. package/lib/cjs/function/matrix/matrixFromColumns.js +1 -1
  131. package/lib/cjs/function/matrix/matrixFromRows.js +1 -1
  132. package/lib/cjs/function/matrix/ones.js +2 -1
  133. package/lib/cjs/function/matrix/sqrtm.js +3 -2
  134. package/lib/cjs/function/matrix/transpose.js +47 -48
  135. package/lib/cjs/function/matrix/zeros.js +2 -1
  136. package/lib/cjs/function/probability/factorial.js +5 -3
  137. package/lib/cjs/function/probability/gamma.js +38 -40
  138. package/lib/cjs/function/probability/kldivergence.js +5 -2
  139. package/lib/cjs/function/probability/lgamma.js +30 -30
  140. package/lib/cjs/function/probability/util/seededRNG.js +2 -2
  141. package/lib/cjs/function/relational/compare.js +21 -67
  142. package/lib/cjs/function/relational/compareNatural.js +59 -54
  143. package/lib/cjs/function/relational/compareText.js +10 -43
  144. package/lib/cjs/function/relational/compareUnits.js +24 -0
  145. package/lib/cjs/function/relational/equal.js +19 -80
  146. package/lib/cjs/function/relational/equalScalar.js +7 -9
  147. package/lib/cjs/function/relational/larger.js +21 -67
  148. package/lib/cjs/function/relational/largerEq.js +21 -67
  149. package/lib/cjs/function/relational/smaller.js +21 -67
  150. package/lib/cjs/function/relational/smallerEq.js +21 -67
  151. package/lib/cjs/function/relational/unequal.js +19 -80
  152. package/lib/cjs/function/special/erf.js +5 -3
  153. package/lib/cjs/function/statistics/std.js +11 -2
  154. package/lib/cjs/function/trigonometry/acos.js +4 -8
  155. package/lib/cjs/function/trigonometry/acosh.js +2 -7
  156. package/lib/cjs/function/trigonometry/acot.js +4 -8
  157. package/lib/cjs/function/trigonometry/acoth.js +4 -8
  158. package/lib/cjs/function/trigonometry/acsc.js +4 -8
  159. package/lib/cjs/function/trigonometry/acsch.js +4 -8
  160. package/lib/cjs/function/trigonometry/asec.js +4 -8
  161. package/lib/cjs/function/trigonometry/asech.js +4 -8
  162. package/lib/cjs/function/trigonometry/asin.js +4 -9
  163. package/lib/cjs/function/trigonometry/asinh.js +4 -9
  164. package/lib/cjs/function/trigonometry/atan.js +4 -9
  165. package/lib/cjs/function/trigonometry/atan2.js +24 -62
  166. package/lib/cjs/function/trigonometry/atanh.js +4 -9
  167. package/lib/cjs/function/trigonometry/cos.js +11 -20
  168. package/lib/cjs/function/trigonometry/cosh.js +5 -19
  169. package/lib/cjs/function/trigonometry/cot.js +9 -15
  170. package/lib/cjs/function/trigonometry/coth.js +4 -15
  171. package/lib/cjs/function/trigonometry/csc.js +11 -17
  172. package/lib/cjs/function/trigonometry/csch.js +4 -15
  173. package/lib/cjs/function/trigonometry/sec.js +11 -17
  174. package/lib/cjs/function/trigonometry/sech.js +4 -15
  175. package/lib/cjs/function/trigonometry/sin.js +11 -21
  176. package/lib/cjs/function/trigonometry/sinh.js +5 -20
  177. package/lib/cjs/function/trigonometry/tan.js +11 -21
  178. package/lib/cjs/function/trigonometry/tanh.js +5 -20
  179. package/lib/cjs/function/trigonometry/trigUnit.js +24 -0
  180. package/lib/cjs/function/unit/to.js +7 -41
  181. package/lib/cjs/function/utils/hasNumericValue.js +4 -0
  182. package/lib/cjs/function/utils/isInteger.js +5 -3
  183. package/lib/cjs/function/utils/isNegative.js +10 -6
  184. package/lib/cjs/function/utils/isNumeric.js +5 -3
  185. package/lib/cjs/function/utils/isPositive.js +10 -6
  186. package/lib/cjs/function/utils/isPrime.js +5 -3
  187. package/lib/cjs/function/utils/isZero.js +10 -6
  188. package/lib/cjs/function/utils/numeric.js +11 -4
  189. package/lib/cjs/function/utils/typeOf.js +38 -44
  190. package/lib/cjs/header.js +2 -2
  191. package/lib/cjs/plain/bignumber/index.js +1 -1
  192. package/lib/cjs/type/bignumber/BigNumber.js +2 -2
  193. package/lib/cjs/type/bignumber/function/bignumber.js +6 -4
  194. package/lib/cjs/type/boolean.js +7 -5
  195. package/lib/cjs/type/chain/Chain.js +23 -3
  196. package/lib/cjs/type/complex/Complex.js +18 -14
  197. package/lib/cjs/type/complex/function/complex.js +6 -4
  198. package/lib/cjs/type/fraction/Fraction.js +10 -6
  199. package/lib/cjs/type/fraction/function/fraction.js +6 -4
  200. package/lib/cjs/type/matrix/DenseMatrix.js +21 -6
  201. package/lib/cjs/type/matrix/SparseMatrix.js +12 -2
  202. package/lib/cjs/type/matrix/utils/{algorithm01.js → matAlgo01xDSid.js} +4 -4
  203. package/lib/cjs/type/matrix/utils/{algorithm02.js → matAlgo02xDS0.js} +5 -5
  204. package/lib/cjs/type/matrix/utils/{algorithm03.js → matAlgo03xDSf.js} +5 -5
  205. package/lib/cjs/type/matrix/utils/{algorithm04.js → matAlgo04xSidSid.js} +7 -7
  206. package/lib/cjs/type/matrix/utils/{algorithm05.js → matAlgo05xSfSf.js} +5 -5
  207. package/lib/cjs/type/matrix/utils/{algorithm06.js → matAlgo06xS0S0.js} +5 -5
  208. package/lib/cjs/type/matrix/utils/{algorithm07.js → matAlgo07xSSf.js} +5 -5
  209. package/lib/cjs/type/matrix/utils/{algorithm08.js → matAlgo08xS0Sid.js} +6 -6
  210. package/lib/cjs/type/matrix/utils/{algorithm09.js → matAlgo09xS0Sf.js} +5 -5
  211. package/lib/cjs/type/matrix/utils/{algorithm10.js → matAlgo10xSids.js} +5 -5
  212. package/lib/cjs/type/matrix/utils/{algorithm11.js → matAlgo11xS0s.js} +5 -5
  213. package/lib/cjs/type/matrix/utils/{algorithm12.js → matAlgo12xSfs.js} +5 -5
  214. package/lib/cjs/type/matrix/utils/{algorithm13.js → matAlgo13xDD.js} +5 -5
  215. package/lib/cjs/type/matrix/utils/{algorithm14.js → matAlgo14xDs.js} +5 -5
  216. package/lib/cjs/type/matrix/utils/matrixAlgorithmSuite.js +238 -0
  217. package/lib/cjs/type/number.js +6 -4
  218. package/lib/cjs/type/string.js +7 -5
  219. package/lib/cjs/type/unit/Unit.js +69 -21
  220. package/lib/cjs/type/unit/function/createUnit.js +2 -1
  221. package/lib/cjs/type/unit/function/unit.js +9 -3
  222. package/lib/cjs/utils/customs.js +2 -2
  223. package/lib/cjs/utils/emitter.js +1 -1
  224. package/lib/cjs/utils/function.js +2 -2
  225. package/lib/cjs/utils/is.js +27 -25
  226. package/lib/cjs/utils/latex.js +3 -3
  227. package/lib/cjs/utils/lruQueue.js +1 -1
  228. package/lib/cjs/utils/map.js +3 -3
  229. package/lib/cjs/utils/object.js +2 -2
  230. package/lib/cjs/utils/snapshot.js +30 -57
  231. package/lib/cjs/utils/string.js +3 -3
  232. package/lib/cjs/version.js +1 -1
  233. package/lib/esm/core/create.js +2 -1
  234. package/lib/esm/core/function/import.js +2 -12
  235. package/lib/esm/core/function/typed.js +47 -11
  236. package/lib/esm/entry/dependenciesAny/dependenciesChainClass.generated.js +2 -0
  237. package/lib/esm/entry/dependenciesAny/dependenciesKldivergence.generated.js +2 -0
  238. package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +2 -0
  239. package/lib/esm/entry/dependenciesAny/dependenciesResolve.generated.js +2 -0
  240. package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +2 -0
  241. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +34 -0
  242. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +4 -0
  243. package/lib/esm/entry/dependenciesAny/dependenciesSqrtm.generated.js +2 -0
  244. package/lib/esm/entry/dependenciesAny/dependenciesStd.generated.js +2 -0
  245. package/lib/esm/entry/dependenciesAny/dependenciesStdTransform.generated.js +2 -0
  246. package/lib/esm/entry/dependenciesAny.generated.js +1 -0
  247. package/lib/esm/entry/dependenciesNumber/dependenciesChainClass.generated.js +2 -0
  248. package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +2 -0
  249. package/lib/esm/entry/dependenciesNumber/dependenciesResolve.generated.js +2 -0
  250. package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +2 -0
  251. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +30 -0
  252. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +4 -0
  253. package/lib/esm/entry/dependenciesNumber/dependenciesStd.generated.js +2 -0
  254. package/lib/esm/entry/dependenciesNumber/dependenciesStdTransform.generated.js +2 -0
  255. package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
  256. package/lib/esm/entry/impureFunctionsAny.generated.js +73 -48
  257. package/lib/esm/entry/impureFunctionsNumber.generated.js +81 -58
  258. package/lib/esm/entry/pureFunctionsAny.generated.js +39 -36
  259. package/lib/esm/entry/pureFunctionsNumber.generated.js +14 -13
  260. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +2 -0
  261. package/lib/esm/expression/embeddedDocs/function/algebra/simplifyConstant.js +8 -0
  262. package/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js +1 -1
  263. package/lib/esm/expression/node/AccessorNode.js +158 -153
  264. package/lib/esm/expression/node/ArrayNode.js +162 -154
  265. package/lib/esm/expression/node/AssignmentNode.js +257 -245
  266. package/lib/esm/expression/node/BlockNode.js +177 -163
  267. package/lib/esm/expression/node/ConditionalNode.js +197 -174
  268. package/lib/esm/expression/node/ConstantNode.js +171 -163
  269. package/lib/esm/expression/node/FunctionAssignmentNode.js +205 -180
  270. package/lib/esm/expression/node/FunctionNode.js +407 -407
  271. package/lib/esm/expression/node/IndexNode.js +206 -198
  272. package/lib/esm/expression/node/Node.js +325 -325
  273. package/lib/esm/expression/node/ObjectNode.js +166 -157
  274. package/lib/esm/expression/node/OperatorNode.js +414 -377
  275. package/lib/esm/expression/node/ParenthesisNode.js +146 -138
  276. package/lib/esm/expression/node/RangeNode.js +221 -212
  277. package/lib/esm/expression/node/RelationalNode.js +190 -176
  278. package/lib/esm/expression/node/SymbolNode.js +161 -152
  279. package/lib/esm/expression/operators.js +96 -4
  280. package/lib/esm/expression/parse.js +25 -7
  281. package/lib/esm/expression/transform/std.transform.js +3 -1
  282. package/lib/esm/factoriesAny.js +1 -0
  283. package/lib/esm/factoriesNumber.js +1 -0
  284. package/lib/esm/function/algebra/derivative.js +22 -30
  285. package/lib/esm/function/algebra/leafCount.js +0 -3
  286. package/lib/esm/function/algebra/rationalize.js +83 -114
  287. package/lib/esm/function/algebra/resolve.js +25 -16
  288. package/lib/esm/function/algebra/simplify.js +82 -112
  289. package/lib/esm/function/algebra/{simplify/simplifyConstant.js → simplifyConstant.js} +39 -9
  290. package/lib/esm/function/algebra/simplifyCore.js +192 -91
  291. package/lib/esm/function/algebra/symbolicEqual.js +9 -26
  292. package/lib/esm/function/arithmetic/abs.js +3 -16
  293. package/lib/esm/function/arithmetic/add.js +21 -65
  294. package/lib/esm/function/arithmetic/addScalar.js +11 -5
  295. package/lib/esm/function/arithmetic/cbrt.js +7 -10
  296. package/lib/esm/function/arithmetic/ceil.js +25 -25
  297. package/lib/esm/function/arithmetic/cube.js +5 -9
  298. package/lib/esm/function/arithmetic/divide.js +7 -7
  299. package/lib/esm/function/arithmetic/divideScalar.js +2 -19
  300. package/lib/esm/function/arithmetic/dotDivide.js +22 -64
  301. package/lib/esm/function/arithmetic/dotMultiply.js +16 -60
  302. package/lib/esm/function/arithmetic/dotPow.js +30 -62
  303. package/lib/esm/function/arithmetic/exp.js +8 -11
  304. package/lib/esm/function/arithmetic/expm1.js +10 -9
  305. package/lib/esm/function/arithmetic/fix.js +17 -17
  306. package/lib/esm/function/arithmetic/floor.js +25 -25
  307. package/lib/esm/function/arithmetic/gcd.js +26 -70
  308. package/lib/esm/function/arithmetic/hypot.js +7 -6
  309. package/lib/esm/function/arithmetic/lcm.js +26 -70
  310. package/lib/esm/function/arithmetic/log.js +7 -10
  311. package/lib/esm/function/arithmetic/log10.js +1 -3
  312. package/lib/esm/function/arithmetic/log1p.js +4 -6
  313. package/lib/esm/function/arithmetic/log2.js +1 -3
  314. package/lib/esm/function/arithmetic/mod.js +21 -62
  315. package/lib/esm/function/arithmetic/multiply.js +23 -27
  316. package/lib/esm/function/arithmetic/multiplyScalar.js +2 -13
  317. package/lib/esm/function/arithmetic/norm.js +0 -4
  318. package/lib/esm/function/arithmetic/nthRoot.js +38 -73
  319. package/lib/esm/function/arithmetic/round.js +26 -28
  320. package/lib/esm/function/arithmetic/sign.js +5 -7
  321. package/lib/esm/function/arithmetic/sqrt.js +5 -8
  322. package/lib/esm/function/arithmetic/square.js +6 -9
  323. package/lib/esm/function/arithmetic/subtract.js +31 -95
  324. package/lib/esm/function/arithmetic/unaryMinus.js +6 -16
  325. package/lib/esm/function/arithmetic/unaryPlus.js +2 -4
  326. package/lib/esm/function/bitwise/bitAnd.js +16 -59
  327. package/lib/esm/function/bitwise/bitNot.js +1 -3
  328. package/lib/esm/function/bitwise/bitOr.js +16 -59
  329. package/lib/esm/function/bitwise/bitXor.js +16 -59
  330. package/lib/esm/function/bitwise/leftShift.js +38 -60
  331. package/lib/esm/function/bitwise/rightArithShift.js +38 -60
  332. package/lib/esm/function/bitwise/rightLogShift.js +38 -60
  333. package/lib/esm/function/bitwise/useMatrixForArrayScalar.js +13 -0
  334. package/lib/esm/function/complex/arg.js +1 -3
  335. package/lib/esm/function/complex/conj.js +3 -12
  336. package/lib/esm/function/complex/im.js +4 -15
  337. package/lib/esm/function/complex/re.js +3 -15
  338. package/lib/esm/function/logical/and.js +35 -57
  339. package/lib/esm/function/logical/not.js +3 -6
  340. package/lib/esm/function/logical/or.js +16 -61
  341. package/lib/esm/function/logical/xor.js +16 -61
  342. package/lib/esm/function/matrix/diff.js +2 -7
  343. package/lib/esm/function/matrix/ones.js +2 -1
  344. package/lib/esm/function/matrix/sqrtm.js +3 -2
  345. package/lib/esm/function/matrix/transpose.js +47 -50
  346. package/lib/esm/function/matrix/zeros.js +2 -1
  347. package/lib/esm/function/probability/factorial.js +1 -3
  348. package/lib/esm/function/probability/gamma.js +38 -39
  349. package/lib/esm/function/probability/kldivergence.js +3 -2
  350. package/lib/esm/function/probability/lgamma.js +29 -29
  351. package/lib/esm/function/relational/compare.js +21 -67
  352. package/lib/esm/function/relational/compareNatural.js +54 -49
  353. package/lib/esm/function/relational/compareText.js +10 -42
  354. package/lib/esm/function/relational/compareUnits.js +15 -0
  355. package/lib/esm/function/relational/equal.js +19 -79
  356. package/lib/esm/function/relational/equalScalar.js +6 -9
  357. package/lib/esm/function/relational/larger.js +23 -73
  358. package/lib/esm/function/relational/largerEq.js +23 -73
  359. package/lib/esm/function/relational/smaller.js +23 -73
  360. package/lib/esm/function/relational/smallerEq.js +23 -73
  361. package/lib/esm/function/relational/unequal.js +19 -79
  362. package/lib/esm/function/special/erf.js +1 -3
  363. package/lib/esm/function/statistics/std.js +10 -2
  364. package/lib/esm/function/trigonometry/acos.js +4 -7
  365. package/lib/esm/function/trigonometry/acosh.js +2 -6
  366. package/lib/esm/function/trigonometry/acot.js +4 -7
  367. package/lib/esm/function/trigonometry/acoth.js +4 -7
  368. package/lib/esm/function/trigonometry/acsc.js +4 -7
  369. package/lib/esm/function/trigonometry/acsch.js +4 -7
  370. package/lib/esm/function/trigonometry/asec.js +4 -7
  371. package/lib/esm/function/trigonometry/asech.js +4 -7
  372. package/lib/esm/function/trigonometry/asin.js +4 -8
  373. package/lib/esm/function/trigonometry/asinh.js +4 -8
  374. package/lib/esm/function/trigonometry/atan.js +4 -8
  375. package/lib/esm/function/trigonometry/atan2.js +25 -64
  376. package/lib/esm/function/trigonometry/atanh.js +4 -8
  377. package/lib/esm/function/trigonometry/cos.js +11 -22
  378. package/lib/esm/function/trigonometry/cosh.js +5 -20
  379. package/lib/esm/function/trigonometry/cot.js +10 -20
  380. package/lib/esm/function/trigonometry/coth.js +6 -20
  381. package/lib/esm/function/trigonometry/csc.js +12 -22
  382. package/lib/esm/function/trigonometry/csch.js +6 -20
  383. package/lib/esm/function/trigonometry/sec.js +12 -22
  384. package/lib/esm/function/trigonometry/sech.js +6 -20
  385. package/lib/esm/function/trigonometry/sin.js +11 -23
  386. package/lib/esm/function/trigonometry/sinh.js +5 -21
  387. package/lib/esm/function/trigonometry/tan.js +11 -23
  388. package/lib/esm/function/trigonometry/tanh.js +5 -21
  389. package/lib/esm/function/trigonometry/trigUnit.js +15 -0
  390. package/lib/esm/function/unit/to.js +8 -43
  391. package/lib/esm/function/utils/hasNumericValue.js +2 -0
  392. package/lib/esm/function/utils/isInteger.js +1 -3
  393. package/lib/esm/function/utils/isNegative.js +2 -6
  394. package/lib/esm/function/utils/isNumeric.js +3 -9
  395. package/lib/esm/function/utils/isPositive.js +2 -6
  396. package/lib/esm/function/utils/isPrime.js +1 -3
  397. package/lib/esm/function/utils/isZero.js +2 -6
  398. package/lib/esm/function/utils/numeric.js +11 -4
  399. package/lib/esm/function/utils/typeOf.js +38 -44
  400. package/lib/esm/type/bignumber/function/bignumber.js +1 -3
  401. package/lib/esm/type/boolean.js +1 -3
  402. package/lib/esm/type/chain/Chain.js +23 -3
  403. package/lib/esm/type/complex/Complex.js +4 -0
  404. package/lib/esm/type/complex/function/complex.js +1 -3
  405. package/lib/esm/type/fraction/Fraction.js +4 -0
  406. package/lib/esm/type/fraction/function/fraction.js +1 -3
  407. package/lib/esm/type/matrix/DenseMatrix.js +15 -1
  408. package/lib/esm/type/matrix/SparseMatrix.js +9 -0
  409. package/lib/esm/type/matrix/utils/{algorithm01.js → matAlgo01xDSid.js} +2 -2
  410. package/lib/esm/type/matrix/utils/{algorithm02.js → matAlgo02xDS0.js} +3 -3
  411. package/lib/esm/type/matrix/utils/{algorithm03.js → matAlgo03xDSf.js} +3 -3
  412. package/lib/esm/type/matrix/utils/{algorithm04.js → matAlgo04xSidSid.js} +5 -5
  413. package/lib/esm/type/matrix/utils/{algorithm05.js → matAlgo05xSfSf.js} +3 -3
  414. package/lib/esm/type/matrix/utils/{algorithm06.js → matAlgo06xS0S0.js} +3 -3
  415. package/lib/esm/type/matrix/utils/{algorithm07.js → matAlgo07xSSf.js} +3 -3
  416. package/lib/esm/type/matrix/utils/{algorithm08.js → matAlgo08xS0Sid.js} +4 -4
  417. package/lib/esm/type/matrix/utils/{algorithm09.js → matAlgo09xS0Sf.js} +3 -3
  418. package/lib/esm/type/matrix/utils/{algorithm10.js → matAlgo10xSids.js} +3 -3
  419. package/lib/esm/type/matrix/utils/{algorithm11.js → matAlgo11xS0s.js} +3 -3
  420. package/lib/esm/type/matrix/utils/{algorithm12.js → matAlgo12xSfs.js} +3 -3
  421. package/lib/esm/type/matrix/utils/{algorithm13.js → matAlgo13xDD.js} +3 -3
  422. package/lib/esm/type/matrix/utils/{algorithm14.js → matAlgo14xDs.js} +3 -3
  423. package/lib/esm/type/matrix/utils/matrixAlgorithmSuite.js +168 -0
  424. package/lib/esm/type/number.js +1 -3
  425. package/lib/esm/type/string.js +1 -3
  426. package/lib/esm/type/unit/Unit.js +61 -13
  427. package/lib/esm/type/unit/function/createUnit.js +2 -1
  428. package/lib/esm/type/unit/function/unit.js +5 -3
  429. package/lib/esm/utils/is.js +18 -18
  430. package/lib/esm/utils/snapshot.js +22 -48
  431. package/lib/esm/version.js +1 -1
  432. package/package.json +21 -24
  433. package/types/index.d.ts +202 -181
  434. package/types/index.ts +264 -57
  435. package/lib/cjs/utils/polyfills.js +0 -14
  436. package/lib/esm/utils/polyfills.js +0 -12
@@ -7,10 +7,24 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.createFunctionNode = void 0;
9
9
 
10
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
-
12
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
11
 
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
+
26
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
27
+
14
28
  var _is = require("../../utils/is.js");
15
29
 
16
30
  var _string = require("../../utils/string.js");
@@ -25,6 +39,10 @@ var _factory = require("../../utils/factory.js");
25
39
 
26
40
  var _latex = require("../../utils/latex.js");
27
41
 
42
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
43
+
44
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
45
+
28
46
  var name = 'FunctionNode';
29
47
  var dependencies = ['math', 'Node', 'SymbolNode'];
30
48
  var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
@@ -32,351 +50,12 @@ var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
32
50
  Node = _ref.Node,
33
51
  SymbolNode = _ref.SymbolNode;
34
52
 
35
- /**
36
- * @constructor FunctionNode
37
- * @extends {./Node}
38
- * invoke a list with arguments on a node
39
- * @param {./Node | string} fn Node resolving with a function on which to invoke
40
- * the arguments, typically a SymboNode or AccessorNode
41
- * @param {./Node[]} args
42
- */
43
- function FunctionNode(fn, args) {
44
- if (!(this instanceof FunctionNode)) {
45
- throw new SyntaxError('Constructor must be called with the new operator');
46
- }
47
-
48
- if (typeof fn === 'string') {
49
- fn = new SymbolNode(fn);
50
- } // validate input
51
-
52
-
53
- if (!(0, _is.isNode)(fn)) throw new TypeError('Node expected as parameter "fn"');
54
-
55
- if (!Array.isArray(args) || !args.every(_is.isNode)) {
56
- throw new TypeError('Array containing Nodes expected for parameter "args"');
57
- }
58
-
59
- this.fn = fn;
60
- this.args = args || []; // readonly property name
61
-
62
- Object.defineProperty(this, 'name', {
63
- get: function () {
64
- return this.fn.name || '';
65
- }.bind(this),
66
- set: function set() {
67
- throw new Error('Cannot assign a new name, name is read-only');
68
- }
69
- });
70
- }
71
-
72
- FunctionNode.prototype = new Node();
73
- FunctionNode.prototype.type = 'FunctionNode';
74
- FunctionNode.prototype.isFunctionNode = true;
75
53
  /* format to fixed length */
76
-
77
54
  var strin = function strin(entity) {
78
55
  return (0, _string.format)(entity, {
79
56
  truncate: 78
80
57
  });
81
58
  };
82
- /**
83
- * Compile a node into a JavaScript function.
84
- * This basically pre-calculates as much as possible and only leaves open
85
- * calculations which depend on a dynamic scope with variables.
86
- * @param {Object} math Math.js namespace with functions and constants.
87
- * @param {Object} argNames An object with argument names as key and `true`
88
- * as value. Used in the SymbolNode to optimize
89
- * for arguments from user assigned functions
90
- * (see FunctionAssignmentNode) or special symbols
91
- * like `end` (see IndexNode).
92
- * @return {function} Returns a function which can be called like:
93
- * evalNode(scope: Object, args: Object, context: *)
94
- */
95
-
96
-
97
- FunctionNode.prototype._compile = function (math, argNames) {
98
- if (!(this instanceof FunctionNode)) {
99
- throw new TypeError('No valid FunctionNode');
100
- } // compile arguments
101
-
102
-
103
- var evalArgs = this.args.map(function (arg) {
104
- return arg._compile(math, argNames);
105
- });
106
-
107
- if ((0, _is.isSymbolNode)(this.fn)) {
108
- var _name = this.fn.name;
109
-
110
- if (!argNames[_name]) {
111
- // we can statically determine whether the function has an rawArgs property
112
- var fn = _name in math ? (0, _customs.getSafeProperty)(math, _name) : undefined;
113
- var isRaw = typeof fn === 'function' && fn.rawArgs === true;
114
-
115
- var resolveFn = function resolveFn(scope) {
116
- var value;
117
-
118
- if (scope.has(_name)) {
119
- value = scope.get(_name);
120
- } else if (_name in math) {
121
- value = (0, _customs.getSafeProperty)(math, _name);
122
- } else {
123
- return FunctionNode.onUndefinedFunction(_name);
124
- }
125
-
126
- if (typeof value === 'function') {
127
- return value;
128
- }
129
-
130
- throw new TypeError("'".concat(_name, "' is not a function; its value is:\n ").concat(strin(value)));
131
- };
132
-
133
- if (isRaw) {
134
- // pass unevaluated parameters (nodes) to the function
135
- // "raw" evaluation
136
- var rawArgs = this.args;
137
- return function evalFunctionNode(scope, args, context) {
138
- var fn = resolveFn(scope);
139
- return fn(rawArgs, math, (0, _scope.createSubScope)(scope, args), scope);
140
- };
141
- } else {
142
- // "regular" evaluation
143
- switch (evalArgs.length) {
144
- case 0:
145
- return function evalFunctionNode(scope, args, context) {
146
- var fn = resolveFn(scope);
147
- return fn();
148
- };
149
-
150
- case 1:
151
- return function evalFunctionNode(scope, args, context) {
152
- var fn = resolveFn(scope);
153
- var evalArg0 = evalArgs[0];
154
- return fn(evalArg0(scope, args, context));
155
- };
156
-
157
- case 2:
158
- return function evalFunctionNode(scope, args, context) {
159
- var fn = resolveFn(scope);
160
- var evalArg0 = evalArgs[0];
161
- var evalArg1 = evalArgs[1];
162
- return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
163
- };
164
-
165
- default:
166
- return function evalFunctionNode(scope, args, context) {
167
- var fn = resolveFn(scope);
168
- var values = evalArgs.map(function (evalArg) {
169
- return evalArg(scope, args, context);
170
- });
171
- return fn.apply(void 0, (0, _toConsumableArray2.default)(values));
172
- };
173
- }
174
- }
175
- } else {
176
- // the function symbol is an argName
177
- var _rawArgs = this.args;
178
- return function evalFunctionNode(scope, args, context) {
179
- var fn = args[_name];
180
-
181
- if (typeof fn !== 'function') {
182
- throw new TypeError("Argument '".concat(_name, "' was not a function; received: ").concat(strin(fn)));
183
- }
184
-
185
- if (fn.rawArgs) {
186
- return fn(_rawArgs, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
187
- } else {
188
- var values = evalArgs.map(function (evalArg) {
189
- return evalArg(scope, args, context);
190
- });
191
- return fn.apply(fn, values);
192
- }
193
- };
194
- }
195
- } else if ((0, _is.isAccessorNode)(this.fn) && (0, _is.isIndexNode)(this.fn.index) && this.fn.index.isObjectProperty()) {
196
- // execute the function with the right context: the object of the AccessorNode
197
- var evalObject = this.fn.object._compile(math, argNames);
198
-
199
- var prop = this.fn.index.getObjectProperty();
200
- var _rawArgs2 = this.args;
201
- return function evalFunctionNode(scope, args, context) {
202
- var object = evalObject(scope, args, context);
203
- (0, _customs.validateSafeMethod)(object, prop);
204
- var isRaw = object[prop] && object[prop].rawArgs;
205
-
206
- if (isRaw) {
207
- return object[prop](_rawArgs2, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
208
- } else {
209
- // "regular" evaluation
210
- var values = evalArgs.map(function (evalArg) {
211
- return evalArg(scope, args, context);
212
- });
213
- return object[prop].apply(object, values);
214
- }
215
- };
216
- } else {
217
- // node.fn.isAccessorNode && !node.fn.index.isObjectProperty()
218
- // we have to dynamically determine whether the function has a rawArgs property
219
- var fnExpr = this.fn.toString();
220
-
221
- var evalFn = this.fn._compile(math, argNames);
222
-
223
- var _rawArgs3 = this.args;
224
- return function evalFunctionNode(scope, args, context) {
225
- var fn = evalFn(scope, args, context);
226
-
227
- if (typeof fn !== 'function') {
228
- throw new TypeError("Expression '".concat(fnExpr, "' did not evaluate to a function; value is:") + "\n ".concat(strin(fn)));
229
- }
230
-
231
- if (fn.rawArgs) {
232
- return fn(_rawArgs3, math, (0, _scope.createSubScope)(scope, args), scope); // "raw" evaluation
233
- } else {
234
- // "regular" evaluation
235
- var values = evalArgs.map(function (evalArg) {
236
- return evalArg(scope, args, context);
237
- });
238
- return fn.apply(fn, values);
239
- }
240
- };
241
- }
242
- };
243
- /**
244
- * Execute a callback for each of the child nodes of this node
245
- * @param {function(child: Node, path: string, parent: Node)} callback
246
- */
247
-
248
-
249
- FunctionNode.prototype.forEach = function (callback) {
250
- callback(this.fn, 'fn', this);
251
-
252
- for (var i = 0; i < this.args.length; i++) {
253
- callback(this.args[i], 'args[' + i + ']', this);
254
- }
255
- };
256
- /**
257
- * Create a new FunctionNode having it's childs be the results of calling
258
- * the provided callback function for each of the childs of the original node.
259
- * @param {function(child: Node, path: string, parent: Node): Node} callback
260
- * @returns {FunctionNode} Returns a transformed copy of the node
261
- */
262
-
263
-
264
- FunctionNode.prototype.map = function (callback) {
265
- var fn = this._ifNode(callback(this.fn, 'fn', this));
266
-
267
- var args = [];
268
-
269
- for (var i = 0; i < this.args.length; i++) {
270
- args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
271
- }
272
-
273
- return new FunctionNode(fn, args);
274
- };
275
- /**
276
- * Create a clone of this node, a shallow copy
277
- * @return {FunctionNode}
278
- */
279
-
280
-
281
- FunctionNode.prototype.clone = function () {
282
- return new FunctionNode(this.fn, this.args.slice(0));
283
- };
284
- /**
285
- * Throws an error 'Undefined function {name}'
286
- * @param {string} name
287
- */
288
-
289
-
290
- FunctionNode.onUndefinedFunction = function (name) {
291
- throw new Error('Undefined function ' + name);
292
- }; // backup Node's toString function
293
- // @private
294
-
295
-
296
- var nodeToString = FunctionNode.prototype.toString;
297
- /**
298
- * Get string representation. (wrapper function)
299
- * This overrides parts of Node's toString function.
300
- * If callback is an object containing callbacks, it
301
- * calls the correct callback for the current node,
302
- * otherwise it falls back to calling Node's toString
303
- * function.
304
- *
305
- * @param {Object} options
306
- * @return {string} str
307
- * @override
308
- */
309
-
310
- FunctionNode.prototype.toString = function (options) {
311
- var customString;
312
- var name = this.fn.toString(options);
313
-
314
- if (options && (0, _typeof2.default)(options.handler) === 'object' && (0, _object.hasOwnProperty)(options.handler, name)) {
315
- // callback is a map of callback functions
316
- customString = options.handler[name](this, options);
317
- }
318
-
319
- if (typeof customString !== 'undefined') {
320
- return customString;
321
- } // fall back to Node's toString
322
-
323
-
324
- return nodeToString.call(this, options);
325
- };
326
- /**
327
- * Get string representation
328
- * @param {Object} options
329
- * @return {string} str
330
- */
331
-
332
-
333
- FunctionNode.prototype._toString = function (options) {
334
- var args = this.args.map(function (arg) {
335
- return arg.toString(options);
336
- });
337
- var fn = (0, _is.isFunctionAssignmentNode)(this.fn) ? '(' + this.fn.toString(options) + ')' : this.fn.toString(options); // format the arguments like "add(2, 4.2)"
338
-
339
- return fn + '(' + args.join(', ') + ')';
340
- };
341
- /**
342
- * Get a JSON representation of the node
343
- * @returns {Object}
344
- */
345
-
346
-
347
- FunctionNode.prototype.toJSON = function () {
348
- return {
349
- mathjs: 'FunctionNode',
350
- fn: this.fn,
351
- args: this.args
352
- };
353
- };
354
- /**
355
- * Instantiate an AssignmentNode from its JSON representation
356
- * @param {Object} json An object structured like
357
- * `{"mathjs": "FunctionNode", fn: ..., args: ...}`,
358
- * where mathjs is optional
359
- * @returns {FunctionNode}
360
- */
361
-
362
-
363
- FunctionNode.fromJSON = function (json) {
364
- return new FunctionNode(json.fn, json.args);
365
- };
366
- /**
367
- * Get HTML representation
368
- * @param {Object} options
369
- * @return {string} str
370
- */
371
-
372
-
373
- FunctionNode.prototype.toHTML = function (options) {
374
- var args = this.args.map(function (arg) {
375
- return arg.toHTML(options);
376
- }); // format the arguments like "add(2, 4.2)"
377
-
378
- return '<span class="math-function">' + (0, _string.escape)(this.fn) + '</span><span class="math-paranthesis math-round-parenthesis">(</span>' + args.join('<span class="math-separator">,</span>') + '<span class="math-paranthesis math-round-parenthesis">)</span>';
379
- };
380
59
  /*
381
60
  * Expand a LaTeX template
382
61
  *
@@ -417,7 +96,7 @@ var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
417
96
 
418
97
  if (match[2] === undefined) {
419
98
  // no square brackets
420
- switch ((0, _typeof2.default)(property)) {
99
+ switch ((0, _typeof2["default"])(property)) {
421
100
  case 'string':
422
101
  latex += property;
423
102
  break;
@@ -457,105 +136,466 @@ var createFunctionNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies
457
136
  latex += template.slice(inputPos); // append rest of the template
458
137
 
459
138
  return latex;
460
- } // backup Node's toTex function
461
- // @private
462
-
463
-
464
- var nodeToTex = FunctionNode.prototype.toTex;
465
- /**
466
- * Get LaTeX representation. (wrapper function)
467
- * This overrides parts of Node's toTex function.
468
- * If callback is an object containing callbacks, it
469
- * calls the correct callback for the current node,
470
- * otherwise it falls back to calling Node's toTex
471
- * function.
472
- *
473
- * @param {Object} options
474
- * @return {string}
475
- */
139
+ }
476
140
 
477
- FunctionNode.prototype.toTex = function (options) {
478
- var customTex;
141
+ var FunctionNode = /*#__PURE__*/function (_Node) {
142
+ (0, _inherits2["default"])(FunctionNode, _Node);
479
143
 
480
- if (options && (0, _typeof2.default)(options.handler) === 'object' && (0, _object.hasOwnProperty)(options.handler, this.name)) {
481
- // callback is a map of callback functions
482
- customTex = options.handler[this.name](this, options);
483
- }
144
+ var _super = _createSuper(FunctionNode);
484
145
 
485
- if (typeof customTex !== 'undefined') {
486
- return customTex;
487
- } // fall back to Node's toTex
146
+ /**
147
+ * @constructor FunctionNode
148
+ * @extends {./Node}
149
+ * invoke a list with arguments on a node
150
+ * @param {./Node | string} fn
151
+ * Item resolving to a function on which to invoke
152
+ * the arguments, typically a SymboNode or AccessorNode
153
+ * @param {./Node[]} args
154
+ */
155
+ function FunctionNode(fn, args) {
156
+ var _this;
488
157
 
158
+ (0, _classCallCheck2["default"])(this, FunctionNode);
159
+ _this = _super.call(this);
489
160
 
490
- return nodeToTex.call(this, options);
491
- };
492
- /**
493
- * Get LaTeX representation
494
- * @param {Object} options
495
- * @return {string} str
496
- */
161
+ if (typeof fn === 'string') {
162
+ fn = new SymbolNode(fn);
163
+ } // validate input
497
164
 
498
165
 
499
- FunctionNode.prototype._toTex = function (options) {
500
- var args = this.args.map(function (arg) {
501
- // get LaTeX of the arguments
502
- return arg.toTex(options);
503
- });
504
- var latexConverter;
166
+ if (!(0, _is.isNode)(fn)) throw new TypeError('Node expected as parameter "fn"');
505
167
 
506
- if (_latex.latexFunctions[this.name]) {
507
- latexConverter = _latex.latexFunctions[this.name];
508
- } // toTex property on the function itself
168
+ if (!Array.isArray(args) || !args.every(_is.isNode)) {
169
+ throw new TypeError('Array containing Nodes expected for parameter "args"');
170
+ }
509
171
 
172
+ _this.fn = fn;
173
+ _this.args = args || [];
174
+ return _this;
175
+ } // readonly property name
510
176
 
511
- if (math[this.name] && (typeof math[this.name].toTex === 'function' || (0, _typeof2.default)(math[this.name].toTex) === 'object' || typeof math[this.name].toTex === 'string')) {
512
- // .toTex is a callback function
513
- latexConverter = math[this.name].toTex;
514
- }
515
177
 
516
- var customToTex;
178
+ (0, _createClass2["default"])(FunctionNode, [{
179
+ key: "name",
180
+ get: function get() {
181
+ return this.fn.name || '';
182
+ }
183
+ }, {
184
+ key: "type",
185
+ get: function get() {
186
+ return name;
187
+ }
188
+ }, {
189
+ key: "isFunctionNode",
190
+ get: function get() {
191
+ return true;
192
+ }
193
+ /**
194
+ * Compile a node into a JavaScript function.
195
+ * This basically pre-calculates as much as possible and only leaves open
196
+ * calculations which depend on a dynamic scope with variables.
197
+ * @param {Object} math Math.js namespace with functions and constants.
198
+ * @param {Object} argNames An object with argument names as key and `true`
199
+ * as value. Used in the SymbolNode to optimize
200
+ * for arguments from user assigned functions
201
+ * (see FunctionAssignmentNode) or special symbols
202
+ * like `end` (see IndexNode).
203
+ * @return {function} Returns a function which can be called like:
204
+ * evalNode(scope: Object, args: Object, context: *)
205
+ */
206
+
207
+ }, {
208
+ key: "_compile",
209
+ value: function _compile(math, argNames) {
210
+ // compile arguments
211
+ var evalArgs = this.args.map(function (arg) {
212
+ return arg._compile(math, argNames);
213
+ });
214
+
215
+ if ((0, _is.isSymbolNode)(this.fn)) {
216
+ var _name = this.fn.name;
217
+
218
+ if (!argNames[_name]) {
219
+ // we can statically determine whether the function
220
+ // has the rawArgs property
221
+ var fn = _name in math ? (0, _customs.getSafeProperty)(math, _name) : undefined;
222
+ var isRaw = typeof fn === 'function' && fn.rawArgs === true;
223
+
224
+ var resolveFn = function resolveFn(scope) {
225
+ var value;
226
+
227
+ if (scope.has(_name)) {
228
+ value = scope.get(_name);
229
+ } else if (_name in math) {
230
+ value = (0, _customs.getSafeProperty)(math, _name);
231
+ } else {
232
+ return FunctionNode.onUndefinedFunction(_name);
233
+ }
234
+
235
+ if (typeof value === 'function') {
236
+ return value;
237
+ }
238
+
239
+ throw new TypeError("'".concat(_name, "' is not a function; its value is:\n ").concat(strin(value)));
240
+ };
517
241
 
518
- switch ((0, _typeof2.default)(latexConverter)) {
519
- case 'function':
520
- // a callback function
521
- customToTex = latexConverter(this, options);
522
- break;
242
+ if (isRaw) {
243
+ // pass unevaluated parameters (nodes) to the function
244
+ // "raw" evaluation
245
+ var rawArgs = this.args;
246
+ return function evalFunctionNode(scope, args, context) {
247
+ var fn = resolveFn(scope);
248
+ return fn(rawArgs, math, (0, _scope.createSubScope)(scope, args), scope);
249
+ };
250
+ } else {
251
+ // "regular" evaluation
252
+ switch (evalArgs.length) {
253
+ case 0:
254
+ return function evalFunctionNode(scope, args, context) {
255
+ var fn = resolveFn(scope);
256
+ return fn();
257
+ };
258
+
259
+ case 1:
260
+ return function evalFunctionNode(scope, args, context) {
261
+ var fn = resolveFn(scope);
262
+ var evalArg0 = evalArgs[0];
263
+ return fn(evalArg0(scope, args, context));
264
+ };
265
+
266
+ case 2:
267
+ return function evalFunctionNode(scope, args, context) {
268
+ var fn = resolveFn(scope);
269
+ var evalArg0 = evalArgs[0];
270
+ var evalArg1 = evalArgs[1];
271
+ return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
272
+ };
273
+
274
+ default:
275
+ return function evalFunctionNode(scope, args, context) {
276
+ var fn = resolveFn(scope);
277
+ var values = evalArgs.map(function (evalArg) {
278
+ return evalArg(scope, args, context);
279
+ });
280
+ return fn.apply(void 0, (0, _toConsumableArray2["default"])(values));
281
+ };
282
+ }
283
+ }
284
+ } else {
285
+ // the function symbol is an argName
286
+ var _rawArgs = this.args;
287
+ return function evalFunctionNode(scope, args, context) {
288
+ var fn = args[_name];
523
289
 
524
- case 'string':
525
- // a template string
526
- customToTex = expandTemplate(latexConverter, this, options);
527
- break;
290
+ if (typeof fn !== 'function') {
291
+ throw new TypeError("Argument '".concat(_name, "' was not a function; received: ").concat(strin(fn)));
292
+ }
528
293
 
529
- case 'object':
530
- // an object with different "converters" for different numbers of arguments
531
- switch ((0, _typeof2.default)(latexConverter[args.length])) {
294
+ if (fn.rawArgs) {
295
+ // "Raw" evaluation
296
+ return fn(_rawArgs, math, (0, _scope.createSubScope)(scope, args), scope);
297
+ } else {
298
+ var values = evalArgs.map(function (evalArg) {
299
+ return evalArg(scope, args, context);
300
+ });
301
+ return fn.apply(fn, values);
302
+ }
303
+ };
304
+ }
305
+ } else if ((0, _is.isAccessorNode)(this.fn) && (0, _is.isIndexNode)(this.fn.index) && this.fn.index.isObjectProperty()) {
306
+ // execute the function with the right context:
307
+ // the object of the AccessorNode
308
+ var evalObject = this.fn.object._compile(math, argNames);
309
+
310
+ var prop = this.fn.index.getObjectProperty();
311
+ var _rawArgs2 = this.args;
312
+ return function evalFunctionNode(scope, args, context) {
313
+ var object = evalObject(scope, args, context);
314
+ (0, _customs.validateSafeMethod)(object, prop);
315
+ var isRaw = object[prop] && object[prop].rawArgs;
316
+
317
+ if (isRaw) {
318
+ // "Raw" evaluation
319
+ return object[prop](_rawArgs2, math, (0, _scope.createSubScope)(scope, args), scope);
320
+ } else {
321
+ // "regular" evaluation
322
+ var values = evalArgs.map(function (evalArg) {
323
+ return evalArg(scope, args, context);
324
+ });
325
+ return object[prop].apply(object, values);
326
+ }
327
+ };
328
+ } else {
329
+ // node.fn.isAccessorNode && !node.fn.index.isObjectProperty()
330
+ // we have to dynamically determine whether the function has the
331
+ // rawArgs property
332
+ var fnExpr = this.fn.toString();
333
+
334
+ var evalFn = this.fn._compile(math, argNames);
335
+
336
+ var _rawArgs3 = this.args;
337
+ return function evalFunctionNode(scope, args, context) {
338
+ var fn = evalFn(scope, args, context);
339
+
340
+ if (typeof fn !== 'function') {
341
+ throw new TypeError("Expression '".concat(fnExpr, "' did not evaluate to a function; value is:") + "\n ".concat(strin(fn)));
342
+ }
343
+
344
+ if (fn.rawArgs) {
345
+ // "Raw" evaluation
346
+ return fn(_rawArgs3, math, (0, _scope.createSubScope)(scope, args), scope);
347
+ } else {
348
+ // "regular" evaluation
349
+ var values = evalArgs.map(function (evalArg) {
350
+ return evalArg(scope, args, context);
351
+ });
352
+ return fn.apply(fn, values);
353
+ }
354
+ };
355
+ }
356
+ }
357
+ /**
358
+ * Execute a callback for each of the child nodes of this node
359
+ * @param {function(child: Node, path: string, parent: Node)} callback
360
+ */
361
+
362
+ }, {
363
+ key: "forEach",
364
+ value: function forEach(callback) {
365
+ callback(this.fn, 'fn', this);
366
+
367
+ for (var i = 0; i < this.args.length; i++) {
368
+ callback(this.args[i], 'args[' + i + ']', this);
369
+ }
370
+ }
371
+ /**
372
+ * Create a new FunctionNode whose children are the results of calling
373
+ * the provided callback function for each child of the original node.
374
+ * @param {function(child: Node, path: string, parent: Node): Node} callback
375
+ * @returns {FunctionNode} Returns a transformed copy of the node
376
+ */
377
+
378
+ }, {
379
+ key: "map",
380
+ value: function map(callback) {
381
+ var fn = this._ifNode(callback(this.fn, 'fn', this));
382
+
383
+ var args = [];
384
+
385
+ for (var i = 0; i < this.args.length; i++) {
386
+ args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
387
+ }
388
+
389
+ return new FunctionNode(fn, args);
390
+ }
391
+ /**
392
+ * Create a clone of this node, a shallow copy
393
+ * @return {FunctionNode}
394
+ */
395
+
396
+ }, {
397
+ key: "clone",
398
+ value: function clone() {
399
+ return new FunctionNode(this.fn, this.args.slice(0));
400
+ }
401
+ /**
402
+ * Throws an error 'Undefined function {name}'
403
+ * @param {string} name
404
+ */
405
+
406
+ }, {
407
+ key: "toString",
408
+ value:
409
+ /**
410
+ * Get string representation. (wrapper function)
411
+ * This overrides parts of Node's toString function.
412
+ * If callback is an object containing callbacks, it
413
+ * calls the correct callback for the current node,
414
+ * otherwise it falls back to calling Node's toString
415
+ * function.
416
+ *
417
+ * @param {Object} options
418
+ * @return {string} str
419
+ * @override
420
+ */
421
+ function toString(options) {
422
+ var customString;
423
+ var name = this.fn.toString(options);
424
+
425
+ if (options && (0, _typeof2["default"])(options.handler) === 'object' && (0, _object.hasOwnProperty)(options.handler, name)) {
426
+ // callback is a map of callback functions
427
+ customString = options.handler[name](this, options);
428
+ }
429
+
430
+ if (typeof customString !== 'undefined') {
431
+ return customString;
432
+ } // fall back to Node's toString
433
+
434
+
435
+ return (0, _get2["default"])((0, _getPrototypeOf2["default"])(FunctionNode.prototype), "toString", this).call(this, options);
436
+ }
437
+ /**
438
+ * Get string representation
439
+ * @param {Object} options
440
+ * @return {string} str
441
+ */
442
+
443
+ }, {
444
+ key: "_toString",
445
+ value: function _toString(options) {
446
+ var args = this.args.map(function (arg) {
447
+ return arg.toString(options);
448
+ });
449
+ var fn = (0, _is.isFunctionAssignmentNode)(this.fn) ? '(' + this.fn.toString(options) + ')' : this.fn.toString(options); // format the arguments like "add(2, 4.2)"
450
+
451
+ return fn + '(' + args.join(', ') + ')';
452
+ }
453
+ /**
454
+ * Get a JSON representation of the node
455
+ * @returns {Object}
456
+ */
457
+
458
+ }, {
459
+ key: "toJSON",
460
+ value: function toJSON() {
461
+ return {
462
+ mathjs: name,
463
+ fn: this.fn,
464
+ args: this.args
465
+ };
466
+ }
467
+ /**
468
+ * Instantiate an AssignmentNode from its JSON representation
469
+ * @param {Object} json An object structured like
470
+ * `{"mathjs": "FunctionNode", fn: ..., args: ...}`,
471
+ * where mathjs is optional
472
+ * @returns {FunctionNode}
473
+ */
474
+
475
+ }, {
476
+ key: "toHTML",
477
+ value:
478
+ /**
479
+ * Get HTML representation
480
+ * @param {Object} options
481
+ * @return {string} str
482
+ */
483
+ function toHTML(options) {
484
+ var args = this.args.map(function (arg) {
485
+ return arg.toHTML(options);
486
+ }); // format the arguments like "add(2, 4.2)"
487
+
488
+ return '<span class="math-function">' + (0, _string.escape)(this.fn) + '</span><span class="math-paranthesis math-round-parenthesis">(</span>' + args.join('<span class="math-separator">,</span>') + '<span class="math-paranthesis math-round-parenthesis">)</span>';
489
+ }
490
+ /**
491
+ * Get LaTeX representation. (wrapper function)
492
+ * This overrides parts of Node's toTex function.
493
+ * If callback is an object containing callbacks, it
494
+ * calls the correct callback for the current node,
495
+ * otherwise it falls back to calling Node's toTex
496
+ * function.
497
+ *
498
+ * @param {Object} options
499
+ * @return {string}
500
+ */
501
+
502
+ }, {
503
+ key: "toTex",
504
+ value: function toTex(options) {
505
+ var customTex;
506
+
507
+ if (options && (0, _typeof2["default"])(options.handler) === 'object' && (0, _object.hasOwnProperty)(options.handler, this.name)) {
508
+ // callback is a map of callback functions
509
+ customTex = options.handler[this.name](this, options);
510
+ }
511
+
512
+ if (typeof customTex !== 'undefined') {
513
+ return customTex;
514
+ } // fall back to Node's toTex
515
+
516
+
517
+ return (0, _get2["default"])((0, _getPrototypeOf2["default"])(FunctionNode.prototype), "toTex", this).call(this, options);
518
+ }
519
+ /**
520
+ * Get LaTeX representation
521
+ * @param {Object} options
522
+ * @return {string} str
523
+ */
524
+
525
+ }, {
526
+ key: "_toTex",
527
+ value: function _toTex(options) {
528
+ var args = this.args.map(function (arg) {
529
+ // get LaTeX of the arguments
530
+ return arg.toTex(options);
531
+ });
532
+ var latexConverter;
533
+
534
+ if (_latex.latexFunctions[this.name]) {
535
+ latexConverter = _latex.latexFunctions[this.name];
536
+ } // toTex property on the function itself
537
+
538
+
539
+ if (math[this.name] && (typeof math[this.name].toTex === 'function' || (0, _typeof2["default"])(math[this.name].toTex) === 'object' || typeof math[this.name].toTex === 'string')) {
540
+ // .toTex is a callback function
541
+ latexConverter = math[this.name].toTex;
542
+ }
543
+
544
+ var customToTex;
545
+
546
+ switch ((0, _typeof2["default"])(latexConverter)) {
532
547
  case 'function':
533
- customToTex = latexConverter[args.length](this, options);
548
+ // a callback function
549
+ customToTex = latexConverter(this, options);
534
550
  break;
535
551
 
536
552
  case 'string':
537
- customToTex = expandTemplate(latexConverter[args.length], this, options);
553
+ // a template string
554
+ customToTex = expandTemplate(latexConverter, this, options);
538
555
  break;
539
- }
540
556
 
541
- }
557
+ case 'object':
558
+ // an object with different "converters" for different
559
+ // numbers of arguments
560
+ switch ((0, _typeof2["default"])(latexConverter[args.length])) {
561
+ case 'function':
562
+ customToTex = latexConverter[args.length](this, options);
563
+ break;
542
564
 
543
- if (typeof customToTex !== 'undefined') {
544
- return customToTex;
545
- }
565
+ case 'string':
566
+ customToTex = expandTemplate(latexConverter[args.length], this, options);
567
+ break;
568
+ }
546
569
 
547
- return expandTemplate(_latex.defaultTemplate, this, options);
548
- };
549
- /**
550
- * Get identifier.
551
- * @return {string}
552
- */
570
+ }
553
571
 
572
+ if (typeof customToTex !== 'undefined') {
573
+ return customToTex;
574
+ }
554
575
 
555
- FunctionNode.prototype.getIdentifier = function () {
556
- return this.type + ':' + this.name;
557
- };
576
+ return expandTemplate(_latex.defaultTemplate, this, options);
577
+ }
578
+ /**
579
+ * Get identifier.
580
+ * @return {string}
581
+ */
582
+
583
+ }, {
584
+ key: "getIdentifier",
585
+ value: function getIdentifier() {
586
+ return this.type + ':' + this.name;
587
+ }
588
+ }]);
589
+ return FunctionNode;
590
+ }(Node);
558
591
 
592
+ (0, _defineProperty2["default"])(FunctionNode, "name", name);
593
+ (0, _defineProperty2["default"])(FunctionNode, "onUndefinedFunction", function (name) {
594
+ throw new Error('Undefined function ' + name);
595
+ });
596
+ (0, _defineProperty2["default"])(FunctionNode, "fromJSON", function (json) {
597
+ return new FunctionNode(json.fn, json.args);
598
+ });
559
599
  return FunctionNode;
560
600
  }, {
561
601
  isClass: true,