Fix a use after free bug in the tests.

The way the SystemTest fixture works is that it takes
a "FooProblem" object as a type, which contains a ceres::Problem
and a ceres::Solver::Options object.

The Options object also contains a linear_solver_ordering which
contains double* which refer to memory that is allocated when
a problem object is created.

So it is important that the lifetime of the ceres::Problem object
and the ceres::Solver::Options object be tied together. But we were
violating this by creating a FooProblem object on the stack, grabbing
its Options struct and passing it to the SystemTest fixture, which
would then create another instance of FooProblem, grab its Problem
object and copy the modified options struct into it.

In the case where a user provided ordering was being used,
this ordering would now be referring to memory allocated by the first
FooProblem object, which would cause Ceres's internal ApplyOrdering
function to fail.

The fix is ofcourse to Problem and Options object that are born
together.

Change-Id: I07c377a9d5fcabbb6c7ca8aa3460206ce045ffa9
diff --git a/internal/ceres/generate_bundle_adjustment_tests.py b/internal/ceres/generate_bundle_adjustment_tests.py
index b36cf66..89cf8c7 100644
--- a/internal/ceres/generate_bundle_adjustment_tests.py
+++ b/internal/ceres/generate_bundle_adjustment_tests.py
@@ -121,15 +121,17 @@
 
 TEST_F(BundleAdjustmentTest,
        %(test_class_name)s) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = %(num_threads)s;
-   options.linear_solver_type = %(linear_solver)s;
-   options.sparse_linear_algebra_library_type = %(sparse_backend)s;
-   options.preconditioner_type = %(preconditioner)s;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = %(num_threads)s;
+   options->linear_solver_type = %(linear_solver)s;
+   options->sparse_linear_algebra_library_type = %(sparse_backend)s;
+   options->preconditioner_type = %(preconditioner)s;
    if (%(ordering)s) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 2d3ea81..c6cbaa5 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        DenseSchur_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = DENSE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = DENSE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 311bceb..bbbcbb6 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        DenseSchur_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = DENSE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = DENSE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 930f5f0..48cd4c8 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        DenseSchur_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = DENSE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = DENSE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 cf8139a..ec070bf 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        DenseSchur_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = DENSE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = DENSE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 8c3b886..5f36b2e 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_Jacobi_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 4585201..8312db2 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_Jacobi_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 9b864e4..82f394a 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_Jacobi_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 6266bea..78f5524 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_Jacobi_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 bc40f5d..5407f3c 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SchurJacobi_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = SCHUR_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = SCHUR_JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 c55fa62..ed04d8f 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SchurJacobi_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = SCHUR_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = SCHUR_JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 cc7f334..4299738 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
@@ -42,15 +42,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SchurJacobi_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = SCHUR_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = SCHUR_JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 b8cd166..46a320a 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SchurJacobi_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = NO_SPARSE;
-   options.preconditioner_type = SCHUR_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = NO_SPARSE;
+   options->preconditioner_type = SCHUR_JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 cdb4fd0..b87d386 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterJacobi_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 15ed6b1..414a3e9 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterJacobi_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_JACOBI;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 dda9d62..b0da4af 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterJacobi_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 6ca9f7b..0078911 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterJacobi_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_JACOBI;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_JACOBI;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 6a40ef8..dc35fc8 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterTridiagonal_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_TRIDIAGONAL;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_TRIDIAGONAL;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 6bd66bc..b8b8613 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterTridiagonal_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_TRIDIAGONAL;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_TRIDIAGONAL;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 ae12ce9..bdea636 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterTridiagonal_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_TRIDIAGONAL;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_TRIDIAGONAL;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 727d908..e8b844a 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        IterativeSchur_SuiteSparse_ClusterTridiagonal_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = ITERATIVE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = CLUSTER_TRIDIAGONAL;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = ITERATIVE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = CLUSTER_TRIDIAGONAL;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 3d3b642..00c0757 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_CxSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 ae7f543..52a86c3 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_CxSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 9f3d752..9a4cdb5 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_CxSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 366169c..960630a 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_CxSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 700bb50..c4575df 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_EigenSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 e363297..1cda776 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_EigenSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 dd423f3..e9e42af 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_EigenSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 27dc821..a3aa368 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_EigenSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 7155bd9..f699981 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_SuiteSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 8991cca..7253075 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_SuiteSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 e4375c1..dae0ed6 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_SuiteSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 3c91c72..82bec88 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseNormalCholesky_SuiteSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 d9b10e4..a623cb9 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_CxSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 f7dbc45..8d13c66 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_CxSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 27a673d..73b0787 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_CxSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 9e5db38..9318a27 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_CxSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = CX_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = CX_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 bc8d66b..eb31fed 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_EigenSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 6910d87..d9c9b0b 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_EigenSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 d626481..0e34884 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_EigenSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 218c35f..bf7d5f4 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_EigenSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 67fff21..7e8853f 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_SuiteSparse_AutomaticOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 f0dccb7..823dcfe 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_SuiteSparse_AutomaticOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kAutomaticOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 eb67b49..a375c94 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
@@ -44,15 +44,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_SuiteSparse_UserOrdering) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 1;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 1;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
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 c13cc4f..9af1d56 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
@@ -45,15 +45,17 @@
 
 TEST_F(BundleAdjustmentTest,
        SparseSchur_SuiteSparse_UserOrdering_Threads) {  // NOLINT
-   Solver::Options options = *BundleAdjustmentProblem().mutable_solver_options();
-   options.num_threads = 4;
-   options.linear_solver_type = SPARSE_SCHUR;
-   options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-   options.preconditioner_type = IDENTITY;
+   BundleAdjustmentProblem bundle_adjustment_problem;
+   Solver::Options* options = bundle_adjustment_problem.mutable_solver_options();
+   options->num_threads = 4;
+   options->linear_solver_type = SPARSE_SCHUR;
+   options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+   options->preconditioner_type = IDENTITY;
    if (kUserOrdering) {
-    options.linear_solver_ordering.reset();
+    options->linear_solver_ordering.reset();
    }
-  RunSolverForConfigAndExpectResidualsMatch(options);
+   Problem* problem = bundle_adjustment_problem.mutable_problem();
+   RunSolverForConfigAndExpectResidualsMatch(*options, problem);
 }
 
 }  // namespace internal
