tomoto 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +8 -10
  4. data/ext/tomoto/ct.cpp +11 -11
  5. data/ext/tomoto/dmr.cpp +14 -13
  6. data/ext/tomoto/dt.cpp +14 -14
  7. data/ext/tomoto/extconf.rb +7 -5
  8. data/ext/tomoto/gdmr.cpp +7 -7
  9. data/ext/tomoto/hdp.cpp +9 -9
  10. data/ext/tomoto/hlda.cpp +13 -13
  11. data/ext/tomoto/hpa.cpp +5 -5
  12. data/ext/tomoto/lda.cpp +42 -39
  13. data/ext/tomoto/llda.cpp +6 -6
  14. data/ext/tomoto/mglda.cpp +15 -15
  15. data/ext/tomoto/pa.cpp +6 -6
  16. data/ext/tomoto/plda.cpp +6 -6
  17. data/ext/tomoto/slda.cpp +8 -8
  18. data/ext/tomoto/{ext.cpp → tomoto.cpp} +8 -8
  19. data/ext/tomoto/utils.h +16 -70
  20. data/lib/tomoto/version.rb +1 -1
  21. data/lib/tomoto.rb +5 -1
  22. data/vendor/EigenRand/EigenRand/Core.h +10 -10
  23. data/vendor/EigenRand/EigenRand/Dists/Basic.h +208 -9
  24. data/vendor/EigenRand/EigenRand/Dists/Discrete.h +52 -31
  25. data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +9 -8
  26. data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +28 -21
  27. data/vendor/EigenRand/EigenRand/EigenRand +11 -6
  28. data/vendor/EigenRand/EigenRand/Macro.h +13 -7
  29. data/vendor/EigenRand/EigenRand/MorePacketMath.h +348 -740
  30. data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +5 -3
  31. data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +9 -3
  32. data/vendor/EigenRand/EigenRand/PacketFilter.h +11 -253
  33. data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +21 -47
  34. data/vendor/EigenRand/EigenRand/RandUtils.h +50 -344
  35. data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +619 -0
  36. data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +149 -0
  37. data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +228 -0
  38. data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +473 -0
  39. data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +142 -0
  40. data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +126 -0
  41. data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +501 -0
  42. data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +133 -0
  43. data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +120 -0
  44. data/vendor/EigenRand/EigenRand/doc.h +24 -12
  45. data/vendor/EigenRand/README.md +57 -4
  46. data/vendor/eigen/COPYING.APACHE +203 -0
  47. data/vendor/eigen/COPYING.BSD +1 -1
  48. data/vendor/eigen/COPYING.MINPACK +51 -52
  49. data/vendor/eigen/Eigen/Cholesky +0 -1
  50. data/vendor/eigen/Eigen/Core +112 -265
  51. data/vendor/eigen/Eigen/Eigenvalues +2 -3
  52. data/vendor/eigen/Eigen/Geometry +5 -8
  53. data/vendor/eigen/Eigen/Householder +0 -1
  54. data/vendor/eigen/Eigen/Jacobi +0 -1
  55. data/vendor/eigen/Eigen/KLUSupport +41 -0
  56. data/vendor/eigen/Eigen/LU +2 -5
  57. data/vendor/eigen/Eigen/OrderingMethods +0 -3
  58. data/vendor/eigen/Eigen/PaStiXSupport +1 -0
  59. data/vendor/eigen/Eigen/PardisoSupport +0 -0
  60. data/vendor/eigen/Eigen/QR +2 -3
  61. data/vendor/eigen/Eigen/QtAlignedMalloc +0 -1
  62. data/vendor/eigen/Eigen/SVD +0 -1
  63. data/vendor/eigen/Eigen/Sparse +0 -2
  64. data/vendor/eigen/Eigen/SparseCholesky +0 -8
  65. data/vendor/eigen/Eigen/SparseLU +4 -0
  66. data/vendor/eigen/Eigen/SparseQR +0 -1
  67. data/vendor/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
  68. data/vendor/eigen/Eigen/src/Cholesky/LLT.h +39 -23
  69. data/vendor/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
  70. data/vendor/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
  71. data/vendor/eigen/Eigen/src/Core/Array.h +99 -11
  72. data/vendor/eigen/Eigen/src/Core/ArrayBase.h +3 -3
  73. data/vendor/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
  74. data/vendor/eigen/Eigen/src/Core/Assign.h +1 -1
  75. data/vendor/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
  76. data/vendor/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
  77. data/vendor/eigen/Eigen/src/Core/BandMatrix.h +16 -16
  78. data/vendor/eigen/Eigen/src/Core/Block.h +56 -60
  79. data/vendor/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
  80. data/vendor/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
  81. data/vendor/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
  82. data/vendor/eigen/Eigen/src/Core/CoreIterators.h +5 -0
  83. data/vendor/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
  84. data/vendor/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
  85. data/vendor/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
  86. data/vendor/eigen/Eigen/src/Core/CwiseUnaryView.h +14 -10
  87. data/vendor/eigen/Eigen/src/Core/DenseBase.h +132 -42
  88. data/vendor/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
  89. data/vendor/eigen/Eigen/src/Core/DenseStorage.h +153 -71
  90. data/vendor/eigen/Eigen/src/Core/Diagonal.h +21 -23
  91. data/vendor/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
  92. data/vendor/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
  93. data/vendor/eigen/Eigen/src/Core/Dot.h +10 -10
  94. data/vendor/eigen/Eigen/src/Core/EigenBase.h +10 -9
  95. data/vendor/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
  96. data/vendor/eigen/Eigen/src/Core/Fuzzy.h +3 -3
  97. data/vendor/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
  98. data/vendor/eigen/Eigen/src/Core/GenericPacketMath.h +599 -152
  99. data/vendor/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
  100. data/vendor/eigen/Eigen/src/Core/IO.h +40 -7
  101. data/vendor/eigen/Eigen/src/Core/IndexedView.h +237 -0
  102. data/vendor/eigen/Eigen/src/Core/Inverse.h +9 -10
  103. data/vendor/eigen/Eigen/src/Core/Map.h +7 -7
  104. data/vendor/eigen/Eigen/src/Core/MapBase.h +10 -3
  105. data/vendor/eigen/Eigen/src/Core/MathFunctions.h +767 -125
  106. data/vendor/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
  107. data/vendor/eigen/Eigen/src/Core/Matrix.h +131 -25
  108. data/vendor/eigen/Eigen/src/Core/MatrixBase.h +21 -3
  109. data/vendor/eigen/Eigen/src/Core/NestByValue.h +25 -50
  110. data/vendor/eigen/Eigen/src/Core/NoAlias.h +4 -3
  111. data/vendor/eigen/Eigen/src/Core/NumTraits.h +107 -20
  112. data/vendor/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  113. data/vendor/eigen/Eigen/src/Core/PermutationMatrix.h +3 -31
  114. data/vendor/eigen/Eigen/src/Core/PlainObjectBase.h +152 -59
  115. data/vendor/eigen/Eigen/src/Core/Product.h +30 -25
  116. data/vendor/eigen/Eigen/src/Core/ProductEvaluators.h +192 -125
  117. data/vendor/eigen/Eigen/src/Core/Random.h +37 -1
  118. data/vendor/eigen/Eigen/src/Core/Redux.h +180 -170
  119. data/vendor/eigen/Eigen/src/Core/Ref.h +121 -23
  120. data/vendor/eigen/Eigen/src/Core/Replicate.h +8 -8
  121. data/vendor/eigen/Eigen/src/Core/Reshaped.h +454 -0
  122. data/vendor/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
  123. data/vendor/eigen/Eigen/src/Core/Reverse.h +18 -12
  124. data/vendor/eigen/Eigen/src/Core/Select.h +8 -6
  125. data/vendor/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
  126. data/vendor/eigen/Eigen/src/Core/Solve.h +14 -14
  127. data/vendor/eigen/Eigen/src/Core/SolveTriangular.h +16 -16
  128. data/vendor/eigen/Eigen/src/Core/SolverBase.h +41 -3
  129. data/vendor/eigen/Eigen/src/Core/StableNorm.h +100 -70
  130. data/vendor/eigen/Eigen/src/Core/StlIterators.h +463 -0
  131. data/vendor/eigen/Eigen/src/Core/Stride.h +9 -4
  132. data/vendor/eigen/Eigen/src/Core/Swap.h +5 -4
  133. data/vendor/eigen/Eigen/src/Core/Transpose.h +88 -27
  134. data/vendor/eigen/Eigen/src/Core/Transpositions.h +26 -47
  135. data/vendor/eigen/Eigen/src/Core/TriangularMatrix.h +93 -75
  136. data/vendor/eigen/Eigen/src/Core/VectorBlock.h +5 -5
  137. data/vendor/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
  138. data/vendor/eigen/Eigen/src/Core/Visitor.h +137 -29
  139. data/vendor/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
  140. data/vendor/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
  141. data/vendor/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
  142. data/vendor/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
  143. data/vendor/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  144. data/vendor/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +207 -236
  145. data/vendor/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1482 -495
  146. data/vendor/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  147. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
  148. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
  149. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  150. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  151. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  152. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
  153. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
  154. data/vendor/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  155. data/vendor/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
  156. data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  157. data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  158. data/vendor/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
  159. data/vendor/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
  160. data/vendor/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  161. data/vendor/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
  162. data/vendor/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  163. data/vendor/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  164. data/vendor/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  165. data/vendor/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  166. data/vendor/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  167. data/vendor/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  168. data/vendor/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
  169. data/vendor/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  170. data/vendor/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
  171. data/vendor/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
  172. data/vendor/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  173. data/vendor/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
  174. data/vendor/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
  175. data/vendor/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
  176. data/vendor/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
  177. data/vendor/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  178. data/vendor/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  179. data/vendor/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  180. data/vendor/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  181. data/vendor/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  182. data/vendor/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  183. data/vendor/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  184. data/vendor/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  185. data/vendor/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
  186. data/vendor/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
  187. data/vendor/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
  188. data/vendor/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
  189. data/vendor/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
  190. data/vendor/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
  191. data/vendor/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
  192. data/vendor/eigen/Eigen/src/Core/functors/UnaryFunctors.h +355 -16
  193. data/vendor/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1075 -586
  194. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +49 -24
  195. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +41 -35
  196. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +6 -6
  197. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +4 -2
  198. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
  199. data/vendor/eigen/Eigen/src/Core/products/Parallelizer.h +22 -5
  200. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +53 -30
  201. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +16 -8
  202. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
  203. data/vendor/eigen/Eigen/src/Core/products/SelfadjointProduct.h +4 -4
  204. data/vendor/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
  205. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +33 -27
  206. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +14 -12
  207. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +36 -34
  208. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +8 -4
  209. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
  210. data/vendor/eigen/Eigen/src/Core/util/BlasUtil.h +304 -119
  211. data/vendor/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  212. data/vendor/eigen/Eigen/src/Core/util/Constants.h +25 -9
  213. data/vendor/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +26 -3
  214. data/vendor/eigen/Eigen/src/Core/util/ForwardDeclarations.h +29 -9
  215. data/vendor/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  216. data/vendor/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
  217. data/vendor/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
  218. data/vendor/eigen/Eigen/src/Core/util/Macros.h +709 -246
  219. data/vendor/eigen/Eigen/src/Core/util/Memory.h +222 -52
  220. data/vendor/eigen/Eigen/src/Core/util/Meta.h +355 -77
  221. data/vendor/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +5 -1
  222. data/vendor/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  223. data/vendor/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
  224. data/vendor/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  225. data/vendor/eigen/Eigen/src/Core/util/XprHelper.h +65 -30
  226. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
  227. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +7 -4
  228. data/vendor/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
  229. data/vendor/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
  230. data/vendor/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
  231. data/vendor/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
  232. data/vendor/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
  233. data/vendor/eigen/Eigen/src/Eigenvalues/RealSchur.h +21 -9
  234. data/vendor/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +77 -43
  235. data/vendor/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
  236. data/vendor/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
  237. data/vendor/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
  238. data/vendor/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
  239. data/vendor/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
  240. data/vendor/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
  241. data/vendor/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
  242. data/vendor/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
  243. data/vendor/eigen/Eigen/src/Geometry/Quaternion.h +70 -14
  244. data/vendor/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
  245. data/vendor/eigen/Eigen/src/Geometry/Scaling.h +23 -5
  246. data/vendor/eigen/Eigen/src/Geometry/Transform.h +88 -67
  247. data/vendor/eigen/Eigen/src/Geometry/Translation.h +6 -12
  248. data/vendor/eigen/Eigen/src/Geometry/Umeyama.h +1 -1
  249. data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  250. data/vendor/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
  251. data/vendor/eigen/Eigen/src/Householder/Householder.h +8 -4
  252. data/vendor/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
  253. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
  254. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
  255. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
  256. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
  257. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
  258. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
  259. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
  260. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
  261. data/vendor/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
  262. data/vendor/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  263. data/vendor/eigen/Eigen/src/LU/Determinant.h +35 -19
  264. data/vendor/eigen/Eigen/src/LU/FullPivLU.h +29 -43
  265. data/vendor/eigen/Eigen/src/LU/InverseImpl.h +25 -8
  266. data/vendor/eigen/Eigen/src/LU/PartialPivLU.h +71 -58
  267. data/vendor/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
  268. data/vendor/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
  269. data/vendor/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
  270. data/vendor/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
  271. data/vendor/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
  272. data/vendor/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +9 -7
  273. data/vendor/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
  274. data/vendor/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
  275. data/vendor/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
  276. data/vendor/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
  277. data/vendor/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
  278. data/vendor/eigen/Eigen/src/SVD/BDCSVD.h +183 -63
  279. data/vendor/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
  280. data/vendor/eigen/Eigen/src/SVD/SVDBase.h +83 -22
  281. data/vendor/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
  282. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +17 -9
  283. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +12 -37
  284. data/vendor/eigen/Eigen/src/SparseCore/AmbiVector.h +3 -2
  285. data/vendor/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
  286. data/vendor/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
  287. data/vendor/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
  288. data/vendor/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
  289. data/vendor/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
  290. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
  291. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +4 -2
  292. data/vendor/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
  293. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrix.h +126 -11
  294. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
  295. data/vendor/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
  296. data/vendor/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
  297. data/vendor/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +5 -2
  298. data/vendor/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
  299. data/vendor/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
  300. data/vendor/eigen/Eigen/src/SparseCore/SparseView.h +1 -0
  301. data/vendor/eigen/Eigen/src/SparseLU/SparseLU.h +162 -12
  302. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
  303. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
  304. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
  305. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
  306. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
  307. data/vendor/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
  308. data/vendor/eigen/Eigen/src/StlSupport/StdDeque.h +2 -12
  309. data/vendor/eigen/Eigen/src/StlSupport/StdList.h +2 -2
  310. data/vendor/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
  311. data/vendor/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
  312. data/vendor/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
  313. data/vendor/eigen/Eigen/src/misc/lapacke.h +5 -4
  314. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +28 -2
  315. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
  316. data/vendor/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
  317. data/vendor/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
  318. data/vendor/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  319. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
  320. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
  321. data/vendor/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
  322. data/vendor/eigen/README.md +2 -0
  323. data/vendor/eigen/bench/btl/README +1 -1
  324. data/vendor/eigen/bench/tensors/README +6 -7
  325. data/vendor/eigen/ci/README.md +56 -0
  326. data/vendor/eigen/demos/mix_eigen_and_c/README +1 -1
  327. data/vendor/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +213 -158
  328. data/vendor/eigen/unsupported/README.txt +1 -1
  329. data/vendor/tomotopy/README.kr.rst +78 -0
  330. data/vendor/tomotopy/README.rst +75 -0
  331. data/vendor/tomotopy/src/Labeling/FoRelevance.cpp +2 -2
  332. data/vendor/tomotopy/src/Labeling/Phraser.hpp +4 -4
  333. data/vendor/tomotopy/src/TopicModel/CTModel.hpp +7 -3
  334. data/vendor/tomotopy/src/TopicModel/DMRModel.hpp +7 -3
  335. data/vendor/tomotopy/src/TopicModel/DTModel.hpp +6 -3
  336. data/vendor/tomotopy/src/TopicModel/GDMRModel.hpp +2 -2
  337. data/vendor/tomotopy/src/TopicModel/HDP.h +1 -0
  338. data/vendor/tomotopy/src/TopicModel/HDPModel.hpp +57 -6
  339. data/vendor/tomotopy/src/TopicModel/HLDAModel.hpp +6 -3
  340. data/vendor/tomotopy/src/TopicModel/HPAModel.hpp +3 -2
  341. data/vendor/tomotopy/src/TopicModel/LDA.h +3 -3
  342. data/vendor/tomotopy/src/TopicModel/LDACVB0Model.hpp +5 -5
  343. data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +50 -19
  344. data/vendor/tomotopy/src/TopicModel/LLDAModel.hpp +6 -2
  345. data/vendor/tomotopy/src/TopicModel/MGLDAModel.hpp +3 -2
  346. data/vendor/tomotopy/src/TopicModel/PAModel.hpp +1 -1
  347. data/vendor/tomotopy/src/TopicModel/PLDAModel.hpp +6 -2
  348. data/vendor/tomotopy/src/TopicModel/PT.h +3 -1
  349. data/vendor/tomotopy/src/TopicModel/PTModel.hpp +36 -3
  350. data/vendor/tomotopy/src/TopicModel/SLDAModel.hpp +6 -3
  351. data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +55 -26
  352. data/vendor/tomotopy/src/Utils/AliasMethod.hpp +5 -4
  353. data/vendor/tomotopy/src/Utils/Dictionary.h +2 -2
  354. data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +36 -1
  355. data/vendor/tomotopy/src/Utils/MultiNormalDistribution.hpp +1 -1
  356. data/vendor/tomotopy/src/Utils/TruncMultiNormal.hpp +1 -1
  357. data/vendor/tomotopy/src/Utils/exception.h +6 -0
  358. data/vendor/tomotopy/src/Utils/math.h +2 -2
  359. data/vendor/tomotopy/src/Utils/sample.hpp +14 -12
  360. data/vendor/tomotopy/src/Utils/serializer.hpp +30 -5
  361. data/vendor/tomotopy/src/Utils/sse_gamma.h +0 -3
  362. metadata +64 -18
  363. data/vendor/eigen/Eigen/CMakeLists.txt +0 -19
  364. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -674
  365. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  366. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  367. data/vendor/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  368. data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  369. data/vendor/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
