25 #ifndef EIGEN_AUTODIFF_VECTOR_H
26 #define EIGEN_AUTODIFF_VECTOR_H
47 template<
typename ValueType,
typename JacobianType>
52 typedef typename internal::traits<ValueType>::Scalar BaseScalar;
53 typedef AutoDiffScalar<Matrix<BaseScalar,JacobianType::RowsAtCompileTime,1> > ActiveScalar;
54 typedef ActiveScalar Scalar;
55 typedef AutoDiffScalar<typename JacobianType::ColXpr> CoeffType;
56 typedef typename JacobianType::Index Index;
58 inline AutoDiffVector() {}
60 inline AutoDiffVector(
const ValueType& values)
67 CoeffType operator[] (Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
68 const CoeffType operator[] (Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
70 CoeffType operator() (Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
71 const CoeffType operator() (Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
73 CoeffType coeffRef(Index i) {
return CoeffType(m_values[i], m_jacobian.col(i)); }
74 const CoeffType coeffRef(Index i)
const {
return CoeffType(m_values[i], m_jacobian.col(i)); }
76 Index size()
const {
return m_values.size(); }
79 Scalar sum()
const {
return Scalar(m_values.sum(), m_jacobian.rowwise().sum()); }
82 inline AutoDiffVector(
const ValueType& values,
const JacobianType& jac)
83 : m_values(values), m_jacobian(jac)
86 template<
typename OtherValueType,
typename OtherJacobianType>
87 inline AutoDiffVector(
const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
88 : m_values(other.values()), m_jacobian(other.jacobian())
91 inline AutoDiffVector(
const AutoDiffVector& other)
92 : m_values(other.values()), m_jacobian(other.jacobian())
95 template<
typename OtherValueType,
typename OtherJacobianType>
96 inline AutoDiffVector& operator=(
const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
98 m_values = other.values();
99 m_jacobian = other.jacobian();
103 inline AutoDiffVector& operator=(
const AutoDiffVector& other)
105 m_values = other.values();
106 m_jacobian = other.jacobian();
110 inline const ValueType& values()
const {
return m_values; }
111 inline ValueType& values() {
return m_values; }
113 inline const JacobianType& jacobian()
const {
return m_jacobian; }
114 inline JacobianType& jacobian() {
return m_jacobian; }
116 template<
typename OtherValueType,
typename OtherJacobianType>
117 inline const AutoDiffVector<
118 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>
::Type,
119 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>
::Type >
120 operator+(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
const
122 return AutoDiffVector<
123 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>
::Type,
124 typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >(
125 m_values + other.values(),
126 m_jacobian + other.jacobian());
129 template<
typename OtherValueType,
typename OtherJacobianType>
130 inline AutoDiffVector&
131 operator+=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
133 m_values += other.values();
134 m_jacobian += other.jacobian();
138 template<
typename OtherValueType,
typename OtherJacobianType>
139 inline const AutoDiffVector<
140 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
141 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >
142 operator-(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
const
144 return AutoDiffVector<
145 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
146 typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >(
147 m_values - other.values(),
148 m_jacobian - other.jacobian());
151 template<
typename OtherValueType,
typename OtherJacobianType>
152 inline AutoDiffVector&
153 operator-=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
155 m_values -= other.values();
156 m_jacobian -= other.jacobian();
160 inline const AutoDiffVector<
161 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
162 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >
165 return AutoDiffVector<
166 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
167 typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >(
172 inline const AutoDiffVector<
173 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
174 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>
177 return AutoDiffVector<
178 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
179 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
184 friend inline const AutoDiffVector<
185 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
186 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >
187 operator*(
const Scalar& other,
const AutoDiffVector& v)
189 return AutoDiffVector<
190 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
191 typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
193 v.jacobian() * other);
213 inline AutoDiffVector& operator*=(
const Scalar& other)
220 template<
typename OtherValueType,
typename OtherJacobianType>
221 inline AutoDiffVector& operator*=(
const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
223 *
this = *
this * other;
229 JacobianType m_jacobian;
235 #endif // EIGEN_AUTODIFF_VECTOR_H