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
diff --git a/include/ceres/solver.h b/include/ceres/solver.h index f0efeb4..10c2683 100644 --- a/include/ceres/solver.h +++ b/include/ceres/solver.h
@@ -358,12 +358,12 @@ 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 f966083..25d5417 100644 --- a/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc +++ b/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc
@@ -92,8 +92,10 @@ 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 0627d8c..14e50f3 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc
@@ -222,10 +222,16 @@ 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 6acae0b..6fb5f74 100644 --- a/internal/ceres/solver_test.cc +++ b/internal/ceres/solver_test.cc
@@ -336,6 +336,15 @@ 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)