tomoto 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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;