Check that the Dogleg Solver uses a direct solver.

Change-Id: I7947361542aecded0adc0ca775b5b0011ce9fb23
diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc
index 877a5af..ca35adc 100644
--- a/internal/ceres/solver_impl.cc
+++ b/internal/ceres/solver_impl.cc
@@ -452,6 +452,16 @@
 
 LinearSolver* SolverImpl::CreateLinearSolver(Solver::Options* options,
                                              string* error) {
+  if (options->trust_region_strategy_type == DOGLEG) {
+    if (options->linear_solver_type == ITERATIVE_SCHUR ||
+        options->linear_solver_type == CGNR) {
+      *error = "DOGLEG only supports exact factorization based linear "
+               "solvers. If you want to use an iterative solver please "
+               "use LEVENBERG_MARQUARDT as the trust_region_strategy_type";
+      return NULL;
+    }
+  }
+
 #ifdef CERES_NO_SUITESPARSE
   if (options->linear_solver_type == SPARSE_NORMAL_CHOLESKY &&
       options->sparse_linear_algebra_library == SUITE_SPARSE) {
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 20190f1..81775fb 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -498,6 +498,19 @@
   EXPECT_EQ(options.num_linear_solver_threads, 1);
 }
 
+TEST(SolverImpl, CreateIterativeLinearSolverForDogleg) {
+  Solver::Options options;
+  options.trust_region_strategy_type = DOGLEG;
+  string error;
+  options.linear_solver_type = ITERATIVE_SCHUR;
+  EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
+            static_cast<LinearSolver*>(NULL));
+
+  options.linear_solver_type = CGNR;
+  EXPECT_EQ(SolverImpl::CreateLinearSolver(&options, &error),
+            static_cast<LinearSolver*>(NULL));
+}
+
 TEST(SolverImpl, CreateLinearSolverNormalOperation) {
   Solver::Options options;
   scoped_ptr<LinearSolver> solver;