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.