mathjs 10.0.2 → 10.2.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 (337) hide show
  1. package/HISTORY.md +37 -0
  2. package/NOTICE +1 -1
  3. package/README.md +10 -2
  4. package/bin/cli.js +1 -1
  5. package/docs/expressions/algebra.md +27 -0
  6. package/docs/expressions/syntax.md +1 -1
  7. package/docs/reference/functions/abs.md +6 -0
  8. package/docs/reference/functions/acos.md +6 -0
  9. package/docs/reference/functions/acosh.md +6 -0
  10. package/docs/reference/functions/acot.md +6 -0
  11. package/docs/reference/functions/acoth.md +6 -0
  12. package/docs/reference/functions/acsc.md +6 -0
  13. package/docs/reference/functions/acsch.md +6 -0
  14. package/docs/reference/functions/add.md +6 -0
  15. package/docs/reference/functions/and.md +6 -0
  16. package/docs/reference/functions/apply.md +6 -0
  17. package/docs/reference/functions/arg.md +6 -0
  18. package/docs/reference/functions/asec.md +6 -0
  19. package/docs/reference/functions/asech.md +6 -0
  20. package/docs/reference/functions/asin.md +6 -0
  21. package/docs/reference/functions/asinh.md +6 -0
  22. package/docs/reference/functions/atan.md +6 -0
  23. package/docs/reference/functions/atan2.md +6 -0
  24. package/docs/reference/functions/atanh.md +6 -0
  25. package/docs/reference/functions/bellNumbers.md +6 -0
  26. package/docs/reference/functions/bin.md +6 -0
  27. package/docs/reference/functions/bitAnd.md +6 -0
  28. package/docs/reference/functions/bitNot.md +6 -0
  29. package/docs/reference/functions/bitOr.md +6 -0
  30. package/docs/reference/functions/bitXor.md +6 -0
  31. package/docs/reference/functions/catalan.md +6 -0
  32. package/docs/reference/functions/cbrt.md +6 -0
  33. package/docs/reference/functions/ceil.md +6 -0
  34. package/docs/reference/functions/clone.md +6 -0
  35. package/docs/reference/functions/column.md +6 -0
  36. package/docs/reference/functions/combinations.md +6 -0
  37. package/docs/reference/functions/combinationsWithRep.md +6 -0
  38. package/docs/reference/functions/compare.md +6 -0
  39. package/docs/reference/functions/compareNatural.md +6 -0
  40. package/docs/reference/functions/compareText.md +6 -0
  41. package/docs/reference/functions/compile.md +6 -0
  42. package/docs/reference/functions/composition.md +6 -0
  43. package/docs/reference/functions/concat.md +6 -0
  44. package/docs/reference/functions/conj.md +6 -0
  45. package/docs/reference/functions/cos.md +6 -0
  46. package/docs/reference/functions/cosh.md +6 -0
  47. package/docs/reference/functions/cot.md +6 -0
  48. package/docs/reference/functions/coth.md +6 -0
  49. package/docs/reference/functions/count.md +6 -0
  50. package/docs/reference/functions/cross.md +6 -0
  51. package/docs/reference/functions/csc.md +6 -0
  52. package/docs/reference/functions/csch.md +6 -0
  53. package/docs/reference/functions/ctranspose.md +6 -0
  54. package/docs/reference/functions/cube.md +6 -0
  55. package/docs/reference/functions/deepEqual.md +6 -0
  56. package/docs/reference/functions/derivative.md +6 -0
  57. package/docs/reference/functions/det.md +6 -0
  58. package/docs/reference/functions/diag.md +6 -0
  59. package/docs/reference/functions/diff.md +6 -0
  60. package/docs/reference/functions/distance.md +6 -0
  61. package/docs/reference/functions/divide.md +6 -0
  62. package/docs/reference/functions/dot.md +6 -0
  63. package/docs/reference/functions/dotDivide.md +6 -0
  64. package/docs/reference/functions/dotMultiply.md +6 -0
  65. package/docs/reference/functions/dotPow.md +6 -0
  66. package/docs/reference/functions/eigs.md +6 -0
  67. package/docs/reference/functions/equal.md +6 -0
  68. package/docs/reference/functions/equalText.md +6 -0
  69. package/docs/reference/functions/erf.md +6 -0
  70. package/docs/reference/functions/evaluate.md +6 -0
  71. package/docs/reference/functions/exp.md +6 -0
  72. package/docs/reference/functions/expm.md +6 -0
  73. package/docs/reference/functions/expm1.md +6 -0
  74. package/docs/reference/functions/factorial.md +6 -0
  75. package/docs/reference/functions/filter.md +6 -0
  76. package/docs/reference/functions/fix.md +6 -0
  77. package/docs/reference/functions/flatten.md +6 -0
  78. package/docs/reference/functions/floor.md +6 -0
  79. package/docs/reference/functions/forEach.md +6 -0
  80. package/docs/reference/functions/format.md +6 -0
  81. package/docs/reference/functions/gamma.md +6 -0
  82. package/docs/reference/functions/gcd.md +6 -0
  83. package/docs/reference/functions/getMatrixDataType.md +6 -0
  84. package/docs/reference/functions/hasNumericValue.md +6 -0
  85. package/docs/reference/functions/help.md +6 -0
  86. package/docs/reference/functions/hex.md +6 -0
  87. package/docs/reference/functions/hypot.md +6 -0
  88. package/docs/reference/functions/identity.md +6 -0
  89. package/docs/reference/functions/im.md +6 -0
  90. package/docs/reference/functions/intersect.md +6 -0
  91. package/docs/reference/functions/inv.md +6 -0
  92. package/docs/reference/functions/invmod.md +47 -0
  93. package/docs/reference/functions/isInteger.md +6 -0
  94. package/docs/reference/functions/isNaN.md +6 -0
  95. package/docs/reference/functions/isNegative.md +6 -0
  96. package/docs/reference/functions/isNumeric.md +6 -0
  97. package/docs/reference/functions/isPositive.md +6 -0
  98. package/docs/reference/functions/isPrime.md +6 -0
  99. package/docs/reference/functions/isZero.md +6 -0
  100. package/docs/reference/functions/kldivergence.md +6 -0
  101. package/docs/reference/functions/kron.md +6 -0
  102. package/docs/reference/functions/larger.md +6 -0
  103. package/docs/reference/functions/largerEq.md +6 -0
  104. package/docs/reference/functions/lcm.md +6 -0
  105. package/docs/reference/functions/leafCount.md +52 -0
  106. package/docs/reference/functions/leftShift.md +6 -0
  107. package/docs/reference/functions/log.md +6 -0
  108. package/docs/reference/functions/log10.md +6 -0
  109. package/docs/reference/functions/log1p.md +6 -0
  110. package/docs/reference/functions/log2.md +6 -0
  111. package/docs/reference/functions/lsolve.md +6 -0
  112. package/docs/reference/functions/lsolveAll.md +6 -0
  113. package/docs/reference/functions/lup.md +6 -0
  114. package/docs/reference/functions/lusolve.md +6 -0
  115. package/docs/reference/functions/mad.md +6 -0
  116. package/docs/reference/functions/map.md +6 -0
  117. package/docs/reference/functions/matrixFromColumns.md +6 -0
  118. package/docs/reference/functions/matrixFromFunction.md +6 -0
  119. package/docs/reference/functions/matrixFromRows.md +6 -0
  120. package/docs/reference/functions/max.md +6 -0
  121. package/docs/reference/functions/mean.md +6 -0
  122. package/docs/reference/functions/median.md +6 -0
  123. package/docs/reference/functions/min.md +6 -0
  124. package/docs/reference/functions/mod.md +6 -0
  125. package/docs/reference/functions/mode.md +6 -0
  126. package/docs/reference/functions/multinomial.md +6 -0
  127. package/docs/reference/functions/multiply.md +6 -0
  128. package/docs/reference/functions/norm.md +6 -0
  129. package/docs/reference/functions/not.md +6 -0
  130. package/docs/reference/functions/nthRoot.md +6 -0
  131. package/docs/reference/functions/nthRoots.md +6 -0
  132. package/docs/reference/functions/numeric.md +6 -0
  133. package/docs/reference/functions/oct.md +6 -0
  134. package/docs/reference/functions/ones.md +6 -0
  135. package/docs/reference/functions/or.md +6 -0
  136. package/docs/reference/functions/parser.md +6 -0
  137. package/docs/reference/functions/partitionSelect.md +6 -0
  138. package/docs/reference/functions/permutations.md +6 -0
  139. package/docs/reference/functions/pickRandom.md +6 -0
  140. package/docs/reference/functions/pow.md +6 -0
  141. package/docs/reference/functions/print.md +6 -0
  142. package/docs/reference/functions/prod.md +6 -0
  143. package/docs/reference/functions/qr.md +6 -0
  144. package/docs/reference/functions/quantileSeq.md +6 -0
  145. package/docs/reference/functions/random.md +6 -0
  146. package/docs/reference/functions/randomInt.md +6 -0
  147. package/docs/reference/functions/range.md +6 -0
  148. package/docs/reference/functions/rationalize.md +7 -1
  149. package/docs/reference/functions/re.md +6 -0
  150. package/docs/reference/functions/reshape.md +7 -0
  151. package/docs/reference/functions/resize.md +6 -0
  152. package/docs/reference/functions/resolve.md +46 -0
  153. package/docs/reference/functions/rightArithShift.md +6 -0
  154. package/docs/reference/functions/rightLogShift.md +6 -0
  155. package/docs/reference/functions/rotate.md +6 -0
  156. package/docs/reference/functions/rotationMatrix.md +6 -0
  157. package/docs/reference/functions/round.md +6 -0
  158. package/docs/reference/functions/row.md +6 -0
  159. package/docs/reference/functions/sec.md +6 -0
  160. package/docs/reference/functions/sech.md +6 -0
  161. package/docs/reference/functions/setCartesian.md +6 -0
  162. package/docs/reference/functions/setDifference.md +6 -0
  163. package/docs/reference/functions/setDistinct.md +6 -0
  164. package/docs/reference/functions/setIntersect.md +6 -0
  165. package/docs/reference/functions/setIsSubset.md +6 -0
  166. package/docs/reference/functions/setMultiplicity.md +6 -0
  167. package/docs/reference/functions/setPowerset.md +6 -0
  168. package/docs/reference/functions/setSize.md +6 -0
  169. package/docs/reference/functions/setSymDifference.md +6 -0
  170. package/docs/reference/functions/setUnion.md +6 -0
  171. package/docs/reference/functions/sign.md +6 -0
  172. package/docs/reference/functions/simplify.md +47 -7
  173. package/docs/reference/functions/simplifyCore.md +50 -0
  174. package/docs/reference/functions/sin.md +6 -0
  175. package/docs/reference/functions/sinh.md +6 -0
  176. package/docs/reference/functions/size.md +6 -0
  177. package/docs/reference/functions/slu.md +6 -0
  178. package/docs/reference/functions/smaller.md +6 -0
  179. package/docs/reference/functions/smallerEq.md +6 -0
  180. package/docs/reference/functions/sort.md +6 -0
  181. package/docs/reference/functions/sqrt.md +6 -0
  182. package/docs/reference/functions/sqrtm.md +6 -0
  183. package/docs/reference/functions/square.md +6 -0
  184. package/docs/reference/functions/squeeze.md +6 -0
  185. package/docs/reference/functions/std.md +6 -0
  186. package/docs/reference/functions/stirlingS2.md +6 -0
  187. package/docs/reference/functions/subset.md +6 -0
  188. package/docs/reference/functions/subtract.md +6 -0
  189. package/docs/reference/functions/sum.md +6 -0
  190. package/docs/reference/functions/tan.md +6 -0
  191. package/docs/reference/functions/tanh.md +6 -0
  192. package/docs/reference/functions/to.md +6 -0
  193. package/docs/reference/functions/trace.md +6 -0
  194. package/docs/reference/functions/transpose.md +6 -0
  195. package/docs/reference/functions/typeOf.md +6 -0
  196. package/docs/reference/functions/unaryMinus.md +6 -0
  197. package/docs/reference/functions/unaryPlus.md +6 -0
  198. package/docs/reference/functions/unequal.md +6 -0
  199. package/docs/reference/functions/usolve.md +6 -0
  200. package/docs/reference/functions/usolveAll.md +6 -0
  201. package/docs/reference/functions/variance.md +6 -0
  202. package/docs/reference/functions/xgcd.md +6 -0
  203. package/docs/reference/functions/xor.md +6 -0
  204. package/docs/reference/functions/zeros.md +6 -0
  205. package/docs/reference/functions.md +4 -0
  206. package/lib/browser/math.js +7 -7
  207. package/lib/browser/math.js.map +1 -1
  208. package/lib/cjs/core/create.js +4 -4
  209. package/lib/cjs/core/function/import.js +3 -3
  210. package/lib/cjs/core/function/typed.js +2 -2
  211. package/lib/cjs/defaultInstance.js +3 -3
  212. package/lib/cjs/entry/allFactoriesAny.js +1 -1
  213. package/lib/cjs/entry/allFactoriesNumber.js +1 -1
  214. package/lib/cjs/entry/configReadonly.js +1 -1
  215. package/lib/cjs/entry/dependenciesAny/dependenciesInvmod.generated.js +41 -0
  216. package/lib/cjs/entry/dependenciesAny/dependenciesLeafCount.generated.js +23 -0
  217. package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +18 -0
  218. package/lib/cjs/entry/dependenciesAny/dependenciesResolve.generated.js +32 -0
  219. package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +21 -0
  220. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +65 -0
  221. package/lib/cjs/entry/dependenciesAny.generated.js +32 -0
  222. package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +18 -0
  223. package/lib/cjs/entry/dependenciesNumber/dependenciesResolve.generated.js +32 -0
  224. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +21 -0
  225. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +65 -0
  226. package/lib/cjs/entry/dependenciesNumber.generated.js +16 -0
  227. package/lib/cjs/entry/impureFunctionsAny.generated.js +78 -29
  228. package/lib/cjs/entry/impureFunctionsNumber.generated.js +102 -60
  229. package/lib/cjs/entry/pureFunctionsAny.generated.js +65 -55
  230. package/lib/cjs/entry/pureFunctionsNumber.generated.js +46 -48
  231. package/lib/cjs/expression/Help.js +4 -0
  232. package/lib/cjs/expression/Parser.js +1 -1
  233. package/lib/cjs/expression/embeddedDocs/core/typed.js +1 -1
  234. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +20 -6
  235. package/lib/cjs/expression/embeddedDocs/function/algebra/leafCount.js +15 -0
  236. package/lib/cjs/expression/embeddedDocs/function/algebra/resolve.js +16 -0
  237. package/lib/cjs/expression/embeddedDocs/function/algebra/simplify.js +1 -1
  238. package/lib/cjs/expression/embeddedDocs/function/algebra/simplifyCore.js +15 -0
  239. package/lib/cjs/expression/embeddedDocs/function/arithmetic/invmod.js +15 -0
  240. package/lib/cjs/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  241. package/lib/cjs/expression/node/FunctionNode.js +7 -7
  242. package/lib/cjs/expression/node/IndexNode.js +1 -1
  243. package/lib/cjs/expression/node/Node.js +3 -3
  244. package/lib/cjs/expression/node/ObjectNode.js +1 -1
  245. package/lib/cjs/expression/node/utils/access.js +1 -1
  246. package/lib/cjs/expression/node/utils/assign.js +1 -1
  247. package/lib/cjs/expression/parse.js +13 -13
  248. package/lib/cjs/factoriesAny.js +32 -0
  249. package/lib/cjs/factoriesNumber.js +16 -0
  250. package/lib/cjs/function/algebra/decomposition/qr.js +1 -1
  251. package/lib/cjs/function/algebra/leafCount.js +66 -0
  252. package/lib/cjs/function/algebra/rationalize.js +36 -39
  253. package/lib/cjs/function/algebra/resolve.js +106 -0
  254. package/lib/cjs/function/algebra/simplify/simplifyConstant.js +226 -32
  255. package/lib/cjs/function/algebra/simplify/util.js +171 -33
  256. package/lib/cjs/function/algebra/simplify.js +608 -191
  257. package/lib/cjs/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +83 -31
  258. package/lib/cjs/function/algebra/solver/lsolveAll.js +2 -2
  259. package/lib/cjs/function/algebra/solver/usolveAll.js +2 -2
  260. package/lib/cjs/function/arithmetic/ceil.js +3 -3
  261. package/lib/cjs/function/arithmetic/floor.js +3 -3
  262. package/lib/cjs/function/arithmetic/invmod.js +73 -0
  263. package/lib/cjs/function/arithmetic/norm.js +1 -1
  264. package/lib/cjs/function/arithmetic/round.js +1 -1
  265. package/lib/cjs/function/matrix/eigs/complexEigs.js +5 -5
  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/probability/util/seededRNG.js +2 -2
  269. package/lib/cjs/function/relational/compareNatural.js +6 -6
  270. package/lib/cjs/header.js +3 -3
  271. package/lib/cjs/plain/bignumber/index.js +1 -1
  272. package/lib/cjs/plain/number/combinations.js +18 -6
  273. package/lib/cjs/type/bignumber/BigNumber.js +2 -2
  274. package/lib/cjs/type/bignumber/function/bignumber.js +1 -1
  275. package/lib/cjs/type/boolean.js +2 -2
  276. package/lib/cjs/type/complex/Complex.js +14 -14
  277. package/lib/cjs/type/complex/function/complex.js +1 -1
  278. package/lib/cjs/type/fraction/Fraction.js +6 -6
  279. package/lib/cjs/type/fraction/function/fraction.js +1 -1
  280. package/lib/cjs/type/matrix/DenseMatrix.js +5 -5
  281. package/lib/cjs/type/matrix/SparseMatrix.js +2 -2
  282. package/lib/cjs/type/number.js +1 -1
  283. package/lib/cjs/type/string.js +2 -2
  284. package/lib/cjs/type/unit/Unit.js +8 -8
  285. package/lib/cjs/utils/customs.js +2 -2
  286. package/lib/cjs/utils/emitter.js +1 -1
  287. package/lib/cjs/utils/function.js +2 -2
  288. package/lib/cjs/utils/is.js +6 -6
  289. package/lib/cjs/utils/latex.js +3 -3
  290. package/lib/cjs/utils/lruQueue.js +1 -1
  291. package/lib/cjs/utils/map.js +3 -3
  292. package/lib/cjs/utils/object.js +2 -2
  293. package/lib/cjs/utils/snapshot.js +7 -7
  294. package/lib/cjs/utils/string.js +2 -2
  295. package/lib/cjs/version.js +1 -1
  296. package/lib/esm/entry/dependenciesAny/dependenciesInvmod.generated.js +24 -0
  297. package/lib/esm/entry/dependenciesAny/dependenciesLeafCount.generated.js +12 -0
  298. package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +12 -0
  299. package/lib/esm/entry/dependenciesAny/dependenciesResolve.generated.js +18 -0
  300. package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +14 -0
  301. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyCore.generated.js +40 -0
  302. package/lib/esm/entry/dependenciesAny.generated.js +4 -0
  303. package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +12 -0
  304. package/lib/esm/entry/dependenciesNumber/dependenciesResolve.generated.js +18 -0
  305. package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +14 -0
  306. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyCore.generated.js +40 -0
  307. package/lib/esm/entry/dependenciesNumber.generated.js +2 -0
  308. package/lib/esm/entry/impureFunctionsAny.generated.js +68 -22
  309. package/lib/esm/entry/impureFunctionsNumber.generated.js +92 -52
  310. package/lib/esm/entry/pureFunctionsAny.generated.js +53 -42
  311. package/lib/esm/entry/pureFunctionsNumber.generated.js +32 -32
  312. package/lib/esm/expression/Help.js +4 -0
  313. package/lib/esm/expression/embeddedDocs/core/typed.js +1 -1
  314. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +10 -1
  315. package/lib/esm/expression/embeddedDocs/function/algebra/leafCount.js +8 -0
  316. package/lib/esm/expression/embeddedDocs/function/algebra/resolve.js +9 -0
  317. package/lib/esm/expression/embeddedDocs/function/algebra/simplify.js +1 -1
  318. package/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js +8 -0
  319. package/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js +8 -0
  320. package/lib/esm/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  321. package/lib/esm/factoriesAny.js +4 -0
  322. package/lib/esm/factoriesNumber.js +2 -0
  323. package/lib/esm/function/algebra/leafCount.js +59 -0
  324. package/lib/esm/function/algebra/rationalize.js +36 -38
  325. package/lib/esm/function/algebra/resolve.js +95 -0
  326. package/lib/esm/function/algebra/simplify/simplifyConstant.js +200 -32
  327. package/lib/esm/function/algebra/simplify/util.js +170 -34
  328. package/lib/esm/function/algebra/simplify.js +603 -186
  329. package/lib/esm/function/algebra/{simplify/simplifyCore.js → simplifyCore.js} +75 -31
  330. package/lib/esm/function/arithmetic/invmod.js +57 -0
  331. package/lib/esm/header.js +1 -1
  332. package/lib/esm/plain/number/combinations.js +18 -6
  333. package/lib/esm/version.js +1 -1
  334. package/package.json +21 -15
  335. package/types/index.d.ts +48 -6
  336. package/lib/cjs/function/algebra/simplify/resolve.js +0 -76
  337. package/lib/esm/function/algebra/simplify/resolve.js +0 -67
