diff --git a/include/ceres/solver.h b/include/ceres/solver.h index 8bebf9b9f..390bb0adf 100644 --- a/include/ceres/solver.h +++ b/include/ceres/solver.h @@ -716,6 +716,8 @@ class Solver { LineSearchDirectionType line_search_direction_type; LineSearchType line_search_type; + LineSearchInterpolationType line_search_interpolation_type; + NonlinearConjugateGradient nonlinear_conjugate_gradient_type; int max_lbfgs_rank; }; diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc index 9ff2d1527..426a27049 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc @@ -152,6 +152,7 @@ string Solver::Summary::BriefReport() const { }; using internal::StringAppendF; +using internal::StringPrintf; string Solver::Summary::FullReport() const { string report = @@ -224,9 +225,6 @@ string Solver::Summary::FullReport() const { StringAppendF(&report, "Preconditioner %25s%25s\n", PreconditionerTypeToString(preconditioner_type), PreconditionerTypeToString(preconditioner_type)); - } else { - StringAppendF(&report, "Preconditioner %25s%25s\n", - "N/A", "N/A"); } StringAppendF(&report, "Threads % 25d% 25d\n", @@ -266,18 +264,29 @@ string Solver::Summary::FullReport() const { } else { // LINE_SEARCH HEADER StringAppendF(&report, "\nMinimizer %19s\n", "LINE_SEARCH"); - if (line_search_direction_type == LBFGS) { - StringAppendF(&report, "Line search direction %19s(%d)\n", - LineSearchDirectionTypeToString(line_search_direction_type), - max_lbfgs_rank); - } else { - StringAppendF(&report, "Line search direction %19s\n", - LineSearchDirectionTypeToString( - line_search_direction_type)); - } - StringAppendF(&report, "Line search type %19s\n", - LineSearchTypeToString(line_search_type)); + + string line_search_direction_string; + if (line_search_direction_type == LBFGS) { + line_search_direction_string = StringPrintf("LBFGS (%d)", max_lbfgs_rank); + } else if (line_search_direction_type == NONLINEAR_CONJUGATE_GRADIENT) { + line_search_direction_string = + NonlinearConjugateGradientTypeToString( + nonlinear_conjugate_gradient_type); + } else { + line_search_direction_string = + LineSearchDirectionTypeToString(line_search_direction_type); + } + + StringAppendF(&report, "Line search direction %19s\n", + line_search_direction_string.c_str()); + + const string line_search_type_string = + StringPrintf("%s %s", + LineSearchInterpolationTypeToString(line_search_interpolation_type), + LineSearchTypeToString(line_search_type)); + StringAppendF(&report, "Line search type %19s\n", + line_search_type_string.c_str()); StringAppendF(&report, "\n"); StringAppendF(&report, "%45s %21s\n", "Given", "Used"); @@ -307,10 +316,16 @@ string Solver::Summary::FullReport() const { StringAppendF(&report, "\nMinimizer iterations % 16d\n", num_successful_steps + num_unsuccessful_steps); - StringAppendF(&report, "Successful steps % 14d\n", - num_successful_steps); - StringAppendF(&report, "Unsuccessful steps % 14d\n", - num_unsuccessful_steps); + + // Successful/Unsuccessful steps only matter in the case of the + // trust region solver. Line search terminates when it encounters + // the first unsuccessful step. + if (minimizer_type == TRUST_REGION) { + StringAppendF(&report, "Successful steps % 14d\n", + num_successful_steps); + StringAppendF(&report, "Unsuccessful steps % 14d\n", + num_unsuccessful_steps); + } if (inner_iterations_used) { StringAppendF(&report, "Steps with inner iterations % 14d\n", num_inner_iteration_steps); diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc index 1696e3ab1..b5d6fcb96 100644 --- a/internal/ceres/solver_impl.cc +++ b/internal/ceres/solver_impl.cc @@ -624,6 +624,11 @@ void SolverImpl::LineSearchSolve(const Solver::Options& original_options, original_options.line_search_direction_type; summary->max_lbfgs_rank = original_options.max_lbfgs_rank; summary->line_search_type = original_options.line_search_type; + summary->line_search_interpolation_type = + original_options.line_search_interpolation_type; + summary->nonlinear_conjugate_gradient_type = + original_options.nonlinear_conjugate_gradient_type; + summary->num_parameter_blocks = original_program->NumParameterBlocks(); summary->num_parameters = original_program->NumParameters(); summary->num_residual_blocks = original_program->NumResidualBlocks();