nerdamer 1.1.13 → 2.0.0-rc.1

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/LICENSE.md +184 -0
  2. package/README.md +293 -312
  3. package/dist/bundle.js +2 -0
  4. package/dist/bundle.js.LICENSE.txt +7 -0
  5. package/dist/parser.js +2 -0
  6. package/dist/parser.js.LICENSE.txt +7 -0
  7. package/docs-data/parser-functions.json +1960 -0
  8. package/index.d.ts +10 -426
  9. package/output/algebra/adapters.d.ts +33 -0
  10. package/output/algebra/adapters.js +109 -0
  11. package/output/algebra/algorithms/arith.d.ts +84 -0
  12. package/output/algebra/algorithms/arith.js +323 -0
  13. package/output/algebra/algorithms/factor.d.ts +3 -0
  14. package/output/algebra/algorithms/factor.js +5 -0
  15. package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
  16. package/output/algebra/algorithms/factorMultivariate.js +2393 -0
  17. package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
  18. package/output/algebra/algorithms/factorUnivariate.js +1072 -0
  19. package/output/algebra/algorithms/gcd.d.ts +22 -0
  20. package/output/algebra/algorithms/gcd.js +690 -0
  21. package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
  22. package/output/algebra/algorithms/groebnerBase.js +1166 -0
  23. package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
  24. package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
  25. package/output/algebra/algorithms/poly.d.ts +228 -0
  26. package/output/algebra/algorithms/poly.js +1299 -0
  27. package/output/algebra/algorithms/rational.d.ts +17 -0
  28. package/output/algebra/algorithms/rational.js +115 -0
  29. package/output/algebra/factor/factor.d.ts +62 -0
  30. package/output/algebra/factor/factor.js +158 -0
  31. package/output/algebra/gcd/gcd.d.ts +29 -0
  32. package/output/algebra/gcd/gcd.js +141 -0
  33. package/output/algebra/groebner.d.ts +21 -0
  34. package/output/algebra/groebner.js +42 -0
  35. package/output/algebra/partfrac.d.ts +19 -0
  36. package/output/algebra/partfrac.js +398 -0
  37. package/output/algebra/polynomialize.d.ts +20 -0
  38. package/output/algebra/polynomialize.js +24 -0
  39. package/output/algebra/simplify/complexsimp.d.ts +7 -0
  40. package/output/algebra/simplify/complexsimp.js +24 -0
  41. package/output/algebra/simplify/factorCommon.d.ts +13 -0
  42. package/output/algebra/simplify/factorCommon.js +136 -0
  43. package/output/algebra/simplify/funcsimp.d.ts +26 -0
  44. package/output/algebra/simplify/funcsimp.js +633 -0
  45. package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
  46. package/output/algebra/simplify/invtrigrewrite.js +96 -0
  47. package/output/algebra/simplify/ratsimp.d.ts +21 -0
  48. package/output/algebra/simplify/ratsimp.js +140 -0
  49. package/output/algebra/simplify/simplify.d.ts +25 -0
  50. package/output/algebra/simplify/simplify.js +228 -0
  51. package/output/algebra/simplify/trigreduce.d.ts +38 -0
  52. package/output/algebra/simplify/trigreduce.js +424 -0
  53. package/output/algebra/simplify/trigrewrite.d.ts +17 -0
  54. package/output/algebra/simplify/trigrewrite.js +156 -0
  55. package/output/algebra/simplify/trigsimp.d.ts +11 -0
  56. package/output/algebra/simplify/trigsimp.js +369 -0
  57. package/output/algebra/simplify/utils.d.ts +32 -0
  58. package/output/algebra/simplify/utils.js +56 -0
  59. package/output/algebra/utils.d.ts +32 -0
  60. package/output/algebra/utils.js +48 -0
  61. package/output/api/advanced.d.ts +7 -0
  62. package/output/api/advanced.js +18 -0
  63. package/output/api/algebra.d.ts +17 -0
  64. package/output/api/algebra.js +32 -0
  65. package/output/api/assumptions.d.ts +4 -0
  66. package/output/api/assumptions.js +11 -0
  67. package/output/api/calculus.d.ts +9 -0
  68. package/output/api/calculus.js +21 -0
  69. package/output/api/core.d.ts +17 -0
  70. package/output/api/core.js +41 -0
  71. package/output/api/debug.d.ts +16 -0
  72. package/output/api/debug.js +23 -0
  73. package/output/api/parser.d.ts +85 -0
  74. package/output/api/parser.js +16 -0
  75. package/output/api/solve.d.ts +10 -0
  76. package/output/api/solve.js +16 -0
  77. package/output/api/structures.d.ts +10 -0
  78. package/output/api/structures.js +22 -0
  79. package/output/calculus/derivative/diff.d.ts +30 -0
  80. package/output/calculus/derivative/diff.js +238 -0
  81. package/output/calculus/fresnel.d.ts +16 -0
  82. package/output/calculus/fresnel.js +39 -0
  83. package/output/calculus/integrate/byParts.d.ts +18 -0
  84. package/output/calculus/integrate/byParts.js +339 -0
  85. package/output/calculus/integrate/bySubstitution.d.ts +135 -0
  86. package/output/calculus/integrate/bySubstitution.js +411 -0
  87. package/output/calculus/integrate/integrate.d.ts +38 -0
  88. package/output/calculus/integrate/integrate.js +652 -0
  89. package/output/calculus/integrate/integrationTable.d.ts +2 -0
  90. package/output/calculus/integrate/integrationTable.js +914 -0
  91. package/output/calculus/integrate/utils.d.ts +28 -0
  92. package/output/calculus/integrate/utils.js +96 -0
  93. package/output/calculus/laplace/ilaplace.d.ts +31 -0
  94. package/output/calculus/laplace/ilaplace.js +192 -0
  95. package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
  96. package/output/calculus/laplace/ilaplaceTable.js +200 -0
  97. package/output/calculus/laplace/laplace.d.ts +22 -0
  98. package/output/calculus/laplace/laplace.js +109 -0
  99. package/output/calculus/laplace/laplaceTable.d.ts +2 -0
  100. package/output/calculus/laplace/laplaceTable.js +187 -0
  101. package/output/calculus/limit/limit.d.ts +35 -0
  102. package/output/calculus/limit/limit.js +1183 -0
  103. package/output/calculus/limit/limitsTable.d.ts +2 -0
  104. package/output/calculus/limit/limitsTable.js +7 -0
  105. package/output/core/Settings.d.ts +32 -0
  106. package/output/core/Settings.js +68 -0
  107. package/output/core/adapters.d.ts +18 -0
  108. package/output/core/adapters.js +40 -0
  109. package/output/core/classes/assumption/Assumption.d.ts +218 -0
  110. package/output/core/classes/assumption/Assumption.js +605 -0
  111. package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
  112. package/output/core/classes/assumption/assertiveFunctions.js +64 -0
  113. package/output/core/classes/assumption/assume.d.ts +90 -0
  114. package/output/core/classes/assumption/assume.js +145 -0
  115. package/output/core/classes/collection/Collection.d.ts +107 -0
  116. package/output/core/classes/collection/Collection.js +231 -0
  117. package/output/core/classes/complex/Complex.d.ts +99 -0
  118. package/output/core/classes/complex/Complex.js +135 -0
  119. package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
  120. package/output/core/classes/decimalSet/DecimalSet.js +453 -0
  121. package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
  122. package/output/core/classes/dictionary/Dictionary.js +213 -0
  123. package/output/core/classes/equation/Equation.d.ts +256 -0
  124. package/output/core/classes/equation/Equation.js +350 -0
  125. package/output/core/classes/expression/CoeffObject.d.ts +100 -0
  126. package/output/core/classes/expression/CoeffObject.js +198 -0
  127. package/output/core/classes/expression/Expression.d.ts +1674 -0
  128. package/output/core/classes/expression/Expression.js +2332 -0
  129. package/output/core/classes/expression/analysis.d.ts +25 -0
  130. package/output/core/classes/expression/analysis.js +218 -0
  131. package/output/core/classes/expression/collect.d.ts +9 -0
  132. package/output/core/classes/expression/collect.js +49 -0
  133. package/output/core/classes/expression/format.d.ts +45 -0
  134. package/output/core/classes/expression/format.js +217 -0
  135. package/output/core/classes/expression/products.d.ts +23 -0
  136. package/output/core/classes/expression/products.js +115 -0
  137. package/output/core/classes/expression/shortcuts.d.ts +35 -0
  138. package/output/core/classes/expression/shortcuts.js +129 -0
  139. package/output/core/classes/expression/traversal.d.ts +31 -0
  140. package/output/core/classes/expression/traversal.js +216 -0
  141. package/output/core/classes/expression/trig.d.ts +25 -0
  142. package/output/core/classes/expression/trig.js +40 -0
  143. package/output/core/classes/expression/utils.d.ts +52 -0
  144. package/output/core/classes/expression/utils.js +189 -0
  145. package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
  146. package/output/core/classes/lookupTable/LookupTable.js +55 -0
  147. package/output/core/classes/matrix/Matrix.d.ts +227 -0
  148. package/output/core/classes/matrix/Matrix.js +889 -0
  149. package/output/core/classes/matrix/Sylvester.d.ts +11 -0
  150. package/output/core/classes/matrix/Sylvester.js +54 -0
  151. package/output/core/classes/matrix/functions.d.ts +26 -0
  152. package/output/core/classes/matrix/functions.js +52 -0
  153. package/output/core/classes/matrix/utils.d.ts +9 -0
  154. package/output/core/classes/matrix/utils.js +22 -0
  155. package/output/core/classes/parser/Parser.d.ts +480 -0
  156. package/output/core/classes/parser/Parser.js +1812 -0
  157. package/output/core/classes/parser/Token.d.ts +58 -0
  158. package/output/core/classes/parser/Token.js +137 -0
  159. package/output/core/classes/parser/constants.d.ts +160 -0
  160. package/output/core/classes/parser/constants.js +227 -0
  161. package/output/core/classes/parser/helpers.d.ts +21 -0
  162. package/output/core/classes/parser/helpers.js +42 -0
  163. package/output/core/classes/parser/operations/add.d.ts +15 -0
  164. package/output/core/classes/parser/operations/add.js +238 -0
  165. package/output/core/classes/parser/operations/comma.d.ts +7 -0
  166. package/output/core/classes/parser/operations/comma.js +11 -0
  167. package/output/core/classes/parser/operations/compare.d.ts +21 -0
  168. package/output/core/classes/parser/operations/compare.js +461 -0
  169. package/output/core/classes/parser/operations/divide.d.ts +2 -0
  170. package/output/core/classes/parser/operations/divide.js +72 -0
  171. package/output/core/classes/parser/operations/functions.d.ts +46 -0
  172. package/output/core/classes/parser/operations/functions.js +430 -0
  173. package/output/core/classes/parser/operations/multiply.d.ts +11 -0
  174. package/output/core/classes/parser/operations/multiply.js +321 -0
  175. package/output/core/classes/parser/operations/power.d.ts +48 -0
  176. package/output/core/classes/parser/operations/power.js +673 -0
  177. package/output/core/classes/parser/operations/subtract.d.ts +3 -0
  178. package/output/core/classes/parser/operations/subtract.js +35 -0
  179. package/output/core/classes/parser/preprocess.d.ts +14 -0
  180. package/output/core/classes/parser/preprocess.js +259 -0
  181. package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
  182. package/output/core/classes/parser/scripting/controlFlow.js +355 -0
  183. package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
  184. package/output/core/classes/parser/scripting/evaluate.js +112 -0
  185. package/output/core/classes/parser/scripting/functions.d.ts +14 -0
  186. package/output/core/classes/parser/scripting/functions.js +59 -0
  187. package/output/core/classes/parser/scripting/scope.d.ts +35 -0
  188. package/output/core/classes/parser/scripting/scope.js +155 -0
  189. package/output/core/classes/parser/types.d.ts +125 -0
  190. package/output/core/classes/parser/types.js +2 -0
  191. package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
  192. package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
  193. package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
  194. package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
  195. package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
  196. package/output/core/classes/polynomial/Polynomial.js +1149 -0
  197. package/output/core/classes/polynomial/Term.d.ts +222 -0
  198. package/output/core/classes/polynomial/Term.js +430 -0
  199. package/output/core/classes/polynomial/functions.d.ts +69 -0
  200. package/output/core/classes/polynomial/functions.js +126 -0
  201. package/output/core/classes/polynomial/utils.d.ts +62 -0
  202. package/output/core/classes/polynomial/utils.js +206 -0
  203. package/output/core/classes/rational/Rational.d.ts +504 -0
  204. package/output/core/classes/rational/Rational.js +779 -0
  205. package/output/core/classes/seq/SEQ.d.ts +13 -0
  206. package/output/core/classes/seq/SEQ.js +137 -0
  207. package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
  208. package/output/core/classes/valuesSet/ValuesSet.js +381 -0
  209. package/output/core/classes/vector/Vector.d.ts +222 -0
  210. package/output/core/classes/vector/Vector.js +497 -0
  211. package/output/core/classes/vector/functions.d.ts +28 -0
  212. package/output/core/classes/vector/functions.js +47 -0
  213. package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
  214. package/output/core/common/classes/MathematicalAggregate.js +140 -0
  215. package/output/core/common/classes/Scope.d.ts +62 -0
  216. package/output/core/common/classes/Scope.js +122 -0
  217. package/output/core/common/classes/StructuredEntity.d.ts +55 -0
  218. package/output/core/common/classes/StructuredEntity.js +151 -0
  219. package/output/core/common/common.d.ts +63 -0
  220. package/output/core/common/common.js +279 -0
  221. package/output/core/common/functions/functions.d.ts +14 -0
  222. package/output/core/common/functions/functions.js +33 -0
  223. package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
  224. package/output/core/common/functions/structuredEntityUtils.js +40 -0
  225. package/output/core/converters/BaseConverter.d.ts +97 -0
  226. package/output/core/converters/BaseConverter.js +405 -0
  227. package/output/core/converters/Converter.d.ts +111 -0
  228. package/output/core/converters/Converter.js +802 -0
  229. package/output/core/converters/Pattern.d.ts +71 -0
  230. package/output/core/converters/Pattern.js +302 -0
  231. package/output/core/dispatch.d.ts +34 -0
  232. package/output/core/dispatch.js +304 -0
  233. package/output/core/errors.d.ts +531 -0
  234. package/output/core/errors.js +621 -0
  235. package/output/core/functions/bigint/bigint.d.ts +121 -0
  236. package/output/core/functions/bigint/bigint.js +392 -0
  237. package/output/core/functions/bigint/primeFactor.d.ts +49 -0
  238. package/output/core/functions/bigint/primeFactor.js +267 -0
  239. package/output/core/functions/bigint/primes.d.ts +1 -0
  240. package/output/core/functions/bigint/primes.js +11 -0
  241. package/output/core/functions/build/definitions.d.ts +12 -0
  242. package/output/core/functions/build/definitions.js +133 -0
  243. package/output/core/functions/build/index.d.ts +32 -0
  244. package/output/core/functions/build/index.js +136 -0
  245. package/output/core/functions/complex.d.ts +90 -0
  246. package/output/core/functions/complex.js +482 -0
  247. package/output/core/functions/decimal.d.ts +24 -0
  248. package/output/core/functions/decimal.js +664 -0
  249. package/output/core/functions/expand/expand.d.ts +42 -0
  250. package/output/core/functions/expand/expand.js +376 -0
  251. package/output/core/functions/fresnelNumeric.d.ts +12 -0
  252. package/output/core/functions/fresnelNumeric.js +123 -0
  253. package/output/core/functions/numeric.d.ts +140 -0
  254. package/output/core/functions/numeric.js +790 -0
  255. package/output/core/functions/rationalNormalization.d.ts +11 -0
  256. package/output/core/functions/rationalNormalization.js +117 -0
  257. package/output/core/functions/setFunction.d.ts +19 -0
  258. package/output/core/functions/setFunction.js +75 -0
  259. package/output/core/functions/string.d.ts +26 -0
  260. package/output/core/functions/string.js +101 -0
  261. package/output/core/functions/subst.d.ts +90 -0
  262. package/output/core/functions/subst.js +498 -0
  263. package/output/core/functions/utils.d.ts +24 -0
  264. package/output/core/functions/utils.js +51 -0
  265. package/output/core/types.d.ts +48 -0
  266. package/output/core/types.js +2 -0
  267. package/output/index.d.ts +339 -0
  268. package/output/index.js +715 -0
  269. package/output/math/defint/defintDecimal.d.ts +37 -0
  270. package/output/math/defint/defintDecimal.js +320 -0
  271. package/output/math/defint/defintNative.d.ts +57 -0
  272. package/output/math/defint/defintNative.js +292 -0
  273. package/output/math/geometry.d.ts +8 -0
  274. package/output/math/geometry.js +32 -0
  275. package/output/math/math.d.ts +655 -0
  276. package/output/math/math.js +1811 -0
  277. package/output/math/trig.d.ts +518 -0
  278. package/output/math/trig.js +1444 -0
  279. package/output/math/trunc.d.ts +19 -0
  280. package/output/math/trunc.js +36 -0
  281. package/output/math/utils.d.ts +60 -0
  282. package/output/math/utils.js +180 -0
  283. package/output/solve/classes/DecimalMatrix.d.ts +17 -0
  284. package/output/solve/classes/DecimalMatrix.js +86 -0
  285. package/output/solve/classes/FunctionSolver.d.ts +135 -0
  286. package/output/solve/classes/FunctionSolver.js +433 -0
  287. package/output/solve/classes/MultivariateSolver.d.ts +84 -0
  288. package/output/solve/classes/MultivariateSolver.js +240 -0
  289. package/output/solve/classes/PolynomialSolver.d.ts +85 -0
  290. package/output/solve/classes/PolynomialSolver.js +292 -0
  291. package/output/solve/classes/SolutionSet.d.ts +153 -0
  292. package/output/solve/classes/SolutionSet.js +357 -0
  293. package/output/solve/classes/Solver.d.ts +17 -0
  294. package/output/solve/classes/Solver.js +132 -0
  295. package/output/solve/classes/SymbolicSolver.d.ts +74 -0
  296. package/output/solve/classes/SymbolicSolver.js +601 -0
  297. package/output/solve/linsolve.d.ts +51 -0
  298. package/output/solve/linsolve.js +225 -0
  299. package/output/solve/solve.d.ts +34 -0
  300. package/output/solve/solve.js +260 -0
  301. package/output/solve/solveSystem.d.ts +31 -0
  302. package/output/solve/solveSystem.js +290 -0
  303. package/output/solve/utils.d.ts +9 -0
  304. package/output/solve/utils.js +62 -0
  305. package/output/utils/array.d.ts +42 -0
  306. package/output/utils/array.js +98 -0
  307. package/output/utils/debug.d.ts +131 -0
  308. package/output/utils/debug.js +295 -0
  309. package/output/utils/decimal.d.ts +3 -0
  310. package/output/utils/decimal.js +16 -0
  311. package/output/utils/numeric.d.ts +14 -0
  312. package/output/utils/numeric.js +51 -0
  313. package/output/utils/object.d.ts +26 -0
  314. package/output/utils/object.js +56 -0
  315. package/package.json +213 -57
  316. package/.travis.yml +0 -3
  317. package/Algebra.js +0 -4568
  318. package/BREAKING_CHANGES.md +0 -5
  319. package/CODE_OF_CONDUCT.md +0 -46
  320. package/CONTRIBUTING.md +0 -14
  321. package/Calculus.js +0 -2675
  322. package/Extra.js +0 -622
  323. package/Solve.js +0 -1783
  324. package/all.js +0 -16
  325. package/all.min.js +0 -1
  326. package/gulpfile.js +0 -16
  327. package/index.html +0 -158
  328. package/license.txt +0 -19
  329. package/nerdamer.core.js +0 -12510
  330. package/spec/LaTeX.spec.js +0 -302
  331. package/spec/TeXConvert.spec.js +0 -8
  332. package/spec/algebra.spec.js +0 -287
  333. package/spec/basic_parser.spec.js +0 -134
  334. package/spec/build.spec.js +0 -131
  335. package/spec/calculus.spec.js +0 -183
  336. package/spec/core.spec.js +0 -2970
  337. package/spec/extra.spec.js +0 -54
  338. package/spec/solve.spec.js +0 -126
  339. package/spec/support/jasmine.json +0 -11
  340. package/spec/support/utils.js +0 -42
  341. package/spec/text.spec.js +0 -132
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.add = add;
4
+ exports.addPrefix = addPrefix;
5
+ exports.join = join;
6
+ const errors_1 = require("../../../errors");
7
+ const Settings_1 = require("../../../Settings");
8
+ const Expression_1 = require("../../expression/Expression");
9
+ const constants_1 = require("../constants");
10
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
11
+ const { NUM, VAR, EXP, FUN, GRP, PRD, SUM, INF } = constants_1.EXPRESSION_TYPES;
12
+ function add(a, b) {
13
+ let retval;
14
+ if (Settings_1.Settings.DEFER_SIMPLIFICATION) {
15
+ retval = join(a, b, false);
16
+ retval.deferred = true;
17
+ }
18
+ else {
19
+ const keyA = a.keyValue();
20
+ const keyB = b.keyValue();
21
+ // Distribute the multiplier if true
22
+ if (Expression_1.Expression.DISTRIBUTE_MULTIPLIER) {
23
+ a = a.distributeMultiplier();
24
+ b = b.distributeMultiplier();
25
+ }
26
+ // It suffices to check if their keyValues are the same since x+x will be handled.
27
+ // We're only dealing with x^n+x^(!n) at this point.
28
+ const isGroup = !a.isNUM() && keyA === keyB;
29
+ if (a.isNUM() && b.isNUM()) {
30
+ retval = Expression_1.Expression.fromRational(a.getMultiplier().plus(b.getMultiplier()));
31
+ }
32
+ else if (a.isComplex() && b.isComplex()) {
33
+ const re = a.realPart().plus(b.realPart());
34
+ const im = a.imagPart().plus(b.imagPart()).times(Expression_1.Expression.Img());
35
+ // Do a zero check here rather than placing that additional burden on join.
36
+ retval = re.isZero() ? im : im.isZero() ? re : join(re, im); // Don't use add
37
+ }
38
+ else if (a.isZero()) {
39
+ retval = Expression_1.Expression.create(b);
40
+ }
41
+ else if (a.value === b.value && a.type === b.type && a.getPower().eq(b.getPower())) {
42
+ // Infinity has no finite coefficient magnitude. Same-sign infinities remain
43
+ // canonical infinity, while opposite signs are undefined.
44
+ if (a.isInf()) {
45
+ const x = a.getMultiplier();
46
+ const y = b.getMultiplier();
47
+ if ((x.isNegative() && !y.isNegative()) || (y.isNegative() && !x.isNegative())) {
48
+ throw new errors_1.UndefinedError((0, errors_1.message)('infinityMinusInfinityUndefined'));
49
+ }
50
+ retval = a.isNegInf() ? Expression_1.Expression.NegInf() : Expression_1.Expression.Inf();
51
+ }
52
+ else {
53
+ retval = Expression_1.Expression.create(a);
54
+ const multiplier = a.getMultiplier().plus(b.getMultiplier());
55
+ if (multiplier.isZero()) {
56
+ retval = Expression_1.Expression.Number('0');
57
+ }
58
+ if (a.isSum() && b.isSum() && a.isLinear() && b.isLinear()) {
59
+ retval = join(a, b);
60
+ }
61
+ else {
62
+ retval.multiplier = multiplier;
63
+ if (retval.power) {
64
+ // We can do this since a.power === b.power
65
+ retval = Expression_1.Expression.setPower(retval, a.getPower().copy());
66
+ }
67
+ }
68
+ // Put back the power
69
+ if (a.power) {
70
+ retval = Expression_1.Expression.setPower(retval, a.getPower().copy());
71
+ }
72
+ }
73
+ }
74
+ // Since we've already check for equal power and value we're not dealing with groups
75
+ // These are stored by power rather than their value so x^n+x^(n+1) will be stored as
76
+ // {n: x^n, n+1: x^(n+1)} for any power !== 0
77
+ else if (isGroup) {
78
+ retval = join(a, b, isGroup);
79
+ }
80
+ else if (a.isInf() && b.isInf()) {
81
+ const x = a.getMultiplier();
82
+ const y = b.getMultiplier();
83
+ if ((x.isNegative() && !y.isNegative()) || (y.isNegative() && !x.isNegative())) {
84
+ throw new errors_1.UndefinedError((0, errors_1.message)('infinityMinusInfinityUndefined'));
85
+ }
86
+ }
87
+ // We can just flip because of commutativity. Add can figure out the rest.
88
+ // ******************** RECIPROCALS ******************** //
89
+ else if (constants_1.RANK[a.type] > constants_1.RANK[b.type]) {
90
+ retval = add(b, a);
91
+ }
92
+ // This is a catch all for all unhandled cases so do not use else above.
93
+ retval = retval || join(a, b, isGroup);
94
+ }
95
+ return retval;
96
+ }
97
+ function addPrefix(a) {
98
+ // This does nothing but return the Expression
99
+ return a;
100
+ }
101
+ function canJoin(a, b) {
102
+ // In order for SUM or GRP to be able to join, it needs to have a multiplier and a power of one
103
+ return (
104
+ // Any value can be added to SUM
105
+ (a.type === SUM ||
106
+ // b can only be added to a if the keyValue matches
107
+ (a.type === GRP && a.keyValue() === b.keyValue())) &&
108
+ // Both the power and multiplier must be one, basically it's wrapped in parentheses
109
+ a.isLinear() &&
110
+ (!a.multiplier || (a.multiplier && a.getMultiplier().isOne())));
111
+ }
112
+ /**
113
+ * This method is not designed for cases where a = b; This should be handled before getting here.
114
+ * This method only does element wise addition for powers of 1. For all else it just creates a new expression
115
+ * and puts them in a new container.
116
+ *
117
+ * @param a
118
+ * @param b
119
+ * @param action
120
+ * @param skipAction
121
+ * @returns
122
+ */
123
+ function join(a, b, isGroup = false) {
124
+ let retval;
125
+ let elements = [];
126
+ const expressionType = isGroup ? GRP : SUM;
127
+ let aCanJoin = canJoin(a, b);
128
+ let bCanJoin = canJoin(b, a);
129
+ // Always keep the joinable expression on the right
130
+ if (aCanJoin && !bCanJoin) {
131
+ [b, a] = [a, b]; // Swap them
132
+ [bCanJoin, aCanJoin] = [aCanJoin, bCanJoin]; // Swap the join condition
133
+ }
134
+ // Case 1: Neither has an expression object so make an empty container and append a copy of the second.
135
+ // If skipAction is true then it will just append and skip everything else. Remember, a != b
136
+ if (!bCanJoin) {
137
+ let asSubExpression = false;
138
+ // Case 1.a: We first get the keys and assume they're not sub-symbolics. For x^-1 and (x+x^2)^-1 for
139
+ // instance we get a tie. Not only are they key values the same, but so are their powers. They should
140
+ // be joined as sub-symbolics at this point. We perform this check to break the tie. We'll know this
141
+ // because we'll have two matching keys which shouldn't happen.
142
+ let keyA = a.keyValue(asSubExpression, isGroup);
143
+ let keyB = b.keyValue(asSubExpression, isGroup);
144
+ // Check for matching keys and recalculate the keys if that's the case
145
+ if (keyA === keyB) {
146
+ asSubExpression = true;
147
+ isGroup = false;
148
+ keyA = a.keyValue(asSubExpression, isGroup);
149
+ keyB = b.keyValue(asSubExpression, isGroup);
150
+ }
151
+ retval = Expression_1.Expression.Number('1');
152
+ retval.elements = {};
153
+ // Copy the elements
154
+ retval.elements[keyA] = a.copy();
155
+ retval.elements[keyB] = b.copy();
156
+ elements = [a, b];
157
+ }
158
+ // Case 2
159
+ // e.g. x + (x+1) or 2*(x+1) + (x+1)+y
160
+ else if (!aCanJoin && bCanJoin) {
161
+ retval = b.copy();
162
+ const subExpressions = retval.getElements();
163
+ // We start with the more restrictive assumption. Taking the example from case 1,
164
+ // we now have an expression in the form x^-1 + (x+x^2)^-1. The simpler from of the key
165
+ // would just be x but we first want to make sure we're not dealing with case 1.a
166
+ let asSubExpression = true;
167
+ let key = a.keyValue(asSubExpression, false);
168
+ // If no value was found then it's safe to use the less restrictive key so recalculate it
169
+ if (!(key in subExpressions)) {
170
+ asSubExpression = false;
171
+ key = a.keyValue(asSubExpression, isGroup);
172
+ }
173
+ // Append the expression or add it to any existing expression if there's one
174
+ if (key in subExpressions) {
175
+ const result = add(a, subExpressions[key]);
176
+ // It may have resulted in zero, so only add if that's not the case
177
+ if (!result.isZero()) {
178
+ subExpressions[key] = result;
179
+ }
180
+ else {
181
+ // Otherwise remove it
182
+ delete subExpressions[key];
183
+ }
184
+ }
185
+ else {
186
+ subExpressions[key] = a.copy();
187
+ }
188
+ elements = Object.values(subExpressions);
189
+ }
190
+ // Case 3
191
+ else {
192
+ retval = a.copy();
193
+ retval.multiplier = a.getMultiplier().times(b.getMultiplier());
194
+ const retvalExpressions = retval.getElements();
195
+ const bExpressions = b.getElements();
196
+ for (const x in bExpressions) {
197
+ const e = bExpressions[x];
198
+ if (x in retvalExpressions) {
199
+ const result = add(e, retvalExpressions[x]);
200
+ // Don't add it if it's zero
201
+ if (result.isZero()) {
202
+ // Remove the entry if it's zero
203
+ delete retvalExpressions[x];
204
+ }
205
+ else {
206
+ retvalExpressions[x] = result;
207
+ }
208
+ }
209
+ else {
210
+ retvalExpressions[x] = e.copy();
211
+ }
212
+ }
213
+ elements = Object.values(retvalExpressions);
214
+ }
215
+ // Some cleanup. The expression may have now become a single element. We'll know this because
216
+ // the sub-elements will only be one element long. If that's the case then that become the reval
217
+ if ((retval.isSum() || retval.isProduct()) && elements.length === 1) {
218
+ const onlyElement = elements[0];
219
+ // Move the multiplier
220
+ if (retval.multiplier || onlyElement.multiplier) {
221
+ onlyElement.multiplier = onlyElement.getMultiplier().times(retval.getMultiplier());
222
+ }
223
+ retval = onlyElement;
224
+ }
225
+ else {
226
+ // If it's empty then the value is zero
227
+ if (elements.length === 0) {
228
+ retval = Expression_1.Expression.Number('0');
229
+ }
230
+ else {
231
+ // Set the type
232
+ retval.type = expressionType;
233
+ // Update the value
234
+ retval.value = Expression_1.Expression.getValue(elements, 'text', expressionType);
235
+ }
236
+ }
237
+ return retval;
238
+ }
@@ -0,0 +1,7 @@
1
+ import type { ParserStackValue } from '../types';
2
+ /**
3
+ * The comma is essentially a prefix operator that just returns the object.
4
+ *
5
+ * @param a
6
+ */
7
+ export declare function comma(a: ParserStackValue, b: ParserStackValue): ParserStackValue[];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.comma = comma;
4
+ /**
5
+ * The comma is essentially a prefix operator that just returns the object.
6
+ *
7
+ * @param a
8
+ */
9
+ function comma(a, b) {
10
+ return [a, b];
11
+ }
@@ -0,0 +1,21 @@
1
+ import type { ExpressionInput } from '../../../types';
2
+ export { assume } from '../../assumption/assume';
3
+ /**
4
+ * Checks whether Nerdamer can establish that `a` and `b` are equal.
5
+ *
6
+ * @remarks
7
+ * The public expression comparison remains boolean for compatibility. Assumptions
8
+ * supply a result when they can prove or disprove the relation; an unknown assumption
9
+ * result falls through to the ordinary symbolic comparison. If neither path can prove
10
+ * equality, this function returns `false`. Use the corresponding `Assumption` relation
11
+ * directly when a caller needs to distinguish a disproved relation from an unknown one.
12
+ */
13
+ export declare function equal(a: ExpressionInput, b: ExpressionInput): boolean;
14
+ /** Checks whether Nerdamer can establish that `a` is strictly greater than `b`. */
15
+ export declare function gt(a: ExpressionInput, b: ExpressionInput): boolean;
16
+ /** Checks whether Nerdamer can establish that `a` is greater than or equal to `b`. */
17
+ export declare function gte(a: ExpressionInput, b: ExpressionInput): boolean;
18
+ /** Checks whether Nerdamer can establish that `a` is strictly less than `b`. */
19
+ export declare function lt(a: ExpressionInput, b: ExpressionInput): boolean;
20
+ /** Checks whether Nerdamer can establish that `a` is less than or equal to `b`. */
21
+ export declare function lte(a: ExpressionInput, b: ExpressionInput): boolean;