From c4dbc927d68cc2fac92d7c0d41ef8fab133ab5a0 Mon Sep 17 00:00:00 2001 From: Alex Stewart Date: Wed, 26 Jun 2019 14:59:35 +0100 Subject: [PATCH] Default to any other sparse libraries over Accelerate - Accelerate currently does not support dynamic sparsity, whereas the other sparse linear algebra libraries do (outstanding issue to update) - Previously we preferred Accelerate to all but SuiteSparse if it was available, which breaks the dynamic_sparsity_test if SuiteSparse is *not* available (even if others are) as Accelerate does not support dynamic sparsity. Change-Id: Ibc2dd2f14f83cffbecca38097d02bb2188aaaa05 --- include/ceres/solver.h | 8 ++++---- .../ceres/dynamic_sparse_normal_cholesky_solver.cc | 6 ++++-- internal/ceres/solver.cc | 14 ++++++++++---- internal/ceres/solver_test.cc | 9 +++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/include/ceres/solver.h b/include/ceres/solver.h index f0efeb48e..10c26839b 100644 --- a/include/ceres/solver.h +++ b/include/ceres/solver.h @@ -358,12 +358,12 @@ class CERES_EXPORT Solver { SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type = #if !defined(CERES_NO_SUITESPARSE) SUITE_SPARSE; -#elif !defined(CERES_NO_ACCELERATE_SPARSE) - ACCELERATE_SPARSE; -#elif !defined(CERES_NO_CXSPARSE) - CX_SPARSE; #elif defined(CERES_USE_EIGEN_SPARSE) EIGEN_SPARSE; +#elif !defined(CERES_NO_CXSPARSE) + CX_SPARSE; +#elif !defined(CERES_NO_ACCELERATE_SPARSE) + ACCELERATE_SPARSE; #else NO_SPARSE; #endif diff --git a/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc b/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc index f9660838a..25d5417bc 100644 --- a/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc +++ b/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc @@ -92,8 +92,10 @@ LinearSolver::Summary DynamicSparseNormalCholeskySolver::SolveImpl( summary = SolveImplUsingEigen(A, x); break; default: - LOG(FATAL) << "Unknown sparse linear algebra library : " - << options_.sparse_linear_algebra_library_type; + LOG(FATAL) << "Unsupported sparse linear algebra library for " + << "dynamic sparsity: " + << SparseLinearAlgebraLibraryTypeToString( + options_.sparse_linear_algebra_library_type); } if (per_solve_options.D != nullptr) { diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc index 0627d8c7f..14e50f31b 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc @@ -222,10 +222,16 @@ bool TrustRegionOptionsAreValid(const Solver::Options& options, string* error) { return false; } - if (options.dynamic_sparsity && - options.linear_solver_type != SPARSE_NORMAL_CHOLESKY) { - *error = "Dynamic sparsity is only supported with SPARSE_NORMAL_CHOLESKY."; - return false; + if (options.dynamic_sparsity) { + if (options.linear_solver_type != SPARSE_NORMAL_CHOLESKY) { + *error = "Dynamic sparsity is only supported with SPARSE_NORMAL_CHOLESKY."; + return false; + } + if (options.sparse_linear_algebra_library_type == ACCELERATE_SPARSE) { + *error = "ACCELERATE_SPARSE is not currently supported with dynamic " + "sparsity."; + return false; + } } return true; diff --git a/internal/ceres/solver_test.cc b/internal/ceres/solver_test.cc index 6acae0b39..6fb5f7451 100644 --- a/internal/ceres/solver_test.cc +++ b/internal/ceres/solver_test.cc @@ -336,6 +336,15 @@ TEST(Solver, SparseSchurNoAccelerateSparse) { string message; EXPECT_FALSE(options.IsValid(&message)); } +#else +TEST(Solver, DynamicSparseNormalCholeskyUnsupportedWithAccelerateSparse) { + Solver::Options options; + options.sparse_linear_algebra_library_type = ACCELERATE_SPARSE; + options.linear_solver_type = SPARSE_NORMAL_CHOLESKY; + options.dynamic_sparsity = true; + string message; + EXPECT_FALSE(options.IsValid(&message)); +} #endif #if !defined(CERES_USE_EIGEN_SPARSE)