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