Add a TrustRegionStrategy::Summary object.

Change-Id: I7caee35a3408ee4a0ec16ba407410d822929340d
diff --git a/internal/ceres/dogleg_strategy.cc b/internal/ceres/dogleg_strategy.cc
index 44d484f..4b1f074 100644
--- a/internal/ceres/dogleg_strategy.cc
+++ b/internal/ceres/dogleg_strategy.cc
@@ -71,7 +71,7 @@
 // gradient) and the new Gauss-Newton step are computed from
 // scratch. The Dogleg step is then computed as interpolation of these
 // two vectors.
-LinearSolver::Summary DoglegStrategy::ComputeStep(
+TrustRegionStrategy::Summary DoglegStrategy::ComputeStep(
     const TrustRegionStrategy::PerSolveOptions& per_solve_options,
     SparseMatrix* jacobian,
     const double* residuals,
@@ -85,10 +85,10 @@
     // Gauss-Newton and gradient vectors are always available, only a
     // new interpolant need to be computed.
     ComputeDoglegStep(step);
-    LinearSolver::Summary linear_solver_summary;
-    linear_solver_summary.num_iterations = 0;
-    linear_solver_summary.termination_type = TOLERANCE;
-    return linear_solver_summary;
+    TrustRegionStrategy::Summary summary;
+    summary.num_iterations = 0;
+    summary.termination_type = TOLERANCE;
+    return summary;
   }
 
   reuse_ = true;
@@ -123,7 +123,11 @@
     ComputeDoglegStep(step);
   }
 
-  return linear_solver_summary;
+  TrustRegionStrategy::Summary summary;
+  summary.residual_norm = linear_solver_summary.residual_norm;
+  summary.num_iterations = linear_solver_summary.num_iterations;
+  summary.termination_type = linear_solver_summary.termination_type;
+  return summary;
 }
 
 // The trust region is assumed to be elliptical with the
diff --git a/internal/ceres/dogleg_strategy.h b/internal/ceres/dogleg_strategy.h
index 1505655..8c2ff7b 100644
--- a/internal/ceres/dogleg_strategy.h
+++ b/internal/ceres/dogleg_strategy.h
@@ -53,11 +53,10 @@
   virtual ~DoglegStrategy() {}
 
   // TrustRegionStrategy interface
-  virtual LinearSolver::Summary ComputeStep(
-      const TrustRegionStrategy::PerSolveOptions& per_solve_options,
-      SparseMatrix* jacobian,
-      const double* residuals,
-      double* step);
+  virtual Summary ComputeStep(const PerSolveOptions& per_solve_options,
+                              SparseMatrix* jacobian,
+                              const double* residuals,
+                              double* step);
   virtual void StepAccepted(double step_quality);
   virtual void StepRejected(double step_quality);
   virtual void StepIsInvalid();
diff --git a/internal/ceres/levenberg_marquardt_strategy.cc b/internal/ceres/levenberg_marquardt_strategy.cc
index 576648a..af76c42 100644
--- a/internal/ceres/levenberg_marquardt_strategy.cc
+++ b/internal/ceres/levenberg_marquardt_strategy.cc
@@ -61,7 +61,7 @@
 LevenbergMarquardtStrategy::~LevenbergMarquardtStrategy() {
 }
 
