Further build breakage fixes. 1. Allow the minimum number of linear solver iterations to be zero. 2. Fix conjugate gradients solver's iteration loop to be sane again. Change-Id: I8594815fec940c2b30e28eb58ec5d8baacf13dae
diff --git a/internal/ceres/conjugate_gradients_solver.cc b/internal/ceres/conjugate_gradients_solver.cc index d93bcb4..3d8eb0a 100644 --- a/internal/ceres/conjugate_gradients_solver.cc +++ b/internal/ceres/conjugate_gradients_solver.cc
@@ -114,8 +114,7 @@ double Q0 = -1.0 * xref.dot(bref + r); for (summary.num_iterations = 1; - (summary.num_iterations > options_.min_num_iterations && - summary.num_iterations < options_.max_num_iterations); + summary.num_iterations < options_.max_num_iterations; ++summary.num_iterations) { // Apply preconditioner if (per_solve_options.preconditioner != NULL) { @@ -208,7 +207,8 @@ // 124(1-2), 45-59, 2000. // const double zeta = summary.num_iterations * (Q1 - Q0) / Q1; - if (zeta < per_solve_options.q_tolerance) { + if (zeta < per_solve_options.q_tolerance && + summary.num_iterations >= options_.min_num_iterations) { summary.termination_type = LINEAR_SOLVER_SUCCESS; summary.message = StringPrintf("Convergence: zeta = %e < %e", @@ -220,7 +220,8 @@ // Residual based termination. norm_r = r. norm(); - if (norm_r <= tol_r) { + if (norm_r <= tol_r && + summary.num_iterations >= options_.min_num_iterations) { summary.termination_type = LINEAR_SOLVER_SUCCESS; summary.message = StringPrintf("Convergence. |r| = %e <= %e.", norm_r, tol_r);
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc index 00b8709..5e1a5d2 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc
@@ -108,7 +108,7 @@ OPTION_LE_OPTION(min_lm_diagonal, max_lm_diagonal); OPTION_GE(max_num_consecutive_invalid_steps, 0); OPTION_GT(eta, 0.0); - OPTION_GE(min_linear_solver_iterations, 1); + OPTION_GE(min_linear_solver_iterations, 0); OPTION_GE(max_linear_solver_iterations, 1); OPTION_LE_OPTION(min_linear_solver_iterations, max_linear_solver_iterations);