From 12263e28305a2a43b6c6a6b4f7f76814ab7ffa5f Mon Sep 17 00:00:00 2001 From: Sameer Agarwal Date: Mon, 16 May 2022 09:27:49 -0700 Subject: [PATCH] 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 --- CMakeLists.txt | 2 +- docs/source/installation.rst | 2 +- internal/ceres/reorder_program.cc | 11 ++--- internal/ceres/suitesparse.cc | 9 ---- internal/ceres/suitesparse.h | 50 --------------------- internal/ceres/trust_region_preprocessor.cc | 12 ++--- 6 files changed, 8 insertions(+), 78 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6bf90509..d72fe29a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,7 +266,7 @@ if (SUITESPARSE) # 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 fa845c195..7cce06724 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -68,7 +68,7 @@ optional. For details on customizing the build process, see examples and tests and usually a dependency for glog. - `SuiteSparse `_ - 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 a4f7c356e..bda454589 100644 --- a/internal/ceres/reorder_program.cc +++ b/internal/ceres/reorder_program.cc @@ -120,10 +120,9 @@ void OrderingForSparseNormalCholeskyUsingSuiteSparse( cholmod_sparse* block_jacobian_transpose = ss.CreateSparseMatrix( const_cast(&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 constraints; @@ -331,10 +330,6 @@ static void MaybeReorderSchurComplementColumnsUsingSuiteSparse( const ParameterBlockOrdering& parameter_block_ordering, Program* program) { #ifndef CERES_NO_SUITESPARSE SuiteSparse ss; - if (!SuiteSparse::IsConstrainedApproximateMinimumDegreeOrderingAvailable()) { - return; - } - vector constraints; vector& parameter_blocks = *(program->mutable_parameter_blocks()); diff --git a/internal/ceres/suitesparse.cc b/internal/ceres/suitesparse.cc index 7dffe1c39..a7d28e678 100644 --- a/internal/ceres/suitesparse.cc +++ b/internal/ceres/suitesparse.cc @@ -352,16 +352,7 @@ bool SuiteSparse::NestedDissectionOrdering(cholmod_sparse* matrix, 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 SuiteSparseCholesky::Create( diff --git a/internal/ceres/suitesparse.h b/internal/ceres/suitesparse.h index ad7b0dad6..b8dc666c9 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 @@ class CERES_NO_EXPORT SuiteSparse { // 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 @@ class CERES_NO_EXPORT SuiteSparse { // 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 @@ namespace internal { 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 4b970210d..daf6601ad 100644 --- a/internal/ceres/trust_region_preprocessor.cc +++ b/internal/ceres/trust_region_preprocessor.cc @@ -227,21 +227,15 @@ bool SetupLinearSolver(PreprocessedProblem* pp) { 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; } }