@smake/eigen 1.0.1 → 1.1.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 (283) hide show
  1. package/README.md +1 -1
  2. package/eigen/COPYING.APACHE +203 -0
  3. package/eigen/COPYING.BSD +1 -1
  4. package/eigen/COPYING.MINPACK +51 -52
  5. package/eigen/Eigen/Cholesky +0 -1
  6. package/eigen/Eigen/Core +108 -266
  7. package/eigen/Eigen/Eigenvalues +0 -1
  8. package/eigen/Eigen/Geometry +3 -6
  9. package/eigen/Eigen/Householder +0 -1
  10. package/eigen/Eigen/Jacobi +0 -1
  11. package/eigen/Eigen/KLUSupport +41 -0
  12. package/eigen/Eigen/LU +2 -5
  13. package/eigen/Eigen/OrderingMethods +0 -3
  14. package/eigen/Eigen/PaStiXSupport +1 -0
  15. package/eigen/Eigen/PardisoSupport +0 -0
  16. package/eigen/Eigen/QR +0 -1
  17. package/eigen/Eigen/QtAlignedMalloc +0 -1
  18. package/eigen/Eigen/SVD +0 -1
  19. package/eigen/Eigen/Sparse +0 -2
  20. package/eigen/Eigen/SparseCholesky +0 -8
  21. package/eigen/Eigen/SparseLU +4 -0
  22. package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
  23. package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
  24. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
  25. package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
  26. package/eigen/Eigen/src/Core/Array.h +99 -11
  27. package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
  28. package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
  29. package/eigen/Eigen/src/Core/Assign.h +1 -1
  30. package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
  31. package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
  32. package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
  33. package/eigen/Eigen/src/Core/Block.h +56 -60
  34. package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
  35. package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
  36. package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
  37. package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
  38. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
  39. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
  40. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
  41. package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
  42. package/eigen/Eigen/src/Core/DenseBase.h +128 -39
  43. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
  44. package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
  45. package/eigen/Eigen/src/Core/Diagonal.h +21 -23
  46. package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
  47. package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
  48. package/eigen/Eigen/src/Core/Dot.h +10 -10
  49. package/eigen/Eigen/src/Core/EigenBase.h +10 -9
  50. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
  51. package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
  52. package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
  53. package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
  54. package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
  55. package/eigen/Eigen/src/Core/IO.h +40 -7
  56. package/eigen/Eigen/src/Core/IndexedView.h +237 -0
  57. package/eigen/Eigen/src/Core/Inverse.h +9 -10
  58. package/eigen/Eigen/src/Core/Map.h +7 -7
  59. package/eigen/Eigen/src/Core/MapBase.h +5 -3
  60. package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
  61. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
  62. package/eigen/Eigen/src/Core/Matrix.h +131 -25
  63. package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
  64. package/eigen/Eigen/src/Core/NestByValue.h +25 -50
  65. package/eigen/Eigen/src/Core/NoAlias.h +4 -3
  66. package/eigen/Eigen/src/Core/NumTraits.h +107 -20
  67. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  68. package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
  69. package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
  70. package/eigen/Eigen/src/Core/Product.h +30 -25
  71. package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
  72. package/eigen/Eigen/src/Core/Random.h +37 -1
  73. package/eigen/Eigen/src/Core/Redux.h +180 -170
  74. package/eigen/Eigen/src/Core/Ref.h +118 -21
  75. package/eigen/Eigen/src/Core/Replicate.h +8 -8
  76. package/eigen/Eigen/src/Core/Reshaped.h +454 -0
  77. package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
  78. package/eigen/Eigen/src/Core/Reverse.h +18 -12
  79. package/eigen/Eigen/src/Core/Select.h +8 -6
  80. package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
  81. package/eigen/Eigen/src/Core/Solve.h +14 -14
  82. package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
  83. package/eigen/Eigen/src/Core/SolverBase.h +41 -3
  84. package/eigen/Eigen/src/Core/StableNorm.h +100 -70
  85. package/eigen/Eigen/src/Core/StlIterators.h +463 -0
  86. package/eigen/Eigen/src/Core/Stride.h +9 -4
  87. package/eigen/Eigen/src/Core/Swap.h +5 -4
  88. package/eigen/Eigen/src/Core/Transpose.h +86 -27
  89. package/eigen/Eigen/src/Core/Transpositions.h +26 -8
  90. package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
  91. package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
  92. package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
  93. package/eigen/Eigen/src/Core/Visitor.h +137 -29
  94. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
  95. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
  96. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
  97. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
  98. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  99. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
  100. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
  101. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  102. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
  103. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
  104. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  105. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  106. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  107. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
  108. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
  109. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  110. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
  111. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  112. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  113. package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
  114. package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
  115. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  116. package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
  117. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  118. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  119. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  120. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  121. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  122. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  123. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
  124. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  125. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
  126. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
  127. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  128. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
  129. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
  130. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
  131. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
  132. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  133. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  134. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  135. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  136. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  137. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  138. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  139. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  140. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
  141. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
  142. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
  143. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
  144. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
  145. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
  146. package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
  147. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
  148. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
  149. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
  150. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
  151. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
  152. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
  153. package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
  154. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
  155. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
  156. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
  157. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
  158. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
  159. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
  160. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
  161. package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
  162. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  163. package/eigen/Eigen/src/Core/util/Constants.h +25 -9
  164. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
  165. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
  166. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  167. package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
  168. package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
  169. package/eigen/Eigen/src/Core/util/Macros.h +661 -250
  170. package/eigen/Eigen/src/Core/util/Memory.h +222 -52
  171. package/eigen/Eigen/src/Core/util/Meta.h +349 -105
  172. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  173. package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
  174. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  175. package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
  176. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
  177. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
  178. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
  179. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
  180. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
  181. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
  182. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
  183. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
  184. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
  185. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
  186. package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
  187. package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
  188. package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
  189. package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
  190. package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
  191. package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
  192. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
  193. package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
  194. package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
  195. package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
  196. package/eigen/Eigen/src/Geometry/Transform.h +86 -65
  197. package/eigen/Eigen/src/Geometry/Translation.h +6 -6
  198. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  199. package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
  200. package/eigen/Eigen/src/Householder/Householder.h +8 -4
  201. package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
  202. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
  203. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
  204. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
  205. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
  206. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
  207. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
  208. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
  209. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
  210. package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
  211. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  212. package/eigen/Eigen/src/LU/Determinant.h +35 -19
  213. package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
  214. package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
  215. package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
  216. package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
  217. package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
  218. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
  219. package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
  220. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
  221. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
  222. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
  223. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
  224. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
  225. package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
  226. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
  227. package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
  228. package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
  229. package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
  230. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
  231. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
  232. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
  233. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
  234. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
  235. package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
  236. package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
  237. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
  238. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
  239. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
  240. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
  241. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
  242. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
  243. package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
  244. package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
  245. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
  246. package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
  247. package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
  248. package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
  249. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
  250. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
  251. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
  252. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
  253. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
  254. package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
  255. package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
  256. package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
  257. package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
  258. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
  259. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
  260. package/eigen/Eigen/src/misc/lapacke.h +5 -4
  261. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
  262. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
  263. package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
  264. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
  265. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  266. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
  267. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
  268. package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
  269. package/eigen/README.md +2 -0
  270. package/lib/LibEigen.d.ts +4 -0
  271. package/lib/LibEigen.js +14 -0
  272. package/lib/index.d.ts +1 -1
  273. package/lib/index.js +7 -3
  274. package/package.json +2 -10
  275. package/eigen/Eigen/CMakeLists.txt +0 -19
  276. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  277. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  278. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  279. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  280. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  281. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  282. package/lib/eigen.d.ts +0 -2
  283. package/lib/eigen.js +0 -15
