diff options
Diffstat (limited to 'internal/ceres/linear_solver.cc')
-rw-r--r-- | internal/ceres/linear_solver.cc | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/internal/ceres/linear_solver.cc b/internal/ceres/linear_solver.cc index 08c3ba1..e983e2c 100644 --- a/internal/ceres/linear_solver.cc +++ b/internal/ceres/linear_solver.cc @@ -45,6 +45,30 @@ namespace internal { LinearSolver::~LinearSolver() { } +LinearSolverType LinearSolver::LinearSolverForZeroEBlocks( + LinearSolverType linear_solver_type) { + if (!IsSchurType(linear_solver_type)) { + return linear_solver_type; + } + + if (linear_solver_type == SPARSE_SCHUR) { + return SPARSE_NORMAL_CHOLESKY; + } + + if (linear_solver_type == DENSE_SCHUR) { + // TODO(sameeragarwal): This is probably not a great choice. + // Ideally, we should have a DENSE_NORMAL_CHOLESKY, that can take + // a BlockSparseMatrix as input. + return DENSE_QR; + } + + if (linear_solver_type == ITERATIVE_SCHUR) { + return CGNR; + } + + return linear_solver_type; +} + LinearSolver* LinearSolver::Create(const LinearSolver::Options& options) { switch (options.type) { case CGNR: @@ -52,9 +76,6 @@ LinearSolver* LinearSolver::Create(const LinearSolver::Options& options) { case SPARSE_NORMAL_CHOLESKY: #if defined(CERES_NO_SUITESPARSE) && defined(CERES_NO_CXSPARSE) - LOG(WARNING) << "SPARSE_NORMAL_CHOLESKY is not available. Please " - << "build Ceres with SuiteSparse or CXSparse. " - << "Returning NULL."; return NULL; #else return new SparseNormalCholeskySolver(options); @@ -62,9 +83,6 @@ LinearSolver* LinearSolver::Create(const LinearSolver::Options& options) { case SPARSE_SCHUR: #if defined(CERES_NO_SUITESPARSE) && defined(CERES_NO_CXSPARSE) - LOG(WARNING) << "SPARSE_SCHUR is not available. Please " - << "build Ceres with SuiteSparse or CXSparse. " - << "Returning NULL."; return NULL; #else return new SparseSchurComplementSolver(options); |