Remove AutodiffCodegen

- Remove Codegen files
- Revert Jet and Rotation

Change-Id: I005c5f98f2b6dfa5c7fd88d998b6aa83e47dab60
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f11e579..7de7d37 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -165,10 +165,6 @@
 option(BUILD_BENCHMARKS "Build Ceres benchmarking suite" ON)
 option(BUILD_SHARED_LIBS "Build Ceres as a shared library." OFF)
 option(PROVIDE_UNINSTALL_TARGET "Add a custom target to ease removal of installed targets" ON)
-option(CODE_GENERATION "Build the code generation module." OFF)
-if(CODE_GENERATION)
-    message(WARNING "The code generation module is still under development. The functionality and API of the current implementation might change in the future.")
-endif(CODE_GENERATION)
 set(SANITIZERS "" CACHE STRING "Semicolon-separated list of sanitizers to use (e.g address, memory, thread)")
 include(EnableSanitizer)
 enable_sanitizer(${SANITIZERS})
@@ -670,13 +666,6 @@
 file(GLOB CERES_PUBLIC_INTERNAL_HDRS ${Ceres_SOURCE_DIR}/include/ceres/internal/*.h)
 install(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION include/ceres/internal)
 
-# Ceres codegen headers
-file(GLOB CERES_PUBLIC_CODEGEN_HDRS ${Ceres_SOURCE_DIR}/include/ceres/codegen/*.h)
-install(FILES ${CERES_PUBLIC_CODEGEN_HDRS} DESTINATION include/ceres/codegen)
-
-file(GLOB CERES_PUBLIC_CODEGEN_INTERNAL_HDRS ${Ceres_SOURCE_DIR}/include/ceres/codegen/internal/*.h)
-install(FILES ${CERES_PUBLIC_CODEGEN_INTERNAL_HDRS} DESTINATION include/ceres/codegen/internal)
-
 # Also setup installation of Ceres config.h configured with the current
 # build options into the installed headers directory.
 install(FILES ${Ceres_BINARY_DIR}/config/ceres/internal/config.h
diff --git a/include/ceres/codegen/codegen_cost_function.h b/include/ceres/codegen/codegen_cost_function.h
deleted file mode 100644
index 57df088..0000000
--- a/include/ceres/codegen/codegen_cost_function.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_COST_FUNCTION_H_
-#define CERES_PUBLIC_CODEGEN_COST_FUNCTION_H_
-
-#include "ceres/codegen/macros.h"
-#include "ceres/sized_cost_function.h"
-
-namespace ceres {
-
-// This is the interface for automatically generating cost functor derivative
-// code. The template parameters are identical to those of SizedCostFunction<>.
-// The behaviour of this class changes between code generation and problem
-// solving.
-//
-// During code generation (when CERES_CODEGEN is defined), this class doesn't do
-// anything. The templated operator() from your derived cost functor is used.
-//
-// After code generation (when CERES_CODEGEN is not defined), this class is a
-// SizedCostFunction. The required Evaluate() function was generated and must be
-// included into your cost functor.
-//
-// Usage Example:
-//
-//   #include "ceres/codegen/cost_function.h"
-//
-//   struct HelloWorldCostFunction : public ceres::CodegenCostFunction<1, 1> {
-//     // A default constructor is required, because the code generator has to
-//     // create an object of the cost function.
-//     HelloWorldCostFunction() = default;
-//     template <typename T>
-//     bool operator()(const T* x, T* residual) const {
-//       residual[0] = x[0] * x[0];
-//       return true;
-//     }
-//   #include "examples/helloworldcostfunction.h"
-//   };
-
-template <int kNumResiduals_, int... Ns>
-class CodegenCostFunction
-#ifdef CERES_CODEGEN
-// During code generation we can't derive from SizedCostFunction.
-// The variadic evaluation with Jets would try to call the empty Evaluate()
-// instead of the templated functor.
-#else
-    : public SizedCostFunction<kNumResiduals_, Ns...>
-#endif
-{
- public:
-  static constexpr int kNumResiduals = kNumResiduals_;
-  static_assert(kNumResiduals > 0,
-                "Cost functions must have at least one residual block.");
-  static_assert(kNumResiduals != DYNAMIC,
-                "Code generation for dynamic residuals is not yet supported.");
-  static_assert(internal::StaticParameterDims<Ns...>::kIsValid,
-                "Invalid parameter block dimension detected. Each parameter "
-                "block dimension must be bigger than zero.");
-  using ParameterDims = internal::StaticParameterDims<Ns...>;
-};
-
-}  // namespace ceres
-#endif  // CERES_PUBLIC_CODEGEN_COST_FUNCTION_H_
diff --git a/include/ceres/codegen/generate_code_for_functor.h b/include/ceres/codegen/generate_code_for_functor.h
deleted file mode 100644
index d7ed09e..0000000
--- a/include/ceres/codegen/generate_code_for_functor.h
+++ /dev/null
@@ -1,221 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_AUTODIFF_H_
-#define CERES_PUBLIC_CODEGEN_AUTODIFF_H_
-
-#include "ceres/codegen/internal/code_generator.h"
-#include "ceres/codegen/internal/expression_graph.h"
-#include "ceres/codegen/internal/expression_ref.h"
-#include "ceres/internal/autodiff.h"
-#include "ceres/jet.h"
-
-namespace ceres {
-
-struct AutoDiffCodeGenOptions {};
-
-// TODO(darius): Documentation
-template <typename DerivedCostFunctor>
-std::vector<std::string> GenerateCodeForFunctor(
-    const AutoDiffCodeGenOptions& options) {
-  // Define some types and shortcuts to make the code below more readable.
-  using ParameterDims = typename DerivedCostFunctor::ParameterDims;
-  using Parameters = typename ParameterDims::Parameters;
-  // Instead of using scalar Jets, we use Jets of ExpressionRef which record
-  // their own operations during evaluation.
-  using ExpressionRef = internal::ExpressionRef;
-  using ExprJet = Jet<ExpressionRef, ParameterDims::kNumParameters>;
-  constexpr int kNumResiduals = DerivedCostFunctor::kNumResiduals;
-  constexpr int kNumParameters = ParameterDims::kNumParameters;
-  constexpr int kNumParameterBlocks = ParameterDims::kNumParameterBlocks;
-
-  // Create the cost functor using the default constructor.
-  // Code is generated for the CostFunctor and not an instantiation of it. This
-  // is different to AutoDiffCostFunction, which computes the derivatives for
-  // a specific object.
-  static_assert(std::is_default_constructible<DerivedCostFunctor>::value,
-                "Cost functors used in code generation must have a default "
-                "constructor. If you are using local variables, make sure to "
-                "wrap them into the CERES_LOCAL_VARIABLE macro.");
-  DerivedCostFunctor functor;
-
-  // During recording phase all operations on ExpressionRefs are recorded to an
-  // internal data structure, the ExpressionGraph. This ExpressionGraph is then
-  // optimized and converted back into C++ code.
-  internal::StartRecordingExpressions();
-
-  // The Jet arrays are defined after StartRecordingExpressions, because Jets
-  // are zero-initialized in the default constructor. This already creates
-  // COMPILE_TIME_CONSTANT expressions.
-  std::array<ExprJet, kNumParameters> all_parameters;
-  std::array<ExprJet, kNumResiduals> residuals;
-  std::array<ExprJet*, kNumParameterBlocks> unpacked_parameters =
-      ParameterDims::GetUnpackedParameters(all_parameters.data());
-
-  // Create input expressions that convert from the doubles passed from Ceres
-  // into codegen Expressions. These inputs are assigned to the scalar part "a"
-  // of the corresponding Jets.
-  //
-  // Example code generated by these expressions:
-  //   v_0 = parameters[0][0];
-  //   v_1 = parameters[0][1];
-  //   ...
-  for (int i = 0; i < kNumParameterBlocks; ++i) {
-    for (int j = 0; j < ParameterDims::GetDim(i); ++j) {
-      ExprJet& parameter = unpacked_parameters[i][j];
-      parameter.a = internal::MakeInputAssignment<ExpressionRef>(
-          0.0,
-          ("parameters[" + std::to_string(i) + "][" + std::to_string(j) + "]")
-              .c_str());
-    }
-  }
-
-  // During the array initialization above, the derivative part of the Jets is
-  // set to zero. Here, we set the correct element to 1.
-  for (int i = 0; i < kNumParameters; ++i) {
-    all_parameters[i].v(i) = ExpressionRef(1);
-  }
-
-  // Run the cost functor with Jets of ExpressionRefs.
-  // Since we are still in recording mode, all operations of the cost functor
-  // will be added to the graph.
-  internal::VariadicEvaluate<ParameterDims>(
-      functor, unpacked_parameters.data(), residuals.data());
-
-  // At this point the Jets in 'residuals' contain references to the output
-  // expressions. Here we add new expressions that assign the generated
-  // temporaries to the actual residual array.
-  //
-  // Example code generated by these expressions:
-  //    residuals[0] = v_200;
-  //    residuals[1] = v_201;
-  //    ...
-  for (int i = 0; i < kNumResiduals; ++i) {
-    auto& J = residuals[i];
-    // Note: MakeOutput automatically adds the expression to the active graph.
-    internal::MakeOutput(J.a, "residuals[" + std::to_string(i) + "]");
-  }
-
-  // Example code generated by these expressions:
-  //    jacobians[0][0] = v_351;
-  //    jacobians[0][1] = v_352;
-  //    ...
-  for (int i = 0, total_param_id = 0; i < kNumParameterBlocks;
-       total_param_id += ParameterDims::GetDim(i), ++i) {
-    for (int r = 0; r < kNumResiduals; ++r) {
-      for (int j = 0; j < ParameterDims::GetDim(i); ++j) {
-        internal::MakeOutput(
-            (residuals[r].v[total_param_id + j]),
-            "jacobians[" + std::to_string(i) + "][" +
-                std::to_string(r * ParameterDims::GetDim(i) + j) + "]");
-      }
-    }
-  }
-
-  // Stop recording and return the current active graph. Performing operations
-  // of ExpressionRef after this line will result in an error.
-  auto residual_and_jacobian_graph = internal::StopRecordingExpressions();
-
-  // TODO(darius): Once the optimizer is in place, call it from
-  // here to optimize the code before generating.
-
-  // We have the optimized code of the cost functor stored in the
-  // ExpressionGraphs. Now we generate C++ code for it and place it line-by-line
-  // in this vector of strings.
-  std::vector<std::string> output;
-
-  output.emplace_back("// This file is generated with ceres::AutoDiffCodeGen.");
-  output.emplace_back("// http://ceres-solver.org/");
-  output.emplace_back("");
-
-  {
-    // Generate C++ code for the EvaluateResidualAndJacobian function and append
-    // it to the output.
-    internal::CodeGenerator::Options generator_options;
-    generator_options.function_name =
-        "void EvaluateResidualAndJacobian(double const* const* parameters, "
-        "double* "
-        "residuals, double** jacobians) const";
-    internal::CodeGenerator gen(residual_and_jacobian_graph, generator_options);
-    std::vector<std::string> code = gen.Generate();
-    output.insert(output.end(), code.begin(), code.end());
-  }
-
-  output.emplace_back("");
-
-  // Generate a generic combined function, which calls EvaluateResidual and
-  // EvaluateResidualAndJacobian. This combined function is compatible to
-  // CostFunction::Evaluate. Therefore the generated code can be directly used
-  // in SizedCostFunctions.
-  output.emplace_back("bool Evaluate(double const* const* parameters,");
-  output.emplace_back("              double* residuals,");
-  output.emplace_back("              double** jacobians) const {");
-
-  output.emplace_back("  if (!jacobians) {");
-  output.emplace_back("    // Use the input cost functor");
-  output.emplace_back("    return (*this)(");
-  for (int i = 0; i < kNumParameterBlocks; ++i) {
-    output.emplace_back("      parameters[" + std::to_string(i) + "],");
-  }
-  output.emplace_back("      residuals");
-  output.emplace_back("    );");
-  output.emplace_back("  }");
-
-  // Create a tmp array of all jacobians and use it for evaluation if the input
-  // jacobian is null. The generated code for a <2,3,1,2> cost functor is:
-  //   double jacobians_data[6];
-  //   double* jacobians_ptrs[] = {
-  //       jacobians[0] ? jacobians[0] : jacobians_data + 0,
-  //       jacobians[1] ? jacobians[1] : jacobians_data + 6,
-  //       jacobians[2] ? jacobians[2] : jacobians_data + 8,
-  //   };
-  output.emplace_back("  double jacobians_data[" +
-                      std::to_string(kNumParameters * kNumResiduals) + "];");
-  output.emplace_back("  double* jacobians_ptrs[] = {");
-  for (int i = 0, total_param_id = 0; i < kNumParameterBlocks;
-       total_param_id += ParameterDims::GetDim(i), ++i) {
-    output.emplace_back("    jacobians[" + std::to_string(i) +
-                        "] ? jacobians[" + std::to_string(i) +
-                        "] : jacobians_data + " +
-                        std::to_string(kNumResiduals * total_param_id) + ",");
-  }
-  output.emplace_back("  };");
-  output.emplace_back(
-      "  EvaluateResidualAndJacobian(parameters, residuals, "
-      "jacobians_ptrs);");
-
-  output.emplace_back("  return true;");
-  output.emplace_back("}");
-
-  return output;
-}
-
-}  // namespace ceres
-#endif  // CERES_PUBLIC_CODEGEN_AUTODIFF_H_
diff --git a/include/ceres/codegen/internal/code_generator.h b/include/ceres/codegen/internal/code_generator.h
deleted file mode 100644
index 2b98146..0000000
--- a/include/ceres/codegen/internal/code_generator.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
-
-#include "ceres/codegen/internal/expression.h"
-#include "ceres/codegen/internal/expression_graph.h"
-
-#include <string>
-#include <vector>
-
-namespace ceres {
-namespace internal {
-
-// This class is used to convert an expression graph into a string. The typical
-// pipeline is:
-//
-// 1. Record ExpressionGraph
-// 2. Optimize ExpressionGraph
-// 3. Generate C++ code (this class here)
-//
-// The CodeGenerator operates in the following way:
-//
-// 1. Print Header
-//    - The header string is defined in the options.
-//    - This is usually the function name including the parameter list.
-//
-// 2. Print Declarations
-//    - Declare all used variables
-//    - Example:
-//        double v_0;
-//        double v_1;
-//        bool v_3;
-//        ...
-//
-// 3. Print Code
-//    - Convert each expression line by line to a string
-//    - Example:
-//        v_2 = v_0 + v_1
-//        if (v_5) {
-//          v_2 = v_0;
-//          ....
-//
-class CodeGenerator {
- public:
-  struct Options {
-    // Name of the function.
-    // Example:
-    //   bool Evaluate(const double* x, double* res)
-    std::string function_name = "";
-
-    // Number of spaces added for each level of indentation.
-    int indentation_spaces_per_level = 2;
-
-    // The prefix added to each variable name.
-    std::string variable_prefix = "v_";
-  };
-
-  CodeGenerator(const ExpressionGraph& graph, const Options& options);
-
-  // Generate the C++ code in the steps (1)-(3) described above.
-  // The result is a vector of strings, where each element is exactly one line
-  // of code. The order is important and must not be changed.
-  std::vector<std::string> Generate();
-
- private:
-  // Converts a single expression given by id to a string.
-  // The format depends on the ExpressionType.
-  // See ExpressionType in expression.h for more detailed how the different
-  // lines will look like.
-  std::string ExpressionToString(ExpressionId id);
-
-  // Helper function to get the name of an expression.
-  // If the expression does not have a valid name an error is generated.
-  std::string VariableForExpressionId(ExpressionId id);
-
-  // Adds one level of indentation. Called when an IF expression is encountered.
-  void PushIndentation();
-
-  // Removes one level of indentation. Currently only used by ENDIF.
-  void PopIndentation();
-
-  const ExpressionGraph& graph_;
-  const Options options_;
-  std::string indentation_ = "";
-  static constexpr int kFloatingPointPrecision = 25;
-};
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_CODE_GENERATOR_H_
diff --git a/include/ceres/codegen/internal/eliminate_nops.h b/include/ceres/codegen/internal/eliminate_nops.h
deleted file mode 100644
index 864aa0c..0000000
--- a/include/ceres/codegen/internal/eliminate_nops.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2020 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_ELIMINATE_NOPS_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_ELIMINATE_NOPS_H_
-
-#include "ceres/codegen/internal/expression_graph.h"
-#include "ceres/codegen/internal/optimization_pass_summary.h"
-
-namespace ceres {
-namespace internal {
-
-// [OptimizationPass] NOP Cleanup
-//
-// Short Description:
-//   Removes all expression with type==ExpressionType::NOP.
-//
-// Description:
-//   Removing an expression not at the end requires reindexing of all later
-//   expressions. Therefore, other optimization passes replace expression with
-//   NOP instead of removing them. This optimization pass removes all NOPs back
-//   to front.
-//   The returned value is equal to the number of removed NOPs.
-//
-// Example:
-//   v_0 = 1;
-//   // NOP
-//   v_2 = 2;
-//   v_3 = v_0 + v_2
-// Transforms to:
-//   v_0 = 1;
-//   v_1 = 2;
-//   v_2 = v_0 + v_1;
-
-OptimizationPassSummary EliminateNops(ExpressionGraph* graph);
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_ELIMINATE_NOPS_H_
diff --git a/include/ceres/codegen/internal/expression.h b/include/ceres/codegen/internal/expression.h
deleted file mode 100644
index 5e1ff2c..0000000
--- a/include/ceres/codegen/internal/expression.h
+++ /dev/null
@@ -1,405 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-// During code generation, your cost functor is converted into a list of
-// expressions stored in an expression graph. For each operator (+,-,=,...),
-// function call (sin,cos,...), and special keyword (if,else,...) the
-// appropriate ExpressionType is selected. On a high level all ExpressionTypes
-// are grouped into two different classes: Arithmetic expressions and control
-// expressions.
-//
-// Part 1: Arithmetic Expressions
-//
-// Arithmetic expression are the most basic and common types. They are all of
-// the following form:
-//
-// <lhs> = <rhs>
-//
-// <lhs> is the variable name on the left hand side of the assignment. <rhs> can
-// be different depending on the ExpressionType. It must evaluate to a single
-// scalar value though. Here are a few examples of arithmetic expressions (the
-// ExpressionType is given on the right):
-//
-// v_0 = 3.1415;        // COMPILE_TIME_CONSTANT
-// v_1 = v_0;           // ASSIGNMENT
-// v_2 = v_0 + v_1;     // PLUS
-// v_3 = v_2 / v_0;     // DIVISION
-// v_4 = sin(v_3);      // FUNCTION_CALL
-// v_5 = v_4 < v_3;     // BINARY_COMPARISON
-//
-// As you can see, the right hand side of each expression contains exactly one
-// operator/value/function call. If you write long expressions like
-//
-// T c = a + b - T(3) * a;
-//
-// it will broken up into the individual expressions like so:
-//
-// v_0 = a + b;
-// v_1 = 3;
-// v_2 = v_1 * a;
-// c   = v_0 - v_2;
-//
-// All arithmetic expressions are generated by operator and function
-// overloading. These overloads are defined in expression_ref.h.
-//
-//
-//
-// Part 2: Control Expressions
-//
-// Control expressions include special instructions that handle the control flow
-// of a program. So far, only if/else is supported, but while/for might come in
-// the future.
-//
-// Generating code for conditional jumps (if/else) is more complicated than
-// for arithmetic expressions. Let's look at a small example to see the
-// problems. After that we explain how these problems are solved in Ceres.
-//
-// 1    T a = parameters[0][0];
-// 2    T b = 1.0;
-// 3    if (a < b) {
-// 4      b = 3.0;
-// 5    } else {
-// 6      b = 4.0;
-// 7    }
-// 8    b += 1.0;
-// 9    residuals[0] = b;
-//
-// Problem 1.
-// We need to generate code for both branches. In C++ there is no way to execute
-// both branches of an if, but we need to execute them to generate the code.
-//
-// Problem 2.
-// The comparison a < b in line 3 is not convertible to bool. Since the value of
-// a is not known during code generation, the expression a < b can not be
-// evaluated. In fact, a < b will return an expression of type
-// BINARY_COMPARISON.
-//
-// Problem 3.
-// There is no way to record that an if was executed. "if" is a special operator
-// which cannot be overloaded. Therefore we can't generate code that contains
-// "if.
-//
-// Problem 4.
-// We have no information about "blocks" or "scopes" during code generation.
-// Even if we could overload the if-operator, there is now way to capture which
-// expression was executed in which branches of the if. For example, we generate
-// code for the else branch. How can we know that the else branch is finished?
-// Is line 8 inside the else-block or already outside?
-//
-// Solution.
-// Instead of using the keywords if/else we insert the macros
-// CERES_IF, CERES_ELSE and CERES_ENDIF. These macros just map to a function,
-// which inserts an expression into the graph. Here is how the example from
-// above looks like with the expanded macros:
-//
-// 1    T a = parameters[0][0];
-// 2    T b = 1.0;
-// 3    CreateIf(a < b); {
-// 4      b = 3.0;
-// 5    } CreateElse(); {
-// 6      b = 4.0;
-// 7    } CreateEndif();
-// 8    b += 1.0;
-// 9    residuals[0] = b;
-//
-// Problem 1 solved.
-// There are no branches during code generation, therefore both blocks are
-// evaluated.
-//
-// Problem 2 solved.
-// The function CreateIf(_) does not take a bool as argument, but an
-// ComparisonExpression. Later during code generation an actual "if" is created
-// with the condition as argument.
-//
-// Problem 3 solved.
-// We replaced "if" by a function call so we can record it now.
-//
-// Problem 4 solved.
-// Expressions are added into the graph in the correct order. That means, after
-// seeing a CreateIf() we know that all following expressions until CreateElse()
-// belong to the true-branch. Similar, all expression from CreateElse() to
-// CreateEndif() belong to the false-branch. This also works recursively with
-// nested ifs.
-//
-// If you want to use the AutoDiff code generation for your cost functors, you
-// have to replace all if/else by the CERES_IF, CERES_ELSE and CERES_ENDIF
-// macros. The example from above looks like this:
-//
-// 1    T a = parameters[0][0];
-// 2    T b = 1.0;
-// 3    CERES_IF (a < b) {
-// 4      b = 3.0;
-// 5    } CERES_ELSE {
-// 6      b = 4.0;
-// 7    } CERES_ENDIF;
-// 8    b += 1.0;
-// 9    residuals[0] = b;
-//
-// These macros don't have a negative impact on performance, because they only
-// expand to the CreateIf/.. functions in code generation mode. Otherwise they
-// expand to the if/else keywords. See expression_ref.h for the exact
-// definition.
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_H_
-
-#include <string>
-#include <vector>
-
-namespace ceres {
-namespace internal {
-
-using ExpressionId = int;
-static constexpr ExpressionId kInvalidExpressionId = -1;
-
-enum class ExpressionType {
-  // v_0 = 3.1415;
-  COMPILE_TIME_CONSTANT,
-
-  // Assignment from a user-variable to a generated variable that can be used by
-  // other expressions. This is used for local variables of cost functors and
-  // parameters of a functions.
-  // v_0 = _observed_point_x;
-  // v_0 = parameters[0][0];
-  INPUT_ASSIGNMENT,
-
-  // Assignment from a generated variable to a user-variable. Used to store the
-  // output of a generated cost functor.
-  // residual[0] = v_51;
-  OUTPUT_ASSIGNMENT,
-
-  // Trivial assignment
-  // v_3 = v_1
-  ASSIGNMENT,
-
-  // Binary Arithmetic Operations
-  // v_2 = v_0 + v_1
-  // The operator is stored in Expression::name_.
-  BINARY_ARITHMETIC,
-
-  // Unary Arithmetic Operation
-  // v_1 = -(v_0);
-  // v_2 = +(v_1);
-  // The operator is stored in Expression::name_.
-  UNARY_ARITHMETIC,
-
-  // Binary Comparison. (<,>,&&,...)
-  // This is the only expressions which returns a 'bool'.
-  // v_2 = v_0 < v_1
-  // The operator is stored in Expression::name_.
-  BINARY_COMPARISON,
-
-  // The !-operator on logical expression.
-  LOGICAL_NEGATION,
-
-  // General Function Call.
-  // v_5 = f(v_0,v_1,...)
-  FUNCTION_CALL,
-
-  // Conditional control expressions if/else/endif.
-  // These are special expressions, because they don't define a new variable.
-  IF,
-  ELSE,
-  ENDIF,
-
-  // A single comment line. Even though comments are 'unused' expression they
-  // will not be optimized away.
-  COMMENT,
-
-  // No Operation. A placeholder for an 'empty' expressions which will be
-  // optimized out during code generation.
-  NOP
-};
-
-enum class ExpressionReturnType {
-  // The expression returns a scalar value (float or double). Used for most
-  // arithmetic operations and function calls.
-  SCALAR,
-  // The expression returns a boolean value. Used for logical expressions
-  //   v_3 = v_1 < v_2
-  // and functions returning a bool
-  //   v_3 = isfinite(v_1);
-  BOOLEAN,
-  // The expressions doesn't return a value. Used for the control
-  // expressions
-  // and NOP.
-  VOID,
-};
-
-std::string ExpressionReturnTypeToString(ExpressionReturnType type);
-
-// This class contains all data that is required to generate one line of code.
-// Each line has the following form:
-//
-// lhs = rhs;
-//
-// The left hand side is the variable name given by its own id. The right hand
-// side depends on the ExpressionType. For example, a COMPILE_TIME_CONSTANT
-// expressions with id 4 generates the following line:
-// v_4 = 3.1415;
-//
-// Objects of this class are created indirectly using the static CreateXX
-// methods. During creation, the Expression objects are added to the
-// ExpressionGraph (see expression_graph.h).
-class Expression {
- public:
-  // Creates a NOP expression.
-  Expression() = default;
-
-  Expression(ExpressionType type,
-             ExpressionReturnType return_type = ExpressionReturnType::VOID,
-             ExpressionId lhs_id = kInvalidExpressionId,
-             const std::vector<ExpressionId>& arguments = {},
-             const std::string& name = "",
-             double value = 0);
-
-  // Helper 'constructors' that create an Expression with the correct type. You
-  // can also use the actual constructor from above, but using the create
-  // functions is less prone to errors.
-  static Expression CreateCompileTimeConstant(double v);
-
-  static Expression CreateInputAssignment(const std::string& name);
-  static Expression CreateOutputAssignment(ExpressionId v,
-                                           const std::string& name);
-  static Expression CreateAssignment(ExpressionId dst, ExpressionId src);
-  static Expression CreateBinaryArithmetic(const std::string& op,
-                                           ExpressionId l,
-                                           ExpressionId r);
-  static Expression CreateUnaryArithmetic(const std::string& op,
-                                          ExpressionId v);
-  static Expression CreateBinaryCompare(const std::string& name,
-                                        ExpressionId l,
-                                        ExpressionId r);
-  static Expression CreateLogicalNegation(ExpressionId v);
-  static Expression CreateScalarFunctionCall(
-      const std::string& name, const std::vector<ExpressionId>& params);
-  static Expression CreateLogicalFunctionCall(
-      const std::string& name, const std::vector<ExpressionId>& params);
-  static Expression CreateIf(ExpressionId condition);
-  static Expression CreateElse();
-  static Expression CreateEndIf();
-  static Expression CreateComment(const std::string& comment);
-
-  // Returns true if this is an arithmetic expression.
-  // Arithmetic expressions must have a valid left hand side.
-  bool IsArithmeticExpression() const;
-
-  // Returns true if this is a control expression.
-  bool IsControlExpression() const;
-
-  // If this expression is the compile time constant with the given value.
-  // Used during optimization to collapse zero/one arithmetic operations.
-  // b = a + 0;      ->    b = a;
-  bool IsCompileTimeConstantAndEqualTo(double constant) const;
-
-  // Checks if "other" is identical to "this" so that one of the epxressions can
-  // be replaced by a trivial assignment. Used during common subexpression
-  // elimination.
-  bool IsReplaceableBy(const Expression& other) const;
-
-  // Replace this expression by 'other'.
-  // The current id will be not replaced. That means other experssions
-  // referencing this one stay valid.
-  void Replace(const Expression& other);
-
-  // If this expression has 'other' as an argument.
-  bool DirectlyDependsOn(ExpressionId other) const;
-
-  // Converts this expression into a NOP
-  void MakeNop();
-
-  // Returns true if this expression has a valid lhs.
-  bool HasValidLhs() const { return lhs_id_ != kInvalidExpressionId; }
-
-  // Compares all members with the == operator. If this function succeeds,
-  // IsSemanticallyEquivalentTo will also return true.
-  bool operator==(const Expression& other) const;
-  bool operator!=(const Expression& other) const { return !(*this == other); }
-
-  // Semantically equivalent expressions are similar in a way, that the type(),
-  // value(), name(), number of arguments is identical. The lhs_id() and the
-  // argument_ids can differ. For example, the following groups of expressions
-  // are semantically equivalent:
-  //
-  // v_0 = v_1 + v_2;
-  // v_0 = v_1 + v_3;
-  // v_1 = v_1 + v_2;
-  //
-  // v_0 = sin(v_1);
-  // v_3 = sin(v_2);
-  bool IsSemanticallyEquivalentTo(const Expression& other) const;
-
-  ExpressionType type() const { return type_; }
-  ExpressionReturnType return_type() const { return return_type_; }
-  ExpressionId lhs_id() const { return lhs_id_; }
-  double value() const { return value_; }
-  const std::string& name() const { return name_; }
-  const std::vector<ExpressionId>& arguments() const { return arguments_; }
-
-  void set_lhs_id(ExpressionId new_lhs_id) { lhs_id_ = new_lhs_id; }
-  std::vector<ExpressionId>* mutable_arguments() { return &arguments_; }
-
- private:
-  ExpressionType type_ = ExpressionType::NOP;
-  ExpressionReturnType return_type_ = ExpressionReturnType::VOID;
-
-  // If lhs_id_ >= 0, then this expression is assigned to v_<lhs_id>.
-  // For example:
-  //    v_1 = v_0 + v_0     (Type = PLUS)
-  //    v_3 = sin(v_1)      (Type = FUNCTION_CALL)
-  //      ^
-  //   lhs_id_
-  //
-  // If lhs_id_ == kInvalidExpressionId, then the expression type is not
-  // arithmetic. Currently, only the following types have lhs_id = invalid:
-  // IF,ELSE,ENDIF,NOP
-  ExpressionId lhs_id_ = kInvalidExpressionId;
-
-  // Expressions have different number of arguments. For example a binary "+"
-  // has 2 parameters and a function call to "sin" has 1 parameter. Here, a
-  // reference to these paratmers is stored. Note: The order matters!
-  std::vector<ExpressionId> arguments_;
-
-  // Depending on the type this name is one of the following:
-  //  (type == FUNCTION_CALL) -> the function name
-  //  (type == PARAMETER)     -> the parameter name
-  //  (type == OUTPUT_ASSIGN) -> the output variable name
-  //  (type == BINARY_COMPARE)-> the comparison symbol "<","&&",...
-  //  else                    -> unused
-  std::string name_;
-
-  // Only valid if type == COMPILE_TIME_CONSTANT
-  double value_ = 0;
-};
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_H_
diff --git a/include/ceres/codegen/internal/expression_graph.h b/include/ceres/codegen/internal/expression_graph.h
deleted file mode 100644
index 7c5df80..0000000
--- a/include/ceres/codegen/internal/expression_graph.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_GRAPH_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_GRAPH_H_
-
-#include <vector>
-
-#include "expression.h"
-
-namespace ceres {
-namespace internal {
-
-// A directed, acyclic, unconnected graph containing all expressions of a
-// program.
-//
-// The expression graph is stored linear in the expressions_ array. The order is
-// identical to the execution order. Each expression can have multiple children
-// and multiple parents.
-// A is child of B     <=>  B has A as a parameter    <=> B.DirectlyDependsOn(A)
-// A is parent of B    <=>  A has B as a parameter    <=> A.DirectlyDependsOn(B)
-class ExpressionGraph {
- public:
-  // Checks if A depends on B.
-  // -> B is a descendant of A
-  bool DependsOn(ExpressionId A, ExpressionId B) const;
-
-  bool operator==(const ExpressionGraph& other) const;
-  bool operator!=(const ExpressionGraph& other) const {
-    return !(*this == other);
-  }
-
-  Expression& ExpressionForId(ExpressionId id) { return expressions_[id]; }
-  const Expression& ExpressionForId(ExpressionId id) const {
-    return expressions_[id];
-  }
-
-  int Size() const { return expressions_.size(); }
-
-  // Erases the expression at "location". All expression after "location" are
-  // moved by one element to the front. References to moved expressions are
-  // updated. Removing an expression that is still referenced somewhere is
-  // undefined behaviour.
-  void Erase(ExpressionId location);
-
-  // Insert a new expression at "location" into the graph. All expression
-  // after "location" are moved by one element to the back. References to
-  // moved expressions are updated.
-  void Insert(ExpressionId location, const Expression& expression);
-
-  // Adds an Expression to the end of the expression list and creates a new
-  // variable for the result. The id of the result variable is returned so it
-  // can be used for further operations.
-  ExpressionId InsertBack(const Expression& expression);
-
-  // Finds the closing ENDIF expression for a given IF expression. Calling this
-  // method is only valid on IF expressions. If no suitable ENDIF is found,
-  // kInvalidExpressionId is returned. Example:
-  // <id> <expr>    FindMatchingEndif(id)
-  //  0  IF         7
-  //  1    IF       3
-  //  2    ELSE     -
-  //  3    ENDIF    -
-  //  4  ELSE       -
-  //  5    IF       6
-  //  6    ENDIF    -
-  //  7  ENDIF      -
-  ExpressionId FindMatchingEndif(ExpressionId id) const;
-
-  // Similar to FindMatchingEndif, but returns the matching ELSE expression. If
-  // no suitable ELSE is found, kInvalidExpressionId is returned.
-  // FindMatchingElse does not throw an error is this case, because IF without
-  // ELSE is allowed.
-  // <id> <expr>    FindMatchingEndif(id)
-  //  0  IF         4
-  //  1    IF       2
-  //  2    ELSE     -
-  //  3    ENDIF    -
-  //  4  ELSE       -
-  //  5    IF       kInvalidEpressionId
-  //  6    ENDIF    -
-  //  7  ENDIF      -
-  ExpressionId FindMatchingElse(ExpressionId id) const;
-
- private:
-  // All Expressions are referenced by an ExpressionId. The ExpressionId is
-  // the index into this array. Each expression has a list of ExpressionId as
-  // arguments. These references form the graph.
-  std::vector<Expression> expressions_;
-};
-
-// After calling this method, all operations on 'ExpressionRef' objects will
-// be recorded into an ExpressionGraph. You can obtain this graph by calling
-// StopRecordingExpressions.
-//
-// Performing expression operations before calling StartRecordingExpressions
-// or calling StartRecodring. twice is an error.
-void StartRecordingExpressions();
-
-// Stops recording and returns all expressions that have been executed since
-// the call to StartRecordingExpressions. The internal ExpressionGraph will be
-// invalidated and a second consecutive call to this method results in an
-// error.
-ExpressionGraph StopRecordingExpressions();
-
-// Returns a pointer to the active expression tree.
-// Normal users should not use this functions.
-ExpressionGraph* GetCurrentExpressionGraph();
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_EXPRESSION_GRAPH_H_
diff --git a/include/ceres/codegen/internal/expression_ref.h b/include/ceres/codegen/internal/expression_ref.h
deleted file mode 100644
index 5499930..0000000
--- a/include/ceres/codegen/internal/expression_ref.h
+++ /dev/null
@@ -1,248 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-// TODO: Documentation
-#ifndef CERES_PUBLIC_EXPRESSION_REF_H_
-#define CERES_PUBLIC_EXPRESSION_REF_H_
-
-#include <string>
-
-#include "ceres/codegen/internal/expression.h"
-#include "ceres/codegen/internal/types.h"
-
-namespace ceres {
-namespace internal {
-
-// This class represents a scalar value that creates new expressions during
-// evaluation. ExpressionRef can be used as template parameter for cost functors
-// and Jets.
-//
-// ExpressionRef should be passed by value.
-struct ExpressionRef {
-  ExpressionRef() : ExpressionRef(0.0) {}
-
-  // Create a compile time constant expression directly from a double value.
-  // This is important so that we can write T(3.14) in our code and
-  // it's automatically converted to the correct expression.
-  //
-  // This constructor is implicit, because the line
-  //    T a(0);
-  // must work for T = Jet<ExpressionRef>.
-  ExpressionRef(double compile_time_constant);
-
-  // Adds the expression to the active graph and initializes this ExpressionRef
-  // accordingly.
-  ExpressionRef(const Expression& expression);
-
-  // By adding this deleted constructor we can detect invalid usage of
-  // ExpressionRef. ExpressionRef must only be created from constexpr doubles.
-  //
-  // If you get a compile error here, you have probably written something like:
-  //   T x = local_variable_;
-  // Change this into:
-  //   T x = CERES_LOCAL_VARIABLE(local_variable_);
-  ExpressionRef(double&) = delete;
-
-  // Copy construction/assignment creates an ASSIGNMENT expression from
-  // 'other' to 'this'.
-  //
-  // For example:
-  //   a = b;        // With a.id = 5 and b.id = 3
-  // will generate the following assignment:
-  //   v_5 = v_3;
-  //
-  //  If 'this' ExpressionRef is currently not pointing to a variable
-  // (id==invalid), then an assignment to a new variable is generated. Example:
-  //    T a = 5;
-  //    T b;
-  //    b = a;  // During the assignment 'b' is invalid
-  //
-  // The right hand side of the assignment (= the argument 'other') must be
-  // valid in every case. The following code will result in an error.
-  //   T a;
-  //   T b = a;  // Error: Uninitialized assignment
-  ExpressionRef(const ExpressionRef& other);
-  ExpressionRef& operator=(const ExpressionRef& other);
-
-  // Compound operators
-  ExpressionRef& operator+=(const ExpressionRef& x);
-  ExpressionRef& operator-=(const ExpressionRef& x);
-  ExpressionRef& operator*=(const ExpressionRef& x);
-  ExpressionRef& operator/=(const ExpressionRef& x);
-
-  bool IsInitialized() const { return id != kInvalidExpressionId; }
-
-  // The index into the ExpressionGraph data array.
-  ExpressionId id = kInvalidExpressionId;
-};
-
-// A helper function which calls 'InsertBack' on the currently active graph.
-// This wrapper also checks if StartRecordingExpressions was called. See
-// ExpressionGraph::InsertBack for more information.
-ExpressionRef AddExpressionToGraph(const Expression& expression);
-
-// Arithmetic Operators
-ExpressionRef operator-(const ExpressionRef& x);
-ExpressionRef operator+(const ExpressionRef& x);
-ExpressionRef operator+(const ExpressionRef& x, const ExpressionRef& y);
-ExpressionRef operator-(const ExpressionRef& x, const ExpressionRef& y);
-ExpressionRef operator*(const ExpressionRef& x, const ExpressionRef& y);
-ExpressionRef operator/(const ExpressionRef& x, const ExpressionRef& y);
-
-// Functions
-#define CERES_DEFINE_UNARY_FUNCTION_CALL(ns, name)                     \
-  inline ExpressionRef name(const ExpressionRef& x) {                  \
-    return AddExpressionToGraph(                                       \
-        Expression::CreateScalarFunctionCall(#ns "::" #name, {x.id})); \
-  }
-#define CERES_DEFINE_BINARY_FUNCTION_CALL(ns, name)                           \
-  inline ExpressionRef name(const ExpressionRef& x, const ExpressionRef& y) { \
-    return AddExpressionToGraph(                                              \
-        Expression::CreateScalarFunctionCall(#ns "::" #name, {x.id, y.id}));  \
-  }
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, abs);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, acos);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, asin);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, atan);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, cbrt);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, ceil);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, cos);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, cosh);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, exp);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, exp2);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, floor);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, log);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, log2);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, sin);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, sinh);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, sqrt);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, tan);
-CERES_DEFINE_UNARY_FUNCTION_CALL(std, tanh);
-
-CERES_DEFINE_BINARY_FUNCTION_CALL(std, atan2);
-CERES_DEFINE_BINARY_FUNCTION_CALL(std, pow);
-
-#undef CERES_DEFINE_UNARY_FUNCTION_CALL
-#undef CERES_DEFINE_BINARY_FUNCTION_CALL
-
-// This additonal type is required, so that we can detect invalid conditions
-// during compile time. For example, the following should create a compile time
-// error:
-//
-//   ExpressionRef a(5);
-//   CERES_IF(a){           // Error: Invalid conversion
-//   ...
-//
-// Following will work:
-//
-//   ExpressionRef a(5), b(7);
-//   ComparisonExpressionRef c = a < b;
-//   CERES_IF(c){
-//   ...
-struct ComparisonExpressionRef {
-  ExpressionId id;
-  explicit ComparisonExpressionRef(const ExpressionRef& ref) : id(ref.id) {}
-};
-
-ExpressionRef Ternary(const ComparisonExpressionRef& c,
-                      const ExpressionRef& x,
-                      const ExpressionRef& y);
-
-// Comparison operators
-ComparisonExpressionRef operator<(const ExpressionRef& x,
-                                  const ExpressionRef& y);
-ComparisonExpressionRef operator<=(const ExpressionRef& x,
-                                   const ExpressionRef& y);
-ComparisonExpressionRef operator>(const ExpressionRef& x,
-                                  const ExpressionRef& y);
-ComparisonExpressionRef operator>=(const ExpressionRef& x,
-                                   const ExpressionRef& y);
-ComparisonExpressionRef operator==(const ExpressionRef& x,
-                                   const ExpressionRef& y);
-ComparisonExpressionRef operator!=(const ExpressionRef& x,
-                                   const ExpressionRef& y);
-
-// Logical Operators
-ComparisonExpressionRef operator&&(const ComparisonExpressionRef& x,
-                                   const ComparisonExpressionRef& y);
-ComparisonExpressionRef operator||(const ComparisonExpressionRef& x,
-                                   const ComparisonExpressionRef& y);
-ComparisonExpressionRef operator&(const ComparisonExpressionRef& x,
-                                  const ComparisonExpressionRef& y);
-ComparisonExpressionRef operator|(const ComparisonExpressionRef& x,
-                                  const ComparisonExpressionRef& y);
-ComparisonExpressionRef operator!(const ComparisonExpressionRef& x);
-
-#define CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL(ns, name)               \
-  inline ComparisonExpressionRef name(const ExpressionRef& x) {          \
-    return ComparisonExpressionRef(AddExpressionToGraph(                 \
-        Expression::CreateLogicalFunctionCall(#ns "::" #name, {x.id}))); \
-  }
-
-CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL(std, isfinite);
-CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL(std, isinf);
-CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL(std, isnan);
-CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL(std, isnormal);
-
-#undef CERES_DEFINE_UNARY_LOGICAL_FUNCTION_CALL
-
-template <>
-struct InputAssignment<ExpressionRef> {
-  using ReturnType = ExpressionRef;
-  static inline ReturnType Get(double /* unused */, const char* name) {
-    // Note: The scalar value of v will be thrown away, because we don't need it
-    // during code generation.
-    return AddExpressionToGraph(Expression::CreateInputAssignment(name));
-  }
-};
-
-template <typename T>
-inline typename InputAssignment<T>::ReturnType MakeInputAssignment(
-    double v, const char* name) {
-  return InputAssignment<T>::Get(v, name);
-}
-
-inline ExpressionRef MakeParameter(const std::string& name) {
-  return AddExpressionToGraph(Expression::CreateInputAssignment(name));
-}
-inline ExpressionRef MakeOutput(const ExpressionRef& v,
-                                const std::string& name) {
-  return AddExpressionToGraph(Expression::CreateOutputAssignment(v.id, name));
-}
-
-}  // namespace internal
-
-template <>
-struct ComparisonReturnType<internal::ExpressionRef> {
-  using type = internal::ComparisonExpressionRef;
-};
-
-}  // namespace ceres
-#endif
diff --git a/include/ceres/codegen/internal/optimization_pass_summary.h b/include/ceres/codegen/internal/optimization_pass_summary.h
deleted file mode 100644
index 1e376af..0000000
--- a/include/ceres/codegen/internal/optimization_pass_summary.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2020 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZATION_PASS_SUMMARY_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZATION_PASS_SUMMARY_H_
-
-#include <string>
-
-namespace ceres {
-namespace internal {
-
-struct OptimizationPassSummary {
-  bool expression_graph_changed = false;
-  std::string optimization_pass_name;
-  int num_expressions_replaced_by_nop = 0;
-  int num_expressions_removed = 0;
-  int num_expressions_inserted = 0;
-  int num_expressions_modified = 0;
-};
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZATION_PASS_SUMMARY_H_
diff --git a/include/ceres/codegen/internal/optimize_expression_graph.h b/include/ceres/codegen/internal/optimize_expression_graph.h
deleted file mode 100644
index 8e06e8b..0000000
--- a/include/ceres/codegen/internal/optimize_expression_graph.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2020 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZE_EXPRESSION_GRAPH_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZE_EXPRESSION_GRAPH_H_
-
-#include <memory>
-#include <vector>
-
-#include "ceres/codegen/internal/expression_graph.h"
-#include "ceres/codegen/internal/optimization_pass_summary.h"
-
-namespace ceres {
-namespace internal {
-
-struct OptimizeExpressionGraphOptions {
-  int max_num_iterations = 100;
-  bool eliminate_nops = true;
-};
-
-struct OptimizeExpressionGraphSummary {
-  int num_iterations;
-  std::vector<OptimizationPassSummary> summaries;
-};
-
-// Optimize the given ExpressionGraph in-place according to the defined
-// OptimizeExpressionGraphOptions. This will change the ExpressionGraph, but the
-// generated code will output the same numerical values.
-//
-// The Optimization iteratively applies all OptimizationPasses until the graph
-// does not change anymore or max_num_iterations is reached. Pseudo Code:
-//
-//   for(int it = 0; it < max_num_iterations; ++it) {
-//      graph.hasChanged = false;
-//      for each pass in OptimizationPasses
-//         pass.applyTo(graph)
-//      if(!graph.hasChanged)
-//         break;
-//   }
-//
-OptimizeExpressionGraphSummary OptimizeExpressionGraph(
-    const OptimizeExpressionGraphOptions& options, ExpressionGraph* graph);
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_OPTIMIZE_EXPRESSION_GRAPH_H_
diff --git a/include/ceres/codegen/internal/types.h b/include/ceres/codegen/internal/types.h
deleted file mode 100644
index 5d32d5b..0000000
--- a/include/ceres/codegen/internal/types.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-#ifndef CERES_PUBLIC_CODEGEN_INTERNAL_TYPES_H_
-#define CERES_PUBLIC_CODEGEN_INTERNAL_TYPES_H_
-
-#include "ceres/codegen/macros.h"
-
-namespace ceres {
-// The return type of a comparison, for example from <, &&, ==.
-//
-// In the context of traditional Ceres Jet operations, this would
-// always be a bool. However, in the autodiff code generation context,
-// the return is always an expression, and so a different type must be
-// used as a return from comparisons.
-//
-// In the autodiff codegen context, this function is overloaded so that 'type'
-// is one of the autodiff code generation expression types.
-template <typename T>
-struct ComparisonReturnType {
-  using type = bool;
-};
-
-namespace internal {
-// The InputAssignment struct is used to implement the CERES_LOCAL_VARIABLE
-// macro defined in macros.h. The input is a double variable and the
-// corresponding name as a string. During execution mode (T==double or
-// T==Jet<double>) the variable name is unused and this function only returns
-// the value. During code generation (T==ExpressionRef) the value is unused and
-// an assignment expression is created. For example:
-//   v_0 = observed_x;
-template <typename T>
-struct InputAssignment {
-  static inline T Get(double v, const char* /* unused */) { return v; }
-};
-
-}  // namespace internal
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_INTERNAL_TYPES_H_
diff --git a/include/ceres/codegen/macros.h b/include/ceres/codegen/macros.h
deleted file mode 100644
index d3a43a6..0000000
--- a/include/ceres/codegen/macros.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-//
-// This file defines the required macros to use local variables and if-else
-// branches in the AutoDiffCodeGen system. This is also the only file that
-// should be included by a user-defined cost functor.
-//
-// To generate code for your cost functor the following steps have to be
-// implemented (see below for a full example):
-//
-// 1. Include this file
-// 2. Wrap accesses to local variables in the CERES_LOCAL_VARIABLE macro.
-// 3. Replace if, else by CERES_IF, CERES_ELSE and add CERES_ENDIF
-// 4. Add a default constructor
-//
-// Example - my_cost_functor.h
-// ========================================================
-//  #include "ceres/rotation.h"
-//  #include "ceres/autodiff_codegen_macros.h"
-//
-//  struct MyReprojectionError {
-//    MyReprojectionError(double observed_x, double observed_y)
-//        : observed_x(observed_x), observed_y(observed_y) {}
-//
-//    // The cost functor must be default constructible!
-//    MyReprojectionError() = default;
-//
-//    template <typename T>
-//    bool operator()(const T* const camera,
-//                    const T* const point,
-//                    T* residuals) const {
-//      T p[3];
-//      AngleAxisRotatePoint(camera, point, p);
-//      p[0] += camera[3];
-//      p[1] += camera[4];
-//      p[2] += camera[5];
-//
-//      // The if block is written using the macros!
-//      CERES_IF(p[2] < T(0)) {
-//        p[0] = -p[0];
-//        p[1] = -p[1];
-//        p[2] = -p[2];
-//      } CERES_ELSE {
-//        p[0] += T(1.0);
-//      }CERES_ENDIF;
-//
-//      const T& focal = camera[6];
-//      const T predicted_x = focal * p[0];
-//      const T predicted_y = focal * p[1];
-//
-//      // The read-access to the local variables observed_x and observed_y are
-//      // wrapped in the CERES_LOCAL_VARIABLE macro!
-//      residuals[0] = predicted_x - CERES_LOCAL_VARIABLE(T, observed_x);
-//      residuals[1] = predicted_y - CERES_LOCAL_VARIABLE(T, observed_y);
-//      return true;
-//    }
-//    double observed_x;
-//    double observed_y;
-//  };
-//
-// ========================================================
-//
-// This file defines the following macros:
-//
-// CERES_LOCAL_VARIABLE
-// CERES_IF
-// CERES_ELSE
-// CERES_ENDIF
-//
-#ifndef CERES_PUBLIC_CODEGEN_MACROS_H_
-#define CERES_PUBLIC_CODEGEN_MACROS_H_
-
-// The CERES_CODEGEN macro is defined by the build system only during code
-// generation.
-#ifndef CERES_CODEGEN
-#define CERES_LOCAL_VARIABLE(type, local_variable) type(local_variable)
-#define CERES_IF(condition_) if (condition_)
-#define CERES_ELSE else
-#define CERES_ENDIF
-#define CERES_COMMENT(comment_)
-#else
-#define CERES_LOCAL_VARIABLE(_template_type, _local_variable)            \
-  ceres::internal::InputAssignment<_template_type>::Get(_local_variable, \
-                                                        #_local_variable)
-#define CERES_IF(condition_) \
-  AddExpressionToGraph(ceres::internal::Expression::CreateIf((condition_).id));
-#define CERES_ELSE \
-  AddExpressionToGraph(ceres::internal::Expression::CreateElse());
-#define CERES_ENDIF \
-  AddExpressionToGraph(ceres::internal::Expression::CreateEndIf());
-#define CERES_COMMENT(comment_) \
-  AddExpressionToGraph(ceres::internal::Expression::CreateComment(comment_))
-#endif
-
-namespace ceres {
-// A function equivalent to the ternary ?-operator.
-// This function is required, because in the context of code generation a
-// comparison returns an expression type which is not convertible to bool.
-inline double Ternary(bool c, double a, double b) { return c ? a : b; }
-}  // namespace ceres
-
-#endif  // CERES_PUBLIC_CODEGEN_MACROS_H_
diff --git a/include/ceres/jet.h b/include/ceres/jet.h
index 1f81743..966e1b8 100644
--- a/include/ceres/jet.h
+++ b/include/ceres/jet.h
@@ -164,7 +164,6 @@
 #include <string>
 
 #include "Eigen/Core"
-#include "ceres/codegen/internal/types.h"
 #include "ceres/internal/port.h"
 
 namespace ceres {
@@ -354,21 +353,18 @@
 }
 
 // Binary comparison operators for both scalars and jets.
-#define CERES_DEFINE_JET_COMPARISON_OPERATOR(op)             \
-  template <typename T, int N>                               \
-  inline typename ComparisonReturnType<T>::type operator op( \
-      const Jet<T, N>& f, const Jet<T, N>& g) {              \
-    return f.a op g.a;                                       \
-  }                                                          \
-  template <typename T, int N>                               \
-  inline typename ComparisonReturnType<T>::type operator op( \
-      const T& s, const Jet<T, N>& g) {                      \
-    return s op g.a;                                         \
-  }                                                          \
-  template <typename T, int N>                               \
-  inline typename ComparisonReturnType<T>::type operator op( \
-      const Jet<T, N>& f, const T& s) {                      \
-    return f.a op s;                                         \
+#define CERES_DEFINE_JET_COMPARISON_OPERATOR(op)                    \
+  template <typename T, int N>                                      \
+  inline bool operator op(const Jet<T, N>& f, const Jet<T, N>& g) { \
+    return f.a op g.a;                                              \
+  }                                                                 \
+  template <typename T, int N>                                      \
+  inline bool operator op(const T& s, const Jet<T, N>& g) {         \
+    return s op g.a;                                                \
+  }                                                                 \
+  template <typename T, int N>                                      \
+  inline bool operator op(const Jet<T, N>& f, const T& s) {         \
+    return f.a op s;                                                \
   }
 CERES_DEFINE_JET_COMPARISON_OPERATOR(<)   // NOLINT
 CERES_DEFINE_JET_COMPARISON_OPERATOR(<=)  // NOLINT
@@ -378,18 +374,6 @@
 CERES_DEFINE_JET_COMPARISON_OPERATOR(!=)  // NOLINT
 #undef CERES_DEFINE_JET_COMPARISON_OPERATOR
 
-template <typename T, int N>
-inline Jet<T, N> Ternary(typename ComparisonReturnType<T>::type c,
-                         const Jet<T, N>& f,
-                         const Jet<T, N>& g) {
-  Jet<T, N> r;
-  r.a = Ternary(c, f.a, g.a);
-  for (int i = 0; i < N; ++i) {
-    r.v[i] = Ternary(c, f.v[i], g.v[i]);
-  }
-  return r;
-}
-
 // Pull some functions from namespace std.
 //
 // This is necessary because we want to use the same name (e.g. 'sqrt') for
@@ -436,7 +420,7 @@
 // abs(x + h) ~= x + h or -(x + h)
 template <typename T, int N>
 inline Jet<T, N> abs(const Jet<T, N>& f) {
-  return Ternary(f.a < T(0.0), -f, f);
+  return (f.a < T(0.0) ? -f : f);
 }
 
 // log(a + h) ~= log(a) + h / a
@@ -581,12 +565,12 @@
 
 template <typename T, int N>
 inline Jet<T, N> fmax(const Jet<T, N>& x, const Jet<T, N>& y) {
-  return Ternary(x < y, y, x);
+  return x < y ? y : x;
 }
 
 template <typename T, int N>
 inline Jet<T, N> fmin(const Jet<T, N>& x, const Jet<T, N>& y) {
-  return Ternary(y < x, y, x);
+  return y < x ? y : x;
 }
 
 // Bessel functions of the first kind with integer order equal to 0, 1, n.
@@ -659,7 +643,7 @@
 
 // The jet is finite if all parts of the jet are finite.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type isfinite(const Jet<T, N>& f) {
+inline bool isfinite(const Jet<T, N>& f) {
   // Branchless implementation. This is more efficient for the false-case and
   // works with the codegen system.
   auto result = isfinite(f.a);
@@ -671,7 +655,7 @@
 
 // The jet is infinite if any part of the Jet is infinite.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type isinf(const Jet<T, N>& f) {
+inline bool isinf(const Jet<T, N>& f) {
   auto result = isinf(f.a);
   for (int i = 0; i < N; ++i) {
     result = result | isinf(f.v[i]);
@@ -681,7 +665,7 @@
 
 // The jet is NaN if any part of the jet is NaN.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type isnan(const Jet<T, N>& f) {
+inline bool isnan(const Jet<T, N>& f) {
   auto result = isnan(f.a);
   for (int i = 0; i < N; ++i) {
     result = result | isnan(f.v[i]);
@@ -691,7 +675,7 @@
 
 // The jet is normal if all parts of the jet are normal.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type isnormal(const Jet<T, N>& f) {
+inline bool isnormal(const Jet<T, N>& f) {
   auto result = isnormal(f.a);
   for (int i = 0; i < N; ++i) {
     result = result & isnormal(f.v[i]);
@@ -701,23 +685,23 @@
 
 // Legacy functions from the pre-C++11 days.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type IsFinite(const Jet<T, N>& f) {
+inline bool IsFinite(const Jet<T, N>& f) {
   return isfinite(f);
 }
 
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type IsNaN(const Jet<T, N>& f) {
+inline bool IsNaN(const Jet<T, N>& f) {
   return isnan(f);
 }
 
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type IsNormal(const Jet<T, N>& f) {
+inline bool IsNormal(const Jet<T, N>& f) {
   return isnormal(f);
 }
 
 // The jet is infinite if any part of the jet is infinite.
 template <typename T, int N>
-inline typename ComparisonReturnType<T>::type IsInfinite(const Jet<T, N>& f) {
+inline bool IsInfinite(const Jet<T, N>& f) {
   return isinf(f);
 }
 
@@ -759,29 +743,25 @@
 inline Jet<T, N> pow(T f, const Jet<T, N>& g) {
   Jet<T, N> result;
 
-  CERES_IF(f == T(0) && g.a > T(0)) {
+  if (f == T(0) && g.a > T(0)) {
     // Handle case 2.
     result = Jet<T, N>(T(0.0));
-  }
-  CERES_ELSE {
-    CERES_IF(f < 0 && g.a == floor(g.a)) {  // Handle case 3.
+  } else {
+    if (f < 0 && g.a == floor(g.a)) {  // Handle case 3.
       result = Jet<T, N>(pow(f, g.a));
       for (int i = 0; i < N; i++) {
-        CERES_IF(g.v[i] != T(0.0)) {
+        if (g.v[i] != T(0.0)) {
           // Return a NaN when g.v != 0.
           result.v[i] = std::numeric_limits<T>::quiet_NaN();
         }
-        CERES_ENDIF
       }
-    }
-    CERES_ELSE {
+    } else {
       // Handle case 1.
       T const tmp = pow(f, g.a);
       result = Jet<T, N>(tmp, log(f) * tmp * g.v);
     }
-    CERES_ENDIF;
   }
-  CERES_ENDIF
+
   return result;
 }
 
@@ -825,26 +805,26 @@
 inline Jet<T, N> pow(const Jet<T, N>& f, const Jet<T, N>& g) {
   Jet<T, N> result;
 
-  CERES_IF(f.a == T(0) && g.a >= T(1)) {
+  if (f.a == T(0) && g.a >= T(1)) {
     // Handle cases 2 and 3.
-    CERES_IF(g.a > T(1)) { result = Jet<T, N>(T(0.0)); }
-    CERES_ELSE { result = f; }
-    CERES_ENDIF;
-  }
-  CERES_ELSE {
-    CERES_IF(f.a < T(0) && g.a == floor(g.a)) {
+    if (g.a > T(1)) {
+      result = Jet<T, N>(T(0.0));
+    } else {
+      result = f;
+    }
+
+  } else {
+    if (f.a < T(0) && g.a == floor(g.a)) {
       // Handle cases 7 and 8.
       T const tmp = g.a * pow(f.a, g.a - T(1.0));
       result = Jet<T, N>(pow(f.a, g.a), tmp * f.v);
       for (int i = 0; i < N; i++) {
-        CERES_IF(g.v[i] != T(0.0)) {
+        if (g.v[i] != T(0.0)) {
           // Return a NaN when g.v != 0.
           result.v[i] = T(std::numeric_limits<double>::quiet_NaN());
         }
-        CERES_ENDIF;
       }
-    }
-    CERES_ELSE {
+    } else {
       // Handle the remaining cases. For cases 4,5,6,9 we allow the log()
       // function to generate -HUGE_VAL or NaN, since those cases result in a
       // nonfinite derivative.
@@ -853,9 +833,8 @@
       T const tmp3 = tmp1 * log(f.a);
       result = Jet<T, N>(tmp1, tmp2 * f.v + tmp3 * g.v);
     }
-    CERES_ENDIF;
   }
-  CERES_ENDIF;
+
   return result;
 }
 
@@ -874,19 +853,6 @@
   s << "]";
   return s;
 }
-
-namespace internal {
-// In the context of AutoDiffCodeGen, local variables can be added using the
-// CERES_LOCAL_VARIABLE macro defined in ceres/codegen/macros.h. This partial
-// specialization defined how local variables of type double are converted to
-// Jet<T>.
-template <typename T, int N>
-struct InputAssignment<Jet<T, N>> {
-  static inline Jet<T, N> Get(double v, const char* name) {
-    return Jet<T, N>(InputAssignment<T>::Get(v, name));
-  }
-};
-}  // namespace internal
 }  // namespace ceres
 
 namespace Eigen {
diff --git a/include/ceres/rotation.h b/include/ceres/rotation.h
index ce06a2c..7d5c8ef 100644
--- a/include/ceres/rotation.h
+++ b/include/ceres/rotation.h
@@ -48,7 +48,7 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
-#include "codegen/macros.h"
+
 #include "glog/logging.h"
 
 namespace ceres {
@@ -253,7 +253,7 @@
   const T theta_squared = a0 * a0 + a1 * a1 + a2 * a2;
 
   // For points not at the origin, the full conversion is numerically stable.
-  CERES_IF(theta_squared > T(0.0)) {
+  if (theta_squared > T(0.0)) {
     const T theta = sqrt(theta_squared);
     const T half_theta = theta * T(0.5);
     const T k = sin(half_theta) / theta;
@@ -261,8 +261,7 @@
     quaternion[1] = a0 * k;
     quaternion[2] = a1 * k;
     quaternion[3] = a2 * k;
-  }
-  CERES_ELSE {
+  } else {
     // At the origin, sqrt() will produce NaN in the derivative since
     // the argument is zero.  By approximating with a Taylor series,
     // and truncating at one term, the value and first derivatives will be
@@ -273,7 +272,6 @@
     quaternion[2] = a1 * k;
     quaternion[3] = a2 * k;
   }
-  CERES_ENDIF;
 }
 
 template <typename T>
@@ -285,7 +283,7 @@
 
   // For quaternions representing non-zero rotation, the conversion
   // is numerically stable.
-  CERES_IF(sin_squared_theta > T(0.0)) {
+  if (sin_squared_theta > T(0.0)) {
     const T sin_theta = sqrt(sin_squared_theta);
     const T& cos_theta = quaternion[0];
 
@@ -302,15 +300,14 @@
     //   theta - pi = atan(sin(theta - pi), cos(theta - pi))
     //              = atan(-sin(theta), -cos(theta))
     //
-    const T two_theta = T(2.0) * Ternary((cos_theta < T(0.0)),
-                                         atan2(-sin_theta, -cos_theta),
-                                         atan2(sin_theta, cos_theta));
+    const T two_theta =
+        T(2.0) * ((cos_theta < T(0.0)) ? atan2(-sin_theta, -cos_theta)
+                                       : atan2(sin_theta, cos_theta));
     const T k = two_theta / sin_theta;
     angle_axis[0] = q1 * k;
     angle_axis[1] = q2 * k;
     angle_axis[2] = q3 * k;
-  }
-  CERES_ELSE {
+  } else {
     // For zero rotation, sqrt() will produce NaN in the derivative since
     // the argument is zero.  By approximating with a Taylor series,
     // and truncating at one term, the value and first derivatives will be
@@ -320,7 +317,6 @@
     angle_axis[1] = q2 * k;
     angle_axis[2] = q3 * k;
   }
-  CERES_ENDIF;
 }
 
 template <typename T>
@@ -391,7 +387,7 @@
     const T* angle_axis, const MatrixAdapter<T, row_stride, col_stride>& R) {
   static const T kOne = T(1.0);
   const T theta2 = DotProduct(angle_axis, angle_axis);
-  CERES_IF(theta2 > T(std::numeric_limits<double>::epsilon())) {
+  if (theta2 > T(std::numeric_limits<double>::epsilon())) {
     // We want to be careful to only evaluate the square root if the
     // norm of the angle_axis vector is greater than zero. Otherwise
     // we get a division by zero.
@@ -414,8 +410,7 @@
     R(1, 2) = -wx*sintheta   + wy*wz*(kOne -    costheta);
     R(2, 2) =     costheta   + wz*wz*(kOne -    costheta);
     // clang-format on
-  }
-  CERES_ELSE {
+  } else {
     // Near zero, we switch to using the first order Taylor expansion.
     R(0, 0) = kOne;
     R(1, 0) = angle_axis[2];
@@ -427,7 +422,6 @@
     R(1, 2) = -angle_axis[0];
     R(2, 2) = kOne;
   }
-  CERES_ENDIF;
 }
 
 template <typename T>
@@ -597,7 +591,7 @@
   DCHECK_NE(pt, result) << "Inplace rotation is not supported.";
 
   const T theta2 = DotProduct(angle_axis, angle_axis);
-  CERES_IF(theta2 > T(std::numeric_limits<double>::epsilon())) {
+  if (theta2 > T(std::numeric_limits<double>::epsilon())) {
     // Away from zero, use the rodriguez formula
     //
     //   result = pt costheta +
@@ -628,8 +622,7 @@
     result[0] = pt[0] * costheta + w_cross_pt[0] * sintheta + w[0] * tmp;
     result[1] = pt[1] * costheta + w_cross_pt[1] * sintheta + w[1] * tmp;
     result[2] = pt[2] * costheta + w_cross_pt[2] * sintheta + w[2] * tmp;
-  }
-  CERES_ELSE {
+  } else {
     // Near zero, the first order Taylor approximation of the rotation
     // matrix R corresponding to a vector w and angle w is
     //
@@ -655,7 +648,6 @@
     result[1] = pt[1] + w_cross_pt[1];
     result[2] = pt[2] + w_cross_pt[2];
   }
-  CERES_ENDIF;
 }
 
 }  // namespace ceres
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 95579da..3711222 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -148,18 +148,6 @@
     wall_time.cc
 )
 
-if(CODE_GENERATION)
-  set(CERES_CODEGEN_SRC
-      codegen/code_generator.cc
-      codegen/expression.cc
-      codegen/expression_graph.cc
-      codegen/expression_ref.cc
-      codegen/optimize_expression_graph.cc
-      codegen/eliminate_nops.cc
-  )
-  list(APPEND CERES_INTERNAL_SRC ${CERES_CODEGEN_SRC})
-endif(CODE_GENERATION)
-
 # Also depend on the header files so that they appear in IDEs.
 file(GLOB CERES_INTERNAL_HDRS *.h)
 if (MINIGLOG)
diff --git a/internal/ceres/autodiff_benchmarks/snavely_reprojection_error.h b/internal/ceres/autodiff_benchmarks/snavely_reprojection_error.h
index b1b5081..8da8bea 100644
--- a/internal/ceres/autodiff_benchmarks/snavely_reprojection_error.h
+++ b/internal/ceres/autodiff_benchmarks/snavely_reprojection_error.h
@@ -36,7 +36,7 @@
 
 namespace ceres {
 
-struct SnavelyReprojectionError  {
+struct SnavelyReprojectionError {
   SnavelyReprojectionError(double observed_x, double observed_y)
       : observed_x(observed_x), observed_y(observed_y) {}
 
@@ -45,8 +45,8 @@
   bool operator()(const T* const camera,
                   const T* const point,
                   T* residuals) const {
-    T ox = CERES_LOCAL_VARIABLE(T, observed_x);
-    T oy = CERES_LOCAL_VARIABLE(T, observed_y);
+    T ox = T(observed_x);
+    T oy = T(observed_y);
 
     // camera[0,1,2] are the angle-axis rotation.
     T p[3];
diff --git a/internal/ceres/codegen/code_generator.cc b/internal/ceres/codegen/code_generator.cc
deleted file mode 100644
index 7b5fd61..0000000
--- a/internal/ceres/codegen/code_generator.cc
+++ /dev/null
@@ -1,292 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/code_generator.h"
-
-#include <cmath>
-#include <limits>
-#include <sstream>
-
-#include "assert.h"
-#include "glog/logging.h"
-namespace ceres {
-namespace internal {
-
-CodeGenerator::CodeGenerator(const ExpressionGraph& graph,
-                             const Options& options)
-    : graph_(graph), options_(options) {}
-
-std::vector<std::string> CodeGenerator::Generate() {
-  std::vector<std::string> code;
-
-  // 1. Print the header
-  if (!options_.function_name.empty()) {
-    code.emplace_back(options_.function_name);
-  }
-
-  code.emplace_back("{");
-  PushIndentation();
-
-  // 2. Print declarations
-  for (ExpressionId id = 0; id < graph_.Size(); ++id) {
-    // By definition of the lhs_id, an expression defines a new variable only if
-    // the current_id is identical to the lhs_id.
-    const auto& expr = graph_.ExpressionForId(id);
-    if (id != expr.lhs_id()) {
-      continue;
-    }
-    //
-    // Format:     <type> <id>;
-    // Example:    double v_0;
-    //
-    const std::string declaration_string =
-        indentation_ + ExpressionReturnTypeToString(expr.return_type()) + " " +
-        VariableForExpressionId(id) + ";";
-    code.emplace_back(declaration_string);
-  }
-
-  // 3. Print code
-  for (ExpressionId id = 0; id < graph_.Size(); ++id) {
-    code.emplace_back(ExpressionToString(id));
-  }
-
-  PopIndentation();
-  CHECK(indentation_.empty()) << "IF - ENDIF missmatch detected.";
-  code.emplace_back("}");
-
-  return code;
-}
-
-std::string CodeGenerator::ExpressionToString(ExpressionId id) {
-  // An expression is converted into a string, by first adding the required
-  // indentation spaces and then adding a ExpressionType-specific string. The
-  // following list shows the exact output format for each ExpressionType. The
-  // placeholders <value>, <name>,... stand for the respective members value_,
-  // name_, ... of the current expression. ExpressionIds such as lhs_id and
-  // arguments are converted to the corresponding variable name (7 -> "v_7").
-
-  auto& expr = graph_.ExpressionForId(id);
-
-  std::stringstream result;
-  result.precision(kFloatingPointPrecision);
-
-  // Convert the variable names of lhs and arguments to string. This makes the
-  // big switch/case below more readable.
-  std::string lhs;
-  if (expr.HasValidLhs()) {
-    lhs = VariableForExpressionId(expr.lhs_id());
-  }
-  std::vector<std::string> args;
-  for (ExpressionId id : expr.arguments()) {
-    args.push_back(VariableForExpressionId(id));
-  }
-  auto value = expr.value();
-  const auto& name = expr.name();
-
-  switch (expr.type()) {
-    case ExpressionType::COMPILE_TIME_CONSTANT: {
-      //
-      // Format:     <lhs_id> = <value>;
-      // Example:    v_0      = 3.1415;
-      //
-      result << indentation_ << lhs << " = ";
-
-      // Putting an inf or nan double into std::stringstream will just print the
-      // strings "inf" and "nan". This is not valid C++ code so we have to check
-      // for this here.
-      if (std::isinf(value)) {
-        if (value > 0) {
-          result << "std::numeric_limits<double>::infinity()";
-        } else {
-          result << "-std::numeric_limits<double>::infinity()";
-        }
-      } else if (std::isnan(value)) {
-        result << "std::numeric_limits<double>::quiet_NaN()";
-      } else {
-        result << value;
-      }
-      result << ";";
-      break;
-    }
-    case ExpressionType::INPUT_ASSIGNMENT: {
-      //
-      // Format:     <lhs_id> = <name>;
-      // Example:    v_0      = _observed_point_x;
-      //
-      result << indentation_ << lhs << " = " << name << ";";
-      break;
-    }
-    case ExpressionType::OUTPUT_ASSIGNMENT: {
-      //
-      // Format:     <name>      = <arguments[0]>;
-      // Example:    residual[0] = v_51;
-      //
-      result << indentation_ << name << " = " << args[0] << ";";
-      break;
-    }
-    case ExpressionType::ASSIGNMENT: {
-      //
-      // Format:     <lhs_id> = <arguments[0]>;
-      // Example:    v_1      = v_0;
-      //
-      result << indentation_ << lhs << " = " << args[0] << ";";
-      break;
-    }
-    case ExpressionType::BINARY_ARITHMETIC: {
-      //
-      // Format:     <lhs_id> = <arguments[0]> <name> <arguments[1]>;
-      // Example:    v_2      = v_0 + v_1;
-      //
-      result << indentation_ << lhs << " = " << args[0] << " " << name << " "
-             << args[1] << ";";
-      break;
-    }
-    case ExpressionType::UNARY_ARITHMETIC: {
-      //
-      // Format:     <lhs_id> = <name><arguments[0]>;
-      // Example:    v_1      = -v_0;
-      //
-      result << indentation_ << lhs << " = " << name << args[0] << ";";
-      break;
-    }
-    case ExpressionType::BINARY_COMPARISON: {
-      //
-      // Format:     <lhs_id> =  <arguments[0]> <name> <arguments[1]>;
-      // Example:    v_2   = v_0 < v_1;
-      //
-      result << indentation_ << lhs << " = " << args[0] << " " << name << " "
-             << args[1] << ";";
-      break;
-    }
-    case ExpressionType::LOGICAL_NEGATION: {
-      //
-      // Format:     <lhs_id> = !<arguments[0]>;
-      // Example:    v_1   = !v_0;
-      //
-      result << indentation_ << lhs << " = !" << args[0] << ";";
-      break;
-    }
-    case ExpressionType::FUNCTION_CALL: {
-      //
-      // Format:     <lhs_id> = <name>(<arguments[0]>, <arguments[1]>, ...);
-      // Example:    v_1   = sin(v_0);
-      //
-      result << indentation_ << lhs << " = " << name << "(";
-      result << (args.size() ? args[0] : "");
-      for (int i = 1; i < args.size(); ++i) {
-        result << ", " << args[i];
-      }
-      result << ");";
-      break;
-    }
-    case ExpressionType::IF: {
-      //
-      // Format:     if (<arguments[0]>) {
-      // Example:    if (v_0) {
-      // Special:    Adds 1 level of indentation for all following
-      //             expressions.
-      //
-      result << indentation_ << "if (" << args[0] << ") {";
-      PushIndentation();
-      break;
-    }
-    case ExpressionType::ELSE: {
-      //
-      // Format:     } else {
-      // Example:    } else {
-      // Special:    This expression is printed with one less level of
-      //             indentation.
-      //
-      PopIndentation();
-      result << indentation_ << "} else {";
-      PushIndentation();
-      break;
-    }
-    case ExpressionType::ENDIF: {
-      //
-      // Format:     }
-      // Example:    }
-      // Special:    Removes 1 level of indentation for this and all
-      //             following expressions.
-      //
-      PopIndentation();
-      result << indentation_ << "}";
-      break;
-    }
-    case ExpressionType::COMMENT: {
-      //
-      // Format:     // <name>
-      // Example:    // this is a comment
-      //
-      result << indentation_ << "// " + name;
-      break;
-    }
-    case ExpressionType::NOP: {
-      //
-      // Format:     // <NOP>
-      // Example:    // <NOP>
-      //
-      result << indentation_ << "// <NOP>";
-      break;
-    }
-    default:
-      CHECK(false) << "CodeGenerator::ToString for ExpressionType "
-                   << static_cast<int>(expr.type()) << " not implemented!";
-  }
-  return result.str();
-}
-
-std::string CodeGenerator::VariableForExpressionId(ExpressionId id) {
-  //
-  // Format:     <variable_prefix><id>
-  // Example:    v_42
-  //
-  auto& expr = graph_.ExpressionForId(id);
-  CHECK(expr.lhs_id() == id)
-      << "ExpressionId " << id
-      << " does not have a name (it has not been declared).";
-  return options_.variable_prefix + std::to_string(expr.lhs_id());
-}
-
-void CodeGenerator::PushIndentation() {
-  for (int i = 0; i < options_.indentation_spaces_per_level; ++i) {
-    indentation_.push_back(' ');
-  }
-}
-
-void CodeGenerator::PopIndentation() {
-  for (int i = 0; i < options_.indentation_spaces_per_level; ++i) {
-    CHECK(!indentation_.empty()) << "IF - ENDIF missmatch detected.";
-    indentation_.pop_back();
-  }
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/codegen/eliminate_nops.cc b/internal/ceres/codegen/eliminate_nops.cc
deleted file mode 100644
index f94a873..0000000
--- a/internal/ceres/codegen/eliminate_nops.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/eliminate_nops.h"
-
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-OptimizationPassSummary EliminateNops(ExpressionGraph* graph) {
-  OptimizationPassSummary summary;
-
-  for (ExpressionId id = 0; id < graph->Size(); ++id) {
-    Expression& expr = graph->ExpressionForId(id);
-
-    if (expr.type() == ExpressionType::NOP) {
-      graph->Erase(id);
-      id--;
-      summary.expression_graph_changed = true;
-      summary.num_expressions_removed++;
-    }
-  }
-  return summary;
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/codegen/expression.cc b/internal/ceres/codegen/expression.cc
deleted file mode 100644
index 1a475b3..0000000
--- a/internal/ceres/codegen/expression.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/expression.h"
-#include <algorithm>
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-std::string ExpressionReturnTypeToString(ExpressionReturnType type) {
-  switch (type) {
-    case ExpressionReturnType::SCALAR:
-      return "double";
-    case ExpressionReturnType::BOOLEAN:
-      return "bool";
-    case ExpressionReturnType::VOID:
-      return "void";
-    default:
-      CHECK(false) << "Unknown ExpressionReturnType.";
-      return "";
-  }
-}
-
-Expression::Expression(ExpressionType type,
-                       ExpressionReturnType return_type,
-                       ExpressionId lhs_id,
-                       const std::vector<ExpressionId>& arguments,
-                       const std::string& name,
-                       double value)
-    : type_(type),
-      return_type_(return_type),
-      lhs_id_(lhs_id),
-      arguments_(arguments),
-      name_(name),
-      value_(value) {}
-
-Expression Expression::CreateCompileTimeConstant(double v) {
-  return Expression(ExpressionType::COMPILE_TIME_CONSTANT,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    {},
-                    "",
-                    v);
-}
-
-Expression Expression::CreateInputAssignment(const std::string& name) {
-  return Expression(ExpressionType::INPUT_ASSIGNMENT,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    {},
-                    name);
-}
-
-Expression Expression::CreateOutputAssignment(ExpressionId v,
-                                              const std::string& name) {
-  return Expression(ExpressionType::OUTPUT_ASSIGNMENT,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    {v},
-                    name);
-}
-
-Expression Expression::CreateAssignment(ExpressionId dst, ExpressionId src) {
-  return Expression(
-      ExpressionType::ASSIGNMENT, ExpressionReturnType::SCALAR, dst, {src});
-}
-
-Expression Expression::CreateBinaryArithmetic(const std::string& op,
-                                              ExpressionId l,
-                                              ExpressionId r) {
-  return Expression(ExpressionType::BINARY_ARITHMETIC,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    {l, r},
-                    op);
-}
-
-Expression Expression::CreateUnaryArithmetic(const std::string& op,
-                                             ExpressionId v) {
-  return Expression(ExpressionType::UNARY_ARITHMETIC,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    {v},
-                    op);
-}
-
-Expression Expression::CreateBinaryCompare(const std::string& name,
-                                           ExpressionId l,
-                                           ExpressionId r) {
-  return Expression(ExpressionType::BINARY_COMPARISON,
-                    ExpressionReturnType::BOOLEAN,
-                    kInvalidExpressionId,
-                    {l, r},
-                    name);
-}
-
-Expression Expression::CreateLogicalNegation(ExpressionId v) {
-  return Expression(ExpressionType::LOGICAL_NEGATION,
-                    ExpressionReturnType::BOOLEAN,
-                    kInvalidExpressionId,
-                    {v});
-}
-
-Expression Expression::CreateScalarFunctionCall(
-    const std::string& name, const std::vector<ExpressionId>& params) {
-  return Expression(ExpressionType::FUNCTION_CALL,
-                    ExpressionReturnType::SCALAR,
-                    kInvalidExpressionId,
-                    params,
-                    name);
-}
-
-Expression Expression::CreateLogicalFunctionCall(
-    const std::string& name, const std::vector<ExpressionId>& params) {
-  return Expression(ExpressionType::FUNCTION_CALL,
-                    ExpressionReturnType::BOOLEAN,
-                    kInvalidExpressionId,
-                    params,
-                    name);
-}
-
-Expression Expression::CreateIf(ExpressionId condition) {
-  return Expression(ExpressionType::IF,
-                    ExpressionReturnType::VOID,
-                    kInvalidExpressionId,
-                    {condition});
-}
-
-Expression Expression::CreateElse() { return Expression(ExpressionType::ELSE); }
-
-Expression Expression::CreateEndIf() {
-  return Expression(ExpressionType::ENDIF);
-}
-
-Expression Expression::CreateComment(const std::string& comment) {
-  return Expression(ExpressionType::COMMENT,
-                    ExpressionReturnType::VOID,
-                    kInvalidExpressionId,
-                    {},
-                    comment);
-}
-
-bool Expression::IsArithmeticExpression() const {
-  return !IsControlExpression();
-}
-
-bool Expression::IsControlExpression() const {
-  return type_ == ExpressionType::IF || type_ == ExpressionType::ELSE ||
-         type_ == ExpressionType::ENDIF || type_ == ExpressionType::NOP ||
-         type_ == ExpressionType::COMMENT;
-}
-
-bool Expression::IsReplaceableBy(const Expression& other) const {
-  // Check everything except the id.
-  return (type_ == other.type_ && name_ == other.name_ &&
-          value_ == other.value_ && arguments_ == other.arguments_);
-}
-
-void Expression::Replace(const Expression& other) {
-  if (other.lhs_id_ == lhs_id_) {
-    return;
-  }
-
-  type_ = other.type_;
-  arguments_ = other.arguments_;
-  name_ = other.name_;
-  value_ = other.value_;
-}
-
-bool Expression::DirectlyDependsOn(ExpressionId other) const {
-  return (std::find(arguments_.begin(), arguments_.end(), other) !=
-          arguments_.end());
-}
-
-bool Expression::IsCompileTimeConstantAndEqualTo(double constant) const {
-  return type_ == ExpressionType::COMPILE_TIME_CONSTANT && value_ == constant;
-}
-
-void Expression::MakeNop() {
-  // The default constructor creates a NOP expression!
-  *this = Expression();
-}
-
-bool Expression::operator==(const Expression& other) const {
-  return type() == other.type() && return_type() == other.return_type() &&
-         name() == other.name() && value() == other.value() &&
-         lhs_id() == other.lhs_id() && arguments() == other.arguments();
-}
-
-bool Expression::IsSemanticallyEquivalentTo(const Expression& other) const {
-  return type() == other.type() && name() == other.name() &&
-         value() == other.value() &&
-         arguments().size() == other.arguments().size();
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/codegen/expression_graph.cc b/internal/ceres/codegen/expression_graph.cc
deleted file mode 100644
index 59f20ea..0000000
--- a/internal/ceres/codegen/expression_graph.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/expression_graph.h"
-
-#include "glog/logging.h"
-namespace ceres {
-namespace internal {
-
-static ExpressionGraph* expression_pool = nullptr;
-
-void StartRecordingExpressions() {
-  CHECK(expression_pool == nullptr)
-      << "Expression recording must be stopped before calling "
-         "StartRecordingExpressions again.";
-  expression_pool = new ExpressionGraph;
-}
-
-ExpressionGraph StopRecordingExpressions() {
-  CHECK(expression_pool)
-      << "Expression recording hasn't started yet or you tried "
-         "to stop it twice.";
-  ExpressionGraph result = std::move(*expression_pool);
-  delete expression_pool;
-  expression_pool = nullptr;
-  return result;
-}
-
-ExpressionGraph* GetCurrentExpressionGraph() { return expression_pool; }
-
-bool ExpressionGraph::DependsOn(ExpressionId A, ExpressionId B) const {
-  // Depth first search on the expression graph
-  // Equivalent Recursive Implementation:
-  //   if (A.DirectlyDependsOn(B)) return true;
-  //   for (auto p : A.params_) {
-  //     if (pool[p.id].DependsOn(B, pool)) return true;
-  //   }
-  std::vector<ExpressionId> stack = ExpressionForId(A).arguments();
-  while (!stack.empty()) {
-    auto top = stack.back();
-    stack.pop_back();
-    if (top == B) {
-      return true;
-    }
-    auto& expr = ExpressionForId(top);
-    stack.insert(stack.end(), expr.arguments().begin(), expr.arguments().end());
-  }
-  return false;
-}
-
-bool ExpressionGraph::operator==(const ExpressionGraph& other) const {
-  if (Size() != other.Size()) {
-    return false;
-  }
-  for (ExpressionId id = 0; id < Size(); ++id) {
-    if (!(ExpressionForId(id) == other.ExpressionForId(id))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-void ExpressionGraph::Erase(ExpressionId location) {
-  CHECK_GE(location, 0);
-  CHECK_LT(location, Size());
-  // Move everything after id to the front and update references
-  for (ExpressionId id = location + 1; id < Size(); ++id) {
-    expressions_[id - 1] = expressions_[id];
-    auto& expression = expressions_[id - 1];
-    // Decrement reference if it points to a shifted variable.
-    if (expression.lhs_id() >= location) {
-      expression.set_lhs_id(expression.lhs_id() - 1);
-    }
-    for (auto& arg : *expression.mutable_arguments()) {
-      if (arg >= location) {
-        arg--;
-      }
-    }
-  }
-  expressions_.resize(Size() - 1);
-}
-
-void ExpressionGraph::Insert(ExpressionId location,
-                             const Expression& expression) {
-  CHECK_GE(location, 0);
-  CHECK_LE(location, Size());
-  ExpressionId last_expression_id = Size() - 1;
-  // Increase size by adding a dummy expression.
-  expressions_.push_back(Expression());
-
-  // Move everything after id back and update references
-  for (ExpressionId id = last_expression_id; id >= location; --id) {
-    auto& expression = expressions_[id];
-    // Increment reference if it points to a shifted variable.
-    if (expression.lhs_id() >= location) {
-      expression.set_lhs_id(expression.lhs_id() + 1);
-    }
-    for (auto& arg : *expression.mutable_arguments()) {
-      if (arg >= location) {
-        arg++;
-      }
-    }
-    expressions_[id + 1] = expression;
-  }
-
-  if (expression.IsControlExpression() ||
-      expression.lhs_id() != kInvalidExpressionId) {
-    // Insert new expression at the correct place
-    expressions_[location] = expression;
-  } else {
-    // Arithmetic expression with invalid lhs
-    // -> Set lhs to location
-    Expression copy = expression;
-    copy.set_lhs_id(location);
-    expressions_[location] = copy;
-  }
-}
-
-ExpressionId ExpressionGraph::InsertBack(const Expression& expression) {
-  if (expression.IsControlExpression()) {
-    // Control expression are just added to the list. We do not return a
-    // reference to them.
-    CHECK(expression.lhs_id() == kInvalidExpressionId)
-        << "Control expressions must have an invalid lhs.";
-    expressions_.push_back(expression);
-    return kInvalidExpressionId;
-  }
-
-  if (expression.lhs_id() == kInvalidExpressionId) {
-    // Create a new variable name for this expression and set it as the lhs
-    Expression copy = expression;
-    copy.set_lhs_id(static_cast<ExpressionId>(expressions_.size()));
-    expressions_.push_back(copy);
-  } else {
-    // The expressions writes to a variable declared in the past
-    // -> Just add it to the list
-    CHECK_LE(expression.lhs_id(), expressions_.size())
-        << "The left hand side must reference a variable in the past.";
-    expressions_.push_back(expression);
-  }
-
-  return Size() - 1;
-}
-
-ExpressionId ExpressionGraph::FindMatchingEndif(ExpressionId id) const {
-  CHECK(ExpressionForId(id).type() == ExpressionType::IF)
-      << "FindClosingControlExpression is only valid on IF "
-         "expressions.";
-
-  // Traverse downwards
-  for (ExpressionId i = id + 1; i < Size(); ++i) {
-    const auto& expr = ExpressionForId(i);
-    if (expr.type() == ExpressionType::ENDIF) {
-      return i;
-
-    } else if (expr.type() == ExpressionType::IF) {
-      // Found a nested IF.
-      // -> Jump over the block and continue behind it.
-      auto matching_endif = FindMatchingEndif(i);
-      if (matching_endif == kInvalidExpressionId) {
-        return kInvalidExpressionId;
-      }
-      i = matching_endif;
-      continue;
-    }
-  }
-  return kInvalidExpressionId;
-}
-
-ExpressionId ExpressionGraph::FindMatchingElse(ExpressionId id) const {
-  CHECK(ExpressionForId(id).type() == ExpressionType::IF)
-      << "FindClosingControlExpression is only valid on IF "
-         "expressions.";
-
-  // Traverse downwards
-  for (ExpressionId i = id + 1; i < Size(); ++i) {
-    const auto& expr = ExpressionForId(i);
-    if (expr.type() == ExpressionType::ELSE) {
-      // Found it!
-      return i;
-    } else if (expr.type() == ExpressionType::ENDIF) {
-      // Found an endif even though we were looking for an ELSE.
-      // -> Return invalidId
-      return kInvalidExpressionId;
-    } else if (expr.type() == ExpressionType::IF) {
-      // Found a nested IF.
-      // -> Jump over the block and continue behind it.
-      auto matching_endif = FindMatchingEndif(i);
-      if (matching_endif == kInvalidExpressionId) {
-        return kInvalidExpressionId;
-      }
-      i = matching_endif;
-      continue;
-    }
-  }
-  return kInvalidExpressionId;
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/codegen/expression_ref.cc b/internal/ceres/codegen/expression_ref.cc
deleted file mode 100644
index 369aec4..0000000
--- a/internal/ceres/codegen/expression_ref.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/expression_ref.h"
-
-#include "ceres/codegen/internal/expression_graph.h"
-#include "glog/logging.h"
-
-namespace ceres {
-namespace internal {
-
-ExpressionRef AddExpressionToGraph(const Expression& expression) {
-  return ExpressionRef(expression);
-}
-
-ExpressionRef::ExpressionRef(double compile_time_constant)
-    : ExpressionRef(
-          Expression::CreateCompileTimeConstant(compile_time_constant)) {}
-
-ExpressionRef::ExpressionRef(const Expression& expression) {
-  ExpressionGraph* graph = GetCurrentExpressionGraph();
-  CHECK(graph)
-      << "The ExpressionGraph has to be created before using Expressions. This "
-         "is achieved by calling ceres::StartRecordingExpressions.";
-  id = graph->InsertBack(expression);
-}
-
-ExpressionRef::ExpressionRef(const ExpressionRef& other) { *this = other; }
-
-ExpressionRef& ExpressionRef::operator=(const ExpressionRef& other) {
-  // Assigning an uninitialized variable to another variable is an error.
-  CHECK(other.IsInitialized()) << "Uninitialized Assignment.";
-  if (IsInitialized()) {
-    // Create assignment from other -> this
-    AddExpressionToGraph(Expression::CreateAssignment(this->id, other.id));
-  } else {
-    // Create a new variable and
-    // Create assignment from other -> this
-    // Passing kInvalidExpressionId to CreateAssignment generates a new
-    // variable name which we store in the id.
-    id = AddExpressionToGraph(
-             Expression::CreateAssignment(kInvalidExpressionId, other.id))
-             .id;
-  }
-  return *this;
-}
-
-// Compound operators
-ExpressionRef& ExpressionRef::operator+=(const ExpressionRef& x) {
-  *this = *this + x;
-  return *this;
-}
-
-ExpressionRef& ExpressionRef::operator-=(const ExpressionRef& x) {
-  *this = *this - x;
-  return *this;
-}
-
-ExpressionRef& ExpressionRef::operator*=(const ExpressionRef& x) {
-  *this = *this * x;
-  return *this;
-}
-
-ExpressionRef& ExpressionRef::operator/=(const ExpressionRef& x) {
-  *this = *this / x;
-  return *this;
-}
-
-// Arith. Operators
-ExpressionRef operator-(const ExpressionRef& x) {
-  return AddExpressionToGraph(Expression::CreateUnaryArithmetic("-", x.id));
-}
-
-ExpressionRef operator+(const ExpressionRef& x) {
-  return AddExpressionToGraph(Expression::CreateUnaryArithmetic("+", x.id));
-}
-
-ExpressionRef operator+(const ExpressionRef& x, const ExpressionRef& y) {
-  return AddExpressionToGraph(
-      Expression::CreateBinaryArithmetic("+", x.id, y.id));
-}
-
-ExpressionRef operator-(const ExpressionRef& x, const ExpressionRef& y) {
-  return AddExpressionToGraph(
-      Expression::CreateBinaryArithmetic("-", x.id, y.id));
-}
-
-ExpressionRef operator/(const ExpressionRef& x, const ExpressionRef& y) {
-  return AddExpressionToGraph(
-      Expression::CreateBinaryArithmetic("/", x.id, y.id));
-}
-
-ExpressionRef operator*(const ExpressionRef& x, const ExpressionRef& y) {
-  return AddExpressionToGraph(
-      Expression::CreateBinaryArithmetic("*", x.id, y.id));
-}
-
-ExpressionRef Ternary(const ComparisonExpressionRef& c,
-                      const ExpressionRef& x,
-                      const ExpressionRef& y) {
-  return AddExpressionToGraph(Expression::CreateScalarFunctionCall(
-      "ceres::Ternary", {c.id, x.id, y.id}));
-}
-
-#define CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(op)         \
-  ComparisonExpressionRef operator op(const ExpressionRef& x,   \
-                                      const ExpressionRef& y) { \
-    return ComparisonExpressionRef(AddExpressionToGraph(        \
-        Expression::CreateBinaryCompare(#op, x.id, y.id)));     \
-  }
-
-#define CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(op)                      \
-  ComparisonExpressionRef operator op(const ComparisonExpressionRef& x,   \
-                                      const ComparisonExpressionRef& y) { \
-    return ComparisonExpressionRef(AddExpressionToGraph(                  \
-        Expression::CreateBinaryCompare(#op, x.id, y.id)));               \
-  }
-
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(<)
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(<=)
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(>)
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(>=)
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(==)
-CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR(!=)
-CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(&&)
-CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(||)
-CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(&)
-CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR(|)
-#undef CERES_DEFINE_EXPRESSION_COMPARISON_OPERATOR
-#undef CERES_DEFINE_EXPRESSION_LOGICAL_OPERATOR
-
-ComparisonExpressionRef operator!(const ComparisonExpressionRef& x) {
-  return ComparisonExpressionRef(
-      AddExpressionToGraph(Expression::CreateLogicalNegation(x.id)));
-}
-
-}  // namespace internal
-}  // namespace ceres
diff --git a/internal/ceres/codegen/optimize_expression_graph.cc b/internal/ceres/codegen/optimize_expression_graph.cc
deleted file mode 100644
index 5414dc6..0000000
--- a/internal/ceres/codegen/optimize_expression_graph.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2019 Google Inc. All rights reserved.
-// http://code.google.com/p/ceres-solver/
-//
-// 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: darius.rueckert@fau.de (Darius Rueckert)
-
-#include "ceres/codegen/internal/optimize_expression_graph.h"
-
-#include "ceres/codegen/internal/eliminate_nops.h"
-#include "glog/logging.h"
-namespace ceres {
-namespace internal {
-
-OptimizeExpressionGraphSummary OptimizeExpressionGraph(
-    const OptimizeExpressionGraphOptions& options, ExpressionGraph* graph) {
-  OptimizeExpressionGraphSummary summary;
-  summary.num_iterations = 0;
-  while (summary.num_iterations < options.max_num_iterations) {
-    summary.num_iterations++;
-    bool changed = false;
-
-    if (options.eliminate_nops) {
-      auto pass_summary = EliminateNops(graph);
-      changed |= pass_summary.expression_graph_changed;
-      summary.summaries.push_back(pass_summary);
-    }
-
-    if (!changed) {
-      break;
-    }
-  }
-  return summary;
-}
-
-}  // namespace internal
-}  // namespace ceres