Add parallel bundle tests to CMake build

This converts the bundle_adjustment_test to the parallel
version with multiple binaries, as is already in place for
the Bazel build. Additionally, since there is no longer a
need for it, this deletes bundle_adjustment_test.cc.

The test suite now runs on my 6 year old desktop in ~60 seconds!

Change-Id: Ib4a59f8749e823f697e6da5d303977d284303ae3
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 92d8cd3..bddbe79 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -377,8 +377,7 @@
   ceres_test(visibility)
   ceres_test(visibility_based_preconditioner)
 
-  # Put the large end to end test last.
-  ceres_test(bundle_adjustment)
+  add_subdirectory(generated_bundle_adjustment_tests)
 
 endif (BUILD_TESTING AND GFLAGS)
 
diff --git a/internal/ceres/bundle_adjustment_test.cc b/internal/ceres/bundle_adjustment_test.cc
deleted file mode 100644
index 5fa9d70..0000000
--- a/internal/ceres/bundle_adjustment_test.cc
+++ /dev/null
@@ -1,562 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2015 Google Inc. All rights reserved.
-// http://ceres-solver.org/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-//   this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-// * Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-// POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keir@google.com (Keir Mierle)
-//         sameeragarwal@google.com (Sameer Agarwal)
-//
-// End-to-end bundle adjustment tests for Ceres. It uses a bundle
-// adjustment problem with 16 cameras and two thousand points.
-
-#include <cmath>
-#include <cstdio>
-#include <cstdlib>
-#include <string>
-
-#include "ceres/internal/port.h"
-
-#include "ceres/autodiff_cost_function.h"
-#include "ceres/ordered_groups.h"
-#include "ceres/problem.h"
-#include "ceres/rotation.h"
-#include "ceres/solver.h"
-#include "ceres/stringprintf.h"
-#include "ceres/test_util.h"
-#include "ceres/types.h"
-#include "gflags/gflags.h"
-#include "glog/logging.h"
-#include "gtest/gtest.h"
-
-namespace ceres {
-namespace internal {
-
-using std::string;
-using std::vector;
-
-const bool kAutomaticOrdering = true;
-const bool kUserOrdering = false;
-
-// This class implements the SystemTestProblem interface and provides
-// access to a bundle adjustment problem. It is based on
-// examples/bundle_adjustment_example.cc. Currently a small 16 camera
-// problem is hard coded in the constructor.
-class BundleAdjustmentProblem {
- public:
-  BundleAdjustmentProblem() {
-    const string input_file = TestFileAbsolutePath("problem-16-22106-pre.txt");
-    ReadData(input_file);
-    BuildProblem();
-  }
-
-  ~BundleAdjustmentProblem() {
-    delete []point_index_;
-    delete []camera_index_;
-    delete []observations_;
-    delete []parameters_;
-  }
-
-  Problem* mutable_problem() { return &problem_; }
-  Solver::Options* mutable_solver_options() { return &options_; }
-
-  int num_cameras()            const { return num_cameras_;        }
-  int num_points()             const { return num_points_;         }
-  int num_observations()       const { return num_observations_;   }
-  const int* point_index()     const { return point_index_;  }
-  const int* camera_index()    const { return camera_index_; }
-  const double* observations() const { return observations_; }
-  double* mutable_cameras() { return parameters_; }
-  double* mutable_points() { return parameters_  + 9 * num_cameras_; }
-
-  static double kResidualTolerance;
-
- private:
-  void ReadData(const string& filename) {
-    FILE * fptr = fopen(filename.c_str(), "r");
-
-    if (!fptr) {
-      LOG(FATAL) << "File Error: unable to open file " << filename;
-    }
-
-    // This will die horribly on invalid files. Them's the breaks.
-    FscanfOrDie(fptr, "%d", &num_cameras_);
-    FscanfOrDie(fptr, "%d", &num_points_);
-    FscanfOrDie(fptr, "%d", &num_observations_);
-
-    VLOG(1) << "Header: " << num_cameras_
-            << " " << num_points_
-            << " " << num_observations_;
-
-    point_index_ = new int[num_observations_];
-    camera_index_ = new int[num_observations_];
-    observations_ = new double[2 * num_observations_];
-
-    num_parameters_ = 9 * num_cameras_ + 3 * num_points_;
-    parameters_ = new double[num_parameters_];
-
-    for (int i = 0; i < num_observations_; ++i) {
-      FscanfOrDie(fptr, "%d", camera_index_ + i);
-      FscanfOrDie(fptr, "%d", point_index_ + i);
-      for (int j = 0; j < 2; ++j) {
-        FscanfOrDie(fptr, "%lf", observations_ + 2*i + j);
-      }
-    }
-
-    for (int i = 0; i < num_parameters_; ++i) {
-      FscanfOrDie(fptr, "%lf", parameters_ + i);
-    }
-  }
-
-  void BuildProblem() {
-    double* points = mutable_points();
-    double* cameras = mutable_cameras();
-
-    for (int i = 0; i < num_observations(); ++i) {
-      // Each Residual block takes a point and a camera as input and
-      // outputs a 2 dimensional residual.
-      CostFunction* cost_function =
-          new AutoDiffCostFunction<BundlerResidual, 2, 9, 3>(
-              new BundlerResidual(observations_[2*i + 0],
-                                  observations_[2*i + 1]));
-
-      // Each observation correponds to a pair of a camera and a point
-      // which are identified by camera_index()[i] and
-      // point_index()[i] respectively.
-      double* camera = cameras + 9 * camera_index_[i];
-      double* point = points + 3 * point_index()[i];
-      problem_.AddResidualBlock(cost_function, NULL, camera, point);
-    }
-
-    options_.linear_solver_ordering.reset(new ParameterBlockOrdering);
-
-    // The points come before the cameras.
-    for (int i = 0; i < num_points_; ++i) {
-      options_.linear_solver_ordering->AddElementToGroup(points + 3 * i, 0);
-    }
-
-    for (int i = 0; i < num_cameras_; ++i) {
-      options_.linear_solver_ordering->AddElementToGroup(cameras + 9 * i, 1);
-    }
-
-    options_.linear_solver_type = DENSE_SCHUR;
-    options_.max_num_iterations = 25;
-    options_.function_tolerance = 1e-10;
-    options_.gradient_tolerance = 1e-10;
-    options_.parameter_tolerance = 1e-10;
-  }
-
-  template<typename T>
-  void FscanfOrDie(FILE *fptr, const char *format, T *value) {
-    int num_scanned = fscanf(fptr, format, value);
-    if (num_scanned != 1) {
-      LOG(FATAL) << "Invalid UW data file.";
-    }
-  }
-
-  // Templated pinhole camera model.  The camera is parameterized
-  // using 9 parameters. 3 for rotation, 3 for translation, 1 for
-  // focal length and 2 for radial distortion. The principal point is
-  // not modeled (i.e. it is assumed to be located at the image
-  // center).
-  struct BundlerResidual {
-    // (u, v): the position of the observation with respect to the image
-    // center point.
-    BundlerResidual(double u, double v): u(u), v(v) {}
-
-    template <typename T>
-    bool operator()(const T* const camera,
-                    const T* const point,
-                    T* residuals) const {
-      T p[3];
-      AngleAxisRotatePoint(camera, point, p);
-
-      // Add the translation vector
-      p[0] += camera[3];
-      p[1] += camera[4];
-      p[2] += camera[5];
-
-      const T& focal = camera[6];
-      const T& l1 = camera[7];
-      const T& l2 = camera[8];
-
-      // Compute the center of distortion.  The sign change comes from
-      // the camera model that Noah Snavely's Bundler assumes, whereby
-      // the camera coordinate system has a negative z axis.
-      T xp = - focal * p[0] / p[2];
-      T yp = - focal * p[1] / p[2];
-
-      // Apply second and fourth order radial distortion.
-      T r2 = xp*xp + yp*yp;
-      T distortion = T(1.0) + r2  * (l1 + l2  * r2);
-
-      residuals[0] = distortion * xp - u;
-      residuals[1] = distortion * yp - v;
-
-      return true;
-    }
-
-    double u;
-    double v;
-  };
-
-  Problem problem_;
-  Solver::Options options_;
-
-  int num_cameras_;
-  int num_points_;
-  int num_observations_;
-  int num_parameters_;
-
-  int* point_index_;
-  int* camera_index_;
-  double* observations_;
-  // The parameter vector is laid out as follows
-  // [camera_1, ..., camera_n, point_1, ..., point_m]
-  double* parameters_;
-};
-
-double BundleAdjustmentProblem::kResidualTolerance = 1e-4;
-typedef SystemTest<BundleAdjustmentProblem> BundleAdjustmentTest;
-
-TEST_F(BundleAdjustmentTest, DenseSchurWithAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(DENSE_SCHUR, NO_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, DenseSchurWithUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(DENSE_SCHUR, NO_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, IterativeSchurWithJacobiAndAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR, NO_SPARSE, kAutomaticOrdering, JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest, IterativeSchurWithJacobiAndUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR, NO_SPARSE, kUserOrdering, JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       IterativeSchurWithSchurJacobiAndAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR,
-                   NO_SPARSE,
-                   kAutomaticOrdering,
-                   SCHUR_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest, IterativeSchurWithSchurJacobiAndUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR, NO_SPARSE, kUserOrdering, SCHUR_JACOBI));
-}
-
-#ifndef CERES_NO_SUITESPARSE
-
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, SUITE_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, SUITE_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       SparseSchurWithAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, SUITE_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, SparseSchurWithUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, SUITE_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       IterativeSchurWithClusterJacobiAndAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR,
-                   SUITE_SPARSE,
-                   kAutomaticOrdering,
-                   CLUSTER_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       IterativeSchurWithClusterJacobiAndUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR,
-                   SUITE_SPARSE,
-                   kUserOrdering,
-                   CLUSTER_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       IterativeSchurWithClusterTridiagonalAndAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR,
-                   SUITE_SPARSE,
-                   kAutomaticOrdering,
-                   CLUSTER_TRIDIAGONAL));
-}
-
-TEST_F(BundleAdjustmentTest,
-       IterativeSchurWithClusterTridiagonalAndUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(ITERATIVE_SCHUR,
-                   SUITE_SPARSE,
-                   kUserOrdering,
-                   CLUSTER_TRIDIAGONAL));
-}
-#endif  // CERES_NO_SUITESPARSE
-
-#ifndef CERES_NO_CXSPARSE
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithAutomaticOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, CX_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithUserOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, CX_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, SparseSchurWithAutomaticOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, CX_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, SparseSchurWithUserOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, CX_SPARSE, kUserOrdering));
-}
-#endif  // CERES_NO_CXSPARSE
-
-#ifdef CERES_USE_EIGEN_SPARSE
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithAutomaticOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, EIGEN_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       SparseNormalCholeskyWithUserOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_NORMAL_CHOLESKY, EIGEN_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       SparseSchurWithAutomaticOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, EIGEN_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, SparseSchurWithUserOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      SolverConfig(SPARSE_SCHUR, EIGEN_SPARSE, kUserOrdering));
-}
-#endif  // CERES_USE_EIGEN_SPARSE
-
-#ifndef CERES_NO_THREADS
-
-TEST_F(BundleAdjustmentTest, MultiThreadedDenseSchurWithAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(DENSE_SCHUR, NO_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest, MultiThreadedDenseSchurWithUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(DENSE_SCHUR, NO_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithJacobiAndAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           NO_SPARSE,
-                           kAutomaticOrdering,
-                           JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithJacobiAndUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR, NO_SPARSE, kUserOrdering, JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithSchurJacobiAndAutomaticOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           NO_SPARSE,
-                           kAutomaticOrdering,
-                           SCHUR_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithSchurJacobiAndUserOrdering) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           NO_SPARSE,
-                           kUserOrdering,
-                           SCHUR_JACOBI));
-}
-
-#ifndef CERES_NO_SUITESPARSE
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY,
-                           SUITE_SPARSE,
-                           kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY,
-                           SUITE_SPARSE,
-                           kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithAutomaticOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR,
-                           SUITE_SPARSE,
-                           kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithUserOrderingUsingSuiteSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR, SUITE_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithClusterJacobiAndAutomaticOrderingUsingSuiteSparse) {  // NOLINT
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           SUITE_SPARSE,
-                           kAutomaticOrdering,
-                           CLUSTER_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithClusterJacobiAndUserOrderingUsingSuiteSparse) {  // NOLINT
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           SUITE_SPARSE,
-                           kUserOrdering,
-                           CLUSTER_JACOBI));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithClusterTridiagonalAndAutomaticOrderingUsingSuiteSparse) {  // NOLINT
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           SUITE_SPARSE,
-                           kAutomaticOrdering,
-                           CLUSTER_TRIDIAGONAL));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedIterativeSchurWithClusterTridiagonalAndUserOrderingUsingSuiteSparse) {  // NOTLINT
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(ITERATIVE_SCHUR,
-                           SUITE_SPARSE,
-                           kUserOrdering,
-                           CLUSTER_TRIDIAGONAL));
-}
-#endif  // CERES_NO_SUITESPARSE
-
-#ifndef CERES_NO_CXSPARSE
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithAutomaticOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY,
-                           CX_SPARSE,
-                           kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithUserOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY, CX_SPARSE, kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithAutomaticOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR, CX_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithUserOrderingUsingCXSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR, CX_SPARSE, kUserOrdering));
-}
-#endif  // CERES_NO_CXSPARSE
-
-#ifdef CERES_USE_EIGEN_SPARSE
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithAutomaticOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY,
-                           EIGEN_SPARSE,
-                           kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseNormalCholeskyWithUserOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_NORMAL_CHOLESKY,
-                           EIGEN_SPARSE,
-                           kUserOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithAutomaticOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR, EIGEN_SPARSE, kAutomaticOrdering));
-}
-
-TEST_F(BundleAdjustmentTest,
-       MultiThreadedSparseSchurWithUserOrderingUsingEigenSparse) {
-  RunSolverForConfigAndExpectResidualsMatch(
-      ThreadedSolverConfig(SPARSE_SCHUR, EIGEN_SPARSE, kUserOrdering));
-}
-#endif  // CERES_USE_EIGEN_SPARSE
-#endif  // !CERES_NO_THREADS
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/generate_bundle_adjustment_tests.py b/internal/ceres/generate_bundle_adjustment_tests.py
index 97b47b0..dcac22a 100644
--- a/internal/ceres/generate_bundle_adjustment_tests.py
+++ b/internal/ceres/generate_bundle_adjustment_tests.py
@@ -74,7 +74,7 @@
   ThreadedSolverConfig='threads',
 )
 
