diff options
author | Gael Guennebaud <g.gael@free.fr> | 2011-05-12 23:36:33 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2011-05-12 23:36:33 +0200 |
commit | 3de2f4b75af7a8466446383d1a87c10010f889b4 (patch) | |
tree | 3c932ae8866a16457821976ee40b6c8adb445080 /unsupported/Eigen/src/AutoDiff | |
parent | ae3b6cc3247d9495f2bdb9a539e02e9ed545368d (diff) |
AutoDiff: fix most of bug #234 (missing operators, used old internal math function interface, etc)
Diffstat (limited to 'unsupported/Eigen/src/AutoDiff')
-rw-r--r-- | unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h index 52b49f267..1a797d560 100644 --- a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h +++ b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h @@ -151,6 +151,27 @@ class AutoDiffScalar inline const DerType& derivatives() const { return m_derivatives; } inline DerType& derivatives() { return m_derivatives; } + inline bool operator< (const Scalar& other) const { return m_value < other; } + inline bool operator<=(const Scalar& other) const { return m_value <= other; } + inline bool operator> (const Scalar& other) const { return m_value > other; } + inline bool operator>=(const Scalar& other) const { return m_value >= other; } + inline bool operator==(const Scalar& other) const { return m_value == other; } + inline bool operator!=(const Scalar& other) const { return m_value != other; } + + friend inline bool operator< (const Scalar& a, const AutoDiffScalar& b) { return a < b.value(); } + friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); } + friend inline bool operator> (const Scalar& a, const AutoDiffScalar& b) { return a > b.value(); } + friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); } + friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); } + friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); } + + template<typename OtherDerType> inline bool operator< (const AutoDiffScalar<OtherDerType>& b) const { return m_value < b.value(); } + template<typename OtherDerType> inline bool operator<=(const AutoDiffScalar<OtherDerType>& b) const { return m_value <= b.value(); } + template<typename OtherDerType> inline bool operator> (const AutoDiffScalar<OtherDerType>& b) const { return m_value > b.value(); } + template<typename OtherDerType> inline bool operator>=(const AutoDiffScalar<OtherDerType>& b) const { return m_value >= b.value(); } + template<typename OtherDerType> inline bool operator==(const AutoDiffScalar<OtherDerType>& b) const { return m_value == b.value(); } + template<typename OtherDerType> inline bool operator!=(const AutoDiffScalar<OtherDerType>& b) const { return m_value != b.value(); } + inline const AutoDiffScalar<DerType&> operator+(const Scalar& other) const { return AutoDiffScalar<DerType&>(m_value + other, m_derivatives); @@ -195,6 +216,11 @@ class AutoDiffScalar return *this; } + friend inline const AutoDiffScalar<DerType&> operator-(const Scalar& a, const AutoDiffScalar& b) + { + return AutoDiffScalar<DerType&>(a - b.value(), b.derivatives()); + } + template<typename OtherDerType> inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const typename internal::remove_all<OtherDerType>::type> > operator-(const AutoDiffScalar<OtherDerType>& other) const @@ -517,6 +543,19 @@ namespace std } +#undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY +#define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \ + template<typename DerType> \ + struct FUNC##_impl<Eigen::AutoDiffScalar<DerType> > \ + { \ + static inline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar>, const typename Eigen::internal::remove_all<DerType>::type> > \ + run(const Eigen::AutoDiffScalar<DerType>& x) { \ + using namespace Eigen; \ + typedef typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar Scalar; \ + typedef AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const typename Eigen::internal::remove_all<DerType>::type> > ReturnType; \ + CODE; \ + } }; + namespace Eigen { namespace internal { @@ -563,6 +602,7 @@ pow(const AutoDiffScalar<DerType>& x, typename traits<DerType>::Scalar y) template<typename DerType> struct NumTraits<AutoDiffScalar<DerType> > : NumTraits< typename NumTraits<typename DerType::Scalar>::Real > { + typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerType::Scalar>::Real,DerType::ColsAtCompileTime,DerType::RowsAtCompileTime> > Real; typedef AutoDiffScalar<DerType> NonInteger; typedef AutoDiffScalar<DerType>& Nested; enum{ |