aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/Assign_MKL.h1
-rw-r--r--Eigen/src/Core/GenericPacketMath.h7
-rw-r--r--Eigen/src/Core/GlobalFunctions.h1
-rw-r--r--Eigen/src/Core/functors/UnaryFunctors.h20
-rw-r--r--Eigen/src/plugins/ArrayCwiseUnaryOps.h16
-rw-r--r--doc/snippets/Cwise_isFinite.cpp5
-rw-r--r--test/array.cpp2
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));