-BUNDLE_ADJUSTMENT_TEST_TEMPLATE = (
+COPYRIGHT_HEADER = (
 """// Ceres Solver - A fast non-linear least squares minimizer
 // Copyright 2018 Google Inc. All rights reserved.
 // http://ceres-solver.org/
@@ -108,9 +108,11 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
-// This file is generated using generate_bundle_adjustment_tests.py.
+// This file is generated using generate_bundle_adjustment_tests.py.""")
+
+BUNDLE_ADJUSTMENT_TEST_TEMPLATE = (COPYRIGHT_HEADER + """
 
 #include "bundle_adjustment_test_util.h"
 %(preprocessor_conditions_begin)s
@@ -219,14 +221,28 @@
   # All done.
   print 'Generated', filename
 
+  return filename
+
 
 if __name__ == '__main__':
   # Iterate over all the possible configurations and generate the tests.
+  generated_files = []
   for linear_solver, sparse_backend, preconditioner in SOLVER_CONFIGS:
     for ordering in ORDERINGS:
       for thread_config in THREAD_CONFIGS:
-        generate_bundle_test(linear_solver,
-                             sparse_backend,
-                             preconditioner,
-                             ordering,
-                             thread_config)
+        generated_files.append(
+            generate_bundle_test(linear_solver,
+                                 sparse_backend,
+                                 preconditioner,
+                                 ordering,
+                                 thread_config))
+
+  # Generate the CMakeLists.txt as well.
+  with open('generated_bundle_adjustment_tests/CMakeLists.txt', 'w') as fd:
+    fd.write(COPYRIGHT_HEADER.replace('//', '#').replace('http:#', 'http://'))
+    fd.write('\n')
+    fd.write('\n')
+    for generated_file in generated_files:
+      fd.write('ceres_test(%s)\n' %
+               generated_file.split('/')[1].replace('_test.cc', ''))
+
diff --git a/internal/ceres/generated_bundle_adjustment_tests/CMakeLists.txt b/internal/ceres/generated_bundle_adjustment_tests/CMakeLists.txt
new file mode 100644
index 0000000..008fb8f
--- /dev/null
+++ b/internal/ceres/generated_bundle_adjustment_tests/CMakeLists.txt
@@ -0,0 +1,81 @@
+# Ceres Solver - A fast non-linear least squares minimizer
+# Copyright 2018 Google Inc. All rights reserved.
+# http://ceres-solver.org/
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+#   this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of Google Inc. nor the names of its contributors may be
+#   used to endorse or promote products derived from this software without
+#   specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# ========================================
+# THIS FILE IS AUTOGENERATED. DO NOT EDIT.
+# THIS FILE IS AUTOGENERATED. DO NOT EDIT.
+# THIS FILE IS AUTOGENERATED. DO NOT EDIT.
+# THIS FILE IS AUTOGENERATED. DO NOT EDIT.
+# ========================================
+#
+# This file is generated using generate_bundle_adjustment_tests.py.
+
+ceres_test(ba_denseschur_auto)
+ceres_test(ba_denseschur_auto_threads)
+ceres_test(ba_denseschur_user)
+ceres_test(ba_denseschur_user_threads)
+ceres_test(ba_iterschur_jacobi_auto)
+ceres_test(ba_iterschur_jacobi_auto_threads)
+ceres_test(ba_iterschur_jacobi_user)
+ceres_test(ba_iterschur_jacobi_user_threads)
+ceres_test(ba_iterschur_schurjacobi_auto)
+ceres_test(ba_iterschur_schurjacobi_auto_threads)
+ceres_test(ba_iterschur_schurjacobi_user)
+ceres_test(ba_iterschur_schurjacobi_user_threads)
+ceres_test(ba_iterschur_suitesparse_clustjacobi_auto)
+ceres_test(ba_iterschur_suitesparse_clustjacobi_auto_threads)
+ceres_test(ba_iterschur_suitesparse_clustjacobi_user)
+ceres_test(ba_iterschur_suitesparse_clustjacobi_user_threads)
+ceres_test(ba_iterschur_suitesparse_clusttri_auto)
+ceres_test(ba_iterschur_suitesparse_clusttri_auto_threads)
+ceres_test(ba_iterschur_suitesparse_clusttri_user)
+ceres_test(ba_iterschur_suitesparse_clusttri_user_threads)
+ceres_test(ba_sparsecholesky_suitesparse_auto)
+ceres_test(ba_sparsecholesky_suitesparse_auto_threads)
+ceres_test(ba_sparsecholesky_suitesparse_user)
+ceres_test(ba_sparsecholesky_suitesparse_user_threads)
+ceres_test(ba_sparsecholesky_eigensparse_auto)
+ceres_test(ba_sparsecholesky_eigensparse_auto_threads)
+ceres_test(ba_sparsecholesky_eigensparse_user)
+ceres_test(ba_sparsecholesky_eigensparse_user_threads)
+ceres_test(ba_sparsecholesky_cxsparse_auto)
+ceres_test(ba_sparsecholesky_cxsparse_auto_threads)
+ceres_test(ba_sparsecholesky_cxsparse_user)
+ceres_test(ba_sparsecholesky_cxsparse_user_threads)
+ceres_test(ba_sparseschur_suitesparse_auto)
+ceres_test(ba_sparseschur_suitesparse_auto_threads)
+ceres_test(ba_sparseschur_suitesparse_user)
+ceres_test(ba_sparseschur_suitesparse_user_threads)
+ceres_test(ba_sparseschur_eigensparse_auto)
+ceres_test(ba_sparseschur_eigensparse_auto_threads)
+ceres_test(ba_sparseschur_eigensparse_user)
+ceres_test(ba_sparseschur_eigensparse_user_threads)
+ceres_test(ba_sparseschur_cxsparse_auto)
+ceres_test(ba_sparseschur_cxsparse_auto_threads)
+ceres_test(ba_sparseschur_cxsparse_user)
+ceres_test(ba_sparseschur_cxsparse_user_threads)
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_test.cc
index 5a27ef9..6c815da 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_threads_test.cc
index 3573913..62032fe 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_test.cc
index e3555d6..52e85f2 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_threads_test.cc
index e7262dd..5b58564 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_denseschur_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_test.cc
index 5f4afe2..2e85333 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_threads_test.cc
index c44fb78..3bfd7ba 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_test.cc
index 46598a4..2a20911 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_threads_test.cc
index 15d462c..47bbaf5 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_jacobi_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_test.cc
index 15c2cdf..6f0dcea 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_threads_test.cc
index e68374d..987d034 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_test.cc
index aee896f..5f41d6c 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_threads_test.cc
index e211778..df14114 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_schurjacobi_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_test.cc
index e12bbbc..ff064c3 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_threads_test.cc
index 65ac9b9..ca6c275 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_test.cc
index f0d0a92..f425b51 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_threads_test.cc
index 9038b95..0d62b91 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clustjacobi_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_test.cc
index 9d0c8aa..a598cca 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_threads_test.cc
index f1d5377..d296e3b 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_test.cc
index add85e8..07776c1 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_threads_test.cc
index 4eb1bff..b428ad7 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_iterschur_suitesparse_clusttri_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_test.cc
index 10d176e..0684c65 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_threads_test.cc
index 2dabbbc..e810574 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_test.cc
index e518bff..262c913 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_threads_test.cc
index 870a5d7..9ad0f20 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_cxsparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_test.cc
index 6cf42cf..63713fd 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_threads_test.cc
index c697298..02e9c74 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_test.cc
index 378fc19..3717c44 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_threads_test.cc
index f7f8632..5f99a33 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_eigensparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_test.cc
index d4bde45..fa20b68 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_threads_test.cc
index 78f932a..6963483 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_test.cc
index b12c68b..ab8615f 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_threads_test.cc
index 43f87e8..4833dbd 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparsecholesky_suitesparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_test.cc
index 43dd17a..0318f95 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_threads_test.cc
index 3a36f2d..e8657bb 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_test.cc
index 28b4be5..40943b3 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_threads_test.cc
index 5f32a68..b95c13e 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_cxsparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_test.cc
index 7edb325..74b9fe0 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_threads_test.cc
index aae16b7..8f6279c 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_test.cc
index 62e264a..3643e3d 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_threads_test.cc
index ba37734..8ae2343 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_eigensparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_test.cc
index 4e68d87..739c927 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_threads_test.cc
index 53a269c..3935811 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_auto_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_test.cc
index 1369966..28f9fa1 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.
 
diff --git a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_threads_test.cc b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_threads_test.cc
index f293b60..1334ff7 100644
--- a/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_threads_test.cc
+++ b/internal/ceres/generated_bundle_adjustment_tests/ba_sparseschur_suitesparse_user_threads_test.cc
@@ -31,7 +31,7 @@
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
 // THIS FILE IS AUTOGENERATED. DO NOT EDIT.
-//=========================================
+// ========================================
 //
 // This file is generated using generate_bundle_adjustment_tests.py.