diff --git a/internal/ceres/system_test.cc b/internal/ceres/system_test.cc
index 5fb520f..ca0f529 100644
--- a/internal/ceres/system_test.cc
+++ b/internal/ceres/system_test.cc
@@ -146,55 +146,69 @@
 typedef SystemTest<PowellsFunction> PowellTest;
 
 TEST_F(PowellTest, DenseQR) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = DENSE_QR;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = DENSE_QR;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 
 TEST_F(PowellTest, DenseNormalCholesky) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = DENSE_NORMAL_CHOLESKY;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = DENSE_NORMAL_CHOLESKY;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 
 TEST_F(PowellTest, DenseSchur) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = DENSE_SCHUR;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = DENSE_SCHUR;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 
 TEST_F(PowellTest, IterativeSchurWithJacobi) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = ITERATIVE_SCHUR;
-  options.sparse_linear_algebra_library_type = NO_SPARSE;
-  options.preconditioner_type = JACOBI;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = ITERATIVE_SCHUR;
+  options->sparse_linear_algebra_library_type = NO_SPARSE;
+  options->preconditioner_type = JACOBI;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 
 #ifndef CERES_NO_SUITESPARSE
 TEST_F(PowellTest, SparseNormalCholeskyUsingSuiteSparse) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-  options.sparse_linear_algebra_library_type = SUITE_SPARSE;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+  options->sparse_linear_algebra_library_type = SUITE_SPARSE;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 #endif  // CERES_NO_SUITESPARSE
 
 #ifndef CERES_NO_CXSPARSE
 TEST_F(PowellTest, SparseNormalCholeskyUsingCXSparse) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-  options.sparse_linear_algebra_library_type = CX_SPARSE;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+  options->sparse_linear_algebra_library_type = CX_SPARSE;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 #endif  // CERES_NO_CXSPARSE
 
 #ifdef CERES_USE_EIGEN_SPARSE
 TEST_F(PowellTest, SparseNormalCholeskyUsingEigenSparse) {
-  Solver::Options options = *PowellsFunction().mutable_solver_options();
-  options.linear_solver_type = SPARSE_NORMAL_CHOLESKY;
-  options.sparse_linear_algebra_library_type = EIGEN_SPARSE;
-  RunSolverForConfigAndExpectResidualsMatch(options);
+  PowellsFunction powells_function;
+  Solver::Options* options = powells_function.mutable_solver_options();
+  options->linear_solver_type = SPARSE_NORMAL_CHOLESKY;
+  options->sparse_linear_algebra_library_type = EIGEN_SPARSE;
+  RunSolverForConfigAndExpectResidualsMatch(*options,
+                                            powells_function.mutable_problem());
 }
 #endif  // CERES_USE_EIGEN_SPARSE
 
diff --git a/internal/ceres/test_util.h b/internal/ceres/test_util.h
index c4c17d5..e43eb35 100644
--- a/internal/ceres/test_util.h
+++ b/internal/ceres/test_util.h
@@ -78,7 +78,7 @@
 // It is assumed that the SystemTestProblem has an Solver::Options
 // struct that contains the reference Solver configuration.
 template <typename SystemTestProblem>
-class SystemTest : public::testing::Test {
+class SystemTest : public ::testing::Test {
  protected:
   virtual void SetUp() {
     SystemTestProblem system_test_problem;
@@ -88,15 +88,10 @@
         &expected_final_residuals_);
   }
 
-  void RunSolverForConfigAndExpectResidualsMatch(const Solver::Options& options) {
-    LOG(INFO) << "Running solver configuration: "
-              << ToString(options);
-    SystemTestProblem system_test_problem;
+  void RunSolverForConfigAndExpectResidualsMatch(const Solver::Options& options,
+                                                 Problem* problem) {
     std::vector<double> final_residuals;
-    SolveAndEvaluateFinalResiduals(
-        options,
-        system_test_problem.mutable_problem(),
-        &final_residuals);
+    SolveAndEvaluateFinalResiduals(options, problem, &final_residuals);
 
     // We compare solutions by comparing their residual vectors. We do
     // not compare parameter vectors because it is much more brittle
@@ -119,10 +114,10 @@
     Solve(options, problem, &summary);
     CHECK_NE(summary.termination_type, ceres::FAILURE);
     problem->Evaluate(Problem::EvaluateOptions(),
-                      NULL,
+                      nullptr,
                       final_residuals,
-                      NULL,
-                      NULL);
+                      nullptr,
+                      nullptr);
   }
 
   std::vector<double> expected_final_residuals_;