@@ -53,6 +53,12 @@ class ADObj : public ADExpr<ADObj<T>, T> {
5353 }
5454
5555 // Initialize with both values
56+ template <typename U = T,
57+ std::enable_if_t <std::is_reference<U>::value, bool > = true >
58+ A2D_FUNCTION ADObj (T& A, T& Ab) : A(A), Ab(Ab) {}
59+
60+ template <typename U = T,
61+ std::enable_if_t <!std::is_reference<U>::value, bool > = true >
5662 A2D_FUNCTION ADObj (const T& A, const T& Ab) : A(A), Ab(Ab) {}
5763
5864 // Evaluation and derivatives
@@ -73,6 +79,39 @@ class ADObj : public ADExpr<ADObj<T>, T> {
7379 A2D_FUNCTION T& bvalue () { return Ab; }
7480 A2D_FUNCTION const T& bvalue () const { return Ab; }
7581
82+ template <typename I, typename U = T,
83+ std::enable_if_t <
84+ is_a2d_vector<typename remove_const_and_refs<U>::type>::value,
85+ bool > = true >
86+ A2D_FUNCTION ADObj<type&> operator [](const I i) {
87+ return ADObj<type&>(A[i], Ab[i]);
88+ }
89+
90+ template <typename I, typename U = T,
91+ std::enable_if_t <
92+ is_a2d_vector<typename remove_const_and_refs<U>::type>::value,
93+ bool > = true >
94+ A2D_FUNCTION ADObj<type&> operator ()(const I i) {
95+ return ADObj<type&>(A[i], Ab[i]);
96+ }
97+
98+ template <typename I, typename U = T,
99+ std::enable_if_t <
100+ is_a2d_matrix<typename remove_const_and_refs<U>::type>::value,
101+ bool > = true >
102+ A2D_FUNCTION ADObj<type&> operator ()(const I i, const I j) {
103+ return ADObj<type&>(A (i, j), Ab (i, j));
104+ }
105+
106+ template <
107+ typename I, typename U = T,
108+ std::enable_if_t <
109+ is_a2d_sym_matrix<typename remove_const_and_refs<U>::type>::value,
110+ bool > = true >
111+ A2D_FUNCTION ADObj<type&> operator ()(const I i, const I j) {
112+ return ADObj<type&>(A (i, j), Ab (i, j));
113+ }
114+
76115 private:
77116 T A; // Object
78117 T Ab; // Reverse mode derivative value
@@ -136,6 +175,13 @@ class A2DObj : public A2DExpr<A2DObj<T>, T> {
136175 Ah = type (0.0 );
137176 }
138177 }
178+ template <typename U = T,
179+ std::enable_if_t <std::is_reference<U>::value, bool > = true >
180+ A2D_FUNCTION A2DObj (T& A, T& Ab, T& Ap, T& Ah)
181+ : A(A), Ab(Ab), Ap(Ap), Ah(Ah) {}
182+
183+ template <typename U = T,
184+ std::enable_if_t <!std::is_reference<U>::value, bool > = true >
139185 A2D_FUNCTION A2DObj (const T& A, const T& Ab, const T& Ap, const T& Ah)
140186 : A(A), Ab(Ab), Ap(Ap), Ah(Ah) {}
141187
@@ -168,6 +214,39 @@ class A2DObj : public A2DExpr<A2DObj<T>, T> {
168214 A2D_FUNCTION T& hvalue () { return Ah; }
169215 A2D_FUNCTION const T& hvalue () const { return Ah; }
170216
217+ template <typename I, typename U = T,
218+ std::enable_if_t <
219+ is_a2d_vector<typename remove_const_and_refs<U>::type>::value,
220+ bool > = true >
221+ A2D_FUNCTION A2DObj<type&> operator [](const I i) {
222+ return A2DObj<type&>(A[i], Ab[i], Ap[i], Ah[i]);
223+ }
224+
225+ template <typename I, typename U = T,
226+ std::enable_if_t <
227+ is_a2d_vector<typename remove_const_and_refs<U>::type>::value,
228+ bool > = true >
229+ A2D_FUNCTION A2DObj<type&> operator ()(const I i) {
230+ return A2DObj<type&>(A[i], Ab[i], Ap[i], Ah[i]);
231+ }
232+
233+ template <typename I, typename U = T,
234+ std::enable_if_t <
235+ is_a2d_matrix<typename remove_const_and_refs<U>::type>::value,
236+ bool > = true >
237+ A2D_FUNCTION A2DObj<type&> operator ()(const I i, const I j) {
238+ return A2DObj<type&>(A (i, j), Ab (i, j), Ap (i, j), Ah (i, j));
239+ }
240+
241+ template <
242+ typename I, typename U = T,
243+ std::enable_if_t <
244+ is_a2d_sym_matrix<typename remove_const_and_refs<U>::type>::value,
245+ bool > = true >
246+ A2D_FUNCTION ADObj<type&> operator ()(const I i, const I j) {
247+ return A2DObj<type&>(A (i, j), Ab (i, j), Ap (i, j), Ah (i, j));
248+ }
249+
171250 private:
172251 T A; // Object
173252 T Ab; // Reverse mode derivative value
0 commit comments