Fix Solver::Summary when line search is used. Also enable line search in bundle_adjuster. Change-Id: Ic4343a4334b9f5a6fdeab38d4e3e1f6932bbc601
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc index 59420c9..c060aed 100644 --- a/examples/bundle_adjuster.cc +++ b/examples/bundle_adjuster.cc
@@ -112,6 +112,8 @@ "of the pseudo random number generator used to generate " "the pertubations."); DEFINE_string(solver_log, "", "File to record the solver execution to."); +DEFINE_bool(line_search, false, "Use a line search instead of trust region " + "algorithm."); namespace ceres { namespace examples { @@ -219,6 +221,10 @@ options->eta = FLAGS_eta; options->max_solver_time_in_seconds = FLAGS_max_solver_time; options->use_nonmonotonic_steps = FLAGS_nonmonotonic_steps; + if (FLAGS_line_search) { + options->minimizer_type = ceres::LINE_SEARCH; + } + CHECK(StringToTrustRegionStrategyType(FLAGS_trust_region_strategy, &options->trust_region_strategy_type)); CHECK(StringToDoglegType(FLAGS_dogleg, &options->dogleg_type));
diff --git a/internal/ceres/line_search_minimizer.cc b/internal/ceres/line_search_minimizer.cc index 684a736..92b7965 100644 --- a/internal/ceres/line_search_minimizer.cc +++ b/internal/ceres/line_search_minimizer.cc
@@ -194,6 +194,8 @@ iteration_summary = IterationSummary(); iteration_summary.iteration = summary->iterations.back().iteration + 1; + iteration_summary.step_is_valid = false; + iteration_summary.step_is_successful = false; bool line_search_status = true; if (iteration_summary.iteration == 1) { @@ -232,6 +234,8 @@ delta = current_state.step_size * current_state.search_direction; previous_state = current_state; + iteration_summary.step_solver_time_in_seconds = + WallTimeInSeconds() - iteration_start_time; // TODO(sameeragarwal): Collect stats. if (!evaluator->Plus(x.data(), delta.data(), x_plus_delta.data()) || @@ -278,6 +282,7 @@ + summary->preprocessor_time_in_seconds; summary->iterations.push_back(iteration_summary); + ++summary->num_successful_steps; } }
diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc index 8b8395c..1696e3a 100644 --- a/internal/ceres/solver_impl.cc +++ b/internal/ceres/solver_impl.cc
@@ -624,10 +624,11 @@ 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->num_parameter_blocks = problem_impl->NumParameterBlocks(); - summary->num_parameters = problem_impl->NumParameters(); - summary->num_residual_blocks = problem_impl->NumResidualBlocks(); - summary->num_residuals = problem_impl->NumResiduals(); + summary->num_parameter_blocks = original_program->NumParameterBlocks(); + summary->num_parameters = original_program->NumParameters(); + summary->num_residual_blocks = original_program->NumResidualBlocks(); + summary->num_residuals = original_program->NumResiduals(); + summary->num_effective_parameters = original_program->NumEffectiveParameters(); // Empty programs are usually a user error. if (summary->num_parameter_blocks == 0) { @@ -717,6 +718,8 @@ summary->num_parameter_blocks_reduced = reduced_program->NumParameterBlocks(); summary->num_parameters_reduced = reduced_program->NumParameters(); summary->num_residual_blocks_reduced = reduced_program->NumResidualBlocks(); + summary->num_effective_parameters_reduced = + reduced_program->NumEffectiveParameters(); summary->num_residuals_reduced = reduced_program->NumResiduals(); if (summary->num_parameter_blocks_reduced == 0) {