1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_AUTODIFF_SCALAR_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_AUTODIFF_SCALAR_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A, typename B> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct make_coherent_impl { 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run(A&, B&) {} 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// resize a to match b is a.size()==0, and conversely. 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A, typename B> 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid make_coherent(const A& a, const B&b) 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath make_coherent_impl<A,B>::run(a.const_cast_derived(), b.const_cast_derived()); 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DerType, bool Enable> struct auto_diff_special_op; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class AutoDiffScalar 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief A scalar type replacement with automatic differentation capability 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _DerType the vector type used to store/represent the derivatives. The base scalar type 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * as well as the number of derivatives to compute are determined from this type. 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Typical choices include, e.g., \c Vector4f for 4 derivatives, or \c VectorXf 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * if the number of derivatives is not known at compile time, and/or, the number 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * of derivatives is large. 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Note that _DerType can also be a reference (e.g., \c VectorXf&) to wrap a 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * existing vector into an AutoDiffScalar. 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Finally, _DerType can also be any Eigen compatible expression. 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents a scalar value while tracking its respective derivatives using Eigen's expression 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * template mechanism. 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It supports the following list of global math function: 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos, 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - internal::abs, internal::sqrt, internal::pow, internal::exp, internal::log, internal::sin, internal::cos, 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - internal::conj, internal::real, internal::imag, internal::abs2. 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However, 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * in that case, the expression template mechanism only occurs at the top Matrix level, 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * while derivatives are computed right away. 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DerType> 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass AutoDiffScalar 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public internal::auto_diff_special_op 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath <_DerType, !internal::is_same<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar, 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename NumTraits<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar>::Real>::value> 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef internal::auto_diff_special_op 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath <_DerType, !internal::is_same<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar, 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename NumTraits<typename internal::traits<typename internal::remove_all<_DerType>::type>::Scalar>::Real>::value> Base; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::remove_all<_DerType>::type DerType; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<DerType>::Scalar Scalar; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real Real; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator+; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator*; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Default constructor without any initialization. */ 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar() {} 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructs an active scalar from its \a value, 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath and initializes the \a nbDer derivatives such that it corresponds to the \a derNumber -th variable */ 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar(const Scalar& value, int nbDer, int derNumber) 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_value(value), m_derivatives(DerType::Zero(nbDer)) 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives.coeffRef(derNumber) = Scalar(1); 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Conversion from a scalar constant to an active scalar. 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The derivatives are set to zero. */ 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /*explicit*/ AutoDiffScalar(const Real& value) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_value(value) 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(m_derivatives.size()>0) 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives.setZero(); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructs an active scalar from its \a value and derivatives \a der */ 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar(const Scalar& value, const DerType& der) 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_value(value), m_derivatives(der) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar(const AutoDiffScalar<OtherDerType>& other) 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_value(other.value()), m_derivatives(other.derivatives()) 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const AutoDiffScalar& a) 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s << a.value(); 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar(const AutoDiffScalar& other) 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_value(other.value()), m_derivatives(other.derivatives()) 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator=(const AutoDiffScalar<OtherDerType>& other) 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value = other.value(); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives = other.derivatives(); 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator=(const AutoDiffScalar& other) 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value = other.value(); 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives = other.derivatives(); 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// inline operator const Scalar& () const { return m_value; } 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// inline operator Scalar& () { return m_value; } 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar& value() const { return m_value; } 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar& value() { return m_value; } 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const DerType& derivatives() const { return m_derivatives; } 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DerType& derivatives() { return m_derivatives; } 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator< (const Scalar& other) const { return m_value < other; } 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator<=(const Scalar& other) const { return m_value <= other; } 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator> (const Scalar& other) const { return m_value > other; } 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator>=(const Scalar& other) const { return m_value >= other; } 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator==(const Scalar& other) const { return m_value == other; } 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool operator!=(const Scalar& other) const { return m_value != other; } 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator< (const Scalar& a, const AutoDiffScalar& b) { return a < b.value(); } 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); } 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator> (const Scalar& a, const AutoDiffScalar& b) { return a > b.value(); } 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); } 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); } 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); } 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator< (const AutoDiffScalar<OtherDerType>& b) const { return m_value < b.value(); } 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator<=(const AutoDiffScalar<OtherDerType>& b) const { return m_value <= b.value(); } 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator> (const AutoDiffScalar<OtherDerType>& b) const { return m_value > b.value(); } 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator>=(const AutoDiffScalar<OtherDerType>& b) const { return m_value >= b.value(); } 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator==(const AutoDiffScalar<OtherDerType>& b) const { return m_value == b.value(); } 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> inline bool operator!=(const AutoDiffScalar<OtherDerType>& b) const { return m_value != b.value(); } 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<DerType&> operator+(const Scalar& other) const 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<DerType&>(m_value + other, m_derivatives); 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<DerType&> operator+(const Scalar& a, const AutoDiffScalar& b) 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives()); 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// inline const AutoDiffScalar<DerType&> operator+(const Real& other) const 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<DerType&>(m_value + other, m_derivatives); 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar& b) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives()); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator+=(const Scalar& other) 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath value() += other; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const typename internal::remove_all<OtherDerType>::type> > 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator+(const AutoDiffScalar<OtherDerType>& other) const 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::make_coherent(m_derivatives, other.derivatives()); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const typename internal::remove_all<OtherDerType>::type> >( 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value + other.value(), 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives + other.derivatives()); 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator+=(const AutoDiffScalar<OtherDerType>& other) 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (*this) = (*this) + other; 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<DerType&> operator-(const Scalar& b) const 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<DerType&>(m_value - b, m_derivatives); 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> > 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator-(const Scalar& a, const AutoDiffScalar& b) 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> > 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (a - b.value(), -b.derivatives()); 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator-=(const Scalar& other) 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath value() -= other; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const typename internal::remove_all<OtherDerType>::type> > 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator-(const AutoDiffScalar<OtherDerType>& other) const 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::make_coherent(m_derivatives, other.derivatives()); 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const typename internal::remove_all<OtherDerType>::type> >( 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value - other.value(), 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_derivatives - other.derivatives()); 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator-=(const AutoDiffScalar<OtherDerType>& other) 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this - other; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> > 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator-() const 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >( 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath -m_value, 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath -m_derivatives); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> > 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const Scalar& other) const 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >( 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value * other, 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (m_derivatives * other)); 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> > 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const Scalar& other, const AutoDiffScalar& a) 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >( 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.value() * other, 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.derivatives() * other); 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type > 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// operator*(const Real& other) const 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >( 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// m_value * other, 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// (m_derivatives * other)); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type > 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// operator*(const Real& other, const AutoDiffScalar& a) 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >( 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a.value() * other, 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a.derivatives() * other); 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> > 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator/(const Scalar& other) const 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >( 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value / other, 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (m_derivatives * (Scalar(1)/other))); 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> > 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator/(const Scalar& other, const AutoDiffScalar& a) 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType> >( 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other / a.value(), 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.derivatives() * (Scalar(-other) / (a.value()*a.value()))); 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type > 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// operator/(const Real& other) const 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >( 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// m_value / other, 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// (m_derivatives * (Real(1)/other))); 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type > 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// operator/(const Real& other, const AutoDiffScalar& a) 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// { 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >( 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// other / a.value(), 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// a.derivatives() * (-Real(1)/other)); 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// } 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseBinaryOp<internal::scalar_difference_op<Scalar>, 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>, 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > > > 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator/(const AutoDiffScalar<OtherDerType>& other) const 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::make_coherent(m_derivatives, other.derivatives()); 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseBinaryOp<internal::scalar_difference_op<Scalar>, 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>, 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > > >( 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value / other.value(), 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ((m_derivatives * other.value()) - (m_value * other.derivatives())) 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (Scalar(1)/(other.value()*other.value()))); 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>, 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>, 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type> > > 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const AutoDiffScalar<OtherDerType>& other) const 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::make_coherent(m_derivatives, other.derivatives()); 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<const CwiseBinaryOp<internal::scalar_sum_op<Scalar>, 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DerType>, 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const typename internal::remove_all<OtherDerType>::type > > >( 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_value * other.value(), 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (m_derivatives * other.value()) + (m_value * other.derivatives())); 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator*=(const Scalar& other) 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this * other; 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator*=(const AutoDiffScalar<OtherDerType>& other) 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this * other; 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator/=(const Scalar& other) 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this / other; 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerType> 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar& operator/=(const AutoDiffScalar<OtherDerType>& other) 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this / other; 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar m_value; 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DerType m_derivatives; 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DerType> 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct auto_diff_special_op<_DerType, true> 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// : auto_diff_scalar_op<_DerType, typename NumTraits<Scalar>::Real, 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// is_same<Scalar,typename NumTraits<Scalar>::Real>::value> 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename remove_all<_DerType>::type DerType; 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<DerType>::Scalar Scalar; 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real Real; 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// typedef auto_diff_scalar_op<_DerType, typename NumTraits<Scalar>::Real, 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// is_same<Scalar,typename NumTraits<Scalar>::Real>::value> Base; 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator+; 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator+=; 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator-; 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator-=; 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator*; 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::operator*=; 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const AutoDiffScalar<_DerType>& derived() const { return *static_cast<const AutoDiffScalar<_DerType>*>(this); } 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AutoDiffScalar<_DerType>& derived() { return *static_cast<AutoDiffScalar<_DerType>*>(this); } 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<DerType&> operator+(const Real& other) const 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<DerType&>(derived().value() + other, derived().derivatives()); 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar<_DerType>& b) 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives()); 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar<_DerType>& operator+=(const Real& other) 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().value() += other; 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type > 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const Real& other) const 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >( 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().value() * other, 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().derivatives() * other); 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline const AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type > 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const Real& other, const AutoDiffScalar<_DerType>& a) 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<typename CwiseUnaryOp<scalar_multiple2_op<Scalar,Real>, DerType>::Type >( 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.value() * other, 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.derivatives() * other); 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline AutoDiffScalar<_DerType>& operator*=(const Scalar& other) 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = *this * other; 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DerType> 441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct auto_diff_special_op<_DerType, false> 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void operator*() const; 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void operator-() const; 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void operator+() const; 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, typename B> 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>, B> { 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A; 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run(A& a, B& b) { 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0)) 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.resize(b.size()); 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.setZero(); 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A, typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols> 461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct make_coherent_impl<A, Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > { 462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B; 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run(A& a, B& b) { 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0)) 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath b.resize(a.size()); 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath b.setZero(); 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, 473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols> 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>, 475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > { 476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A; 477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B; 478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static void run(A& a, B& b) { 479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0)) 480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.resize(b.size()); 482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath a.setZero(); 483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0)) 485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath b.resize(a.size()); 487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath b.setZero(); 488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols> struct scalar_product_traits<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>,A_Scalar> 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> ReturnType; 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols> struct scalar_product_traits<A_Scalar, Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> > 498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> ReturnType; 500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> 503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_product_traits<AutoDiffScalar<DerType>,typename DerType::Scalar> 504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<DerType> ReturnType; 506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \ 511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DerType> \ 512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 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> > \ 513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath FUNC(const Eigen::AutoDiffScalar<DerType>& x) { \ 514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; \ 515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar Scalar; \ 516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const typename Eigen::internal::remove_all<DerType>::type> > ReturnType; \ 517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CODE; \ 518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> 521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const AutoDiffScalar<DerType>& conj(const AutoDiffScalar<DerType>& x) { return x; } 522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> 523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const AutoDiffScalar<DerType>& real(const AutoDiffScalar<DerType>& x) { return x; } 524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> 525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DerType::Scalar imag(const AutoDiffScalar<DerType>&) { return 0.; } 526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType, typename T> 527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline AutoDiffScalar<DerType> (min)(const AutoDiffScalar<DerType>& x, const T& y) { return (x <= y ? x : y); } 528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType, typename T> 529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline AutoDiffScalar<DerType> (max)(const AutoDiffScalar<DerType>& x, const T& y) { return (x >= y ? x : y); } 530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType, typename T> 531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline AutoDiffScalar<DerType> (min)(const T& x, const AutoDiffScalar<DerType>& y) { return (x < y ? x : y); } 532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType, typename T> 533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline AutoDiffScalar<DerType> (max)(const T& x, const AutoDiffScalar<DerType>& y) { return (x > y ? x : y); } 534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define sign(x) x >= 0 ? 1 : -1 // required for abs function below 536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs, 538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::abs; 539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(abs(x.value()), x.derivatives() * (sign(x.value())));) 540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs2, 542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using internal::abs2; 543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(abs2(x.value()), x.derivatives() * (Scalar(2)*x.value()));) 544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt, 546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::sqrt; 547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar sqrtx = sqrt(x.value()); 548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));) 549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos, 551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::cos; 552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::sin; 553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(cos(x.value()), x.derivatives() * (-sin(x.value())));) 554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin, 556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::sin; 557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::cos; 558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(sin(x.value()),x.derivatives() * cos(x.value()));) 559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp, 561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::exp; 562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar expx = exp(x.value()); 563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(expx,x.derivatives() * expx);) 564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log, 566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::log; 567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));) 568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> 570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Eigen::AutoDiffScalar<Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<typename Eigen::internal::traits<DerType>::Scalar>, const DerType> > 571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpow(const Eigen::AutoDiffScalar<DerType>& x, typename Eigen::internal::traits<DerType>::Scalar y) 572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using namespace Eigen; 574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Eigen::internal::traits<DerType>::Scalar Scalar; 575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return AutoDiffScalar<CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const DerType> >( 576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::pow(x.value(),y), 577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x.derivatives() * (y * std::pow(x.value(),y-1))); 578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerTypeA,typename DerTypeB> 582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const AutoDiffScalar<Matrix<typename internal::traits<DerTypeA>::Scalar,Dynamic,1> > 583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathatan2(const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b) 584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::atan2; 586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::max; 587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<DerTypeA>::Scalar Scalar; 588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<Matrix<Scalar,Dynamic,1> > PlainADS; 589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PlainADS ret; 590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ret.value() = atan2(a.value(), b.value()); 591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar tmp2 = a.value() * a.value(); 593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar tmp3 = b.value() * b.value(); 594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar tmp4 = tmp3/(tmp2+tmp3); 595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (tmp4!=0) 597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ret.derivatives() = (a.derivatives() * b.value() - a.value() * b.derivatives()) * (tmp2+tmp3); 598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ret; 600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tan, 603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::tan; 604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::cos; 605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(tan(x.value()),x.derivatives() * (Scalar(1)/internal::abs2(cos(x.value()))));) 606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(asin, 608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::sqrt; 609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::asin; 610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(asin(x.value()),x.derivatives() * (Scalar(1)/sqrt(1-internal::abs2(x.value()))));) 611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(acos, 613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::sqrt; 614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::acos; 615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ReturnType(acos(x.value()),x.derivatives() * (Scalar(-1)/sqrt(1-internal::abs2(x.value()))));) 616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY 618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DerType> struct NumTraits<AutoDiffScalar<DerType> > 620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : NumTraits< typename NumTraits<typename DerType::Scalar>::Real > 621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerType::Scalar>::Real,DerType::RowsAtCompileTime,DerType::ColsAtCompileTime> > Real; 623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<DerType> NonInteger; 624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef AutoDiffScalar<DerType>& Nested; 625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum{ 626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RequireInitialization = 1 627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_AUTODIFF_SCALAR_H 633