mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-11 07:31:48 +08:00
PR 719: fix real/imag namespace conflict
(grafted from 87427d2eaa90bbc1c12eedecca95554d93c3c212 )
This commit is contained in:
parent
3cf273591a
commit
47e2f8a42c
@ -524,10 +524,10 @@ inline void palign(PacketType& first, const PacketType& second)
|
|||||||
#ifndef __CUDACC__
|
#ifndef __CUDACC__
|
||||||
|
|
||||||
template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
|
template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
|
||||||
{ return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
|
{ return std::complex<float>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
|
||||||
|
|
||||||
template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
|
template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
|
||||||
{ return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
|
{ return std::complex<double>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ struct abs2_impl_default<Scalar, true> // IsComplex
|
|||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline RealScalar run(const Scalar& x)
|
static inline RealScalar run(const Scalar& x)
|
||||||
{
|
{
|
||||||
return real(x)*real(x) + imag(x)*imag(x);
|
return x.real()*x.real() + x.imag()*x.imag();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -313,14 +313,17 @@ struct abs2_retval
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
template<typename Scalar, bool IsComplex>
|
template<typename Scalar, bool IsComplex>
|
||||||
struct norm1_default_impl
|
struct norm1_default_impl;
|
||||||
|
|
||||||
|
template<typename Scalar>
|
||||||
|
struct norm1_default_impl<Scalar,true>
|
||||||
{
|
{
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline RealScalar run(const Scalar& x)
|
static inline RealScalar run(const Scalar& x)
|
||||||
{
|
{
|
||||||
EIGEN_USING_STD_MATH(abs);
|
EIGEN_USING_STD_MATH(abs);
|
||||||
return abs(real(x)) + abs(imag(x));
|
return abs(x.real()) + abs(x.imag());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -662,8 +665,8 @@ struct random_default_impl<Scalar, true, false>
|
|||||||
{
|
{
|
||||||
static inline Scalar run(const Scalar& x, const Scalar& y)
|
static inline Scalar run(const Scalar& x, const Scalar& y)
|
||||||
{
|
{
|
||||||
return Scalar(random(real(x), real(y)),
|
return Scalar(random(x.real(), y.real()),
|
||||||
random(imag(x), imag(y)));
|
random(x.imag(), y.imag()));
|
||||||
}
|
}
|
||||||
static inline Scalar run()
|
static inline Scalar run()
|
||||||
{
|
{
|
||||||
|
@ -768,7 +768,7 @@ struct scalar_sign_op<Scalar,true> {
|
|||||||
if (aa==real_type(0))
|
if (aa==real_type(0))
|
||||||
return Scalar(0);
|
return Scalar(0);
|
||||||
aa = real_type(1)/aa;
|
aa = real_type(1)/aa;
|
||||||
return Scalar(real(a)*aa, imag(a)*aa );
|
return Scalar(a.real()*aa, a.imag()*aa );
|
||||||
}
|
}
|
||||||
//TODO
|
//TODO
|
||||||
//template <typename Packet>
|
//template <typename Packet>
|
||||||
|
@ -648,8 +648,8 @@ public:
|
|||||||
// Vectorized path
|
// Vectorized path
|
||||||
EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacketType& dest) const
|
EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacketType& dest) const
|
||||||
{
|
{
|
||||||
dest.first = pset1<RealPacket>(real(*b));
|
dest.first = pset1<RealPacket>(numext::real(*b));
|
||||||
dest.second = pset1<RealPacket>(imag(*b));
|
dest.second = pset1<RealPacket>(numext::imag(*b));
|
||||||
}
|
}
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, ResPacket& dest) const
|
EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, ResPacket& dest) const
|
||||||
|
@ -279,7 +279,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1);
|
VERIFY_IS_APPROX(m1.sign() * m1.abs(), m1);
|
||||||
|
|
||||||
VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1));
|
VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1));
|
||||||
VERIFY_IS_APPROX(numext::abs2(real(m1)) + numext::abs2(imag(m1)), numext::abs2(m1));
|
VERIFY_IS_APPROX(numext::abs2(Eigen::real(m1)) + numext::abs2(Eigen::imag(m1)), numext::abs2(m1));
|
||||||
if(!NumTraits<Scalar>::IsComplex)
|
if(!NumTraits<Scalar>::IsComplex)
|
||||||
VERIFY_IS_APPROX(numext::real(m1), m1);
|
VERIFY_IS_APPROX(numext::real(m1), m1);
|
||||||
|
|
||||||
@ -368,7 +368,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
|
|||||||
|
|
||||||
for (Index i = 0; i < m.rows(); ++i)
|
for (Index i = 0; i < m.rows(); ++i)
|
||||||
for (Index j = 0; j < m.cols(); ++j)
|
for (Index j = 0; j < m.cols(); ++j)
|
||||||
m3(i,j) = std::atan2(imag(m1(i,j)), real(m1(i,j)));
|
m3(i,j) = std::atan2(m1(i,j).imag(), m1(i,j).real());
|
||||||
VERIFY_IS_APPROX(arg(m1), m3);
|
VERIFY_IS_APPROX(arg(m1), m3);
|
||||||
|
|
||||||
std::complex<RealScalar> zero(0.0,0.0);
|
std::complex<RealScalar> zero(0.0,0.0);
|
||||||
@ -395,7 +395,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
|
|||||||
|
|
||||||
VERIFY_IS_APPROX(inverse(inverse(m1)),m1);
|
VERIFY_IS_APPROX(inverse(inverse(m1)),m1);
|
||||||
VERIFY_IS_APPROX(conj(m1.conjugate()), m1);
|
VERIFY_IS_APPROX(conj(m1.conjugate()), m1);
|
||||||
VERIFY_IS_APPROX(abs(m1), sqrt(square(real(m1))+square(imag(m1))));
|
VERIFY_IS_APPROX(abs(m1), sqrt(square(m1.real())+square(m1.imag())));
|
||||||
VERIFY_IS_APPROX(abs(m1), sqrt(abs2(m1)));
|
VERIFY_IS_APPROX(abs(m1), sqrt(abs2(m1)));
|
||||||
VERIFY_IS_APPROX(log10(m1), log(m1)/log(10));
|
VERIFY_IS_APPROX(log10(m1), log(m1)/log(10));
|
||||||
|
|
||||||
|
29
test/main.h
29
test/main.h
@ -67,11 +67,40 @@
|
|||||||
// protected by parenthesis against macro expansion, the min()/max() macros
|
// protected by parenthesis against macro expansion, the min()/max() macros
|
||||||
// are defined here and any not-parenthesized min/max call will cause a
|
// are defined here and any not-parenthesized min/max call will cause a
|
||||||
// compiler error.
|
// compiler error.
|
||||||
|
<<<<<<< local
|
||||||
#define min(A,B) please_protect_your_min_with_parentheses
|
#define min(A,B) please_protect_your_min_with_parentheses
|
||||||
#define max(A,B) please_protect_your_max_with_parentheses
|
#define max(A,B) please_protect_your_max_with_parentheses
|
||||||
#define isnan(X) please_protect_your_isnan_with_parentheses
|
#define isnan(X) please_protect_your_isnan_with_parentheses
|
||||||
#define isinf(X) please_protect_your_isinf_with_parentheses
|
#define isinf(X) please_protect_your_isinf_with_parentheses
|
||||||
#define isfinite(X) please_protect_your_isfinite_with_parentheses
|
#define isfinite(X) please_protect_your_isfinite_with_parentheses
|
||||||
|
=======
|
||||||
|
#if !defined(__HIPCC__) && !defined(EIGEN_USE_SYCL)
|
||||||
|
//
|
||||||
|
// HIP header files include the following files
|
||||||
|
// <thread>
|
||||||
|
// <regex>
|
||||||
|
// <unordered_map>
|
||||||
|
// which seem to contain not-parenthesized calls to "max"/"min", triggering the following check and causing the compile to fail
|
||||||
|
//
|
||||||
|
// Including those header files before the following macro definition for "min" / "max", only partially resolves the issue
|
||||||
|
// This is because other HIP header files also define "isnan" / "isinf" / "isfinite" functions, which are needed in other
|
||||||
|
// headers.
|
||||||
|
//
|
||||||
|
// So instead choosing to simply disable this check for HIP
|
||||||
|
//
|
||||||
|
#define min(A,B) please_protect_your_min_with_parentheses
|
||||||
|
#define max(A,B) please_protect_your_max_with_parentheses
|
||||||
|
#define isnan(X) please_protect_your_isnan_with_parentheses
|
||||||
|
#define isinf(X) please_protect_your_isinf_with_parentheses
|
||||||
|
#define isfinite(X) please_protect_your_isfinite_with_parentheses
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// test possible conflicts
|
||||||
|
struct real {};
|
||||||
|
struct imag {};
|
||||||
|
|
||||||
|
>>>>>>> graft
|
||||||
#ifdef M_PI
|
#ifdef M_PI
|
||||||
#undef M_PI
|
#undef M_PI
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user