mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-11 19:29:02 +08:00
Pulled latest updates from trunk
This commit is contained in:
commit
fbcf8cc8c1
@ -182,14 +182,14 @@ template<> EIGEN_STRONG_INLINE Packet4d pmin<Packet4d>(const Packet4d& a, const
|
||||
template<> EIGEN_STRONG_INLINE Packet8f pmax<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_max_ps(a,b); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4d pmax<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_max_pd(a,b); }
|
||||
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pround<Packet8f>(const Packet8f& a) { return _mm256_round_ps(a, 0); }
|
||||
template<> EIGEN_STRONG_INLINE Packet2d pround<Packet4d>(const Packet4d& a) { return _mm256_round_pd(a, 0); }
|
||||
template<> EIGEN_STRONG_INLINE Packet8f pround<Packet8f>(const Packet8f& a) { return _mm256_round_ps(a, _MM_FROUND_CUR_DIRECTION); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4d pround<Packet4d>(const Packet4d& a) { return _mm256_round_pd(a, _MM_FROUND_CUR_DIRECTION); }
|
||||
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet8f>(const Packet8f& a) { return _mm256_ceil_ps(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet4d>(const Packet4d& a) { return _mm256_ceil_pd(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet8f pceil<Packet8f>(const Packet8f& a) { return _mm256_ceil_ps(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4d pceil<Packet4d>(const Packet4d& a) { return _mm256_ceil_pd(a); }
|
||||
|
||||
template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet8f>(const Packet8f& a) { return _mm256_floor_ps(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet4d>(const Packet4d& a) { return _mm256_floor_pd(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet8f pfloor<Packet8f>(const Packet8f& a) { return _mm256_floor_ps(a); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4d pfloor<Packet4d>(const Packet4d& a) { return _mm256_floor_pd(a); }
|
||||
|
||||
template<> EIGEN_STRONG_INLINE Packet8f pand<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_and_ps(a,b); }
|
||||
template<> EIGEN_STRONG_INLINE Packet4d pand<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_and_pd(a,b); }
|
||||
|
@ -109,9 +109,10 @@ template<> struct packet_traits<float> : default_packet_traits
|
||||
HasExp = 1,
|
||||
HasSqrt = 1,
|
||||
HasRsqrt = 1,
|
||||
HasBlend = 1,
|
||||
HasBlend = 1
|
||||
|
||||
#ifdef EIGEN_VECTORIZE_SSE4_1
|
||||
,
|
||||
HasRound = 1,
|
||||
HasFloor = 1,
|
||||
HasCeil = 1
|
||||
@ -132,9 +133,10 @@ template<> struct packet_traits<double> : default_packet_traits
|
||||
HasExp = 1,
|
||||
HasSqrt = 1,
|
||||
HasRsqrt = 1,
|
||||
HasBlend = 1,
|
||||
HasBlend = 1
|
||||
|
||||
#ifdef EIGEN_VECTORIZE_SSE4_1
|
||||
,
|
||||
HasRound = 1,
|
||||
HasFloor = 1,
|
||||
HasCeil = 1
|
||||
|
@ -26,7 +26,12 @@ if(SPQR_LIBRARIES)
|
||||
find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS $ENV{SPQRDIR} ${LIB_INSTALL_DIR})
|
||||
if (SUITESPARSE_LIBRARY)
|
||||
set(SPQR_LIBRARIES ${SPQR_LIBRARIES} ${SUITESPARSE_LIBRARY})
|
||||
endif (SUITESPARSE_LIBRARY)
|
||||
endif()
|
||||
|
||||
find_library(CHOLMOD_LIBRARY cholmod PATHS $ENV{UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
|
||||
if(CHOLMOD_LIBRARY)
|
||||
set(SPQR_LIBRARIES ${SPQR_LIBRARIES} ${CHOLMOD_LIBRARY})
|
||||
endif()
|
||||
|
||||
endif(SPQR_LIBRARIES)
|
||||
|
||||
|
@ -20,24 +20,29 @@ find_library(UMFPACK_LIBRARIES umfpack PATHS $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}
|
||||
|
||||
if(UMFPACK_LIBRARIES)
|
||||
|
||||
if (NOT UMFPACK_LIBDIR)
|
||||
if(NOT UMFPACK_LIBDIR)
|
||||
get_filename_component(UMFPACK_LIBDIR ${UMFPACK_LIBRARIES} PATH)
|
||||
endif(NOT UMFPACK_LIBDIR)
|
||||
|
||||
find_library(COLAMD_LIBRARY colamd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
|
||||
if (COLAMD_LIBRARY)
|
||||
if(COLAMD_LIBRARY)
|
||||
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${COLAMD_LIBRARY})
|
||||
endif (COLAMD_LIBRARY)
|
||||
endif ()
|
||||
|
||||
find_library(AMD_LIBRARY amd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
|
||||
if (AMD_LIBRARY)
|
||||
if(AMD_LIBRARY)
|
||||
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${AMD_LIBRARY})
|
||||
endif (AMD_LIBRARY)
|
||||
endif ()
|
||||
|
||||
find_library(SUITESPARSE_LIBRARY SuiteSparse PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
|
||||
if (SUITESPARSE_LIBRARY)
|
||||
if(SUITESPARSE_LIBRARY)
|
||||
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${SUITESPARSE_LIBRARY})
|
||||
endif (SUITESPARSE_LIBRARY)
|
||||
endif ()
|
||||
|
||||
find_library(CHOLMOD_LIBRARY cholmod PATHS $ENV{UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR})
|
||||
if(CHOLMOD_LIBRARY)
|
||||
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CHOLMOD_LIBRARY})
|
||||
endif()
|
||||
|
||||
endif(UMFPACK_LIBRARIES)
|
||||
|
||||
@ -45,4 +50,4 @@ include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(UMFPACK DEFAULT_MSG
|
||||
UMFPACK_INCLUDES UMFPACK_LIBRARIES)
|
||||
|
||||
mark_as_advanced(UMFPACK_INCLUDES UMFPACK_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY SUITESPARSE_LIBRARY)
|
||||
mark_as_advanced(UMFPACK_INCLUDES UMFPACK_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY CHOLMOD_LIBRARY SUITESPARSE_LIBRARY)
|
||||
|
@ -29,7 +29,7 @@ template<typename Scalar> bool areApproxAbs(const Scalar* a, const Scalar* b, in
|
||||
{
|
||||
if (!isApproxAbs(a[i],b[i],refvalue))
|
||||
{
|
||||
std::cout << "[" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != " << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "\n";
|
||||
std::cout << "ref: [" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != vec: [" << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "]\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -42,7 +42,7 @@ template<typename Scalar> bool areApprox(const Scalar* a, const Scalar* b, int s
|
||||
{
|
||||
if (a[i]!=b[i] && !internal::isApprox(a[i],b[i]))
|
||||
{
|
||||
std::cout << "[" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != " << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "\n";
|
||||
std::cout << "ref: [" << Map<const Matrix<Scalar,1,Dynamic> >(a,size) << "]" << " != vec: [" << Map<const Matrix<Scalar,1,Dynamic> >(b,size) << "]\n";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -296,10 +296,6 @@ template<typename Scalar> void packetmath_real()
|
||||
EIGEN_ALIGN_MAX Scalar data2[PacketTraits::size*4];
|
||||
EIGEN_ALIGN_MAX Scalar ref[PacketTraits::size*4];
|
||||
|
||||
CHECK_CWISE1_IF(PacketTraits::HasRound, std::round, internal::pround);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasCeil, std::ceil, internal::pceil);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasFloor, std::floor, internal::pfloor);
|
||||
|
||||
for (int i=0; i<size; ++i)
|
||||
{
|
||||
data1[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3));
|
||||
@ -308,6 +304,10 @@ template<typename Scalar> void packetmath_real()
|
||||
CHECK_CWISE1_IF(PacketTraits::HasSin, std::sin, internal::psin);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasCos, std::cos, internal::pcos);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasTan, std::tan, internal::ptan);
|
||||
|
||||
CHECK_CWISE1_IF(PacketTraits::HasRound, numext::round, internal::pround);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor);
|
||||
|
||||
for (int i=0; i<size; ++i)
|
||||
{
|
||||
|
@ -58,7 +58,7 @@ void test_product_small()
|
||||
}
|
||||
|
||||
{
|
||||
Eigen::Matrix<double, 100, 100> A, B, C;
|
||||
Eigen::Matrix<double, 10, 10> A, B, C;
|
||||
A.setRandom();
|
||||
C = A;
|
||||
for(int k=0; k<79; ++k)
|
||||
|
@ -629,7 +629,7 @@ template<typename DerType> struct NumTraits<AutoDiffScalar<DerType> >
|
||||
typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerType::Scalar>::Real,DerType::RowsAtCompileTime,DerType::ColsAtCompileTime,
|
||||
DerType::Options, DerType::MaxRowsAtCompileTime, DerType::MaxColsAtCompileTime> > Real;
|
||||
typedef AutoDiffScalar<DerType> NonInteger;
|
||||
typedef AutoDiffScalar<DerType>& Nested;
|
||||
typedef AutoDiffScalar<DerType> Nested;
|
||||
enum{
|
||||
RequireInitialization = 1
|
||||
};
|
||||
|
@ -129,6 +129,7 @@ template<typename Func> void forward_jacobian(const Func& f)
|
||||
|
||||
|
||||
// TODO also check actual derivatives!
|
||||
template <int>
|
||||
void test_autodiff_scalar()
|
||||
{
|
||||
Vector2f p = Vector2f::Random();
|
||||
@ -140,6 +141,7 @@ void test_autodiff_scalar()
|
||||
}
|
||||
|
||||
// TODO also check actual derivatives!
|
||||
template <int>
|
||||
void test_autodiff_vector()
|
||||
{
|
||||
Vector2f p = Vector2f::Random();
|
||||
@ -153,6 +155,7 @@ void test_autodiff_vector()
|
||||
VERIFY_IS_APPROX(res.value(), foo(p));
|
||||
}
|
||||
|
||||
template <int>
|
||||
void test_autodiff_jacobian()
|
||||
{
|
||||
CALL_SUBTEST(( forward_jacobian(TestFunc1<double,2,2>()) ));
|
||||
@ -162,12 +165,56 @@ void test_autodiff_jacobian()
|
||||
CALL_SUBTEST(( forward_jacobian(TestFunc1<double>(3,3)) ));
|
||||
}
|
||||
|
||||
|
||||
template <int>
|
||||
void test_autodiff_hessian()
|
||||
{
|
||||
typedef AutoDiffScalar<VectorXd> AD;
|
||||
typedef Matrix<AD,Eigen::Dynamic,1> VectorAD;
|
||||
typedef AutoDiffScalar<VectorAD> ADD;
|
||||
typedef Matrix<ADD,Eigen::Dynamic,1> VectorADD;
|
||||
VectorADD x(2);
|
||||
double s1 = internal::random<double>(), s2 = internal::random<double>(), s3 = internal::random<double>(), s4 = internal::random<double>();
|
||||
x(0).value()=s1;
|
||||
x(1).value()=s2;
|
||||
|
||||
//set unit vectors for the derivative directions (partial derivatives of the input vector)
|
||||
x(0).derivatives().resize(2);
|
||||
x(0).derivatives().setZero();
|
||||
x(0).derivatives()(0)= 1;
|
||||
x(1).derivatives().resize(2);
|
||||
x(1).derivatives().setZero();
|
||||
x(1).derivatives()(1)=1;
|
||||
|
||||
//repeat partial derivatives for the inner AutoDiffScalar
|
||||
x(0).value().derivatives() = VectorXd::Unit(2,0);
|
||||
x(1).value().derivatives() = VectorXd::Unit(2,1);
|
||||
|
||||
//set the hessian matrix to zero
|
||||
for(int idx=0; idx<2; idx++) {
|
||||
x(0).derivatives()(idx).derivatives() = VectorXd::Zero(2);
|
||||
x(1).derivatives()(idx).derivatives() = VectorXd::Zero(2);
|
||||
}
|
||||
|
||||
ADD y = sin(AD(s3)*x(0) + AD(s4)*x(1));
|
||||
|
||||
VERIFY_IS_APPROX(y.value().derivatives()(0), y.derivatives()(0).value());
|
||||
VERIFY_IS_APPROX(y.value().derivatives()(1), y.derivatives()(1).value());
|
||||
VERIFY_IS_APPROX(y.value().derivatives()(0), s3*std::cos(s1*s3+s2*s4));
|
||||
VERIFY_IS_APPROX(y.value().derivatives()(1), s4*std::cos(s1*s3+s2*s4));
|
||||
VERIFY_IS_APPROX(y.derivatives()(0).derivatives(), -std::sin(s1*s3+s2*s4)*Vector2d(s3*s3,s4*s3));
|
||||
VERIFY_IS_APPROX(y.derivatives()(1).derivatives(), -std::sin(s1*s3+s2*s4)*Vector2d(s3*s4,s4*s4));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void test_autodiff()
|
||||
{
|
||||
for(int i = 0; i < g_repeat; i++) {
|
||||
CALL_SUBTEST_1( test_autodiff_scalar() );
|
||||
CALL_SUBTEST_2( test_autodiff_vector() );
|
||||
CALL_SUBTEST_3( test_autodiff_jacobian() );
|
||||
CALL_SUBTEST_1( test_autodiff_scalar<1>() );
|
||||
CALL_SUBTEST_2( test_autodiff_vector<1>() );
|
||||
CALL_SUBTEST_3( test_autodiff_jacobian<1>() );
|
||||
CALL_SUBTEST_4( test_autodiff_hessian<1>() );
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user