@@ -14,6 +14,18 @@
14
14
 
15
15
  namespace Eigen {
16
16
 
17
+ namespace internal {
18
+ template<typename _MatrixType> struct traits<HouseholderQR<_MatrixType> >
19
+ : traits<_MatrixType>
20
+ {
21
+ typedef MatrixXpr XprKind;
22
+ typedef SolverStorage StorageKind;
23
+ typedef int StorageIndex;
24
+ enum { Flags = 0 };
25
+ };
26
+
27
+ } // end namespace internal
28
+
17
29
  /** \ingroup QR_Module
18
30
  *
19
31
  *
@@ -42,20 +54,19 @@ namespace Eigen {
42
54
  * \sa MatrixBase::householderQr()
43
55
  */
44
56
  template<typename _MatrixType> class HouseholderQR
57
+ : public SolverBase<HouseholderQR<_MatrixType> >
45
58
  {
46
59
  public:
47
60
 
48
61
  typedef _MatrixType MatrixType;
62
+ typedef SolverBase<HouseholderQR> Base;
63
+ friend class SolverBase<HouseholderQR>;
64
+
65
+ EIGEN_GENERIC_PUBLIC_INTERFACE(HouseholderQR)
49
66
  enum {
50
- RowsAtCompileTime = MatrixType::RowsAtCompileTime,
51
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
52
67
  MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
53
68
  MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
54
69
  };
55
- typedef typename MatrixType::Scalar Scalar;
56
- typedef typename MatrixType::RealScalar RealScalar;
57
- // FIXME should be int
58
- typedef typename MatrixType::StorageIndex StorageIndex;
59
70
  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, (MatrixType::Flags&RowMajorBit) ? RowMajor : ColMajor, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
60
71
  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
61
72
  typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
@@ -121,6 +132,7 @@ template<typename _MatrixType> class HouseholderQR
121
132
  computeInPlace();
122
133
  }
123
134
 
135
+ #ifdef EIGEN_PARSED_BY_DOXYGEN
124
136
  /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
125
137
  * *this is the QR decomposition, if any exists.
126
138
  *
@@ -137,11 +149,8 @@ template<typename _MatrixType> class HouseholderQR
137
149
  */
138
150
  template<typename Rhs>
139
151
  inline const Solve<HouseholderQR, Rhs>
140
- solve(const MatrixBase<Rhs>& b) const
141
- {
142
- eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
143
- return Solve<HouseholderQR, Rhs>(*this, b.derived());
144
- }
152
+ solve(const MatrixBase<Rhs>& b) const;
153
+ #endif
145
154
 
146
155
  /** This method returns an expression of the unitary matrix Q as a sequence of Householder transformations.
147
156
  *
@@ -204,28 +213,30 @@ template<typename _MatrixType> class HouseholderQR
204
213
 
205
214
  inline Index rows() const { return m_qr.rows(); }
206
215
  inline Index cols() const { return m_qr.cols(); }
207
-
216
+
208
217
  /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
209
218
  *
210
219
  * For advanced uses only.
211
220
  */
212
221
  const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
213
-
222
+
214
223
  #ifndef EIGEN_PARSED_BY_DOXYGEN
215
224
  template<typename RhsType, typename DstType>
216
- EIGEN_DEVICE_FUNC
217
225
  void _solve_impl(const RhsType &rhs, DstType &dst) const;
226
+
227
+ template<bool Conjugate, typename RhsType, typename DstType>
228
+ void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
218
229
  #endif
219
230
 
220
231
  protected:
221
-
232
+
222
233
  static void check_template_parameters()
223
234
  {
224
235
  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
225
236
  }
226
237
 
227
238
  void computeInPlace();
228
-
239
+
229
240
  MatrixType m_qr;
230
241
  HCoeffsType m_hCoeffs;
231
242
  RowVectorType m_temp;
@@ -292,7 +303,7 @@ template<typename MatrixQR, typename HCoeffs,
292
303
  bool InnerStrideIsOne = (MatrixQR::InnerStrideAtCompileTime == 1 && HCoeffs::InnerStrideAtCompileTime == 1)>
293
304
  struct householder_qr_inplace_blocked
294
305
  {
295
- // This is specialized for MKL-supported Scalar types in HouseholderQR_MKL.h
306
+ // This is specialized for LAPACK-supported Scalar types in HouseholderQR_LAPACKE.h
296
307
  static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index maxBlockSize=32,
297
308
  typename MatrixQR::Scalar* tempData = 0)
298
309
  {
@@ -350,15 +361,10 @@ template<typename RhsType, typename DstType>
350
361
  void HouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
351
362
  {
352
363
  const Index rank = (std::min)(rows(), cols());
353
- eigen_assert(rhs.rows() == rows());
354
364
 
355
365
  typename RhsType::PlainObject c(rhs);
356
366
 
357
- // Note that the matrix Q = H_0^* H_1^*... so its inverse is Q^* = (H_0 H_1 ...)^T
358
- c.applyOnTheLeft(householderSequence(
359
- m_qr.leftCols(rank),
360
- m_hCoeffs.head(rank)).transpose()
361
- );
367
+ c.applyOnTheLeft(householderQ().setLength(rank).adjoint() );
362
368
 
363
369
  m_qr.topLeftCorner(rank, rank)
364
370
  .template triangularView<Upper>()
@@ -367,6 +373,25 @@ void HouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) c
367
373
  dst.topRows(rank) = c.topRows(rank);
368
374
  dst.bottomRows(cols()-rank).setZero();
369
375
  }
376
+
377
+ template<typename _MatrixType>
378
+ template<bool Conjugate, typename RhsType, typename DstType>
379
+ void HouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
380
+ {
381
+ const Index rank = (std::min)(rows(), cols());
382
+
383
+ typename RhsType::PlainObject c(rhs);
384
+
385
+ m_qr.topLeftCorner(rank, rank)
386
+ .template triangularView<Upper>()
387
+ .transpose().template conjugateIf<Conjugate>()
388
+ .solveInPlace(c.topRows(rank));
389
+
390
+ dst.topRows(rank) = c.topRows(rank);
391
+ dst.bottomRows(rows()-rank).setZero();
392
+
393
+ dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>() );
394
+ }
370
395
  #endif
