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
diff --git a/docs/source/gradient_solver.rst b/docs/source/gradient_solver.rst
index ba7cbae..40d22ff 100644
--- a/docs/source/gradient_solver.rst
+++ b/docs/source/gradient_solver.rst
@@ -447,6 +447,14 @@
 
    :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 546dc34..31fed84 100644
--- a/include/ceres/gradient_problem_solver.h
+++ b/include/ceres/gradient_problem_solver.h
@@ -301,6 +301,12 @@
     // IterationSummary for each minimizer iteration in order.
     std::vector<IterationSummary> 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 2c56254..ca49c24 100644
--- a/internal/ceres/gradient_problem_evaluator.h
+++ b/internal/ceres/gradient_problem_evaluator.h
@@ -60,6 +60,8 @@
     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 018401d..478818b 100644
--- a/internal/ceres/gradient_problem_solver.cc
+++ b/internal/ceres/gradient_problem_solver.cc
@@ -166,10 +166,15 @@
   const std::map<string, double>& 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<string, int>& 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 @@
                 static_cast<int>(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);