Stricter checking of Solver::Option::num_eliminate_blocks.

Change-Id: Ic8e61cedbe0eb028a32c89f77dc6b838d3a8caa4
diff --git a/internal/ceres/solver_impl.cc b/internal/ceres/solver_impl.cc
index 2802a75..5d253dd 100644
--- a/internal/ceres/solver_impl.cc
+++ b/internal/ceres/solver_impl.cc
@@ -215,13 +215,26 @@
   }
   if (options.num_linear_solver_threads > 1) {
     LOG(WARNING)
-        << "OpenMP support is not compiled into this binary; "
+        << "OpenMP support is not compiled into this binary"
         << "only options.num_linear_solver_threads=1 is supported. Switching"
         << "to single threaded mode.";
     options.num_linear_solver_threads = 1;
   }
 #endif
 
+  if (IsSchurType(options.linear_solver_type) &&
+      options.ordering_type != SCHUR &&
+      options.num_eliminate_blocks < 1) {
+    summary->error =
+        StringPrintf("Using a Schur type solver with %s"
+                     " ordering requires that"
+                     " Solver::Options::num_eliminate_blocks"
+                     " be set to a positive integer.",
+                     OrderingTypeToString(options.ordering_type));
+    LOG(WARNING) << summary->error;
+    return;
+  }
+
   summary->linear_solver_type_given = options.linear_solver_type;
   summary->num_eliminate_blocks_given = original_options.num_eliminate_blocks;
   summary->num_threads_given = original_options.num_threads;
@@ -275,7 +288,6 @@
 
   // Create the three objects needed to minimize: the transformed program, the
   // evaluator, and the linear solver.
-
   scoped_ptr<Program> reduced_program(CreateReducedProgram(&options,
                                                            problem_impl,
                                                            &summary->fixed_cost,
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 76ece8d..7d7740a 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -542,6 +542,18 @@
 #endif
 }
 
+TEST(SolverImpl, ZeroNumEliminateBlocks) {
+  Solver::Options options;
+  options.num_eliminate_blocks = 0;
+  options.linear_solver_type = DENSE_SCHUR;
+  options.ordering_type = NATURAL;
+  ProblemImpl problem;
+  Solver::Summary summary;
+  SolverImpl::Solve(options, &problem, &summary);
+  EXPECT_EQ(summary.termination_type, DID_NOT_RUN);
+  EXPECT_EQ(summary.error.substr(0,25), "Using a Schur type solver");
+}
+
 TEST(SolverImpl, CreateLinearSolverDenseSchurMultipleThreads) {
   Solver::Options options;
   options.num_eliminate_blocks = 1;