@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.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +1 -1
- package/eigen/COPYING.MINPACK +51 -52
- 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 +2 -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
|
@@ -31,15 +31,13 @@ void ordering_helper_at_plus_a(const MatrixType& A, MatrixType& symmat)
|
|
|
31
31
|
for (int i = 0; i < C.rows(); i++)
|
|
32
32
|
{
|
|
33
33
|
for (typename MatrixType::InnerIterator it(C, i); it; ++it)
|
|
34
|
-
it.valueRef() = 0
|
|
34
|
+
it.valueRef() = typename MatrixType::Scalar(0);
|
|
35
35
|
}
|
|
36
36
|
symmat = C + A;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
#ifndef EIGEN_MPL2_ONLY
|
|
42
|
-
|
|
43
41
|
/** \ingroup OrderingMethods_Module
|
|
44
42
|
* \class AMDOrdering
|
|
45
43
|
*
|
|
@@ -81,8 +79,6 @@ class AMDOrdering
|
|
|
81
79
|
}
|
|
82
80
|
};
|
|
83
81
|
|
|
84
|
-
#endif // EIGEN_MPL2_ONLY
|
|
85
|
-
|
|
86
82
|
/** \ingroup OrderingMethods_Module
|
|
87
83
|
* \class NaturalOrdering
|
|
88
84
|
*
|
|
@@ -133,17 +129,17 @@ class COLAMDOrdering
|
|
|
133
129
|
StorageIndex n = StorageIndex(mat.cols());
|
|
134
130
|
StorageIndex nnz = StorageIndex(mat.nonZeros());
|
|
135
131
|
// Get the recommended value of Alen to be used by colamd
|
|
136
|
-
StorageIndex Alen = internal::
|
|
132
|
+
StorageIndex Alen = internal::Colamd::recommended(nnz, m, n);
|
|
137
133
|
// Set the default parameters
|
|
138
|
-
double knobs [
|
|
139
|
-
StorageIndex stats [
|
|
140
|
-
internal::
|
|
134
|
+
double knobs [internal::Colamd::NKnobs];
|
|
135
|
+
StorageIndex stats [internal::Colamd::NStats];
|
|
136
|
+
internal::Colamd::set_defaults(knobs);
|
|
141
137
|
|
|
142
138
|
IndexVector p(n+1), A(Alen);
|
|
143
139
|
for(StorageIndex i=0; i <= n; i++) p(i) = mat.outerIndexPtr()[i];
|
|
144
140
|
for(StorageIndex i=0; i < nnz; i++) A(i) = mat.innerIndexPtr()[i];
|
|
145
141
|
// Call Colamd routine to compute the ordering
|
|
146
|
-
StorageIndex info = internal::
|
|
142
|
+
StorageIndex info = internal::Colamd::compute_ordering(m, n, Alen, A.data(), p.data(), knobs, stats);
|
|
147
143
|
EIGEN_UNUSED_VARIABLE(info);
|
|
148
144
|
eigen_assert( info && "COLAMD failed " );
|
|
149
145
|
|
|
@@ -203,7 +203,7 @@ class PastixBase : public SparseSolverBase<Derived>
|
|
|
203
203
|
|
|
204
204
|
/** \brief Reports whether previous computation was successful.
|
|
205
205
|
*
|
|
206
|
-
* \returns \c Success if computation was
|
|
206
|
+
* \returns \c Success if computation was successful,
|
|
207
207
|
* \c NumericalIssue if the PaStiX reports a problem
|
|
208
208
|
* \c InvalidInput if the input matrix is invalid
|
|
209
209
|
*
|
|
@@ -123,6 +123,7 @@ class PardisoImpl : public SparseSolverBase<Derived>
|
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
PardisoImpl()
|
|
126
|
+
: m_analysisIsOk(false), m_factorizationIsOk(false)
|
|
126
127
|
{
|
|
127
128
|
eigen_assert((sizeof(StorageIndex) >= sizeof(_INTEGER_t) && sizeof(StorageIndex) <= 8) && "Non-supported index type");
|
|
128
129
|
m_iparm.setZero();
|
|
@@ -140,7 +141,7 @@ class PardisoImpl : public SparseSolverBase<Derived>
|
|
|
140
141
|
|
|
141
142
|
/** \brief Reports whether previous computation was successful.
|
|
142
143
|
*
|
|
143
|
-
* \returns \c Success if computation was
|
|
144
|
+
* \returns \c Success if computation was successful,
|
|
144
145
|
* \c NumericalIssue if the matrix appears to be negative.
|
|
145
146
|
*/
|
|
146
147
|
ComputationInfo info() const
|
|
@@ -192,8 +193,7 @@ class PardisoImpl : public SparseSolverBase<Derived>
|
|
|
192
193
|
void pardisoInit(int type)
|
|
193
194
|
{
|
|
194
195
|
m_type = type;
|
|
195
|
-
|
|
196
|
-
bool symmetric = abs(m_type) < 10;
|
|
196
|
+
bool symmetric = std::abs(m_type) < 10;
|
|
197
197
|
m_iparm[0] = 1; // No solver default
|
|
198
198
|
m_iparm[1] = 2; // use Metis for the ordering
|
|
199
199
|
m_iparm[2] = 0; // Reserved. Set to zero. (??Numbers of processors, value of OMP_NUM_THREADS??)
|
|
@@ -386,14 +386,15 @@ class PardisoLU : public PardisoImpl< PardisoLU<MatrixType> >
|
|
|
386
386
|
{
|
|
387
387
|
protected:
|
|
388
388
|
typedef PardisoImpl<PardisoLU> Base;
|
|
389
|
-
typedef typename Base::Scalar Scalar;
|
|
390
|
-
typedef typename Base::RealScalar RealScalar;
|
|
391
389
|
using Base::pardisoInit;
|
|
392
390
|
using Base::m_matrix;
|
|
393
391
|
friend class PardisoImpl< PardisoLU<MatrixType> >;
|
|
394
392
|
|
|
395
393
|
public:
|
|
396
394
|
|
|
395
|
+
typedef typename Base::Scalar Scalar;
|
|
396
|
+
typedef typename Base::RealScalar RealScalar;
|
|
397
|
+
|
|
397
398
|
using Base::compute;
|
|
398
399
|
using Base::solve;
|
|
399
400
|
|
|
@@ -441,14 +442,14 @@ class PardisoLLT : public PardisoImpl< PardisoLLT<MatrixType,_UpLo> >
|
|
|
441
442
|
{
|
|
442
443
|
protected:
|
|
443
444
|
typedef PardisoImpl< PardisoLLT<MatrixType,_UpLo> > Base;
|
|
444
|
-
typedef typename Base::Scalar Scalar;
|
|
445
|
-
typedef typename Base::RealScalar RealScalar;
|
|
446
445
|
using Base::pardisoInit;
|
|
447
446
|
using Base::m_matrix;
|
|
448
447
|
friend class PardisoImpl< PardisoLLT<MatrixType,_UpLo> >;
|
|
449
448
|
|
|
450
449
|
public:
|
|
451
450
|
|
|
451
|
+
typedef typename Base::Scalar Scalar;
|
|
452
|
+
typedef typename Base::RealScalar RealScalar;
|
|
452
453
|
typedef typename Base::StorageIndex StorageIndex;
|
|
453
454
|
enum { UpLo = _UpLo };
|
|
454
455
|
using Base::compute;
|
|
@@ -504,14 +505,14 @@ class PardisoLDLT : public PardisoImpl< PardisoLDLT<MatrixType,Options> >
|
|
|
504
505
|
{
|
|
505
506
|
protected:
|
|
506
507
|
typedef PardisoImpl< PardisoLDLT<MatrixType,Options> > Base;
|
|
507
|
-
typedef typename Base::Scalar Scalar;
|
|
508
|
-
typedef typename Base::RealScalar RealScalar;
|
|
509
508
|
using Base::pardisoInit;
|
|
510
509
|
using Base::m_matrix;
|
|
511
510
|
friend class PardisoImpl< PardisoLDLT<MatrixType,Options> >;
|
|
512
511
|
|
|
513
512
|
public:
|
|
514
513
|
|
|
514
|
+
typedef typename Base::Scalar Scalar;
|
|
515
|
+
typedef typename Base::RealScalar RealScalar;
|
|
515
516
|
typedef typename Base::StorageIndex StorageIndex;
|
|
516
517
|
using Base::compute;
|
|
517
518
|
enum { UpLo = Options&(Upper|Lower) };
|
|
@@ -17,6 +17,9 @@ namespace internal {
|
|
|
17
17
|
template<typename _MatrixType> struct traits<ColPivHouseholderQR<_MatrixType> >
|
|
18
18
|
: traits<_MatrixType>
|
|
19
19
|
{
|
|
20
|
+
typedef MatrixXpr XprKind;
|
|
21
|
+
typedef SolverStorage StorageKind;
|
|
22
|
+
typedef int StorageIndex;
|
|
20
23
|
enum { Flags = 0 };
|
|
21
24
|
};
|
|
22
25
|
|
|
@@ -46,20 +49,19 @@ template<typename _MatrixType> struct traits<ColPivHouseholderQR<_MatrixType> >
|
|
|
46
49
|
* \sa MatrixBase::colPivHouseholderQr()
|
|
47
50
|
*/
|
|
48
51
|
template<typename _MatrixType> class ColPivHouseholderQR
|
|
52
|
+
: public SolverBase<ColPivHouseholderQR<_MatrixType> >
|
|
49
53
|
{
|
|
50
54
|
public:
|
|
51
55
|
|
|
52
56
|
typedef _MatrixType MatrixType;
|
|
57
|
+
typedef SolverBase<ColPivHouseholderQR> Base;
|
|
58
|
+
friend class SolverBase<ColPivHouseholderQR>;
|
|
59
|
+
|
|
60
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(ColPivHouseholderQR)
|
|
53
61
|
enum {
|
|
54
|
-
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
55
|
-
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
56
62
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
57
63
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
58
64
|
};
|
|
59
|
-
typedef typename MatrixType::Scalar Scalar;
|
|
60
|
-
typedef typename MatrixType::RealScalar RealScalar;
|
|
61
|
-
// FIXME should be int
|
|
62
|
-
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
63
65
|
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
64
66
|
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
|
|
65
67
|
typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
|
|
@@ -156,6 +158,7 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
156
158
|
computeInPlace();
|
|
157
159
|
}
|
|
158
160
|
|
|
161
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
159
162
|
/** This method finds a solution x to the equation Ax=b, where A is the matrix of which
|
|
160
163
|
* *this is the QR decomposition, if any exists.
|
|
161
164
|
*
|
|
@@ -172,11 +175,8 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
172
175
|
*/
|
|
173
176
|
template<typename Rhs>
|
|
174
177
|
inline const Solve<ColPivHouseholderQR, Rhs>
|
|
175
|
-
solve(const MatrixBase<Rhs>& b) const
|
|
176
|
-
|
|
177
|
-
eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
|
|
178
|
-
return Solve<ColPivHouseholderQR, Rhs>(*this, b.derived());
|
|
179
|
-
}
|
|
178
|
+
solve(const MatrixBase<Rhs>& b) const;
|
|
179
|
+
#endif
|
|
180
180
|
|
|
181
181
|
HouseholderSequenceType householderQ() const;
|
|
182
182
|
HouseholderSequenceType matrixQ() const
|
|
@@ -402,7 +402,7 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
402
402
|
*/
|
|
403
403
|
RealScalar maxPivot() const { return m_maxpivot; }
|
|
404
404
|
|
|
405
|
-
/** \brief Reports whether the QR factorization was
|
|
405
|
+
/** \brief Reports whether the QR factorization was successful.
|
|
406
406
|
*
|
|
407
407
|
* \note This function always returns \c Success. It is provided for compatibility
|
|
408
408
|
* with other factorization routines.
|
|
@@ -416,8 +416,10 @@ template<typename _MatrixType> class ColPivHouseholderQR
|
|
|
416
416
|
|
|
417
417
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
418
418
|
template<typename RhsType, typename DstType>
|
|
419
|
-
EIGEN_DEVICE_FUNC
|
|
420
419
|
void _solve_impl(const RhsType &rhs, DstType &dst) const;
|
|
420
|
+
|
|
421
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
422
|
+
void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
|
|
421
423
|
#endif
|
|
422
424
|
|
|
423
425
|
protected:
|
|
@@ -584,8 +586,6 @@ template<typename _MatrixType>
|
|
|
584
586
|
template<typename RhsType, typename DstType>
|
|
585
587
|
void ColPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
|
|
586
588
|
{
|
|
587
|
-
eigen_assert(rhs.rows() == rows());
|
|
588
|
-
|
|
589
589
|
const Index nonzero_pivots = nonzeroPivots();
|
|
590
590
|
|
|
591
591
|
if(nonzero_pivots == 0)
|
|
@@ -596,11 +596,7 @@ void ColPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &
|
|
|
596
596
|
|
|
597
597
|
typename RhsType::PlainObject c(rhs);
|
|
598
598
|
|
|
599
|
-
|
|
600
|
-
c.applyOnTheLeft(householderSequence(m_qr, m_hCoeffs)
|
|
601
|
-
.setLength(nonzero_pivots)
|
|
602
|
-
.transpose()
|
|
603
|
-
);
|
|
599
|
+
c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint() );
|
|
604
600
|
|
|
605
601
|
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
606
602
|
.template triangularView<Upper>()
|
|
@@ -609,6 +605,31 @@ void ColPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &
|
|
|
609
605
|
for(Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
|
|
610
606
|
for(Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
|
|
611
607
|
}
|
|
608
|
+
|
|
609
|
+
template<typename _MatrixType>
|
|
610
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
611
|
+
void ColPivHouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
|
|
612
|
+
{
|
|
613
|
+
const Index nonzero_pivots = nonzeroPivots();
|
|
614
|
+
|
|
615
|
+
if(nonzero_pivots == 0)
|
|
616
|
+
{
|
|
617
|
+
dst.setZero();
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
typename RhsType::PlainObject c(m_colsPermutation.transpose()*rhs);
|
|
622
|
+
|
|
623
|
+
m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
|
|
624
|
+
.template triangularView<Upper>()
|
|
625
|
+
.transpose().template conjugateIf<Conjugate>()
|
|
626
|
+
.solveInPlace(c.topRows(nonzero_pivots));
|
|
627
|
+
|
|
628
|
+
dst.topRows(nonzero_pivots) = c.topRows(nonzero_pivots);
|
|
629
|
+
dst.bottomRows(rows()-nonzero_pivots).setZero();
|
|
630
|
+
|
|
631
|
+
dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>() );
|
|
632
|
+
}
|
|
612
633
|
#endif
|
|
613
634
|
|
|
614
635
|
namespace internal {
|
|
@@ -16,6 +16,9 @@ namespace internal {
|
|
|
16
16
|
template <typename _MatrixType>
|
|
17
17
|
struct traits<CompleteOrthogonalDecomposition<_MatrixType> >
|
|
18
18
|
: traits<_MatrixType> {
|
|
19
|
+
typedef MatrixXpr XprKind;
|
|
20
|
+
typedef SolverStorage StorageKind;
|
|
21
|
+
typedef int StorageIndex;
|
|
19
22
|
enum { Flags = 0 };
|
|
20
23
|
};
|
|
21
24
|
|
|
@@ -44,19 +47,21 @@ struct traits<CompleteOrthogonalDecomposition<_MatrixType> >
|
|
|
44
47
|
*
|
|
45
48
|
* \sa MatrixBase::completeOrthogonalDecomposition()
|
|
46
49
|
*/
|
|
47
|
-
template <typename _MatrixType>
|
|
48
|
-
|
|
50
|
+
template <typename _MatrixType> class CompleteOrthogonalDecomposition
|
|
51
|
+
: public SolverBase<CompleteOrthogonalDecomposition<_MatrixType> >
|
|
52
|
+
{
|
|
49
53
|
public:
|
|
50
54
|
typedef _MatrixType MatrixType;
|
|
55
|
+
typedef SolverBase<CompleteOrthogonalDecomposition> Base;
|
|
56
|
+
|
|
57
|
+
template<typename Derived>
|
|
58
|
+
friend struct internal::solve_assertion;
|
|
59
|
+
|
|
60
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(CompleteOrthogonalDecomposition)
|
|
51
61
|
enum {
|
|
52
|
-
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
53
|
-
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
54
62
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
55
63
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
56
64
|
};
|
|
57
|
-
typedef typename MatrixType::Scalar Scalar;
|
|
58
|
-
typedef typename MatrixType::RealScalar RealScalar;
|
|
59
|
-
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
60
65
|
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
61
66
|
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime>
|
|
62
67
|
PermutationType;
|
|
@@ -131,9 +136,9 @@ class CompleteOrthogonalDecomposition {
|
|
|
131
136
|
m_temp(matrix.cols())
|
|
132
137
|
{
|
|
133
138
|
computeInPlace();
|
|
134
|
-
}
|
|
135
|
-
|
|
139
|
+
}
|
|
136
140
|
|
|
141
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
137
142
|
/** This method computes the minimum-norm solution X to a least squares
|
|
138
143
|
* problem \f[\mathrm{minimize} \|A X - B\|, \f] where \b A is the matrix of
|
|
139
144
|
* which \c *this is the complete orthogonal decomposition.
|
|
@@ -145,11 +150,8 @@ class CompleteOrthogonalDecomposition {
|
|
|
145
150
|
*/
|
|
146
151
|
template <typename Rhs>
|
|
147
152
|
inline const Solve<CompleteOrthogonalDecomposition, Rhs> solve(
|
|
148
|
-
const MatrixBase<Rhs>& b) const
|
|
149
|
-
|
|
150
|
-
"CompleteOrthogonalDecomposition is not initialized.");
|
|
151
|
-
return Solve<CompleteOrthogonalDecomposition, Rhs>(*this, b.derived());
|
|
152
|
-
}
|
|
153
|
+
const MatrixBase<Rhs>& b) const;
|
|
154
|
+
#endif
|
|
153
155
|
|
|
154
156
|
HouseholderSequenceType householderQ(void) const;
|
|
155
157
|
HouseholderSequenceType matrixQ(void) const { return m_cpqr.householderQ(); }
|
|
@@ -158,8 +160,8 @@ class CompleteOrthogonalDecomposition {
|
|
|
158
160
|
*/
|
|
159
161
|
MatrixType matrixZ() const {
|
|
160
162
|
MatrixType Z = MatrixType::Identity(m_cpqr.cols(), m_cpqr.cols());
|
|
161
|
-
|
|
162
|
-
return Z
|
|
163
|
+
applyZOnTheLeftInPlace<false>(Z);
|
|
164
|
+
return Z;
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
/** \returns a reference to the matrix where the complete orthogonal
|
|
@@ -275,6 +277,7 @@ class CompleteOrthogonalDecomposition {
|
|
|
275
277
|
*/
|
|
276
278
|
inline const Inverse<CompleteOrthogonalDecomposition> pseudoInverse() const
|
|
277
279
|
{
|
|
280
|
+
eigen_assert(m_cpqr.m_isInitialized && "CompleteOrthogonalDecomposition is not initialized.");
|
|
278
281
|
return Inverse<CompleteOrthogonalDecomposition>(*this);
|
|
279
282
|
}
|
|
280
283
|
|
|
@@ -353,7 +356,7 @@ class CompleteOrthogonalDecomposition {
|
|
|
353
356
|
inline RealScalar maxPivot() const { return m_cpqr.maxPivot(); }
|
|
354
357
|
|
|
355
358
|
/** \brief Reports whether the complete orthogonal decomposition was
|
|
356
|
-
*
|
|
359
|
+
* successful.
|
|
357
360
|
*
|
|
358
361
|
* \note This function always returns \c Success. It is provided for
|
|
359
362
|
* compatibility
|
|
@@ -367,7 +370,10 @@ class CompleteOrthogonalDecomposition {
|
|
|
367
370
|
|
|
368
371
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
369
372
|
template <typename RhsType, typename DstType>
|
|
370
|
-
|
|
373
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
374
|
+
|
|
375
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
376
|
+
void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
|
|
371
377
|
#endif
|
|
372
378
|
|
|
373
379
|
protected:
|
|
@@ -375,8 +381,22 @@ class CompleteOrthogonalDecomposition {
|
|
|
375
381
|
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
376
382
|
}
|
|
377
383
|
|
|
384
|
+
template<bool Transpose_, typename Rhs>
|
|
385
|
+
void _check_solve_assertion(const Rhs& b) const {
|
|
386
|
+
EIGEN_ONLY_USED_FOR_DEBUG(b);
|
|
387
|
+
eigen_assert(m_cpqr.m_isInitialized && "CompleteOrthogonalDecomposition is not initialized.");
|
|
388
|
+
eigen_assert((Transpose_?derived().cols():derived().rows())==b.rows() && "CompleteOrthogonalDecomposition::solve(): invalid number of rows of the right hand side matrix b");
|
|
389
|
+
}
|
|
390
|
+
|
|
378
391
|
void computeInPlace();
|
|
379
392
|
|
|
393
|
+
/** Overwrites \b rhs with \f$ \mathbf{Z} * \mathbf{rhs} \f$ or
|
|
394
|
+
* \f$ \mathbf{\overline Z} * \mathbf{rhs} \f$ if \c Conjugate
|
|
395
|
+
* is set to \c true.
|
|
396
|
+
*/
|
|
397
|
+
template <bool Conjugate, typename Rhs>
|
|
398
|
+
void applyZOnTheLeftInPlace(Rhs& rhs) const;
|
|
399
|
+
|
|
380
400
|
/** Overwrites \b rhs with \f$ \mathbf{Z}^* * \mathbf{rhs} \f$.
|
|
381
401
|
*/
|
|
382
402
|
template <typename Rhs>
|
|
@@ -452,7 +472,7 @@ void CompleteOrthogonalDecomposition<MatrixType>::computeInPlace()
|
|
|
452
472
|
// Apply Z(k) to the first k rows of X_k
|
|
453
473
|
m_cpqr.m_qr.topRightCorner(k, cols - rank + 1)
|
|
454
474
|
.applyHouseholderOnTheRight(
|
|
455
|
-
m_cpqr.m_qr.row(k).tail(cols - rank).
|
|
475
|
+
m_cpqr.m_qr.row(k).tail(cols - rank).adjoint(), m_zCoeffs(k),
|
|
456
476
|
&m_temp(0));
|
|
457
477
|
}
|
|
458
478
|
if (k != rank - 1) {
|
|
@@ -464,6 +484,28 @@ void CompleteOrthogonalDecomposition<MatrixType>::computeInPlace()
|
|
|
464
484
|
}
|
|
465
485
|
}
|
|
466
486
|
|
|
487
|
+
template <typename MatrixType>
|
|
488
|
+
template <bool Conjugate, typename Rhs>
|
|
489
|
+
void CompleteOrthogonalDecomposition<MatrixType>::applyZOnTheLeftInPlace(
|
|
490
|
+
Rhs& rhs) const {
|
|
491
|
+
const Index cols = this->cols();
|
|
492
|
+
const Index nrhs = rhs.cols();
|
|
493
|
+
const Index rank = this->rank();
|
|
494
|
+
Matrix<typename Rhs::Scalar, Dynamic, 1> temp((std::max)(cols, nrhs));
|
|
495
|
+
for (Index k = rank-1; k >= 0; --k) {
|
|
496
|
+
if (k != rank - 1) {
|
|
497
|
+
rhs.row(k).swap(rhs.row(rank - 1));
|
|
498
|
+
}
|
|
499
|
+
rhs.middleRows(rank - 1, cols - rank + 1)
|
|
500
|
+
.applyHouseholderOnTheLeft(
|
|
501
|
+
matrixQTZ().row(k).tail(cols - rank).transpose().template conjugateIf<!Conjugate>(), zCoeffs().template conjugateIf<Conjugate>()(k),
|
|
502
|
+
&temp(0));
|
|
503
|
+
if (k != rank - 1) {
|
|
504
|
+
rhs.row(k).swap(rhs.row(rank - 1));
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
467
509
|
template <typename MatrixType>
|
|
468
510
|
template <typename Rhs>
|
|
469
511
|
void CompleteOrthogonalDecomposition<MatrixType>::applyZAdjointOnTheLeftInPlace(
|
|
@@ -471,7 +513,7 @@ void CompleteOrthogonalDecomposition<MatrixType>::applyZAdjointOnTheLeftInPlace(
|
|
|
471
513
|
const Index cols = this->cols();
|
|
472
514
|
const Index nrhs = rhs.cols();
|
|
473
515
|
const Index rank = this->rank();
|
|
474
|
-
Matrix<typename
|
|
516
|
+
Matrix<typename Rhs::Scalar, Dynamic, 1> temp((std::max)(cols, nrhs));
|
|
475
517
|
for (Index k = 0; k < rank; ++k) {
|
|
476
518
|
if (k != rank - 1) {
|
|
477
519
|
rhs.row(k).swap(rhs.row(rank - 1));
|
|
@@ -491,8 +533,6 @@ template <typename _MatrixType>
|
|
|
491
533
|
template <typename RhsType, typename DstType>
|
|
492
534
|
void CompleteOrthogonalDecomposition<_MatrixType>::_solve_impl(
|
|
493
535
|
const RhsType& rhs, DstType& dst) const {
|
|
494
|
-
eigen_assert(rhs.rows() == this->rows());
|
|
495
|
-
|
|
496
536
|
const Index rank = this->rank();
|
|
497
537
|
if (rank == 0) {
|
|
498
538
|
dst.setZero();
|
|
@@ -500,11 +540,8 @@ void CompleteOrthogonalDecomposition<_MatrixType>::_solve_impl(
|
|
|
500
540
|
}
|
|
501
541
|
|
|
502
542
|
// Compute c = Q^* * rhs
|
|
503
|
-
// Note that the matrix Q = H_0^* H_1^*... so its inverse is
|
|
504
|
-
// Q^* = (H_0 H_1 ...)^T
|
|
505
543
|
typename RhsType::PlainObject c(rhs);
|
|
506
|
-
c.applyOnTheLeft(
|
|
507
|
-
householderSequence(matrixQTZ(), hCoeffs()).setLength(rank).transpose());
|
|
544
|
+
c.applyOnTheLeft(matrixQ().setLength(rank).adjoint());
|
|
508
545
|
|
|
509
546
|
// Solve T z = c(1:rank, :)
|
|
510
547
|
dst.topRows(rank) = matrixT()
|
|
@@ -523,10 +560,45 @@ void CompleteOrthogonalDecomposition<_MatrixType>::_solve_impl(
|
|
|
523
560
|
// Undo permutation to get x = P^{-1} * y.
|
|
524
561
|
dst = colsPermutation() * dst;
|
|
525
562
|
}
|
|
563
|
+
|
|
564
|
+
template<typename _MatrixType>
|
|
565
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
566
|
+
void CompleteOrthogonalDecomposition<_MatrixType>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
|
|
567
|
+
{
|
|
568
|
+
const Index rank = this->rank();
|
|
569
|
+
|
|
570
|
+
if (rank == 0) {
|
|
571
|
+
dst.setZero();
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
typename RhsType::PlainObject c(colsPermutation().transpose()*rhs);
|
|
576
|
+
|
|
577
|
+
if (rank < cols()) {
|
|
578
|
+
applyZOnTheLeftInPlace<!Conjugate>(c);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
matrixT().topLeftCorner(rank, rank)
|
|
582
|
+
.template triangularView<Upper>()
|
|
583
|
+
.transpose().template conjugateIf<Conjugate>()
|
|
584
|
+
.solveInPlace(c.topRows(rank));
|
|
585
|
+
|
|
586
|
+
dst.topRows(rank) = c.topRows(rank);
|
|
587
|
+
dst.bottomRows(rows()-rank).setZero();
|
|
588
|
+
|
|
589
|
+
dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>() );
|
|
590
|
+
}
|
|
526
591
|
#endif
|
|
527
592
|
|
|
528
593
|
namespace internal {
|
|
529
594
|
|
|
595
|
+
template<typename MatrixType>
|
|
596
|
+
struct traits<Inverse<CompleteOrthogonalDecomposition<MatrixType> > >
|
|
597
|
+
: traits<typename Transpose<typename MatrixType::PlainObject>::PlainObject>
|
|
598
|
+
{
|
|
599
|
+
enum { Flags = 0 };
|
|
600
|
+
};
|
|
601
|
+
|
|
530
602
|
template<typename DstXprType, typename MatrixType>
|
|
531
603
|
struct Assignment<DstXprType, Inverse<CompleteOrthogonalDecomposition<MatrixType> >, internal::assign_op<typename DstXprType::Scalar,typename CompleteOrthogonalDecomposition<MatrixType>::Scalar>, Dense2Dense>
|
|
532
604
|
{
|
|
@@ -534,7 +606,8 @@ struct Assignment<DstXprType, Inverse<CompleteOrthogonalDecomposition<MatrixType
|
|
|
534
606
|
typedef Inverse<CodType> SrcXprType;
|
|
535
607
|
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename CodType::Scalar> &)
|
|
536
608
|
{
|
|
537
|
-
|
|
609
|
+
typedef Matrix<typename CodType::Scalar, CodType::RowsAtCompileTime, CodType::RowsAtCompileTime, 0, CodType::MaxRowsAtCompileTime, CodType::MaxRowsAtCompileTime> IdentityMatrixType;
|
|
610
|
+
dst = src.nestedExpression().solve(IdentityMatrixType::Identity(src.cols(), src.cols()));
|
|
538
611
|
}
|
|
539
612
|
};
|
|
540
613
|
|
|
@@ -18,6 +18,9 @@ namespace internal {
|
|
|
18
18
|
template<typename _MatrixType> struct traits<FullPivHouseholderQR<_MatrixType> >
|
|
19
19
|
: traits<_MatrixType>
|
|
20
20
|
{
|
|
21
|
+
typedef MatrixXpr XprKind;
|
|
22
|
+
typedef SolverStorage StorageKind;
|
|
23
|
+
typedef int StorageIndex;
|
|
21
24
|
enum { Flags = 0 };
|
|
22
25
|
};
|
|
23
26
|
|
|
@@ -55,20 +58,19 @@ struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
|
|
|
55
58
|
* \sa MatrixBase::fullPivHouseholderQr()
|
|
56
59
|
*/
|
|
57
60
|
template<typename _MatrixType> class FullPivHouseholderQR
|
|
61
|
+
: public SolverBase<FullPivHouseholderQR<_MatrixType> >
|
|
58
62
|
{
|
|
59
63
|
public:
|
|
60
64
|
|
|
61
65
|
typedef _MatrixType MatrixType;
|
|
66
|
+
typedef SolverBase<FullPivHouseholderQR> Base;
|
|
67
|
+
friend class SolverBase<FullPivHouseholderQR>;
|
|
68
|
+
|
|
69
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
|
|
62
70
|
enum {
|
|
63
|
-
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
64
|
-
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
65
71
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
66
72
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
67
73
|
};
|
|
68
|
-
typedef typename MatrixType::Scalar Scalar;
|
|
69
|
-
typedef typename MatrixType::RealScalar RealScalar;
|
|
70
|
-
// FIXME should be int
|
|
71
|
-
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
72
74
|
typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType> MatrixQReturnType;
|
|
73
75
|
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
74
76
|
typedef Matrix<StorageIndex, 1,
|
|
@@ -156,6 +158,7 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
156
158
|
computeInPlace();
|
|
157
159
|
}
|
|
158
160
|
|
|
161
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
159
162
|
/** This method finds a solution x to the equation Ax=b, where A is the matrix of which
|
|
160
163
|
* \c *this is the QR decomposition.
|
|
161
164
|
*
|
|
@@ -173,11 +176,8 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
173
176
|
*/
|
|
174
177
|
template<typename Rhs>
|
|
175
178
|
inline const Solve<FullPivHouseholderQR, Rhs>
|
|
176
|
-
solve(const MatrixBase<Rhs>& b) const
|
|
177
|
-
|
|
178
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
179
|
-
return Solve<FullPivHouseholderQR, Rhs>(*this, b.derived());
|
|
180
|
-
}
|
|
179
|
+
solve(const MatrixBase<Rhs>& b) const;
|
|
180
|
+
#endif
|
|
181
181
|
|
|
182
182
|
/** \returns Expression object representing the matrix Q
|
|
183
183
|
*/
|
|
@@ -392,22 +392,24 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
392
392
|
* diagonal coefficient of U.
|
|
393
393
|
*/
|
|
394
394
|
RealScalar maxPivot() const { return m_maxpivot; }
|
|
395
|
-
|
|
395
|
+
|
|
396
396
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
397
397
|
template<typename RhsType, typename DstType>
|
|
398
|
-
EIGEN_DEVICE_FUNC
|
|
399
398
|
void _solve_impl(const RhsType &rhs, DstType &dst) const;
|
|
399
|
+
|
|
400
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
401
|
+
void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
|
|
400
402
|
#endif
|
|
401
403
|
|
|
402
404
|
protected:
|
|
403
|
-
|
|
405
|
+
|
|
404
406
|
static void check_template_parameters()
|
|
405
407
|
{
|
|
406
408
|
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
407
409
|
}
|
|
408
|
-
|
|
410
|
+
|
|
409
411
|
void computeInPlace();
|
|
410
|
-
|
|
412
|
+
|
|
411
413
|
MatrixType m_qr;
|
|
412
414
|
HCoeffsType m_hCoeffs;
|
|
413
415
|
IntDiagSizeVectorType m_rows_transpositions;
|
|
@@ -499,15 +501,15 @@ void FullPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
499
501
|
m_nonzero_pivots = k;
|
|
500
502
|
for(Index i = k; i < size; i++)
|
|
501
503
|
{
|
|
502
|
-
m_rows_transpositions.coeffRef(i) = i;
|
|
503
|
-
m_cols_transpositions.coeffRef(i) = i;
|
|
504
|
+
m_rows_transpositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
|
|
505
|
+
m_cols_transpositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
|
|
504
506
|
m_hCoeffs.coeffRef(i) = Scalar(0);
|
|
505
507
|
}
|
|
506
508
|
break;
|
|
507
509
|
}
|
|
508
510
|
|
|
509
|
-
m_rows_transpositions.coeffRef(k) = row_of_biggest_in_corner;
|
|
510
|
-
m_cols_transpositions.coeffRef(k) = col_of_biggest_in_corner;
|
|
511
|
+
m_rows_transpositions.coeffRef(k) = internal::convert_index<StorageIndex>(row_of_biggest_in_corner);
|
|
512
|
+
m_cols_transpositions.coeffRef(k) = internal::convert_index<StorageIndex>(col_of_biggest_in_corner);
|
|
511
513
|
if(k != row_of_biggest_in_corner) {
|
|
512
514
|
m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
|
|
513
515
|
++number_of_transpositions;
|
|
@@ -541,7 +543,6 @@ template<typename _MatrixType>
|
|
|
541
543
|
template<typename RhsType, typename DstType>
|
|
542
544
|
void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
|
|
543
545
|
{
|
|
544
|
-
eigen_assert(rhs.rows() == rows());
|
|
545
546
|
const Index l_rank = rank();
|
|
546
547
|
|
|
547
548
|
// FIXME introduce nonzeroPivots() and use it here. and more generally,
|
|
@@ -554,7 +555,7 @@ void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType
|
|
|
554
555
|
|
|
555
556
|
typename RhsType::PlainObject c(rhs);
|
|
556
557
|
|
|
557
|
-
Matrix<Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
558
|
+
Matrix<typename RhsType::Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
558
559
|
for (Index k = 0; k < l_rank; ++k)
|
|
559
560
|
{
|
|
560
561
|
Index remainingSize = rows()-k;
|
|
@@ -571,6 +572,42 @@ void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType
|
|
|
571
572
|
for(Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
|
|
572
573
|
for(Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
|
|
573
574
|
}
|
|
575
|
+
|
|
576
|
+
template<typename _MatrixType>
|
|
577
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
578
|
+
void FullPivHouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
|
|
579
|
+
{
|
|
580
|
+
const Index l_rank = rank();
|
|
581
|
+
|
|
582
|
+
if(l_rank == 0)
|
|
583
|
+
{
|
|
584
|
+
dst.setZero();
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
typename RhsType::PlainObject c(m_cols_permutation.transpose()*rhs);
|
|
589
|
+
|
|
590
|
+
m_qr.topLeftCorner(l_rank, l_rank)
|
|
591
|
+
.template triangularView<Upper>()
|
|
592
|
+
.transpose().template conjugateIf<Conjugate>()
|
|
593
|
+
.solveInPlace(c.topRows(l_rank));
|
|
594
|
+
|
|
595
|
+
dst.topRows(l_rank) = c.topRows(l_rank);
|
|
596
|
+
dst.bottomRows(rows()-l_rank).setZero();
|
|
597
|
+
|
|
598
|
+
Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
|
|
599
|
+
const Index size = (std::min)(rows(), cols());
|
|
600
|
+
for (Index k = size-1; k >= 0; --k)
|
|
601
|
+
{
|
|
602
|
+
Index remainingSize = rows()-k;
|
|
603
|
+
|
|
604
|
+
dst.bottomRightCorner(remainingSize, dst.cols())
|
|
605
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1).template conjugateIf<!Conjugate>(),
|
|
606
|
+
m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
|
|
607
|
+
|
|
608
|
+
dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
|
|
609
|
+
}
|
|
610
|
+
}
|
|
574
611
|
#endif
|
|
575
612
|
|
|
576
613
|
namespace internal {
|