371
396
 
372
397
  /** Performs the QR factorization of the given matrix \a matrix. The result of
@@ -74,13 +74,35 @@ class SPQR : public SparseSolverBase<SPQR<_MatrixType> >
74
74
  };
75
75
  public:
76
76
  SPQR()
77
- : m_ordering(SPQR_ORDERING_DEFAULT), m_allow_tol(SPQR_DEFAULT_TOL), m_tolerance (NumTraits<Scalar>::epsilon()), m_useDefaultThreshold(true)
77
+ : m_analysisIsOk(false),
78
+ m_factorizationIsOk(false),
79
+ m_isRUpToDate(false),
80
+ m_ordering(SPQR_ORDERING_DEFAULT),
81
+ m_allow_tol(SPQR_DEFAULT_TOL),
82
+ m_tolerance (NumTraits<Scalar>::epsilon()),
83
+ m_cR(0),
84
+ m_E(0),
85
+ m_H(0),
86
+ m_HPinv(0),
87
+ m_HTau(0),
88
+ m_useDefaultThreshold(true)
78
89
  {
79
90
  cholmod_l_start(&m_cc);
80
91
  }
81
92
 
82
93
  explicit SPQR(const _MatrixType& matrix)
83
- : m_ordering(SPQR_ORDERING_DEFAULT), m_allow_tol(SPQR_DEFAULT_TOL), m_tolerance (NumTraits<Scalar>::epsilon()), m_useDefaultThreshold(true)
94
+ : m_analysisIsOk(false),
95
+ m_factorizationIsOk(false),
96
+ m_isRUpToDate(false),
97
+ m_ordering(SPQR_ORDERING_DEFAULT),
98
+ m_allow_tol(SPQR_DEFAULT_TOL),
99
+ m_tolerance (NumTraits<Scalar>::epsilon()),
100
+ m_cR(0),
101
+ m_E(0),
102
+ m_H(0),
103
+ m_HPinv(0),
104
+ m_HTau(0),
105
+ m_useDefaultThreshold(true)
84
106
  {
85
107
  cholmod_l_start(&m_cc);
86
108
  compute(matrix);
@@ -220,7 +242,7 @@ class SPQR : public SparseSolverBase<SPQR<_MatrixType> >
220
242
 
221
243
  /** \brief Reports whether previous computation was successful.
222
244
  *
223
- * \returns \c Success if computation was succesful,
245
+ * \returns \c Success if computation was successful,
224
246
  * \c NumericalIssue if the sparse QR can not be computed
225
247
  */