@@ -267,7 +267,7 @@ template<typename _MatrixType> class HessenbergDecomposition
267
267
 
268
268
  private:
269
269
 
270
- typedef Matrix<Scalar, 1, Size, Options | RowMajor, 1, MaxSize> VectorType;
270
+ typedef Matrix<Scalar, 1, Size, int(Options) | int(RowMajor), 1, MaxSize> VectorType;
271
271
  typedef typename NumTraits<Scalar>::Real RealScalar;
272
272
  static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);
273
273
 
@@ -315,7 +315,7 @@ void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVector
315
315
 
316
316
  // A = A H'
317
317
  matA.rightCols(remainingSize)
318
- .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1).conjugate(), numext::conj(h), &temp.coeffRef(0));
318
+ .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1), numext::conj(h), &temp.coeffRef(0));
319
319
  }
320
320
  }
321
321
 
@@ -84,7 +84,7 @@ MatrixBase<Derived>::eigenvalues() const
84
84
  * \sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()
85
85
  */
86
86
  template<typename MatrixType, unsigned int UpLo>
87
- inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
87
+ EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
88
88
  SelfAdjointView<MatrixType, UpLo>::eigenvalues() const
89
89
  {
90
90
  PlainObject thisAsMatrix(*this);
@@ -147,7 +147,7 @@ MatrixBase<Derived>::operatorNorm() const
147
147
  * \sa eigenvalues(), MatrixBase::operatorNorm()
148
148
  */
149
149
  template<typename MatrixType, unsigned int UpLo>
150
- inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
150
+ EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
151
151
  SelfAdjointView<MatrixType, UpLo>::operatorNorm() const
152
152
  {
153
153
  return eigenvalues().cwiseAbs().maxCoeff();
@@ -90,8 +90,9 @@ namespace Eigen {
90
90
  m_Z(size, size),
91
91
  m_workspace(size*2),
92
92
  m_maxIters(400),
93
- m_isInitialized(false)
94
- { }
93
+ m_isInitialized(false),
94
+ m_computeQZ(true)
95
+ {}
95
96
 
96
97
  /** \brief Constructor; computes real QZ decomposition of given matrices
97
98
  *
@@ -108,9 +109,11 @@ namespace Eigen {
108
109
  m_Z(A.rows(),A.cols()),
109
110
  m_workspace(A.rows()*2),
110
111
  m_maxIters(400),
111
- m_isInitialized(false) {
112
- compute(A, B, computeQZ);
113
- }
112
+ m_isInitialized(false),
113
+ m_computeQZ(true)
114
+ {
115
+ compute(A, B, computeQZ);
116
+ }
114
117
 
115
118
  /** \brief Returns matrix Q in the QZ decomposition.
116
119
  *
@@ -161,7 +164,7 @@ namespace Eigen {
161
164
 
162
165
  /** \brief Reports whether previous computation was successful.
163
166
  *
164
- * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
167
+ * \returns \c Success if computation was successful, \c NoConvergence otherwise.
165
168
  */
166
169
  ComputationInfo info() const
167
170
  {
@@ -190,7 +190,7 @@ template<typename _MatrixType> class RealSchur
190
190
  RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
191
191
  /** \brief Reports whether previous computation was successful.
192
192
  *
193
- * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
193
+ * \returns \c Success if computation was successful, \c NoConvergence otherwise.
194
194
  */
195
195
  ComputationInfo info() const
196
196
  {
@@ -236,7 +236,7 @@ template<typename _MatrixType> class RealSchur
236
236
  typedef Matrix<Scalar,3,1> Vector3s;
237
237
 
238
238
  Scalar computeNormOfT();
239
- Index findSmallSubdiagEntry(Index iu);
239
+ Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
240
240
  void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
241
241
  void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
242
242
  void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
@@ -270,8 +270,13 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>
270
270
  // Step 1. Reduce to Hessenberg form
271
271
  m_hess.compute(matrix.derived()/scale);
272
272
 
273
- // Step 2. Reduce to real Schur form
274
- computeFromHessenberg(m_hess.matrixH(), m_hess.matrixQ(), computeU);
273
+ // Step 2. Reduce to real Schur form
274
+ // Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
275
+ // to be able to pass our working-space buffer for the Householder to Dense evaluation.
276
+ m_workspaceVector.resize(matrix.cols());
277
+ if(computeU)
278
+ m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
279
+ computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
275
280
 
276
281
  m_matT *= scale;
277
282
 
@@ -284,13 +289,13 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
284
289
  using std::abs;
285
290
 
286
291
  m_matT = matrixH;
287
- if(computeU)
292
+ m_workspaceVector.resize(m_matT.cols());
293
+ if(computeU && !internal::is_same_dense(m_matU,matrixQ))
288
294
  m_matU = matrixQ;
289
295
 
290
296
  Index maxIters = m_maxIters;
291
297
  if (maxIters == -1)
292
298
  maxIters = m_maxIterationsPerRow * matrixH.rows();
293
- m_workspaceVector.resize(m_matT.cols());
294
299
  Scalar* workspace = &m_workspaceVector.coeffRef(0);
295
300
 
296
301
  // The matrix m_matT is divided in three parts.
@@ -302,12 +307,16 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
302
307
  Index totalIter = 0; // iteration count for whole matrix
303
308
  Scalar exshift(0); // sum of exceptional shifts
304
309
  Scalar norm = computeNormOfT();
310
+ // sub-diagonal entries smaller than considerAsZero will be treated as zero.
311
+ // We use eps^2 to enable more precision in small eigenvalues.
312
+ Scalar considerAsZero = numext::maxi<Scalar>( norm * numext::abs2(NumTraits<Scalar>::epsilon()),
313
+ (std::numeric_limits<Scalar>::min)() );
305
314
 
306
315
  if(norm!=Scalar(0))
307
316
  {
308
317
  while (iu >= 0)
309
318
  {
310
- Index il = findSmallSubdiagEntry(iu);
319
+ Index il = findSmallSubdiagEntry(iu,considerAsZero);
311
320
 
312
321
  // Check for convergence
313
322
  if (il == iu) // One root found
@@ -364,14 +373,17 @@ inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
364
373
 
365
374
  /** \internal Look for single small sub-diagonal element and returns its index */
366
375
  template<typename MatrixType>
367
- inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu)
376
+ inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
368
377
  {
369
378
  using std::abs;
370
379
  Index res = iu;
371
380
  while (res > 0)
372
381
  {
373
382
  Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
374
- if (abs(m_matT.coeff(res,res-1)) <= NumTraits<Scalar>::epsilon() * s)
383
+
384
+ s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
385
+
386
+ if (abs(m_matT.coeff(res,res-1)) <= s)
375
387
  break;
376
388
  res--;
377
389
  }
@@ -20,7 +20,9 @@ class GeneralizedSelfAdjointEigenSolver;
20
20
 
21
21
  namespace internal {
22
22
  template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;
23
+
23
24
  template<typename MatrixType, typename DiagType, typename SubDiagType>
25
+ EIGEN_DEVICE_FUNC
24
26
  ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec);
25
27
  }
26
28
 
@@ -42,10 +44,14 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
42
44
  * \f$ v \f$ such that \f$ Av = \lambda v \f$. The eigenvalues of a
43
45
  * selfadjoint matrix are always real. If \f$ D \f$ is a diagonal matrix with
44
46
  * the eigenvalues on the diagonal, and \f$ V \f$ is a matrix with the
45
- * eigenvectors as its columns, then \f$ A = V D V^{-1} \f$ (for selfadjoint
46
- * matrices, the matrix \f$ V \f$ is always invertible). This is called the
47
+ * eigenvectors as its columns, then \f$ A = V D V^{-1} \f$. This is called the
47
48
  * eigendecomposition.
48
49
  *
50
+ * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
51
+ * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
52
+ * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
53
+ * equal to its transpose, \f$ V^{-1} = V^T \f$.
54
+ *
49
55
  * The algorithm exploits the fact that the matrix is selfadjoint, making it
50
56
  * faster and more accurate than the general purpose eigenvalue algorithms
51
57
  * implemented in EigenSolver and ComplexEigenSolver.
@@ -119,7 +125,10 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
119
125
  : m_eivec(),
120
126
  m_eivalues(),
121
127
  m_subdiag(),
122
- m_isInitialized(false)
128
+ m_hcoeffs(),
129
+ m_info(InvalidInput),
130
+ m_isInitialized(false),
131
+ m_eigenvectorsOk(false)
123
132
  { }
124
133
 
125
134
  /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
@@ -139,7 +148,9 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
139
148
  : m_eivec(size, size),
140
149
  m_eivalues(size),
141
150
  m_subdiag(size > 1 ? size - 1 : 1),
142
- m_isInitialized(false)
151
+ m_hcoeffs(size > 1 ? size - 1 : 1),
152
+ m_isInitialized(false),
153
+ m_eigenvectorsOk(false)
143
154
  {}
144
155
 
145
156
  /** \brief Constructor; computes eigendecomposition of given matrix.
@@ -163,7 +174,9 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
163
174
  : m_eivec(matrix.rows(), matrix.cols()),
164
175
  m_eivalues(matrix.cols()),
165
176
  m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
166
- m_isInitialized(false)
177
+ m_hcoeffs(matrix.cols() > 1 ? matrix.cols() - 1 : 1),
178
+ m_isInitialized(false),
179
+ m_eigenvectorsOk(false)
167
180
  {
168
181
  compute(matrix.derived(), options);
169
182
  }
@@ -250,6 +263,11 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
250
263
  * matrix \f$ A \f$, then the matrix returned by this function is the
251
264
  * matrix \f$ V \f$ in the eigendecomposition \f$ A = V D V^{-1} \f$.
252
265
  *
266
+ * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
267
+ * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
268
+ * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
269
+ * equal to its transpose, \f$ V^{-1} = V^T \f$.
270
+ *
253
271
  * Example: \include SelfAdjointEigenSolver_eigenvectors.cpp
254
272
  * Output: \verbinclude SelfAdjointEigenSolver_eigenvectors.out
255
273
  *
@@ -337,7 +355,7 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
337
355
 
338
356
  /** \brief Reports whether previous computation was successful.
339
357
  *
340
- * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
358
+ * \returns \c Success if computation was successful, \c NoConvergence otherwise.
341
359
  */
342
360
  EIGEN_DEVICE_FUNC
343
361
  ComputationInfo info() const
@@ -354,7 +372,8 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
354
372
  static const int m_maxIterations = 30;
355
373
 
356
374
  protected:
357
- static void check_template_parameters()
375
+ static EIGEN_DEVICE_FUNC
376
+ void check_template_parameters()
358
377
  {
359
378
  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
360
379
  }
@@ -362,6 +381,7 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
362
381
  EigenvectorsType m_eivec;
363
382
  RealVectorType m_eivalues;
364
383
  typename TridiagonalizationType::SubDiagonalType m_subdiag;
384
+ typename TridiagonalizationType::CoeffVectorType m_hcoeffs;
365
385
  ComputationInfo m_info;
366
386
  bool m_isInitialized;
367
387
  bool m_eigenvectorsOk;
@@ -403,7 +423,7 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
403
423
 
404
424
  const InputType &matrix(a_matrix.derived());
405
425
 
406
- using std::abs;
426
+ EIGEN_USING_STD(abs);
407
427
  eigen_assert(matrix.cols() == matrix.rows());
408
428
  eigen_assert((options&~(EigVecMask|GenEigMask))==0
409
429
  && (options&EigVecMask)!=EigVecMask
@@ -434,7 +454,8 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
434
454
  if(scale==RealScalar(0)) scale = RealScalar(1);
435
455
  mat.template triangularView<Lower>() /= scale;
436
456
  m_subdiag.resize(n-1);
437
- internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);
457
+ m_hcoeffs.resize(n-1);
458
+ internal::tridiagonalization_inplace(mat, diag, m_subdiag, m_hcoeffs, computeEigenvectors);
438
459
 
439
460
  m_info = internal::computeFromTridiagonal_impl(diag, m_subdiag, m_maxIterations, computeEigenvectors, m_eivec);
440
461
 
@@ -479,10 +500,9 @@ namespace internal {
479
500
  * \returns \c Success or \c NoConvergence
480
501
  */
481
502
  template<typename MatrixType, typename DiagType, typename SubDiagType>
503
+ EIGEN_DEVICE_FUNC
482
504
  ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec)
483
505
  {
484
- using std::abs;
485
-
486
506
  ComputationInfo info;
487
507
  typedef typename MatrixType::Scalar Scalar;
488
508
 
@@ -493,15 +513,23 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
493
513
 
494
514
  typedef typename DiagType::RealScalar RealScalar;
495
515
  const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
496
- const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
497
-
516
+ const RealScalar precision_inv = RealScalar(1)/NumTraits<RealScalar>::epsilon();
498
517
  while (end>0)
499
518
  {
500
- for (Index i = start; i<end; ++i)
501
- if (internal::isMuchSmallerThan(abs(subdiag[i]),(abs(diag[i])+abs(diag[i+1])),precision) || abs(subdiag[i]) <= considerAsZero)
502
- subdiag[i] = 0;
519
+ for (Index i = start; i<end; ++i) {
520
+ if (numext::abs(subdiag[i]) < considerAsZero) {
521
+ subdiag[i] = RealScalar(0);
522
+ } else {
523
+ // abs(subdiag[i]) <= epsilon * sqrt(abs(diag[i]) + abs(diag[i+1]))
524
+ // Scaled to prevent underflows.
525
+ const RealScalar scaled_subdiag = precision_inv * subdiag[i];
526
+ if (scaled_subdiag * scaled_subdiag <= (numext::abs(diag[i])+numext::abs(diag[i+1]))) {
527
+ subdiag[i] = RealScalar(0);
528
+ }
529
+ }
530
+ }
503
531
 
504
- // find the largest unreduced block
532
+ // find the largest unreduced block at the end of the matrix.
505
533
  while (end>0 && subdiag[end-1]==RealScalar(0))
506
534
  {
507
535
  end--;
@@ -535,7 +563,7 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
535
563
  diag.segment(i,n-i).minCoeff(&k);
536
564
  if (k > 0)
537
565
  {
538
- std::swap(diag[i], diag[k+i]);
566
+ numext::swap(diag[i], diag[k+i]);
539
567
  if(computeEigenvectors)
540
568
  eivec.col(i).swap(eivec.col(k+i));
541
569
  }
@@ -566,10 +594,10 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
566
594
  EIGEN_DEVICE_FUNC
567
595
  static inline void computeRoots(const MatrixType& m, VectorType& roots)
568
596
  {
569
- EIGEN_USING_STD_MATH(sqrt)
570
- EIGEN_USING_STD_MATH(atan2)
571
- EIGEN_USING_STD_MATH(cos)
572
- EIGEN_USING_STD_MATH(sin)
597
+ EIGEN_USING_STD(sqrt)
598
+ EIGEN_USING_STD(atan2)
599
+ EIGEN_USING_STD(cos)
600
+ EIGEN_USING_STD(sin)
573
601
  const Scalar s_inv3 = Scalar(1)/Scalar(3);
574
602
  const Scalar s_sqrt3 = sqrt(Scalar(3));
575
603
 
@@ -605,7 +633,8 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
605
633
  EIGEN_DEVICE_FUNC
606
634
  static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative)
607
635
  {
608
- using std::abs;
636
+ EIGEN_USING_STD(abs);
637
+ EIGEN_USING_STD(sqrt);
609
638
  Index i0;
610
639
  // Find non-zero column i0 (by construction, there must exist a non zero coefficient on the diagonal):
611
640
  mat.diagonal().cwiseAbs().maxCoeff(&i0);
@@ -616,8 +645,8 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
616
645
  VectorType c0, c1;
617
646
  n0 = (c0 = representative.cross(mat.col((i0+1)%3))).squaredNorm();
618
647
  n1 = (c1 = representative.cross(mat.col((i0+2)%3))).squaredNorm();
619
- if(n0>n1) res = c0/std::sqrt(n0);
620
- else res = c1/std::sqrt(n1);
648
+ if(n0>n1) res = c0/sqrt(n0);
649
+ else res = c1/sqrt(n1);
621
650
 
622
651
  return true;
623
652
  }
@@ -719,7 +748,7 @@ struct direct_selfadjoint_eigenvalues<SolverType,2,false>
719
748
  EIGEN_DEVICE_FUNC
720
749
  static inline void computeRoots(const MatrixType& m, VectorType& roots)
721
750
  {
722
- using std::sqrt;
751
+ EIGEN_USING_STD(sqrt);
723
752
  const Scalar t0 = Scalar(0.5) * sqrt( numext::abs2(m(0,0)-m(1,1)) + Scalar(4)*numext::abs2(m(1,0)));
724
753
  const Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));
725
754
  roots(0) = t1 - t0;
@@ -729,8 +758,8 @@ struct direct_selfadjoint_eigenvalues<SolverType,2,false>
729
758
  EIGEN_DEVICE_FUNC
730
759
  static inline void run(SolverType& solver, const MatrixType& mat, int options)
731
760
  {
732
- EIGEN_USING_STD_MATH(sqrt);
733
- EIGEN_USING_STD_MATH(abs);
761
+ EIGEN_USING_STD(sqrt);
762
+ EIGEN_USING_STD(abs);
734
763
 
735
764
  eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());
736
765
  eigen_assert((options&~(EigVecMask|GenEigMask))==0
@@ -803,32 +832,38 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
803
832
  }
804
833
 
805
834
  namespace internal {
835
+
836
+ // Francis implicit QR step.
806
837
  template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
807
838
  EIGEN_DEVICE_FUNC
808
839
  static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)
809
840
  {
810
- using std::abs;
841
+ // Wilkinson Shift.
811
842
  RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);
812
843
  RealScalar e = subdiag[end-1];
813
844
  // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still
814
845
  // underflow thus leading to inf/NaN values when using the following commented code:
815
- // RealScalar e2 = numext::abs2(subdiag[end-1]);
816
- // RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
846
+ // RealScalar e2 = numext::abs2(subdiag[end-1]);
847
+ // RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
817
848
  // This explain the following, somewhat more complicated, version:
818
849
  RealScalar mu = diag[end];
819
- if(td==RealScalar(0))
820
- mu -= abs(e);
821
- else
822
- {
823
- RealScalar e2 = numext::abs2(subdiag[end-1]);
824
- RealScalar h = numext::hypot(td,e);
825
- if(e2==RealScalar(0)) mu -= (e / (td + (td>RealScalar(0) ? RealScalar(1) : RealScalar(-1)))) * (e / h);
826
- else mu -= e2 / (td + (td>RealScalar(0) ? h : -h));
850
+ if(td==RealScalar(0)) {
851
+ mu -= numext::abs(e);
852
+ } else if (e != RealScalar(0)) {
853
+ const RealScalar e2 = numext::abs2(e);
854
+ const RealScalar h = numext::hypot(td,e);
855
+ if(e2 == RealScalar(0)) {
856
+ mu -= e / ((td + (td>RealScalar(0) ? h : -h)) / e);
857
+ } else {
858
+ mu -= e2 / (td + (td>RealScalar(0) ? h : -h));
859
+ }
827
860
  }
828
-
861
+
829
862
  RealScalar x = diag[start] - mu;
830
863
  RealScalar z = subdiag[start];
831
- for (Index k = start; k < end; ++k)
864
+ // If z ever becomes zero, the Givens rotation will be the identity and
865
+ // z will stay zero for all future iterations.
866
+ for (Index k = start; k < end && z != RealScalar(0); ++k)
832
867
  {
833
868
  JacobiRotation<RealScalar> rot;
834
869
  rot.makeGivens(x, z);
@@ -841,12 +876,11 @@ static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index sta
841
876
  diag[k+1] = rot.s() * sdk + rot.c() * dkp1;
842
877
  subdiag[k] = rot.c() * sdk - rot.s() * dkp1;
843
878
 
844
-
845
879
  if (k > start)
846
880
  subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;
847
881
 
882
+ // "Chasing the bulge" to return to triangular form.
848
883
  x = subdiag[k];
849
-
850
884
  if (k < end - 1)
851
885
  {
852
886
  z = -rot.s() * subdiag[k+1];
@@ -11,10 +11,10 @@
11
11
  #ifndef EIGEN_TRIDIAGONALIZATION_H
12
12
  #define EIGEN_TRIDIAGONALIZATION_H
13
13
 
14
- namespace Eigen {
14
+ namespace Eigen {
15
15
 
16
16
  namespace internal {
17
-
17
+
18
18
  template<typename MatrixType> struct TridiagonalizationMatrixTReturnType;
19
19
  template<typename MatrixType>
20
20
  struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
@@ -25,6 +25,7 @@ struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
25
25
  };
26
26
 
27
27
  template<typename MatrixType, typename CoeffVectorType>
28
+ EIGEN_DEVICE_FUNC
28
29
  void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
29
30
  }
30
31
 
@@ -344,6 +345,7 @@ namespace internal {
344
345
  * \sa Tridiagonalization::packedMatrix()
345
346
  */
346
347
  template<typename MatrixType, typename CoeffVectorType>
348
+ EIGEN_DEVICE_FUNC
347
349
  void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
348
350
  {
349
351
  using numext::conj;
@@ -352,7 +354,7 @@ void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
352
354
  Index n = matA.rows();
353
355
  eigen_assert(n==matA.cols());
354
356
  eigen_assert(n==hCoeffs.size()+1 || n==1);
355
-
357
+
356
358
  for (Index i = 0; i<n-1; ++i)
357
359
  {
358
360
  Index remainingSize = n-i-1;
@@ -423,11 +425,13 @@ struct tridiagonalization_inplace_selector;
423
425
  *
424
426
  * \sa class Tridiagonalization
425
427
  */
426
- template<typename MatrixType, typename DiagonalType, typename SubDiagonalType>
427
- void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
428
+ template<typename MatrixType, typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
429
+ EIGEN_DEVICE_FUNC
430
+ void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
431
+ CoeffVectorType& hcoeffs, bool extractQ)
428
432
  {
429
433
  eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
430
- tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, extractQ);
434
+ tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, hcoeffs, extractQ);
431
435
  }
432
436
 
433
437
  /** \internal
@@ -439,10 +443,10 @@ struct tridiagonalization_inplace_selector
439
443
  typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType;
440
444
  typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;
441
445
  template<typename DiagonalType, typename SubDiagonalType>
442
- static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
446
+ static EIGEN_DEVICE_FUNC
447
+ void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType& hCoeffs, bool extractQ)
443
448
  {
444
- CoeffVectorType hCoeffs(mat.cols()-1);
445
- tridiagonalization_inplace(mat,hCoeffs);
449
+ tridiagonalization_inplace(mat, hCoeffs);
446
450
  diag = mat.diagonal().real();
447
451
  subdiag = mat.template diagonal<-1>().real();
448
452
  if(extractQ)
@@ -462,8 +466,8 @@ struct tridiagonalization_inplace_selector<MatrixType,3,false>
462
466
  typedef typename MatrixType::Scalar Scalar;
463
467
  typedef typename MatrixType::RealScalar RealScalar;
464
468
 
465
- template<typename DiagonalType, typename SubDiagonalType>
466
- static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
469
+ template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
470
+ static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType&, bool extractQ)
467
471
  {
468
472
  using std::sqrt;
469
473
  const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
@@ -507,8 +511,9 @@ struct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>
507
511
  {
508
512
  typedef typename MatrixType::Scalar Scalar;
509
513
 
510
- template<typename DiagonalType, typename SubDiagonalType>
511
- static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, bool extractQ)
514
+ template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
515
+ static EIGEN_DEVICE_FUNC
516
+ void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, CoeffVectorType&, bool extractQ)
512
517
  {
513
518
  diag(0,0) = numext::real(mat(0,0));
514
519
  if(extractQ)
@@ -542,8 +547,8 @@ template<typename MatrixType> struct TridiagonalizationMatrixTReturnType
542
547
  result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
543
548
  }
544
549
 
545
- Index rows() const { return m_matrix.rows(); }
546
- Index cols() const { return m_matrix.cols(); }
550
+ EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
551
+ EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
547
552
 
548
553
  protected:
549
554
  typename MatrixType::Nested m_matrix;