From 7b829940d1ce106f9b83aba63782cb7be689ba5d Mon Sep 17 00:00:00 2001 From: Deanna Hood Date: Tue, 17 Mar 2015 03:40:28 +1000 Subject: Add code snippets for new methods --- doc/snippets/Cwise_arg.cpp | 3 +++ doc/snippets/Cwise_ceil.cpp | 3 +++ doc/snippets/Cwise_cosh.cpp | 2 ++ doc/snippets/Cwise_floor.cpp | 3 +++ doc/snippets/Cwise_isNaN.cpp | 5 +++++ doc/snippets/Cwise_isinf.cpp | 5 +++++ doc/snippets/Cwise_log10.cpp | 2 ++ doc/snippets/Cwise_round.cpp | 3 +++ doc/snippets/Cwise_sinh.cpp | 2 ++ doc/snippets/Cwise_tanh.cpp | 2 ++ 10 files changed, 30 insertions(+) create mode 100644 doc/snippets/Cwise_arg.cpp create mode 100644 doc/snippets/Cwise_ceil.cpp create mode 100644 doc/snippets/Cwise_cosh.cpp create mode 100644 doc/snippets/Cwise_floor.cpp create mode 100644 doc/snippets/Cwise_isNaN.cpp create mode 100644 doc/snippets/Cwise_isinf.cpp create mode 100644 doc/snippets/Cwise_log10.cpp create mode 100644 doc/snippets/Cwise_round.cpp create mode 100644 doc/snippets/Cwise_sinh.cpp create mode 100644 doc/snippets/Cwise_tanh.cpp (limited to 'doc/snippets') diff --git a/doc/snippets/Cwise_arg.cpp b/doc/snippets/Cwise_arg.cpp new file mode 100644 index 000000000..3f45133b6 --- /dev/null +++ b/doc/snippets/Cwise_arg.cpp @@ -0,0 +1,3 @@ +ArrayXcf v = ArrayXcf::Random(3); +cout << v << endl << endl; +cout << arg(v) << endl; diff --git a/doc/snippets/Cwise_ceil.cpp b/doc/snippets/Cwise_ceil.cpp new file mode 100644 index 000000000..76cf661f4 --- /dev/null +++ b/doc/snippets/Cwise_ceil.cpp @@ -0,0 +1,3 @@ +ArrayXd v = ArrayXd::LinSpaced(7,-2,2); +cout << v << endl << endl; +cout << ceil(v) << endl; diff --git a/doc/snippets/Cwise_cosh.cpp b/doc/snippets/Cwise_cosh.cpp new file mode 100644 index 000000000..80ee75da5 --- /dev/null +++ b/doc/snippets/Cwise_cosh.cpp @@ -0,0 +1,2 @@ +ArrayXd v = ArrayXd::LinSpaced(5,0,1); +cout << cosh(v) << endl; diff --git a/doc/snippets/Cwise_floor.cpp b/doc/snippets/Cwise_floor.cpp new file mode 100644 index 000000000..73756b41c --- /dev/null +++ b/doc/snippets/Cwise_floor.cpp @@ -0,0 +1,3 @@ +ArrayXd v = ArrayXd::LinSpaced(7,-2,2); +cout << v << endl << endl; +cout << floor(v) << endl; diff --git a/doc/snippets/Cwise_isNaN.cpp b/doc/snippets/Cwise_isNaN.cpp new file mode 100644 index 000000000..cc1e7fe6a --- /dev/null +++ b/doc/snippets/Cwise_isNaN.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 << isNaN(v) << endl; diff --git a/doc/snippets/Cwise_isinf.cpp b/doc/snippets/Cwise_isinf.cpp new file mode 100644 index 000000000..be793081c --- /dev/null +++ b/doc/snippets/Cwise_isinf.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 << isinf(v) << endl; diff --git a/doc/snippets/Cwise_log10.cpp b/doc/snippets/Cwise_log10.cpp new file mode 100644 index 000000000..b7ae4a834 --- /dev/null +++ b/doc/snippets/Cwise_log10.cpp @@ -0,0 +1,2 @@ +Array4d v(-1,0,1,2); +cout << log10(v) << endl; diff --git a/doc/snippets/Cwise_round.cpp b/doc/snippets/Cwise_round.cpp new file mode 100644 index 000000000..e5c88230b --- /dev/null +++ b/doc/snippets/Cwise_round.cpp @@ -0,0 +1,3 @@ +ArrayXd v = ArrayXd::LinSpaced(7,-2,2); +cout << v << endl << endl; +cout << round(v) << endl; diff --git a/doc/snippets/Cwise_sinh.cpp b/doc/snippets/Cwise_sinh.cpp new file mode 100644 index 000000000..fac9b19a8 --- /dev/null +++ b/doc/snippets/Cwise_sinh.cpp @@ -0,0 +1,2 @@ +ArrayXd v = ArrayXd::LinSpaced(5,0,1); +cout << sinh(v) << endl; diff --git a/doc/snippets/Cwise_tanh.cpp b/doc/snippets/Cwise_tanh.cpp new file mode 100644 index 000000000..30cd0450d --- /dev/null +++ b/doc/snippets/Cwise_tanh.cpp @@ -0,0 +1,2 @@ +ArrayXd v = ArrayXd::LinSpaced(5,0,1); +cout << tanh(v) << endl; -- cgit v1.2.3 From 46cf9cda32be99fcd658a926c14088e087d91b7e Mon Sep 17 00:00:00 2001 From: Deanna Hood Date: Tue, 17 Mar 2015 04:33:12 +1000 Subject: Add isfinite array support as isFinite --- Eigen/src/Core/Assign_MKL.h | 1 + Eigen/src/Core/GenericPacketMath.h | 7 ++++++- Eigen/src/Core/GlobalFunctions.h | 1 + Eigen/src/Core/functors/UnaryFunctors.h | 20 ++++++++++++++++++++ Eigen/src/plugins/ArrayCwiseUnaryOps.h | 16 +++++++++++++++- doc/snippets/Cwise_isFinite.cpp | 5 +++++ test/array.cpp | 2 ++ 7 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 doc/snippets/Cwise_isFinite.cpp (limited to 'doc/snippets') 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 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 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 inline const Eigen::CwiseUnaryOp, 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 > }; }; +/** \internal + * \brief Template functor to compute the isFinite of a scalar + * \sa class CwiseUnaryOp, ArrayBase::isFinite() + */ +template 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::type Packet; + inline Packet packetOp(const Packet& a) const { return internal::pisFinite(a); } +}; +template +struct functor_traits > +{ + enum { + Cost = NumTraits::MulCost, + PacketAccess = packet_traits::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, const Derived> FloorRetu typedef CwiseUnaryOp, const Derived> CeilReturnType; typedef CwiseUnaryOp, const Derived> IsNaNReturnType; typedef CwiseUnaryOp, const Derived> IsinfReturnType; +typedef CwiseUnaryOp, 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 >, 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 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 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)); -- cgit v1.2.3 From fef4e071d70870e91aba68b0a34e53bb20f9303f Mon Sep 17 00:00:00 2001 From: Deanna Hood Date: Tue, 17 Mar 2015 05:58:47 +1000 Subject: Rename isinf to isInf --- Eigen/src/Core/Assign_MKL.h | 2 +- Eigen/src/Core/GenericPacketMath.h | 6 +++--- Eigen/src/Core/GlobalFunctions.h | 2 +- Eigen/src/Core/MathFunctions.h | 4 ++-- Eigen/src/Core/functors/UnaryFunctors.h | 16 ++++++++-------- Eigen/src/plugins/ArrayCwiseUnaryOps.h | 16 ++++++++-------- doc/snippets/Cwise_isInf.cpp | 5 +++++ doc/snippets/Cwise_isinf.cpp | 5 ----- test/array.cpp | 4 ++-- 9 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 doc/snippets/Cwise_isInf.cpp delete mode 100644 doc/snippets/Cwise_isinf.cpp (limited to 'doc/snippets') diff --git a/Eigen/src/Core/Assign_MKL.h b/Eigen/src/Core/Assign_MKL.h index ec333e4a1..60d8df2de 100644 --- a/Eigen/src/Core/Assign_MKL.h +++ b/Eigen/src/Core/Assign_MKL.h @@ -215,7 +215,7 @@ EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(round, Round) 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(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 c0c3ba1c9..7a467e8db 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -78,7 +78,7 @@ struct default_packet_traits HasFloor = 0, HasCeil = 0, HasIsNaN = 0, - HasIsinf = 0, + HasIsInf = 0, HasIsFinite = 0 }; }; @@ -400,9 +400,9 @@ Packet pceil(const Packet& a) { using numext::ceil; return ceil(a); } template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pisNaN(const Packet& a) { using numext::isNaN; return isNaN(a); } -/** \internal \returns the isinf of \a a (coeff-wise) */ +/** \internal \returns the isInf of \a a (coeff-wise) */ template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS -Packet pisinf(const Packet& a) { using numext::isinf; return isinf(a); } +Packet pisInf(const Packet& a) { using numext::isInf; return isInf(a); } /** \internal \returns the isFinite of \a a (coeff-wise) */ template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS diff --git a/Eigen/src/Core/GlobalFunctions.h b/Eigen/src/Core/GlobalFunctions.h index 03627c759..b99bc7533 100644 --- a/Eigen/src/Core/GlobalFunctions.h +++ b/Eigen/src/Core/GlobalFunctions.h @@ -60,7 +60,7 @@ namespace Eigen EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(floor,scalar_floor_op) 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(isInf,scalar_isInf_op) EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isFinite,scalar_isFinite_op) template diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index fceb29e1a..36a6eb650 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -759,7 +759,7 @@ bool (isNaN)(const std::complex& x) template EIGEN_DEVICE_FUNC -bool (isinf)(const T& x) +bool (isInf)(const T& x) { using std::isinf; return isinf(x); @@ -767,7 +767,7 @@ bool (isinf)(const T& x) template EIGEN_DEVICE_FUNC -bool (isinf)(const std::complex& x) +bool (isInf)(const std::complex& x) { using std::real; using std::imag; diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index a340963c2..fa74aeae0 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -587,22 +587,22 @@ struct functor_traits > }; /** \internal - * \brief Template functor to compute the isinf of a scalar - * \sa class CwiseUnaryOp, ArrayBase::isinf() + * \brief Template functor to compute the isInf of a scalar + * \sa class CwiseUnaryOp, ArrayBase::isInf() */ -template struct scalar_isinf_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op) +template struct scalar_isInf_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_isInf_op) typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isinf(a); } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isInf(a); } typedef typename packet_traits::type Packet; - inline Packet packetOp(const Packet& a) const { return internal::pisinf(a); } + inline Packet packetOp(const Packet& a) const { return internal::pisInf(a); } }; template -struct functor_traits > +struct functor_traits > { enum { Cost = NumTraits::MulCost, - PacketAccess = packet_traits::HasIsinf + PacketAccess = packet_traits::HasIsInf }; }; diff --git a/Eigen/src/plugins/ArrayCwiseUnaryOps.h b/Eigen/src/plugins/ArrayCwiseUnaryOps.h index 32f2afc00..6e6c86401 100644 --- a/Eigen/src/plugins/ArrayCwiseUnaryOps.h +++ b/Eigen/src/plugins/ArrayCwiseUnaryOps.h @@ -25,7 +25,7 @@ typedef CwiseUnaryOp, const Derived> RoundRetu typedef CwiseUnaryOp, const Derived> FloorReturnType; typedef CwiseUnaryOp, const Derived> CeilReturnType; typedef CwiseUnaryOp, const Derived> IsNaNReturnType; -typedef CwiseUnaryOp, const Derived> IsinfReturnType; +typedef CwiseUnaryOp, const Derived> IsInfReturnType; typedef CwiseUnaryOp, const Derived> IsFiniteReturnType; /** \returns an expression of the coefficient-wise absolute value of \c *this @@ -370,7 +370,7 @@ ceil() const * Example: \include Cwise_isNaN.cpp * Output: \verbinclude Cwise_isNaN.out * - * \sa isFinite(), isinf() + * \sa isFinite(), isInf() */ inline const IsNaNReturnType isNaN() const @@ -378,17 +378,17 @@ isNaN() const return IsNaNReturnType(derived()); } -/** \returns an expression of the coefficient-wise isinf of *this. +/** \returns an expression of the coefficient-wise isInf of *this. * - * Example: \include Cwise_isinf.cpp - * Output: \verbinclude Cwise_isinf.out + * Example: \include Cwise_isInf.cpp + * Output: \verbinclude Cwise_isInf.out * * \sa isNaN() */ -inline const IsinfReturnType -isinf() const +inline const IsInfReturnType +isInf() const { - return IsinfReturnType(derived()); + return IsInfReturnType(derived()); } /** \returns an expression of the coefficient-wise isFinite of *this. diff --git a/doc/snippets/Cwise_isInf.cpp b/doc/snippets/Cwise_isInf.cpp new file mode 100644 index 000000000..beb6746d0 --- /dev/null +++ b/doc/snippets/Cwise_isInf.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 << isInf(v) << endl; diff --git a/doc/snippets/Cwise_isinf.cpp b/doc/snippets/Cwise_isinf.cpp deleted file mode 100644 index be793081c..000000000 --- a/doc/snippets/Cwise_isinf.cpp +++ /dev/null @@ -1,5 +0,0 @@ -Array3d v(1,2,3); -v(1) *= 0.0/0.0; -v(2) /= 0.0; -cout << v << endl << endl; -cout << isinf(v) << endl; diff --git a/test/array.cpp b/test/array.cpp index cc0aed0a6..5729e8eed 100644 --- a/test/array.cpp +++ b/test/array.cpp @@ -214,7 +214,7 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.floor(), floor(m1)); 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.isInf(), isInf(m1)); VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1)); VERIFY_IS_APPROX(m1.square(), square(m1)); @@ -283,7 +283,7 @@ template void array_complex(const ArrayType& m) VERIFY_IS_APPROX(m1.floor(), floor(m1)); 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.isInf(), isInf(m1)); VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1)); VERIFY_IS_APPROX(m1.square(), square(m1)); VERIFY_IS_APPROX(m1.sin(), sin(m1)); -- cgit v1.2.3 From 1c78d6f2a6c7be509c1a190e1cfe42bce1916230 Mon Sep 17 00:00:00 2001 From: Deanna Hood Date: Tue, 17 Mar 2015 08:29:57 +1000 Subject: Add boolean not operator (!) array support --- Eigen/src/Core/functors/UnaryFunctors.h | 18 ++++++++++++++++++ Eigen/src/plugins/ArrayCwiseUnaryOps.h | 20 ++++++++++++++++++++ doc/snippets/Cwise_boolean_not.cpp | 5 +++++ test/array.cpp | 2 ++ 4 files changed, 45 insertions(+) create mode 100644 doc/snippets/Cwise_boolean_not.cpp (limited to 'doc/snippets') diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index fa74aeae0..a7cd3b7ca 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -626,6 +626,24 @@ struct functor_traits > }; }; +/** \internal + * \brief Template functor to compute the logical not of a boolean + * + * \sa class CwiseUnaryOp, ArrayBase::operator! + */ +template struct scalar_boolean_not_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; } +}; +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost, + PacketAccess = false + }; +}; + + } // end namespace internal } // end namespace Eigen diff --git a/Eigen/src/plugins/ArrayCwiseUnaryOps.h b/Eigen/src/plugins/ArrayCwiseUnaryOps.h index 6e6c86401..1d5c9a6c1 100644 --- a/Eigen/src/plugins/ArrayCwiseUnaryOps.h +++ b/Eigen/src/plugins/ArrayCwiseUnaryOps.h @@ -5,6 +5,7 @@ typedef CwiseUnaryOp, const Derived> ArgReturnTy typedef CwiseUnaryOp, const Derived> Abs2ReturnType; typedef CwiseUnaryOp, const Derived> SqrtReturnType; typedef CwiseUnaryOp, const Derived> InverseReturnType; +typedef CwiseUnaryOp, const Derived> BooleanNotReturnType; typedef CwiseUnaryOp, const Derived> ExpReturnType; typedef CwiseUnaryOp, const Derived> LogReturnType; @@ -404,6 +405,25 @@ isFinite() const return IsFiniteReturnType(derived()); } +/** \returns an expression of the coefficient-wise ! operator of *this + * + * \warning this operator is for expression of bool only. + * + * Example: \include Cwise_boolean_not.cpp + * Output: \verbinclude Cwise_boolean_not.out + * + * \sa operator!=() + */ +EIGEN_DEVICE_FUNC +inline const BooleanNotReturnType +operator!() const +{ + EIGEN_STATIC_ASSERT((internal::is_same::value), + THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL); + return BooleanNotReturnType(derived()); +} + + #define EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(METHOD_NAME,FUNCTOR) \ EIGEN_DEVICE_FUNC \ inline const CwiseUnaryOp >, const Derived> \ diff --git a/doc/snippets/Cwise_boolean_not.cpp b/doc/snippets/Cwise_boolean_not.cpp new file mode 100644 index 000000000..8b8e6fc95 --- /dev/null +++ b/doc/snippets/Cwise_boolean_not.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 a17fe9b4a..254af2ee9 100644 --- a/test/array.cpp +++ b/test/array.cpp @@ -221,6 +221,8 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.square().sqrt(), sqrt(square(m1))); VERIFY_IS_APPROX(cube(m1.cube()), pow((m1),3*3)); + VERIFY(!(m1>m2),(m1<=m2)); + VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); VERIFY_IS_APPROX(m1.abs().sqrt(), sqrt(abs(m1))); -- cgit v1.2.3