Merge branch 'master' of https://code.google.com/p/ceres-solver
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc
index 61cd41f..885dbe2 100644
--- a/examples/bundle_adjuster.cc
+++ b/examples/bundle_adjuster.cc
@@ -75,7 +75,9 @@
 
 DEFINE_int32(num_iterations, 5, "Number of iterations");
 DEFINE_int32(num_threads, 1, "Number of threads");
-DEFINE_double(eta, 1e-2, "Default value for eta.");
+DEFINE_double(eta, 1e-2, "Default value for eta. Eta determines the "
+             "accuracy of each linear solve of the truncated newton step. "
+             "Changing this parameter can affect solve performance ");
 DEFINE_bool(use_schur_ordering, false, "Use automatic Schur ordering.");
 DEFINE_bool(use_quaternions, false, "If true, uses quaternions to represent "
             "rotations. If false, angle axis is used");
@@ -99,7 +101,7 @@
     options->linear_solver_type = ceres::CONJUGATE_GRADIENTS;
   } else if (FLAGS_solver_type == "dense_qr") {
     // DENSE_QR is included here for completeness, but actually using
-    // this opttion is a bad idea due to the amount of memory needed
+    // this option is a bad idea due to the amount of memory needed
     // to store even the smallest of the bundle adjustment jacobian
     // arrays
     options->linear_solver_type = ceres::DENSE_QR;
@@ -108,8 +110,20 @@
                << FLAGS_solver_type;
   }
 
-  if (options->linear_solver_type == ceres::ITERATIVE_SCHUR ||
-      options->linear_solver_type == ceres::CONJUGATE_GRADIENTS) {
+  if (options->linear_solver_type == ceres::CONJUGATE_GRADIENTS) {
+    options->linear_solver_min_num_iterations = 5;
+    if (FLAGS_preconditioner_type == "identity") {
+      options->preconditioner_type = ceres::IDENTITY;
+    } else if (FLAGS_preconditioner_type == "jacobi") {
+      options->preconditioner_type = ceres::JACOBI;
+    } else {
+      LOG(FATAL) << "For CONJUGATE_GRADIENTS, only identity and jacobian "
+                 << "preconditioners are supported. Got: "
+                 << FLAGS_preconditioner_type;
+    }
+  }
+
+  if (options->linear_solver_type == ceres::ITERATIVE_SCHUR) {
     options->linear_solver_min_num_iterations = 5;
     if (FLAGS_preconditioner_type == "identity") {
       options->preconditioner_type = ceres::IDENTITY;
@@ -123,7 +137,7 @@
       options->preconditioner_type = ceres::CLUSTER_TRIDIAGONAL;
     } else {
       LOG(FATAL) << "Unknown ceres preconditioner type: "
-               << FLAGS_preconditioner_type;
+                 << FLAGS_preconditioner_type;
     }
   }
 
diff --git a/internal/ceres/solver_impl_test.cc b/internal/ceres/solver_impl_test.cc
index 6f22357..99733a2 100644
--- a/internal/ceres/solver_impl_test.cc
+++ b/internal/ceres/solver_impl_test.cc
@@ -37,7 +37,6 @@
 #include "ceres/solver_impl.h"
 #include "ceres/sized_cost_function.h"
 
-
 namespace ceres {
 namespace internal {
 
@@ -363,14 +362,6 @@
   EXPECT_EQ(parameter_blocks[2]->user_state(), &y);
 }
 
-
-TEST(SolverImpl, CreateLinearSolverConjugateGradients) {
-  Solver::Options options;
-  options.linear_solver_type = CONJUGATE_GRADIENTS;
-  string error;
-  EXPECT_FALSE(SolverImpl::CreateLinearSolver(&options, &error));
-}
-
 #ifdef CERES_NO_SUITESPARSE
 TEST(SolverImpl, CreateLinearSolverNoSuiteSparse) {
   Solver::Options options;
diff --git a/internal/ceres/symmetric_linear_solver_test.cc b/internal/ceres/symmetric_linear_solver_test.cc
index 365c9c0..8a7ce68 100644
--- a/internal/ceres/symmetric_linear_solver_test.cc
+++ b/internal/ceres/symmetric_linear_solver_test.cc
@@ -36,6 +36,7 @@
 // more badly conditioned problem.
 
 #include "gtest/gtest.h"
+#include "ceres/conjugate_gradients_solver.h"
 #include "ceres/linear_solver.h"
 #include "ceres/triplet_sparse_matrix.h"
 #include "ceres/internal/eigen.h"
@@ -63,14 +64,13 @@
   LinearSolver::Options options;
   options.max_num_iterations = 10;
   options.constant_sparsity = false;
-  options.type = CONJUGATE_GRADIENTS;
 
   LinearSolver::PerSolveOptions per_solve_options;
   per_solve_options.r_tolerance = 1e-9;
 
-  scoped_ptr<LinearSolver> solver(LinearSolver::Create(options));
+  ConjugateGradientsSolver solver(options);
   LinearSolver::Summary summary =
-      solver->Solve(A.get(), b.data(), per_solve_options, x.data());
+      solver.Solve(A.get(), b.data(), per_solve_options, x.data());
 
   EXPECT_EQ(summary.termination_type, TOLERANCE);
   ASSERT_EQ(summary.num_iterations, 1);
@@ -121,15 +121,13 @@
 
   LinearSolver::Options options;
   options.max_num_iterations = 10;
-  options.constant_sparsity = false;
-  options.type = CONJUGATE_GRADIENTS;
 
   LinearSolver::PerSolveOptions per_solve_options;
   per_solve_options.r_tolerance = 1e-9;
 
-  scoped_ptr<LinearSolver> solver(LinearSolver::Create(options));
+  ConjugateGradientsSolver solver(options);
   LinearSolver::Summary summary =
-      solver->Solve(A.get(), b.data(), per_solve_options, x.data());
+      solver.Solve(A.get(), b.data(), per_solve_options, x.data());
 
   EXPECT_EQ(summary.termination_type, TOLERANCE);