@@ -1,20 +1,25 @@
1
1
  // TODO this could be improved by simplifying seperated constants under associative and commutative operators
2
- import { isFraction, isNode, isOperatorNode } from '../../../utils/is.js';
2
+ import { isFraction, isMatrix, isNode, isArrayNode, isConstantNode, isIndexNode, isObjectNode, isOperatorNode } from '../../../utils/is.js';
3
3
  import { factory } from '../../../utils/factory.js';
4
4
  import { createUtil } from './util.js';
5
5
  import { noBignumber, noFraction } from '../../../utils/noop.js';
6
6
  var name = 'simplifyConstant';
7
- var dependencies = ['typed', 'config', 'mathWithTransform', '?fraction', '?bignumber', 'ConstantNode', 'OperatorNode', 'FunctionNode', 'SymbolNode'];
7
+ var dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
8
8
  export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _ref => {
9
9
  var {
10
10
  typed,
11
11
  config,
12
12
  mathWithTransform,
13
+ matrix,
13
14
  fraction,
14
15
  bignumber,
16
+ AccessorNode,
17
+ ArrayNode,
15
18
  ConstantNode,
16
- OperatorNode,
17
19
  FunctionNode,
20
+ IndexNode,
21
+ ObjectNode,
22
+ OperatorNode,
18
23
  SymbolNode
19
24
  } = _ref;
20
25
  var {
@@ -29,22 +34,31 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
29
34
  });
