Add parameter_tolerance convergence to line search minimizer
Change-Id: Id3bd3c7490d679b87259bb0fbf0b2dbc7e831a07
diff --git a/internal/ceres/line_search_minimizer.cc b/internal/ceres/line_search_minimizer.cc
index 953d8d8..0d29b3e 100644
--- a/internal/ceres/line_search_minimizer.cc
+++ b/internal/ceres/line_search_minimizer.cc
@@ -332,6 +332,8 @@
iteration_summary.step_solver_time_in_seconds =
WallTimeInSeconds() - iteration_start_time;
+ const double x_norm = x.norm();
+
if (!evaluator->Plus(x.data(), delta.data(), x_plus_delta.data())) {
summary->termination_type = FAILURE;
summary->message =
@@ -384,6 +386,20 @@
line_search_summary.total_time_in_seconds;
++summary->num_successful_steps;
+ const double step_size_tolerance = options.parameter_tolerance *
+ (x_norm + options.parameter_tolerance);
+ if (iteration_summary.step_norm <= step_size_tolerance) {
+ summary->message =
+ StringPrintf("Parameter tolerance reached. "
+ "Relative step_norm: %e <= %e.",
+ (iteration_summary.step_norm /
+ (x_norm + options.parameter_tolerance)),
+ options.parameter_tolerance);
+ summary->termination_type = CONVERGENCE;
+ VLOG_IF(1, is_not_silent) << "Terminating: " << summary->message;
+ return;
+ }
+
if (iteration_summary.gradient_max_norm <= options.gradient_tolerance) {
summary->message = StringPrintf("Gradient tolerance reached. "
"Gradient max norm: %e <= %e",