226
248
  ComputationInfo info() const
@@ -22,6 +22,11 @@
22
22
  // #define EIGEN_BDCSVD_DEBUG_VERBOSE
23
23
  // #define EIGEN_BDCSVD_SANITY_CHECKS
24
24
 
25
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
26
+ #undef eigen_internal_assert
27
+ #define eigen_internal_assert(X) assert(X);
28
+ #endif
29
+
25
30
  namespace Eigen {
26
31
 
27
32
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
@@ -34,6 +39,7 @@ namespace internal {
34
39
 
35
40
  template<typename _MatrixType>
36
41
  struct traits<BDCSVD<_MatrixType> >
42
+ : traits<_MatrixType>
37
43
  {
38
44
  typedef _MatrixType MatrixType;
39
45
  };
@@ -57,7 +63,7 @@ struct traits<BDCSVD<_MatrixType> >
57
63
  * recommended and can several order of magnitude faster.
58
64
  *
59
65
  * \warning this algorithm is unlikely to provide accurate result when compiled with unsafe math optimizations.
60
- * For instance, this concerns Intel's compiler (ICC), which perfroms such optimization by default unless
66
+ * For instance, this concerns Intel's compiler (ICC), which performs such optimization by default unless
61
67
  * you compile with the \c -fp-model \c precise option. Likewise, the \c -ffast-math option of GCC or clang will
62
68
  * significantly degrade the accuracy.
63
69
  *
@@ -105,7 +111,7 @@ public:
105
111
  * The default constructor is useful in cases in which the user intends to
106
112
  * perform decompositions via BDCSVD::compute(const MatrixType&).
107
113
  */
108
- BDCSVD() : m_algoswap(16), m_numIters(0)
114
+ BDCSVD() : m_algoswap(16), m_isTranspose(false), m_compU(false), m_compV(false), m_numIters(0)
109
115
  {}
110
116
 
111
117
 
@@ -202,6 +208,7 @@ protected:
202
208
  using Base::m_computeThinV;
203
209
  using Base::m_matrixU;
204
210
  using Base::m_matrixV;
211
+ using Base::m_info;
205
212
  using Base::m_isInitialized;
206
213
  using Base::m_nonzeroSingularValues;
207
214
 
@@ -212,7 +219,7 @@ public:
212
219
 
213
220
  // Method to allocate and initialize matrix and attributes
214
221
  template<typename MatrixType>
215
- void BDCSVD<MatrixType>::allocate(Index rows, Index cols, unsigned int computationOptions)
222
+ void BDCSVD<MatrixType>::allocate(Eigen::Index rows, Eigen::Index cols, unsigned int computationOptions)
216
223
  {
217
224
  m_isTranspose = (cols > rows);
218
225
 
@@ -250,16 +257,25 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
250
257
  {
251
258
  // FIXME this line involves temporaries
252
259
  JacobiSVD<MatrixType> jsvd(matrix,computationOptions);
253
- if(computeU()) m_matrixU = jsvd.matrixU();
254
- if(computeV()) m_matrixV = jsvd.matrixV();
255
- m_singularValues = jsvd.singularValues();
256
- m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
257
260
  m_isInitialized = true;
261
+ m_info = jsvd.info();
262
+ if (m_info == Success || m_info == NoConvergence) {
263
+ if(computeU()) m_matrixU = jsvd.matrixU();
264
+ if(computeV()) m_matrixV = jsvd.matrixV();
265
+ m_singularValues = jsvd.singularValues();
266
+ m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
267
+ }
258
268
  return *this;
259
269
  }
260
270
 
261
271
  //**** step 0 - Copy the input matrix and apply scaling to reduce over/under-flows
262
- RealScalar scale = matrix.cwiseAbs().maxCoeff();
272
+ RealScalar scale = matrix.cwiseAbs().template maxCoeff<PropagateNaN>();
273
+ if (!(numext::isfinite)(scale)) {
274
+ m_isInitialized = true;
275
+ m_info = InvalidInput;
276
+ return *this;
277
+ }
278
+
263
279
  if(scale==Literal(0)) scale = Literal(1);
264
280
  MatrixX copy;
265
281
  if (m_isTranspose) copy = matrix.adjoint()/scale;
@@ -276,7 +292,11 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
276
292
  m_computed.topRows(m_diagSize) = bid.bidiagonal().toDenseMatrix().transpose();
277
293
  m_computed.template bottomRows<1>().setZero();
278
294
  divide(0, m_diagSize - 1, 0, 0, 0);
279
-
295
+ if (m_info != Success && m_info != NoConvergence) {
296
+ m_isInitialized = true;
297
+ return *this;
298
+ }
299
+
280
300
  //**** step 3 - Copy singular values and vectors
281
301
  for (int i=0; i<m_diagSize; i++)
282
302
  {
@@ -388,7 +408,7 @@ void BDCSVD<MatrixType>::structured_update(Block<MatrixXr,Dynamic,Dynamic> A, co
388
408
  //@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the last column of the U submatrix
389
409
  // to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the reference paper.
390
410
  template<typename MatrixType>
391
- void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW, Index firstColW, Index shift)
411
+ void BDCSVD<MatrixType>::divide(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
392
412
  {
393
413
  // requires rows = cols + 1;
394
414
  using std::pow;
@@ -408,6 +428,8 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
408
428
  {
409
429
  // FIXME this line involves temporaries
410
430
  JacobiSVD<MatrixXr> b(m_computed.block(firstCol, firstCol, n + 1, n), ComputeFullU | (m_compV ? ComputeFullV : 0));
431
+ m_info = b.info();
432
+ if (m_info != Success && m_info != NoConvergence) return;
411
433
  if (m_compU)
412
434
  m_naiveU.block(firstCol, firstCol, n + 1, n + 1).real() = b.matrixU();
413
435
  else
@@ -427,7 +449,9 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
427
449
  // and the divide of the right submatrice reads one column of the left submatrice. That's why we need to treat the
428
450
  // right submatrix before the left one.
429
451
  divide(k + 1 + firstCol, lastCol, k + 1 + firstRowW, k + 1 + firstColW, shift);
452
+ if (m_info != Success && m_info != NoConvergence) return;
430
453
  divide(firstCol, k - 1 + firstCol, firstRowW, firstColW + 1, shift + 1);
454
+ if (m_info != Success && m_info != NoConvergence) return;
431
455
 
432
456
  if (m_compU)
433
457
  {
@@ -568,7 +592,7 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
568
592
  // handling of round-off errors, be consistent in ordering
569
593
  // For instance, to solve the secular equation using FMM, see http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf
570
594
  template <typename MatrixType>
571
- void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
595
+ void BDCSVD<MatrixType>::computeSVDofM(Eigen::Index firstCol, Eigen::Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
572
596
  {
573
597
  const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
574
598
  using std::abs;
@@ -591,7 +615,7 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
591
615
  // but others are interleaved and we must ignore them at this stage.
592
616
  // To this end, let's compute a permutation skipping them:
593
617
  Index actual_n = n;
594
- while(actual_n>1 && diag(actual_n-1)==Literal(0)) --actual_n;
618
+ while(actual_n>1 && diag(actual_n-1)==Literal(0)) {--actual_n; eigen_internal_assert(col0(actual_n)==Literal(0)); }
595
619
  Index m = 0; // size of the deflated problem
596
620
  for(Index k=0;k<actual_n;++k)
597
621
  if(abs(col0(k))>considerZero)
@@ -618,13 +642,11 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
618
642
  std::cout << " shift: " << shifts.transpose() << "\n";
619
643
 
620
644
  {
621
- Index actual_n = n;
622
- while(actual_n>1 && abs(col0(actual_n-1))<considerZero) --actual_n;
623
645
  std::cout << "\n\n mus: " << mus.head(actual_n).transpose() << "\n\n";
624
646
  std::cout << " check1 (expect0) : " << ((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n).transpose() << "\n\n";
647
+ assert((((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n) >= 0).all());
625
648
  std::cout << " check2 (>0) : " << ((singVals.array()-diag) / singVals.array()).head(actual_n).transpose() << "\n\n";
626
- std::cout << " check3 (>0) : " << ((diag.segment(1,actual_n-1)-singVals.head(actual_n-1).array()) / singVals.head(actual_n-1).array()).transpose() << "\n\n\n";
627
- std::cout << " check4 (>0) : " << ((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).transpose() << "\n\n\n";
649
+ assert((((singVals.array()-diag) / singVals.array()).head(actual_n) >= 0).all());
628
650
  }
629
651
  #endif
630
652
 
@@ -652,13 +674,13 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
652
674
  #endif
653
675
 
654
676
  #ifdef EIGEN_BDCSVD_SANITY_CHECKS
655
- assert(U.allFinite());
656
- assert(V.allFinite());
657
- assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 1e-14 * n);
658
- assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 1e-14 * n);
659
677
  assert(m_naiveU.allFinite());
660
678
  assert(m_naiveV.allFinite());
661
679
  assert(m_computed.allFinite());
680
+ assert(U.allFinite());
681
+ assert(V.allFinite());
682
+ // assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
683
+ // assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
662
684
  #endif
663
685
 
664
686
  // Because of deflation, the singular values might not be completely sorted.
@@ -673,6 +695,15 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
673
695
  if(m_compV) V.col(i).swap(V.col(i+1));
674
696
  }
675
697
  }
698
+
699
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
700
+ {
701
+ bool singular_values_sorted = (((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).array() >= 0).all();
702
+ if(!singular_values_sorted)
703
+ std::cout << "Singular values are not sorted: " << singVals.segment(1,actual_n).transpose() << "\n";
704
+ assert(singular_values_sorted);
705
+ }
706
+ #endif
676
707
 
677
708
  // Reverse order so that singular values in increased order
678
709
  // Because of deflation, the zeros singular-values are already at the end
@@ -749,19 +780,22 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
749
780
  RealScalar mid = left + (right-left) / Literal(2);
750
781
  RealScalar fMid = secularEq(mid, col0, diag, perm, diag, Literal(0));
751
782
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
752
- std::cout << right-left << "\n";
753
- std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, diag-left, left) << " " << secularEq(mid-right, col0, diag, perm, diag-right, right) << "\n";
754
- std::cout << " = " << secularEq(0.1*(left+right), col0, diag, perm, diag, 0)
755
- << " " << secularEq(0.2*(left+right), col0, diag, perm, diag, 0)
756
- << " " << secularEq(0.3*(left+right), col0, diag, perm, diag, 0)
757
- << " " << secularEq(0.4*(left+right), col0, diag, perm, diag, 0)
758
- << " " << secularEq(0.49*(left+right), col0, diag, perm, diag, 0)
759
- << " " << secularEq(0.5*(left+right), col0, diag, perm, diag, 0)
760
- << " " << secularEq(0.51*(left+right), col0, diag, perm, diag, 0)
761
- << " " << secularEq(0.6*(left+right), col0, diag, perm, diag, 0)
762
- << " " << secularEq(0.7*(left+right), col0, diag, perm, diag, 0)
763
- << " " << secularEq(0.8*(left+right), col0, diag, perm, diag, 0)
764
- << " " << secularEq(0.9*(left+right), col0, diag, perm, diag, 0) << "\n";
783
+ std::cout << "right-left = " << right-left << "\n";
784
+ // std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, ArrayXr(diag-left), left)
785
+ // << " " << secularEq(mid-right, col0, diag, perm, ArrayXr(diag-right), right) << "\n";
786
+ std::cout << " = " << secularEq(left+RealScalar(0.000001)*(right-left), col0, diag, perm, diag, 0)
787
+ << " " << secularEq(left+RealScalar(0.1) *(right-left), col0, diag, perm, diag, 0)
788
+ << " " << secularEq(left+RealScalar(0.2) *(right-left), col0, diag, perm, diag, 0)
789
+ << " " << secularEq(left+RealScalar(0.3) *(right-left), col0, diag, perm, diag, 0)
790
+ << " " << secularEq(left+RealScalar(0.4) *(right-left), col0, diag, perm, diag, 0)
791
+ << " " << secularEq(left+RealScalar(0.49) *(right-left), col0, diag, perm, diag, 0)
792
+ << " " << secularEq(left+RealScalar(0.5) *(right-left), col0, diag, perm, diag, 0)
793
+ << " " << secularEq(left+RealScalar(0.51) *(right-left), col0, diag, perm, diag, 0)
794
+ << " " << secularEq(left+RealScalar(0.6) *(right-left), col0, diag, perm, diag, 0)
795
+ << " " << secularEq(left+RealScalar(0.7) *(right-left), col0, diag, perm, diag, 0)
796
+ << " " << secularEq(left+RealScalar(0.8) *(right-left), col0, diag, perm, diag, 0)
797
+ << " " << secularEq(left+RealScalar(0.9) *(right-left), col0, diag, perm, diag, 0)
798
+ << " " << secularEq(left+RealScalar(0.999999)*(right-left), col0, diag, perm, diag, 0) << "\n";
765
799
  #endif
766
800
  RealScalar shift = (k == actual_n-1 || fMid > Literal(0)) ? left : right;
767
801
 
@@ -819,13 +853,16 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
819
853
  // And find mu such that f(mu)==0:
820
854
  RealScalar muZero = -a/b;
821
855
  RealScalar fZero = secularEq(muZero, col0, diag, perm, diagShifted, shift);
856
+
857
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
858
+ assert((numext::isfinite)(fZero));
859
+ #endif
822
860
 
823
861
  muPrev = muCur;
824
862
  fPrev = fCur;
825
863
  muCur = muZero;
826
864
  fCur = fZero;
827
865
 
828
-
829
866
  if (shift == left && (muCur < Literal(0) || muCur > right - left)) useBisection = true;
830
867
  if (shift == right && (muCur < -(right - left) || muCur > Literal(0))) useBisection = true;
831
868
  if (abs(fCur)>abs(fPrev)) useBisection = true;
@@ -858,20 +895,33 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
858
895
  else
859
896
  rightShifted = -(std::numeric_limits<RealScalar>::min)();
860
897
  }
861
-
898
+
862
899
  RealScalar fLeft = secularEq(leftShifted, col0, diag, perm, diagShifted, shift);
863
900
  eigen_internal_assert(fLeft<Literal(0));
864
901
 
865
- #if defined EIGEN_INTERNAL_DEBUGGING || defined EIGEN_BDCSVD_DEBUG_VERBOSE
902
+ #if defined EIGEN_INTERNAL_DEBUGGING || defined EIGEN_BDCSVD_SANITY_CHECKS
866
903
  RealScalar fRight = secularEq(rightShifted, col0, diag, perm, diagShifted, shift);
867
904
  #endif
868
905
 
906
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
907
+ if(!(numext::isfinite)(fLeft))
908
+ std::cout << "f(" << leftShifted << ") =" << fLeft << " ; " << left << " " << shift << " " << right << "\n";
909
+ assert((numext::isfinite)(fLeft));
869
910
 
911
+ if(!(numext::isfinite)(fRight))
912
+ std::cout << "f(" << rightShifted << ") =" << fRight << " ; " << left << " " << shift << " " << right << "\n";
913
+ // assert((numext::isfinite)(fRight));
914
+ #endif
915
+
870
916
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
871
917
  if(!(fLeft * fRight<0))
872
918
  {
873
- std::cout << "fLeft: " << leftShifted << " - " << diagShifted.head(10).transpose() << "\n ; " << bool(left==shift) << " " << (left-shift) << "\n";
874
- std::cout << k << " : " << fLeft << " * " << fRight << " == " << fLeft * fRight << " ; " << left << " - " << right << " -> " << leftShifted << " " << rightShifted << " shift=" << shift << "\n";
919
+ std::cout << "f(leftShifted) using leftShifted=" << leftShifted << " ; diagShifted(1:10):" << diagShifted.head(10).transpose() << "\n ; "
920
+ << "left==shift=" << bool(left==shift) << " ; left-shift = " << (left-shift) << "\n";
921
+ std::cout << "k=" << k << ", " << fLeft << " * " << fRight << " == " << fLeft * fRight << " ; "
922
+ << "[" << left << " .. " << right << "] -> [" << leftShifted << " " << rightShifted << "], shift=" << shift
923
+ << " , f(right)=" << secularEq(0, col0, diag, perm, diagShifted, shift)
924
+ << " == " << secularEq(right, col0, diag, perm, diag, 0) << " == " << fRight << "\n";
875
925
  }
876
926
  #endif
877
927
  eigen_internal_assert(fLeft * fRight < Literal(0));
@@ -912,6 +962,15 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
912
962
  shifts[k] = shift;
913
963
  mus[k] = muCur;
914
964
 
965
+ #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
966
+ if(k+1<n)
967
+ std::cout << "found " << singVals[k] << " == " << shift << " + " << muCur << " from " << diag(k) << " .. " << diag(k+1) << "\n";
968
+ #endif
969
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
970
+ assert(k==0 || singVals[k]>=singVals[k-1]);
971
+ assert(singVals[k]>=diag(k));
972
+ #endif
973
+
915
974
  // perturb singular value slightly if it equals diagonal entry to avoid division by zero later
916
975
  // (deflation is supposed to avoid this from happening)
917
976
  // - this does no seem to be necessary anymore -
@@ -935,7 +994,7 @@ void BDCSVD<MatrixType>::perturbCol0
935
994
  zhat.setZero();
936
995
  return;
937
996
  }
938
- Index last = perm(m-1);
997
+ Index lastIdx = perm(m-1);
939
998
  // The offset permits to skip deflated entries while computing zhat
940
999
  for (Index k = 0; k < n; ++k)
941
1000
  {
@@ -945,15 +1004,43 @@ void BDCSVD<MatrixType>::perturbCol0
945
1004
  {
946
1005
  // see equation (3.6)
947
1006
  RealScalar dk = diag(k);
948
- RealScalar prod = (singVals(last) + dk) * (mus(last) + (shifts(last) - dk));
1007
+ RealScalar prod = (singVals(lastIdx) + dk) * (mus(lastIdx) + (shifts(lastIdx) - dk));
1008
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1009
+ if(prod<0) {
1010
+ std::cout << "k = " << k << " ; z(k)=" << col0(k) << ", diag(k)=" << dk << "\n";
1011
+ std::cout << "prod = " << "(" << singVals(lastIdx) << " + " << dk << ") * (" << mus(lastIdx) << " + (" << shifts(lastIdx) << " - " << dk << "))" << "\n";
1012
+ std::cout << " = " << singVals(lastIdx) + dk << " * " << mus(lastIdx) + (shifts(lastIdx) - dk) << "\n";
1013
+ }
1014
+ assert(prod>=0);
1015
+ #endif
949
1016
 
950
1017
  for(Index l = 0; l<m; ++l)
951
1018
  {
952
1019
  Index i = perm(l);
953
1020
  if(i!=k)
954
1021
  {
1022
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1023
+ if(i>=k && (l==0 || l-1>=m))
1024
+ {
1025
+ std::cout << "Error in perturbCol0\n";
1026
+ std::cout << " " << k << "/" << n << " " << l << "/" << m << " " << i << "/" << n << " ; " << col0(k) << " " << diag(k) << " " << "\n";
1027
+ std::cout << " " <<diag(i) << "\n";
1028
+ Index j = (i<k /*|| l==0*/) ? i : perm(l-1);
1029
+ std::cout << " " << "j=" << j << "\n";
1030
+ }
1031
+ #endif
955
1032
  Index j = i<k ? i : perm(l-1);
1033
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1034
+ if(!(dk!=Literal(0) || diag(i)!=Literal(0)))
1035
+ {
1036
+ std::cout << "k=" << k << ", i=" << i << ", l=" << l << ", perm.size()=" << perm.size() << "\n";
1037
+ }
1038
+ assert(dk!=Literal(0) || diag(i)!=Literal(0));
1039
+ #endif
956
1040
  prod *= ((singVals(j)+dk) / ((diag(i)+dk))) * ((mus(j)+(shifts(j)-dk)) / ((diag(i)-dk)));
1041
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1042
+ assert(prod>=0);
1043
+ #endif
957
1044
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
958
1045
  if(i!=k && numext::abs(((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) - 1) > 0.9 )
959
1046
  std::cout << " " << ((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) << " == (" << (singVals(j)+dk) << " * " << (mus(j)+(shifts(j)-dk))
@@ -962,9 +1049,12 @@ void BDCSVD<MatrixType>::perturbCol0
962
1049
  }
963
1050
  }
964
1051
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
965
- std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(last) + dk) << " * " << mus(last) + shifts(last) << " - " << dk << "\n";
1052
+ std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(lastIdx) + dk) << " * " << mus(lastIdx) + shifts(lastIdx) << " - " << dk << "\n";
966
1053
  #endif
967
1054
  RealScalar tmp = sqrt(prod);
1055
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1056
+ assert((numext::isfinite)(tmp));
1057
+ #endif
968
1058
  zhat(k) = col0(k) > Literal(0) ? RealScalar(tmp) : RealScalar(-tmp);
969
1059
  }
970
1060
  }
@@ -1018,7 +1108,7 @@ void BDCSVD<MatrixType>::computeSingVecs
1018
1108
  // i >= 1, di almost null and zi non null.
1019
1109
  // We use a rotation to zero out zi applied to the left of M
1020
1110
  template <typename MatrixType>
1021
- void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index size)
1111
+ void BDCSVD<MatrixType>::deflation43(Eigen::Index firstCol, Eigen::Index shift, Eigen::Index i, Eigen::Index size)
1022
1112
  {
1023
1113
  using std::abs;
1024
1114
  using std::sqrt;
@@ -1047,7 +1137,7 @@ void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index
1047
1137
  // We apply two rotations to have zj = 0;
1048
1138
  // TODO deflation44 is still broken and not properly tested
1049
1139
  template <typename MatrixType>
1050
- void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size)
1140
+ void BDCSVD<MatrixType>::deflation44(Eigen::Index firstColu , Eigen::Index firstColm, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index i, Eigen::Index j, Eigen::Index size)
1051
1141
  {
1052
1142
  using std::abs;
1053
1143
  using std::sqrt;
@@ -1074,7 +1164,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
1074
1164
  }
1075
1165
  c/=r;
1076
1166
  s/=r;
1077
- m_computed(firstColm + i, firstColm) = r;
1167
+ m_computed(firstColm + i, firstColm) = r;
1078
1168
  m_computed(firstColm + j, firstColm + j) = m_computed(firstColm + i, firstColm + i);
1079
1169
  m_computed(firstColm + j, firstColm) = Literal(0);
1080
1170
 
@@ -1087,7 +1177,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
1087
1177
 
1088
1178
  // acts on block from (firstCol+shift, firstCol+shift) to (lastCol+shift, lastCol+shift) [inclusive]
1089
1179
  template <typename MatrixType>
1090
- void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift)
1180
+ void BDCSVD<MatrixType>::deflation(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index k, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
1091
1181
  {
1092
1182
  using std::sqrt;
1093
1183
  using std::abs;
@@ -1148,6 +1238,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1148
1238
  #endif
1149
1239
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
1150
1240
  std::cout << "to be sorted: " << diag.transpose() << "\n\n";
1241
+ std::cout << " : " << col0.transpose() << "\n\n";
1151
1242
  #endif
1152
1243
  {
1153
1244
  // Check for total deflation
@@ -1238,7 +1329,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1238
1329
  if( (diag(i) - diag(i-1)) < NumTraits<RealScalar>::epsilon()*maxDiag )
1239
1330
  {
1240
1331
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
1241
- std::cout << "deflation 4.4 with i = " << i << " because " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*diag(i) << "\n";
1332
+ std::cout << "deflation 4.4 with i = " << i << " because " << diag(i) << " - " << diag(i-1) << " == " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*/*diag(i)*/maxDiag << "\n";
1242
1333
  #endif
1243
1334
  eigen_internal_assert(abs(diag(i) - diag(i-1))<epsilon_coarse && " diagonal entries are not properly sorted");
1244
1335
  deflation44(firstCol, firstCol + shift, firstRowW, firstColW, i-1, i, length);
@@ -1257,7 +1348,6 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1257
1348
  #endif
1258
1349
  }//end deflation
1259
1350
 
1260
- #ifndef __CUDACC__
1261
1351
  /** \svd_module
1262
1352
  *
1263
1353
  * \return the singular value decomposition of \c *this computed by Divide & Conquer algorithm
@@ -1270,7 +1360,6 @@ MatrixBase<Derived>::bdcSvd(unsigned int computationOptions) const
1270
1360
  {
1271
1361
  return BDCSVD<PlainObject>(*this, computationOptions);
1272
1362
  }
1273
- #endif
1274
1363
 
1275
1364
  } // end namespace Eigen
1276
1365