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);