30
35
 
31
36
  function simplifyConstant(expr, options) {
32
- var res = foldFraction(expr, options);
33
- return isNode(res) ? res : _toNode(res);
37
+ return _ensureNode(foldFraction(expr, options));
38
+ }
39
+
40
+ function _removeFractions(thing) {
41
+ if (isFraction(thing)) {
42
+ return thing.valueOf();
43
+ }
44
+
45
+ if (thing instanceof Array) {
46
+ return thing.map(_removeFractions);
47
+ }
48
+
49
+ if (isMatrix(thing)) {
50
+ return matrix(_removeFractions(thing.valueOf()));
51
+ }
52
+
53
+ return thing;
34
54
  }
35
55
 
36
56
  function _eval(fnname, args, options) {
37
57
  try {
38
- return _toNumber(mathWithTransform[fnname].apply(null, args), options);
58
+ return mathWithTransform[fnname].apply(null, args);
39
59
  } catch (ignore) {
40
60
  // sometimes the implicit type conversion causes the evaluation to fail, so we'll try again after removing Fractions
41
- args = args.map(function (x) {
42
- if (isFraction(x)) {
43
- return x.valueOf();
44
- }
45
-
46
- return x;
47
- });
61
+ args = args.map(_removeFractions);
48
62
  return _toNumber(mathWithTransform[fnname].apply(null, args), options);
49
63
  }
50
64
  }
