Add a TrustRegionStrategy::Summary object. Change-Id: I7caee35a3408ee4a0ec16ba407410d822929340d
diff --git a/internal/ceres/dogleg_strategy.cc b/internal/ceres/dogleg_strategy.cc index 44d484f..4b1f074 100644 --- a/internal/ceres/dogleg_strategy.cc +++ b/internal/ceres/dogleg_strategy.cc
@@ -71,7 +71,7 @@ // gradient) and the new Gauss-Newton step are computed from // scratch. The Dogleg step is then computed as interpolation of these // two vectors. -LinearSolver::Summary DoglegStrategy::ComputeStep( +TrustRegionStrategy::Summary DoglegStrategy::ComputeStep( const TrustRegionStrategy::PerSolveOptions& per_solve_options, SparseMatrix* jacobian, const double* residuals, @@ -85,10 +85,10 @@ // Gauss-Newton and gradient vectors are always available, only a // new interpolant need to be computed. ComputeDoglegStep(step); - LinearSolver::Summary linear_solver_summary; - linear_solver_summary.num_iterations = 0; - linear_solver_summary.termination_type = TOLERANCE; - return linear_solver_summary; + TrustRegionStrategy::Summary summary; + summary.num_iterations = 0; + summary.termination_type = TOLERANCE; + return summary; } reuse_ = true; @@ -123,7 +123,11 @@ ComputeDoglegStep(step); } - return linear_solver_summary; + TrustRegionStrategy::Summary summary; + summary.residual_norm = linear_solver_summary.residual_norm; + summary.num_iterations = linear_solver_summary.num_iterations; + summary.termination_type = linear_solver_summary.termination_type; + return summary; } // The trust region is assumed to be elliptical with the
diff --git a/internal/ceres/dogleg_strategy.h b/internal/ceres/dogleg_strategy.h index 1505655..8c2ff7b 100644 --- a/internal/ceres/dogleg_strategy.h +++ b/internal/ceres/dogleg_strategy.h
@@ -53,11 +53,10 @@ virtual ~DoglegStrategy() {} // TrustRegionStrategy interface - virtual LinearSolver::Summary ComputeStep( - const TrustRegionStrategy::PerSolveOptions& per_solve_options, - SparseMatrix* jacobian, - const double* residuals, - double* step); + virtual Summary ComputeStep(const PerSolveOptions& per_solve_options, + SparseMatrix* jacobian, + const double* residuals, + double* step); virtual void StepAccepted(double step_quality); virtual void StepRejected(double step_quality); virtual void StepIsInvalid();
diff --git a/internal/ceres/levenberg_marquardt_strategy.cc b/internal/ceres/levenberg_marquardt_strategy.cc index 576648a..af76c42 100644 --- a/internal/ceres/levenberg_marquardt_strategy.cc +++ b/internal/ceres/levenberg_marquardt_strategy.cc
@@ -61,7 +61,7 @@ LevenbergMarquardtStrategy::~LevenbergMarquardtStrategy() { } -LinearSolver::Summary LevenbergMarquardtStrategy::ComputeStep( +TrustRegionStrategy::Summary LevenbergMarquardtStrategy::ComputeStep( const TrustRegionStrategy::PerSolveOptions& per_solve_options, SparseMatrix* jacobian, const double* residuals, @@ -113,7 +113,12 @@ } reuse_diagonal_ = true; - return linear_solver_summary; + + TrustRegionStrategy::Summary summary; + summary.residual_norm = linear_solver_summary.residual_norm; + summary.num_iterations = linear_solver_summary.num_iterations; + summary.termination_type = linear_solver_summary.termination_type; + return summary; } void LevenbergMarquardtStrategy::StepAccepted(double step_quality) {
diff --git a/internal/ceres/levenberg_marquardt_strategy.h b/internal/ceres/levenberg_marquardt_strategy.h index 4ed1390..90c2178 100644 --- a/internal/ceres/levenberg_marquardt_strategy.h +++ b/internal/ceres/levenberg_marquardt_strategy.h
@@ -31,7 +31,7 @@ #ifndef CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_ #define CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_ -#include "ceres/linear_solver.h" +#include "ceres/internal/eigen.h" #include "ceres/trust_region_strategy.h" namespace ceres { @@ -48,7 +48,7 @@ virtual ~LevenbergMarquardtStrategy(); // TrustRegionStrategy interface - virtual LinearSolver::Summary ComputeStep( + virtual TrustRegionStrategy::Summary ComputeStep( const TrustRegionStrategy::PerSolveOptions& per_solve_options, SparseMatrix* jacobian, const double* residuals,
diff --git a/internal/ceres/levenberg_marquardt_strategy_test.cc b/internal/ceres/levenberg_marquardt_strategy_test.cc index 22f04aa..6f61dd1 100644 --- a/internal/ceres/levenberg_marquardt_strategy_test.cc +++ b/internal/ceres/levenberg_marquardt_strategy_test.cc
@@ -28,14 +28,15 @@ // // Author: sameeragarwal@google.com (Sameer Agarwal) - +#include "ceres/internal/eigen.h" +#include "ceres/internal/scoped_ptr.h" +#include "ceres/levenberg_marquardt_strategy.h" +#include "ceres/linear_solver.h" +#include "ceres/trust_region_strategy.h" #include "glog/logging.h" #include "gmock/gmock.h" #include "gmock/mock-log.h" #include "gtest/gtest.h" -#include "ceres/trust_region_strategy.h" -#include "ceres/levenberg_marquardt_strategy.h" -#include "ceres/internal/eigen.h" using testing::AllOf; using testing::AnyNumber; @@ -147,7 +148,7 @@ EXPECT_CALL(log, Log(WARNING, _, HasSubstr("Failed to compute a finite step."))); - LinearSolver::Summary summary = lms.ComputeStep(pso, &dsm, &residual, x); + TrustRegionStrategy::Summary summary = lms.ComputeStep(pso, &dsm, &residual, x); EXPECT_EQ(summary.termination_type, FAILURE); } }
diff --git a/internal/ceres/trust_region_minimizer.cc b/internal/ceres/trust_region_minimizer.cc index 476cc9d..19e3f35 100644 --- a/internal/ceres/trust_region_minimizer.cc +++ b/internal/ceres/trust_region_minimizer.cc
@@ -250,7 +250,7 @@ const time_t strategy_start_time = time(NULL); TrustRegionStrategy::PerSolveOptions per_solve_options; per_solve_options.eta = options_.eta; - LinearSolver::Summary strategy_summary = + TrustRegionStrategy::Summary strategy_summary = strategy->ComputeStep(per_solve_options, jacobian, residuals.data(),
diff --git a/internal/ceres/trust_region_strategy.h b/internal/ceres/trust_region_strategy.h index 8d5977e..7d94ca2 100644 --- a/internal/ceres/trust_region_strategy.h +++ b/internal/ceres/trust_region_strategy.h
@@ -31,11 +31,14 @@ #ifndef CERES_INTERNAL_TRUST_REGION_STRATEGY_H_ #define CERES_INTERNAL_TRUST_REGION_STRATEGY_H_ -#include "ceres/linear_solver.h" +#include "ceres/types.h" namespace ceres { namespace internal { +class LinearSolver; +class SparseMatrix; + // Interface for classes implementing various trust region strategies // for nonlinear least squares problems. // @@ -79,14 +82,38 @@ double eta; }; + struct Summary { + Summary() + : residual_norm(0.0), + num_iterations(-1), + termination_type(FAILURE) { + } + + // If the trust region problem is, + // + // 1/2 x'Ax + b'x + c, + // + // then + // + // residual_norm = |Ax -b| + double residual_norm; + + // Number of iterations used by the linear solver. If a linear + // solver was not called (e.g., DogLegStrategy after an + // unsuccessful step), then this would be zero. + int num_iterations; + + // Status of the linear solver used to solve the Newton system. + LinearSolverTerminationType termination_type; + }; + virtual ~TrustRegionStrategy(); // Use the current radius to solve for the trust region step. - virtual LinearSolver::Summary ComputeStep( - const PerSolveOptions& per_solve_options, - SparseMatrix* jacobian, - const double* residuals, - double* step) = 0; + virtual Summary ComputeStep(const PerSolveOptions& per_solve_options, + SparseMatrix* jacobian, + const double* residuals, + double* step) = 0; // Inform the strategy that the current step has been accepted, and // that the ratio of the decrease in the non-linear objective to the