123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #ifndef CERES_INTERNAL_DOGLEG_STRATEGY_H_
- #define CERES_INTERNAL_DOGLEG_STRATEGY_H_
- #include "ceres/internal/disable_warnings.h"
- #include "ceres/internal/export.h"
- #include "ceres/linear_solver.h"
- #include "ceres/trust_region_strategy.h"
- namespace ceres::internal {
- class CERES_NO_EXPORT DoglegStrategy final : public TrustRegionStrategy {
- public:
- explicit DoglegStrategy(const TrustRegionStrategy::Options& options);
-
- Summary ComputeStep(const PerSolveOptions& per_solve_options,
- SparseMatrix* jacobian,
- const double* residuals,
- double* step) final;
- void StepAccepted(double step_quality) final;
- void StepRejected(double step_quality) final;
- void StepIsInvalid() override;
- double Radius() const final;
-
- Vector gradient() const { return gradient_; }
- Vector gauss_newton_step() const { return gauss_newton_step_; }
- Matrix subspace_basis() const { return subspace_basis_; }
- Vector subspace_g() const { return subspace_g_; }
- Matrix subspace_B() const { return subspace_B_; }
- private:
- using Vector2d = Eigen::Matrix<double, 2, 1, Eigen::DontAlign>;
- using Matrix2d = Eigen::Matrix<double, 2, 2, Eigen::DontAlign>;
- LinearSolver::Summary ComputeGaussNewtonStep(
- const PerSolveOptions& per_solve_options,
- SparseMatrix* jacobian,
- const double* residuals);
- void ComputeCauchyPoint(SparseMatrix* jacobian);
- void ComputeGradient(SparseMatrix* jacobian, const double* residuals);
- void ComputeTraditionalDoglegStep(double* step);
- bool ComputeSubspaceModel(SparseMatrix* jacobian);
- void ComputeSubspaceDoglegStep(double* step);
- bool FindMinimumOnTrustRegionBoundary(Vector2d* minimum) const;
- Vector MakePolynomialForBoundaryConstrainedProblem() const;
- Vector2d ComputeSubspaceStepFromRoot(double lambda) const;
- double EvaluateSubspaceModel(const Vector2d& x) const;
- LinearSolver* linear_solver_;
- double radius_;
- const double max_radius_;
- const double min_diagonal_;
- const double max_diagonal_;
-
-
-
-
-
-
-
-
- double mu_;
- const double min_mu_;
- const double max_mu_;
- const double mu_increase_factor_;
- const double increase_threshold_;
- const double decrease_threshold_;
- Vector diagonal_;
- Vector lm_diagonal_;
- Vector gradient_;
- Vector gauss_newton_step_;
-
- double alpha_;
- double dogleg_step_norm_;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool reuse_;
-
-
- DoglegType dogleg_type_;
-
-
- bool subspace_is_one_dimensional_;
- Matrix subspace_basis_;
- Vector2d subspace_g_;
- Matrix2d subspace_B_;
- };
- }
- #include "ceres/internal/reenable_warnings.h"
- #endif
|