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)