diff --git a/gtsam/3rdparty/Eigen/CMakeLists.txt b/gtsam/3rdparty/Eigen/CMakeLists.txt index db571727e..c66a14e0e 100644 --- a/gtsam/3rdparty/Eigen/CMakeLists.txt +++ b/gtsam/3rdparty/Eigen/CMakeLists.txt @@ -279,9 +279,15 @@ install(FILES ) if(EIGEN_BUILD_PKGCONFIG) + SET(path_separator ":") + STRING(REPLACE ${path_separator} ";" pkg_config_libdir_search "$ENV{PKG_CONFIG_LIBDIR}") + message(STATUS "searching for 'pkgconfig' directory in PKG_CONFIG_LIBDIR ( $ENV{PKG_CONFIG_LIBDIR} ), ${CMAKE_INSTALL_PREFIX}/share, and ${CMAKE_INSTALL_PREFIX}/lib") + FIND_PATH(pkg_config_libdir pkgconfig ${pkg_config_libdir_search} ${CMAKE_INSTALL_PREFIX}/share ${CMAKE_INSTALL_PREFIX}/lib ${pkg_config_libdir_search}) + message(STATUS "found ${pkg_config_libdir}/pkgconfig" ) + configure_file(eigen3.pc.in eigen3.pc) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/eigen3.pc - DESTINATION share/pkgconfig + DESTINATION ${pkg_config_libdir}/pkgconfig ) endif(EIGEN_BUILD_PKGCONFIG) @@ -321,9 +327,9 @@ endif() configure_file(${CMAKE_BINARY_DIR}/DartConfiguration.tcl ${CMAKE_BINARY_DIR}/DartConfiguration.tcl) # restore default CMAKE_MAKE_PROGRAM set(CMAKE_MAKE_PROGRAM ${CMAKE_MAKE_PROGRAM_SAVE}) -# un-set temporary variables so that it is like they never existed. +# un-set temporary variables so that it is like they never existed. # CMake 2.6.3 introduces the more logical unset() syntax for this. -set(CMAKE_MAKE_PROGRAM_SAVE) +set(CMAKE_MAKE_PROGRAM_SAVE) set(EIGEN_MAKECOMMAND_PLACEHOLDER) configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake) diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LDLT.h b/gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LDLT.h index 5e2352caa..f47b2ea56 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LDLT.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Cholesky/LDLT.h @@ -158,10 +158,19 @@ template class LDLT } /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A. + * + * This function also supports in-place solves using the syntax x = decompositionObject.solve(x) . * * \note_about_checking_solutions * - * \sa solveInPlace(), MatrixBase::ldlt() + * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$ + * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$, + * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then + * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the + * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function + * computes the least-square solution of \f$ A x = b \f$ is \f$ A \f$ is singular. + * + * \sa MatrixBase::ldlt() */ template inline const internal::solve_retval @@ -376,7 +385,21 @@ struct solve_retval, Rhs> dec().matrixL().solveInPlace(dst); // dst = D^-1 (L^-1 P b) - dst = dec().vectorD().asDiagonal().inverse() * dst; + // more precisely, use pseudo-inverse of D (see bug 241) + using std::abs; + using std::max; + typedef typename LDLTType::MatrixType MatrixType; + typedef typename LDLTType::Scalar Scalar; + typedef typename LDLTType::RealScalar RealScalar; + const Diagonal vectorD = dec().vectorD(); + RealScalar tolerance = (max)(vectorD.array().abs().maxCoeff() * NumTraits::epsilon(), + RealScalar(1) / NumTraits::highest()); // motivated by LAPACK's xGELSS + for (Index i = 0; i < vectorD.size(); ++i) { + if(abs(vectorD(i)) > tolerance) + dst.row(i) /= vectorD(i); + else + dst.row(i).setZero(); + } // dst = L^-T (D^-1 L^-1 P b) dec().matrixU().solveInPlace(dst); diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/Fuzzy.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/Fuzzy.h index 1926d6ab4..d266eed0a 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/Fuzzy.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/Fuzzy.h @@ -94,7 +94,7 @@ struct isMuchSmallerThan_scalar_selector * * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$ * are considered to be approximately equal within precision \f$ p \f$ if - * \f[ \Vert v - w \Vert \leqslant p\,\(min)(\Vert v\Vert, \Vert w\Vert). \f] + * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f] * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm * L2 norm). * diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/Map.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/Map.h index 81e3979f3..dd0673609 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/Map.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/Map.h @@ -34,7 +34,7 @@ * \tparam PlainObjectType the equivalent matrix type of the mapped data * \tparam MapOptions specifies whether the pointer is \c #Aligned, or \c #Unaligned. * The default is \c #Unaligned. - * \tparam StrideType optionnally specifies strides. By default, Map assumes the memory layout + * \tparam StrideType optionally specifies strides. By default, Map assumes the memory layout * of an ordinary, contiguous array. This can be overridden by specifying strides. * The type passed here must be a specialization of the Stride template, see examples below. * @@ -72,9 +72,9 @@ * Example: \include Map_placement_new.cpp * Output: \verbinclude Map_placement_new.out * - * This class is the return type of Matrix::Map() but can also be used directly. + * This class is the return type of PlainObjectBase::Map() but can also be used directly. * - * \sa Matrix::Map(), \ref TopicStorageOrders + * \sa PlainObjectBase::Map(), \ref TopicStorageOrders */ namespace internal { diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/MatrixBase.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/MatrixBase.h index db156f6e9..62877bce0 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/MatrixBase.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/MatrixBase.h @@ -250,7 +250,8 @@ template class MatrixBase // huuuge hack. make Eigen2's matrix.part() work in eigen3. Problem: Diagonal is now a class template instead // of an integer constant. Solution: overload the part() method template wrt template parameters list. - template class U> + // Note: replacing next line by "template class U>" produces a mysterious error C2082 in MSVC. + template class U> const DiagonalWrapper part() const { return diagonal().asDiagonal(); } #endif // EIGEN2_SUPPORT diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h index ed34b0ed9..c70db9247 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/PlainObjectBase.h @@ -425,9 +425,6 @@ class PlainObjectBase : public internal::dense_xpr_base::type * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned * \a data pointers. * - * These methods do not allow to specify strides. If you need to specify strides, you have to - * use the Map class directly. - * * \see class Map */ //@{ diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/ProductBase.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/ProductBase.h index 3bd3487d6..233ed6467 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/ProductBase.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/ProductBase.h @@ -256,16 +256,16 @@ class ScaledProduct : Base(prod.lhs(),prod.rhs()), m_prod(prod), m_alpha(x) {} template - inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst,m_alpha); } + inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst, Scalar(1)); } template - inline void addTo(Dest& dst) const { scaleAndAddTo(dst,m_alpha); } + inline void addTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(1)); } template - inline void subTo(Dest& dst) const { scaleAndAddTo(dst,-m_alpha); } + inline void subTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(-1)); } template - inline void scaleAndAddTo(Dest& dst,Scalar alpha) const { m_prod.derived().scaleAndAddTo(dst,alpha); } + inline void scaleAndAddTo(Dest& dst,Scalar alpha) const { m_prod.derived().scaleAndAddTo(dst,alpha * m_alpha); } const Scalar& alpha() const { return m_alpha; } diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Core/SolveTriangular.h b/gtsam/3rdparty/Eigen/Eigen/src/Core/SolveTriangular.h index 71e129c7f..a23014a34 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Core/SolveTriangular.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Core/SolveTriangular.h @@ -180,7 +180,7 @@ void TriangularView::solveInPlace(const MatrixBase::Flags & RowMajorBit && OtherDerived::IsVectorAtCompileTime }; typedef typename internal::conditionalx || (EIGEN_WORLD_VERSION>=x && \ (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \ diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h b/gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h index 6ad846d35..78df29d40 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Eigen2Support/Geometry/AlignedBox.h @@ -51,19 +51,19 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== { if (AmbientDimAtCompileTime!=Dynamic) setNull(); } /** Constructs a null box with \a _dim the dimension of the ambient space. */ - inline explicit AlignedBox(int _dim) : m_(min)(_dim), m_(max)(_dim) + inline explicit AlignedBox(int _dim) : m_min(_dim), m_max(_dim) { setNull(); } /** Constructs a box with extremities \a _min and \a _max. */ - inline AlignedBox(const VectorType& _min, const VectorType& _max) : m_(min)(_min), m_(max)(_max) {} + inline AlignedBox(const VectorType& _min, const VectorType& _max) : m_min(_min), m_max(_max) {} /** Constructs a box containing a single point \a p. */ - inline explicit AlignedBox(const VectorType& p) : m_(min)(p), m_(max)(p) {} + inline explicit AlignedBox(const VectorType& p) : m_min(p), m_max(p) {} ~AlignedBox() {} /** \returns the dimension in which the box holds */ - inline int dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size()-1 : AmbientDimAtCompileTime; } + inline int dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size()-1 : int(AmbientDimAtCompileTime); } /** \returns true if the box is null, i.e, empty. */ inline bool isNull() const { return (m_min.cwise() > m_max).any(); } @@ -71,8 +71,8 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== /** Makes \c *this a null/empty box. */ inline void setNull() { - m_min.setConstant( std::numeric_limits::(max)()); - m_max.setConstant(-std::numeric_limits::(max)()); + m_min.setConstant( (std::numeric_limits::max)()); + m_max.setConstant(-(std::numeric_limits::max)()); } /** \returns the minimal corner */ @@ -90,19 +90,19 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== /** \returns true if the box \a b is entirely inside the box \c *this. */ inline bool contains(const AlignedBox& b) const - { return (m_min.cwise()<=b.(min)()).all() && (b.(max)().cwise()<=m_max).all(); } + { return (m_min.cwise()<=(b.min)()).all() && ((b.max)().cwise()<=m_max).all(); } /** Extends \c *this such that it contains the point \a p and returns a reference to \c *this. */ inline AlignedBox& extend(const VectorType& p) - { m_min = m_min.cwise().(min)(p); m_max = m_max.cwise().(max)(p); return *this; } + { m_min = (m_min.cwise().min)(p); m_max = (m_max.cwise().max)(p); return *this; } /** Extends \c *this such that it contains the box \a b and returns a reference to \c *this. */ inline AlignedBox& extend(const AlignedBox& b) - { m_min = m_min.cwise().(min)(b.m_min); m_max = m_max.cwise().(max)(b.m_max); return *this; } + { m_min = (m_min.cwise().min)(b.m_min); m_max = (m_max.cwise().max)(b.m_max); return *this; } /** Clamps \c *this by the box \a b and returns a reference to \c *this. */ inline AlignedBox& clamp(const AlignedBox& b) - { m_min = m_min.cwise().(max)(b.m_min); m_max = m_max.cwise().(min)(b.m_max); return *this; } + { m_min = (m_min.cwise().max)(b.m_min); m_max = (m_max.cwise().min)(b.m_max); return *this; } /** Translate \c *this by the vector \a t and returns a reference to \c *this. */ inline AlignedBox& translate(const VectorType& t) @@ -138,8 +138,8 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim== template inline explicit AlignedBox(const AlignedBox& other) { - m_min = other.(min)().template cast(); - m_max = other.(max)().template cast(); + m_min = (other.min)().template cast(); + m_max = (other.max)().template cast(); } /** \returns \c true if \c *this is approximately equal to \a other, within the precision diff --git a/gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD.h b/gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD.h index 5f6139998..c2326d752 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/SVD/JacobiSVD.h @@ -590,6 +590,9 @@ JacobiSVD::compute(const MatrixType& matrix, unsig // only worsening the precision of U and V as we accumulate more rotations const RealScalar precision = RealScalar(2) * NumTraits::epsilon(); + // limit for very small denormal numbers to be considered zero in order to avoid infinite loops (see bug 286) + const RealScalar considerAsZero = RealScalar(2) * std::numeric_limits::denorm_min(); + /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */ if(!internal::qr_preconditioner_impl::run(*this, matrix) @@ -617,10 +620,11 @@ JacobiSVD::compute(const MatrixType& matrix, unsig { // if this 2x2 sub-matrix is not diagonal already... // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't - // keep us iterating forever. + // keep us iterating forever. Similarly, small denormal numbers are considered zero. using std::max; - if((max)(internal::abs(m_workMatrix.coeff(p,q)),internal::abs(m_workMatrix.coeff(q,p))) - > (max)(internal::abs(m_workMatrix.coeff(p,p)),internal::abs(m_workMatrix.coeff(q,q)))*precision) + RealScalar threshold = (max)(considerAsZero, precision * (max)(internal::abs(m_workMatrix.coeff(p,p)), + internal::abs(m_workMatrix.coeff(q,q)))); + if((max)(internal::abs(m_workMatrix.coeff(p,q)),internal::abs(m_workMatrix.coeff(q,p))) > threshold) { finished = false; diff --git a/gtsam/3rdparty/Eigen/Eigen/src/Sparse/TriangularSolver.h b/gtsam/3rdparty/Eigen/Eigen/src/Sparse/TriangularSolver.h index 73468e044..62bb8bb44 100644 --- a/gtsam/3rdparty/Eigen/Eigen/src/Sparse/TriangularSolver.h +++ b/gtsam/3rdparty/Eigen/Eigen/src/Sparse/TriangularSolver.h @@ -171,7 +171,7 @@ void SparseTriangularView::solveInPlace(MatrixBase::Flags & RowMajorBit }; @@ -298,7 +298,7 @@ void SparseTriangularView::solveInPlace(SparseMatrixBase::Flags & RowMajorBit }; diff --git a/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox b/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox index aea0b6642..452abda10 100644 --- a/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox +++ b/gtsam/3rdparty/Eigen/doc/C08_TutorialGeometry.dox @@ -147,7 +147,7 @@ OpenGL compatibility \b 3D \code glLoadMatrixf(t.data());\endcode OpenGL compatibility \b 2D \code -Affine3f aux(Affine3f::Identity); +Affine3f aux(Affine3f::Identity()); aux.linear().topLeftCorner<2,2>() = t.linear(); aux.translation().start<2>() = t.translation(); glLoadMatrixf(aux.data());\endcode diff --git a/gtsam/3rdparty/Eigen/test/cholesky.cpp b/gtsam/3rdparty/Eigen/test/cholesky.cpp index 293a375ad..ae4342cee 100644 --- a/gtsam/3rdparty/Eigen/test/cholesky.cpp +++ b/gtsam/3rdparty/Eigen/test/cholesky.cpp @@ -245,6 +245,22 @@ template void cholesky_cplx(const MatrixType& m) } +// regression test for bug 241 +template void cholesky_bug241(const MatrixType& m) +{ + eigen_assert(m.rows() == 2 && m.cols() == 2); + + typedef typename MatrixType::Scalar Scalar; + typedef Matrix VectorType; + + MatrixType matA; + matA << 1, 1, 1, 1; + VectorType vecB; + vecB << 1, 1; + VectorType vecX = matA.ldlt().solve(vecB); + VERIFY_IS_APPROX(matA * vecX, vecB); +} + template void cholesky_verify_assert() { MatrixType tmp; @@ -271,6 +287,7 @@ void test_cholesky() for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( cholesky(Matrix()) ); CALL_SUBTEST_3( cholesky(Matrix2d()) ); + CALL_SUBTEST_3( cholesky_bug241(Matrix2d()) ); CALL_SUBTEST_4( cholesky(Matrix3f()) ); CALL_SUBTEST_5( cholesky(Matrix4d()) ); s = internal::random(1,200); diff --git a/gtsam/3rdparty/Eigen/test/eigen2/main.h b/gtsam/3rdparty/Eigen/test/eigen2/main.h index 9d0defa39..b361a44d9 100644 --- a/gtsam/3rdparty/Eigen/test/eigen2/main.h +++ b/gtsam/3rdparty/Eigen/test/eigen2/main.h @@ -29,6 +29,10 @@ #include #include +#ifdef NDEBUG +#undef NDEBUG +#endif + #ifndef EIGEN_TEST_FUNC #error EIGEN_TEST_FUNC must be defined #endif diff --git a/gtsam/3rdparty/Eigen/test/householder.cpp b/gtsam/3rdparty/Eigen/test/householder.cpp index 8031025e5..e77fa7ad0 100644 --- a/gtsam/3rdparty/Eigen/test/householder.cpp +++ b/gtsam/3rdparty/Eigen/test/householder.cpp @@ -48,7 +48,7 @@ template void householder(const MatrixType& m) typedef Matrix VBlockMatrixType; typedef Matrix TMatrixType; - Matrix _tmp(std::max(rows,cols)); + Matrix _tmp((std::max)(rows,cols)); Scalar* tmp = &_tmp.coeffRef(0,0); Scalar beta; diff --git a/gtsam/3rdparty/Eigen/test/jacobisvd.cpp b/gtsam/3rdparty/Eigen/test/jacobisvd.cpp index 907b290af..45873832a 100644 --- a/gtsam/3rdparty/Eigen/test/jacobisvd.cpp +++ b/gtsam/3rdparty/Eigen/test/jacobisvd.cpp @@ -66,7 +66,7 @@ void jacobisvd_compare_to_full(const MatrixType& m, typedef typename MatrixType::Index Index; Index rows = m.rows(); Index cols = m.cols(); - Index diagSize = std::min(rows, cols); + Index diagSize = (std::min)(rows, cols); JacobiSVD svd(m, computationOptions); @@ -244,6 +244,17 @@ void jacobisvd_inf_nan() svd.compute(m, ComputeFullU | ComputeFullV); } +// Regression test for bug 286: JacobiSVD loops indefinitely with some +// matrices containing denormal numbers. +void jacobisvd_bug286() +{ + Matrix2d M; + M << -7.90884e-313, -4.94e-324, + 0, 5.60844e-313; + JacobiSVD svd; + svd.compute(M); // just check we don't loop indefinitely +} + void jacobisvd_preallocate() { Vector3f v(3.f, 2.f, 1.f); @@ -280,8 +291,6 @@ void jacobisvd_preallocate() internal::set_is_malloc_allowed(false); svd2.compute(m, ComputeFullU|ComputeFullV); internal::set_is_malloc_allowed(true); - - } void test_jacobisvd() @@ -336,4 +345,7 @@ void test_jacobisvd() // Check that preallocation avoids subsequent mallocs CALL_SUBTEST_9( jacobisvd_preallocate() ); + + // Regression check for bug 286 + CALL_SUBTEST_2( jacobisvd_bug286() ); } diff --git a/gtsam/3rdparty/Eigen/test/lu.cpp b/gtsam/3rdparty/Eigen/test/lu.cpp index eac7c1ee6..552364d29 100644 --- a/gtsam/3rdparty/Eigen/test/lu.cpp +++ b/gtsam/3rdparty/Eigen/test/lu.cpp @@ -64,7 +64,7 @@ template void lu_non_invertible() typedef Matrix RMatrixType; - Index rank = internal::random(1, std::min(rows, cols)-1); + Index rank = internal::random(1, (std::min)(rows, cols)-1); // The image of the zero matrix should consist of a single (zero) column vector VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1)); @@ -84,8 +84,8 @@ template void lu_non_invertible() MatrixType u(rows,cols); u = lu.matrixLU().template triangularView(); RMatrixType l = RMatrixType::Identity(rows,rows); - l.block(0,0,rows,std::min(rows,cols)).template triangularView() - = lu.matrixLU().block(0,0,rows,std::min(rows,cols)); + l.block(0,0,rows,(std::min)(rows,cols)).template triangularView() + = lu.matrixLU().block(0,0,rows,(std::min)(rows,cols)); VERIFY_IS_APPROX(lu.permutationP() * m1 * lu.permutationQ(), l*u); diff --git a/gtsam/3rdparty/Eigen/test/main.h b/gtsam/3rdparty/Eigen/test/main.h index a8c6303b0..4ddd11e6b 100644 --- a/gtsam/3rdparty/Eigen/test/main.h +++ b/gtsam/3rdparty/Eigen/test/main.h @@ -23,9 +23,6 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see . -#define min(A,B) please_protect_your_min_with_parentheses -#define max(A,B) please_protect_your_max_with_parentheses - #include #include #include @@ -33,6 +30,15 @@ #include #include #include +#include +#include +#include +#include +#include +#include + +#define min(A,B) please_protect_your_min_with_parentheses +#define max(A,B) please_protect_your_max_with_parentheses #ifdef NDEBUG #undef NDEBUG diff --git a/gtsam/3rdparty/Eigen/test/nullary.cpp b/gtsam/3rdparty/Eigen/test/nullary.cpp index 0bde253df..0df15c081 100644 --- a/gtsam/3rdparty/Eigen/test/nullary.cpp +++ b/gtsam/3rdparty/Eigen/test/nullary.cpp @@ -38,7 +38,7 @@ bool equalsIdentity(const MatrixType& A) } } for (Index i = 0; i < A.rows(); ++i) { - for (Index j = 0; j < std::min(i, A.cols()); ++j) { + for (Index j = 0; j < (std::min)(i, A.cols()); ++j) { offDiagOK = offDiagOK && (A(i,j) == zero); } } diff --git a/gtsam/3rdparty/Eigen/test/packetmath.cpp b/gtsam/3rdparty/Eigen/test/packetmath.cpp index a7a0cd132..279f080b0 100644 --- a/gtsam/3rdparty/Eigen/test/packetmath.cpp +++ b/gtsam/3rdparty/Eigen/test/packetmath.cpp @@ -128,7 +128,7 @@ template void packetmath() { data1[i] = internal::random()/RealScalar(PacketSize); data2[i] = internal::random()/RealScalar(PacketSize); - refvalue = std::max(refvalue,internal::abs(data1[i])); + refvalue = (std::max)(refvalue,internal::abs(data1[i])); } internal::pstore(data2, internal::pload(data1)); @@ -264,16 +264,16 @@ template void packetmath_real() ref[0] = data1[0]; for (int i=0; i(data1))) && "internal::predux_min"); - CHECK_CWISE2(std::min, internal::pmin); - CHECK_CWISE2(std::max, internal::pmax); + CHECK_CWISE2((std::min), internal::pmin); + CHECK_CWISE2((std::max), internal::pmax); CHECK_CWISE1(internal::abs, internal::pabs); ref[0] = data1[0]; for (int i=0; i(data1))) && "internal::predux_max"); for (int i=0; i void inverse_general_4x4(int repeat) MatrixType inv = m.inverse(); double error = double( (m*inv-MatrixType::Identity()).norm() * absdet / NumTraits::epsilon() ); error_sum += error; - error_max = std::max(error_max, error); + error_max = (std::max)(error_max, error); } std::cerr << "inverse_general_4x4, Scalar = " << type_name() << std::endl; double error_avg = error_sum / repeat; diff --git a/gtsam/3rdparty/Eigen/test/product.h b/gtsam/3rdparty/Eigen/test/product.h index 101766b18..40ae4d51b 100644 --- a/gtsam/3rdparty/Eigen/test/product.h +++ b/gtsam/3rdparty/Eigen/test/product.h @@ -29,7 +29,7 @@ template bool areNotApprox(const MatrixBase& m1, const MatrixBase& m2, typename Derived1::RealScalar epsilon = NumTraits::dummy_precision()) { return !((m1-m2).cwiseAbs2().maxCoeff() < epsilon * epsilon - * std::max(m1.cwiseAbs2().maxCoeff(), m2.cwiseAbs2().maxCoeff())); + * (std::max)(m1.cwiseAbs2().maxCoeff(), m2.cwiseAbs2().maxCoeff())); } template void product(const MatrixType& m) @@ -102,7 +102,7 @@ template void product(const MatrixType& m) // test the previous tests were not screwed up because operator* returns 0 // (we use the more accurate default epsilon) - if (!NumTraits::IsInteger && std::min(rows,cols)>1) + if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) { VERIFY(areNotApprox(m1.transpose()*m2,m2.transpose()*m1)); } @@ -111,7 +111,7 @@ template void product(const MatrixType& m) res = square; res.noalias() += m1 * m2.transpose(); VERIFY_IS_APPROX(res, square + m1 * m2.transpose()); - if (!NumTraits::IsInteger && std::min(rows,cols)>1) + if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) { VERIFY(areNotApprox(res,square + m2 * m1.transpose())); } @@ -123,7 +123,7 @@ template void product(const MatrixType& m) res = square; res.noalias() -= m1 * m2.transpose(); VERIFY_IS_APPROX(res, square - (m1 * m2.transpose())); - if (!NumTraits::IsInteger && std::min(rows,cols)>1) + if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) { VERIFY(areNotApprox(res,square - m2 * m1.transpose())); } @@ -147,7 +147,7 @@ template void product(const MatrixType& m) res2 = square2; res2.noalias() += m1.transpose() * m2; VERIFY_IS_APPROX(res2, square2 + m1.transpose() * m2); - if (!NumTraits::IsInteger && std::min(rows,cols)>1) + if (!NumTraits::IsInteger && (std::min)(rows,cols)>1) { VERIFY(areNotApprox(res2,square2 + m2.transpose() * m1)); } diff --git a/gtsam/3rdparty/Eigen/test/product_extra.cpp b/gtsam/3rdparty/Eigen/test/product_extra.cpp index 60f00a4da..15dc5ab96 100644 --- a/gtsam/3rdparty/Eigen/test/product_extra.cpp +++ b/gtsam/3rdparty/Eigen/test/product_extra.cpp @@ -116,6 +116,16 @@ template void product_extra(const MatrixType& m) VERIFY_IS_APPROX(tmp, m1 * m1.adjoint() * s1); } +// Regression test for bug reported at http://forum.kde.org/viewtopic.php?f=74&t=96947 +void mat_mat_scalar_scalar_product() +{ + Eigen::Matrix2Xd dNdxy(2, 3); + dNdxy << -0.5, 0.5, 0, + -0.3, 0, 0.3; + double det = 6.0, wt = 0.5; + VERIFY_IS_APPROX(dNdxy.transpose()*dNdxy*det*wt, det*wt*dNdxy.transpose()*dNdxy); +} + void zero_sized_objects() { // Bug 127 @@ -145,6 +155,7 @@ void test_product_extra() for(int i = 0; i < g_repeat; i++) { CALL_SUBTEST_1( product_extra(MatrixXf(internal::random(1,320), internal::random(1,320))) ); CALL_SUBTEST_2( product_extra(MatrixXd(internal::random(1,320), internal::random(1,320))) ); + CALL_SUBTEST_2( mat_mat_scalar_scalar_product() ); CALL_SUBTEST_3( product_extra(MatrixXcf(internal::random(1,150), internal::random(1,150))) ); CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random(1,150), internal::random(1,150))) ); CALL_SUBTEST_5( zero_sized_objects() ); diff --git a/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp b/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp index ddfb1bad5..3cf651fa7 100644 --- a/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp +++ b/gtsam/3rdparty/Eigen/test/qr_colpivoting.cpp @@ -31,7 +31,7 @@ template void qr() typedef typename MatrixType::Index Index; Index rows = internal::random(2,200), cols = internal::random(2,200), cols2 = internal::random(2,200); - Index rank = internal::random(1, std::min(rows, cols)-1); + Index rank = internal::random(1, (std::min)(rows, cols)-1); typedef typename MatrixType::Scalar Scalar; typedef typename MatrixType::RealScalar RealScalar; @@ -64,7 +64,7 @@ template void qr_fixedsize() { enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; typedef typename MatrixType::Scalar Scalar; - int rank = internal::random(1, std::min(int(Rows), int(Cols))-1); + int rank = internal::random(1, (std::min)(int(Rows), int(Cols))-1); Matrix m1; createRandomPIMatrixOfRank(rank,Rows,Cols,m1); ColPivHouseholderQR > qr(m1); diff --git a/gtsam/3rdparty/Eigen/test/qr_fullpivoting.cpp b/gtsam/3rdparty/Eigen/test/qr_fullpivoting.cpp index 175c293b3..d281b26a8 100644 --- a/gtsam/3rdparty/Eigen/test/qr_fullpivoting.cpp +++ b/gtsam/3rdparty/Eigen/test/qr_fullpivoting.cpp @@ -31,7 +31,7 @@ template void qr() typedef typename MatrixType::Index Index; Index rows = internal::random(20,200), cols = internal::random(20,200), cols2 = internal::random(20,200); - Index rank = internal::random(1, std::min(rows, cols)-1); + Index rank = internal::random(1, (std::min)(rows, cols)-1); typedef typename MatrixType::Scalar Scalar; typedef Matrix MatrixQType; diff --git a/gtsam/3rdparty/Eigen/test/redux.cpp b/gtsam/3rdparty/Eigen/test/redux.cpp index 57b4603c5..a8bcf3b51 100644 --- a/gtsam/3rdparty/Eigen/test/redux.cpp +++ b/gtsam/3rdparty/Eigen/test/redux.cpp @@ -43,8 +43,8 @@ template void matrixRedux(const MatrixType& m) { s += m1(i,j); p *= m1(i,j); - minc = std::min(internal::real(minc), internal::real(m1(i,j))); - maxc = std::max(internal::real(maxc), internal::real(m1(i,j))); + minc = (std::min)(internal::real(minc), internal::real(m1(i,j))); + maxc = (std::max)(internal::real(maxc), internal::real(m1(i,j))); } const Scalar mean = s/Scalar(RealScalar(rows*cols)); @@ -86,8 +86,8 @@ template void vectorRedux(const VectorType& w) { s += v[j]; p *= v[j]; - minc = std::min(minc, internal::real(v[j])); - maxc = std::max(maxc, internal::real(v[j])); + minc = (std::min)(minc, internal::real(v[j])); + maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.head(i).sum()), Scalar(1)); VERIFY_IS_APPROX(p, v.head(i).prod()); @@ -103,8 +103,8 @@ template void vectorRedux(const VectorType& w) { s += v[j]; p *= v[j]; - minc = std::min(minc, internal::real(v[j])); - maxc = std::max(maxc, internal::real(v[j])); + minc = (std::min)(minc, internal::real(v[j])); + maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.tail(size-i).sum()), Scalar(1)); VERIFY_IS_APPROX(p, v.tail(size-i).prod()); @@ -120,8 +120,8 @@ template void vectorRedux(const VectorType& w) { s += v[j]; p *= v[j]; - minc = std::min(minc, internal::real(v[j])); - maxc = std::max(maxc, internal::real(v[j])); + minc = (std::min)(minc, internal::real(v[j])); + maxc = (std::max)(maxc, internal::real(v[j])); } VERIFY_IS_MUCH_SMALLER_THAN(internal::abs(s - v.segment(i, size-2*i).sum()), Scalar(1)); VERIFY_IS_APPROX(p, v.segment(i, size-2*i).prod()); diff --git a/gtsam/3rdparty/Eigen/test/sparse.h b/gtsam/3rdparty/Eigen/test/sparse.h index 949a597fc..cc9da4855 100644 --- a/gtsam/3rdparty/Eigen/test/sparse.h +++ b/gtsam/3rdparty/Eigen/test/sparse.h @@ -29,6 +29,15 @@ #include "main.h" #if EIGEN_GNUC_AT_LEAST(4,0) && !defined __ICC && !defined(__clang__) + +#ifdef min +#undef min +#endif + +#ifdef max +#undef max +#endif + #include #define EIGEN_UNORDERED_MAP_SUPPORT namespace std { diff --git a/gtsam/3rdparty/Eigen/test/sparse_basic.cpp b/gtsam/3rdparty/Eigen/test/sparse_basic.cpp index 9d79ca740..6f54d2ebc 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_basic.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_basic.cpp @@ -33,7 +33,7 @@ template void sparse_basic(const SparseMatrixType& re typedef typename SparseMatrixType::Scalar Scalar; enum { Flags = SparseMatrixType::Flags }; - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; Scalar eps = 1e-6; @@ -206,7 +206,7 @@ template void sparse_basic(const SparseMatrixType& re initSparse(density, refMat2, m2); int j0 = internal::random(0,rows-2); int j1 = internal::random(0,rows-2); - int n0 = internal::random(1,rows-std::max(j0,j1)); + int n0 = internal::random(1,rows-(std::max)(j0,j1)); VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0)); VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0), refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0)); diff --git a/gtsam/3rdparty/Eigen/test/sparse_product.cpp b/gtsam/3rdparty/Eigen/test/sparse_product.cpp index 90ec3781e..a53ab3f1b 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_product.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_product.cpp @@ -32,7 +32,7 @@ template void sparse_product(const SparseMatrixType& typedef typename SparseMatrixType::Scalar Scalar; enum { Flags = SparseMatrixType::Flags }; - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; diff --git a/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp b/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp index aba61e6c0..12a1cb9b6 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_solvers.cpp @@ -47,7 +47,7 @@ initSPD(double density, template void sparse_solvers(int rows, int cols) { - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; // Scalar eps = 1e-6; diff --git a/gtsam/3rdparty/Eigen/test/sparse_vector.cpp b/gtsam/3rdparty/Eigen/test/sparse_vector.cpp index be85740c0..e0c281c83 100644 --- a/gtsam/3rdparty/Eigen/test/sparse_vector.cpp +++ b/gtsam/3rdparty/Eigen/test/sparse_vector.cpp @@ -26,8 +26,8 @@ template void sparse_vector(int rows, int cols) { - double densityMat = std::max(8./(rows*cols), 0.01); - double densityVec = std::max(8./float(rows), 0.1); + double densityMat = (std::max)(8./(rows*cols), 0.01); + double densityVec = (std::max)(8./float(rows), 0.1); typedef Matrix DenseMatrix; typedef Matrix DenseVector; typedef SparseVector SparseVectorType; diff --git a/gtsam/3rdparty/Eigen/test/stable_norm.cpp b/gtsam/3rdparty/Eigen/test/stable_norm.cpp index 5bf249577..206a274d6 100644 --- a/gtsam/3rdparty/Eigen/test/stable_norm.cpp +++ b/gtsam/3rdparty/Eigen/test/stable_norm.cpp @@ -68,8 +68,8 @@ template void stable_norm(const MatrixType& m) Index rows = m.rows(); Index cols = m.cols(); - Scalar big = internal::random() * (std::numeric_limits::max() * RealScalar(1e-4)); - Scalar small = internal::random() * (std::numeric_limits::min() * RealScalar(1e4)); + Scalar big = internal::random() * ((std::numeric_limits::max)() * RealScalar(1e-4)); + Scalar small = internal::random() * ((std::numeric_limits::min)() * RealScalar(1e4)); MatrixType vzero = MatrixType::Zero(rows, cols), vrand = MatrixType::Random(rows, cols), diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT b/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT index 0b2823058..c56bd63d6 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/FFT @@ -331,7 +331,7 @@ class FFT // if the vector is strided, then we need to copy it to a packed temporary Matrix tmp; if ( resize_input ) { - size_t ncopy = std::min(src.size(),src.size() + resize_input); + size_t ncopy = (std::min)(src.size(),src.size() + resize_input); tmp.setZero(src.size() + resize_input); if ( realfft && HasFlag(HalfSpectrum) ) { // pad at the Nyquist bin diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h index e6fdf4737..d65a97740 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/BVH/BVAlgorithms.h @@ -231,7 +231,7 @@ private: template typename Minimizer::Scalar BVMinimize(const BVH &tree, Minimizer &minimizer) { - return internal::minimize_helper(tree, minimizer, tree.getRootIndex(), std::numeric_limits::max()); + return internal::minimize_helper(tree, minimizer, tree.getRootIndex(), (std::numeric_limits::max)()); } /** Given two BVH's, runs the query on their cartesian product encapsulated by \a minimizer. @@ -264,7 +264,7 @@ typename Minimizer::Scalar BVMinimize(const BVH1 &tree1, const BVH2 &tree2, Mini ObjIter2 oBegin2 = ObjIter2(), oEnd2 = ObjIter2(), oCur2 = ObjIter2(); std::priority_queue, std::greater > todo; //smallest is at the top - Scalar minimum = std::numeric_limits::max(); + Scalar minimum = (std::numeric_limits::max)(); todo.push(std::make_pair(Scalar(), std::make_pair(tree1.getRootIndex(), tree2.getRootIndex()))); while(!todo.empty()) { diff --git a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h index cedb1d551..50c0ca84e 100644 --- a/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h +++ b/gtsam/3rdparty/Eigen/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h @@ -259,7 +259,7 @@ void MatrixExponential::computeUV(float) pade5(m_M); } else { const float maxnorm = 3.925724783138660f; - m_squarings = max(0, (int)ceil(log2(m_l1norm / maxnorm))); + m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); MatrixType A = m_M / pow(Scalar(2), Scalar(static_cast(m_squarings))); pade7(A); } @@ -281,7 +281,7 @@ void MatrixExponential::computeUV(double) pade9(m_M); } else { const double maxnorm = 5.371920351148152; - m_squarings = max(0, (int)ceil(log2(m_l1norm / maxnorm))); + m_squarings = (max)(0, (int)ceil(log2(m_l1norm / maxnorm))); MatrixType A = m_M / pow(Scalar(2), Scalar(m_squarings)); pade13(A); } diff --git a/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp b/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp index d773afb77..e77e84b6d 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/BVH.cpp @@ -90,13 +90,13 @@ struct BallPointStuff //this class provides functions to be both an intersector } double minimumOnVolume(const BoxType &r) { ++calls; return r.squaredExteriorDistance(p); } - double minimumOnObject(const BallType &b) { ++calls; return std::max(0., (b.center - p).squaredNorm() - SQR(b.radius)); } + double minimumOnObject(const BallType &b) { ++calls; return (std::max)(0., (b.center - p).squaredNorm() - SQR(b.radius)); } double minimumOnVolumeVolume(const BoxType &r1, const BoxType &r2) { ++calls; return r1.squaredExteriorDistance(r2); } - double minimumOnVolumeObject(const BoxType &r, const BallType &b) { ++calls; return SQR(std::max(0., r.exteriorDistance(b.center) - b.radius)); } - double minimumOnObjectVolume(const BallType &b, const BoxType &r) { ++calls; return SQR(std::max(0., r.exteriorDistance(b.center) - b.radius)); } - double minimumOnObjectObject(const BallType &b1, const BallType &b2){ ++calls; return SQR(std::max(0., (b1.center - b2.center).norm() - b1.radius - b2.radius)); } + double minimumOnVolumeObject(const BoxType &r, const BallType &b) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); } + double minimumOnObjectVolume(const BallType &b, const BoxType &r) { ++calls; return SQR((std::max)(0., r.exteriorDistance(b.center) - b.radius)); } + double minimumOnObjectObject(const BallType &b1, const BallType &b2){ ++calls; return SQR((std::max)(0., (b1.center - b2.center).norm() - b1.radius - b2.radius)); } double minimumOnVolumeObject(const BoxType &r, const VectorType &v) { ++calls; return r.squaredExteriorDistance(v); } - double minimumOnObjectObject(const BallType &b, const VectorType &v){ ++calls; return SQR(std::max(0., (b.center - v).norm() - b.radius)); } + double minimumOnObjectObject(const BallType &b, const VectorType &v){ ++calls; return SQR((std::max)(0., (b.center - v).norm() - b.radius)); } VectorType p; int calls; diff --git a/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp b/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp index 5ea438c2a..996b42a7f 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/matrix_exponential.cpp @@ -36,7 +36,7 @@ double binom(int n, int k) template double relerr(const MatrixBase& A, const MatrixBase& B) { - return std::sqrt((A - B).cwiseAbs2().sum() / std::min(A.cwiseAbs2().sum(), B.cwiseAbs2().sum())); + return std::sqrt((A - B).cwiseAbs2().sum() / (std::min)(A.cwiseAbs2().sum(), B.cwiseAbs2().sum())); } template diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp index a004995f6..b1fd481e8 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/sparse_extra.cpp @@ -67,7 +67,7 @@ template void sparse_extra(const SparseMatrixType& re typedef typename SparseMatrixType::Scalar Scalar; enum { Flags = SparseMatrixType::Flags }; - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; Scalar eps = 1e-6; diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp index 4ceda3188..03a26bcd2 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/sparse_ldlt.cpp @@ -33,7 +33,7 @@ template void sparse_ldlt(int rows, int cols) { static bool odd = true; odd = !odd; - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp index df198cd52..5f8a7ce36 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/sparse_llt.cpp @@ -31,7 +31,7 @@ template void sparse_llt(int rows, int cols) { - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector; diff --git a/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp b/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp index 188d291cc..d58e85a0a 100644 --- a/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp +++ b/gtsam/3rdparty/Eigen/unsupported/test/sparse_lu.cpp @@ -35,7 +35,7 @@ template void sparse_lu(int rows, int cols) { - double density = std::max(8./(rows*cols), 0.01); + double density = (std::max)(8./(rows*cols), 0.01); typedef Matrix DenseMatrix; typedef Matrix DenseVector;