10 #ifndef EIGEN_AUTODIFF_VECTOR_H
11 #define EIGEN_AUTODIFF_VECTOR_H
32 template<
typename ValueType,
typename JacobianType>
37 typedef typename internal::traits<ValueType>::Scalar BaseScalar;
38 typedef AutoDiffScalar<Matrix<BaseScalar,JacobianType::RowsAtCompileTime,1> > ActiveScalar;
39 typedef ActiveScalar Scalar;
40 typedef AutoDiffScalar<typename JacobianType::ColXpr> CoeffType;
41 typedef typename JacobianType::Index Index;
43 inline AutoDiffVector() {}
45 inline AutoDiffVector(
const ValueType& values)
52 CoeffType operator[] (Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
53 const CoeffType operator[] (Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
55 CoeffType operator() (Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
56 const CoeffType operator() (Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
58 CoeffType coeffRef(Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
59 const CoeffType coeffRef(Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
61 Index size()
const {
return m_values.size(); }
64 Scalar sum()
const {
return Scalar(m_values.sum(), m_jacobian.rowwise().sum()); }
67 inline AutoDiffVector(
const ValueType& values,
const JacobianType& jac)
68 : m_values(values), m_jacobian(jac)
71 template<
typename OtherValueType,
typename OtherJacobianType>
72 inline AutoDiffVector(
const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
73 : m_values(other.values()), m_jacobian(other.jacobian())
76 inline AutoDiffVector(
const AutoDiffVector& other)
77 : m_values(other.values()), m_jacobian(other.jacobian())
80 template<
typename OtherValueType,
typename OtherJacobianType>
81 inline AutoDiffVector& operator=(
const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
83 m_values = other.values();
84 m_jacobian = other.jacobian();
88 inline AutoDiffVector& operator=(
const AutoDiffVector& other)
90 m_values = other.values();
91 m_jacobian = other.jacobian();
95 inline const ValueType& values()
const {
return m_values; }
96 inline ValueType& values() {
return m_values; }
98 inline const JacobianType& jacobian()
const {
return m_jacobian; }
99 inline JacobianType& jacobian() {
return m_jacobian; }
101 template<
typename OtherValueType,
typename OtherJacobianType>
102 inline const AutoDiffVector<
103 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,
104 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >
105 operator+(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
const
107 return AutoDiffVector<
108 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,
109 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >(
110 m_values + other.values(),
111 m_jacobian + other.jacobian());
114 template<
typename OtherValueType,
typename OtherJacobianType>
115 inline AutoDiffVector&
116 operator+=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
118 m_values += other.values();
119 m_jacobian += other.jacobian();
123 template<
typename OtherValueType,
typename OtherJacobianType>
124 inline const AutoDiffVector<
125 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
126 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >
127 operator-(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
const
129 return AutoDiffVector<
130 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
131 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >(
132 m_values - other.values(),
133 m_jacobian - other.jacobian());
136 template<
typename OtherValueType,
typename OtherJacobianType>
137 inline AutoDiffVector&
138 operator-=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
140 m_values -= other.values();
141 m_jacobian -= other.jacobian();
145 inline const AutoDiffVector<
146 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
147 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >
150 return AutoDiffVector<
151 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
152 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >(
157 inline const AutoDiffVector<
158 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
159 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>
160 operator*(
const BaseScalar& other)
const
162 return AutoDiffVector<
163 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
164 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
169 friend inline const AutoDiffVector<
170 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
171 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >
172 operator*(
const Scalar& other,
const AutoDiffVector& v)
174 return AutoDiffVector<
175 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
176 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
178 v.jacobian() * other);
198 inline AutoDiffVector& operator*=(
const Scalar& other)
205 template<
typename OtherValueType,
typename OtherJacobianType>
206 inline AutoDiffVector& operator*=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
208 *
this = *
this * other;
214 JacobianType m_jacobian;
220 #endif // EIGEN_AUTODIFF_VECTOR_H