10 #ifndef EIGEN_AUTODIFF_SCALAR_H 11 #define EIGEN_AUTODIFF_SCALAR_H 17 template<
typename A,
typename B>
18 struct make_coherent_impl {
19 static void run(A&, B&) {}
23 template<
typename A,
typename B>
24 void make_coherent(
const A& a,
const B&b)
26 make_coherent_impl<A,B>::run(a.const_cast_derived(), b.const_cast_derived());
29 template<
typename DerivativeType,
bool Enable>
struct auto_diff_special_op;
35 template<
typename NewDerType>
66 template<
typename DerivativeType>
68 :
public internal::auto_diff_special_op
69 <DerivativeType, !internal::is_same<typename internal::traits<typename internal::remove_all<DerivativeType>::type>::Scalar,
70 typename NumTraits<typename internal::traits<typename internal::remove_all<DerivativeType>::type>::Scalar>::Real>::value>
73 typedef internal::auto_diff_special_op
74 <DerivativeType, !internal::is_same<typename internal::traits<typename internal::remove_all<DerivativeType>::type>::Scalar,
76 typedef typename internal::remove_all<DerivativeType>::type DerType;
77 typedef typename internal::traits<DerType>::Scalar Scalar;
80 using Base::operator+;
81 using Base::operator*;
89 : m_value(value), m_derivatives(DerType::Zero(nbDer))
91 m_derivatives.coeffRef(derNumber) = Scalar(1);
99 if(m_derivatives.size()>0)
100 m_derivatives.setZero();
105 : m_value(value), m_derivatives(der)
108 template<
typename OtherDerType>
110 #ifndef EIGEN_PARSED_BY_DOXYGEN
111 ,
typename internal::enable_if<
112 internal::is_same<Scalar,
typename internal::traits<
typename internal::remove_all<OtherDerType>::type>::Scalar>::value
113 && internal::is_convertible<OtherDerType,DerType>::value ,
void*>::type = 0
116 : m_value(other.value()), m_derivatives(other.derivatives())
119 friend std::ostream & operator << (std::ostream & s,
const AutoDiffScalar& a)
121 return s << a.value();
125 : m_value(other.value()), m_derivatives(other.derivatives())
128 template<
typename OtherDerType>
131 m_value = other.value();
132 m_derivatives = other.derivatives();
138 m_value = other.value();
139 m_derivatives = other.derivatives();
146 if(m_derivatives.size()>0)
147 m_derivatives.setZero();
154 inline const Scalar& value()
const {
return m_value; }
155 inline Scalar& value() {
return m_value; }
157 inline const DerType& derivatives()
const {
return m_derivatives; }
158 inline DerType& derivatives() {
return m_derivatives; }
160 inline bool operator< (
const Scalar& other)
const {
return m_value < other; }
161 inline bool operator<=(
const Scalar& other)
const {
return m_value <= other; }
162 inline bool operator> (
const Scalar& other)
const {
return m_value > other; }
163 inline bool operator>=(
const Scalar& other)
const {
return m_value >= other; }
164 inline bool operator==(
const Scalar& other)
const {
return m_value == other; }
165 inline bool operator!=(
const Scalar& other)
const {
return m_value != other; }
167 friend inline bool operator< (
const Scalar& a,
const AutoDiffScalar& b) {
return a < b.value(); }
168 friend inline bool operator<=(
const Scalar& a,
const AutoDiffScalar& b) {
return a <= b.value(); }
169 friend inline bool operator> (
const Scalar& a,
const AutoDiffScalar& b) {
return a > b.value(); }
170 friend inline bool operator>=(
const Scalar& a,
const AutoDiffScalar& b) {
return a >= b.value(); }
171 friend inline bool operator==(
const Scalar& a,
const AutoDiffScalar& b) {
return a == b.value(); }
172 friend inline bool operator!=(
const Scalar& a,
const AutoDiffScalar& b) {
return a != b.value(); }
174 template<
typename OtherDerType>
inline bool operator< (const AutoDiffScalar<OtherDerType>& b)
const {
return m_value < b.value(); }
175 template<
typename OtherDerType>
inline bool operator<=(const AutoDiffScalar<OtherDerType>& b)
const {
return m_value <= b.value(); }
207 template<
typename OtherDerType>
211 internal::make_coherent(m_derivatives, other.derivatives());
213 m_value + other.value(),
214 m_derivatives + other.derivatives());
217 template<
typename OtherDerType>
221 (*this) = (*this) + other;
233 return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>,
const DerType> >
234 (a - b.value(), -b.derivatives());
243 template<
typename OtherDerType>
247 internal::make_coherent(m_derivatives, other.derivatives());
249 m_value - other.value(),
250 m_derivatives - other.derivatives());
253 template<
typename OtherDerType>
257 *
this = *
this - other;
261 inline const AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>,
const DerType> >
264 return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>,
const DerType> >(
272 return MakeAutoDiffScalar(m_value * other, m_derivatives * other);
278 return MakeAutoDiffScalar(a.value() * other, a.derivatives() * other);
298 operator/(
const Scalar& other)
const 300 return MakeAutoDiffScalar(m_value / other, (m_derivatives * (Scalar(1)/other)));
306 return MakeAutoDiffScalar(other / a.value(), a.derivatives() * (Scalar(-other) / (a.value()*a.value())));
325 template<
typename OtherDerType>
326 inline const AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
327 CwiseBinaryOp<internal::scalar_difference_op<Scalar> EIGEN_COMMA
328 const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) EIGEN_COMMA
329 const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
typename internal::remove_all<OtherDerType>::type,Scalar,product) >,Scalar,product) >
332 internal::make_coherent(m_derivatives, other.derivatives());
333 return MakeAutoDiffScalar(
334 m_value / other.value(),
335 ((m_derivatives * other.value()) - (other.derivatives() * m_value))
336 * (Scalar(1)/(other.value()*other.value())));
339 template<
typename OtherDerType>
341 const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product),
342 const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
typename internal::remove_all<OtherDerType>::type,Scalar,product) > >
345 internal::make_coherent(m_derivatives, other.derivatives());
346 return MakeAutoDiffScalar(
347 m_value * other.value(),
348 (m_derivatives * other.value()) + (other.derivatives() * m_value));
353 *
this = *
this * other;
357 template<
typename OtherDerType>
360 *
this = *
this * other;
366 *
this = *
this / other;
370 template<
typename OtherDerType>
373 *
this = *
this / other;
379 DerType m_derivatives;
385 template<
typename DerivativeType>
386 struct auto_diff_special_op<DerivativeType, true>
390 typedef typename remove_all<DerivativeType>::type DerType;
391 typedef typename traits<DerType>::Scalar Scalar;
420 derived().value() += other;
429 derived().value() * other,
430 derived().derivatives() * other);
436 return AutoDiffScalar<typename CwiseUnaryOp<bind1st_op<scalar_product_op<Real,Scalar> >, DerType>::Type >(
438 a.derivatives() * other);
443 *
this = *
this * other;
448 template<
typename DerivativeType>
449 struct auto_diff_special_op<DerivativeType, false>
452 void operator-()
const;
453 void operator+()
const;
456 template<
typename BinOp,
typename A,
typename B,
typename RefType>
459 make_coherent(xpr.const_cast_derived().
lhs(), ref);
460 make_coherent(xpr.const_cast_derived().
rhs(), ref);
463 template<
typename UnaryOp,
typename A,
typename RefType>
470 template<
typename UnaryOp,
typename A,
typename RefType>
474 template<
typename A_Scalar,
int A_Rows,
int A_Cols,
int A_Options,
int A_MaxRows,
int A_MaxCols,
typename B>
475 struct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>, B> {
477 static void run(A& a, B& b) {
483 else if (B::SizeAtCompileTime==
Dynamic && a.size()!=0 && b.size()==0)
485 make_coherent_expression(b,a);
490 template<
typename A,
typename B_Scalar,
int B_Rows,
int B_Cols,
int B_Options,
int B_MaxRows,
int B_MaxCols>
491 struct make_coherent_impl<A, Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {
493 static void run(A& a, B& b) {
499 else if (A::SizeAtCompileTime==
Dynamic && b.size()!=0 && a.size()==0)
501 make_coherent_expression(a,b);
506 template<
typename A_Scalar,
int A_Rows,
int A_Cols,
int A_Options,
int A_MaxRows,
int A_MaxCols,
507 typename B_Scalar,
int B_Rows,
int B_Cols,
int B_Options,
int B_MaxRows,
int B_MaxCols>
508 struct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>,
509 Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {
512 static void run(A& a, B& b) {
528 template<
typename DerType,
typename BinOp>
534 template<
typename DerType,
typename BinOp>
557 #define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \ 558 template<typename DerType> \ 559 inline const Eigen::AutoDiffScalar< \ 560 EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(typename Eigen::internal::remove_all<DerType>::type, typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar, product) > \ 561 FUNC(const Eigen::AutoDiffScalar<DerType>& x) { \ 562 using namespace Eigen; \ 563 typedef typename Eigen::internal::traits<typename Eigen::internal::remove_all<DerType>::type>::Scalar Scalar; \ 564 EIGEN_UNUSED_VARIABLE(sizeof(Scalar)); \ 568 template<
typename DerType>
569 struct CleanedUpDerType {
573 template<
typename DerType>
575 template<
typename DerType>
577 template<
typename DerType>
579 template<
typename DerType,
typename T>
582 return (x <= y ? ADS(x) : ADS(y));
584 template<
typename DerType,
typename T>
587 return (x >= y ? ADS(x) : ADS(y));
589 template<
typename DerType,
typename T>
592 return (x < y ? ADS(x) : ADS(y));
594 template<
typename DerType,
typename T>
597 return (x > y ? ADS(x) : ADS(y));
599 template<
typename DerType>
601 return (x.value() < y.value() ? x : y);
603 template<
typename DerType>
605 return (x.value() >= y.value() ? x : y);
609 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
abs,
611 return Eigen::MakeAutoDiffScalar(
abs(x.value()), x.derivatives() * (x.value()<0 ? -1 : 1) );)
613 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
abs2,
615 return Eigen::MakeAutoDiffScalar(
abs2(x.value()), x.derivatives() * (Scalar(2)*x.value()));)
617 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
sqrt,
619 Scalar sqrtx =
sqrt(x.value());
620 return Eigen::MakeAutoDiffScalar(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));)
622 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
cos,
625 return Eigen::MakeAutoDiffScalar(
cos(x.value()), x.derivatives() * (-
sin(x.value())));)
627 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
sin,
630 return Eigen::MakeAutoDiffScalar(
sin(x.value()),x.derivatives() *
cos(x.value()));)
632 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
exp,
634 Scalar expx =
exp(x.value());
635 return Eigen::MakeAutoDiffScalar(expx,x.derivatives() * expx);)
637 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
log,
639 return Eigen::MakeAutoDiffScalar(
log(x.value()),x.derivatives() * (Scalar(1)/x.value()));)
641 template<typename DerType>
643 EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
typename internal::remove_all<DerType>::type,
typename internal::traits<
typename internal::remove_all<DerType>::type>::Scalar,product) >
646 using namespace Eigen;
648 return Eigen::MakeAutoDiffScalar(pow(x.value(),y), x.derivatives() * (y * pow(x.value(),y-1)));
652 template<
typename DerTypeA,
typename DerTypeB>
657 typedef typename internal::traits<typename internal::remove_all<DerTypeA>::type>::Scalar Scalar;
660 ret.value() = atan2(a.value(), b.value());
662 Scalar squared_hypot = a.value() * a.value() + b.value() * b.value();
665 ret.derivatives() = (a.derivatives() * b.value() - a.value() * b.derivatives()) / squared_hypot;
670 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
tan,
673 return Eigen::MakeAutoDiffScalar(
tan(x.value()),x.derivatives() * (Scalar(1)/numext::abs2(
cos(x.value()))));)
675 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
asin,
678 return Eigen::MakeAutoDiffScalar(
asin(x.value()),x.derivatives() * (Scalar(1)/
sqrt(1-numext::abs2(x.value()))));)
680 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
acos,
683 return Eigen::MakeAutoDiffScalar(
acos(x.value()),x.derivatives() * (Scalar(-1)/
sqrt(1-numext::abs2(x.value()))));)
685 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
tanh,
688 return Eigen::MakeAutoDiffScalar(
tanh(x.value()),x.derivatives() * (Scalar(1)/numext::abs2(
cosh(x.value()))));)
690 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
sinh,
693 return Eigen::MakeAutoDiffScalar(
sinh(x.value()),x.derivatives() *
cosh(x.value()));)
695 EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
cosh,
698 return Eigen::MakeAutoDiffScalar(
cosh(x.value()),x.derivatives() *
sinh(x.value()));)
700 #undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY
703 :
NumTraits<
typename NumTraits<
typename internal::remove_all<DerType>::type::Scalar>::Real >
705 typedef typename internal::remove_all<DerType>::type DerTypeCleaned;
707 0, DerTypeCleaned::MaxRowsAtCompileTime, DerTypeCleaned::MaxColsAtCompileTime> > Real;
712 RequireInitialization = 1
720 template <
typename T>
722 :
public numeric_limits<typename T::Scalar> {};
724 template <
typename T>
726 :
public numeric_limits<typename T::Scalar> {};
730 #endif // EIGEN_AUTODIFF_SCALAR_H const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tanh_op< typename Derived::Scalar >, const Derived > tanh(const Eigen::ArrayBase< Derived > &x)
const internal::remove_all< XprTypeNested >::type & nestedExpression() const
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sinh_op< typename Derived::Scalar >, const Derived > sinh(const Eigen::ArrayBase< Derived > &x)
const _LhsNested & lhs() const
A scalar type replacement with automatic differentiation capability.
Definition: AutoDiffScalar.h:33
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_conjugate_op< typename Derived::Scalar >, const Derived > conj(const Eigen::ArrayBase< Derived > &x)
Namespace containing all symbols from the Eigen library.
Definition: AutoDiffScalar.h:718
void resize(Index rows, Index cols)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_asin_op< typename Derived::Scalar >, const Derived > asin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_abs2_op< typename Derived::Scalar >, const Derived > abs2(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_acos_op< typename Derived::Scalar >, const Derived > acos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cos_op< typename Derived::Scalar >, const Derived > cos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_imag_op< typename Derived::Scalar >, const Derived > imag(const Eigen::ArrayBase< Derived > &x)
AutoDiffScalar(const Scalar &value, int nbDer, int derNumber)
Definition: AutoDiffScalar.h:88
AutoDiffScalar(const Real &value)
Definition: AutoDiffScalar.h:96
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_abs_op< typename Derived::Scalar >, const Derived > abs(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cosh_op< typename Derived::Scalar >, const Derived > cosh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log_op< typename Derived::Scalar >, const Derived > log(const Eigen::ArrayBase< Derived > &x)
AutoDiffScalar()
Definition: AutoDiffScalar.h:84
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tan_op< typename Derived::Scalar >, const Derived > tan(const Eigen::ArrayBase< Derived > &x)
AutoDiffScalar(const Scalar &value, const DerType &der)
Definition: AutoDiffScalar.h:104
const _RhsNested & rhs() const
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sin_op< typename Derived::Scalar >, const Derived > sin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_exp_op< typename Derived::Scalar >, const Derived > exp(const Eigen::ArrayBase< Derived > &x)
const Product< SparseDerived, PermDerived, AliasFreeProduct > operator*(const SparseMatrixBase< SparseDerived > &matrix, const PermutationBase< PermDerived > &perm)