Fix #ifdef guards around METIS usage in EigenSparse backend and tests Change-Id: Idd1e0b7b1b2df2d402431b107dee0fa8e0fd58f5
diff --git a/internal/ceres/dynamic_sparsity_test.cc b/internal/ceres/dynamic_sparsity_test.cc index 694a343..9173098 100644 --- a/internal/ceres/dynamic_sparsity_test.cc +++ b/internal/ceres/dynamic_sparsity_test.cc
@@ -366,7 +366,8 @@ }; TEST(DynamicSparsity, StaticAndDynamicSparsityProduceSameSolution) { - // Skip test if there is no sparse linear algebra library. + // Skip test if there is no sparse linear algebra library that + // supports dynamic sparsity. if (!IsSparseLinearAlgebraLibraryTypeAvailable(SUITE_SPARSE) && !IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { return; @@ -426,6 +427,13 @@ Solver::Options options; options.max_num_iterations = 100; options.linear_solver_type = SPARSE_NORMAL_CHOLESKY; + // Only SuiteSparse & EigenSparse currently support dynamic sparsity. + options.sparse_linear_algebra_library_type = +#if !defined(CERES_NO_SUITESPARSE) + ceres::SUITE_SPARSE; +#elif defined(CERES_USE_EIGEN_SPARSE) + ceres::EIGEN_SPARSE; +#endif // First, solve `X` and `t` jointly with dynamic_sparsity = true. Matrix X0 = X;
diff --git a/internal/ceres/eigensparse.cc b/internal/ceres/eigensparse.cc index 982608a..a2407c0 100644 --- a/internal/ceres/eigensparse.cc +++ b/internal/ceres/eigensparse.cc
@@ -157,23 +157,19 @@ if (ordering_type == OrderingType::AMD) { return std::make_unique<EigenSparseCholeskyTemplate<WithAMDOrdering>>(); -#ifndef CERES_NO_EIGEN_METIS } else if (ordering_type == OrderingType::NESDIS) { +#ifndef CERES_NO_EIGEN_METIS using WithMetisOrdering = Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>, Eigen::Upper, Eigen::MetisOrdering<int>>; - return std::make_unique<EigenSparseCholeskyTemplate<WithMetisOrdering>>(); - } #else - } else { LOG(FATAL) << "Congratulations you have found a bug in Ceres Solver. Please " "report it to the Ceres Solver developers."; return nullptr; +#endif // CERES_NO_EIGEN_METIS } -#endif - return std::make_unique<EigenSparseCholeskyTemplate<WithNaturalOrdering>>(); } @@ -190,23 +186,19 @@ Eigen::NaturalOrdering<int>>; if (ordering_type == OrderingType::AMD) { return std::make_unique<EigenSparseCholeskyTemplate<WithAMDOrdering>>(); -#ifndef CERES_NO_EIGEN_METIS } else if (ordering_type == OrderingType::NESDIS) { +#ifndef CERES_NO_EIGEN_METIS using WithMetisOrdering = Eigen::SimplicialLDLT<Eigen::SparseMatrix<float>, Eigen::Upper, Eigen::MetisOrdering<int>>; - return std::make_unique<EigenSparseCholeskyTemplate<WithMetisOrdering>>(); - } #else - } else { LOG(FATAL) << "Congratulations you have found a bug in Ceres Solver. Please " - "report it to the Ceres Solver developers."; + "report it to the Ceres Solver developers."; return nullptr; +#endif // CERES_NO_EIGEN_METIS } -#endif - return std::make_unique<EigenSparseCholeskyTemplate<WithNaturalOrdering>>(); }
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc index 47a370d..9503843 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc
@@ -213,6 +213,10 @@ *error = StringPrintf( "Can't use NESDIS with SUITE_SPARSE because SuiteSparse was " "compiled without support for Metis."); + } else if (options.sparse_linear_algebra_library_type == EIGEN_SPARSE) { + *error = StringPrintf( + "Can't use NESDIS with EIGEN_SPARSE because Ceres was " + "compiled without support for Metis."); } else { *error = StringPrintf( "Can't use NESDIS with "
diff --git a/internal/ceres/sparse_cholesky_test.cc b/internal/ceres/sparse_cholesky_test.cc index 785f2e9..147711e 100644 --- a/internal/ceres/sparse_cholesky_test.cc +++ b/internal/ceres/sparse_cholesky_test.cc
@@ -230,7 +230,9 @@ SparseCholeskyTest, ::testing::Combine(::testing::Values(EIGEN_SPARSE), ::testing::Values(OrderingType::AMD, +#ifndef CERES_NO_EIGEN_METIS OrderingType::NESDIS, +#endif // CERES_NO_EIGEN_METIS OrderingType::NATURAL), ::testing::Values(true, false)), ParamInfoToString); @@ -240,7 +242,9 @@ SparseCholeskyTest, ::testing::Combine(::testing::Values(EIGEN_SPARSE), ::testing::Values(OrderingType::AMD, +#ifndef CERES_NO_EIGEN_METIS OrderingType::NESDIS, +#endif // CERES_NO_EIGEN_METIS OrderingType::NATURAL), ::testing::Values(true, false)), ParamInfoToString);