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
@@ -1,4 +1,5 @@
1
- import { isNode } from '../../utils/is.js';
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import { isNode, isConstantNode, isOperatorNode, isParenthesisNode } from '../../utils/is.js';
2
3
  import { map } from '../../utils/array.js';
3
4
  import { escape } from '../../utils/string.js';
4
5
  import { getSafeProperty, isSafeMethod } from '../../utils/customs.js';
@@ -13,149 +14,29 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
13
14
  } = _ref;
14
15
 
15
16
  /**
16
- * @constructor OperatorNode
17
- * @extends {Node}
18
- * An operator with two arguments, like 2+3
19
- *
20
- * @param {string} op Operator name, for example '+'
21
- * @param {string} fn Function name, for example 'add'
22
- * @param {Node[]} args Operator arguments
23
- * @param {boolean} [implicit] Is this an implicit multiplication?
24
- * @param {boolean} [isPercentage] Is this an percentage Operation?
25
- */
26
- function OperatorNode(op, fn, args, implicit, isPercentage) {
27
- if (!(this instanceof OperatorNode)) {
28
- throw new SyntaxError('Constructor must be called with the new operator');
29
- } // validate input
30
-
31
-
32
- if (typeof op !== 'string') {
33
- throw new TypeError('string expected for parameter "op"');
34
- }
35
-
36
- if (typeof fn !== 'string') {
37
- throw new TypeError('string expected for parameter "fn"');
38
- }
39
-
40
- if (!Array.isArray(args) || !args.every(isNode)) {
41
- throw new TypeError('Array containing Nodes expected for parameter "args"');
42
- }
43
-
44
- this.implicit = implicit === true;
45
- this.isPercentage = isPercentage === true;
46
- this.op = op;
47
- this.fn = fn;
48
- this.args = args || [];
49
- }
50
-
51
- OperatorNode.prototype = new Node();
52
- OperatorNode.prototype.type = 'OperatorNode';
53
- OperatorNode.prototype.isOperatorNode = true;
54
- /**
55
- * Compile a node into a JavaScript function.
56
- * This basically pre-calculates as much as possible and only leaves open
57
- * calculations which depend on a dynamic scope with variables.
58
- * @param {Object} math Math.js namespace with functions and constants.
59
- * @param {Object} argNames An object with argument names as key and `true`
60
- * as value. Used in the SymbolNode to optimize
61
- * for arguments from user assigned functions
62
- * (see FunctionAssignmentNode) or special symbols
63
- * like `end` (see IndexNode).
64
- * @return {function} Returns a function which can be called like:
65
- * evalNode(scope: Object, args: Object, context: *)
17
+ * Returns true if the expression starts with a constant, under
18
+ * the current parenthesization:
19
+ * @param {Node} expression
20
+ * @param {string} parenthesis
21
+ * @return {boolean}
66
22
  */
