bug #949: add static assertion for incompatible scalar types in dense end-user decompositions.
This commit is contained in:
		
							parent
							
								
									b09316fbea
								
							
						
					
					
						commit
						c74284ed81
					
				| @ -235,6 +235,11 @@ template<typename _MatrixType, int _UpLo> class LDLT | ||||
|     } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
| 
 | ||||
|     /** \internal
 | ||||
|       * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U. | ||||
| @ -434,6 +439,8 @@ template<typename MatrixType> struct LDLT_Traits<MatrixType,Upper> | ||||
| template<typename MatrixType, int _UpLo> | ||||
| LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const MatrixType& a) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   eigen_assert(a.rows()==a.cols()); | ||||
|   const Index size = a.rows(); | ||||
| 
 | ||||
|  | ||||
| @ -174,6 +174,12 @@ template<typename _MatrixType, int _UpLo> class LLT | ||||
|     LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1); | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     /** \internal
 | ||||
|       * Used to compute and store L | ||||
|       * The strict upper part is not used and even not initialized. | ||||
| @ -384,6 +390,8 @@ template<typename MatrixType> struct LLT_Traits<MatrixType,Upper> | ||||
| template<typename MatrixType, int _UpLo> | ||||
| LLT<MatrixType,_UpLo>& LLT<MatrixType,_UpLo>::compute(const MatrixType& a) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   eigen_assert(a.rows()==a.cols()); | ||||
|   const Index size = a.rows(); | ||||
|   m_matrix.resize(size, size); | ||||
|  | ||||
| @ -234,6 +234,12 @@ template<typename _MatrixType> class ComplexEigenSolver | ||||
|     } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     EigenvectorType m_eivec; | ||||
|     EigenvalueType m_eivalues; | ||||
|     ComplexSchur<MatrixType> m_schur; | ||||
| @ -251,6 +257,8 @@ template<typename MatrixType> | ||||
| ComplexEigenSolver<MatrixType>&  | ||||
| ComplexEigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   // this code is inspired from Jampack
 | ||||
|   eigen_assert(matrix.cols() == matrix.rows()); | ||||
| 
 | ||||
|  | ||||
| @ -298,6 +298,13 @@ template<typename _MatrixType> class EigenSolver | ||||
|     void doComputeEigenvectors(); | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|       EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_eivec; | ||||
|     EigenvalueType m_eivalues; | ||||
|     bool m_isInitialized; | ||||
| @ -364,6 +371,8 @@ template<typename MatrixType> | ||||
| EigenSolver<MatrixType>&  | ||||
| EigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::sqrt; | ||||
|   using std::abs; | ||||
|   eigen_assert(matrix.cols() == matrix.rows()); | ||||
|  | ||||
| @ -263,6 +263,13 @@ template<typename _MatrixType> class GeneralizedEigenSolver | ||||
|     } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|       EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_eivec; | ||||
|     ComplexVectorType m_alphas; | ||||
|     VectorType m_betas; | ||||
| @ -290,6 +297,8 @@ template<typename MatrixType> | ||||
| GeneralizedEigenSolver<MatrixType>& | ||||
| GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::sqrt; | ||||
|   using std::abs; | ||||
|   eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows()); | ||||
|  | ||||
| @ -351,6 +351,11 @@ template<typename _MatrixType> class SelfAdjointEigenSolver | ||||
|     #endif // EIGEN2_SUPPORT
 | ||||
| 
 | ||||
|   protected: | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_eivec; | ||||
|     RealVectorType m_eivalues; | ||||
|     typename TridiagonalizationType::SubDiagonalType m_subdiag; | ||||
| @ -384,6 +389,8 @@ template<typename MatrixType> | ||||
| SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType> | ||||
| ::compute(const MatrixType& matrix, int options) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::abs; | ||||
|   eigen_assert(matrix.cols() == matrix.rows()); | ||||
|   eigen_assert((options&~(EigVecMask|GenEigMask))==0 | ||||
|  | ||||
| @ -374,6 +374,12 @@ template<typename _MatrixType> class FullPivLU | ||||
|     inline Index cols() const { return m_lu.cols(); } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_lu; | ||||
|     PermutationPType m_p; | ||||
|     PermutationQType m_q; | ||||
| @ -418,6 +424,8 @@ FullPivLU<MatrixType>::FullPivLU(const MatrixType& matrix) | ||||
| template<typename MatrixType> | ||||
| FullPivLU<MatrixType>& FullPivLU<MatrixType>::compute(const MatrixType& matrix) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   // the permutations are stored as int indices, so just to be sure:
 | ||||
|   eigen_assert(matrix.rows()<=NumTraits<int>::highest() && matrix.cols()<=NumTraits<int>::highest()); | ||||
|    | ||||
|  | ||||
| @ -171,6 +171,12 @@ template<typename _MatrixType> class PartialPivLU | ||||
|     inline Index cols() const { return m_lu.cols(); } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_lu; | ||||
|     PermutationType m_p; | ||||
|     TranspositionType m_rowsTranspositions; | ||||
| @ -386,6 +392,8 @@ void partial_lu_inplace(MatrixType& lu, TranspositionType& row_transpositions, t | ||||
| template<typename MatrixType> | ||||
| PartialPivLU<MatrixType>& PartialPivLU<MatrixType>::compute(const MatrixType& matrix) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   // the row permutation is stored as int indices, so just to be sure:
 | ||||
|   eigen_assert(matrix.rows()<NumTraits<int>::highest()); | ||||
|    | ||||
|  | ||||
| @ -384,6 +384,12 @@ template<typename _MatrixType> class ColPivHouseholderQR | ||||
|     } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_qr; | ||||
|     HCoeffsType m_hCoeffs; | ||||
|     PermutationType m_colsPermutation; | ||||
| @ -422,6 +428,8 @@ typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::logAbsDetermina | ||||
| template<typename MatrixType> | ||||
| ColPivHouseholderQR<MatrixType>& ColPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::abs; | ||||
|   Index rows = matrix.rows(); | ||||
|   Index cols = matrix.cols(); | ||||
|  | ||||
| @ -368,6 +368,12 @@ template<typename _MatrixType> class FullPivHouseholderQR | ||||
|     RealScalar maxPivot() const { return m_maxpivot; } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_qr; | ||||
|     HCoeffsType m_hCoeffs; | ||||
|     IntDiagSizeVectorType m_rows_transpositions; | ||||
| @ -407,6 +413,8 @@ typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDetermin | ||||
| template<typename MatrixType> | ||||
| FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::abs; | ||||
|   Index rows = matrix.rows(); | ||||
|   Index cols = matrix.cols(); | ||||
|  | ||||
| @ -189,6 +189,12 @@ template<typename _MatrixType> class HouseholderQR | ||||
|     const HCoeffsType& hCoeffs() const { return m_hCoeffs; } | ||||
| 
 | ||||
|   protected: | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
|      | ||||
|     MatrixType m_qr; | ||||
|     HCoeffsType m_hCoeffs; | ||||
|     RowVectorType m_temp; | ||||
| @ -343,6 +349,8 @@ struct solve_retval<HouseholderQR<_MatrixType>, Rhs> | ||||
| template<typename MatrixType> | ||||
| HouseholderQR<MatrixType>& HouseholderQR<MatrixType>::compute(const MatrixType& matrix) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   Index rows = matrix.rows(); | ||||
|   Index cols = matrix.cols(); | ||||
|   Index size = (std::min)(rows,cols); | ||||
|  | ||||
| @ -742,6 +742,11 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD | ||||
| 
 | ||||
|   private: | ||||
|     void allocate(Index rows, Index cols, unsigned int computationOptions); | ||||
|      | ||||
|     static void check_template_parameters() | ||||
|     { | ||||
|       EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); | ||||
|     } | ||||
| 
 | ||||
|   protected: | ||||
|     MatrixUType m_matrixU; | ||||
| @ -818,6 +823,8 @@ template<typename MatrixType, int QRPreconditioner> | ||||
| JacobiSVD<MatrixType, QRPreconditioner>& | ||||
| JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsigned int computationOptions) | ||||
| { | ||||
|   check_template_parameters(); | ||||
|    | ||||
|   using std::abs; | ||||
|   allocate(matrix.rows(), matrix.cols(), computationOptions); | ||||
| 
 | ||||
|  | ||||
| @ -32,6 +32,17 @@ ei_add_failtest("ref_3") | ||||
| ei_add_failtest("ref_4") | ||||
| ei_add_failtest("ref_5") | ||||
| 
 | ||||
| ei_add_failtest("partialpivlu_int") | ||||
| ei_add_failtest("fullpivlu_int") | ||||
| ei_add_failtest("llt_int") | ||||
| ei_add_failtest("ldlt_int") | ||||
| ei_add_failtest("qr_int") | ||||
| ei_add_failtest("colpivqr_int") | ||||
| ei_add_failtest("fullpivqr_int") | ||||
| ei_add_failtest("jacobisvd_int") | ||||
| ei_add_failtest("eigensolver_int") | ||||
| ei_add_failtest("eigensolver_cplx") | ||||
| 
 | ||||
| if (EIGEN_FAILTEST_FAILURE_COUNT) | ||||
|   message(FATAL_ERROR | ||||
|           "${EIGEN_FAILTEST_FAILURE_COUNT} out of ${EIGEN_FAILTEST_COUNT} failtests FAILED. " | ||||
|  | ||||
							
								
								
									
										14
									
								
								failtest/colpivqr_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/colpivqr_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/QR" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   ColPivHouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/eigensolver_cplx.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/eigensolver_cplx.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/Eigenvalues" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR std::complex<double> | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   EigenSolver<Matrix<SCALAR,Dynamic,Dynamic> > eig(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/eigensolver_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/eigensolver_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/Eigenvalues" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   EigenSolver<Matrix<SCALAR,Dynamic,Dynamic> > eig(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/fullpivlu_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/fullpivlu_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/LU" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   FullPivLU<Matrix<SCALAR,Dynamic,Dynamic> > lu(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/fullpivqr_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/fullpivqr_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/QR" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   FullPivHouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/jacobisvd_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/jacobisvd_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/SVD" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   JacobiSVD<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/ldlt_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/ldlt_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/Cholesky" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   LDLT<Matrix<SCALAR,Dynamic,Dynamic> > ldlt(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/llt_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/llt_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/Cholesky" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   LLT<Matrix<SCALAR,Dynamic,Dynamic> > llt(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/partialpivlu_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/partialpivlu_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/LU" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   PartialPivLU<Matrix<SCALAR,Dynamic,Dynamic> > lu(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
							
								
								
									
										14
									
								
								failtest/qr_int.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								failtest/qr_int.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #include "../Eigen/QR" | ||||
| 
 | ||||
| #ifdef EIGEN_SHOULD_FAIL_TO_BUILD | ||||
| #define SCALAR int | ||||
| #else | ||||
| #define SCALAR float | ||||
| #endif | ||||
| 
 | ||||
| using namespace Eigen; | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|   HouseholderQR<Matrix<SCALAR,Dynamic,Dynamic> > qr(Matrix<SCALAR,Dynamic,Dynamic>::Random(10,10)); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gael Guennebaud
						Gael Guennebaud