levenberg_marquardt_strategy.h 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Ceres Solver - A fast non-linear least squares minimizer
  2. // Copyright 2023 Google Inc. All rights reserved.
  3. // http://ceres-solver.org/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are met:
  7. //
  8. // * Redistributions of source code must retain the above copyright notice,
  9. // this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above copyright notice,
  11. // this list of conditions and the following disclaimer in the documentation
  12. // and/or other materials provided with the distribution.
  13. // * Neither the name of Google Inc. nor the names of its contributors may be
  14. // used to endorse or promote products derived from this software without
  15. // specific prior written permission.
  16. //
  17. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  21. // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25. // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27. // POSSIBILITY OF SUCH DAMAGE.
  28. //
  29. // Author: sameeragarwal@google.com (Sameer Agarwal)
  30. #ifndef CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_
  31. #define CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_
  32. #include "ceres/internal/disable_warnings.h"
  33. #include "ceres/internal/eigen.h"
  34. #include "ceres/internal/export.h"
  35. #include "ceres/trust_region_strategy.h"
  36. namespace ceres::internal {
  37. class ContextImpl;
  38. // Levenberg-Marquardt step computation and trust region sizing
  39. // strategy based on on "Methods for Nonlinear Least Squares" by
  40. // K. Madsen, H.B. Nielsen and O. Tingleff. Available to download from
  41. //
  42. // http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3215/pdf/imm3215.pdf
  43. class CERES_NO_EXPORT LevenbergMarquardtStrategy final
  44. : public TrustRegionStrategy {
  45. public:
  46. explicit LevenbergMarquardtStrategy(
  47. const TrustRegionStrategy::Options& options);
  48. ~LevenbergMarquardtStrategy() override;
  49. // TrustRegionStrategy interface
  50. TrustRegionStrategy::Summary ComputeStep(
  51. const TrustRegionStrategy::PerSolveOptions& per_solve_options,
  52. SparseMatrix* jacobian,
  53. const double* residuals,
  54. double* step) final;
  55. void StepAccepted(double step_quality) final;
  56. void StepRejected(double step_quality) final;
  57. void StepIsInvalid() final {
  58. // Treat the current step as a rejected step with no increase in
  59. // solution quality. Since rejected steps lead to decrease in the
  60. // size of the trust region, the next time ComputeStep is called,
  61. // this will lead to a better conditioned system.
  62. StepRejected(0.0);
  63. }
  64. double Radius() const final;
  65. private:
  66. LinearSolver* linear_solver_;
  67. double radius_;
  68. double max_radius_;
  69. const double min_diagonal_;
  70. const double max_diagonal_;
  71. double decrease_factor_;
  72. bool reuse_diagonal_;
  73. Vector diagonal_; // diagonal_ = diag(J'J)
  74. // Scaled copy of diagonal_. Stored here as optimization to prevent
  75. // allocations in every iteration and reuse when a step fails and
  76. // ComputeStep is called again.
  77. Vector lm_diagonal_; // lm_diagonal_ = sqrt(diagonal_ / radius_);
  78. ContextImpl* context_;
  79. int num_threads_;
  80. };
  81. } // namespace ceres::internal
  82. #include "ceres/internal/reenable_warnings.h"
  83. #endif // CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_