diff options
Diffstat (limited to 'extern/ceres/internal/ceres/linear_solver.h')
-rw-r--r-- | extern/ceres/internal/ceres/linear_solver.h | 122 |
1 files changed, 50 insertions, 72 deletions
diff --git a/extern/ceres/internal/ceres/linear_solver.h b/extern/ceres/internal/ceres/linear_solver.h index fb9332ca6e3..cb624b372dd 100644 --- a/extern/ceres/internal/ceres/linear_solver.h +++ b/extern/ceres/internal/ceres/linear_solver.h @@ -41,6 +41,7 @@ #include "ceres/block_sparse_matrix.h" #include "ceres/casts.h" #include "ceres/compressed_row_sparse_matrix.h" +#include "ceres/context_impl.h" #include "ceres/dense_sparse_matrix.h" #include "ceres/execution_summary.h" #include "ceres/triplet_sparse_matrix.h" @@ -69,6 +70,16 @@ enum LinearSolverTerminationType { LINEAR_SOLVER_FATAL_ERROR }; +// This enum controls the fill-reducing ordering a sparse linear +// algebra library should use before computing a sparse factorization +// (usually Cholesky). +enum OrderingType { + NATURAL, // Do not re-order the matrix. This is useful when the + // matrix has been ordered using a fill-reducing ordering + // already. + AMD // Use the Approximate Minimum Degree algorithm to re-order + // the matrix. +}; class LinearOperator; @@ -91,42 +102,25 @@ class LinearOperator; class LinearSolver { public: struct Options { - Options() - : type(SPARSE_NORMAL_CHOLESKY), - preconditioner_type(JACOBI), - visibility_clustering_type(CANONICAL_VIEWS), - dense_linear_algebra_library_type(EIGEN), - sparse_linear_algebra_library_type(SUITE_SPARSE), - use_postordering(false), - dynamic_sparsity(false), - use_explicit_schur_complement(false), - min_num_iterations(1), - max_num_iterations(1), - num_threads(1), - residual_reset_period(10), - row_block_size(Eigen::Dynamic), - e_block_size(Eigen::Dynamic), - f_block_size(Eigen::Dynamic) { - } - - LinearSolverType type; - PreconditionerType preconditioner_type; - VisibilityClusteringType visibility_clustering_type; - DenseLinearAlgebraLibraryType dense_linear_algebra_library_type; - SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type; + LinearSolverType type = SPARSE_NORMAL_CHOLESKY; + PreconditionerType preconditioner_type = JACOBI; + VisibilityClusteringType visibility_clustering_type = CANONICAL_VIEWS; + DenseLinearAlgebraLibraryType dense_linear_algebra_library_type = EIGEN; + SparseLinearAlgebraLibraryType sparse_linear_algebra_library_type = + SUITE_SPARSE; // See solver.h for information about these flags. - bool use_postordering; - bool dynamic_sparsity; - bool use_explicit_schur_complement; + bool use_postordering = false; + bool dynamic_sparsity = false; + bool use_explicit_schur_complement = false; // Number of internal iterations that the solver uses. This // parameter only makes sense for iterative solvers like CG. - int min_num_iterations; - int max_num_iterations; + int min_num_iterations = 1; + int max_num_iterations = 1; // If possible, how many threads can the solver use. - int num_threads; + int num_threads = 1; // Hints about the order in which the parameter blocks should be // eliminated by the linear solver. @@ -151,7 +145,7 @@ class LinearSolver { // inaccurate over time. Thus for non-zero values of this // parameter, the solver can be told to recalculate the value of // the residual using a |b - Ax| evaluation. - int residual_reset_period; + int residual_reset_period = 10; // If the block sizes in a BlockSparseMatrix are fixed, then in // some cases the Schur complement based solvers can detect and @@ -162,20 +156,18 @@ class LinearSolver { // // Please see schur_complement_solver.h and schur_eliminator.h for // more details. - int row_block_size; - int e_block_size; - int f_block_size; + int row_block_size = Eigen::Dynamic; + int e_block_size = Eigen::Dynamic; + int f_block_size = Eigen::Dynamic; + + bool use_mixed_precision_solves = false; + int max_num_refinement_iterations = 0; + int subset_preconditioner_start_row_block = -1; + ContextImpl* context = nullptr; }; // Options for the Solve method. struct PerSolveOptions { - PerSolveOptions() - : D(NULL), - preconditioner(NULL), - r_tolerance(0.0), - q_tolerance(0.0) { - } - // This option only makes sense for unsymmetric linear solvers // that can solve rectangular linear systems. // @@ -199,7 +191,7 @@ class LinearSolver { // does not have full column rank, the results returned by the // solver cannot be relied on. D, if it is not null is an array of // size n. b is an array of size m and x is an array of size n. - double * D; + double* D = nullptr; // This option only makes sense for iterative solvers. // @@ -221,7 +213,7 @@ class LinearSolver { // // A null preconditioner is equivalent to an identity matrix being // used a preconditioner. - LinearOperator* preconditioner; + LinearOperator* preconditioner = nullptr; // The following tolerance related options only makes sense for @@ -233,7 +225,7 @@ class LinearSolver { // // This is the most commonly used termination criterion for // iterative solvers. - double r_tolerance; + double r_tolerance = 0.0; // For PSD matrices A, let // @@ -257,22 +249,16 @@ class LinearSolver { // Journal of Computational and Applied Mathematics, // 124(1-2), 45-59, 2000. // - double q_tolerance; + double q_tolerance = 0.0; }; // Summary of a call to the Solve method. We should move away from // the true/false method for determining solver success. We should // let the summary object do the talking. struct Summary { - Summary() - : residual_norm(0.0), - num_iterations(-1), - termination_type(LINEAR_SOLVER_FAILURE) { - } - - double residual_norm; - int num_iterations; - LinearSolverTerminationType termination_type; + double residual_norm = -1.0; + int num_iterations = -1; + LinearSolverTerminationType termination_type = LINEAR_SOLVER_FAILURE; std::string message; }; @@ -292,16 +278,12 @@ class LinearSolver { const PerSolveOptions& per_solve_options, double* x) = 0; - // The following two methods return copies instead of references so - // that the base class implementation does not have to worry about - // life time issues. Further, these calls are not expected to be - // frequent or performance sensitive. - virtual std::map<std::string, int> CallStatistics() const { - return std::map<std::string, int>(); - } - - virtual std::map<std::string, double> TimeStatistics() const { - return std::map<std::string, double>(); + // This method returns copies instead of references so that the base + // class implementation does not have to worry about life time + // issues. Further, this calls are not expected to be frequent or + // performance sensitive. + virtual std::map<std::string, CallStatistics> Statistics() const { + return std::map<std::string, CallStatistics>(); } // Factory @@ -325,18 +307,14 @@ class TypedLinearSolver : public LinearSolver { const LinearSolver::PerSolveOptions& per_solve_options, double* x) { ScopedExecutionTimer total_time("LinearSolver::Solve", &execution_summary_); - CHECK_NOTNULL(A); - CHECK_NOTNULL(b); - CHECK_NOTNULL(x); + CHECK(A != nullptr); + CHECK(b != nullptr); + CHECK(x != nullptr); return SolveImpl(down_cast<MatrixType*>(A), b, per_solve_options, x); } - virtual std::map<std::string, int> CallStatistics() const { - return execution_summary_.calls(); - } - - virtual std::map<std::string, double> TimeStatistics() const { - return execution_summary_.times(); + virtual std::map<std::string, CallStatistics> Statistics() const { + return execution_summary_.statistics(); } private: |