Make the min. required version of SuiteSparse to be 4.5.6 With this change we can drop the complicated/conditional handling around CAMD and assume that it is always available. Change-Id: I93e1da676fb75817f79824b8b2b6549d03f278b0
diff --git a/CMakeLists.txt b/CMakeLists.txt index f6bf905..d72fe29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -266,7 +266,7 @@ # built with SuiteSparse support. # Check for SuiteSparse and dependencies. - find_package(SuiteSparse 4.0 COMPONENTS CHOLMOD SPQR) + find_package(SuiteSparse 4.5.6 COMPONENTS CHOLMOD SPQR) if (SuiteSparse_FOUND) set(SuiteSparse_DEPENDENCY "find_dependency(SuiteSparse ${SuiteSparse_VERSION})") # By default, if all of SuiteSparse's dependencies are found, Ceres is
diff --git a/docs/source/installation.rst b/docs/source/installation.rst index fa845c1..7cce067 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst
@@ -68,7 +68,7 @@ examples and tests and usually a dependency for glog. - `SuiteSparse <http://faculty.cse.tamu.edu/davis/suitesparse.html>`_ - 4.0 or later. Needed for solving large sparse linear + 4.5.6 or later. Needed for solving large sparse linear systems. **Optional; strongly recommended for large scale bundle adjustment**
diff --git a/internal/ceres/reorder_program.cc b/internal/ceres/reorder_program.cc index a4f7c35..bda4545 100644 --- a/internal/ceres/reorder_program.cc +++ b/internal/ceres/reorder_program.cc
@@ -120,10 +120,9 @@ cholmod_sparse* block_jacobian_transpose = ss.CreateSparseMatrix( const_cast<TripletSparseMatrix*>(&tsm_block_jacobian_transpose)); - // No CAMD or the user did not supply a useful ordering, then just - // use regular AMD. - if (parameter_block_ordering.NumGroups() <= 1 || - !SuiteSparse::IsConstrainedApproximateMinimumDegreeOrderingAvailable()) { + // If the user did not supply a useful ordering, then just use + // regular AMD. + if (parameter_block_ordering.NumGroups() <= 1) { ss.ApproximateMinimumDegreeOrdering(block_jacobian_transpose, &ordering[0]); } else { vector<int> constraints; @@ -331,10 +330,6 @@ const ParameterBlockOrdering& parameter_block_ordering, Program* program) { #ifndef CERES_NO_SUITESPARSE SuiteSparse ss; - if (!SuiteSparse::IsConstrainedApproximateMinimumDegreeOrderingAvailable()) { - return; - } - vector<int> constraints; vector<ParameterBlock*>& parameter_blocks = *(program->mutable_parameter_blocks());
diff --git a/internal/ceres/suitesparse.cc b/internal/ceres/suitesparse.cc index 7dffe1c..a7d28e6 100644 --- a/internal/ceres/suitesparse.cc +++ b/internal/ceres/suitesparse.cc
@@ -352,16 +352,7 @@ bool SuiteSparse::ConstrainedApproximateMinimumDegreeOrdering( cholmod_sparse* matrix, int* constraints, int* ordering) { -#ifndef CERES_NO_CAMD return cholmod_camd(matrix, nullptr, 0, constraints, ordering, &cc_); -#else - LOG(FATAL) << "Congratulations you have found a bug in Ceres." - << "Ceres Solver was compiled with SuiteSparse " - << "version 4.1.0 or less. Calling this function " - << "in that case is a bug. Please contact the" - << "the Ceres Solver developers."; - return false; -#endif } std::unique_ptr<SparseCholesky> SuiteSparseCholesky::Create(
diff --git a/internal/ceres/suitesparse.h b/internal/ceres/suitesparse.h index ad7b0da..b8dc666 100644 --- a/internal/ceres/suitesparse.h +++ b/internal/ceres/suitesparse.h
@@ -49,28 +49,6 @@ #include "cholmod.h" #include "glog/logging.h" -// Before SuiteSparse version 4.2.0, cholmod_camd was only enabled -// if SuiteSparse was compiled with Metis support. This makes -// calling and linking into cholmod_camd problematic even though it -// has nothing to do with Metis. This has been fixed reliably in -// 4.2.0. -// -// The fix was actually committed in 4.1.0, but there is -// some confusion about a silent update to the tar ball, so we are -// being conservative and choosing the next minor version where -// things are stable. -#if (SUITESPARSE_VERSION < 4002) -#define CERES_NO_CAMD -#endif - -// UF_long is deprecated but SuiteSparse_long is only available in -// newer versions of SuiteSparse. So for older versions of -// SuiteSparse, we define SuiteSparse_long to be the same as UF_long, -// which is what recent versions of SuiteSparse do anyways. -#ifndef SuiteSparse_long -#define SuiteSparse_long UF_long -#endif - #include "ceres/internal/disable_warnings.h" namespace ceres::internal { @@ -240,20 +218,6 @@ // Find a fill reducing ordering using nested dissection. bool NestedDissectionOrdering(cholmod_sparse* matrix, int* ordering); - // Before SuiteSparse version 4.2.0, cholmod_camd was only enabled - // if SuiteSparse was compiled with Metis support. This makes - // calling and linking into cholmod_camd problematic even though it - // has nothing to do with Metis. This has been fixed reliably in - // 4.2.0. - // - // The fix was actually committed in 4.1.0, but there is - // some confusion about a silent update to the tar ball, so we are - // being conservative and choosing the next minor version where - // things are stable. - static bool IsConstrainedApproximateMinimumDegreeOrderingAvailable() { - return (SUITESPARSE_VERSION > 4001); - } - // Nested dissection is only available if SuiteSparse is compiled // with Metis support. static bool IsNestedDissectionAvailable() { @@ -274,9 +238,6 @@ // Calling ApproximateMinimumDegreeOrdering is equivalent to calling // ConstrainedApproximateMinimumDegreeOrdering with a constraint // array that puts all columns in the same elimination group. - // - // If CERES_NO_CAMD is defined then calling this function will - // result in a crash. bool ConstrainedApproximateMinimumDegreeOrdering(cholmod_sparse* matrix, int* constraints, int* ordering); @@ -339,17 +300,6 @@ class CERES_NO_EXPORT SuiteSparse { public: - // Defining this static function even when SuiteSparse is not - // available, allows client code to check for the presence of CAMD - // without checking for the absence of the CERES_NO_CAMD symbol. - // - // This is safer because the symbol maybe missing due to a user - // accidentally not including suitesparse.h in their code when - // checking for the symbol. - static bool IsConstrainedApproximateMinimumDegreeOrderingAvailable() { - return false; - } - void Free(void* /*arg*/) {} };
diff --git a/internal/ceres/trust_region_preprocessor.cc b/internal/ceres/trust_region_preprocessor.cc index 4b97021..daf6601 100644 --- a/internal/ceres/trust_region_preprocessor.cc +++ b/internal/ceres/trust_region_preprocessor.cc
@@ -227,21 +227,15 @@ if (options.linear_solver_type == SPARSE_SCHUR) { // When using SPARSE_SCHUR, we ignore the user's postordering - // preferences in certain cases. - // - // 1. SUITE_SPARSE is the sparse linear algebra library requested - // but cholmod_camd is not available. - // 2. CX_SPARSE is the sparse linear algebra library requested. + // preferences if CX_SPARSE is the sparse linear algebra + // backend. // // This ensures that the linear solver does not assume that a // fill-reducing pre-ordering has been done. // // TODO(sameeragarwal): Implement the reordering of parameter // blocks for CX_SPARSE. - if ((options.sparse_linear_algebra_library_type == SUITE_SPARSE && - !SuiteSparse:: - IsConstrainedApproximateMinimumDegreeOrderingAvailable()) || - (options.sparse_linear_algebra_library_type == CX_SPARSE)) { + if (options.sparse_linear_algebra_library_type == CX_SPARSE) { pp->linear_solver_options.use_postordering = true; } }