From a9977da3eb1b87287312555ad4965fa7f8ea09e4 Mon Sep 17 00:00:00 2001 From: Sameer Agarwal Date: Wed, 28 Jun 2017 06:26:04 -0700 Subject: [PATCH] Fix and enhance GradientProblemSolver::Summary::FullReport 1. Fix a bug which was causing the cost and gradient evaluation time to not be reported. 2. Add the number of times cost and gradients are evaluated to the Summary object and to the output of FullReport. Change-Id: Id0703cd2dafbf437f3e537fbdc30ae81d5f4f540 --- docs/source/gradient_solver.rst | 8 +++++++ include/ceres/gradient_problem_solver.h | 6 ++++++ internal/ceres/gradient_problem_evaluator.h | 2 ++ internal/ceres/gradient_problem_solver.cc | 23 +++++++++++++-------- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/docs/source/gradient_solver.rst b/docs/source/gradient_solver.rst index ba7cbae65..40d22ff4a 100644 --- a/docs/source/gradient_solver.rst +++ b/docs/source/gradient_solver.rst @@ -447,6 +447,14 @@ Solving :class:`IterationSummary` for each minimizer iteration in order. +.. member:: int num_cost_evaluations + + Number of times the cost (and not the gradient) was evaluated. + +.. member:: int num_gradient_evaluations + + Number of times the gradient (and the cost) were evaluated. + .. member:: double GradientProblemSolver::Summary::total_time_in_seconds Time (in seconds) spent in the solver. diff --git a/include/ceres/gradient_problem_solver.h b/include/ceres/gradient_problem_solver.h index 546dc34ba..31fed8427 100644 --- a/include/ceres/gradient_problem_solver.h +++ b/include/ceres/gradient_problem_solver.h @@ -301,6 +301,12 @@ class CERES_EXPORT GradientProblemSolver { // IterationSummary for each minimizer iteration in order. std::vector iterations; + // Number of times the cost (and not the gradient) was evaluated. + int num_cost_evaluations; + + // Number of times the gradient (and the cost) were evaluated. + int num_gradient_evaluations; + // Sum total of all time spent inside Ceres when Solve is called. double total_time_in_seconds; diff --git a/internal/ceres/gradient_problem_evaluator.h b/internal/ceres/gradient_problem_evaluator.h index 2c5625447..ca49c2412 100644 --- a/internal/ceres/gradient_problem_evaluator.h +++ b/internal/ceres/gradient_problem_evaluator.h @@ -60,6 +60,8 @@ class GradientProblemEvaluator : public Evaluator { ScopedExecutionTimer call_type_timer( gradient == NULL ? "Evaluator::Cost" : "Evaluator::Gradient", &execution_summary_); + execution_summary_.IncrementCall(gradient == NULL ? "Evaluator::Cost" + : "Evaluator::Gradient"); return problem_.Evaluate(state, cost, gradient); } diff --git a/internal/ceres/gradient_problem_solver.cc b/internal/ceres/gradient_problem_solver.cc index 018401d33..478818b34 100644 --- a/internal/ceres/gradient_problem_solver.cc +++ b/internal/ceres/gradient_problem_solver.cc @@ -166,10 +166,15 @@ void GradientProblemSolver::Solve(const GradientProblemSolver::Options& options, const std::map& evaluator_time_statistics = minimizer_options.evaluator->TimeStatistics(); summary->cost_evaluation_time_in_seconds = - FindWithDefault(evaluator_time_statistics, "Evaluator::Residual", 0.0); + FindWithDefault(evaluator_time_statistics, "Evaluator::Cost", 0.0); summary->gradient_evaluation_time_in_seconds = - FindWithDefault(evaluator_time_statistics, "Evaluator::Jacobian", 0.0); - + FindWithDefault(evaluator_time_statistics, "Evaluator::Gradient", 0.0); + const std::map& evaluator_call_statistics = + minimizer_options.evaluator->CallStatistics(); + summary->num_cost_evaluations = + FindWithDefault(evaluator_call_statistics, "Evaluator::Cost", 0); + summary->num_gradient_evaluations = + FindWithDefault(evaluator_call_statistics, "Evaluator::Gradient", 0); summary->total_time_in_seconds = WallTimeInSeconds() - start_time; } @@ -257,14 +262,14 @@ string GradientProblemSolver::Summary::FullReport() const { static_cast(iterations.size())); StringAppendF(&report, "\nTime (in seconds):\n"); - - StringAppendF(&report, "\n Cost evaluation %23.4f\n", - cost_evaluation_time_in_seconds); - StringAppendF(&report, " Gradient evaluation %23.4f\n", - gradient_evaluation_time_in_seconds); + StringAppendF(&report, "\n Cost evaluation %23.4f(%d)\n", + cost_evaluation_time_in_seconds, + num_cost_evaluations); + StringAppendF(&report, " Gradient evaluation %23.4f(%d)\n", + gradient_evaluation_time_in_seconds, + num_gradient_evaluations); StringAppendF(&report, " Polynomial minimization %17.4f\n", line_search_polynomial_minimization_time_in_seconds); - StringAppendF(&report, "Total %25.4f\n\n", total_time_in_seconds);