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",