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
@@ -19,186 +19,195 @@ export var createSymbolNode = /* #__PURE__ */factory(name, dependencies, _ref =>
19
19
  function isValuelessUnit(name) {
20
20
  return Unit ? Unit.isValuelessUnit(name) : false;
21
21
  }
22
- /**
23
- * @constructor SymbolNode
24
- * @extends {Node}
25
- * A symbol node can hold and resolve a symbol
26
- * @param {string} name
27
- * @extends {Node}
28
- */
29
-
30
-
31
- function SymbolNode(name) {
32
- if (!(this instanceof SymbolNode)) {
33
- throw new SyntaxError('Constructor must be called with the new operator');
34
- } // validate input
35
22
 
23
+ class SymbolNode extends Node {
24
+ /**
25
+ * @constructor SymbolNode
26
+ * @extends {Node}
27
+ * A symbol node can hold and resolve a symbol
28
+ * @param {string} name
29
+ * @extends {Node}
30
+ */
31
+ constructor(name) {
32
+ super(); // validate input
33
+
34
+ if (typeof name !== 'string') {
35
+ throw new TypeError('String expected for parameter "name"');
36
+ }
37
+
38
+ this.name = name;
39
+ }
36
40
 
37
- if (typeof name !== 'string') throw new TypeError('String expected for parameter "name"');
38
- this.name = name;
39
- }
41
+ get type() {
42
+ return 'SymbolNode';
43
+ }
40
44
 
41
- SymbolNode.prototype = new Node();
42
- SymbolNode.prototype.type = 'SymbolNode';
43
- SymbolNode.prototype.isSymbolNode = true;
44
- /**
45
- * Compile a node into a JavaScript function.
46
- * This basically pre-calculates as much as possible and only leaves open
47
- * calculations which depend on a dynamic scope with variables.
48
- * @param {Object} math Math.js namespace with functions and constants.
49
- * @param {Object} argNames An object with argument names as key and `true`
50
- * as value. Used in the SymbolNode to optimize
51
- * for arguments from user assigned functions
52
- * (see FunctionAssignmentNode) or special symbols
53
- * like `end` (see IndexNode).
54
- * @return {function} Returns a function which can be called like:
55
- * evalNode(scope: Object, args: Object, context: *)
56
- */
45
+ get isSymbolNode() {
46
+ return true;
47
+ }
48
+ /**
49
+ * Compile a node into a JavaScript function.
50
+ * This basically pre-calculates as much as possible and only leaves open
51
+ * calculations which depend on a dynamic scope with variables.
52
+ * @param {Object} math Math.js namespace with functions and constants.
53
+ * @param {Object} argNames An object with argument names as key and `true`
54
+ * as value. Used in the SymbolNode to optimize
55
+ * for arguments from user assigned functions
56
+ * (see FunctionAssignmentNode) or special symbols
57
+ * like `end` (see IndexNode).
58
+ * @return {function} Returns a function which can be called like:
59
+ * evalNode(scope: Object, args: Object, context: *)
60
+ */
61
+
62
+
63
+ _compile(math, argNames) {
64
+ var name = this.name;
65
+
66
+ if (argNames[name] === true) {
67
+ // this is a FunctionAssignment argument
68
+ // (like an x when inside the expression of a function
69
+ // assignment `f(x) = ...`)
70
+ return function (scope, args, context) {
71
+ return args[name];
72
+ };
73
+ } else if (name in math) {
74
+ return function (scope, args, context) {
75
+ return scope.has(name) ? scope.get(name) : getSafeProperty(math, name);
76
+ };
77
+ } else {
78
+ var isUnit = isValuelessUnit(name);
79
+ return function (scope, args, context) {
80
+ return scope.has(name) ? scope.get(name) : isUnit ? new Unit(null, name) : SymbolNode.onUndefinedSymbol(name);
81
+ };
82
+ }
83
+ }
84
+ /**
85
+ * Execute a callback for each of the child nodes of this node
86
+ * @param {function(child: Node, path: string, parent: Node)} callback
87
+ */
57
88
 
58
- SymbolNode.prototype._compile = function (math, argNames) {
59
- var name = this.name;
60
89
 
61
- if (argNames[name] === true) {
62
- // this is a FunctionAssignment argument
63
- // (like an x when inside the expression of a function assignment `f(x) = ...`)
64
- return function (scope, args, context) {
65
- return args[name];
66
- };
67
- } else if (name in math) {
68
- return function (scope, args, context) {
69
- return scope.has(name) ? scope.get(name) : getSafeProperty(math, name);
70
- };
71
- } else {
72
- var isUnit = isValuelessUnit(name);
73
- return function (scope, args, context) {
74
- return scope.has(name) ? scope.get(name) : isUnit ? new Unit(null, name) : SymbolNode.onUndefinedSymbol(name);
75
- };
90
+ forEach(callback) {// nothing to do, we don't have any children
76
91
  }
77
- };
78
- /**
79
- * Execute a callback for each of the child nodes of this node
80
- * @param {function(child: Node, path: string, parent: Node)} callback
81
- */
92
+ /**
93
+ * Create a new SymbolNode with children produced by the given callback.
94
+ * Trivial since a SymbolNode has no children
95
+ * @param {function(child: Node, path: string, parent: Node) : Node} callback
96
+ * @returns {SymbolNode} Returns a clone of the node
97
+ */
82
98
 
83
99
 
84
- SymbolNode.prototype.forEach = function (callback) {// nothing to do, we don't have childs
85
- };
86
- /**
87
- * Create a new SymbolNode having it's childs be the results of calling
88
- * the provided callback function for each of the childs of the original node.
89
- * @param {function(child: Node, path: string, parent: Node) : Node} callback
90
- * @returns {SymbolNode} Returns a clone of the node
91
- */
100
+ map(callback) {
101
+ return this.clone();
102
+ }
103
+ /**
104
+ * Throws an error 'Undefined symbol {name}'
105
+ * @param {string} name
106
+ */
92
107
 
93
108
 
94
- SymbolNode.prototype.map = function (callback) {
95
- return this.clone();
96
- };
97
- /**
98
- * Throws an error 'Undefined symbol {name}'
99
- * @param {string} name
100
- */
109
+ static onUndefinedSymbol(name) {
110
+ throw new Error('Undefined symbol ' + name);
111
+ }
112
+ /**
113
+ * Create a clone of this node, a shallow copy
114
+ * @return {SymbolNode}
115
+ */
101
116
 
102
117
 
103
- SymbolNode.onUndefinedSymbol = function (name) {
104
- throw new Error('Undefined symbol ' + name);
105
- };
106
- /**
107
- * Create a clone of this node, a shallow copy
108
- * @return {SymbolNode}
109
- */
118
+ clone() {
119
+ return new SymbolNode(this.name);
120
+ }
121
+ /**
122
+ * Get string representation
123
+ * @param {Object} options
124
+ * @return {string} str
125
+ * @override
126
+ */
110
127
 
111
128
 
112
- SymbolNode.prototype.clone = function () {
113
- return new SymbolNode(this.name);
114
- };
115
- /**
116
- * Get string representation
117
- * @param {Object} options
118
- * @return {string} str
119
- * @override
120
- */
129
+ _toString(options) {
130
+ return this.name;
131
+ }
132
+ /**
133
+ * Get HTML representation
134
+ * @param {Object} options
135
+ * @return {string} str
136
+ * @override
137
+ */
138
+
139
+
140
+ toHTML(options) {
141
+ var name = escape(this.name);
142
+
143
+ if (name === 'true' || name === 'false') {
144
+ return '<span class="math-symbol math-boolean">' + name + '</span>';
145
+ } else if (name === 'i') {
146
+ return '<span class="math-symbol math-imaginary-symbol">' + name + '</span>';
147
+ } else if (name === 'Infinity') {
148
+ return '<span class="math-symbol math-infinity-symbol">' + name + '</span>';
149
+ } else if (name === 'NaN') {
150
+ return '<span class="math-symbol math-nan-symbol">' + name + '</span>';
151
+ } else if (name === 'null') {
152
+ return '<span class="math-symbol math-null-symbol">' + name + '</span>';
153
+ } else if (name === 'undefined') {
154
+ return '<span class="math-symbol math-undefined-symbol">' + name + '</span>';
155
+ }
156
+
157
+ return '<span class="math-symbol">' + name + '</span>';
158
+ }
159
+ /**
160
+ * Get a JSON representation of the node
161
+ * @returns {Object}
162
+ */
121
163
 
122
164
 
123
- SymbolNode.prototype._toString = function (options) {
124
- return this.name;
125
- };
126
- /**
127
- * Get HTML representation
128
- * @param {Object} options
129
- * @return {string} str
130
- * @override
131
- */
165
+ toJSON() {
166
+ return {
167
+ mathjs: 'SymbolNode',
168
+ name: this.name
169
+ };
170
+ }
171
+ /**
172
+ * Instantiate a SymbolNode from its JSON representation
173
+ * @param {Object} json An object structured like
174
+ * `{"mathjs": "SymbolNode", name: "x"}`,
175
+ * where mathjs is optional
176
+ * @returns {SymbolNode}
177
+ */
132
178
 
133
179
 
134
- SymbolNode.prototype.toHTML = function (options) {
135
- var name = escape(this.name);
136
-
137
- if (name === 'true' || name === 'false') {
138
- return '<span class="math-symbol math-boolean">' + name + '</span>';
139
- } else if (name === 'i') {
140
- return '<span class="math-symbol math-imaginary-symbol">' + name + '</span>';
141
- } else if (name === 'Infinity') {
142
- return '<span class="math-symbol math-infinity-symbol">' + name + '</span>';
143
- } else if (name === 'NaN') {
144
- return '<span class="math-symbol math-nan-symbol">' + name + '</span>';
145
- } else if (name === 'null') {
146
- return '<span class="math-symbol math-null-symbol">' + name + '</span>';
147
- } else if (name === 'undefined') {
148
- return '<span class="math-symbol math-undefined-symbol">' + name + '</span>';
180
+ static fromJSON(json) {
181
+ return new SymbolNode(json.name);
149
182
  }
183
+ /**
184
+ * Get LaTeX representation
185
+ * @param {Object} options
186
+ * @return {string} str
187
+ * @override
188
+ */
150
189
 
151
- return '<span class="math-symbol">' + name + '</span>';
152
- };
153
- /**
154
- * Get a JSON representation of the node
155
- * @returns {Object}
156
- */
157
190
 
191
+ _toTex(options) {
192
+ var isUnit = false;
158
193
 
159
- SymbolNode.prototype.toJSON = function () {
160
- return {
161
- mathjs: 'SymbolNode',
162
- name: this.name
163
- };
164
- };
165
- /**
166
- * Instantiate a SymbolNode from its JSON representation
167
- * @param {Object} json An object structured like
168
- * `{"mathjs": "SymbolNode", name: "x"}`,
169
- * where mathjs is optional
170
- * @returns {SymbolNode}
171
- */
194
+ if (typeof math[this.name] === 'undefined' && isValuelessUnit(this.name)) {
195
+ isUnit = true;
196
+ }
172
197
 
198
+ var symbol = toSymbol(this.name, isUnit);
173
199
 
174
- SymbolNode.fromJSON = function (json) {
175
- return new SymbolNode(json.name);
176
- };
177
- /**
178
- * Get LaTeX representation
179
- * @param {Object} options
180
- * @return {string} str
181
- * @override
182
- */
200
+ if (symbol[0] === '\\') {
201
+ // no space needed if the symbol starts with '\'
202
+ return symbol;
203
+ } // the space prevents symbols from breaking stuff like '\cdot'
204
+ // if it's written right before the symbol
183
205
 
184
206
 
185
- SymbolNode.prototype._toTex = function (options) {
186
- var isUnit = false;
187
-
188
- if (typeof math[this.name] === 'undefined' && isValuelessUnit(this.name)) {
189
- isUnit = true;
207
+ return ' ' + symbol;
190
208
  }
191
209
 
192
- var symbol = toSymbol(this.name, isUnit);
193
-
194
- if (symbol[0] === '\\') {
195
- // no space needed if the symbol starts with '\'
196
- return symbol;
197
- } // the space prevents symbols from breaking stuff like '\cdot' if it's written right before the symbol
198
-
199
-
200
- return ' ' + symbol;
201
- };
210
+ }
202
211
 
203
212
  return SymbolNode;
204
213
  }, {
@@ -17,6 +17,7 @@
17
17
  // in parentheses
18
18
  // latexRightParens: the same for the right argument
19
19
  import { hasOwnProperty } from '../utils/object.js';
20
+ import { isConstantNode, isParenthesisNode, rule2Node } from '../utils/is.js';
20
21
  export var properties = [{
21
22
  // assignment
22
23
  AssignmentNode: {},
@@ -33,62 +34,74 @@ export var properties = [{
33
34
  }, {
34
35
  // logical or
35
36
  'OperatorNode:or': {
37
+ op: 'or',
36
38
  associativity: 'left',
37
39
  associativeWith: []
38
40
  }
39
41
  }, {
40
42
  // logical xor
41
43
  'OperatorNode:xor': {
44
+ op: 'xor',
42
45
  associativity: 'left',
43
46
  associativeWith: []
44
47
  }
45
48
  }, {
46
49
  // logical and
47
50
  'OperatorNode:and': {
51
+ op: 'and',
48
52
  associativity: 'left',
49
53
  associativeWith: []
50
54
  }
51
55
  }, {
52
56
  // bitwise or
53
57
  'OperatorNode:bitOr': {
58
+ op: '|',
54
59
  associativity: 'left',
55
60
  associativeWith: []
56
61
  }
57
62
  }, {
58
63
  // bitwise xor
59
64
  'OperatorNode:bitXor': {
65
+ op: '^|',
60
66
  associativity: 'left',
61
67
  associativeWith: []
62
68
  }
63
69
  }, {
64
70
  // bitwise and
65
71
  'OperatorNode:bitAnd': {
72
+ op: '&',
66
73
  associativity: 'left',
67
74
  associativeWith: []
68
75
  }
69
76
  }, {
70
77
  // relational operators
71
78
  'OperatorNode:equal': {
79
+ op: '==',
72
80
  associativity: 'left',
73
81
  associativeWith: []
74
82
  },
75
83
  'OperatorNode:unequal': {
84
+ op: '!=',
76
85
  associativity: 'left',
77
86
  associativeWith: []
78
87
  },
79
88
  'OperatorNode:smaller': {
89
+ op: '<',
80
90
  associativity: 'left',
81
91
  associativeWith: []
82
92
  },
83
93
  'OperatorNode:larger': {
94
+ op: '>',
84
95
  associativity: 'left',
85
96
  associativeWith: []
86
97
  },
87
98
  'OperatorNode:smallerEq': {
99
+ op: '<=',
88
100
  associativity: 'left',
89
101
  associativeWith: []
90
102
  },
91
103
  'OperatorNode:largerEq': {
104
+ op: '>=',
92
105
  associativity: 'left',
93
106
  associativeWith: []
94
107
  },
@@ -99,20 +112,24 @@ export var properties = [{
99
112
  }, {
100
113
  // bitshift operators
101
114
  'OperatorNode:leftShift': {
115
+ op: '<<',
102
116
  associativity: 'left',
103
117
  associativeWith: []
104
118
  },
105
119
  'OperatorNode:rightArithShift': {
120
+ op: '>>',
106
121
  associativity: 'left',
107
122
  associativeWith: []
108
123
  },
109
124
  'OperatorNode:rightLogShift': {
125
+ op: '>>>',
110
126
  associativity: 'left',
111
127
  associativeWith: []
112
128
  }
113
129
  }, {
114
130
  // unit conversion
115
131
  'OperatorNode:to': {
132
+ op: 'to',
116
133
  associativity: 'left',
117
134
  associativeWith: []
118
135
  }
@@ -122,20 +139,24 @@ export var properties = [{
122
139
  }, {
123
140
  // addition, subtraction
124
141
  'OperatorNode:add': {
142
+ op: '+',
125
143
  associativity: 'left',
126
144
  associativeWith: ['OperatorNode:add', 'OperatorNode:subtract']
127
145
  },
128
146
  'OperatorNode:subtract': {
147
+ op: '-',
129
148
  associativity: 'left',
130
149
  associativeWith: []
131
150
  }
132
151
  }, {
133
152
  // multiply, divide, modulus
134
153
  'OperatorNode:multiply': {
154
+ op: '*',
135
155
  associativity: 'left',
136
156
  associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'Operator:dotMultiply', 'Operator:dotDivide']
137
157
  },
138
158
  'OperatorNode:divide': {
159
+ op: '/',
139
160
  associativity: 'left',
140
161
  associativeWith: [],
141
162
  latexLeftParens: false,
@@ -146,34 +167,48 @@ export var properties = [{
146
167
 
147
168
  },
148
169
  'OperatorNode:dotMultiply': {
170
+ op: '.*',
149
171
  associativity: 'left',
150
172
  associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'OperatorNode:dotMultiply', 'OperatorNode:doDivide']
151
173
  },
152
174
  'OperatorNode:dotDivide': {
175
+ op: './',
153
176
  associativity: 'left',
154
177
  associativeWith: []
155
178
  },
156
179
  'OperatorNode:mod': {
180
+ op: 'mod',
157
181
  associativity: 'left',
158
182
  associativeWith: []
159
183
  }
184
+ }, {
185
+ // Repeat multiplication for implicit multiplication
186
+ 'OperatorNode:multiply': {
187
+ associativity: 'left',
188
+ associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'Operator:dotMultiply', 'Operator:dotDivide']
189
+ }
160
190
  }, {
161
191
  // unary prefix operators
162
192
  'OperatorNode:unaryPlus': {
193
+ op: '+',
163
194
  associativity: 'right'
164
195
  },
165
196
  'OperatorNode:unaryMinus': {
197
+ op: '-',
166
198
  associativity: 'right'
167
199
  },
168
200
  'OperatorNode:bitNot': {
201
+ op: '~',
169
202
  associativity: 'right'
170
203
  },
171
204
  'OperatorNode:not': {
205
+ op: 'not',
172
206
  associativity: 'right'
173
207
  }
174
208
  }, {
175
209
  // exponentiation
176
210
  'OperatorNode:pow': {
211
+ op: '^',
177
212
  associativity: 'right',
178
213
  associativeWith: [],
179
214
  latexRightParens: false // the exponent doesn't need parentheses in
@@ -182,20 +217,41 @@ export var properties = [{
182
217
 
183
218
  },
184
219
  'OperatorNode:dotPow': {
220
+ op: '.^',
185
221
  associativity: 'right',
186
222
  associativeWith: []
187
223
  }
188
224
  }, {
189
225
  // factorial
190
226
  'OperatorNode:factorial': {
227
+ op: '!',
191
228
  associativity: 'left'
192
229
  }
193
230
  }, {
194
231
  // matrix transpose
195
- 'OperatorNode:transpose': {
232
+ 'OperatorNode:ctranspose': {
233
+ op: "'",
196
234
  associativity: 'left'
197
235
  }
198
236
  }];
237
+ /**
238
+ * Returns the first non-parenthesis internal node, but only
239
+ * when the 'parenthesis' option is unset or auto.
240
+ * @param {Node} _node
241
+ * @param {string} parenthesis
242
+ * @return {Node}
243
+ */
244
+
245
+ function unwrapParen(_node, parenthesis) {
246
+ if (!parenthesis || parenthesis !== 'auto') return _node;
247
+ var node = _node;
248
+
249
+ while (isParenthesisNode(node)) {
250
+ node = node.content;
251
+ }
252
+
253
+ return node;
254
+ }
199
255
  /**
200
256
  * Get the precedence of a Node.
201
257
  * Higher number for higher precedence, starting with 0.
@@ -203,10 +259,13 @@ export var properties = [{
203
259
  *
204
260
  * @param {Node} _node
205
261
  * @param {string} parenthesis
262
+ * @param {string} implicit
263
+ * @param {Node} parent (for determining context for implicit multiplication)
206
264
  * @return {number | null}
207
265
  */
208
266
 
209
- export function getPrecedence(_node, parenthesis) {
267
+
268
+ export function getPrecedence(_node, parenthesis, implicit, parent) {
210
269
  var node = _node;
211
270
 
212
271
  if (parenthesis !== 'keep') {
@@ -215,14 +274,26 @@ export function getPrecedence(_node, parenthesis) {
215
274
  }
216
275
 
217
276
  var identifier = node.getIdentifier();
277
+ var precedence = null;
218
278
 
219
279
  for (var i = 0; i < properties.length; i++) {
220
280
  if (identifier in properties[i]) {
221
- return i;
281
+ precedence = i;
282
+ break;
283
+ }
284
+ } // Bump up precedence of implicit multiplication, except when preceded
285
+ // by a "Rule 2" fraction ( [unaryOp]constant / constant )
286
+
287
+
288
+ if (identifier === 'OperatorNode:multiply' && node.implicit && implicit !== 'show') {
289
+ var leftArg = unwrapParen(node.args[0], parenthesis);
290
+
291
+ if (!(isConstantNode(leftArg) && parent && parent.getIdentifier() === 'OperatorNode:divide' && rule2Node(unwrapParen(parent.args[0], parenthesis))) && !(leftArg.getIdentifier() === 'OperatorNode:divide' && rule2Node(unwrapParen(leftArg.args[0], parenthesis)) && isConstantNode(unwrapParen(leftArg.args[1])))) {
292
+ precedence += 1;
222
293
  }
223
294
  }
224
295
 
225
- return null;
296
+ return precedence;
226
297
  }
227
298
  /**
228
299
  * Get the associativity of an operator (left or right).
@@ -305,5 +376,26 @@ export function isAssociativeWith(nodeA, nodeB, parenthesis) {
305
376
  } // associativeWith is not defined
306
377
 
307
378
 
379
+ return null;
380
+ }
381
+ /**
382
+ * Get the operator associated with a function name.
383
+ * Returns a string with the operator symbol, or null if the
384
+ * input is not the name of a function associated with an
385
+ * operator.
386
+ *
387
+ * @param {string} Function name
388
+ * @return {string | null} Associated operator symbol, if any
389
+ */
390
+
391
+ export function getOperator(fn) {
392
+ var identifier = 'OperatorNode:' + fn;
393
+
394
+ for (var group of properties) {
395
+ if (identifier in group) {
396
+ return group[identifier].op;
397
+ }
398
+ }
399
+
308
400
  return null;
309
401
  }