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