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);