@@ -67,8 +81,22 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
67
81
  },
68
82
  Complex: function Complex(s) {
69
83
  throw new Error('Cannot convert Complex number to Node');
84
+ },
85
+ string: function string(s) {
86
+ return new ConstantNode(s);
87
+ },
88
+ Matrix: function Matrix(m) {
89
+ return new ArrayNode(m.valueOf().map(e => _toNode(e)));
90
+ }
91
+ });
92
+
93
+ function _ensureNode(thing) {
94
+ if (isNode(thing)) {
95
+ return thing;
70
96
  }
71
- }); // convert a number to a fraction only if it can be expressed exactly,
97
+
98
+ return _toNode(thing);
99
+ } // convert a number to a fraction only if it can be expressed exactly,
72
100
  // and when both numerator and denominator are small enough
73
101
 
74
102
 
@@ -125,6 +153,12 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
125
153
  }
126
154
 
127
155
  return _exactFraction(s.re, options);
156
+ },
157
+ 'Matrix, Object': function MatrixObject(s, options) {
158
+ return matrix(_exactFraction(s.valueOf()));
159
+ },
160
+ 'Array, Object': function ArrayObject(s, options) {
161
+ return s.map(_exactFraction);
128
162
  }
129
163
  });
130
164
 
@@ -148,6 +182,103 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
148
182
 
