mathjs 10.1.0 → 10.3.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 (341) hide show
  1. package/HISTORY.md +38 -0
  2. package/docs/expressions/algebra.md +27 -0
  3. package/docs/expressions/syntax.md +31 -2
  4. package/docs/reference/functions/abs.md +6 -0
  5. package/docs/reference/functions/acos.md +6 -0
  6. package/docs/reference/functions/acosh.md +6 -0
  7. package/docs/reference/functions/acot.md +6 -0
  8. package/docs/reference/functions/acoth.md +6 -0
  9. package/docs/reference/functions/acsc.md +6 -0
  10. package/docs/reference/functions/acsch.md +6 -0
  11. package/docs/reference/functions/add.md +6 -0
  12. package/docs/reference/functions/and.md +6 -0
  13. package/docs/reference/functions/apply.md +6 -0
  14. package/docs/reference/functions/arg.md +6 -0
  15. package/docs/reference/functions/asec.md +6 -0
  16. package/docs/reference/functions/asech.md +6 -0
  17. package/docs/reference/functions/asin.md +6 -0
  18. package/docs/reference/functions/asinh.md +6 -0
  19. package/docs/reference/functions/atan.md +6 -0
  20. package/docs/reference/functions/atan2.md +6 -0
  21. package/docs/reference/functions/atanh.md +6 -0
  22. package/docs/reference/functions/bellNumbers.md +6 -0
  23. package/docs/reference/functions/bin.md +6 -0
  24. package/docs/reference/functions/bitAnd.md +6 -0
  25. package/docs/reference/functions/bitNot.md +6 -0
  26. package/docs/reference/functions/bitOr.md +6 -0
  27. package/docs/reference/functions/bitXor.md +6 -0
  28. package/docs/reference/functions/catalan.md +6 -0
  29. package/docs/reference/functions/cbrt.md +6 -0
  30. package/docs/reference/functions/ceil.md +6 -0
  31. package/docs/reference/functions/clone.md +6 -0
  32. package/docs/reference/functions/column.md +6 -0
  33. package/docs/reference/functions/combinations.md +6 -0
  34. package/docs/reference/functions/combinationsWithRep.md +6 -0
  35. package/docs/reference/functions/compare.md +6 -0
  36. package/docs/reference/functions/compareNatural.md +6 -0
  37. package/docs/reference/functions/compareText.md +6 -0
  38. package/docs/reference/functions/compile.md +6 -0
  39. package/docs/reference/functions/composition.md +6 -0
  40. package/docs/reference/functions/concat.md +6 -0
  41. package/docs/reference/functions/conj.md +6 -0
  42. package/docs/reference/functions/cos.md +6 -0
  43. package/docs/reference/functions/cosh.md +6 -0
  44. package/docs/reference/functions/cot.md +6 -0
  45. package/docs/reference/functions/coth.md +6 -0
  46. package/docs/reference/functions/count.md +6 -0
  47. package/docs/reference/functions/cross.md +6 -0
  48. package/docs/reference/functions/csc.md +6 -0
  49. package/docs/reference/functions/csch.md +6 -0
  50. package/docs/reference/functions/ctranspose.md +6 -0
  51. package/docs/reference/functions/cube.md +6 -0
  52. package/docs/reference/functions/deepEqual.md +6 -0
  53. package/docs/reference/functions/derivative.md +6 -0
  54. package/docs/reference/functions/det.md +6 -0
  55. package/docs/reference/functions/diag.md +6 -0
  56. package/docs/reference/functions/diff.md +6 -0
  57. package/docs/reference/functions/distance.md +6 -0
  58. package/docs/reference/functions/divide.md +6 -0
  59. package/docs/reference/functions/dot.md +6 -0
  60. package/docs/reference/functions/dotDivide.md +6 -0
  61. package/docs/reference/functions/dotMultiply.md +6 -0
  62. package/docs/reference/functions/dotPow.md +6 -0
  63. package/docs/reference/functions/eigs.md +6 -0
  64. package/docs/reference/functions/equal.md +6 -0
  65. package/docs/reference/functions/equalText.md +6 -0
  66. package/docs/reference/functions/erf.md +6 -0
  67. package/docs/reference/functions/evaluate.md +6 -0
  68. package/docs/reference/functions/exp.md +6 -0
  69. package/docs/reference/functions/expm.md +6 -0
  70. package/docs/reference/functions/expm1.md +6 -0
  71. package/docs/reference/functions/factorial.md +6 -0
  72. package/docs/reference/functions/filter.md +6 -0
  73. package/docs/reference/functions/fix.md +6 -0
  74. package/docs/reference/functions/flatten.md +6 -0
  75. package/docs/reference/functions/floor.md +6 -0
  76. package/docs/reference/functions/forEach.md +6 -0
  77. package/docs/reference/functions/format.md +6 -0
  78. package/docs/reference/functions/gamma.md +6 -0
  79. package/docs/reference/functions/gcd.md +6 -0
  80. package/docs/reference/functions/getMatrixDataType.md +6 -0
  81. package/docs/reference/functions/hasNumericValue.md +6 -0
  82. package/docs/reference/functions/help.md +6 -0
  83. package/docs/reference/functions/hex.md +6 -0
  84. package/docs/reference/functions/hypot.md +6 -0
  85. package/docs/reference/functions/identity.md +6 -0
  86. package/docs/reference/functions/im.md +6 -0
  87. package/docs/reference/functions/intersect.md +6 -0
  88. package/docs/reference/functions/inv.md +6 -0
  89. package/docs/reference/functions/invmod.md +6 -0
  90. package/docs/reference/functions/isInteger.md +6 -0
  91. package/docs/reference/functions/isNaN.md +6 -0
  92. package/docs/reference/functions/isNegative.md +6 -0
  93. package/docs/reference/functions/isNumeric.md +6 -0
  94. package/docs/reference/functions/isPositive.md +6 -0
  95. package/docs/reference/functions/isPrime.md +6 -0
  96. package/docs/reference/functions/isZero.md +6 -0
  97. package/docs/reference/functions/kldivergence.md +6 -0
  98. package/docs/reference/functions/kron.md +6 -0
  99. package/docs/reference/functions/larger.md +6 -0
  100. package/docs/reference/functions/largerEq.md +6 -0
  101. package/docs/reference/functions/lcm.md +6 -0
  102. package/docs/reference/functions/leafCount.md +52 -0
  103. package/docs/reference/functions/leftShift.md +6 -0
  104. package/docs/reference/functions/log.md +6 -0
  105. package/docs/reference/functions/log10.md +6 -0
  106. package/docs/reference/functions/log1p.md +6 -0
  107. package/docs/reference/functions/log2.md +6 -0
  108. package/docs/reference/functions/lsolve.md +6 -0
  109. package/docs/reference/functions/lsolveAll.md +6 -0
  110. package/docs/reference/functions/lup.md +6 -0
  111. package/docs/reference/functions/lusolve.md +6 -0
  112. package/docs/reference/functions/mad.md +6 -0
  113. package/docs/reference/functions/map.md +28 -5
  114. package/docs/reference/functions/matrixFromColumns.md +6 -0
  115. package/docs/reference/functions/matrixFromFunction.md +6 -0
  116. package/docs/reference/functions/matrixFromRows.md +6 -0
  117. package/docs/reference/functions/max.md +6 -0
  118. package/docs/reference/functions/mean.md +6 -0
  119. package/docs/reference/functions/median.md +6 -0
  120. package/docs/reference/functions/min.md +6 -0
  121. package/docs/reference/functions/mod.md +6 -0
  122. package/docs/reference/functions/mode.md +6 -0
  123. package/docs/reference/functions/multinomial.md +6 -0
  124. package/docs/reference/functions/multiply.md +6 -0
  125. package/docs/reference/functions/norm.md +6 -0
  126. package/docs/reference/functions/not.md +6 -0
  127. package/docs/reference/functions/nthRoot.md +6 -0
  128. package/docs/reference/functions/nthRoots.md +6 -0
  129. package/docs/reference/functions/numeric.md +6 -0
  130. package/docs/reference/functions/oct.md +6 -0
  131. package/docs/reference/functions/ones.md +6 -0
  132. package/docs/reference/functions/or.md +6 -0
  133. package/docs/reference/functions/parser.md +6 -0
  134. package/docs/reference/functions/partitionSelect.md +6 -0
  135. package/docs/reference/functions/permutations.md +6 -0
  136. package/docs/reference/functions/pickRandom.md +6 -0
  137. package/docs/reference/functions/pow.md +6 -0
  138. package/docs/reference/functions/print.md +6 -0
  139. package/docs/reference/functions/prod.md +6 -0
  140. package/docs/reference/functions/qr.md +6 -0
  141. package/docs/reference/functions/quantileSeq.md +6 -0
  142. package/docs/reference/functions/random.md +6 -0
  143. package/docs/reference/functions/randomInt.md +6 -0
  144. package/docs/reference/functions/range.md +6 -0
  145. package/docs/reference/functions/rationalize.md +7 -1
  146. package/docs/reference/functions/re.md +6 -0
  147. package/docs/reference/functions/reshape.md +7 -0
  148. package/docs/reference/functions/resize.md +6 -0
  149. package/docs/reference/functions/resolve.md +46 -0
  150. package/docs/reference/functions/rightArithShift.md +6 -0
  151. package/docs/reference/functions/rightLogShift.md +6 -0
  152. package/docs/reference/functions/rotate.md +6 -0
  153. package/docs/reference/functions/rotationMatrix.md +6 -0
  154. package/docs/reference/functions/round.md +6 -0
  155. package/docs/reference/functions/row.md +6 -0
  156. package/docs/reference/functions/sec.md +6 -0
  157. package/docs/reference/functions/sech.md +6 -0
  158. package/docs/reference/functions/setCartesian.md +6 -0
  159. package/docs/reference/functions/setDifference.md +6 -0
  160. package/docs/reference/functions/setDistinct.md +6 -0
  161. package/docs/reference/functions/setIntersect.md +6 -0
  162. package/docs/reference/functions/setIsSubset.md +6 -0
  163. package/docs/reference/functions/setMultiplicity.md +6 -0
  164. package/docs/reference/functions/setPowerset.md +6 -0
  165. package/docs/reference/functions/setSize.md +6 -0
  166. package/docs/reference/functions/setSymDifference.md +6 -0
  167. package/docs/reference/functions/setUnion.md +6 -0
  168. package/docs/reference/functions/sign.md +6 -0
  169. package/docs/reference/functions/simplify.md +47 -7
  170. package/docs/reference/functions/simplifyCore.md +50 -0
  171. package/docs/reference/functions/sin.md +6 -0
  172. package/docs/reference/functions/sinh.md +6 -0
  173. package/docs/reference/functions/size.md +6 -0
  174. package/docs/reference/functions/slu.md +6 -0
  175. package/docs/reference/functions/smaller.md +6 -0
  176. package/docs/reference/functions/smallerEq.md +6 -0
  177. package/docs/reference/functions/sort.md +6 -0
  178. package/docs/reference/functions/sqrt.md +6 -0
  179. package/docs/reference/functions/sqrtm.md +6 -0
  180. package/docs/reference/functions/square.md +6 -0
  181. package/docs/reference/functions/squeeze.md +6 -0
  182. package/docs/reference/functions/std.md +6 -0
  183. package/docs/reference/functions/stirlingS2.md +6 -0
  184. package/docs/reference/functions/subset.md +16 -2
  185. package/docs/reference/functions/subtract.md +6 -0
  186. package/docs/reference/functions/sum.md +6 -0
  187. package/docs/reference/functions/symbolicEqual.md +62 -0
  188. package/docs/reference/functions/tan.md +6 -0
  189. package/docs/reference/functions/tanh.md +6 -0
  190. package/docs/reference/functions/to.md +6 -0
  191. package/docs/reference/functions/trace.md +6 -0
  192. package/docs/reference/functions/transpose.md +6 -0
  193. package/docs/reference/functions/typeOf.md +6 -0
  194. package/docs/reference/functions/unaryMinus.md +6 -0
  195. package/docs/reference/functions/unaryPlus.md +6 -0
  196. package/docs/reference/functions/unequal.md +6 -0
  197. package/docs/reference/functions/usolve.md +6 -0
  198. package/docs/reference/functions/usolveAll.md +6 -0
  199. package/docs/reference/functions/variance.md +6 -0
  200. package/docs/reference/functions/xgcd.md +6 -0
  201. package/docs/reference/functions/xor.md +6 -0
  202. package/docs/reference/functions/zeros.md +6 -0
  203. package/docs/reference/functions.md +5 -1
  204. package/lib/browser/math.js +6 -6
  205. package/lib/browser/math.js.map +1 -1
  206. package/lib/cjs/core/create.js +4 -4
  207. package/lib/cjs/core/function/import.js +3 -3
  208. package/lib/cjs/core/function/typed.js +2 -2
  209. package/lib/cjs/defaultInstance.js +3 -3
  210. package/lib/cjs/entry/allFactoriesAny.js +1 -1
  211. package/lib/cjs/entry/allFactoriesNumber.js +1 -1
  212. package/lib/cjs/entry/configReadonly.js +1 -1
  213. package/lib/cjs/entry/dependenciesAny/dependenciesLeafCount.generated.js +23 -0
  214. package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +3 -0
  215. package/lib/cjs/entry/dependenciesAny/dependenciesResolve.generated.js +32 -0
  216. package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +6 -0
  217. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +65 -0
  218. package/lib/cjs/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +29 -0
  219. package/lib/cjs/entry/dependenciesAny.generated.js +32 -0
  220. package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +3 -0
  221. package/lib/cjs/entry/dependenciesNumber/dependenciesResolve.generated.js +32 -0
  222. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +6 -0
  223. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +65 -0
  224. package/lib/cjs/entry/dependenciesNumber.generated.js +16 -0
  225. package/lib/cjs/entry/impureFunctionsAny.generated.js +80 -34
  226. package/lib/cjs/entry/impureFunctionsNumber.generated.js +96 -64
  227. package/lib/cjs/entry/pureFunctionsAny.generated.js +62 -64
  228. package/lib/cjs/entry/pureFunctionsNumber.generated.js +46 -48
  229. package/lib/cjs/expression/Help.js +4 -0
  230. package/lib/cjs/expression/Parser.js +1 -1
  231. package/lib/cjs/expression/embeddedDocs/core/typed.js +1 -1
  232. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +247 -235
  233. package/lib/cjs/expression/embeddedDocs/function/algebra/leafCount.js +15 -0
  234. package/lib/cjs/expression/embeddedDocs/function/algebra/resolve.js +16 -0
  235. package/lib/cjs/expression/embeddedDocs/function/algebra/simplify.js +1 -1
  236. package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyCore.js +15 -0
  237. package/lib/cjs/expression/embeddedDocs/function/algebra/symbolicEqual.js +15 -0
  238. package/lib/cjs/expression/embeddedDocs/function/matrix/subset.js +2 -2
  239. package/lib/cjs/expression/node/FunctionNode.js +80 -61
  240. package/lib/cjs/expression/node/IndexNode.js +1 -1
  241. package/lib/cjs/expression/node/Node.js +3 -3
  242. package/lib/cjs/expression/node/ObjectNode.js +1 -1
  243. package/lib/cjs/expression/node/utils/access.js +1 -1
  244. package/lib/cjs/expression/node/utils/assign.js +1 -1
  245. package/lib/cjs/expression/parse.js +13 -13
  246. package/lib/cjs/factoriesAny.js +32 -0
  247. package/lib/cjs/factoriesNumber.js +16 -0
  248. package/lib/cjs/function/algebra/decomposition/qr.js +1 -1
  249. package/lib/cjs/function/algebra/leafCount.js +66 -0
  250. package/lib/cjs/function/algebra/rationalize.js +24 -41
  251. package/lib/cjs/function/algebra/resolve.js +106 -0
  252. package/lib/cjs/function/algebra/simplify/simplifyConstant.js +5 -5
  253. package/lib/cjs/function/algebra/simplify/util.js +171 -33
  254. package/lib/cjs/function/algebra/simplify.js +588 -211
  255. package/lib/cjs/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +67 -43
  256. package/lib/cjs/function/algebra/solver/lsolveAll.js +2 -2
  257. package/lib/cjs/function/algebra/solver/usolveAll.js +2 -2
  258. package/lib/cjs/function/algebra/symbolicEqual.js +88 -0
  259. package/lib/cjs/function/arithmetic/ceil.js +3 -3
  260. package/lib/cjs/function/arithmetic/floor.js +3 -3
  261. package/lib/cjs/function/arithmetic/invmod.js +1 -1
  262. package/lib/cjs/function/arithmetic/norm.js +1 -1
  263. package/lib/cjs/function/arithmetic/round.js +1 -1
  264. package/lib/cjs/function/matrix/eigs/complexEigs.js +13 -11
  265. package/lib/cjs/function/matrix/map.js +53 -15
  266. package/lib/cjs/function/matrix/matrixFromColumns.js +1 -1
  267. package/lib/cjs/function/matrix/matrixFromRows.js +1 -1
  268. package/lib/cjs/function/matrix/subset.js +15 -5
  269. package/lib/cjs/function/probability/util/seededRNG.js +2 -2
  270. package/lib/cjs/function/relational/compareNatural.js +6 -6
  271. package/lib/cjs/header.js +2 -2
  272. package/lib/cjs/plain/bignumber/index.js +1 -1
  273. package/lib/cjs/plain/number/combinations.js +18 -6
  274. package/lib/cjs/type/bignumber/BigNumber.js +2 -2
  275. package/lib/cjs/type/bignumber/function/bignumber.js +1 -1
  276. package/lib/cjs/type/boolean.js +2 -2
  277. package/lib/cjs/type/complex/Complex.js +14 -14
  278. package/lib/cjs/type/complex/function/complex.js +1 -1
  279. package/lib/cjs/type/fraction/Fraction.js +6 -6
  280. package/lib/cjs/type/fraction/function/fraction.js +1 -1
  281. package/lib/cjs/type/matrix/DenseMatrix.js +5 -5
  282. package/lib/cjs/type/matrix/SparseMatrix.js +2 -2
  283. package/lib/cjs/type/number.js +1 -1
  284. package/lib/cjs/type/string.js +2 -2
  285. package/lib/cjs/type/unit/Unit.js +8 -8
  286. package/lib/cjs/utils/customs.js +2 -2
  287. package/lib/cjs/utils/emitter.js +1 -1
  288. package/lib/cjs/utils/function.js +2 -2
  289. package/lib/cjs/utils/is.js +6 -6
  290. package/lib/cjs/utils/latex.js +3 -3
  291. package/lib/cjs/utils/lruQueue.js +1 -1
  292. package/lib/cjs/utils/map.js +3 -3
  293. package/lib/cjs/utils/object.js +2 -2
  294. package/lib/cjs/utils/snapshot.js +7 -7
  295. package/lib/cjs/utils/string.js +2 -2
  296. package/lib/cjs/version.js +1 -1
  297. package/lib/esm/entry/dependenciesAny/dependenciesLeafCount.generated.js +12 -0
  298. package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +2 -0
  299. package/lib/esm/entry/dependenciesAny/dependenciesResolve.generated.js +18 -0
  300. package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +4 -0
  301. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +40 -0
  302. package/lib/esm/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +16 -0
  303. package/lib/esm/entry/dependenciesAny.generated.js +4 -0
  304. package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +2 -0
  305. package/lib/esm/entry/dependenciesNumber/dependenciesResolve.generated.js +18 -0
  306. package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +4 -0
  307. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +40 -0
  308. package/lib/esm/entry/dependenciesNumber.generated.js +2 -0
  309. package/lib/esm/entry/impureFunctionsAny.generated.js +69 -27
  310. package/lib/esm/entry/impureFunctionsNumber.generated.js +83 -53
  311. package/lib/esm/entry/pureFunctionsAny.generated.js +49 -49
  312. package/lib/esm/entry/pureFunctionsNumber.generated.js +32 -32
  313. package/lib/esm/expression/Help.js +4 -0
  314. package/lib/esm/expression/embeddedDocs/core/typed.js +1 -1
  315. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +220 -212
  316. package/lib/esm/expression/embeddedDocs/function/algebra/leafCount.js +8 -0
  317. package/lib/esm/expression/embeddedDocs/function/algebra/resolve.js +9 -0
  318. package/lib/esm/expression/embeddedDocs/function/algebra/simplify.js +1 -1
  319. package/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js +8 -0
  320. package/lib/esm/expression/embeddedDocs/function/algebra/symbolicEqual.js +8 -0
  321. package/lib/esm/expression/embeddedDocs/function/matrix/subset.js +2 -2
  322. package/lib/esm/expression/node/FunctionNode.js +70 -53
  323. package/lib/esm/factoriesAny.js +4 -0
  324. package/lib/esm/factoriesNumber.js +2 -0
  325. package/lib/esm/function/algebra/leafCount.js +59 -0
  326. package/lib/esm/function/algebra/rationalize.js +24 -40
  327. package/lib/esm/function/algebra/resolve.js +95 -0
  328. package/lib/esm/function/algebra/simplify/simplifyConstant.js +3 -3
  329. package/lib/esm/function/algebra/simplify/util.js +170 -34
  330. package/lib/esm/function/algebra/simplify.js +583 -206
  331. package/lib/esm/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +60 -44
  332. package/lib/esm/function/algebra/symbolicEqual.js +80 -0
  333. package/lib/esm/function/matrix/eigs/complexEigs.js +8 -6
  334. package/lib/esm/function/matrix/map.js +53 -15
  335. package/lib/esm/function/matrix/subset.js +15 -5
  336. package/lib/esm/plain/number/combinations.js +18 -6
  337. package/lib/esm/version.js +1 -1
  338. package/package.json +20 -15
  339. package/types/index.d.ts +52 -10
  340. package/lib/cjs/function/algebra/simplify/resolve.js +0 -76
  341. package/lib/esm/function/algebra/simplify/resolve.js +0 -67