-LinearSolver::Summary LevenbergMarquardtStrategy::ComputeStep(
+TrustRegionStrategy::Summary LevenbergMarquardtStrategy::ComputeStep(
     const TrustRegionStrategy::PerSolveOptions& per_solve_options,
     SparseMatrix* jacobian,
     const double* residuals,
@@ -113,7 +113,12 @@
   }
 
   reuse_diagonal_ = true;
-  return linear_solver_summary;
+
+  TrustRegionStrategy::Summary summary;
+  summary.residual_norm = linear_solver_summary.residual_norm;
+  summary.num_iterations = linear_solver_summary.num_iterations;
+  summary.termination_type = linear_solver_summary.termination_type;
+  return summary;
 }
 
 void LevenbergMarquardtStrategy::StepAccepted(double step_quality) {
diff --git a/internal/ceres/levenberg_marquardt_strategy.h b/internal/ceres/levenberg_marquardt_strategy.h
index 4ed1390..90c2178 100644
--- a/internal/ceres/levenberg_marquardt_strategy.h
+++ b/internal/ceres/levenberg_marquardt_strategy.h
@@ -31,7 +31,7 @@
 #ifndef CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_
 #define CERES_INTERNAL_LEVENBERG_MARQUARDT_STRATEGY_H_
 
-#include "ceres/linear_solver.h"
+#include "ceres/internal/eigen.h"
 #include "ceres/trust_region_strategy.h"
 
 namespace ceres {
@@ -48,7 +48,7 @@
   virtual ~LevenbergMarquardtStrategy();
 
   // TrustRegionStrategy interface
-  virtual LinearSolver::Summary ComputeStep(
+  virtual TrustRegionStrategy::Summary ComputeStep(
       const TrustRegionStrategy::PerSolveOptions& per_solve_options,
       SparseMatrix* jacobian,
       const double* residuals,
diff --git a/internal/ceres/levenberg_marquardt_strategy_test.cc b/internal/ceres/levenberg_marquardt_strategy_test.cc
index 22f04aa..6f61dd1 100644
--- a/internal/ceres/levenberg_marquardt_strategy_test.cc
+++ b/internal/ceres/levenberg_marquardt_strategy_test.cc
@@ -28,14 +28,15 @@
 //
 // Author: sameeragarwal@google.com (Sameer Agarwal)
 
-
+#include "ceres/internal/eigen.h"
+#include "ceres/internal/scoped_ptr.h"
+#include "ceres/levenberg_marquardt_strategy.h"
+#include "ceres/linear_solver.h"
+#include "ceres/trust_region_strategy.h"
 #include "glog/logging.h"
 #include "gmock/gmock.h"
 #include "gmock/mock-log.h"
 #include "gtest/gtest.h"
-#include "ceres/trust_region_strategy.h"
-#include "ceres/levenberg_marquardt_strategy.h"
-#include "ceres/internal/eigen.h"
 
 using testing::AllOf;
 using testing::AnyNumber;
@@ -147,7 +148,7 @@
     EXPECT_CALL(log, Log(WARNING, _,
                          HasSubstr("Failed to compute a finite step.")));
 
-    LinearSolver::Summary summary = lms.ComputeStep(pso, &dsm, &residual, x);
+    TrustRegionStrategy::Summary summary = lms.ComputeStep(pso, &dsm, &residual, x);
     EXPECT_EQ(summary.termination_type, FAILURE);
   }
 }
diff --git a/internal/ceres/trust_region_minimizer.cc b/internal/ceres/trust_region_minimizer.cc
index 476cc9d..19e3f35 100644
--- a/internal/ceres/trust_region_minimizer.cc
+++ b/internal/ceres/trust_region_minimizer.cc
@@ -250,7 +250,7 @@
     const time_t strategy_start_time = time(NULL);
     TrustRegionStrategy::PerSolveOptions per_solve_options;
     per_solve_options.eta = options_.eta;
-    LinearSolver::Summary strategy_summary =
+    TrustRegionStrategy::Summary strategy_summary =
         strategy->ComputeStep(per_solve_options,
                               jacobian,
                               residuals.data(),
diff --git a/internal/ceres/trust_region_strategy.h b/internal/ceres/trust_region_strategy.h
index 8d5977e..7d94ca2 100644
--- a/internal/ceres/trust_region_strategy.h
+++ b/internal/ceres/trust_region_strategy.h
@@ -31,11 +31,14 @@
 #ifndef CERES_INTERNAL_TRUST_REGION_STRATEGY_H_
 #define CERES_INTERNAL_TRUST_REGION_STRATEGY_H_
 
-#include "ceres/linear_solver.h"
+#include "ceres/types.h"
 
 namespace ceres {
 namespace internal {
 
+class LinearSolver;
+class SparseMatrix;
+
 // Interface for classes implementing various trust region strategies
 // for nonlinear least squares problems.
 //
@@ -79,14 +82,38 @@
     double eta;
   };
 
+  struct Summary {
+    Summary()
+        : residual_norm(0.0),
+          num_iterations(-1),
+          termination_type(FAILURE) {
+    }
+
+    // If the trust region problem is,
+    //
+    //   1/2 x'Ax + b'x + c,
+    //
+    // then
+    //
+    //   residual_norm = |Ax -b|
+    double residual_norm;
+
+    // Number of iterations used by the linear solver. If a linear
+    // solver was not called (e.g., DogLegStrategy after an
+    // unsuccessful step), then this would be zero.
+    int num_iterations;
+
+    // Status of the linear solver used to solve the Newton system.
+    LinearSolverTerminationType termination_type;
+  };
+
   virtual ~TrustRegionStrategy();
 
   // Use the current radius to solve for the trust region step.
-  virtual LinearSolver::Summary ComputeStep(
-      const PerSolveOptions& per_solve_options,
-      SparseMatrix* jacobian,
-      const double* residuals,
-      double* step) = 0;
+  virtual Summary ComputeStep(const PerSolveOptions& per_solve_options,
+                              SparseMatrix* jacobian,
+                              const double* residuals,
+                              double* step) = 0;
 
   // Inform the strategy that the current step has been accepted, and
   // that the ratio of the decrease in the non-linear objective to the