Add final specifier to internal classes. This should help the compiler devirtualize a bunch of function calls. https://github.com/ceres-solver/ceres-solver/issues/747 Change-Id: I9913e68d85e0e9c9f955a249cc710a657875c869
diff --git a/internal/ceres/accelerate_sparse.h b/internal/ceres/accelerate_sparse.h index 7d52294..29d78e8 100644 --- a/internal/ceres/accelerate_sparse.h +++ b/internal/ceres/accelerate_sparse.h
@@ -111,7 +111,7 @@ // An implementation of SparseCholesky interface using Apple's Accelerate // framework. template <typename Scalar> -class AppleAccelerateCholesky : public SparseCholesky { +class AppleAccelerateCholesky final : public SparseCholesky { public: // Factory static std::unique_ptr<SparseCholesky> Create(OrderingType ordering_type);
diff --git a/internal/ceres/block_sparse_matrix.h b/internal/ceres/block_sparse_matrix.h index df8382d..8e555b0 100644 --- a/internal/ceres/block_sparse_matrix.h +++ b/internal/ceres/block_sparse_matrix.h
@@ -55,7 +55,7 @@ // // internal/ceres/block_structure.h // -class CERES_NO_EXPORT BlockSparseMatrix : public SparseMatrix { +class CERES_NO_EXPORT BlockSparseMatrix final : public SparseMatrix { public: // Construct a block sparse matrix with a fully initialized // CompressedRowBlockStructure objected. The matrix takes over
diff --git a/internal/ceres/c_api.cc b/internal/ceres/c_api.cc index 9a0fd9c..784504f 100644 --- a/internal/ceres/c_api.cc +++ b/internal/ceres/c_api.cc
@@ -65,7 +65,7 @@ // This cost function wraps a C-level function pointer from the user, to bridge // between C and C++. -class CERES_NO_EXPORT CallbackCostFunction : public ceres::CostFunction { +class CERES_NO_EXPORT CallbackCostFunction final : public ceres::CostFunction { public: CallbackCostFunction(ceres_cost_function_t cost_function, void* user_data, @@ -93,7 +93,7 @@ // This loss function wraps a C-level function pointer from the user, to bridge // between C and C++. -class CallbackLossFunction : public ceres::LossFunction { +class CallbackLossFunction final : public ceres::LossFunction { public: explicit CallbackLossFunction(ceres_loss_function_t loss_function, void* user_data)
diff --git a/internal/ceres/callbacks.h b/internal/ceres/callbacks.h index 883de05..3b1d10c 100644 --- a/internal/ceres/callbacks.h +++ b/internal/ceres/callbacks.h
@@ -43,7 +43,7 @@ // Callback for updating the externally visible state of parameter // blocks. -class CERES_NO_EXPORT StateUpdatingCallback : public IterationCallback { +class CERES_NO_EXPORT StateUpdatingCallback final : public IterationCallback { public: StateUpdatingCallback(Program* program, double* parameters); ~StateUpdatingCallback() override; @@ -56,7 +56,7 @@ // Callback for updating the externally visible state of the // parameters vector for GradientProblemSolver. -class CERES_NO_EXPORT GradientProblemSolverStateUpdatingCallback +class CERES_NO_EXPORT GradientProblemSolverStateUpdatingCallback final : public IterationCallback { public: GradientProblemSolverStateUpdatingCallback(int num_parameters, @@ -73,7 +73,7 @@ // Callback for logging the state of the minimizer to STDERR or // STDOUT depending on the user's preferences and logging level. -class CERES_NO_EXPORT LoggingCallback : public IterationCallback { +class CERES_NO_EXPORT LoggingCallback final : public IterationCallback { public: LoggingCallback(MinimizerType minimizer_type, bool log_to_stdout); ~LoggingCallback() override;
diff --git a/internal/ceres/cgnr_linear_operator.h b/internal/ceres/cgnr_linear_operator.h index f4e8b7e..d708efc 100644 --- a/internal/ceres/cgnr_linear_operator.h +++ b/internal/ceres/cgnr_linear_operator.h
@@ -80,7 +80,7 @@ // and z = A^T b // // Note: This class is not thread safe, since it uses some temporary storage. -class CERES_NO_EXPORT CgnrLinearOperator : public LinearOperator { +class CERES_NO_EXPORT CgnrLinearOperator final : public LinearOperator { public: CgnrLinearOperator(const LinearOperator& A, const double* D) : A_(A), D_(D), z_(new double[A.num_rows()]) {}
diff --git a/internal/ceres/cgnr_solver.h b/internal/ceres/cgnr_solver.h index e7c2f74..06a6118 100644 --- a/internal/ceres/cgnr_solver.h +++ b/internal/ceres/cgnr_solver.h
@@ -50,7 +50,7 @@ // // as required for solving for x in the least squares sense. Currently only // block diagonal preconditioning is supported. -class CERES_NO_EXPORT CgnrSolver : public BlockSparseMatrixSolver { +class CERES_NO_EXPORT CgnrSolver final : public BlockSparseMatrixSolver { public: explicit CgnrSolver(const LinearSolver::Options& options); CgnrSolver(const CgnrSolver&) = delete;
diff --git a/internal/ceres/conjugate_gradients_solver.h b/internal/ceres/conjugate_gradients_solver.h index eb954e6..418508a 100644 --- a/internal/ceres/conjugate_gradients_solver.h +++ b/internal/ceres/conjugate_gradients_solver.h
@@ -56,7 +56,7 @@ // For more details see the documentation for // LinearSolver::PerSolveOptions::r_tolerance and // LinearSolver::PerSolveOptions::q_tolerance in linear_solver.h. -class CERES_NO_EXPORT ConjugateGradientsSolver : public LinearSolver { +class CERES_NO_EXPORT ConjugateGradientsSolver final : public LinearSolver { public: explicit ConjugateGradientsSolver(const LinearSolver::Options& options); Summary Solve(LinearOperator* A,
diff --git a/internal/ceres/context_impl.h b/internal/ceres/context_impl.h index 1944549..7c49ba6 100644 --- a/internal/ceres/context_impl.h +++ b/internal/ceres/context_impl.h
@@ -53,7 +53,7 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT ContextImpl : public Context { +class CERES_NO_EXPORT ContextImpl final : public Context { public: ContextImpl(); ~ContextImpl() override;
diff --git a/internal/ceres/coordinate_descent_minimizer.h b/internal/ceres/coordinate_descent_minimizer.h index d781491..75f2648 100644 --- a/internal/ceres/coordinate_descent_minimizer.h +++ b/internal/ceres/coordinate_descent_minimizer.h
@@ -56,7 +56,7 @@ // // The minimizer assumes that none of the parameter blocks in the // program are constant. -class CERES_NO_EXPORT CoordinateDescentMinimizer : public Minimizer { +class CERES_NO_EXPORT CoordinateDescentMinimizer final : public Minimizer { public: explicit CoordinateDescentMinimizer(ContextImpl* context);
diff --git a/internal/ceres/cxsparse.h b/internal/ceres/cxsparse.h index 8968bba..74135f9 100644 --- a/internal/ceres/cxsparse.h +++ b/internal/ceres/cxsparse.h
@@ -139,7 +139,7 @@ // An implementation of SparseCholesky interface using the CXSparse // library. -class CERES_NO_EXPORT CXSparseCholesky : public SparseCholesky { +class CERES_NO_EXPORT CXSparseCholesky final : public SparseCholesky { public: // Factory static std::unique_ptr<SparseCholesky> Create(OrderingType ordering_type);
diff --git a/internal/ceres/dense_cholesky.h b/internal/ceres/dense_cholesky.h index b40e69a..d056d85 100644 --- a/internal/ceres/dense_cholesky.h +++ b/internal/ceres/dense_cholesky.h
@@ -101,9 +101,8 @@ std::string* message); }; -class CERES_NO_EXPORT EigenDenseCholesky : public DenseCholesky { +class CERES_NO_EXPORT EigenDenseCholesky final : public DenseCholesky { public: - LinearSolverTerminationType Factorize(int num_cols, double* lhs, std::string* message) override; @@ -117,9 +116,8 @@ }; #ifndef CERES_NO_LAPACK -class CERES_NO_EXPORT LAPACKDenseCholesky : public DenseCholesky { +class CERES_NO_EXPORT LAPACKDenseCholesky final : public DenseCholesky { public: - LinearSolverTerminationType Factorize(int num_cols, double* lhs, std::string* message) override; @@ -137,7 +135,7 @@ #ifndef CERES_NO_CUDA // CUDA implementation of DenseCholesky using the cuSolverDN library using the // 32-bit legacy interface for maximum compatibility. -class CERES_NO_EXPORT CUDADenseCholesky : public DenseCholesky { +class CERES_NO_EXPORT CUDADenseCholesky final : public DenseCholesky { public: static std::unique_ptr<CUDADenseCholesky> Create( const LinearSolver::Options& options); @@ -174,8 +172,7 @@ CudaBuffer<int> error_; // Cache the result of Factorize to ensure that when Solve is called, the // factiorization of lhs is valid. - LinearSolverTerminationType factorize_result_ = - LINEAR_SOLVER_FATAL_ERROR; + LinearSolverTerminationType factorize_result_ = LINEAR_SOLVER_FATAL_ERROR; }; #endif // CERES_NO_CUDA
diff --git a/internal/ceres/dense_qr.h b/internal/ceres/dense_qr.h index d42cf8c..1a3bc81 100644 --- a/internal/ceres/dense_qr.h +++ b/internal/ceres/dense_qr.h
@@ -49,8 +49,8 @@ #ifndef CERES_NO_CUDA #include "ceres/context_impl.h" #include "ceres/cuda_buffer.h" -#include "cuda_runtime.h" #include "cublas_v2.h" +#include "cuda_runtime.h" #include "cusolverDn.h" #endif // CERES_NO_CUDA @@ -106,9 +106,8 @@ std::string* message); }; -class CERES_NO_EXPORT EigenDenseQR : public DenseQR { +class CERES_NO_EXPORT EigenDenseQR final : public DenseQR { public: - LinearSolverTerminationType Factorize(int num_rows, int num_cols, double* lhs, @@ -123,9 +122,8 @@ }; #ifndef CERES_NO_LAPACK -class CERES_NO_EXPORT LAPACKDenseQR : public DenseQR { +class CERES_NO_EXPORT LAPACKDenseQR final : public DenseQR { public: - LinearSolverTerminationType Factorize(int num_rows, int num_cols, double* lhs, @@ -151,7 +149,7 @@ // This is because cuSolverDn does not implement the singularity-checking // wrapper trtrs, hence this solver directly uses trsv from CUBLAS for the // backsubstitution. -class CERES_NO_EXPORT CUDADenseQR : public DenseQR { +class CERES_NO_EXPORT CUDADenseQR final : public DenseQR { public: static std::unique_ptr<CUDADenseQR> Create( const LinearSolver::Options& options); @@ -170,7 +168,7 @@ // Picks up the cuSolverDN, cuBLAS, and cuStream handles from the context. If // the context is unable to initialize CUDA, returns false with a // human-readable message indicating the reason. - bool Init(ContextImpl* context,std::string* message); + bool Init(ContextImpl* context, std::string* message); // Handle to the cuSOLVER context. cusolverDnHandle_t cusolver_handle_ = nullptr; @@ -196,8 +194,7 @@ CudaBuffer<int> error_; // Cache the result of Factorize to ensure that when Solve is called, the // factiorization of lhs is valid. - LinearSolverTerminationType factorize_result_ = - LINEAR_SOLVER_FATAL_ERROR; + LinearSolverTerminationType factorize_result_ = LINEAR_SOLVER_FATAL_ERROR; }; #endif // CERES_NO_CUDA
diff --git a/internal/ceres/dense_qr_solver.h b/internal/ceres/dense_qr_solver.h index 0dd91c1..39922a2 100644 --- a/internal/ceres/dense_qr_solver.h +++ b/internal/ceres/dense_qr_solver.h
@@ -83,7 +83,7 @@ // library. This solver always returns a solution, it is the user's // responsibility to judge if the solution is good enough for their // purposes. -class CERES_NO_EXPORT DenseQRSolver : public DenseSparseMatrixSolver { +class CERES_NO_EXPORT DenseQRSolver final : public DenseSparseMatrixSolver { public: explicit DenseQRSolver(const LinearSolver::Options& options);
diff --git a/internal/ceres/dense_sparse_matrix.h b/internal/ceres/dense_sparse_matrix.h index 606c38c..9f0835b 100644 --- a/internal/ceres/dense_sparse_matrix.h +++ b/internal/ceres/dense_sparse_matrix.h
@@ -44,7 +44,7 @@ class TripletSparseMatrix; -class CERES_NO_EXPORT DenseSparseMatrix : public SparseMatrix { +class CERES_NO_EXPORT DenseSparseMatrix final : public SparseMatrix { public: // Build a matrix with the same content as the TripletSparseMatrix // m. This assumes that m does not have any repeated entries. @@ -52,7 +52,6 @@ explicit DenseSparseMatrix(const Matrix& m); DenseSparseMatrix(int num_rows, int num_cols); - // SparseMatrix interface. void SetZero() final; void RightMultiply(const double* x, double* y) const final;
diff --git a/internal/ceres/dogleg_strategy.h b/internal/ceres/dogleg_strategy.h index 2d04a49..17f0cc7 100644 --- a/internal/ceres/dogleg_strategy.h +++ b/internal/ceres/dogleg_strategy.h
@@ -54,7 +54,7 @@ // DoglegStrategy follows the approach by Shultz, Schnabel, Byrd. // This finds the exact optimum over the two-dimensional subspace // spanned by the two Dogleg vectors. -class CERES_NO_EXPORT DoglegStrategy : public TrustRegionStrategy { +class CERES_NO_EXPORT DoglegStrategy final : public TrustRegionStrategy { public: explicit DoglegStrategy(const TrustRegionStrategy::Options& options);
diff --git a/internal/ceres/dynamic_compressed_row_sparse_matrix.h b/internal/ceres/dynamic_compressed_row_sparse_matrix.h index 11f78c7..5b4c402 100644 --- a/internal/ceres/dynamic_compressed_row_sparse_matrix.h +++ b/internal/ceres/dynamic_compressed_row_sparse_matrix.h
@@ -50,7 +50,7 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT DynamicCompressedRowSparseMatrix +class CERES_NO_EXPORT DynamicCompressedRowSparseMatrix final : public CompressedRowSparseMatrix { public: // Set the number of rows and columns for the underlyig
diff --git a/internal/ceres/eigensparse.cc b/internal/ceres/eigensparse.cc index 7211450..38055dc 100644 --- a/internal/ceres/eigensparse.cc +++ b/internal/ceres/eigensparse.cc
@@ -47,7 +47,7 @@ // TODO(sameeragarwal): Use enable_if to clean up the implementations // for when Scalar == double. template <typename Solver> -class EigenSparseCholeskyTemplate : public SparseCholesky { +class EigenSparseCholeskyTemplate final : public SparseCholesky { public: EigenSparseCholeskyTemplate() : analyzed_(false) {} CompressedRowSparseMatrix::StorageType StorageType() const final {
diff --git a/internal/ceres/gradient_checking_cost_function.cc b/internal/ceres/gradient_checking_cost_function.cc index e322b7c..3251806 100644 --- a/internal/ceres/gradient_checking_cost_function.cc +++ b/internal/ceres/gradient_checking_cost_function.cc
@@ -61,7 +61,7 @@ namespace { -class GradientCheckingCostFunction : public CostFunction { +class GradientCheckingCostFunction final : public CostFunction { public: GradientCheckingCostFunction(const CostFunction* function, const std::vector<const Manifold*>* manifolds,
diff --git a/internal/ceres/gradient_problem_evaluator.h b/internal/ceres/gradient_problem_evaluator.h index 70b794f..efbb257 100644 --- a/internal/ceres/gradient_problem_evaluator.h +++ b/internal/ceres/gradient_problem_evaluator.h
@@ -46,12 +46,11 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT GradientProblemEvaluator : public Evaluator { +class CERES_NO_EXPORT GradientProblemEvaluator final : public Evaluator { public: explicit GradientProblemEvaluator(const GradientProblem& problem) : problem_(problem) {} - std::unique_ptr<SparseMatrix> CreateJacobian() const final { return nullptr; } bool Evaluate(const EvaluateOptions& evaluate_options,
diff --git a/internal/ceres/implicit_schur_complement.h b/internal/ceres/implicit_schur_complement.h index 83e15fe..598d484 100644 --- a/internal/ceres/implicit_schur_complement.h +++ b/internal/ceres/implicit_schur_complement.h
@@ -89,7 +89,7 @@ // RightMultiply (and the LeftMultiply) methods are not thread safe as // they depend on mutable arrays used for the temporaries needed to // compute the product y += Sx; -class CERES_NO_EXPORT ImplicitSchurComplement : public LinearOperator { +class CERES_NO_EXPORT ImplicitSchurComplement final : public LinearOperator { public: // num_eliminate_blocks is the number of E blocks in the matrix // A.
diff --git a/internal/ceres/iterative_schur_complement_solver.h b/internal/ceres/iterative_schur_complement_solver.h index 674a4ff..0794f36 100644 --- a/internal/ceres/iterative_schur_complement_solver.h +++ b/internal/ceres/iterative_schur_complement_solver.h
@@ -70,7 +70,7 @@ // a proof of this fact and others related to this solver please see // the section on Domain Decomposition Methods in Saad's book // "Iterative Methods for Sparse Linear Systems". -class CERES_NO_EXPORT IterativeSchurComplementSolver +class CERES_NO_EXPORT IterativeSchurComplementSolver final : public BlockSparseMatrixSolver { public: explicit IterativeSchurComplementSolver(const LinearSolver::Options& options);
diff --git a/internal/ceres/levenberg_marquardt_strategy.h b/internal/ceres/levenberg_marquardt_strategy.h index b75c275..4383a49 100644 --- a/internal/ceres/levenberg_marquardt_strategy.h +++ b/internal/ceres/levenberg_marquardt_strategy.h
@@ -44,7 +44,8 @@ // K. Madsen, H.B. Nielsen and O. Tingleff. Available to download from // // http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf -class CERES_NO_EXPORT LevenbergMarquardtStrategy : public TrustRegionStrategy { +class CERES_NO_EXPORT LevenbergMarquardtStrategy final + : public TrustRegionStrategy { public: explicit LevenbergMarquardtStrategy( const TrustRegionStrategy::Options& options);
diff --git a/internal/ceres/line_search.h b/internal/ceres/line_search.h index b194fee..c2c744a 100644 --- a/internal/ceres/line_search.h +++ b/internal/ceres/line_search.h
@@ -259,7 +259,7 @@ // minFunc package by Mark Schmidt. // // For more details: http://www.di.ens.fr/~mschmidt/Software/minFunc.html -class CERES_NO_EXPORT ArmijoLineSearch : public LineSearch { +class CERES_NO_EXPORT ArmijoLineSearch final : public LineSearch { public: explicit ArmijoLineSearch(const LineSearch::Options& options); @@ -277,7 +277,7 @@ // // [1] Nocedal J., Wright S., Numerical Optimization, 2nd Ed., Springer, 1999. // [2] http://www.di.ens.fr/~mschmidt/Software/minFunc.html. -class CERES_NO_EXPORT WolfeLineSearch : public LineSearch { +class CERES_NO_EXPORT WolfeLineSearch final : public LineSearch { public: explicit WolfeLineSearch(const LineSearch::Options& options);
diff --git a/internal/ceres/line_search_direction.cc b/internal/ceres/line_search_direction.cc index 90ae149..98e335a 100644 --- a/internal/ceres/line_search_direction.cc +++ b/internal/ceres/line_search_direction.cc
@@ -41,7 +41,7 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT SteepestDescent : public LineSearchDirection { +class CERES_NO_EXPORT SteepestDescent final : public LineSearchDirection { public: bool NextDirection(const LineSearchMinimizer::State& previous, const LineSearchMinimizer::State& current, @@ -51,7 +51,8 @@ } }; -class CERES_NO_EXPORT NonlinearConjugateGradient : public LineSearchDirection { +class CERES_NO_EXPORT NonlinearConjugateGradient final + : public LineSearchDirection { public: NonlinearConjugateGradient(const NonlinearConjugateGradientType type, const double function_tolerance) @@ -97,7 +98,7 @@ const double function_tolerance_; }; -class CERES_NO_EXPORT LBFGS : public LineSearchDirection { +class CERES_NO_EXPORT LBFGS final : public LineSearchDirection { public: LBFGS(const int num_parameters, const int max_lbfgs_rank, @@ -141,7 +142,7 @@ bool is_positive_definite_; }; -class CERES_NO_EXPORT BFGS : public LineSearchDirection { +class CERES_NO_EXPORT BFGS final : public LineSearchDirection { public: BFGS(const int num_parameters, const bool use_approximate_eigenvalue_scaling) : num_parameters_(num_parameters),
diff --git a/internal/ceres/line_search_minimizer.h b/internal/ceres/line_search_minimizer.h index c5cc9dd..9a0e994 100644 --- a/internal/ceres/line_search_minimizer.h +++ b/internal/ceres/line_search_minimizer.h
@@ -44,7 +44,7 @@ // Generic line search minimization algorithm. // // For example usage, see SolverImpl::Minimize. -class CERES_NO_EXPORT LineSearchMinimizer : public Minimizer { +class CERES_NO_EXPORT LineSearchMinimizer final : public Minimizer { public: struct State { State(int num_parameters, int num_effective_parameters)
diff --git a/internal/ceres/line_search_preprocessor.h b/internal/ceres/line_search_preprocessor.h index 4cb7d68..27e9c2d 100644 --- a/internal/ceres/line_search_preprocessor.h +++ b/internal/ceres/line_search_preprocessor.h
@@ -38,7 +38,7 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT LineSearchPreprocessor : public Preprocessor { +class CERES_NO_EXPORT LineSearchPreprocessor final : public Preprocessor { public: bool Preprocess(const Solver::Options& options, ProblemImpl* problem,
diff --git a/internal/ceres/low_rank_inverse_hessian.h b/internal/ceres/low_rank_inverse_hessian.h index 9a74972..3651936 100644 --- a/internal/ceres/low_rank_inverse_hessian.h +++ b/internal/ceres/low_rank_inverse_hessian.h
@@ -60,7 +60,7 @@ // Byrd, R. H.; Nocedal, J.; Schnabel, R. B. (1994). // "Representations of Quasi-Newton Matrices and their use in // Limited Memory Methods". Mathematical Programming 63 (4): -class CERES_NO_EXPORT LowRankInverseHessian : public LinearOperator { +class CERES_NO_EXPORT LowRankInverseHessian final : public LinearOperator { public: // num_parameters is the row/column size of the Hessian. // max_num_corrections is the rank of the Hessian approximation.
diff --git a/internal/ceres/manifold_adapter.h b/internal/ceres/manifold_adapter.h index c612349..552e650 100644 --- a/internal/ceres/manifold_adapter.h +++ b/internal/ceres/manifold_adapter.h
@@ -9,14 +9,13 @@ // Adapter to wrap LocalParameterization and make them look like Manifolds. // // ManifoldAdapter NEVER takes ownership of local_parameterization. -class CERES_NO_EXPORT ManifoldAdapter : public Manifold { +class CERES_NO_EXPORT ManifoldAdapter final : public Manifold { public: ManifoldAdapter(const LocalParameterization* local_parameterization) : local_parameterization_(local_parameterization) { CHECK(local_parameterization != nullptr); } - bool Plus(const double* x, const double* delta, double* x_plus_delta) const override {
diff --git a/internal/ceres/partitioned_matrix_view.h b/internal/ceres/partitioned_matrix_view.h index dc2ef18..9eaec6f 100644 --- a/internal/ceres/partitioned_matrix_view.h +++ b/internal/ceres/partitioned_matrix_view.h
@@ -117,7 +117,8 @@ template <int kRowBlockSize = Eigen::Dynamic, int kEBlockSize = Eigen::Dynamic, int kFBlockSize = Eigen::Dynamic> -class CERES_NO_EXPORT PartitionedMatrixView : public PartitionedMatrixViewBase { +class CERES_NO_EXPORT PartitionedMatrixView final + : public PartitionedMatrixViewBase { public: // matrix = [E F], where the matrix E contains the first // num_col_blocks_a column blocks.
diff --git a/internal/ceres/preconditioner.h b/internal/ceres/preconditioner.h index d309e4f..7e63147 100644 --- a/internal/ceres/preconditioner.h +++ b/internal/ceres/preconditioner.h
@@ -167,7 +167,7 @@ // clang-format on // Wrap a SparseMatrix object as a preconditioner. -class CERES_NO_EXPORT SparseMatrixPreconditionerWrapper +class CERES_NO_EXPORT SparseMatrixPreconditionerWrapper final : public SparseMatrixPreconditioner { public: // Wrapper does NOT take ownership of the matrix pointer.
diff --git a/internal/ceres/program_evaluator.h b/internal/ceres/program_evaluator.h index e0f7bf0..826a73a 100644 --- a/internal/ceres/program_evaluator.h +++ b/internal/ceres/program_evaluator.h
@@ -111,7 +111,7 @@ template <typename EvaluatePreparer, typename JacobianWriter, typename JacobianFinalizer = NullJacobianFinalizer> -class ProgramEvaluator : public Evaluator { +class ProgramEvaluator final : public Evaluator { public: ProgramEvaluator(const Evaluator::Options& options, Program* program) : options_(options),
diff --git a/internal/ceres/schur_complement_solver.cc b/internal/ceres/schur_complement_solver.cc index adc1531..3f8cfea 100644 --- a/internal/ceres/schur_complement_solver.cc +++ b/internal/ceres/schur_complement_solver.cc
@@ -62,13 +62,12 @@ namespace { -class BlockRandomAccessSparseMatrixAdapter : public LinearOperator { +class BlockRandomAccessSparseMatrixAdapter final : public LinearOperator { public: explicit BlockRandomAccessSparseMatrixAdapter( const BlockRandomAccessSparseMatrix& m) : m_(m) {} - // y = y + Ax; void RightMultiply(const double* x, double* y) const final { m_.SymmetricRightMultiply(x, y); @@ -86,13 +85,12 @@ const BlockRandomAccessSparseMatrix& m_; }; -class BlockRandomAccessDiagonalMatrixAdapter : public LinearOperator { +class BlockRandomAccessDiagonalMatrixAdapter final : public LinearOperator { public: explicit BlockRandomAccessDiagonalMatrixAdapter( const BlockRandomAccessDiagonalMatrix& m) : m_(m) {} - // y = y + Ax; void RightMultiply(const double* x, double* y) const final { m_.RightMultiply(x, y);
diff --git a/internal/ceres/schur_complement_solver.h b/internal/ceres/schur_complement_solver.h index 0f9e011..1ea9ad4 100644 --- a/internal/ceres/schur_complement_solver.h +++ b/internal/ceres/schur_complement_solver.h
@@ -148,7 +148,7 @@ }; // Dense Cholesky factorization based solver. -class CERES_NO_EXPORT DenseSchurComplementSolver +class CERES_NO_EXPORT DenseSchurComplementSolver final : public SchurComplementSolver { public: explicit DenseSchurComplementSolver(const LinearSolver::Options& options); @@ -167,7 +167,7 @@ }; // Sparse Cholesky factorization based solver. -class CERES_NO_EXPORT SparseSchurComplementSolver +class CERES_NO_EXPORT SparseSchurComplementSolver final : public SchurComplementSolver { public: explicit SparseSchurComplementSolver(const LinearSolver::Options& options);
diff --git a/internal/ceres/schur_eliminator.h b/internal/ceres/schur_eliminator.h index e03d2d9..f77acbd 100644 --- a/internal/ceres/schur_eliminator.h +++ b/internal/ceres/schur_eliminator.h
@@ -224,7 +224,7 @@ template <int kRowBlockSize = Eigen::Dynamic, int kEBlockSize = Eigen::Dynamic, int kFBlockSize = Eigen::Dynamic> -class CERES_NO_EXPORT SchurEliminator : public SchurEliminatorBase { +class CERES_NO_EXPORT SchurEliminator final : public SchurEliminatorBase { public: explicit SchurEliminator(const LinearSolver::Options& options) : num_threads_(options.num_threads), context_(options.context) { @@ -379,7 +379,8 @@ template <int kRowBlockSize = Eigen::Dynamic, int kEBlockSize = Eigen::Dynamic, int kFBlockSize = Eigen::Dynamic> -class CERES_NO_EXPORT SchurEliminatorForOneFBlock : public SchurEliminatorBase { +class CERES_NO_EXPORT SchurEliminatorForOneFBlock final + : public SchurEliminatorBase { public: void Init(int num_eliminate_blocks, bool assume_full_rank_ete,
diff --git a/internal/ceres/sparse_cholesky.h b/internal/ceres/sparse_cholesky.h index 25249eb..80c5cb2 100644 --- a/internal/ceres/sparse_cholesky.h +++ b/internal/ceres/sparse_cholesky.h
@@ -116,7 +116,7 @@ // Computes an initial solution using the given instance of // SparseCholesky, and then refines it using the IterativeRefiner. -class CERES_NO_EXPORT RefinedSparseCholesky : public SparseCholesky { +class CERES_NO_EXPORT RefinedSparseCholesky final : public SparseCholesky { public: RefinedSparseCholesky(std::unique_ptr<SparseCholesky> sparse_cholesky, std::unique_ptr<IterativeRefiner> iterative_refiner);
diff --git a/internal/ceres/suitesparse.h b/internal/ceres/suitesparse.h index 604c7fc..60b415c 100644 --- a/internal/ceres/suitesparse.h +++ b/internal/ceres/suitesparse.h
@@ -291,7 +291,7 @@ cholmod_common cc_; }; -class CERES_NO_EXPORT SuiteSparseCholesky : public SparseCholesky { +class CERES_NO_EXPORT SuiteSparseCholesky final : public SparseCholesky { public: static std::unique_ptr<SparseCholesky> Create(OrderingType ordering_type);
diff --git a/internal/ceres/triplet_sparse_matrix.h b/internal/ceres/triplet_sparse_matrix.h index 2c2bc13..bcb4529 100644 --- a/internal/ceres/triplet_sparse_matrix.h +++ b/internal/ceres/triplet_sparse_matrix.h
@@ -47,7 +47,7 @@ // manipulate sparse matrices in triplet (i,j,s) form. This object is // inspired by the design of the cholmod_triplet struct used in the // SuiteSparse package and is memory layout compatible with it. -class CERES_NO_EXPORT TripletSparseMatrix : public SparseMatrix { +class CERES_NO_EXPORT TripletSparseMatrix final : public SparseMatrix { public: TripletSparseMatrix(); TripletSparseMatrix(int num_rows, int num_cols, int max_num_nonzeros);
diff --git a/internal/ceres/trust_region_minimizer.h b/internal/ceres/trust_region_minimizer.h index 4df0510..c6fc542 100644 --- a/internal/ceres/trust_region_minimizer.h +++ b/internal/ceres/trust_region_minimizer.h
@@ -49,7 +49,7 @@ // Generic trust region minimization algorithm. // // For example usage, see SolverImpl::Minimize. -class CERES_NO_EXPORT TrustRegionMinimizer : public Minimizer { +class CERES_NO_EXPORT TrustRegionMinimizer final : public Minimizer { public: // This method is not thread safe. void Minimize(const Minimizer::Options& options,
diff --git a/internal/ceres/trust_region_preprocessor.h b/internal/ceres/trust_region_preprocessor.h index a1db8e8..26ef8fa 100644 --- a/internal/ceres/trust_region_preprocessor.h +++ b/internal/ceres/trust_region_preprocessor.h
@@ -38,7 +38,7 @@ namespace ceres { namespace internal { -class CERES_NO_EXPORT TrustRegionPreprocessor : public Preprocessor { +class CERES_NO_EXPORT TrustRegionPreprocessor final : public Preprocessor { public: bool Preprocess(const Solver::Options& options, ProblemImpl* problem,