From 0e1cc2a55488e4cf381833baaa3531c02ce9d69e Mon Sep 17 00:00:00 2001 From: Sameer Agarwal Date: Fri, 29 Aug 2014 09:16:56 -0700 Subject: [PATCH] Fix the build on Eigen version 3.2.1 and older. Change-Id: I18f5cb5d42113737d7b8f78a67acee28bd5b3e08 --- internal/ceres/schur_complement_solver.h | 16 ++++++------- .../ceres/sparse_normal_cholesky_solver.cc | 2 ++ .../ceres/sparse_normal_cholesky_solver.h | 23 ++++++++++++++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/internal/ceres/schur_complement_solver.h b/internal/ceres/schur_complement_solver.h index d1efd28d0..1b431dc53 100644 --- a/internal/ceres/schur_complement_solver.h +++ b/internal/ceres/schur_complement_solver.h @@ -191,16 +191,16 @@ class SparseSchurComplementSolver : public SchurComplementSolver { #ifdef CERES_USE_EIGEN_SPARSE - // For Eigen versions less than 3.2.2, we cannot pre-order the - // Jacobian, so we must use an AMD ordering. + // The preprocessor gymnastics here are dealing with the fact that + // before version 3.2.2, Eigen did not support a third template + // parameter to specify the ordering. #if EIGEN_VERSION_AT_LEAST(3,2,2) - typedef Eigen::SimplicialLDLT, - Eigen::Lower, - Eigen::NaturalOrdering > SimplicialLDLT; + typedef Eigen::SimplicialLDLT, Eigen::Lower, + Eigen::NaturalOrdering > + SimplicialLDLT; #else - typedef Eigen::SimplicialLDLT, - Eigen::Lower, - Eigen::AMDOrdering > SimplicialLDLT; + typedef Eigen::SimplicialLDLT, Eigen::Lower> + SimplicialLDLT; #endif scoped_ptr simplicial_ldlt_; diff --git a/internal/ceres/sparse_normal_cholesky_solver.cc b/internal/ceres/sparse_normal_cholesky_solver.cc index e7da6a841..94f7e5803 100644 --- a/internal/ceres/sparse_normal_cholesky_solver.cc +++ b/internal/ceres/sparse_normal_cholesky_solver.cc @@ -252,6 +252,7 @@ LinearSolver::Summary SparseNormalCholeskySolver::SolveImplUsingEigen( &event_logger); } +#if EIGEN_VERSION_AT_LEAST(3,2,2) // The common case if (natural_ldlt_.get() == NULL) { natural_ldlt_.reset(new SimplicialLDLTWithNaturalOrdering); @@ -263,6 +264,7 @@ LinearSolver::Summary SparseNormalCholeskySolver::SolveImplUsingEigen( natural_ldlt_.get(), rhs_and_solution, &event_logger); +#endif #endif // EIGEN_USE_EIGEN_SPARSE } diff --git a/internal/ceres/sparse_normal_cholesky_solver.h b/internal/ceres/sparse_normal_cholesky_solver.h index d1efe00ba..12c052450 100644 --- a/internal/ceres/sparse_normal_cholesky_solver.h +++ b/internal/ceres/sparse_normal_cholesky_solver.h @@ -95,17 +95,28 @@ class SparseNormalCholeskySolver : public CompressedRowSparseMatrixSolver { cs_dis* cxsparse_factor_; #ifdef CERES_USE_EIGEN_SPARSE - typedef Eigen::SimplicialLDLT, - Eigen::Upper, + + // The preprocessor gymnastics here are dealing with the fact that + // before version 3.2.2, Eigen did not support a third template + // parameter to specify the ordering. +#if EIGEN_VERSION_AT_LEAST(3,2,2) + typedef Eigen::SimplicialLDLT, Eigen::Upper, Eigen::NaturalOrdering > SimplicialLDLTWithNaturalOrdering; - typedef Eigen::SimplicialLDLT, - Eigen::Upper, + scoped_ptr natural_ldlt_; + + typedef Eigen::SimplicialLDLT, Eigen::Upper, Eigen::AMDOrdering > SimplicialLDLTWithAMDOrdering; - - scoped_ptr natural_ldlt_; scoped_ptr amd_ldlt_; + +#else + typedef Eigen::SimplicialLDLT, Eigen::Upper> + SimplicialLDLTWithAMDOrdering; + + scoped_ptr amd_ldlt_; +#endif + #endif scoped_ptr outer_product_;