@@ -77,76 +77,93 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
77
77
  var evalArgs = this.args.map(arg => arg._compile(math, argNames));
78
78
 
79
79
  if (isSymbolNode(this.fn)) {
80
- // we can statically determine whether the function has an rawArgs property
81
80
  var _name = this.fn.name;
82
- var fn = _name in math ? getSafeProperty(math, _name) : undefined;
83
- var isRaw = typeof fn === 'function' && fn.rawArgs === true;
84
81
 
85
- var resolveFn = scope => {
86
- if (scope.has(_name)) {
87
- return scope.get(_name);
88
- }
82
+ if (!argNames[_name]) {
83
+ // we can statically determine whether the function has an rawArgs property
84
+ var fn = _name in math ? getSafeProperty(math, _name) : undefined;
85
+ var isRaw = typeof fn === 'function' && fn.rawArgs === true;
89
86
 
90
- if (_name in math) {
91
- return getSafeProperty(math, _name);
92
- }
87
+ var resolveFn = scope => {
88
+ if (scope.has(_name)) {
89
+ return scope.get(_name);
90
+ }
93
91
 
94
- return FunctionNode.onUndefinedFunction(_name);
95
- };
92
+ if (_name in math) {
93
+ return getSafeProperty(math, _name);
94
+ }
96
95
 
97
- if (isRaw) {
98
- // pass unevaluated parameters (nodes) to the function
99
- // "raw" evaluation
100
- var rawArgs = this.args;
101
- return function evalFunctionNode(scope, args, context) {
102
- var fn = resolveFn(scope);
103
- return fn(rawArgs, math, createSubScope(scope, args), scope);
96
+ return FunctionNode.onUndefinedFunction(_name);
104
97
  };
105
- } else {
106
- // "regular" evaluation
107
- switch (evalArgs.length) {
108
- case 0:
109
- return function evalFunctionNode(scope, args, context) {
110
- var fn = resolveFn(scope);
111
- return fn();
112
- };
113
-
114
- case 1:
115
- return function evalFunctionNode(scope, args, context) {
116
- var fn = resolveFn(scope);
117
- var evalArg0 = evalArgs[0];
118
- return fn(evalArg0(scope, args, context));
119
- };
120
-
121
- case 2:
122
- return function evalFunctionNode(scope, args, context) {
123
- var fn = resolveFn(scope);
124
- var evalArg0 = evalArgs[0];
125
- var evalArg1 = evalArgs[1];
126
- return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
127
- };
128
-
129
- default:
130
- return function evalFunctionNode(scope, args, context) {
131
- var fn = resolveFn(scope);
132
- var values = evalArgs.map(evalArg => evalArg(scope, args, context));
133
- return fn(...values);
134
- };
98
+
99
+ if (isRaw) {
100
+ // pass unevaluated parameters (nodes) to the function
101
+ // "raw" evaluation
102
+ var rawArgs = this.args;
103
+ return function evalFunctionNode(scope, args, context) {
104
+ var fn = resolveFn(scope);
105
+ return fn(rawArgs, math, createSubScope(scope, args), scope);
106
+ };
107
+ } else {
108
+ // "regular" evaluation
109
+ switch (evalArgs.length) {
110
+ case 0:
111
+ return function evalFunctionNode(scope, args, context) {
112
+ var fn = resolveFn(scope);
113
+ return fn();
114
+ };
115
+
116
+ case 1:
117
+ return function evalFunctionNode(scope, args, context) {
118
+ var fn = resolveFn(scope);
119
+ var evalArg0 = evalArgs[0];
120
+ return fn(evalArg0(scope, args, context));
121
+ };
122
+
123
+ case 2:
124
+ return function evalFunctionNode(scope, args, context) {
125
+ var fn = resolveFn(scope);
126
+ var evalArg0 = evalArgs[0];
127
+ var evalArg1 = evalArgs[1];
128
+ return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
129
+ };
130
+
131
+ default:
132
+ return function evalFunctionNode(scope, args, context) {
133
+ var fn = resolveFn(scope);
134
+ var values = evalArgs.map(evalArg => evalArg(scope, args, context));
135
+ return fn(...values);
136
+ };
137
+ }
135
138
  }
139
+ } else {
140
+ // the function symbol is an argName
141
+ var _rawArgs = this.args;
142
+ return function evalFunctionNode(scope, args, context) {
143
+ var fn = args[_name];
144
+ var isRaw = fn && fn.rawArgs;
145
+
146
+ if (isRaw) {
147
+ return fn(_rawArgs, math, createSubScope(scope, args), scope); // "raw" evaluation
148
+ } else {
149
+ var values = evalArgs.map(evalArg => evalArg(scope, args, context));
150
+ return fn.apply(fn, values);
151
+ }
152
+ };
136
153
  }
137
154
  } else if (isAccessorNode(this.fn) && isIndexNode(this.fn.index) && this.fn.index.isObjectProperty()) {
138
155
  // execute the function with the right context: the object of the AccessorNode
139
156
  var evalObject = this.fn.object._compile(math, argNames);
140
157
 
141
158
  var prop = this.fn.index.getObjectProperty();
142
- var _rawArgs = this.args;
159
+ var _rawArgs2 = this.args;
143
160
  return function evalFunctionNode(scope, args, context) {
144
161
  var object = evalObject(scope, args, context);
145
162
  validateSafeMethod(object, prop);
146
163
  var isRaw = object[prop] && object[prop].rawArgs;
147
164
 
148
165
  if (isRaw) {
149
- return object[prop](_rawArgs, math, createSubScope(scope, args), scope); // "raw" evaluation
166
+ return object[prop](_rawArgs2, math, createSubScope(scope, args), scope); // "raw" evaluation
150
167
  } else {
151
168
  // "regular" evaluation
152
169
  var values = evalArgs.map(evalArg => evalArg(scope, args, context));
@@ -158,13 +175,13 @@ export var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref
158
175
  // we have to dynamically determine whether the function has a rawArgs property
159
176
  var evalFn = this.fn._compile(math, argNames);
160
177
 
161
- var _rawArgs2 = this.args;
178
+ var _rawArgs3 = this.args;
162
179
  return function evalFunctionNode(scope, args, context) {
163
180
  var fn = evalFn(scope, args, context);
164
181
  var isRaw = fn && fn.rawArgs;
165
182
 
166
183
  if (isRaw) {
167
- return fn(_rawArgs2, math, createSubScope(scope, args), scope); // "raw" evaluation
184
+ return fn(_rawArgs3, math, createSubScope(scope, args), scope); // "raw" evaluation
168
185
  } else {
169
186
  // "regular" evaluation
170
187
  var values = evalArgs.map(evalArg => evalArg(scope, args, context));
@@ -241,7 +241,11 @@ export { createStirlingS2 } from './function/combinatorics/stirlingS2.js';
241
241
  export { createBellNumbers } from './function/combinatorics/bellNumbers.js';
242
242
  export { createCatalan } from './function/combinatorics/catalan.js';
243
243
  export { createComposition } from './function/combinatorics/composition.js';
244
+ export { createLeafCount } from './function/algebra/leafCount.js';
244
245
  export { createSimplify } from './function/algebra/simplify.js';
246
+ export { createSimplifyCore } from './function/algebra/simplifyCore.js';
247
+ export { createResolve } from './function/algebra/resolve.js';
248
+ export { createSymbolicEqual } from './function/algebra/symbolicEqual.js';
245
249
  export { createDerivative } from './function/algebra/derivative.js';
246
250
  export { createRationalize } from './function/algebra/rationalize.js';
247
251
  export { createReviver } from './json/reviver.js';
@@ -13,7 +13,9 @@ export { createChainClass } from './type/chain/Chain.js';
13
13
  export { createHelp } from './expression/function/help.js';
14
14
  export { createChain } from './type/chain/function/chain.js'; // algebra
15
15
 
16
+ export { createResolve } from './function/algebra/resolve.js';
16
17
  export { createSimplify } from './function/algebra/simplify.js';
18
+ export { createSimplifyCore } from './function/algebra/simplifyCore.js';
17
19
  export { createDerivative } from './function/algebra/derivative.js';
18
20
  export { createRationalize } from './function/algebra/rationalize.js'; // arithmetic
19
21
 
@@ -0,0 +1,59 @@
1
+ import { factory } from '../../utils/factory.js';
2
+ var name = 'leafCount';
3
+ var dependencies = ['parse', 'typed'];
4
+ export var createLeafCount = /* #__PURE__ */factory(name, dependencies, _ref => {
5
+ var {
6
+ parse,
7
+ typed
8
+ } = _ref;
9
+
10
+ // This does the real work, but we don't have to recurse through
11
+ // a typed call if we separate it out
12
+ function countLeaves(node) {
13
+ var count = 0;
14
+ node.forEach(n => {
15
+ count += countLeaves(n);
16
+ });
17
+ return count || 1;
18
+ }
19
+ /**
20
+ * Gives the number of "leaf nodes" in the parse tree of the given expression
21
+ * A leaf node is one that has no subexpressions, essentially either a
22
+ * symbol or a constant. Note that `5!` has just one leaf, the '5'; the
23
+ * unary factorial operator does not add a leaf. On the other hand,
24
+ * function symbols do add leaves, so `sin(x)/cos(x)` has four leaves.
25
+ *
26
+ * The `simplify()` function should generally not increase the `leafCount()`
27
+ * of an expression, although currently there is no guarantee that it never
28
+ * does so. In many cases, `simplify()` reduces the leaf count.
29
+ *
30
+ * Syntax:
31
+ *
32
+ * leafCount(expr)
33
+ *
34
+ * Examples:
35
+ *
36
+ * math.leafCount('x') // 1
37
+ * math.leafCount(math.parse('a*d-b*c')) // 4
38
+ * math.leafCount('[a,b;c,d][0,1]') // 6
39
+ *
40
+ * See also:
41
+ *
42
+ * simplify
43
+ *
44
+ * @param {Node|string} expr The expression to count the leaves of
45
+ *
46
+ * @return {number} The number of leaves of `expr`
47
+ *
48
+ */
49
+
50
+
51
+ return typed(name, {
52
+ string: function string(expr) {
53
+ return this(parse(expr));
54
+ },
55
+ Node: function Node(expr) {
56
+ return countLeaves(expr);
57
+ }
58
+ });
59
+ });
@@ -1,9 +1,8 @@
1
1
  import { isInteger } from '../../utils/number.js';
2
2
  import { factory } from '../../utils/factory.js';
3
3
  import { createSimplifyConstant } from './simplify/simplifyConstant.js';
4
- import { createSimplifyCore } from './simplify/simplifyCore.js';
5
4
  var name = 'rationalize';
6
- var dependencies = ['config', 'typed', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'parse', 'simplify', '?bignumber', '?fraction', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode', 'ParenthesisNode'];
5
+ var dependencies = ['config', 'typed', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'parse', 'simplifyCore', 'simplify', '?bignumber', '?fraction', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode', 'ParenthesisNode'];
7
6
  export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref => {
8
7
  var {
9
8
  config,
@@ -16,6 +15,7 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
16
15
  divide,
17
16
  pow,
18
17
  parse,
18
+ simplifyCore,
19
19
  simplify,
20
20
  fraction,
21
21
  bignumber,
@@ -47,23 +47,6 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
47
47
  OperatorNode,
48
48
  SymbolNode
49
49
  });
50
- var simplifyCore = createSimplifyCore({
51
- equal,
52
- isZero,
53
- add,
54
- subtract,
55
- multiply,
56
- divide,
57
- pow,
58
- AccessorNode,
59
- ArrayNode,
60
- ConstantNode,
61
- FunctionNode,
62
- IndexNode,
63
- ObjectNode,
64
- OperatorNode,
65
- ParenthesisNode
66
- });
67
50
  /**
68
51
  * Transform a rationalizable expression in a rational fraction.
69
52
  * If rational fraction is one variable polynomial then converts
@@ -107,13 +90,13 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
107
90
  * @param {Object|boolean} optional scope of expression or true for already evaluated rational expression at input
108
91
  * @param {Boolean} detailed optional True if return an object, false if return expression node (default)
109
92
  *
110
- * @return {Object | Node} The rational polynomial of `expr` or na object
111
- * {Object}
112
- * {Expression Node} expression: node simplified expression
113
- * {Expression Node} numerator: simplified numerator of expression
114
- * {Expression Node | boolean} denominator: simplified denominator or false (if there is no denominator)
115
- * {Array} variables: variable names
116
- * {Array} coefficients: coefficients of numerator sorted by increased exponent
93
+ * @return {Object | Node} The rational polynomial of `expr` or an object
94
+ * `{expression, numerator, denominator, variables, coefficients}`, where
95
+ * `expression` is a `Node` with the node simplified expression,
96
+ * `numerator` is a `Node` with the simplified numerator of expression,
97
+ * `denominator` is a `Node` or `boolean` with the simplified denominator or `false` (if there is no denominator),
98
+ * `variables` is an array with variable names,
99
+ * and `coefficients` is an array with coefficients of numerator sorted by increased exponent
117
100
  * {Expression Node} node simplified expression
118
101
  *
119
102
  */
@@ -146,6 +129,12 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
146
129
  var polyRet = polynomial(expr, scope, true, setRules.firstRules); // Check if expression is a rationalizable polynomial
147
130
 
148
131
  var nVars = polyRet.variables.length;
132
+ var noExactFractions = {
133
+ exactFractions: false
134
+ };
135
+ var withExactFractions = {
136
+ exactFractions: true
137
+ };
149
138
  expr = polyRet.expression;
150
139
 
151
140
  if (nVars >= 1) {
@@ -156,18 +145,16 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
156
145
 
157
146
  var rules;
158
147
  var eDistrDiv = true;
159
- var redoInic = false;
160
- expr = simplify(expr, setRules.firstRules, {}, {
161
- exactFractions: false
162
- }); // Apply the initial rules, including succ div rules
148
+ var redoInic = false; // Apply the initial rules, including succ div rules:
163
149
 
150
+ expr = simplify(expr, setRules.firstRules, {}, noExactFractions);
164
151
  var s;
165
152
 
166
153
  while (true) {
167
- // Apply alternately successive division rules and distr.div.rules
154
+ // Alternate applying successive division rules and distr.div.rules
155
+ // until there are no more changes:
168
156
  rules = eDistrDiv ? setRules.distrDivRules : setRules.sucDivRules;
169
- expr = simplify(expr, rules); // until no more changes
170
-
157
+ expr = simplify(expr, rules, {}, withExactFractions);
171
158
  eDistrDiv = !eDistrDiv; // Swap between Distr.Div and Succ. Div. Rules
172
159
 
173
160
  s = expr.toString();
@@ -182,14 +169,11 @@ export var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref =
182
169
 
183
170
  if (redoInic) {
184
171
  // Apply first rules again without succ div rules (if there are changes)
185
- expr = simplify(expr, setRules.firstRulesAgain, {}, {
186
- exactFractions: false
187
- });
188
- }
172
+ expr = simplify(expr, setRules.firstRulesAgain, {}, noExactFractions);
173
+ } // Apply final rules:
174
+
189
175
 
190
- expr = simplify(expr, setRules.finalRules, {}, {
191
- exactFractions: false
192
- }); // Apply final rules
176
+ expr = simplify(expr, setRules.finalRules, {}, noExactFractions);
193
177
  } // NVars >= 1
194
178
 
195
179
 
@@ -0,0 +1,95 @@
1
+ import { createMap, isMap } from '../../utils/map.js';
2
+ import { isFunctionNode, isNode, isOperatorNode, isParenthesisNode, isSymbolNode } from '../../utils/is.js';
3
+ import { factory } from '../../utils/factory.js';
4
+ var name = 'resolve';
5
+ var dependencies = ['parse', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode'];
6
+ export var createResolve = /* #__PURE__ */factory(name, dependencies, _ref => {
7
+ var {
8
+ parse,
9
+ ConstantNode,
10
+ FunctionNode,
11
+ OperatorNode,
12
+ ParenthesisNode
13
+ } = _ref;
14
+
15
+ /**
16
+ * resolve(expr, scope) replaces variable nodes with their scoped values
17
+ *
18
+ * Syntax:
19
+ *
20
+ * resolve(expr, scope)
21
+ *
22
+ * Examples:
23
+ *
24
+ * math.resolve('x + y', {x:1, y:2}) // Node {1 + 2}
25
+ * math.resolve(math.parse('x+y'), {x:1, y:2}) // Node {1 + 2}
26
+ * math.simplify('x+y', {x:2, y:'x+x'}).toString() // "6"
27
+ *
28
+ * See also:
29
+ *
30
+ * simplify, evaluate
31
+ *
32
+ * @param {Node} node
33
+ * The expression tree to be simplified
34
+ * @param {Object} scope
35
+ * Scope specifying variables to be resolved
36
+ * @return {Node} Returns `node` with variables recursively substituted.
37
+ * @throws {ReferenceError}
38
+ * If there is a cyclic dependency among the variables in `scope`,
39
+ * resolution is impossible and a ReferenceError is thrown.
40
+ */
41
+ function resolve(node, scope) {
42
+ var within = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Set();
43
+
44
+ // note `within`:
45
+ // `within` is not documented, since it is for internal cycle
46
+ // detection only
47
+ if (!scope) {
48
+ return node;
49
+ }
50
+
51
+ if (!isMap(scope)) {
52
+ scope = createMap(scope);
53
+ }
54
+
55
+ if (isSymbolNode(node)) {
56
+ if (within.has(node.name)) {
57
+ var variables = Array.from(within).join(', ');
58
+ throw new ReferenceError("recursive loop of variable definitions among {".concat(variables, "}"));
59
+ }
60
+
61
+ var value = scope.get(node.name);
62
+
63
+ if (isNode(value)) {
64
+ var nextWithin = new Set(within);
65
+ nextWithin.add(node.name);
66
+ return resolve(value, scope, nextWithin);
67
+ } else if (typeof value === 'number') {
68
+ return parse(String(value));
69
+ } else if (value !== undefined) {
70
+ return new ConstantNode(value);
71
+ } else {
72
+ return node;
73
+ }
74
+ } else if (isOperatorNode(node)) {
75
+ var args = node.args.map(function (arg) {
76
+ return resolve(arg, scope, within);
77
+ });
78
+ return new OperatorNode(node.op, node.fn, args, node.implicit);
79
+ } else if (isParenthesisNode(node)) {
80
+ return new ParenthesisNode(resolve(node.content, scope, within));
81
+ } else if (isFunctionNode(node)) {
82
+ var _args = node.args.map(function (arg) {
83
+ return resolve(arg, scope, within);
84
+ });
85
+
86
+ return new FunctionNode(node.name, _args);
87
+ } // Otherwise just recursively resolve any children (might also work
88
+ // for some of the above special cases)
89
+
90
+
91
+ return node.map(child => resolve(child, scope, within));
92
+ }
93
+
94
+ return resolve;
95
+ });
@@ -386,11 +386,11 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
386
386
  } else {
387
387
  res = makeNode(_args);
388
388
  }
389
- } else if (isAssociative(node)) {
390
- _args = allChildren(node);
389
+ } else if (isAssociative(node, options.context)) {
390
+ _args = allChildren(node, options.context);
391
391
  _args = _args.map(arg => foldFraction(arg, options));
392
392
 
393
- if (isCommutative(fn)) {
393
+ if (isCommutative(fn, options.context)) {
394
394
  // commutative binary operator
395
395
  var consts = [];
396
396
  var vars = [];