mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-19 08:09:36 +08:00
Fix svd test
This commit is contained in:
parent
969c31eefc
commit
c6db610bc7
@ -10,15 +10,6 @@
|
||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/
|
||||
|
||||
// We explicitly disable deprecated declarations for this set of tests
|
||||
// because we purposely verify assertions for the deprecated SVD runtime
|
||||
// option behavior.
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
#elif defined(_MSC_VER)
|
||||
#pragma warning( disable : 4996 )
|
||||
#endif
|
||||
|
||||
// discard stack allocation as that too bypasses malloc
|
||||
#define EIGEN_STACK_ALLOCATION_LIMIT 0
|
||||
#define EIGEN_RUNTIME_NO_MALLOC
|
||||
@ -41,22 +32,6 @@ void bdcsvd_method()
|
||||
VERIFY_IS_APPROX(m.bdcSvd().singularValues(), RealVecType::Ones());
|
||||
VERIFY_RAISES_ASSERT(m.bdcSvd().matrixU());
|
||||
VERIFY_RAISES_ASSERT(m.bdcSvd().matrixV());
|
||||
|
||||
// Deprecated behavior.
|
||||
VERIFY_IS_APPROX(m.bdcSvd(ComputeFullU|ComputeFullV).solve(m), m);
|
||||
VERIFY_IS_APPROX(m.bdcSvd(ComputeFullU|ComputeFullV).transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.bdcSvd(ComputeFullU|ComputeFullV).adjoint().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<DisableQRDecomposition>(ComputeFullU|ComputeFullV).solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<DisableQRDecomposition>(ComputeFullU|ComputeFullV).transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<DisableQRDecomposition>(ComputeFullU|ComputeFullV).adjoint().solve(m), m);
|
||||
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV>().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV>().transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV>().adjoint().solve(m), m);
|
||||
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV | DisableQRDecomposition>().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV | DisableQRDecomposition>().transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template bdcSvd<ComputeFullU | ComputeFullV | DisableQRDecomposition>().adjoint().solve(m), m);
|
||||
}
|
||||
|
||||
// compare the Singular values returned with Jacobi and Bdc
|
||||
|
@ -8,15 +8,6 @@
|
||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
// We explicitly disable deprecated declarations for this set of tests
|
||||
// because we purposely verify assertions for the deprecated SVD runtime
|
||||
// option behavior.
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
#elif defined(_MSC_VER)
|
||||
#pragma warning( disable : 4996 )
|
||||
#endif
|
||||
|
||||
// discard stack allocation as that too bypasses malloc
|
||||
#define EIGEN_STACK_ALLOCATION_LIMIT 0
|
||||
#define EIGEN_RUNTIME_NO_MALLOC
|
||||
@ -41,11 +32,6 @@ void jacobisvd_method()
|
||||
VERIFY_IS_APPROX(m.template jacobiSvd<ComputeFullU | ComputeFullV>().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template jacobiSvd<ComputeFullU | ComputeFullV>().transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.template jacobiSvd<ComputeFullU | ComputeFullV>().adjoint().solve(m), m);
|
||||
|
||||
// Deprecated behavior.
|
||||
VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).solve(m), m);
|
||||
VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).transpose().solve(m), m);
|
||||
VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).adjoint().solve(m), m);
|
||||
}
|
||||
|
||||
template <typename MatrixType>
|
||||
@ -71,7 +57,7 @@ void jacobisvd_verify_assert(const MatrixType& input = MatrixType()) {
|
||||
svd_verify_constructor_options_assert<JacobiSVD<MatrixType>>(m);
|
||||
svd_verify_constructor_options_assert<JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>>(m);
|
||||
svd_verify_constructor_options_assert<JacobiSVD<MatrixType, HouseholderQRPreconditioner>>(m);
|
||||
svd_verify_constructor_options_assert<JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>>(m, true);
|
||||
svd_verify_constructor_options_assert<JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>>(m);
|
||||
}
|
||||
|
||||
template <typename MatrixType>
|
||||
|
@ -278,9 +278,10 @@ void svd_inf_nan() {
|
||||
svd.compute(m);
|
||||
VERIFY(svd.info() == InvalidInput);
|
||||
|
||||
Scalar min = (std::numeric_limits<Scalar>::min)();
|
||||
m.resize(4,4);
|
||||
m << 1, 0, 0, 0,
|
||||
0, 3, 1, 2e-308,
|
||||
0, 3, 1, min,
|
||||
1, 0, 1, nan,
|
||||
0, nan, nan, 0;
|
||||
svd.compute(m);
|
||||
@ -482,35 +483,6 @@ void svd_compute_checks(const MatrixType& m) {
|
||||
}
|
||||
}
|
||||
|
||||
// Deprecated behavior.
|
||||
template <typename SvdType, typename MatrixType>
|
||||
void svd_check_runtime_options(const MatrixType& m, unsigned int computationOptions) {
|
||||
const bool fixedRowAndThinU = SvdType::RowsAtCompileTime != Dynamic && (computationOptions & ComputeThinU) != 0 && m.cols() < m.rows();
|
||||
const bool fixedColAndThinV = SvdType::ColsAtCompileTime != Dynamic && (computationOptions & ComputeThinV) != 0 && m.rows() < m.cols();
|
||||
if (fixedRowAndThinU || fixedColAndThinV) {
|
||||
VERIFY_RAISES_ASSERT(SvdType svd(m, computationOptions));
|
||||
return;
|
||||
}
|
||||
|
||||
Index diagSize = (std::min)(m.rows(), m.cols());
|
||||
|
||||
SvdType svd(m, computationOptions);
|
||||
if (svd.computeU()) {
|
||||
VERIFY(svd.matrixU().isUnitary());
|
||||
if (computationOptions & ComputeThinU) VERIFY(svd.matrixU().cols() == diagSize);
|
||||
}
|
||||
|
||||
if (svd.computeV()) {
|
||||
VERIFY(svd.matrixV().isUnitary());
|
||||
if (computationOptions & ComputeThinV) VERIFY(svd.matrixV().cols() == diagSize);
|
||||
}
|
||||
if (svd.computeU() && svd.computeV()) {
|
||||
svd_test_solvers(m, svd);
|
||||
svd.matrixU().isUnitary();
|
||||
svd.matrixV().isUnitary();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename MatrixType, int QRPreconditioner = 0>
|
||||
void svd_option_checks(const MatrixType& input) {
|
||||
MatrixType m(input.rows(), input.cols());
|
||||
@ -531,20 +503,6 @@ void svd_option_checks(const MatrixType& input) {
|
||||
FullSvdType fullSvd(m);
|
||||
svd_check_full(m, fullSvd);
|
||||
svd_compare_to_full<MatrixType, FullSvdType, QRPreconditioner | ComputeFullU | ComputeFullV>(m, fullSvd);
|
||||
|
||||
// Deprecated behavior.
|
||||
typedef SVD_STATIC_OPTIONS(MatrixType, QRPreconditioner) DynamicSvd;
|
||||
svd_check_runtime_options<DynamicSvd>(m, 0);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeThinU);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeThinV);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeThinU | ComputeThinV);
|
||||
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeFullU);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeFullV);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeFullU | ComputeFullV);
|
||||
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeThinU | ComputeFullV);
|
||||
svd_check_runtime_options<DynamicSvd>(m, ComputeFullU | ComputeThinV);
|
||||
}
|
||||
|
||||
template <typename MatrixType, int QRPreconditioner = 0>
|
||||
@ -592,7 +550,7 @@ void svd_check_max_size_matrix(int initialRows, int initialCols) {
|
||||
}
|
||||
|
||||
template <typename SvdType, typename MatrixType>
|
||||
void svd_verify_constructor_options_assert(const MatrixType& m, bool fullOnly = false) {
|
||||
void svd_verify_constructor_options_assert(const MatrixType& m) {
|
||||
typedef typename MatrixType::Scalar Scalar;
|
||||
Index rows = m.rows();
|
||||
Index cols = m.cols();
|
||||
@ -619,30 +577,6 @@ void svd_verify_constructor_options_assert(const MatrixType& m, bool fullOnly =
|
||||
VERIFY_RAISES_ASSERT(svd2.matrixV())
|
||||
svd2.singularValues();
|
||||
VERIFY_RAISES_ASSERT(svd2.solve(rhs))
|
||||
|
||||
// Deprecated behavior.
|
||||
SvdType svd3(a, ComputeFullU);
|
||||
svd3.matrixU();
|
||||
VERIFY_RAISES_ASSERT(svd3.matrixV())
|
||||
VERIFY_RAISES_ASSERT(svd3.solve(rhs))
|
||||
|
||||
SvdType svd4(a, ComputeFullV);
|
||||
svd4.matrixV();
|
||||
VERIFY_RAISES_ASSERT(svd4.matrixU())
|
||||
VERIFY_RAISES_ASSERT(svd4.solve(rhs))
|
||||
|
||||
if (!fullOnly && ColsAtCompileTime == Dynamic)
|
||||
{
|
||||
SvdType svd5(a, ComputeThinU);
|
||||
svd5.matrixU();
|
||||
VERIFY_RAISES_ASSERT(svd5.matrixV())
|
||||
VERIFY_RAISES_ASSERT(svd5.solve(rhs))
|
||||
|
||||
SvdType svd6(a, ComputeThinV);
|
||||
svd6.matrixV();
|
||||
VERIFY_RAISES_ASSERT(svd6.matrixU())
|
||||
VERIFY_RAISES_ASSERT(svd6.solve(rhs))
|
||||
}
|
||||
}
|
||||
|
||||
#undef SVD_DEFAULT
|
||||
|
Loading…
x
Reference in New Issue
Block a user