149
183
  return new OperatorNode('/', 'divide', [n, new ConstantNode(f.d)]);
150
184
  }
185
+ /* Handles constant indexing of ArrayNodes, matrices, and ObjectNodes */
186
+
187
+
188
+ function _foldAccessor(obj, index, options) {
189
+ if (!isIndexNode(index)) {
190
+ // don't know what to do with that...
191
+ return new AccessorNode(_ensureNode(obj), _ensureNode(index));
192
+ }
193
+
194
+ if (isArrayNode(obj) || isMatrix(obj)) {
195
+ var remainingDims = Array.from(index.dimensions);
196
+ /* We will resolve constant indices one at a time, looking
197
+ * just in the first or second dimensions because (a) arrays
198
+ * of more than two dimensions are likely rare, and (b) pulling
199
+ * out the third or higher dimension would be pretty intricate.
200
+ * The price is that we miss simplifying [..3d array][x,y,1]
201
+ */
202
+
203
+ while (remainingDims.length > 0) {
204
+ if (isConstantNode(remainingDims[0]) && typeof remainingDims[0].value !== 'string') {
205
+ var first = _toNumber(remainingDims.shift().value, options);
206
+
207
+ if (isArrayNode(obj)) {
208
+ obj = obj.items[first - 1];
209
+ } else {
210
+ // matrix
211
+ obj = obj.valueOf()[first - 1];
212
+
213
+ if (obj instanceof Array) {
214
+ obj = matrix(obj);
215
+ }
216
+ }
217
+ } else if (remainingDims.length > 1 && isConstantNode(remainingDims[1]) && typeof remainingDims[1].value !== 'string') {
218
+ var second = _toNumber(remainingDims[1].value, options);
219
+
220
+ var tryItems = [];
221
+ var fromItems = isArrayNode(obj) ? obj.items : obj.valueOf();
222
+
223
+ for (var item of fromItems) {
224
+ if (isArrayNode(item)) {
225
+ tryItems.push(item.items[second - 1]);
226
+ } else if (isMatrix(obj)) {
227
+ tryItems.push(item[second - 1]);
228
+ } else {
229
+ break;
230
+ }
231
+ }
232
+
233
+ if (tryItems.length === fromItems.length) {
234
+ if (isArrayNode(obj)) {
235
+ obj = new ArrayNode(tryItems);
236
+ } else {
237
+ // matrix
238
+ obj = matrix(tryItems);
239
+ }
240
+
241
+ remainingDims.splice(1, 1);
242
+ } else {
243
+ // extracting slice along 2nd dimension failed, give up
244
+ break;
245
+ }
246
+ } else {
247
+ // neither 1st or 2nd dimension is constant, give up
248
+ break;
249
+ }
250
+ }
251
+
252
+ if (remainingDims.length === index.dimensions.length) {
253
+ /* No successful constant indexing */
254
+ return new AccessorNode(_ensureNode(obj), index);
255
+ }
256
+
257
+ if (remainingDims.length > 0) {
258
+ /* Indexed some but not all dimensions */
259
+ index = new IndexNode(remainingDims);
260
+ return new AccessorNode(_ensureNode(obj), index);
261
+ }
262
+ /* All dimensions were constant, access completely resolved */
263
+
264
+
265
+ return obj;
266
+ }
267
+
268
+ if (isObjectNode(obj) && index.dimensions.length === 1 && isConstantNode(index.dimensions[0])) {
269
+ var key = index.dimensions[0].value;
270
+
271
+ if (key in obj.properties) {
272
+ return obj.properties[key];
273
+ }
274
+
275
+ return new ConstantNode(); // undefined
276
+ }
277
+ /* Don't know how to index this sort of obj, at least not with this index */
278
+
279
+
280
+ return new AccessorNode(_ensureNode(obj), index);
281
+ }
151
282
  /*
152
283
  * Create a binary tree from a list of Fractions and Nodes.
153
284
  * Tries to fold Fractions by evaluating them until the first Node in the list is hit, so
@@ -186,8 +317,15 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
186
317
  return node;
187
318
 
188
319
  case 'ConstantNode':
189
- if (typeof node.value === 'number' || !isNaN(node.value)) {
190
- return _toNumber(node.value, options);
320
+ switch (typeof node.value) {
321
+ case 'number':
322
+ return _toNumber(node.value, options);
323
+
324
+ case 'string':
325
+ return node.value;
326
+
327
+ default:
328
+ if (!isNaN(node.value)) return _toNumber(node.value, options);
191
329
  }
192
330
 
193
331
  return node;
@@ -207,14 +345,24 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
207
345
  if (!args.some(isNode)) {
208
346
  try {
209
347
  return _eval(node.name, args, options);
210
- } catch (ignoreandcontine) {}
348
+ } catch (ignoreandcontinue) {}
349
+ } // Size of a matrix does not depend on entries
350
+
351
+
352
+ if (node.name === 'size' && args.length === 1 && isArrayNode(args[0])) {
353
+ var sz = [];
354
+ var section = args[0];
355
+
356
+ while (isArrayNode(section)) {
357
+ sz.push(section.items.length);
358
+ section = section.items[0];
359
+ }
360
+
361
+ return matrix(sz);
211
362
  } // Convert all args to nodes and construct a symbolic function call
212
363
 
213
364
 
214
- args = args.map(function (arg) {
215
- return isNode(arg) ? arg : _toNode(arg);
216
- });
217
- return new FunctionNode(node.name, args);
365
+ return new FunctionNode(node.name, args.map(_ensureNode));
218
366
  } else {// treat as operator
219
367
  }
220
368
  }
@@ -238,11 +386,11 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
238
386
  } else {
239
387
  res = makeNode(_args);
240
388
  }
241
- } else if (isAssociative(node)) {
242
- _args = allChildren(node);
389
+ } else if (isAssociative(node, options.context)) {
390
+ _args = allChildren(node, options.context);
243
391
  _args = _args.map(arg => foldFraction(arg, options));
244
392
 
245
- if (isCommutative(fn)) {
393
+ if (isCommutative(fn, options.context)) {
246
394
  // commutative binary operator
247
395
  var consts = [];
248
396
  var vars = [];
@@ -281,10 +429,36 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
281
429
  return foldFraction(node.content, options);
282
430
 
283
431
  case 'AccessorNode':
284
- /* falls through */
432
+ return _foldAccessor(foldFraction(node.object, options), foldFraction(node.index, options), options);
285
433
 
