@smake/eigen 1.0.2 → 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.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +26 -0
- package/eigen/COPYING.GPL +674 -0
- package/eigen/COPYING.LGPL +502 -0
- package/eigen/COPYING.MINPACK +51 -0
- package/eigen/COPYING.MPL2 +373 -0
- package/eigen/COPYING.README +18 -0
- package/eigen/Eigen/Cholesky +0 -1
- package/eigen/Eigen/Core +108 -266
- package/eigen/Eigen/Eigenvalues +0 -1
- package/eigen/Eigen/Geometry +3 -6
- package/eigen/Eigen/Householder +0 -1
- package/eigen/Eigen/Jacobi +0 -1
- package/eigen/Eigen/KLUSupport +41 -0
- package/eigen/Eigen/LU +2 -5
- package/eigen/Eigen/OrderingMethods +0 -3
- package/eigen/Eigen/PaStiXSupport +1 -0
- package/eigen/Eigen/PardisoSupport +0 -0
- package/eigen/Eigen/QR +0 -1
- package/eigen/Eigen/QtAlignedMalloc +0 -1
- package/eigen/Eigen/SVD +0 -1
- package/eigen/Eigen/Sparse +0 -2
- package/eigen/Eigen/SparseCholesky +0 -8
- package/eigen/Eigen/SparseLU +4 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- package/eigen/Eigen/src/Core/Array.h +99 -11
- package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
- package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- package/eigen/Eigen/src/Core/Assign.h +1 -1
- package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- package/eigen/Eigen/src/Core/Block.h +56 -60
- package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
- package/eigen/Eigen/src/Core/DenseBase.h +128 -39
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
- package/eigen/Eigen/src/Core/Diagonal.h +21 -23
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- package/eigen/Eigen/src/Core/Dot.h +10 -10
- package/eigen/Eigen/src/Core/EigenBase.h +10 -9
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
- package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- package/eigen/Eigen/src/Core/IO.h +40 -7
- package/eigen/Eigen/src/Core/IndexedView.h +237 -0
- package/eigen/Eigen/src/Core/Inverse.h +9 -10
- package/eigen/Eigen/src/Core/Map.h +7 -7
- package/eigen/Eigen/src/Core/MapBase.h +5 -3
- package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- package/eigen/Eigen/src/Core/Matrix.h +131 -25
- package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
- package/eigen/Eigen/src/Core/NestByValue.h +25 -50
- package/eigen/Eigen/src/Core/NoAlias.h +4 -3
- package/eigen/Eigen/src/Core/NumTraits.h +107 -20
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
- package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
- package/eigen/Eigen/src/Core/Product.h +30 -25
- package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
- package/eigen/Eigen/src/Core/Random.h +37 -1
- package/eigen/Eigen/src/Core/Redux.h +180 -170
- package/eigen/Eigen/src/Core/Ref.h +118 -21
- package/eigen/Eigen/src/Core/Replicate.h +8 -8
- package/eigen/Eigen/src/Core/Reshaped.h +454 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- package/eigen/Eigen/src/Core/Reverse.h +18 -12
- package/eigen/Eigen/src/Core/Select.h +8 -6
- package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- package/eigen/Eigen/src/Core/Solve.h +14 -14
- package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
- package/eigen/Eigen/src/Core/SolverBase.h +41 -3
- package/eigen/Eigen/src/Core/StableNorm.h +100 -70
- package/eigen/Eigen/src/Core/StlIterators.h +463 -0
- package/eigen/Eigen/src/Core/Stride.h +9 -4
- package/eigen/Eigen/src/Core/Swap.h +5 -4
- package/eigen/Eigen/src/Core/Transpose.h +86 -27
- package/eigen/Eigen/src/Core/Transpositions.h +26 -8
- package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
- package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- package/eigen/Eigen/src/Core/Visitor.h +137 -29
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- package/eigen/Eigen/src/Core/util/Constants.h +25 -9
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- package/eigen/Eigen/src/Core/util/Macros.h +661 -250
- package/eigen/Eigen/src/Core/util/Memory.h +222 -52
- package/eigen/Eigen/src/Core/util/Meta.h +349 -105
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
- package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
- package/eigen/Eigen/src/Geometry/Transform.h +86 -65
- package/eigen/Eigen/src/Geometry/Translation.h +6 -6
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- package/eigen/Eigen/src/Householder/Householder.h +8 -4
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- package/eigen/Eigen/src/LU/Determinant.h +35 -19
- package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
- package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
- package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- package/eigen/Eigen/src/misc/lapacke.h +5 -4
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- package/eigen/README.md +5 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/lib/eigen.d.ts +0 -2
- 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
|
|
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
|
-
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
<< " " << secularEq(0.
|
|
757
|
-
<< " " << secularEq(0.
|
|
758
|
-
<< " " << secularEq(0.
|
|
759
|
-
<< " " << secularEq(0.
|
|
760
|
-
<< " " << secularEq(0.
|
|
761
|
-
<< " " << secularEq(0.
|
|
762
|
-
<< " " << secularEq(0.
|
|
763
|
-
<< " " << secularEq(0.
|
|
764
|
-
<< " " << secularEq(0.
|
|
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
|
|
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 << "
|
|
874
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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()
|
|
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
|
|