A number of small changes.
These changes came about from testing the power bundle adjustment
integration CL.
1. Allow Solver::Options::max_linear_solver_iterations == 0.
2. Simplify the logic for when inverse(F'F) is computed.
3. norm_b -> norm_rhs in ConjugateGradientsSolver.
Change-Id: I50c19e1f24a4cc08ed60e3a3032b96b37bcada9f
diff --git a/internal/ceres/conjugate_gradients_solver.h b/internal/ceres/conjugate_gradients_solver.h
index 93f9e25..f2eea87 100644
--- a/internal/ceres/conjugate_gradients_solver.h
+++ b/internal/ceres/conjugate_gradients_solver.h
@@ -125,15 +125,15 @@
summary.message = "Maximum number of iterations reached.";
summary.num_iterations = 0;
- const double norm_b = Norm(rhs);
- if (norm_b == 0.0) {
+ const double norm_rhs = Norm(rhs);
+ if (norm_rhs == 0.0) {
SetZero(solution);
summary.termination_type = LinearSolverTerminationType::SUCCESS;
summary.message = "Convergence. |b| = 0.";
return summary;
}
- const double tol_r = options.r_tolerance * norm_b;
+ const double tol_r = options.r_tolerance * norm_rhs;
SetZero(tmp);
lhs.RightMultiplyAndAccumulate(solution, tmp);
diff --git a/internal/ceres/implicit_schur_complement.cc b/internal/ceres/implicit_schur_complement.cc
index 4e837f3..92631de 100644
--- a/internal/ceres/implicit_schur_complement.cc
+++ b/internal/ceres/implicit_schur_complement.cc
@@ -42,7 +42,7 @@
ImplicitSchurComplement::ImplicitSchurComplement(
const LinearSolver::Options& options)
- : options_(options), D_(nullptr), b_(nullptr) {}
+ : options_(options) {}
void ImplicitSchurComplement::Init(const BlockSparseMatrix& A,
const double* D,
@@ -56,12 +56,15 @@
D_ = D;
b_ = b;
+ compute_ftf_inverse_ =
+ options_.preconditioner_type == JACOBI ||
+ options_.preconditioner_type == SCHUR_POWER_SERIES_EXPANSION;
+
// Initialize temporary storage and compute the block diagonals of
// E'E and F'E.
if (block_diagonal_EtE_inverse_ == nullptr) {
block_diagonal_EtE_inverse_ = A_->CreateBlockDiagonalEtE();
- if (options_.preconditioner_type == JACOBI ||
- options_.preconditioner_type == SCHUR_POWER_SERIES_EXPANSION) {
+ if (compute_ftf_inverse_) {
block_diagonal_FtF_inverse_ = A_->CreateBlockDiagonalFtF();
}
rhs_.resize(A_->num_cols_f());
@@ -72,8 +75,7 @@
tmp_f_cols_.resize(A_->num_cols_f());
} else {
A_->UpdateBlockDiagonalEtE(block_diagonal_EtE_inverse_.get());
- if (options_.preconditioner_type == JACOBI ||
- options_.preconditioner_type == SCHUR_POWER_SERIES_EXPANSION) {
+ if (compute_ftf_inverse_) {
A_->UpdateBlockDiagonalFtF(block_diagonal_FtF_inverse_.get());
}
}
@@ -82,8 +84,7 @@
// contributions from the diagonal D if it is non-null. Add that to
// the block diagonals and invert them.
AddDiagonalAndInvert(D_, block_diagonal_EtE_inverse_.get());
- if (options_.preconditioner_type == JACOBI ||
- options_.preconditioner_type == SCHUR_POWER_SERIES_EXPANSION) {
+ if (compute_ftf_inverse_) {
AddDiagonalAndInvert((D_ == nullptr) ? nullptr : D_ + A_->num_cols_e(),
block_diagonal_FtF_inverse_.get());
}
@@ -134,6 +135,7 @@
void ImplicitSchurComplement::InversePowerSeriesOperatorRightMultiplyAccumulate(
const double* x, double* y) const {
+ CHECK(compute_ftf_inverse_);
// y1 = F x
tmp_rows_.setZero();
A_->RightMultiplyAndAccumulateF(x, tmp_rows_.data());
diff --git a/internal/ceres/implicit_schur_complement.h b/internal/ceres/implicit_schur_complement.h
index 435ddda..620ea8c 100644
--- a/internal/ceres/implicit_schur_complement.h
+++ b/internal/ceres/implicit_schur_complement.h
@@ -143,6 +143,7 @@
}
const BlockSparseMatrix* block_diagonal_FtF_inverse() const {
+ CHECK(compute_ftf_inverse_);
return block_diagonal_FtF_inverse_.get();
}
@@ -151,10 +152,10 @@
void UpdateRhs();
const LinearSolver::Options& options_;
-
+ bool compute_ftf_inverse_ = false;
std::unique_ptr<PartitionedMatrixViewBase> A_;
- const double* D_;
- const double* b_;
+ const double* D_ = nullptr;
+ const double* b_ = nullptr;
std::unique_ptr<BlockSparseMatrix> block_diagonal_EtE_inverse_;
std::unique_ptr<BlockSparseMatrix> block_diagonal_FtF_inverse_;
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc
index 966a5dd..8ad0862 100644
--- a/internal/ceres/solver.cc
+++ b/internal/ceres/solver.cc
@@ -166,7 +166,7 @@
OPTION_GE(max_num_consecutive_invalid_steps, 0);
OPTION_GT(eta, 0.0);
OPTION_GE(min_linear_solver_iterations, 0);
- OPTION_GE(max_linear_solver_iterations, 1);
+ OPTION_GE(max_linear_solver_iterations, 0);
OPTION_LE_OPTION(min_linear_solver_iterations, max_linear_solver_iterations);
if (options.use_inner_iterations) {