29 #ifndef __ADTypeOrder1_H
30 #define __ADTypeOrder1_H 1
33 #include <boost/numeric/ublas/vector.hpp>
35 #include <boost/numeric/ublas/io.hpp>
55 template<
typename T,
int Nvar,
int Var>
56 class ADType<T, Nvar, 1, Var>
63 typedef ADVariable<Var> variable_type;
67 typedef boost::numeric::ublas::vector<value_type> gradient_type;
70 typedef std::vector<int> deps_type;
71 typedef ADType<T,Nvar, 1, Var> This;
72 typedef std::set<int> dependency_type;
74 template<
typename NumT,
int NumVar,
int Order,
int VarNum>
friend class ADType;
87 ADType( value_type
val )
94 M_grad = boost::numeric::ublas::zero_vector<value_type>( nvar );
104 ADType( ADType<T,Nvar,1,VarNum>
const& sad )
107 M_grad( sad.M_grad ),
113 template<
typename ExprT>
114 ADType (
const ADExpr<ExprT>& expr )
118 __dep( nvar, false ),
128 value_type value()
const
132 deps_type deps()
const
138 bool deps(
int __i )
const
140 ENSURE( __i >= 0 && __i < nvar );
144 value_type grad(
int __i )
const
146 return M_grad( __i );
149 gradient_type grad()
const
164 bool& deps(
int __i )
166 ENSURE( __i >= 0 && __i < nvar );
169 value_type& grad(
int __i )
171 return M_grad( __i );
174 gradient_type& grad()
187 template <
class ExprT> This&
operator=(
const ADExpr<ExprT>& expr );
190 ADExpr< ADUnaryPlus< This > > operator+ ()
const
192 typedef ADUnaryPlus<This> expr_t;
193 return ADExpr<expr_t> ( expr_t ( *
this ) );
197 ADExpr< ADUnaryMinus< This > > operator- ()
const
199 typedef ADUnaryMinus<This> expr_t;
200 return ADExpr<expr_t> ( expr_t ( *
this ) );
203 #define AD_UNARY_OP( op ) \
204 This& operator op ( value_type val ) \
217 This& operator += ( This
const& sad )
220 M_grad += sad.M_grad;
223 This& operator -= ( This
const& sad )
226 M_grad -= sad.M_grad;
231 This& operator *= ( This
const& sad )
234 M_grad = M_grad * sad.M_val + M_val * sad.M_grad;
238 This& operator /= ( This
const& sad )
241 M_grad = ( M_grad * sad.M_val - M_val * sad.M_grad ) / ( sad.M_val * sad.M_val );
245 template<
typename Expr>
246 This& operator += ( ADExpr<Expr>
const& sad )
252 template<
typename Expr>
253 This& operator -= ( ADExpr<Expr>
const& sad )
259 template<
typename Expr>
260 This& operator *= ( ADExpr<Expr>
const& sad )
266 template<
typename Expr>
267 This& operator /= ( ADExpr<Expr>
const& sad )
277 gradient_type M_grad;
280 dependency_type __deps;
283 template<
typename T,
int Nvar,
int Var>
284 ADType<T, Nvar, 1, Var>&
288 M_grad = boost::numeric::ublas::zero_vector<value_type>( nvar );
293 template<
typename T,
int Nvar,
int Var>
294 ADType<T, Nvar, 1, Var>&
302 template<
typename T,
int Nvar,
int Var>
303 template <
class ExprT>
304 ADType<T,Nvar, 1, Var> &
307 M_val = expr.value();
311 for (
int __i = 0; __i < nvar; ++__i )
314 __dep( __i ) = expr.deps( __i );
319 __deps.insert( __i );
324 if ( ! __deps.empty() && __deps.size() < nvar )
329 dependency_type::iterator __begin = __deps.begin();
330 dependency_type::iterator __end = __deps.end();
332 dependency_type::iterator __it = __begin;
334 while ( __it != __end )
336 M_grad( *__it )= expr.grad( *__it );
345 for (
int __i = 0; __i < nvar; ++__i )
347 M_grad( __i )= expr.grad( __i );
363 template <
class T,
int Nvar,
int Var>
365 operator << ( std::ostream& os, const Feel::ADType<T, Nvar, 1, Var>& a )
367 os.setf( std::ios::fixed,std::ios::floatfield );
369 os <<
"value = " << a.value() <<
" \n";
370 os <<
"gradient = " << a.grad() <<
"\n";