23
+ function startsWithConstant(expr, parenthesis) {
24
+ var curNode = expr;
67
25
 
68
- OperatorNode.prototype._compile = function (math, argNames) {
69
- // validate fn
70
- if (typeof this.fn !== 'string' || !isSafeMethod(math, this.fn)) {
71
- if (!math[this.fn]) {
72
- throw new Error('Function ' + this.fn + ' missing in provided namespace "math"');
73
- } else {
74
- throw new Error('No access to function "' + this.fn + '"');
26
+ if (parenthesis === 'auto') {
27
+ while (isParenthesisNode(curNode)) {
28
+ curNode = curNode.content;
75
29
  }
76
30
  }
77
31
 
78
- var fn = getSafeProperty(math, this.fn);
79
- var evalArgs = map(this.args, function (arg) {
80
- return arg._compile(math, argNames);
81
- });
82
-
83
- if (evalArgs.length === 1) {
84
- var evalArg0 = evalArgs[0];
85
- return function evalOperatorNode(scope, args, context) {
86
- return fn(evalArg0(scope, args, context));
87
- };
88
- } else if (evalArgs.length === 2) {
89
- var _evalArg = evalArgs[0];
90
- var evalArg1 = evalArgs[1];
91
- return function evalOperatorNode(scope, args, context) {
92
- return fn(_evalArg(scope, args, context), evalArg1(scope, args, context));
93
- };
94
- } else {
95
- return function evalOperatorNode(scope, args, context) {
96
- return fn.apply(null, map(evalArgs, function (evalArg) {
97
- return evalArg(scope, args, context);
98
- }));
99
- };
100
- }
101
- };
102
- /**
103
- * Execute a callback for each of the child nodes of this node
104
- * @param {function(child: Node, path: string, parent: Node)} callback
105
- */
106
-
107
-
108
- OperatorNode.prototype.forEach = function (callback) {
109
- for (var i = 0; i < this.args.length; i++) {
110
- callback(this.args[i], 'args[' + i + ']', this);
111
- }
112
- };
113
- /**
114
- * Create a new OperatorNode having it's childs be the results of calling
115
- * the provided callback function for each of the childs of the original node.
116
- * @param {function(child: Node, path: string, parent: Node): Node} callback
117
- * @returns {OperatorNode} Returns a transformed copy of the node
118
- */
119
-
120
-
121
- OperatorNode.prototype.map = function (callback) {
122
- var args = [];
32
+ if (isConstantNode(curNode)) return true;
123
33
 
124
- for (var i = 0; i < this.args.length; i++) {
125
- args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
34
+ if (isOperatorNode(curNode)) {
35
+ return startsWithConstant(curNode.args[0], parenthesis);
126
36
  }
127
37
 
128
- return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
129
- };
130
- /**
131
- * Create a clone of this node, a shallow copy
132
- * @return {OperatorNode}
133
- */
134
-
135
-
136
- OperatorNode.prototype.clone = function () {
137
- return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
138
- };
139
- /**
140
- * Check whether this is an unary OperatorNode:
141
- * has exactly one argument, like `-a`.
142
- * @return {boolean} Returns true when an unary operator node, false otherwise.
143
- */
144
-
145
-
146
- OperatorNode.prototype.isUnary = function () {
147
- return this.args.length === 1;
148
- };
149
- /**
150
- * Check whether this is a binary OperatorNode:
151
- * has exactly two arguments, like `a + b`.
152
- * @return {boolean} Returns true when a binary operator node, false otherwise.
153
- */
154
-
155
-
156
- OperatorNode.prototype.isBinary = function () {
157
- return this.args.length === 2;
158
- };
38
+ return false;
39
+ }
159
40
  /**
160
41
  * Calculate which parentheses are necessary. Gets an OperatorNode
161
42
  * (which is the root of the tree) and an Array of Nodes
@@ -173,7 +54,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
173
54
 
174
55
  function calculateNecessaryParentheses(root, parenthesis, implicit, args, latex) {
175
56
  // precedence of the root OperatorNode
176
- var precedence = getPrecedence(root, parenthesis);
57
+ var precedence = getPrecedence(root, parenthesis, implicit);
177
58
  var associativity = getAssociativity(root, parenthesis);
178
59
 
179
60
  if (parenthesis === 'all' || args.length > 2 && root.getIdentifier() !== 'OperatorNode:add' && root.getIdentifier() !== 'OperatorNode:multiply') {
@@ -203,7 +84,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
203
84
  // unary operators
204
85
  {
205
86
  // precedence of the operand
206
- var operandPrecedence = getPrecedence(args[0], parenthesis); // handle special cases for LaTeX, where some of the parentheses aren't needed
87
+ var operandPrecedence = getPrecedence(args[0], parenthesis, implicit, root); // handle special cases for LaTeX, where some of the parentheses aren't needed
207
88
 
208
89
  if (latex && operandPrecedence !== null) {
209
90
  var operandIdentifier;
@@ -252,7 +133,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
252
133
  var lhsParens; // left hand side needs parenthesis?
253
134
  // precedence of the left hand side
254
135
 
255
- var lhsPrecedence = getPrecedence(args[0], parenthesis); // is the root node associative with the left hand side
136
+ var lhsPrecedence = getPrecedence(args[0], parenthesis, implicit, root); // is the root node associative with the left hand side
256
137
 
257
138
  var assocWithLhs = isAssociativeWith(root, args[0], parenthesis);
258
139
 
@@ -275,7 +156,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
275
156
  var rhsParens; // right hand side needs parenthesis?
276
157
  // precedence of the right hand side
277
158
 
278
- var rhsPrecedence = getPrecedence(args[1], parenthesis); // is the root node associative with the right hand side?
159
+ var rhsPrecedence = getPrecedence(args[1], parenthesis, implicit, root); // is the root node associative with the right hand side?
279
160
 
280
161
  var assocWithRhs = isAssociativeWith(root, args[1], parenthesis);
281
162
 
@@ -341,7 +222,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
341
222
  default:
342
223
  if (root.getIdentifier() === 'OperatorNode:add' || root.getIdentifier() === 'OperatorNode:multiply') {
343
224
  result = args.map(function (arg) {
344
- var argPrecedence = getPrecedence(arg, parenthesis);
225
+ var argPrecedence = getPrecedence(arg, parenthesis, implicit, root);
345
226
  var assocWithArg = isAssociativeWith(root, arg, parenthesis);
346
227
  var argAssociativity = getAssociativity(arg, parenthesis);
347
228
 
@@ -359,327 +240,483 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
359
240
  }
360
241
 
361
242
  break;
362
- } // handles an edge case of 'auto' parentheses with implicit multiplication of ConstantNode
363
- // In that case print parentheses for ParenthesisNodes even though they normally wouldn't be
364
- // printed.
365
-
243
+ } // Handles an edge case of parentheses with implicit multiplication
244
+ // of ConstantNode.
245
+ // In that case, parenthesize ConstantNodes that follow an unparenthesized
246
+ // expression, even though they normally wouldn't be printed.
366
247
 
367
- if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis === 'auto' && implicit === 'hide') {
368
- result = args.map(function (arg, index) {
369
- var isParenthesisNode = arg.getIdentifier() === 'ParenthesisNode';
370
248
 
371
- if (result[index] || isParenthesisNode) {
372
- // put in parenthesis?
373
- return true;
249
+ if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis !== 'all' && implicit === 'hide') {
250
+ for (var i = 1; i < result.length; ++i) {
251
+ if (startsWithConstant(args[i], parenthesis) && !result[i - 1] && (parenthesis !== 'keep' || !isParenthesisNode(args[i - 1]))) {
252
+ result[i] = true;
374
253
  }
375
-
376
- return false;
377
- });
254
+ }
378
255
  }
379
256
 
380
257
  return result;
381
258
  }
382
- /**
383
- * Get string representation.
384
- * @param {Object} options
385
- * @return {string} str
386
- */
387
259
 
260
+ class OperatorNode extends Node {
261
+ /**
262
+ * @constructor OperatorNode
263
+ * @extends {Node}
264
+ * An operator with two arguments, like 2+3
265
+ *
266
+ * @param {string} op Operator name, for example '+'
267
+ * @param {string} fn Function name, for example 'add'
268
+ * @param {Node[]} args Operator arguments
269
+ * @param {boolean} [implicit] Is this an implicit multiplication?
270
+ * @param {boolean} [isPercentage] Is this an percentage Operation?
271
+ */
272
+ constructor(op, fn, args, implicit, isPercentage) {
273
+ super(); // validate input
274
+
275
+ if (typeof op !== 'string') {
276
+ throw new TypeError('string expected for parameter "op"');
277
+ }
388
278
 
389
- OperatorNode.prototype._toString = function (options) {
390
- var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
391
- var implicit = options && options.implicit ? options.implicit : 'hide';
392
- var args = this.args;
393
- var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
394
-
395
- if (args.length === 1) {
396
- // unary operators
397
- var assoc = getAssociativity(this, parenthesis);
398
- var operand = args[0].toString(options);
279
+ if (typeof fn !== 'string') {
280
+ throw new TypeError('string expected for parameter "fn"');
281
+ }
399
282
 
400
- if (parens[0]) {
401
- operand = '(' + operand + ')';
402
- } // for example for "not", we want a space between operand and argument
283
+ if (!Array.isArray(args) || !args.every(isNode)) {
284
+ throw new TypeError('Array containing Nodes expected for parameter "args"');
285
+ }
403
286
 
287
+ this.implicit = implicit === true;
288
+ this.isPercentage = isPercentage === true;
289
+ this.op = op;
290
+ this.fn = fn;
291
+ this.args = args || [];
292
+ }
404
293
 
405
- var opIsNamed = /[a-zA-Z]+/.test(this.op);
294
+ get type() {
295
+ return name;
296
+ }
406
297
 
407
- if (assoc === 'right') {
408
- // prefix operator
409
- return this.op + (opIsNamed ? ' ' : '') + operand;
410
- } else if (assoc === 'left') {
411
- // postfix
412
- return operand + (opIsNamed ? ' ' : '') + this.op;
413
- } // fall back to postfix
298
+ get isOperatorNode() {
299
+ return true;
300
+ }
301
+ /**
302
+ * Compile a node into a JavaScript function.
303
+ * This basically pre-calculates as much as possible and only leaves open
304
+ * calculations which depend on a dynamic scope with variables.
305
+ * @param {Object} math Math.js namespace with functions and constants.
306
+ * @param {Object} argNames An object with argument names as key and `true`
307
+ * as value. Used in the SymbolNode to optimize
308
+ * for arguments from user assigned functions
309
+ * (see FunctionAssignmentNode) or special symbols
310
+ * like `end` (see IndexNode).
311
+ * @return {function} Returns a function which can be called like:
312
+ * evalNode(scope: Object, args: Object, context: *)
313
+ */
314
+
315
+
316
+ _compile(math, argNames) {
317
+ // validate fn
318
+ if (typeof this.fn !== 'string' || !isSafeMethod(math, this.fn)) {
319
+ if (!math[this.fn]) {
320
+ throw new Error('Function ' + this.fn + ' missing in provided namespace "math"');
321
+ } else {
322
+ throw new Error('No access to function "' + this.fn + '"');
323
+ }
324
+ }
414
325
 
326
+ var fn = getSafeProperty(math, this.fn);
327
+ var evalArgs = map(this.args, function (arg) {
328
+ return arg._compile(math, argNames);
329
+ });
415
330
 
416
- return operand + this.op;
417
- } else if (args.length === 2) {
418
- var lhs = args[0].toString(options); // left hand side
331
+ if (evalArgs.length === 1) {
332
+ var evalArg0 = evalArgs[0];
333
+ return function evalOperatorNode(scope, args, context) {
334
+ return fn(evalArg0(scope, args, context));
335
+ };
336
+ } else if (evalArgs.length === 2) {
337
+ var _evalArg = evalArgs[0];
338
+ var evalArg1 = evalArgs[1];
339
+ return function evalOperatorNode(scope, args, context) {
340
+ return fn(_evalArg(scope, args, context), evalArg1(scope, args, context));
341
+ };
342
+ } else {
343
+ return function evalOperatorNode(scope, args, context) {
344
+ return fn.apply(null, map(evalArgs, function (evalArg) {
345
+ return evalArg(scope, args, context);
346
+ }));
347
+ };
348
+ }
349
+ }
350
+ /**
351
+ * Execute a callback for each of the child nodes of this node
352
+ * @param {function(child: Node, path: string, parent: Node)} callback
353
+ */
419
354
 
420
- var rhs = args[1].toString(options); // right hand side
421
355
 
422
- if (parens[0]) {
423
- // left hand side in parenthesis?
424
- lhs = '(' + lhs + ')';
356
+ forEach(callback) {
357
+ for (var i = 0; i < this.args.length; i++) {
358
+ callback(this.args[i], 'args[' + i + ']', this);
425
359
  }
360
+ }
361
+ /**
362
+ * Create a new OperatorNode whose children are the results of calling
363
+ * the provided callback function for each child of the original node.
364
+ * @param {function(child: Node, path: string, parent: Node): Node} callback
365
+ * @returns {OperatorNode} Returns a transformed copy of the node
366
+ */
426
367
 
427
- if (parens[1]) {
428
- // right hand side in parenthesis?
429
- rhs = '(' + rhs + ')';
430
- }
431
368
 
432
- if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
433
- return lhs + ' ' + rhs;
369
+ map(callback) {
370
+ var args = [];
371
+
372
+ for (var i = 0; i < this.args.length; i++) {
373
+ args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
434
374
  }
435
375
 
436
- return lhs + ' ' + this.op + ' ' + rhs;
437
- } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
438
- var stringifiedArgs = args.map(function (arg, index) {
439
- arg = arg.toString(options);
376
+ return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
377
+ }
378
+ /**
379
+ * Create a clone of this node, a shallow copy
380
+ * @return {OperatorNode}
381
+ */
440
382
 
441
- if (parens[index]) {
442
- // put in parenthesis?
443
- arg = '(' + arg + ')';
444
- }
445
383
 
446
- return arg;
447
- });
384
+ clone() {
385
+ return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
386
+ }
387
+ /**
388
+ * Check whether this is an unary OperatorNode:
389
+ * has exactly one argument, like `-a`.
390
+ * @return {boolean}
391
+ * Returns true when an unary operator node, false otherwise.
392
+ */
448
393
 
449
- if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
450
- return stringifiedArgs.join(' ');
451
- }
452
394
 
453
- return stringifiedArgs.join(' ' + this.op + ' ');
454
- } else {
455
- // fallback to formatting as a function call
456
- return this.fn + '(' + this.args.join(', ') + ')';
395
+ isUnary() {
396
+ return this.args.length === 1;
457
397
  }
458
- };
459
- /**
460
- * Get a JSON representation of the node
461
- * @returns {Object}
462
- */
398
+ /**
399
+ * Check whether this is a binary OperatorNode:
400
+ * has exactly two arguments, like `a + b`.
401
+ * @return {boolean}
402
+ * Returns true when a binary operator node, false otherwise.
403
+ */
463
404
 
464
405
 
465
- OperatorNode.prototype.toJSON = function () {
466
- return {
467
- mathjs: 'OperatorNode',
468
- op: this.op,
469
- fn: this.fn,
470
- args: this.args,
471
- implicit: this.implicit,
472
- isPercentage: this.isPercentage
473
- };
474
- };
475
- /**
476
- * Instantiate an OperatorNode from its JSON representation
477
- * @param {Object} json An object structured like
478
- * `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
479
- * where mathjs is optional
480
- * @returns {OperatorNode}
481
- */
406
+ isBinary() {
407
+ return this.args.length === 2;
408
+ }
409
+ /**
410
+ * Get string representation.
411
+ * @param {Object} options
412
+ * @return {string} str
413
+ */
482
414
 
483
415
 
484
- OperatorNode.fromJSON = function (json) {
485
- return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
486
- };
487
- /**
488
- * Get HTML representation.
489
- * @param {Object} options
490
- * @return {string} str
491
- */
416
+ _toString(options) {
417
+ var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
418
+ var implicit = options && options.implicit ? options.implicit : 'hide';
419
+ var args = this.args;
420
+ var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
492
421
 
422
+ if (args.length === 1) {
423
+ // unary operators
424
+ var assoc = getAssociativity(this, parenthesis);
425
+ var operand = args[0].toString(options);
493
426
 
494
- OperatorNode.prototype.toHTML = function (options) {
495
- var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
496
- var implicit = options && options.implicit ? options.implicit : 'hide';
497
- var args = this.args;
498
- var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
427
+ if (parens[0]) {
428
+ operand = '(' + operand + ')';
429
+ } // for example for "not", we want a space between operand and argument
499
430
 
500
- if (args.length === 1) {
501
- // unary operators
502
- var assoc = getAssociativity(this, parenthesis);
503
- var operand = args[0].toHTML(options);
504
431
 
505
- if (parens[0]) {
506
- operand = '<span class="math-parenthesis math-round-parenthesis">(</span>' + operand + '<span class="math-parenthesis math-round-parenthesis">)</span>';
507
- }
432
+ var opIsNamed = /[a-zA-Z]+/.test(this.op);
508
433
 
509
- if (assoc === 'right') {
510
- // prefix operator
511
- return '<span class="math-operator math-unary-operator math-lefthand-unary-operator">' + escape(this.op) + '</span>' + operand;
512
- } else {
513
- // postfix when assoc === 'left' or undefined
514
- return operand + '<span class="math-operator math-unary-operator math-righthand-unary-operator">' + escape(this.op) + '</span>';
515
- }
516
- } else if (args.length === 2) {
517
- // binary operatoes
518
- var lhs = args[0].toHTML(options); // left hand side
434
+ if (assoc === 'right') {
435
+ // prefix operator
436
+ return this.op + (opIsNamed ? ' ' : '') + operand;
437
+ } else if (assoc === 'left') {
438
+ // postfix
439
+ return operand + (opIsNamed ? ' ' : '') + this.op;
440
+ } // fall back to postfix
519
441
 
520
- var rhs = args[1].toHTML(options); // right hand side
521
442
 
522
- if (parens[0]) {
523
- // left hand side in parenthesis?
524
- lhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + lhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
525
- }
443
+ return operand + this.op;
444
+ } else if (args.length === 2) {
445
+ var lhs = args[0].toString(options); // left hand side
526
446
 
527
- if (parens[1]) {
528
- // right hand side in parenthesis?
529
- rhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + rhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
530
- }
447
+ var rhs = args[1].toString(options); // right hand side
531
448
 
532
- if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
533
- return lhs + '<span class="math-operator math-binary-operator math-implicit-binary-operator"></span>' + rhs;
534
- }
449
+ if (parens[0]) {
450
+ // left hand side in parenthesis?
451
+ lhs = '(' + lhs + ')';
452
+ }
535
453
 
536
- return lhs + '<span class="math-operator math-binary-operator math-explicit-binary-operator">' + escape(this.op) + '</span>' + rhs;
537
- } else {
538
- var stringifiedArgs = args.map(function (arg, index) {
539
- arg = arg.toHTML(options);
454
+ if (parens[1]) {
455
+ // right hand side in parenthesis?
456
+ rhs = '(' + rhs + ')';
457
+ }
540
458
 
541
- if (parens[index]) {
542
- // put in parenthesis?
543
- arg = '<span class="math-parenthesis math-round-parenthesis">(</span>' + arg + '<span class="math-parenthesis math-round-parenthesis">)</span>';
459
+ if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
460
+ return lhs + ' ' + rhs;
544
461
  }
545
462
 
546
- return arg;
547
- });
463
+ return lhs + ' ' + this.op + ' ' + rhs;
464
+ } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
465
+ var stringifiedArgs = args.map(function (arg, index) {
466
+ arg = arg.toString(options);
467
+
468
+ if (parens[index]) {
469
+ // put in parenthesis?
470
+ arg = '(' + arg + ')';
471
+ }
472
+
473
+ return arg;
474
+ });
548
475
 
549
- if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
550
476
  if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
551
- return stringifiedArgs.join('<span class="math-operator math-binary-operator math-implicit-binary-operator"></span>');
477
+ return stringifiedArgs.join(' ');
552
478
  }
553
479
 
554
- return stringifiedArgs.join('<span class="math-operator math-binary-operator math-explicit-binary-operator">' + escape(this.op) + '</span>');
480
+ return stringifiedArgs.join(' ' + this.op + ' ');
555
481
  } else {
556
482
  // fallback to formatting as a function call
557
- return '<span class="math-function">' + escape(this.fn) + '</span><span class="math-paranthesis math-round-parenthesis">(</span>' + stringifiedArgs.join('<span class="math-separator">,</span>') + '<span class="math-paranthesis math-round-parenthesis">)</span>';
483
+ return this.fn + '(' + this.args.join(', ') + ')';
558
484
  }
559
485
  }
560
- };
561
- /**
562
- * Get LaTeX representation
563
- * @param {Object} options
564
- * @return {string} str
565
- */
486
+ /**
487
+ * Get a JSON representation of the node
488
+ * @returns {Object}
489
+ */
490
+
491
+
492
+ toJSON() {
493
+ return {
494
+ mathjs: name,
495
+ op: this.op,
496
+ fn: this.fn,
497
+ args: this.args,
498
+ implicit: this.implicit,
499
+ isPercentage: this.isPercentage
500
+ };
501
+ }
502
+ /**
503
+ * Instantiate an OperatorNode from its JSON representation
504
+ * @param {Object} json
505
+ * An object structured like
506
+ * ```
507
+ * {"mathjs": "OperatorNode",
508
+ * "op": "+", "fn": "add", "args": [...],
509
+ * "implicit": false,
510
+ * "isPercentage":false}
511
+ * ```
512
+ * where mathjs is optional
513
+ * @returns {OperatorNode}
514
+ */
515
+
516
+
517
+ static fromJSON(json) {
518
+ return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
519
+ }
520
+ /**
521
+ * Get HTML representation.
522
+ * @param {Object} options
523
+ * @return {string} str
524
+ */
566
525
 
567
526
 
568
- OperatorNode.prototype._toTex = function (options) {
569
- var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
570
- var implicit = options && options.implicit ? options.implicit : 'hide';
571
- var args = this.args;
572
- var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, true);
573
- var op = latexOperators[this.fn];
574
- op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op
527
+ toHTML(options) {
528
+ var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
529
+ var implicit = options && options.implicit ? options.implicit : 'hide';
530
+ var args = this.args;
531
+ var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);
575
532
 
576
- if (args.length === 1) {
577
- // unary operators
578
- var assoc = getAssociativity(this, parenthesis);
579
- var operand = args[0].toTex(options);
533
+ if (args.length === 1) {
534
+ // unary operators
535
+ var assoc = getAssociativity(this, parenthesis);
536
+ var operand = args[0].toHTML(options);
580
537
 
581
- if (parens[0]) {
582
- operand = "\\left(".concat(operand, "\\right)");
583
- }
538
+ if (parens[0]) {
539
+ operand = '<span class="math-parenthesis math-round-parenthesis">(</span>' + operand + '<span class="math-parenthesis math-round-parenthesis">)</span>';
540
+ }
584
541
 
585
- if (assoc === 'right') {
586
- // prefix operator
587
- return op + operand;
588
- } else if (assoc === 'left') {
589
- // postfix operator
590
- return operand + op;
591
- } // fall back to postfix
542
+ if (assoc === 'right') {
543
+ // prefix operator
544
+ return '<span class="math-operator math-unary-operator ' + 'math-lefthand-unary-operator">' + escape(this.op) + '</span>' + operand;
545
+ } else {
546
+ // postfix when assoc === 'left' or undefined
547
+ return operand + '<span class="math-operator math-unary-operator ' + 'math-righthand-unary-operator">' + escape(this.op) + '</span>';
548
+ }
549
+ } else if (args.length === 2) {
550
+ // binary operatoes
551
+ var lhs = args[0].toHTML(options); // left hand side
552
+
553
+ var rhs = args[1].toHTML(options); // right hand side
554
+
555
+ if (parens[0]) {
556
+ // left hand side in parenthesis?
557
+ lhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + lhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
558
+ }
559
+
560
+ if (parens[1]) {
561
+ // right hand side in parenthesis?
562
+ rhs = '<span class="math-parenthesis math-round-parenthesis">(</span>' + rhs + '<span class="math-parenthesis math-round-parenthesis">)</span>';
563
+ }
564
+
565
+ if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
566
+ return lhs + '<span class="math-operator math-binary-operator ' + 'math-implicit-binary-operator"></span>' + rhs;
567
+ }
592
568
 
569
+ return lhs + '<span class="math-operator math-binary-operator ' + 'math-explicit-binary-operator">' + escape(this.op) + '</span>' + rhs;
570
+ } else {
571
+ var stringifiedArgs = args.map(function (arg, index) {
572
+ arg = arg.toHTML(options);
593
573
 
594
- return operand + op;
595
- } else if (args.length === 2) {
596
- // binary operators
597
- var lhs = args[0]; // left hand side
574
+ if (parens[index]) {
575
+ // put in parenthesis?
576
+ arg = '<span class="math-parenthesis math-round-parenthesis">(</span>' + arg + '<span class="math-parenthesis math-round-parenthesis">)</span>';
577
+ }
598
578
 
599
- var lhsTex = lhs.toTex(options);
579
+ return arg;
580
+ });
600
581
 
601
- if (parens[0]) {
602
- lhsTex = "\\left(".concat(lhsTex, "\\right)");
582
+ if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
583
+ if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {
584
+ return stringifiedArgs.join('<span class="math-operator math-binary-operator ' + 'math-implicit-binary-operator"></span>');
585
+ }
586
+
587
+ return stringifiedArgs.join('<span class="math-operator math-binary-operator ' + 'math-explicit-binary-operator">' + escape(this.op) + '</span>');
588
+ } else {
589
+ // fallback to formatting as a function call
590
+ return '<span class="math-function">' + escape(this.fn) + '</span><span class="math-paranthesis math-round-parenthesis">' + '(</span>' + stringifiedArgs.join('<span class="math-separator">,</span>') + '<span class="math-paranthesis math-round-parenthesis">)</span>';
591
+ }
603
592
  }
593
+ }
594
+ /**
595
+ * Get LaTeX representation
596
+ * @param {Object} options
597
+ * @return {string} str
598
+ */
599
+
600
+
601
+ _toTex(options) {
602
+ var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';
603
+ var implicit = options && options.implicit ? options.implicit : 'hide';
604
+ var args = this.args;
605
+ var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, true);
606
+ var op = latexOperators[this.fn];
607
+ op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op
608
+
609
+ if (args.length === 1) {
610
+ // unary operators
611
+ var assoc = getAssociativity(this, parenthesis);
612
+ var operand = args[0].toTex(options);
613
+
614
+ if (parens[0]) {
615
+ operand = "\\left(".concat(operand, "\\right)");
616
+ }
604
617
 
605
- var rhs = args[1]; // right hand side
618
+ if (assoc === 'right') {
619
+ // prefix operator
620
+ return op + operand;
621
+ } else if (assoc === 'left') {
622
+ // postfix operator
623
+ return operand + op;
624
+ } // fall back to postfix
606
625
 
607
- var rhsTex = rhs.toTex(options);
608
626
 
609
- if (parens[1]) {
610
- rhsTex = "\\left(".concat(rhsTex, "\\right)");
611
- } // handle some exceptions (due to the way LaTeX works)
627
+ return operand + op;
628
+ } else if (args.length === 2) {
629
+ // binary operators
630
+ var lhs = args[0]; // left hand side
612
631
 
632
+ var lhsTex = lhs.toTex(options);
613
633
 
614
- var lhsIdentifier;
634
+ if (parens[0]) {
635
+ lhsTex = "\\left(".concat(lhsTex, "\\right)");
636
+ }
615
637
 
616
- if (parenthesis === 'keep') {
617
- lhsIdentifier = lhs.getIdentifier();
618
- } else {
619
- // Ignore ParenthesisNodes if in 'keep' mode
620
- lhsIdentifier = lhs.getContent().getIdentifier();
621
- }
638
+ var rhs = args[1]; // right hand side
622
639
 
623
- switch (this.getIdentifier()) {
624
- case 'OperatorNode:divide':
625
- // op contains '\\frac' at this point
626
- return op + '{' + lhsTex + '}' + '{' + rhsTex + '}';
640
+ var rhsTex = rhs.toTex(options);
627
641
 
628
- case 'OperatorNode:pow':
629
- lhsTex = '{' + lhsTex + '}';
630
- rhsTex = '{' + rhsTex + '}';
642
+ if (parens[1]) {
643
+ rhsTex = "\\left(".concat(rhsTex, "\\right)");
644
+ } // handle some exceptions (due to the way LaTeX works)
631
645
 
632
- switch (lhsIdentifier) {
633
- case 'ConditionalNode': //
634
646
 
635
- case 'OperatorNode:divide':
636
- lhsTex = "\\left(".concat(lhsTex, "\\right)");
637
- }
647
+ var lhsIdentifier;
638
648
 
639
- break;
649
+ if (parenthesis === 'keep') {
650
+ lhsIdentifier = lhs.getIdentifier();
651
+ } else {
652
+ // Ignore ParenthesisNodes if in 'keep' mode
653
+ lhsIdentifier = lhs.getContent().getIdentifier();
654
+ }
640
655
 
641
- case 'OperatorNode:multiply':
642
- if (this.implicit && implicit === 'hide') {
643
- return lhsTex + '~' + rhsTex;
644
- }
656
+ switch (this.getIdentifier()) {
657
+ case 'OperatorNode:divide':
658
+ // op contains '\\frac' at this point
659
+ return op + '{' + lhsTex + '}' + '{' + rhsTex + '}';
645
660
 
646
- }
661
+ case 'OperatorNode:pow':
662
+ lhsTex = '{' + lhsTex + '}';
663
+ rhsTex = '{' + rhsTex + '}';
647
664
 
648
- return lhsTex + op + rhsTex;
649
- } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
650
- var texifiedArgs = args.map(function (arg, index) {
651
- arg = arg.toTex(options);
665
+ switch (lhsIdentifier) {
666
+ case 'ConditionalNode': //
667
+
668
+ case 'OperatorNode:divide':
669
+ lhsTex = "\\left(".concat(lhsTex, "\\right)");
670
+ }
671
+
672
+ break;
673
+
674
+ case 'OperatorNode:multiply':
675
+ if (this.implicit && implicit === 'hide') {
676
+ return lhsTex + '~' + rhsTex;
677
+ }
652
678
 
653
- if (parens[index]) {
654
- arg = "\\left(".concat(arg, "\\right)");
655
679
  }
656
680
 
657
- return arg;
658
- });
681
+ return lhsTex + op + rhsTex;
682
+ } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {
683
+ var texifiedArgs = args.map(function (arg, index) {
684
+ arg = arg.toTex(options);
685
+
686
+ if (parens[index]) {
687
+ arg = "\\left(".concat(arg, "\\right)");
688
+ }
659
689
 
660
- if (this.getIdentifier() === 'OperatorNode:multiply' && this.implicit) {
661
- return texifiedArgs.join('~');
690
+ return arg;
691
+ });
692
+
693
+ if (this.getIdentifier() === 'OperatorNode:multiply' && this.implicit && implicit === 'hide') {
694
+ return texifiedArgs.join('~');
695
+ }
696
+
697
+ return texifiedArgs.join(op);
698
+ } else {
699
+ // fall back to formatting as a function call
700
+ // as this is a fallback, it doesn't use
701
+ // fancy function names
702
+ return '\\mathrm{' + this.fn + '}\\left(' + args.map(function (arg) {
703
+ return arg.toTex(options);
704
+ }).join(',') + '\\right)';
662
705
  }
706
+ }
707
+ /**
708
+ * Get identifier.
709
+ * @return {string}
710
+ */
663
711
 
664
- return texifiedArgs.join(op);
665
- } else {
666
- // fall back to formatting as a function call
667
- // as this is a fallback, it doesn't use
668
- // fancy function names
669
- return '\\mathrm{' + this.fn + '}\\left(' + args.map(function (arg) {
670
- return arg.toTex(options);
671
- }).join(',') + '\\right)';
712
+
713
+ getIdentifier() {
714
+ return this.type + ':' + this.fn;
672
715
  }
673
- };
674
- /**
675
- * Get identifier.
676
- * @return {string}
677
- */
678
716
 
717
+ }
679
718
 
680
- OperatorNode.prototype.getIdentifier = function () {
681
- return this.type + ':' + this.fn;
682
- };
719
+ _defineProperty(OperatorNode, "name", name);
683
720
 
684
721
  return OperatorNode;
685
722
  }, {