mathjs 9.3.2 → 9.4.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 (410) hide show
  1. package/HISTORY.md +22 -0
  2. package/README.md +1 -0
  3. package/bin/cli.js +11 -11
  4. package/docs/expressions/parsing.md +21 -4
  5. package/docs/reference/functions/complex.md +5 -49
  6. package/docs/reference/functions/eigs.md +12 -12
  7. package/docs/reference/functions/flatten.md +1 -0
  8. package/docs/reference/functions/matrixFromColumns.md +1 -1
  9. package/docs/reference/functions/matrixFromFunction.md +12 -0
  10. package/docs/reference/functions/matrixFromRows.md +1 -1
  11. package/docs/reference/functions.md +4 -1
  12. package/examples/advanced/custom_scope_objects.js +115 -0
  13. package/lib/browser/math.js +10 -10
  14. package/lib/browser/math.js.map +1 -1
  15. package/lib/cjs/core/create.js +8 -7
  16. package/lib/cjs/core/function/import.js +9 -7
  17. package/lib/cjs/core/function/typed.js +6 -1
  18. package/lib/cjs/defaultInstance.js +3 -3
  19. package/lib/cjs/entry/allFactoriesAny.js +3 -3
  20. package/lib/cjs/entry/allFactoriesNumber.js +3 -3
  21. package/lib/cjs/entry/configReadonly.js +5 -4
  22. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +51 -0
  23. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromColumns.generated.js +29 -0
  24. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromFunction.generated.js +26 -0
  25. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromRows.generated.js +29 -0
  26. package/lib/cjs/entry/dependenciesAny.generated.js +24 -0
  27. package/lib/cjs/entry/impureFunctionsAny.generated.js +22 -17
  28. package/lib/cjs/entry/impureFunctionsNumber.generated.js +11 -9
  29. package/lib/cjs/entry/pureFunctionsAny.generated.js +78 -41
  30. package/lib/cjs/expression/Parser.js +22 -15
  31. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +9 -0
  32. package/lib/cjs/expression/embeddedDocs/function/matrix/column.js +1 -1
  33. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromColumns.js +15 -0
  34. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromFunction.js +15 -0
  35. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromRows.js +15 -0
  36. package/lib/cjs/expression/embeddedDocs/function/matrix/row.js +1 -1
  37. package/lib/cjs/expression/function/evaluate.js +6 -4
  38. package/lib/cjs/expression/keywords.js +1 -3
  39. package/lib/cjs/expression/node/AccessorNode.js +1 -0
  40. package/lib/cjs/expression/node/AssignmentNode.js +6 -3
  41. package/lib/cjs/expression/node/FunctionAssignmentNode.js +2 -4
  42. package/lib/cjs/expression/node/FunctionNode.js +76 -46
  43. package/lib/cjs/expression/node/IndexNode.js +5 -13
  44. package/lib/cjs/expression/node/Node.js +15 -9
  45. package/lib/cjs/expression/node/ObjectNode.js +5 -3
  46. package/lib/cjs/expression/node/SymbolNode.js +2 -2
  47. package/lib/cjs/expression/node/utils/access.js +5 -3
  48. package/lib/cjs/expression/node/utils/assign.js +5 -3
  49. package/lib/cjs/expression/parse.js +10 -14
  50. package/lib/cjs/expression/transform/utils/compileInlineExpression.js +5 -3
  51. package/lib/cjs/factoriesAny.js +24 -0
  52. package/lib/cjs/function/algebra/decomposition/qr.js +5 -3
  53. package/lib/cjs/function/algebra/simplify/resolve.js +7 -1
  54. package/lib/cjs/function/algebra/simplify.js +20 -14
  55. package/lib/cjs/function/algebra/solver/lsolveAll.js +6 -16
  56. package/lib/cjs/function/algebra/solver/usolveAll.js +6 -16
  57. package/lib/cjs/function/arithmetic/ceil.js +6 -16
  58. package/lib/cjs/function/arithmetic/floor.js +6 -16
  59. package/lib/cjs/function/arithmetic/norm.js +2 -2
  60. package/lib/cjs/function/arithmetic/pow.js +9 -7
  61. package/lib/cjs/function/arithmetic/round.js +7 -5
  62. package/lib/cjs/function/complex/im.js +3 -0
  63. package/lib/cjs/function/complex/re.js +3 -0
  64. package/lib/cjs/function/matrix/eigs/complexEigs.js +631 -0
  65. package/lib/cjs/function/matrix/eigs/realSymetric.js +341 -0
  66. package/lib/cjs/function/matrix/eigs.js +188 -334
  67. package/lib/cjs/function/matrix/flatten.js +1 -0
  68. package/lib/cjs/function/matrix/matrixFromColumns.js +118 -0
  69. package/lib/cjs/function/matrix/matrixFromFunction.js +85 -0
  70. package/lib/cjs/function/matrix/matrixFromRows.js +108 -0
  71. package/lib/cjs/function/probability/pickRandom.js +1 -1
  72. package/lib/cjs/function/probability/util/seededRNG.js +2 -2
  73. package/lib/cjs/function/relational/compareNatural.js +2 -2
  74. package/lib/cjs/header.js +2 -2
  75. package/lib/cjs/plain/bignumber/index.js +2 -2
  76. package/lib/cjs/type/bignumber/BigNumber.js +2 -2
  77. package/lib/cjs/type/complex/Complex.js +5 -5
  78. package/lib/cjs/type/fraction/Fraction.js +2 -2
  79. package/lib/cjs/type/matrix/DenseMatrix.js +138 -0
  80. package/lib/cjs/type/matrix/Matrix.js +10 -0
  81. package/lib/cjs/type/matrix/SparseMatrix.js +77 -3
  82. package/lib/cjs/type/matrix/function/matrix.js +2 -1
  83. package/lib/cjs/type/unit/Unit.js +15 -13
  84. package/lib/cjs/utils/array.js +1 -1
  85. package/lib/cjs/utils/customs.js +18 -4
  86. package/lib/cjs/utils/emitter.js +2 -2
  87. package/lib/cjs/utils/function.js +6 -2
  88. package/lib/cjs/utils/is.js +7 -5
  89. package/lib/cjs/utils/latex.js +2 -2
  90. package/lib/cjs/utils/map.js +197 -0
  91. package/lib/cjs/utils/object.js +6 -5
  92. package/lib/cjs/utils/scope.js +33 -0
  93. package/lib/cjs/utils/snapshot.js +17 -16
  94. package/lib/cjs/utils/string.js +6 -4
  95. package/lib/cjs/version.js +1 -1
  96. package/lib/esm/constants.js +15 -15
  97. package/lib/esm/core/create.js +1 -2
  98. package/lib/esm/core/function/typed.js +5 -1
  99. package/lib/esm/entry/configReadonly.js +1 -2
  100. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +34 -0
  101. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromColumns.generated.js +16 -0
  102. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromFunction.generated.js +14 -0
  103. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromRows.generated.js +16 -0
  104. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  105. package/lib/esm/entry/impureFunctionsAny.generated.js +13 -10
  106. package/lib/esm/entry/impureFunctionsNumber.generated.js +1 -1
  107. package/lib/esm/entry/pureFunctionsAny.generated.js +66 -32
  108. package/lib/esm/expression/Help.js +1 -1
  109. package/lib/esm/expression/Parser.js +23 -15
  110. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
  111. package/lib/esm/expression/embeddedDocs/function/matrix/column.js +1 -1
  112. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromColumns.js +8 -0
  113. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromFunction.js +8 -0
  114. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromRows.js +8 -0
  115. package/lib/esm/expression/embeddedDocs/function/matrix/row.js +1 -1
  116. package/lib/esm/expression/function/compile.js +1 -1
  117. package/lib/esm/expression/function/evaluate.js +6 -5
  118. package/lib/esm/expression/function/help.js +1 -1
  119. package/lib/esm/expression/function/parser.js +1 -1
  120. package/lib/esm/expression/keywords.js +1 -3
  121. package/lib/esm/expression/node/AccessorNode.js +2 -1
  122. package/lib/esm/expression/node/ArrayNode.js +1 -1
  123. package/lib/esm/expression/node/AssignmentNode.js +7 -4
  124. package/lib/esm/expression/node/BlockNode.js +1 -1
  125. package/lib/esm/expression/node/ConditionalNode.js +1 -1
  126. package/lib/esm/expression/node/ConstantNode.js +1 -1
  127. package/lib/esm/expression/node/FunctionAssignmentNode.js +3 -4
  128. package/lib/esm/expression/node/FunctionNode.js +57 -39
  129. package/lib/esm/expression/node/IndexNode.js +1 -1
  130. package/lib/esm/expression/node/Node.js +7 -8
  131. package/lib/esm/expression/node/ObjectNode.js +1 -1
  132. package/lib/esm/expression/node/OperatorNode.js +1 -1
  133. package/lib/esm/expression/node/ParenthesisNode.js +1 -1
  134. package/lib/esm/expression/node/RangeNode.js +1 -1
  135. package/lib/esm/expression/node/RelationalNode.js +1 -1
  136. package/lib/esm/expression/node/SymbolNode.js +3 -3
  137. package/lib/esm/expression/parse.js +2 -3
  138. package/lib/esm/expression/transform/apply.transform.js +1 -1
  139. package/lib/esm/expression/transform/column.transform.js +1 -1
  140. package/lib/esm/expression/transform/concat.transform.js +1 -1
  141. package/lib/esm/expression/transform/diff.transform.js +1 -1
  142. package/lib/esm/expression/transform/filter.transform.js +1 -1
  143. package/lib/esm/expression/transform/forEach.transform.js +1 -1
  144. package/lib/esm/expression/transform/index.transform.js +1 -1
  145. package/lib/esm/expression/transform/map.transform.js +1 -1
  146. package/lib/esm/expression/transform/max.transform.js +1 -1
  147. package/lib/esm/expression/transform/mean.transform.js +1 -1
  148. package/lib/esm/expression/transform/min.transform.js +1 -1
  149. package/lib/esm/expression/transform/range.transform.js +1 -1
  150. package/lib/esm/expression/transform/row.transform.js +1 -1
  151. package/lib/esm/expression/transform/std.transform.js +1 -1
  152. package/lib/esm/expression/transform/subset.transform.js +1 -1
  153. package/lib/esm/expression/transform/sum.transform.js +1 -1
  154. package/lib/esm/expression/transform/utils/compileInlineExpression.js +4 -3
  155. package/lib/esm/expression/transform/variance.transform.js +1 -1
  156. package/lib/esm/factoriesAny.js +3 -0
  157. package/lib/esm/factoriesNumber.js +1 -1
  158. package/lib/esm/function/algebra/decomposition/lup.js +1 -1
  159. package/lib/esm/function/algebra/decomposition/qr.js +2 -3
  160. package/lib/esm/function/algebra/decomposition/slu.js +1 -1
  161. package/lib/esm/function/algebra/derivative.js +1 -1
  162. package/lib/esm/function/algebra/rationalize.js +1 -1
  163. package/lib/esm/function/algebra/simplify/resolve.js +7 -2
  164. package/lib/esm/function/algebra/simplify/simplifyConstant.js +1 -1
  165. package/lib/esm/function/algebra/simplify/simplifyCore.js +1 -1
  166. package/lib/esm/function/algebra/simplify/util.js +1 -1
  167. package/lib/esm/function/algebra/simplify.js +16 -12
  168. package/lib/esm/function/algebra/solver/lsolve.js +1 -1
  169. package/lib/esm/function/algebra/solver/lsolveAll.js +1 -1
  170. package/lib/esm/function/algebra/solver/lusolve.js +1 -1
  171. package/lib/esm/function/algebra/solver/usolve.js +1 -1
  172. package/lib/esm/function/algebra/solver/usolveAll.js +1 -1
  173. package/lib/esm/function/algebra/sparse/csAmd.js +1 -1
  174. package/lib/esm/function/algebra/sparse/csChol.js +1 -1
  175. package/lib/esm/function/algebra/sparse/csCounts.js +1 -1
  176. package/lib/esm/function/algebra/sparse/csLu.js +1 -1
  177. package/lib/esm/function/algebra/sparse/csSpsolve.js +1 -1
  178. package/lib/esm/function/algebra/sparse/csSqr.js +1 -1
  179. package/lib/esm/function/algebra/sparse/csSymperm.js +1 -1
  180. package/lib/esm/function/arithmetic/abs.js +1 -1
  181. package/lib/esm/function/arithmetic/add.js +1 -1
  182. package/lib/esm/function/arithmetic/addScalar.js +1 -1
  183. package/lib/esm/function/arithmetic/cbrt.js +1 -1
  184. package/lib/esm/function/arithmetic/ceil.js +1 -1
  185. package/lib/esm/function/arithmetic/cube.js +1 -1
  186. package/lib/esm/function/arithmetic/divide.js +1 -1
  187. package/lib/esm/function/arithmetic/divideScalar.js +1 -1
  188. package/lib/esm/function/arithmetic/dotDivide.js +1 -1
  189. package/lib/esm/function/arithmetic/dotMultiply.js +1 -1
  190. package/lib/esm/function/arithmetic/dotPow.js +1 -1
  191. package/lib/esm/function/arithmetic/exp.js +1 -1
  192. package/lib/esm/function/arithmetic/expm1.js +1 -1
  193. package/lib/esm/function/arithmetic/fix.js +1 -1
  194. package/lib/esm/function/arithmetic/floor.js +1 -1
  195. package/lib/esm/function/arithmetic/gcd.js +1 -1
  196. package/lib/esm/function/arithmetic/hypot.js +1 -1
  197. package/lib/esm/function/arithmetic/lcm.js +1 -1
  198. package/lib/esm/function/arithmetic/log.js +1 -1
  199. package/lib/esm/function/arithmetic/log10.js +1 -1
  200. package/lib/esm/function/arithmetic/log1p.js +1 -1
  201. package/lib/esm/function/arithmetic/log2.js +1 -1
  202. package/lib/esm/function/arithmetic/mod.js +1 -1
  203. package/lib/esm/function/arithmetic/multiply.js +1 -1
  204. package/lib/esm/function/arithmetic/multiplyScalar.js +1 -1
  205. package/lib/esm/function/arithmetic/norm.js +3 -3
  206. package/lib/esm/function/arithmetic/nthRoot.js +2 -2
  207. package/lib/esm/function/arithmetic/nthRoots.js +1 -1
  208. package/lib/esm/function/arithmetic/pow.js +10 -8
  209. package/lib/esm/function/arithmetic/round.js +6 -6
  210. package/lib/esm/function/arithmetic/sign.js +1 -1
  211. package/lib/esm/function/arithmetic/sqrt.js +1 -1
  212. package/lib/esm/function/arithmetic/square.js +1 -1
  213. package/lib/esm/function/arithmetic/subtract.js +1 -1
  214. package/lib/esm/function/arithmetic/unaryMinus.js +1 -1
  215. package/lib/esm/function/arithmetic/unaryPlus.js +1 -1
  216. package/lib/esm/function/arithmetic/xgcd.js +1 -1
  217. package/lib/esm/function/bitwise/bitAnd.js +1 -1
  218. package/lib/esm/function/bitwise/bitNot.js +1 -1
  219. package/lib/esm/function/bitwise/bitOr.js +1 -1
  220. package/lib/esm/function/bitwise/bitXor.js +1 -1
  221. package/lib/esm/function/bitwise/leftShift.js +1 -1
  222. package/lib/esm/function/bitwise/rightArithShift.js +1 -1
  223. package/lib/esm/function/bitwise/rightLogShift.js +1 -1
  224. package/lib/esm/function/combinatorics/bellNumbers.js +1 -1
  225. package/lib/esm/function/combinatorics/catalan.js +1 -1
  226. package/lib/esm/function/combinatorics/composition.js +1 -1
  227. package/lib/esm/function/combinatorics/stirlingS2.js +1 -1
  228. package/lib/esm/function/complex/arg.js +1 -1
  229. package/lib/esm/function/complex/conj.js +1 -1
  230. package/lib/esm/function/complex/im.js +4 -1
  231. package/lib/esm/function/complex/re.js +4 -1
  232. package/lib/esm/function/geometry/distance.js +1 -1
  233. package/lib/esm/function/geometry/intersect.js +1 -1
  234. package/lib/esm/function/logical/and.js +1 -1
  235. package/lib/esm/function/logical/not.js +1 -1
  236. package/lib/esm/function/logical/or.js +1 -1
  237. package/lib/esm/function/logical/xor.js +1 -1
  238. package/lib/esm/function/matrix/apply.js +1 -1
  239. package/lib/esm/function/matrix/column.js +1 -1
  240. package/lib/esm/function/matrix/concat.js +1 -1
  241. package/lib/esm/function/matrix/count.js +1 -1
  242. package/lib/esm/function/matrix/cross.js +1 -1
  243. package/lib/esm/function/matrix/ctranspose.js +1 -1
  244. package/lib/esm/function/matrix/det.js +1 -1
  245. package/lib/esm/function/matrix/diag.js +1 -1
  246. package/lib/esm/function/matrix/diff.js +1 -1
  247. package/lib/esm/function/matrix/dot.js +1 -1
  248. package/lib/esm/function/matrix/eigs/complexEigs.js +586 -0
  249. package/lib/esm/function/matrix/eigs/realSymetric.js +335 -0
  250. package/lib/esm/function/matrix/eigs.js +187 -335
  251. package/lib/esm/function/matrix/expm.js +1 -1
  252. package/lib/esm/function/matrix/filter.js +1 -1
  253. package/lib/esm/function/matrix/flatten.js +2 -1
  254. package/lib/esm/function/matrix/forEach.js +1 -1
  255. package/lib/esm/function/matrix/getMatrixDataType.js +1 -1
  256. package/lib/esm/function/matrix/identity.js +1 -1
  257. package/lib/esm/function/matrix/inv.js +1 -1
  258. package/lib/esm/function/matrix/kron.js +1 -1
  259. package/lib/esm/function/matrix/map.js +1 -1
  260. package/lib/esm/function/matrix/matrixFromColumns.js +93 -0
  261. package/lib/esm/function/matrix/matrixFromFunction.js +78 -0
  262. package/lib/esm/function/matrix/matrixFromRows.js +83 -0
  263. package/lib/esm/function/matrix/ones.js +1 -1
  264. package/lib/esm/function/matrix/partitionSelect.js +1 -1
  265. package/lib/esm/function/matrix/range.js +1 -1
  266. package/lib/esm/function/matrix/reshape.js +1 -1
  267. package/lib/esm/function/matrix/resize.js +1 -1
  268. package/lib/esm/function/matrix/rotate.js +1 -1
  269. package/lib/esm/function/matrix/rotationMatrix.js +1 -1
  270. package/lib/esm/function/matrix/row.js +1 -1
  271. package/lib/esm/function/matrix/size.js +1 -1
  272. package/lib/esm/function/matrix/sort.js +1 -1
  273. package/lib/esm/function/matrix/sqrtm.js +1 -1
  274. package/lib/esm/function/matrix/squeeze.js +1 -1
  275. package/lib/esm/function/matrix/subset.js +1 -1
  276. package/lib/esm/function/matrix/trace.js +1 -1
  277. package/lib/esm/function/matrix/transpose.js +1 -1
  278. package/lib/esm/function/matrix/zeros.js +1 -1
  279. package/lib/esm/function/probability/combinations.js +1 -1
  280. package/lib/esm/function/probability/combinationsWithRep.js +1 -1
  281. package/lib/esm/function/probability/factorial.js +1 -1
  282. package/lib/esm/function/probability/gamma.js +1 -1
  283. package/lib/esm/function/probability/kldivergence.js +1 -1
  284. package/lib/esm/function/probability/multinomial.js +1 -1
  285. package/lib/esm/function/probability/permutations.js +1 -1
  286. package/lib/esm/function/probability/pickRandom.js +2 -2
  287. package/lib/esm/function/probability/random.js +2 -2
  288. package/lib/esm/function/probability/randomInt.js +1 -1
  289. package/lib/esm/function/relational/compare.js +2 -2
  290. package/lib/esm/function/relational/compareNatural.js +1 -1
  291. package/lib/esm/function/relational/compareText.js +2 -2
  292. package/lib/esm/function/relational/deepEqual.js +1 -1
  293. package/lib/esm/function/relational/equal.js +2 -2
  294. package/lib/esm/function/relational/equalScalar.js +2 -2
  295. package/lib/esm/function/relational/equalText.js +1 -1
  296. package/lib/esm/function/relational/larger.js +2 -2
  297. package/lib/esm/function/relational/largerEq.js +2 -2
  298. package/lib/esm/function/relational/smaller.js +2 -2
  299. package/lib/esm/function/relational/smallerEq.js +2 -2
  300. package/lib/esm/function/relational/unequal.js +2 -2
  301. package/lib/esm/function/set/setCartesian.js +1 -1
  302. package/lib/esm/function/set/setDifference.js +1 -1
  303. package/lib/esm/function/set/setDistinct.js +1 -1
  304. package/lib/esm/function/set/setIntersect.js +1 -1
  305. package/lib/esm/function/set/setIsSubset.js +1 -1
  306. package/lib/esm/function/set/setMultiplicity.js +1 -1
  307. package/lib/esm/function/set/setPowerset.js +1 -1
  308. package/lib/esm/function/set/setSize.js +1 -1
  309. package/lib/esm/function/set/setSymDifference.js +1 -1
  310. package/lib/esm/function/set/setUnion.js +1 -1
  311. package/lib/esm/function/special/erf.js +1 -1
  312. package/lib/esm/function/statistics/mad.js +1 -1
  313. package/lib/esm/function/statistics/max.js +1 -1
  314. package/lib/esm/function/statistics/mean.js +1 -1
  315. package/lib/esm/function/statistics/median.js +1 -1
  316. package/lib/esm/function/statistics/min.js +1 -1
  317. package/lib/esm/function/statistics/mode.js +1 -1
  318. package/lib/esm/function/statistics/prod.js +1 -1
  319. package/lib/esm/function/statistics/quantileSeq.js +1 -1
  320. package/lib/esm/function/statistics/std.js +1 -1
  321. package/lib/esm/function/statistics/sum.js +1 -1
  322. package/lib/esm/function/statistics/variance.js +1 -1
  323. package/lib/esm/function/string/bin.js +1 -1
  324. package/lib/esm/function/string/format.js +1 -1
  325. package/lib/esm/function/string/hex.js +1 -1
  326. package/lib/esm/function/string/oct.js +1 -1
  327. package/lib/esm/function/string/print.js +1 -1
  328. package/lib/esm/function/trigonometry/acos.js +1 -1
  329. package/lib/esm/function/trigonometry/acosh.js +1 -1
  330. package/lib/esm/function/trigonometry/acot.js +1 -1
  331. package/lib/esm/function/trigonometry/acoth.js +1 -1
  332. package/lib/esm/function/trigonometry/acsc.js +1 -1
  333. package/lib/esm/function/trigonometry/acsch.js +1 -1
  334. package/lib/esm/function/trigonometry/asec.js +1 -1
  335. package/lib/esm/function/trigonometry/asech.js +1 -1
  336. package/lib/esm/function/trigonometry/asin.js +1 -1
  337. package/lib/esm/function/trigonometry/asinh.js +1 -1
  338. package/lib/esm/function/trigonometry/atan.js +1 -1
  339. package/lib/esm/function/trigonometry/atan2.js +1 -1
  340. package/lib/esm/function/trigonometry/atanh.js +1 -1
  341. package/lib/esm/function/trigonometry/cos.js +1 -1
  342. package/lib/esm/function/trigonometry/cosh.js +1 -1
  343. package/lib/esm/function/trigonometry/cot.js +1 -1
  344. package/lib/esm/function/trigonometry/coth.js +1 -1
  345. package/lib/esm/function/trigonometry/csc.js +1 -1
  346. package/lib/esm/function/trigonometry/csch.js +1 -1
  347. package/lib/esm/function/trigonometry/sec.js +1 -1
  348. package/lib/esm/function/trigonometry/sech.js +1 -1
  349. package/lib/esm/function/trigonometry/sin.js +1 -1
  350. package/lib/esm/function/trigonometry/sinh.js +1 -1
  351. package/lib/esm/function/trigonometry/tan.js +1 -1
  352. package/lib/esm/function/trigonometry/tanh.js +1 -1
  353. package/lib/esm/function/unit/to.js +1 -1
  354. package/lib/esm/function/utils/clone.js +1 -1
  355. package/lib/esm/function/utils/hasNumericValue.js +1 -1
  356. package/lib/esm/function/utils/isInteger.js +1 -1
  357. package/lib/esm/function/utils/isNaN.js +1 -1
  358. package/lib/esm/function/utils/isNegative.js +1 -1
  359. package/lib/esm/function/utils/isNumeric.js +1 -1
  360. package/lib/esm/function/utils/isPositive.js +1 -1
  361. package/lib/esm/function/utils/isPrime.js +1 -1
  362. package/lib/esm/function/utils/isZero.js +1 -1
  363. package/lib/esm/function/utils/numeric.js +1 -1
  364. package/lib/esm/function/utils/typeOf.js +1 -1
  365. package/lib/esm/json/reviver.js +1 -1
  366. package/lib/esm/type/bignumber/BigNumber.js +1 -1
  367. package/lib/esm/type/bignumber/function/bignumber.js +1 -1
  368. package/lib/esm/type/boolean.js +1 -1
  369. package/lib/esm/type/chain/Chain.js +1 -1
  370. package/lib/esm/type/chain/function/chain.js +1 -1
  371. package/lib/esm/type/complex/function/complex.js +1 -1
  372. package/lib/esm/type/fraction/function/fraction.js +1 -1
  373. package/lib/esm/type/matrix/DenseMatrix.js +75 -1
  374. package/lib/esm/type/matrix/FibonacciHeap.js +1 -1
  375. package/lib/esm/type/matrix/ImmutableDenseMatrix.js +1 -1
  376. package/lib/esm/type/matrix/Matrix.js +10 -0
  377. package/lib/esm/type/matrix/MatrixIndex.js +1 -1
  378. package/lib/esm/type/matrix/Spa.js +1 -1
  379. package/lib/esm/type/matrix/SparseMatrix.js +37 -3
  380. package/lib/esm/type/matrix/function/index.js +1 -1
  381. package/lib/esm/type/matrix/function/matrix.js +3 -2
  382. package/lib/esm/type/matrix/function/sparse.js +1 -1
  383. package/lib/esm/type/matrix/utils/algorithm01.js +1 -1
  384. package/lib/esm/type/matrix/utils/algorithm02.js +1 -1
  385. package/lib/esm/type/matrix/utils/algorithm03.js +1 -1
  386. package/lib/esm/type/matrix/utils/algorithm04.js +1 -1
  387. package/lib/esm/type/matrix/utils/algorithm05.js +1 -1
  388. package/lib/esm/type/matrix/utils/algorithm06.js +1 -1
  389. package/lib/esm/type/matrix/utils/algorithm07.js +1 -1
  390. package/lib/esm/type/matrix/utils/algorithm08.js +1 -1
  391. package/lib/esm/type/matrix/utils/algorithm09.js +1 -1
  392. package/lib/esm/type/matrix/utils/algorithm10.js +1 -1
  393. package/lib/esm/type/matrix/utils/algorithm11.js +1 -1
  394. package/lib/esm/type/matrix/utils/algorithm12.js +1 -1
  395. package/lib/esm/type/matrix/utils/algorithm13.js +1 -1
  396. package/lib/esm/type/matrix/utils/algorithm14.js +1 -1
  397. package/lib/esm/type/number.js +1 -1
  398. package/lib/esm/type/string.js +1 -1
  399. package/lib/esm/type/unit/Unit.js +4 -5
  400. package/lib/esm/type/unit/function/createUnit.js +1 -1
  401. package/lib/esm/type/unit/function/splitUnit.js +1 -1
  402. package/lib/esm/type/unit/function/unit.js +1 -1
  403. package/lib/esm/type/unit/physicalConstants.js +2 -2
  404. package/lib/esm/utils/array.js +1 -1
  405. package/lib/esm/utils/customs.js +10 -0
  406. package/lib/esm/utils/map.js +135 -0
  407. package/lib/esm/utils/scope.js +26 -0
  408. package/lib/esm/utils/snapshot.js +3 -4
  409. package/lib/esm/version.js +1 -1
  410. package/package.json +18 -9
