Add isfinite array support as isFinite

This commit is contained in:
Deanna Hood
2015-03-17 04:33:12 +10:00
parent 7b829940d1
commit 46cf9cda32
7 changed files with 50 additions and 2 deletions

View File

@@ -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)

View File

@@ -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
***************************************************************************/

View File

@@ -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>

View File

@@ -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