diff options
-rw-r--r-- | Eigen/src/Core/Assign_MKL.h | 1 | ||||
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 7 | ||||
-rw-r--r-- | Eigen/src/Core/GlobalFunctions.h | 1 | ||||
-rw-r--r-- | Eigen/src/Core/functors/UnaryFunctors.h | 20 | ||||
-rw-r--r-- | Eigen/src/plugins/ArrayCwiseUnaryOps.h | 16 | ||||
-rw-r--r-- | doc/snippets/Cwise_isFinite.cpp | 5 | ||||
-rw-r--r-- | test/array.cpp | 2 |
7 files changed, 50 insertions, 2 deletions
diff --git a/Eigen/src/Core/Assign_MKL.h b/Eigen/src/Core/Assign_MKL.h index 25cfec25a..ec333e4a1 100644 --- a/Eigen/src/Core/Assign_MKL.h +++ b/Eigen/src/Core/Assign_MKL.h @@ -216,6 +216,7 @@ EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(floor, Floor) EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(ceil, Ceil) EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isNaN, IsNaN) EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isinf, Isinf) +EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isFinite, IsFinite) EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr) diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 5c217f4f0..c0c3ba1c9 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -78,7 +78,8 @@ struct default_packet_traits HasFloor = 0, HasCeil = 0, HasIsNaN = 0, - HasIsinf = 0 + HasIsinf = 0, + HasIsFinite = 0 }; }; @@ -403,6 +404,10 @@ Packet pisNaN(const Packet& a) { using numext::isNaN; return isNaN(a); } template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pisinf(const Packet& a) { using numext::isinf; return isinf(a); } +/** \internal \returns the isFinite of \a a (coeff-wise) */ +template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS +Packet pisFinite(const Packet& a) { using numext::isfinite; return isfinite(a); } + /*************************************************************************** * The following functions might not have to be overwritten for vectorized types ***************************************************************************/ diff --git a/Eigen/src/Core/GlobalFunctions.h b/Eigen/src/Core/GlobalFunctions.h index f7a8b06f4..03627c759 100644 --- a/Eigen/src/Core/GlobalFunctions.h +++ b/Eigen/src/Core/GlobalFunctions.h @@ -61,6 +61,7 @@ namespace Eigen EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ceil,scalar_ceil_op) EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isNaN,scalar_isNaN_op) EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isinf,scalar_isinf_op) + EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isFinite,scalar_isFinite_op) template<typename Derived> inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar>, const Derived> diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index 1745d8b55..a340963c2 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -606,6 +606,26 @@ struct functor_traits<scalar_isinf_op<Scalar> > }; }; +/** \internal + * \brief Template functor to compute the isFinite of a scalar + * \sa class CwiseUnaryOp, ArrayBase::isFinite() + */ +template<typename Scalar> struct scalar_isFinite_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_isFinite_op) + typedef bool result_type; + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isfinite(a); } + typedef typename packet_traits<Scalar>::type Packet; + inline Packet packetOp(const Packet& a) const { return internal::pisFinite(a); } +}; +template<typename Scalar> +struct functor_traits<scalar_isFinite_op<Scalar> > +{ + enum { + Cost = NumTraits<Scalar>::MulCost, + PacketAccess = packet_traits<Scalar>::HasIsFinite + }; +}; + } // end namespace internal } // end namespace Eigen diff --git a/Eigen/src/plugins/ArrayCwiseUnaryOps.h b/Eigen/src/plugins/ArrayCwiseUnaryOps.h index 5e5c8a857..32f2afc00 100644 --- a/Eigen/src/plugins/ArrayCwiseUnaryOps.h +++ b/Eigen/src/plugins/ArrayCwiseUnaryOps.h @@ -26,6 +26,7 @@ typedef CwiseUnaryOp<internal::scalar_floor_op<Scalar>, const Derived> FloorRetu typedef CwiseUnaryOp<internal::scalar_ceil_op<Scalar>, const Derived> CeilReturnType; typedef CwiseUnaryOp<internal::scalar_isNaN_op<Scalar>, const Derived> IsNaNReturnType; typedef CwiseUnaryOp<internal::scalar_isinf_op<Scalar>, const Derived> IsinfReturnType; +typedef CwiseUnaryOp<internal::scalar_isFinite_op<Scalar>, const Derived> IsFiniteReturnType; /** \returns an expression of the coefficient-wise absolute value of \c *this * @@ -369,7 +370,7 @@ ceil() const * Example: \include Cwise_isNaN.cpp * Output: \verbinclude Cwise_isNaN.out * - * \sa isinf() + * \sa isFinite(), isinf() */ inline const IsNaNReturnType isNaN() const @@ -390,6 +391,19 @@ isinf() const return IsinfReturnType(derived()); } +/** \returns an expression of the coefficient-wise isFinite of *this. + * + * Example: \include Cwise_isFinite.cpp + * Output: \verbinclude Cwise_isFinite.out + * + * \sa isNaN() + */ +inline const IsFiniteReturnType +isFinite() const +{ + return IsFiniteReturnType(derived()); +} + #define EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(METHOD_NAME,FUNCTOR) \ EIGEN_DEVICE_FUNC \ inline const CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \ diff --git a/doc/snippets/Cwise_isFinite.cpp b/doc/snippets/Cwise_isFinite.cpp new file mode 100644 index 000000000..7e59456bf --- /dev/null +++ b/doc/snippets/Cwise_isFinite.cpp @@ -0,0 +1,5 @@ +Array3d v(1,2,3); +v(1) *= 0.0/0.0; +v(2) /= 0.0; +cout << v << endl << endl; +cout << isFinite(v) << endl; diff --git a/test/array.cpp b/test/array.cpp index 9686a7445..cc0aed0a6 100644 --- a/test/array.cpp +++ b/test/array.cpp @@ -215,6 +215,7 @@ template<typename ArrayType> void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); VERIFY_IS_APPROX(m1.isNaN(), isNaN(m1)); VERIFY_IS_APPROX(m1.isinf(), isinf(m1)); + VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1)); VERIFY_IS_APPROX(m1.square(), square(m1)); VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); @@ -283,6 +284,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m) VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); VERIFY_IS_APPROX(m1.isNaN(), isNaN(m1)); VERIFY_IS_APPROX(m1.isinf(), isinf(m1)); + VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1)); VERIFY_IS_APPROX(m1.square(), square(m1)); VERIFY_IS_APPROX(m1.sin(), sin(m1)); VERIFY_IS_APPROX(m1.cos(), cos(m1)); |