@@ -0,0 +1,631 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createComplexEigs = createComplexEigs;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _object = require("../../../utils/object.js");
13
+
14
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
+
16
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
17
+
18
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
19
+
20
+ function createComplexEigs(_ref) {
21
+ var addScalar = _ref.addScalar,
22
+ subtract = _ref.subtract,
23
+ flatten = _ref.flatten,
24
+ multiply = _ref.multiply,
25
+ multiplyScalar = _ref.multiplyScalar,
26
+ divideScalar = _ref.divideScalar,
27
+ sqrt = _ref.sqrt,
28
+ abs = _ref.abs,
29
+ bignumber = _ref.bignumber,
30
+ diag = _ref.diag,
31
+ inv = _ref.inv,
32
+ qr = _ref.qr,
33
+ usolveAll = _ref.usolveAll,
34
+ equal = _ref.equal,
35
+ complex = _ref.complex,
36
+ larger = _ref.larger,
37
+ smaller = _ref.smaller,
38
+ round = _ref.round,
39
+ log10 = _ref.log10,
40
+ transpose = _ref.transpose,
41
+ matrixFromColumns = _ref.matrixFromColumns;
42
+
43
+ /**
44
+ * @param {number[][]} arr the matrix to find eigenvalues of
45
+ * @param {number} N size of the matrix
46
+ * @param {number|BigNumber} prec precision, anything lower will be considered zero
47
+ * @param {'number'|'BigNumber'|'Complex'} type
48
+ * @param {boolean} findVectors should we find eigenvectors?
49
+ *
50
+ * @returns {{ values: number[], vectors: number[][] }}
51
+ */
52
+ function complexEigs(arr, N, prec, type, findVectors) {
53
+ if (findVectors === undefined) {
54
+ findVectors = true;
55
+ } // TODO check if any row/col are zero except the diagonal
56
+ // make sure corresponding rows and columns have similar magnitude
57
+ // important because of numerical stability
58
+
59
+
60
+ var R = balance(arr, N, prec, type, findVectors); // R is the row transformation matrix
61
+ // A' = R A R⁻¹, A is the original matrix
62
+ // (if findVectors is false, R is undefined)
63
+ // TODO if magnitudes of elements vary over many orders,
64
+ // move greatest elements to the top left corner
65
+ // using similarity transformations, reduce the matrix
66
+ // to Hessenberg form (upper triangular plus one subdiagonal row)
67
+ // updates the transformation matrix R with new row operationsq
68
+
69
+ reduceToHessenberg(arr, N, prec, type, findVectors, R); // find eigenvalues
70
+
71
+ var _iterateUntilTriangul = iterateUntilTriangular(arr, N, prec, type, findVectors),
72
+ values = _iterateUntilTriangul.values,
73
+ C = _iterateUntilTriangul.C; // values is the list of eigenvalues, C is the column
74
+ // transformation matrix that transforms the hessenberg
75
+ // matrix to upper triangular
76
+ // compose transformations A → hess. and hess. → triang.
77
+
78
+
79
+ C = multiply(inv(R), C);
80
+ var vectors;
81
+
82
+ if (findVectors) {
83
+ vectors = findEigenvectors(arr, N, C, values, prec);
84
+ vectors = matrixFromColumns.apply(void 0, (0, _toConsumableArray2["default"])(vectors));
85
+ }
86
+
87
+ return {
88
+ values: values,
89
+ vectors: vectors
90
+ };
91
+ }
92
+ /**
93
+ * @param {number[][]} arr
94
+ * @param {number} N
95
+ * @param {number} prec
96
+ * @param {'number'|'BigNumber'|'Complex'} type
97
+ * @returns {number[][]}
98
+ */
99
+
100
+
101
+ function balance(arr, N, prec, type, findVectors) {
102
+ var big = type === 'BigNumber';
103
+ var cplx = type === 'Complex';
104
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
105
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1; // base of the floating-point arithmetic
106
+
107
+ var radix = big ? bignumber(10) : 2;
108
+ var radixSq = multiplyScalar(radix, radix); // the diagonal transformation matrix R
109
+
110
+ var Rdiag;
111
+
112
+ if (findVectors) {
113
+ Rdiag = Array(N).fill(one);
114
+ } // this isn't the only time we loop thru the matrix...
115
+
116
+
117
+ var last = false;
118
+
119
+ while (!last) {
120
+ // ...haha I'm joking! unless...
121
+ last = true;
122
+
123
+ for (var i = 0; i < N; i++) {
124
+ // compute the taxicab norm of i-th column and row
125
+ // TODO optimize for complex numbers
126
+ var colNorm = zero;
127
+ var rowNorm = zero;
128
+
129
+ for (var j = 0; j < N; j++) {
130
+ if (i === j) continue;
131
+ var c = abs(arr[i][j]);
132
+ colNorm = addScalar(colNorm, c);
133
+ rowNorm = addScalar(rowNorm, c);
134
+ }
135
+
136
+ if (!equal(colNorm, 0) && !equal(rowNorm, 0)) {
137
+ // find integer power closest to balancing the matrix
138
+ // (we want to scale only by integer powers of radix,
139
+ // so that we don't lose any precision due to round-off)
140
+ var f = one;
141
+ var _c = colNorm;
142
+ var rowDivRadix = divideScalar(rowNorm, radix);
143
+ var rowMulRadix = multiplyScalar(rowNorm, radix);
144
+
145
+ while (smaller(_c, rowDivRadix)) {
146
+ _c = multiplyScalar(_c, radixSq);
147
+ f = multiplyScalar(f, radix);
148
+ }
149
+
150
+ while (larger(_c, rowMulRadix)) {
151
+ _c = divideScalar(_c, radixSq);
152
+ f = divideScalar(f, radix);
153
+ } // check whether balancing is needed
154
+ // condition = (c + rowNorm) / f < 0.95 * (colNorm + rowNorm)
155
+
156
+
157
+ var condition = smaller(divideScalar(addScalar(_c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95)); // apply balancing similarity transformation
158
+
159
+ if (condition) {
160
+ // we should loop once again to check whether
161
+ // another rebalancing is needed
162
+ last = false;
163
+ var g = divideScalar(1, f);
164
+
165
+ for (var _j = 0; _j < N; _j++) {
166
+ if (i === _j) {
167
+ continue;
168
+ }
169
+
170
+ arr[i][_j] = multiplyScalar(arr[i][_j], f);
171
+ arr[_j][i] = multiplyScalar(arr[_j][i], g);
172
+ } // keep track of transformations
173
+
174
+
175
+ if (findVectors) {
176
+ Rdiag[i] = multiplyScalar(Rdiag[i], f);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ } // return the diagonal row transformation matrix
182
+
183
+
184
+ return diag(Rdiag);
185
+ }
186
+ /**
187
+ * @param {number[][]} arr
188
+ * @param {number} N
189
+ * @param {number} prec
190
+ * @param {'number'|'BigNumber'|'Complex'} type
191
+ * @param {boolean} findVectors
192
+ * @param {number[][]} R the row transformation matrix that will be modified
193
+ */
194
+
195
+
196
+ function reduceToHessenberg(arr, N, prec, type, findVectors, R) {
197
+ var big = type === 'BigNumber';
198
+ var cplx = type === 'Complex';
199
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
200
+
201
+ if (big) {
202
+ prec = bignumber(prec);
203
+ }
204
+
205
+ for (var i = 0; i < N - 2; i++) {
206
+ // Find the largest subdiag element in the i-th col
207
+ var maxIndex = 0;
208
+ var max = zero;
209
+
210
+ for (var j = i + 1; j < N; j++) {
211
+ var el = arr[j][i];
212
+
213
+ if (smaller(abs(max), abs(el))) {
214
+ max = el;
215
+ maxIndex = j;
216
+ }
217
+ } // This col is pivoted, no need to do anything
218
+
219
+
220
+ if (smaller(abs(max), prec)) {
221
+ continue;
222
+ }
223
+
224
+ if (maxIndex !== i + 1) {
225
+ // Interchange maxIndex-th and (i+1)-th row
226
+ var tmp1 = arr[maxIndex];
227
+ arr[maxIndex] = arr[i + 1];
228
+ arr[i + 1] = tmp1; // Interchange maxIndex-th and (i+1)-th column
229
+
230
+ for (var _j2 = 0; _j2 < N; _j2++) {
231
+ var tmp2 = arr[_j2][maxIndex];
232
+ arr[_j2][maxIndex] = arr[_j2][i + 1];
233
+ arr[_j2][i + 1] = tmp2;
234
+ } // keep track of transformations
235
+
236
+
237
+ if (findVectors) {
238
+ var tmp3 = R[maxIndex];
239
+ R[maxIndex] = R[i + 1];
240
+ R[i + 1] = tmp3;
241
+ }
242
+ } // Reduce following rows and columns
243
+
244
+
245
+ for (var _j3 = i + 2; _j3 < N; _j3++) {
246
+ var n = divideScalar(arr[_j3][i], max);
247
+
248
+ if (n === 0) {
249
+ continue;
250
+ } // from j-th row subtract n-times (i+1)th row
251
+
252
+
253
+ for (var k = 0; k < N; k++) {
254
+ arr[_j3][k] = subtract(arr[_j3][k], multiplyScalar(n, arr[i + 1][k]));
255
+ } // to (i+1)th column add n-times j-th column
256
+
257
+
258
+ for (var _k = 0; _k < N; _k++) {
259
+ arr[_k][i + 1] = addScalar(arr[_k][i + 1], multiplyScalar(n, arr[_k][_j3]));
260
+ } // keep track of transformations
261
+
262
+
263
+ if (findVectors) {
264
+ for (var _k2 = 0; _k2 < N; _k2++) {
265
+ R[_j3][_k2] = subtract(R[_j3][_k2], multiplyScalar(n, R[i + 1][_k2]));
266
+ }
267
+ }
268
+ }
269
+ }
270
+
271
+ return R;
272
+ }
273
+ /**
274
+ * @returns {{values: values, C: Matrix}}
275
+ * @see Press, Wiliams: Numerical recipes in Fortran 77
276
+ * @see https://en.wikipedia.org/wiki/QR_algorithm
277
+ */
278
+
279
+
280
+ function iterateUntilTriangular(A, N, prec, type, findVectors) {
281
+ var big = type === 'BigNumber';
282
+ var cplx = type === 'Complex';
283
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1;
284
+
285
+ if (big) {
286
+ prec = bignumber(prec);
287
+ } // The Francis Algorithm
288
+ // The core idea of this algorithm is that doing successive
289
+ // A' = Q⁺AQ transformations will eventually converge to block-
290
+ // upper-triangular with diagonal blocks either 1x1 or 2x2.
291
+ // The Q here is the one from the QR decomposition, A = QR.
292
+ // Since the eigenvalues of a block-upper-triangular matrix are
293
+ // the eigenvalues of its diagonal blocks and we know how to find
294
+ // eigenvalues of a 2x2 matrix, we know the eigenvalues of A.
295
+
296
+
297
+ var arr = (0, _object.clone)(A); // the list of converged eigenvalues
298
+
299
+ var lambdas = []; // size of arr, which will get smaller as eigenvalues converge
300
+
301
+ var n = N; // the diagonal of the block-diagonal matrix that turns
302
+ // converged 2x2 matrices into upper triangular matrices
303
+
304
+ var Sdiag = []; // N×N matrix describing the overall transformation done during the QR algorithm
305
+
306
+ var Qtotal = findVectors ? diag(Array(N).fill(one)) : undefined; // n×n matrix describing the QR transformations done since last convergence
307
+
308
+ var Qpartial = findVectors ? diag(Array(n).fill(one)) : undefined; // last eigenvalue converged before this many steps
309
+
310
+ var lastConvergenceBefore = 0;
311
+
312
+ while (lastConvergenceBefore <= 100) {
313
+ lastConvergenceBefore += 1; // TODO if the convergence is slow, do something clever
314
+ // Perform the factorization
315
+
316
+ var k = 0; // TODO set close to an eigenvalue
317
+
318
+ for (var i = 0; i < n; i++) {
319
+ arr[i][i] = subtract(arr[i][i], k);
320
+ } // TODO do an implicit QR transformation
321
+
322
+
323
+ var _qr = qr(arr),
324
+ Q = _qr.Q,
325
+ R = _qr.R;
326
+
327
+ arr = multiply(R, Q);
328
+
329
+ for (var _i = 0; _i < n; _i++) {
330
+ arr[_i][_i] = addScalar(arr[_i][_i], k);
331
+ } // keep track of transformations
332
+
333
+
334
+ if (findVectors) {
335
+ Qpartial = multiply(Qpartial, Q);
336
+ } // The rightmost diagonal element converged to an eigenvalue
337
+
338
+
339
+ if (n === 1 || smaller(abs(arr[n - 1][n - 2]), prec)) {
340
+ lastConvergenceBefore = 0;
341
+ lambdas.push(arr[n - 1][n - 1]); // keep track of transformations
342
+
343
+ if (findVectors) {
344
+ Sdiag.unshift([[1]]);
345
+ inflateMatrix(Qpartial, N);
346
+ Qtotal = multiply(Qtotal, Qpartial);
347
+
348
+ if (n > 1) {
349
+ Qpartial = diag(Array(n - 1).fill(one));
350
+ }
351
+ } // reduce the matrix size
352
+
353
+
354
+ n -= 1;
355
+ arr.pop();
356
+
357
+ for (var _i2 = 0; _i2 < n; _i2++) {
358
+ arr[_i2].pop();
359
+ } // The rightmost diagonal 2x2 block converged
360
+
361
+ } else if (n === 2 || smaller(abs(arr[n - 2][n - 3]), prec)) {
362
+ lastConvergenceBefore = 0;
363
+ var ll = eigenvalues2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1]);
364
+ lambdas.push.apply(lambdas, (0, _toConsumableArray2["default"])(ll)); // keep track of transformations
365
+
366
+ if (findVectors) {
367
+ Sdiag.unshift(jordanBase2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1], ll[0], ll[1], prec, type));
368
+ inflateMatrix(Qpartial, N);
369
+ Qtotal = multiply(Qtotal, Qpartial);
370
+
371
+ if (n > 2) {
372
+ Qpartial = diag(Array(n - 2).fill(one));
373
+ }
374
+ } // reduce the matrix size
375
+
376
+
377
+ n -= 2;
378
+ arr.pop();
379
+ arr.pop();
380
+
381
+ for (var _i3 = 0; _i3 < n; _i3++) {
382
+ arr[_i3].pop();
383
+
384
+ arr[_i3].pop();
385
+ }
386
+ }
387
+
388
+ if (n === 0) {
389
+ break;
390
+ }
391
+ } // standard sorting
392
+
393
+
394
+ lambdas.sort(function (a, b) {
395
+ return +subtract(abs(a), abs(b));
396
+ }); // the algorithm didn't converge
397
+
398
+ if (lastConvergenceBefore > 100) {
399
+ var err = Error('The eigenvalues failed to converge. Only found these eigenvalues: ' + lambdas.join(', '));
400
+ err.values = lambdas;
401
+ err.vectors = [];
402
+ throw err;
403
+ } // combine the overall QR transformation Qtotal with the subsequent
404
+ // transformation S that turns the diagonal 2x2 blocks to upper triangular
405
+
406
+
407
+ var C = findVectors ? multiply(Qtotal, blockDiag(Sdiag, N)) : undefined;
408
+ return {
409
+ values: lambdas,
410
+ C: C
411
+ };
412
+ }
413
+ /**
414
+ * @param {Matrix} A original matrix
415
+ * @param {number} N size of A
416
+ * @param {Matrix} C column transformation matrix that turns A into upper triangular
417
+ * @param {number[]} values array of eigenvalues of A
418
+ * @returns {number[][]} eigenvalues
419
+ */
420
+
421
+
422
+ function findEigenvectors(A, N, C, values, prec) {
423
+ var Cinv = inv(C);
424
+ var U = multiply(Cinv, A, C); // turn values into a kind of "multiset"
425
+ // this way it is easier to find eigenvectors
426
+
427
+ var uniqueValues = [];
428
+ var multiplicities = [];
429
+
430
+ var _iterator = _createForOfIteratorHelper(values),
431
+ _step;
432
+
433
+ try {
434
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
435
+ var _λ = _step.value;
436
+
437
+ var _i4 = indexOf(uniqueValues, _λ, equal);
438
+
439
+ if (_i4 === -1) {
440
+ // a dirty trick that helps us find more vectors
441
+ // TODO with iterative algorithm this can be removed
442
+ // Note: the round around log10 is needed to prevent rounding off errors in IE
443
+ var rounded = round(_λ, subtract(-1, round(log10(prec))));
444
+ uniqueValues.push(rounded);
445
+ multiplicities.push(1);
446
+ } else {
447
+ multiplicities[_i4] += 1;
448
+ }
449
+ } // find eigenvectors by solving U − λE = 0
450
+ // TODO replace with an iterative eigenvector algorithm
451
+ // (this one might fail for imprecise eigenvalues)
452
+
453
+ } catch (err) {
454
+ _iterator.e(err);
455
+ } finally {
456
+ _iterator.f();
457
+ }
458
+
459
+ var vectors = [];
460
+ var len = uniqueValues.length;
461
+ var b = Array(N).fill(0);
462
+ var E = diag(Array(N).fill(1)); // eigenvalues for which usolve failed (due to numerical error)
463
+
464
+ var failedLambdas = [];
465
+
466
+ for (var i = 0; i < len; i++) {
467
+ var λ = uniqueValues[i];
468
+ var solutions = usolveAll(subtract(U, multiply(λ, E)), b);
469
+ solutions = solutions.map(function (v) {
470
+ return multiply(C, v);
471
+ });
472
+ solutions.shift(); // ignore the null vector
473
+ // looks like we missed something
474
+
475
+ if (solutions.length < multiplicities[i]) {
476
+ failedLambdas.push(λ);
477
+ }
478
+
479
+ vectors.push.apply(vectors, (0, _toConsumableArray2["default"])(solutions.map(function (v) {
480
+ return flatten(v);
481
+ })));
482
+ }
483
+
484
+ if (failedLambdas.length !== 0) {
485
+ var err = new Error('Failed to find eigenvectors for the following eigenvalues: ' + failedLambdas.join(', '));
486
+ err.values = values;
487
+ err.vectors = vectors;
488
+ throw err;
489
+ }
490
+
491
+ return vectors;
492
+ }
493
+ /**
494
+ * Compute the eigenvalues of an 2x2 matrix
495
+ * @return {[number,number]}
496
+ */
497
+
498
+
499
+ function eigenvalues2x2(a, b, c, d) {
500
+ // λ± = ½ trA ± ½ √( tr²A - 4 detA )
501
+ var trA = addScalar(a, d);
502
+ var detA = subtract(multiplyScalar(a, d), multiplyScalar(b, c));
503
+ var x = multiplyScalar(trA, 0.5);
504
+ var y = multiplyScalar(sqrt(subtract(multiplyScalar(trA, trA), multiplyScalar(4, detA))), 0.5);
505
+ return [addScalar(x, y), subtract(x, y)];
506
+ }
507
+ /**
508
+ * For an 2x2 matrix compute the transformation matrix S,
509
+ * so that SAS⁻¹ is an upper triangular matrix
510
+ * @return {[[number,number],[number,number]]}
511
+ * @see https://math.berkeley.edu/~ogus/old/Math_54-05/webfoils/jordan.pdf
512
+ * @see http://people.math.harvard.edu/~knill/teaching/math21b2004/exhibits/2dmatrices/index.html
513
+ */
514
+
515
+
516
+ function jordanBase2x2(a, b, c, d, l1, l2, prec, type) {
517
+ var big = type === 'BigNumber';
518
+ var cplx = type === 'Complex';
519
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
520
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1; // matrix is already upper triangular
521
+ // return an identity matrix
522
+
523
+ if (smaller(abs(c), prec)) {
524
+ return [[one, zero], [zero, one]];
525
+ } // matrix is diagonalizable
526
+ // return its eigenvectors as columns
527
+
528
+
529
+ if (larger(abs(subtract(l1, l2)), prec)) {
530
+ return [[subtract(l1, d), subtract(l2, d)], [c, c]];
531
+ } // matrix is not diagonalizable
532
+ // compute off-diagonal elements of N = A - λI
533
+ // N₁₂ = 0 ⇒ S = ( N⃗₁, I⃗₁ )
534
+ // N₁₂ ≠ 0 ⇒ S = ( N⃗₂, I⃗₂ )
535
+
536
+
537
+ var na = subtract(a, l1);
538
+ var nb = subtract(b, l1);
539
+ var nc = subtract(c, l1);
540
+ var nd = subtract(d, l1);
541
+
542
+ if (smaller(abs(nb), prec)) {
543
+ return [[na, one], [nc, zero]];
544
+ } else {
545
+ return [[nb, zero], [nd, one]];
546
+ }
547
+ }
548
+ /**
549
+ * Enlarge the matrix from n×n to N×N, setting the new
550
+ * elements to 1 on diagonal and 0 elsewhere
551
+ */
552
+
553
+
554
+ function inflateMatrix(arr, N) {
555
+ // add columns
556
+ for (var i = 0; i < arr.length; i++) {
557
+ var _arr$i;
558
+
559
+ (_arr$i = arr[i]).push.apply(_arr$i, (0, _toConsumableArray2["default"])(Array(N - arr[i].length).fill(0)));
560
+ } // add rows
561
+
562
+
563
+ for (var _i5 = arr.length; _i5 < N; _i5++) {
564
+ arr.push(Array(N).fill(0));
565
+ arr[_i5][_i5] = 1;
566
+ }
567
+
568
+ return arr;
569
+ }
570
+ /**
571
+ * Create a block-diagonal matrix with the given square matrices on the diagonal
572
+ * @param {Matrix[] | number[][][]} arr array of matrices to be placed on the diagonal
573
+ * @param {number} N the size of the resulting matrix
574
+ */
575
+
576
+
577
+ function blockDiag(arr, N) {
578
+ var M = [];
579
+
580
+ for (var i = 0; i < N; i++) {
581
+ M[i] = Array(N).fill(0);
582
+ }
583
+
584
+ var I = 0;
585
+
586
+ var _iterator2 = _createForOfIteratorHelper(arr),
587
+ _step2;
588
+
589
+ try {
590
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
591
+ var sub = _step2.value;
592
+ var n = sub.length;
593
+
594
+ for (var _i6 = 0; _i6 < n; _i6++) {
595
+ for (var j = 0; j < n; j++) {
596
+ M[I + _i6][I + j] = sub[_i6][j];
597
+ }
598
+ }
599
+
600
+ I += n;
601
+ }
602
+ } catch (err) {
603
+ _iterator2.e(err);
604
+ } finally {
605
+ _iterator2.f();
606
+ }
607
+
608
+ return M;
609
+ }
610
+ /**
611
+ * Finds the index of an element in an array using a custom equality function
612
+ * @template T
613
+ * @param {Array<T>} arr array in which to search
614
+ * @param {T} el the element to find
615
+ * @param {function(T, T): boolean} fn the equality function, first argument is an element of `arr`, the second is always `el`
616
+ * @returns {number} the index of `el`, or -1 when it's not in `arr`
617
+ */
618
+
619
+
620
+ function indexOf(arr, el, fn) {
621
+ for (var i = 0; i < arr.length; i++) {
622
+ if (fn(arr[i], el)) {
623
+ return i;
624
+ }
625
+ }
626
+
627
+ return -1;
628
+ }
629
+
630
+ return complexEigs;
631
+ }