286
434
  case 'ArrayNode':
287
- /* falls through */
435
+ {
436
+ var foldItems = node.items.map(item => foldFraction(item, options));
437
+
438
+ if (foldItems.some(isNode)) {
439
+ return new ArrayNode(foldItems.map(_ensureNode));
440
+ }
441
+ /* All literals -- return a Matrix so we can operate on it */
442
+
443
+
444
+ return matrix(foldItems);
445
+ }
446
+
447
+ case 'IndexNode':
448
+ {
449
+ return new IndexNode(node.dimensions.map(n => simplifyConstant(n, options)));
450
+ }
451
+
452
+ case 'ObjectNode':
453
+ {
454
+ var foldProps = {};
455
+
456
+ for (var prop in node.properties) {
457
+ foldProps[prop] = simplifyConstant(node.properties[prop], options);
458
+ }
459
+
460
+ return new ObjectNode(foldProps);
461
+ }
288
462
 
289
463
  case 'AssignmentNode':
290
464
  /* falls through */
@@ -295,12 +469,6 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
295
469
  case 'FunctionAssignmentNode':
296
470
  /* falls through */
297
471
 
298
- case 'IndexNode':
299
- /* falls through */
300
-
301
- case 'ObjectNode':
302
- /* falls through */
303
-
304
472
  case 'RangeNode':
