From 9aef0db9928e54d1b0a317b07c2cc3a9b42fe5b2 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 9 Jun 2015 09:29:53 +0200 Subject: Skip too large real-world problems for solvers that do not scale (e.g., SimplicialLLT without reordering) --- test/sparse_solver.h | 62 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'test/sparse_solver.h') diff --git a/test/sparse_solver.h b/test/sparse_solver.h index 6ccc5487b..7d6f58649 100644 --- a/test/sparse_solver.h +++ b/test/sparse_solver.h @@ -218,7 +218,7 @@ std::string solver_stats(const SparseSolverBase &/*solver*/) } #endif -template void check_sparse_spd_solving(Solver& solver) +template void check_sparse_spd_solving(Solver& solver, int maxSize = 300, int maxRealWorldSize = 100000) { typedef typename Solver::MatrixType Mat; typedef typename Mat::Scalar Scalar; @@ -231,7 +231,7 @@ template void check_sparse_spd_solving(Solver& solver) Mat A, halfA; DenseMatrix dA; for (int i = 0; i < g_repeat; i++) { - int size = generate_sparse_spd_problem(solver, A, halfA, dA); + int size = generate_sparse_spd_problem(solver, A, halfA, dA, maxSize); // generate the right hand sides int rhsCols = internal::random(1,16); @@ -267,19 +267,28 @@ template void check_sparse_spd_solving(Solver& solver) { if (it.sym() == SPD){ A = it.matrix(); - DenseVector b = it.rhs(); - DenseVector refX = it.refX(); - PermutationMatrix pnull; - if(Solver::UpLo == (Lower|Upper)) - halfA = A; + if(A.diagonal().size() <= maxRealWorldSize) + { + DenseVector b = it.rhs(); + DenseVector refX = it.refX(); + PermutationMatrix pnull; + if(Solver::UpLo == (Lower|Upper)) + halfA = A; + else + halfA.template selfadjointView() = A.template triangularView().twistedBy(pnull); + + std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() + << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; + CALL_SUBTEST( check_sparse_solving_real_cases(solver, A, b, A, refX) ); + std::string stats = solver_stats(solver); + if(stats.size()>0) + std::cout << "INFO | " << stats << std::endl; + CALL_SUBTEST( check_sparse_solving_real_cases(solver, halfA, b, A, refX) ); + } else - halfA.template selfadjointView() = A.template triangularView().twistedBy(pnull); - - std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() - << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; - CALL_SUBTEST( check_sparse_solving_real_cases(solver, A, b, A, refX) ); - std::cout << "INFO | " << solver_stats(solver) << std::endl; - CALL_SUBTEST( check_sparse_solving_real_cases(solver, halfA, b, A, refX) ); + { + std::cout << "INFO | Skip sparse problem \"" << it.matname() << "\" (too large)" << std::endl; + } } } } @@ -320,7 +329,7 @@ Index generate_sparse_square_problem(Solver&, typename Solver::MatrixType& A, De return size; } -template void check_sparse_square_solving(Solver& solver) +template void check_sparse_square_solving(Solver& solver, int maxSize = 300, int maxRealWorldSize = 100000) { typedef typename Solver::MatrixType Mat; typedef typename Mat::Scalar Scalar; @@ -333,7 +342,7 @@ template void check_sparse_square_solving(Solver& solver) Mat A; DenseMatrix dA; for (int i = 0; i < g_repeat; i++) { - Index size = generate_sparse_square_problem(solver, A, dA); + Index size = generate_sparse_square_problem(solver, A, dA, maxSize); A.makeCompressed(); DenseVector b = DenseVector::Random(size); @@ -364,12 +373,21 @@ template void check_sparse_square_solving(Solver& solver) for (; it; ++it) { A = it.matrix(); - DenseVector b = it.rhs(); - DenseVector refX = it.refX(); - std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() - << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; - CALL_SUBTEST(check_sparse_solving_real_cases(solver, A, b, A, refX)); - std::cout << "INFO | " << solver_stats(solver) << std::endl; + if(A.diagonal().size() <= maxRealWorldSize) + { + DenseVector b = it.rhs(); + DenseVector refX = it.refX(); + std::cout << "INFO | Testing " << sym_to_string(it.sym()) << "sparse problem " << it.matname() + << " (" << A.rows() << "x" << A.cols() << ") using " << typeid(Solver).name() << "..." << std::endl; + CALL_SUBTEST(check_sparse_solving_real_cases(solver, A, b, A, refX)); + std::string stats = solver_stats(solver); + if(stats.size()>0) + std::cout << "INFO | " << stats << std::endl; + } + else + { + std::cout << "INFO | SKIP sparse problem \"" << it.matname() << "\" (too large)" << std::endl; + } } } #endif -- cgit v1.2.3