A bunch of minor changes. 1. Fix a typo in auto_diff_cost_function.h 2. Fix and update Solver::Summary::FullReport() text labels. 3. Add logging of the number of residual and jacobian evaluations to the full report. The GradientProblemSolver already does this. Change-Id: I41059af5f0ebe0417accbbc30b0808a4b04b9edb
diff --git a/docs/source/nnls_solving.rst b/docs/source/nnls_solving.rst index 56b3ab9..4dd17ec 100644 --- a/docs/source/nnls_solving.rst +++ b/docs/source/nnls_solving.rst
@@ -2045,10 +2045,18 @@ Time (in seconds) spent evaluating the residual vector. +.. member:: int Solver::Summary::num_residual_evaluations + + Number of times only the residuals were evaluated. + .. member:: double Solver::Summary::jacobian_evaluation_time_in_seconds Time (in seconds) spent evaluating the Jacobian matrix. +.. member:: int Solver::Summary::num_jacobian_evaluations + + Number of times only the Jacobian and the residuals were evaluated. + .. member:: double Solver::Summary::inner_iteration_time_in_seconds Time (in seconds) spent doing inner iterations.
diff --git a/include/ceres/autodiff_cost_function.h b/include/ceres/autodiff_cost_function.h index e7893e4..490fb3d 100644 --- a/include/ceres/autodiff_cost_function.h +++ b/include/ceres/autodiff_cost_function.h
@@ -197,7 +197,7 @@ // Implementation details follow; clients of the autodiff cost function should // not have to examine below here. // - // To handle varardic cost functions, some template magic is needed. It's + // To handle variadic cost functions, some template magic is needed. It's // mostly hidden inside autodiff.h. virtual bool Evaluate(double const* const* parameters, double* residuals,
diff --git a/include/ceres/solver.h b/include/ceres/solver.h index 96391ba..3a55a65 100644 --- a/include/ceres/solver.h +++ b/include/ceres/solver.h
@@ -844,9 +844,15 @@ // Time (in seconds) spent evaluating the residual vector. double residual_evaluation_time_in_seconds; + // Number of residual only evaluations. + int num_residual_evaluations; + // Time (in seconds) spent evaluating the jacobian matrix. double jacobian_evaluation_time_in_seconds; + // Number of Jacobian (and residual) evaluations. + int num_jacobian_evaluations; + // Time (in seconds) spent doing inner iterations. double inner_iteration_time_in_seconds;
diff --git a/internal/ceres/execution_summary.h b/internal/ceres/execution_summary.h index aa9929d..80f1af8 100644 --- a/internal/ceres/execution_summary.h +++ b/internal/ceres/execution_summary.h
@@ -44,6 +44,12 @@ // Struct used by various objects to report statistics and other // information about their execution. e.g., ExecutionSummary::times // can be used for reporting times associated with various activities. +// +// TODO(https://github.com/ceres-solver/ceres-solver/issues/340): +// Replace the two maps by one to save on a lookup, since the usage +// pattern is to keep track of the calls and the time increment at the +// same time. +// class ExecutionSummary { public: void IncrementTimeBy(const std::string& name, const double value) { @@ -76,6 +82,7 @@ ~ScopedExecutionTimer() { summary_->IncrementTimeBy(name_, WallTimeInSeconds() - start_time_); + summary_->IncrementCall(name_); } private:
diff --git a/internal/ceres/gradient_problem_evaluator.h b/internal/ceres/gradient_problem_evaluator.h index 9ccd10e..69e0e8a 100644 --- a/internal/ceres/gradient_problem_evaluator.h +++ b/internal/ceres/gradient_problem_evaluator.h
@@ -67,8 +67,6 @@ ScopedExecutionTimer call_type_timer( gradient == NULL ? "Evaluator::Residual" : "Evaluator::Jacobian", &execution_summary_); - execution_summary_.IncrementCall(gradient == NULL ? "Evaluator::Residual" - : "Evaluator::Jacobian"); return problem_.Evaluate(state, cost, gradient); }
diff --git a/internal/ceres/gradient_problem_solver.cc b/internal/ceres/gradient_problem_solver.cc index 920d735..b22c5a1 100644 --- a/internal/ceres/gradient_problem_solver.cc +++ b/internal/ceres/gradient_problem_solver.cc
@@ -276,7 +276,7 @@ StringAppendF(&report, "\n Cost evaluation %23.6f (%d)\n", cost_evaluation_time_in_seconds, num_cost_evaluations); - StringAppendF(&report, " Gradient evaluation %23.6f (%d)\n", + StringAppendF(&report, " Gradient & cost evaluation %16.6f (%d)\n", gradient_evaluation_time_in_seconds, num_gradient_evaluations); StringAppendF(&report, " Polynomial minimization %17.6f\n",
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc index bee0e19..4d1db50 100644 --- a/internal/ceres/solver.cc +++ b/internal/ceres/solver.cc
@@ -404,6 +404,13 @@ FindWithDefault(evaluator_time_statistics, "Evaluator::Residual", 0.0); summary->jacobian_evaluation_time_in_seconds = FindWithDefault(evaluator_time_statistics, "Evaluator::Jacobian", 0.0); + + const map<string, int>& evaluator_call_statistics = + pp.evaluator->CallStatistics(); + summary->num_residual_evaluations = + FindWithDefault(evaluator_call_statistics, "Evaluator::Residual", 0); + summary->num_jacobian_evaluations = + FindWithDefault(evaluator_call_statistics, "Evaluator::Jacobian", 0); } // Again, like the evaluator, there may or may not be a linear @@ -627,7 +634,9 @@ total_time_in_seconds(-1.0), linear_solver_time_in_seconds(-1.0), residual_evaluation_time_in_seconds(-1.0), + num_residual_evaluations(-1), jacobian_evaluation_time_in_seconds(-1.0), + num_jacobian_evaluations(-1), inner_iteration_time_in_seconds(-1.0), line_search_cost_evaluation_time_in_seconds(-1.0), line_search_gradient_evaluation_time_in_seconds(-1.0), @@ -696,7 +705,7 @@ } StringAppendF(&report, "Residual blocks % 25d% 25d\n", num_residual_blocks, num_residual_blocks_reduced); - StringAppendF(&report, "Residual % 25d% 25d\n", + StringAppendF(&report, "Residuals % 25d% 25d\n", num_residuals, num_residuals_reduced); if (minimizer_type == TRUST_REGION) { @@ -866,14 +875,14 @@ StringAppendF(&report, "Preprocessor %25.6f\n", preprocessor_time_in_seconds); - StringAppendF(&report, "\n Residual evaluation %23.6f\n", - residual_evaluation_time_in_seconds); + StringAppendF(&report, "\n Residual only evaluation %18.6f (%d)\n", + residual_evaluation_time_in_seconds, num_residual_evaluations); if (line_search_used) { StringAppendF(&report, " Line search cost evaluation %10.6f\n", line_search_cost_evaluation_time_in_seconds); } - StringAppendF(&report, " Jacobian evaluation %23.6f\n", - jacobian_evaluation_time_in_seconds); + StringAppendF(&report, " Jacobian & residual evaluation %12.6f (%d)\n", + jacobian_evaluation_time_in_seconds, num_jacobian_evaluations); if (line_search_used) { StringAppendF(&report, " Line search gradient evaluation %6.6f\n", line_search_gradient_evaluation_time_in_seconds);