305
473
  /* falls through */
306
474
 
@@ -1,4 +1,10 @@
1
- import { isOperatorNode } from '../../../utils/is.js';
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
+
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
+
7
+ import { isFunctionNode, isOperatorNode, isParenthesisNode } from '../../../utils/is.js';
2
8
  import { factory } from '../../../utils/factory.js';
3
9
  import { hasOwnProperty } from '../../../utils/object.js';
4
10
  var name = 'simplifyUtil';
@@ -13,41 +19,166 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
13
19
  // e.g. multiply is not commutative for matrices
14
20
  // The properties should be calculated from an argument to simplify, or possibly something in math.config
15
21
  // the other option is for typed() to specify a return type so that we can evaluate the type of arguments
16
- var commutative = {
17
- add: true,
18
- multiply: true
22
+
23
+ /* So that properties of an operator fit on one line: */
24
+ var T = true;
25
+ var F = false;
26
+ var defaultName = 'defaultF';
27
+ var defaultContext = {
28
+ /* */
29
+ add: {
30
+ trivial: T,
31
+ total: T,
32
+ commutative: T,
33
+ associative: T
34
+ },
35
+
36
+ /**/
37
+ unaryPlus: {
38
+ trivial: T,
39
+ total: T,
40
+ commutative: T,
41
+ associative: T
42
+ },
43
+
44
+ /* */
45
+ subtract: {
46
+ trivial: F,
47
+ total: T,
48
+ commutative: F,
49
+ associative: F
50
+ },
51
+
52
+ /* */
53
+ multiply: {
54
+ trivial: T,
55
+ total: T,
56
+ commutative: T,
57
+ associative: T
58
+ },
59
+
60
+ /* */
61
+ divide: {
62
+ trivial: F,
63
+ total: T,
64
+ commutative: F,
65
+ associative: F
66
+ },
67
+
68
+ /* */
69
+ paren: {
70
+ trivial: T,
71
+ total: T,
72
+ commutative: T,
73
+ associative: F
74
+ },
75
+
76
+ /* */
77
+ defaultF: {
78
+ trivial: F,
79
+ total: T,
80
+ commutative: F,
81
+ associative: F
82
+ }
83
+ };
84
+ var realContext = {
85
+ divide: {
86
+ total: F
87
+ },
88
+ log: {
89
+ total: F
90
+ }
19
91
  };
20
- var associative = {
21
- add: true,
22
- multiply: true
92
+ var positiveContext = {
93
+ subtract: {
94
+ total: F
95
+ },
96
+ abs: {
97
+ trivial: T
98
+ },
99
+ log: {
100
+ total: T
101
+ }
23
102
  };
24
103
 
25
- function isCommutative(node, context) {
26
- if (!isOperatorNode(node)) {
27
- return true;
104
+ function hasProperty(nodeOrName, property) {
105
+ var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultContext;
106
+ var name = defaultName;
107
+
108
+ if (typeof nodeOrName === 'string') {
109
+ name = nodeOrName;
110
+ } else if (isOperatorNode(nodeOrName)) {
111
+ name = nodeOrName.fn.toString();
112
+ } else if (isFunctionNode(nodeOrName)) {
113
+ name = nodeOrName.name;
114
+ } else if (isParenthesisNode(nodeOrName)) {
115
+ name = 'paren';
28
116
  }
29
117
 
30
- var name = node.fn.toString();
118
+ if (hasOwnProperty(context, name)) {
119
+ var properties = context[name];
31
120
 
32
- if (context && hasOwnProperty(context, name) && hasOwnProperty(context[name], 'commutative')) {
33
- return context[name].commutative;
121
+ if (hasOwnProperty(properties, property)) {
122
+ return properties[property];
123
+ }
124
+
125
+ if (hasOwnProperty(defaultContext, name)) {
126
+ return defaultContext[name][property];
127
+ }
34
128
  }
35
129
 
36
- return commutative[name] || false;
37
- }
130
+ if (hasOwnProperty(context, defaultName)) {
131
+ var _properties = context[defaultName];
132
+
133
+ if (hasOwnProperty(_properties, property)) {
134
+ return _properties[property];
135
+ }
136
+
137
+ return defaultContext[defaultName][property];
138
+ }
139
+ /* name not found in context and context has no global default */
140
+
141
+ /* So use default context. */
142
+
143
+
144
+ if (hasOwnProperty(defaultContext, name)) {
145
+ var _properties2 = defaultContext[name];
38
146
 
39
- function isAssociative(node, context) {
40
- if (!isOperatorNode(node)) {
41
- return false;
147
+ if (hasOwnProperty(_properties2, property)) {
148
+ return _properties2[property];
149
+ }
42
150
  }
43
151
 
44
- var name = node.fn.toString();
152
+ return defaultContext[defaultName][property];
153
+ }
154
+
155
+ function isCommutative(node) {
156
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultContext;
157
+ return hasProperty(node, 'commutative', context);
158
+ }
45
159
 
46
- if (context && hasOwnProperty(context, name) && hasOwnProperty(context[name], 'associative')) {
47
- return context[name].associative;
160
+ function isAssociative(node) {
161
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultContext;
162
+ return hasProperty(node, 'associative', context);
163
+ }
164
+ /**
165
+ * Merge the given contexts, with primary overriding secondary
166
+ * wherever they might conflict
167
+ */
168
+
169
+
170
+ function mergeContext(primary, secondary) {
171
+ var merged = _objectSpread({}, primary);
172
+
173
+ for (var prop in secondary) {
174
+ if (hasOwnProperty(primary, prop)) {
175
+ merged[prop] = _objectSpread(_objectSpread({}, secondary[prop]), primary[prop]);
176
+ } else {
177
+ merged[prop] = secondary[prop];
178
+ }
48
179
  }
49
180
 
50
- return associative[name] || false;
181
+ return merged;
51
182
  }
52
183
  /**
53
184
  * Flatten all associative operators in an expression tree.
@@ -55,15 +186,15 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
55
186
  */
56
187
 
57
188
 
58
- function flatten(node) {
189
+ function flatten(node, context) {
59
190
  if (!node.args || node.args.length === 0) {
60
191
  return node;
61
192
  }
62
193
 
63
- node.args = allChildren(node);
194
+ node.args = allChildren(node, context);
64
195
 
65
196
  for (var i = 0; i < node.args.length; i++) {
66
- flatten(node.args[i]);
197
+ flatten(node.args[i], context);
67
198
  }
68
199
  }
69
200
  /**
@@ -72,7 +203,7 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
72
203
  */
73
204
 
74
205
 
75
- function allChildren(node) {
206
+ function allChildren(node, context) {
76
207
  var op;
77
208
  var children = [];
78
209
 
@@ -88,7 +219,7 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
88
219
  }
89
220
  };
90
221
 
91
- if (isAssociative(node)) {
222
+ if (isAssociative(node, context)) {
92
223
  op = node.op;
93
224
  findChildren(node);
94
225
  return children;
@@ -101,7 +232,7 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
101
232
  */
102
233
 
103
234
 
104
- function unflattenr(node) {
235
+ function unflattenr(node, context) {
105
236
  if (!node.args || node.args.length === 0) {
106
237
  return;
107
238
  }
@@ -110,10 +241,10 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
110
241
  var l = node.args.length;
111
242
 
112
243
  for (var i = 0; i < l; i++) {
113
- unflattenr(node.args[i]);
244
+ unflattenr(node.args[i], context);
114
245
  }
115
246
 
116
- if (l > 2 && isAssociative(node)) {
247
+ if (l > 2 && isAssociative(node, context)) {
117
248
  var curnode = node.args.pop();
118
249
 
119
250
  while (node.args.length > 0) {
@@ -128,7 +259,7 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
128
259
  */
129
260
 
130
261
 
131
- function unflattenl(node) {
262
+ function unflattenl(node, context) {
132
263
  if (!node.args || node.args.length === 0) {
133
264
  return;
134
265
  }
@@ -137,10 +268,10 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
137
268
  var l = node.args.length;
138
269
 
139
270
  for (var i = 0; i < l; i++) {
140
- unflattenl(node.args[i]);
271
+ unflattenl(node.args[i], context);
141
272
  }
142
273
 
143
- if (l > 2 && isAssociative(node)) {
274
+ if (l > 2 && isAssociative(node, context)) {
144
275
  var curnode = node.args.shift();
145
276
 
146
277
  while (node.args.length > 0) {
@@ -170,11 +301,16 @@ export var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {
170
301
 
171
302
  return {
172
303
  createMakeNodeFunction,
304
+ hasProperty,
173
305
  isCommutative,
174
306
  isAssociative,
307
+ mergeContext,
175
308
  flatten,
176
309
  allChildren,
177
310
  unflattenr,
178
- unflattenl
311
+ unflattenl,
312
+ defaultContext,
313
+ realContext,
314
+ positiveContext
179
315
  };
180
316
  });