16 template <
int D,
typename SCAL =
double>
class AutoDiffRec;
24template <
int D,
typename SCAL =
double>
54 for (
int i = 0; i < D; i++)
62 for (
int i = 0; i < D; i++)
77 for (
int i = 0; i < D; i++)
85 INLINE SCAL
Value()
const throw() {
return val; }
88 INLINE SCAL
DValue (
int i)
const throw() {
return dval[i]; }
91 INLINE
void StoreGradient (SCAL * p)
const
93 for (
int i = 0; i < D; i++)
97 INLINE
void LoadGradient (
const SCAL * p)
99 for (
int i = 0; i < D; i++)
104 INLINE SCAL &
Value() throw() {
return val; }
107 INLINE SCAL &
DValue (
int i)
throw() {
return dval[i]; }
114template<
int D,
typename SCAL>
117 ost << x.
Value() <<
", D = ";
118 for (
int i = 0; i < D; i++)
119 ost << x.
DValue(i) <<
" ";
124template<
int D,
typename SCAL>
128 res.
Value () = x.Value()+y.Value();
130 for (
int i = 0; i < D; i++)
131 res.
DValue(i) = x.DValue(i) + y.DValue(i);
137template<
int D,
typename SCAL>
141 res.
Value() = x.Value()-y.Value();
143 for (
int i = 0; i < D; i++)
144 res.
DValue(i) = x.DValue(i) - y.DValue(i);
149 template<
int D,
typename SCAL,
typename SCAL2,
150 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
154 res.
Value() = x+y.Value();
155 for (
int i = 0; i < D; i++)
156 res.
DValue(i) = y.DValue(i);
161 template<
int D,
typename SCAL,
typename SCAL2,
162 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
166 res.
Value() = x+y.Value();
167 for (
int i = 0; i < D; i++)
168 res.
DValue(i) = y.DValue(i);
174template<
int D,
typename SCAL>
178 res.
Value() = -x.Value();
179 for (
int i = 0; i < D; i++)
180 res.
DValue(i) = -x.DValue(i);
185 template<
int D,
typename SCAL,
typename SCAL2,
186 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
190 res.
Value() = x.Value()-y;
191 for (
int i = 0; i < D; i++)
192 res.
DValue(i) = x.DValue(i);
197 template<
int D,
typename SCAL,
typename SCAL2,
198 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
199INLINE AutoDiffVec<D,SCAL> operator- (SCAL2 x,
const AutoDiffVec<D,SCAL> & y)
throw()
201 AutoDiffVec<D,SCAL> res;
203 for (
int i = 0; i < D; i++)
210 template<
int D,
typename SCAL,
typename SCAL2,
211 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
216 for (
int i = 0;
i <
D;
i++)
222 template<
int D,
typename SCAL,
typename SCAL2,
223 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
229 for (
int i = 0;
i <
D;
i++)
235template<
int D,
typename SCAL>
243 for (
int i = 0;
i <
D;
i++)
251template<
int D,
typename SCAL>
252INLINE AutoDiffVec<D,SCAL> sqr (
const AutoDiffVec<D,SCAL> & x)
throw()
254 AutoDiffVec<D,SCAL> res;
258 for (
int i = 0; i < D; i++)
264template<
int D,
typename SCAL>
268 for (
int i = 0;
i <
D;
i++)
275template<
int D,
typename SCAL>
282template<
int D,
typename SCAL,
typename SCAL2,
283 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
290template<
int D,
typename SCAL,
typename SCAL2,
291 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
300 template <
int D,
typename SCAL,
typename SCAL2>
301 INLINE AutoDiffVec<D,SCAL> & operator+= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
throw()
309 template <
int D,
typename SCAL>
310 INLINE AutoDiffVec<D,SCAL> & operator+= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
312 x.Value() += y.Value();
313 for (
int i = 0; i < D; i++)
314 x.DValue(i) += y.DValue(i);
319 template <
int D,
typename SCAL>
320 INLINE AutoDiffVec<D,SCAL> & operator-= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
322 x.Value() -= y.Value();
323 for (
int i = 0; i < D; i++)
324 x.DValue(i) -= y.DValue(i);
329 template <
int D,
typename SCAL,
typename SCAL2>
330 INLINE AutoDiffVec<D,SCAL> & operator-= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
337 template <
int D,
typename SCAL>
338 INLINE AutoDiffVec<D,SCAL> & operator*= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
340 for (
int i = 0; i < D; i++)
341 x.DValue(i) = x.DValue(i)*y.Value() + x.Value() * y.DValue(i);
342 x.Value() *= y.Value();
347 template <
int D,
typename SCAL,
typename SCAL2>
348 INLINE AutoDiffVec<D,SCAL> & operator*= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
351 for (
int i = 0; i < D; i++)
357 template <
int D,
typename SCAL>
358 INLINE AutoDiffVec<D,SCAL> & operator/= (AutoDiffVec<D,SCAL> & x, SCAL y)
362 for (
int i = 0; i < D; i++)
371 template <
int D,
typename SCAL>
372 INLINE
bool operator== (AutoDiffVec<D,SCAL> x, SCAL val2)
374 return x.Value() == val2;
378 template <
int D,
typename SCAL>
379 INLINE
bool operator!= (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
381 return x.Value() != val2;
385 template <
int D,
typename SCAL>
386 INLINE
bool operator< (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
388 return x.Value() < val2;
392 template <
int D,
typename SCAL>
393 INLINE
bool operator> (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
395 return x.Value() > val2;
401template<
int D,
typename SCAL>
402INLINE AutoDiffVec<D,SCAL> fabs (
const AutoDiffVec<D,SCAL> & x)
404 double abs = fabs (x.Value());
405 AutoDiffVec<D,SCAL> res( abs );
407 for (
int i = 0; i < D; i++)
408 res.DValue(i) = x.Value()*x.DValue(i) / abs;
410 for (
int i = 0; i < D; i++)
416template<
int D,
typename SCAL>
417INLINE AutoDiffVec<D,SCAL> sqrt (
const AutoDiffVec<D,SCAL> & x)
419 AutoDiffVec<D,SCAL> res;
420 res.Value() = sqrt(x.Value());
421 for (
int j = 0; j < D; j++)
422 res.DValue(j) = 0.5 / res.Value() * x.DValue(j);
427template <
int D,
typename SCAL>
428AutoDiffVec<D,SCAL> log (AutoDiffVec<D,SCAL> x)
430 AutoDiffVec<D,SCAL> res;
431 res.Value() = log(x.Value());
432 for (
int k = 0; k < D; k++)
433 res.DValue(k) = x.DValue(k) / x.Value();
438template <
int D,
typename SCAL>
439INLINE AutoDiffVec<D,SCAL> exp (AutoDiffVec<D,SCAL> x)
441 AutoDiffVec<D,SCAL> res;
442 res.Value() = exp(x.Value());
443 for (
int k = 0; k < D; k++)
444 res.DValue(k) = x.DValue(k) * res.Value();
449template <
int D,
typename SCAL>
450INLINE AutoDiffVec<D,SCAL> pow (AutoDiffVec<D,SCAL> x, AutoDiffVec<D,SCAL> y )
452 return exp(log(x)*y);
469template <
int D,
typename SCAL>
470INLINE AutoDiffVec<D,SCAL> sin (AutoDiffVec<D,SCAL> x)
472 return sin(AutoDiffRec<D,SCAL>(x));
488template <
int D,
typename SCAL>
489INLINE AutoDiffVec<D,SCAL> cos (AutoDiffVec<D,SCAL> x)
491 return cos(AutoDiffRec<D,SCAL>(x));
495template <
int D,
typename SCAL>
496INLINE AutoDiffVec<D,SCAL> tan (AutoDiffVec<D,SCAL> x)
497{
return sin(x) / cos(x); }
500template <
int D,
typename SCAL>
501INLINE AutoDiffVec<D,SCAL> sinh (AutoDiffVec<D,SCAL> x)
503 AutoDiffVec<D,SCAL> res;
504 res.Value() = sinh(x.Value());
505 SCAL ch = cosh(x.Value());
506 for (
int k = 0; k < D; k++)
507 res.DValue(k) = x.DValue(k) * ch;
512template <
int D,
typename SCAL>
513INLINE AutoDiffVec<D,SCAL> cosh (AutoDiffVec<D,SCAL> x)
515 AutoDiffVec<D,SCAL> res;
516 res.Value() = cosh(x.Value());
517 SCAL sh = sinh(x.Value());
518 for (
int k = 0; k < D; k++)
519 res.DValue(k) = x.DValue(k) * sh;
524template <
int D,
typename SCAL>
525INLINE AutoDiffVec<D,SCAL> erf (AutoDiffVec<D,SCAL> x)
527 return erf(AutoDiffRec<D,SCAL>(x));
531template<
int D,
typename SCAL>
532INLINE AutoDiffVec<D,SCAL> floor (
const AutoDiffVec<D,SCAL> & x)
534 AutoDiffVec<D,SCAL> res;
535 res.Value() = floor(x.Value());
536 for (
int j = 0; j < D; j++)
542template<
int D,
typename SCAL>
543INLINE AutoDiffVec<D,SCAL> ceil (
const AutoDiffVec<D,SCAL> & x)
545 AutoDiffVec<D,SCAL> res;
546 res.Value() = ceil(x.Value());
547 for (
int j = 0; j < D; j++)
566template <
int D,
typename SCAL>
567AutoDiffVec<D,SCAL> atan (AutoDiffVec<D,SCAL> x)
569 return atan (AutoDiffRec<D,SCAL> (x));
573template <
int D,
typename SCAL>
574INLINE AutoDiffVec<D,SCAL> atan2 (AutoDiffVec<D,SCAL> x, AutoDiffVec<D,SCAL> y)
576 AutoDiffVec<D,SCAL> res;
577 SCAL a = atan2(x.Value(), y.Value());
579 for (
int k = 0; k < D; k++)
580 res.DValue(k) = (x.Value()*y.DValue(k)-y.Value()*x.DValue(k))/(y.Value()*y.Value()+x.Value()*x.Value());
586template <
int D,
typename SCAL>
587INLINE AutoDiffVec<D,SCAL> acos (AutoDiffVec<D,SCAL> x)
589 AutoDiffVec<D,SCAL> res;
590 SCAL a = acos(x.Value());
592 SCAL da = -1 / sqrt(1-x.Value()*x.Value());
593 for (
int k = 0; k < D; k++)
594 res.DValue(k) = x.DValue(k)*da;
600template <
int D,
typename SCAL>
601INLINE AutoDiffVec<D,SCAL> asin (AutoDiffVec<D,SCAL> x)
603 AutoDiffVec<D,SCAL> res;
604 SCAL a = asin(x.Value());
606 SCAL da = 1 / sqrt(1-x.Value()*x.Value());
607 for (
int k = 0; k < D; k++)
608 res.DValue(k) = x.DValue(k)*da;
615 template <
int D,
typename SCAL,
typename TB,
typename TC>
616 auto IfPos (AutoDiffVec<D,SCAL> a, TB b, TC c)
618 return IfPos (a.Value(), b, c);
621 template <
int D,
typename SCAL>
622 INLINE AutoDiffVec<D,SCAL> IfPos (SCAL a, AutoDiffVec<D,SCAL> b, AutoDiffVec<D,SCAL> c)
624 AutoDiffVec<D,SCAL> res;
625 res.Value() = IfPos (a, b.Value(), c.Value());
626 for (
int j = 0; j < D; j++)
627 res.DValue(j) = IfPos (a, b.DValue(j), c.DValue(j));
631 template <
int D,
typename SCAL,
typename TC>
632 INLINE AutoDiffVec<D,SCAL> IfPos (SCAL a, AutoDiffVec<D,SCAL> b, TC c)
634 return IfPos (a, b, AutoDiffVec<D,SCAL> (c));
641 template <
int D,
typename SCAL>
661 for (
int i = 0;
i <
D;
i++)
670 INLINE auto Rec()
const {
return rec; }
671 INLINE auto Last()
const {
return last; }
672 INLINE auto & Rec() {
return rec; }
673 INLINE auto & Last() {
return last; }
677 for (
int i = 0;
i <
D;
i++)
683 template<
int D,
typename SCAL>
689 template <
typename SCAL>
708 INLINE auto Rec()
const {
return val; }
710 INLINE auto & Rec() {
return val; }
711 INLINE auto & Last() {
return val; }
716 template <
typename SCAL>
740 INLINE SCAL DValue(
int )
const {
return last; }
743 INLINE auto Rec()
const {
return val; }
744 INLINE auto Last()
const {
return last; }
745 INLINE auto & Rec() {
return val; }
746 INLINE auto & Last() {
return last; }
756 template <
int D,
typename SCAL,
typename SCAL2,
757 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
763 template <
int D,
typename SCAL,
typename SCAL2,
764 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
765 INLINE AutoDiffRec<D,SCAL> operator+ (AutoDiffRec<D,SCAL> a, SCAL2 b)
767 return AutoDiffRec<D,SCAL> (a.Rec()+b, a.Last());
770 template <
int D,
typename SCAL>
771 INLINE AutoDiffRec<D,SCAL> operator+ (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
773 return AutoDiffRec<D,SCAL> (a.Rec()+b.Rec(), a.Last()+b.Last());
776 template <
int D,
typename SCAL,
typename SCAL2,
777 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
778 INLINE AutoDiffRec<D,SCAL> operator- (SCAL2 b, AutoDiffRec<D,SCAL> a)
780 return AutoDiffRec<D,SCAL> (b-a.Rec(), -a.Last());
783 template <
int D,
typename SCAL,
typename SCAL2,
784 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
785 INLINE AutoDiffRec<D,SCAL> operator- (AutoDiffRec<D,SCAL> a, SCAL2 b)
787 return AutoDiffRec<D,SCAL> (a.Rec()-b, a.Last());
790 template <
int D,
typename SCAL>
791 INLINE AutoDiffRec<D,SCAL> operator- (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
793 return AutoDiffRec<D,SCAL> (a.Rec()-b.Rec(), a.Last()-b.Last());
797 template<
int D,
typename SCAL>
803 template <
int D,
typename SCAL>
804 INLINE AutoDiffRec<D,SCAL> operator* (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
806 return AutoDiffRec<D,SCAL> (a.Rec()*b.Rec(), a.Value()*b.Last()+b.Value()*a.Last());
809 template <
int D,
typename SCAL,
typename SCAL1,
810 typename std::enable_if<std::is_convertible<SCAL1,SCAL>::value,
int>::type = 0>
811 INLINE AutoDiffRec<D,SCAL> operator* (AutoDiffRec<D,SCAL> b, SCAL1 a)
813 return AutoDiffRec<D,SCAL> (a*b.Rec(), a*b.Last());
816 template <
int D,
typename SCAL,
typename SCAL1,
817 typename std::enable_if<std::is_convertible<SCAL1,SCAL>::value,
int>::type = 0>
818 INLINE AutoDiffRec<D,SCAL> operator* (SCAL1 a, AutoDiffRec<D,SCAL> b)
820 return AutoDiffRec<D,SCAL> (a*b.Rec(), a*b.Last());
823 template <
int D,
typename SCAL>
824 INLINE AutoDiffRec<D,SCAL> & operator+= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
827 a.Last() += b.Last();
831 template <
int D,
typename SCAL>
832 INLINE AutoDiffRec<D,SCAL> & operator-= (AutoDiffRec<D,SCAL> & a,
double b)
838 template <
int D,
typename SCAL>
839 INLINE AutoDiffRec<D,SCAL> & operator-= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
842 a.Last() -= b.Last();
847 template <
int D,
typename SCAL>
848 INLINE AutoDiffRec<D,SCAL> & operator*= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
855 template <
int D,
typename SCAL,
typename SCAL2>
856 INLINE AutoDiffRec<D,SCAL> & operator*= (AutoDiffRec<D,SCAL> & b, SCAL2 a)
865 template <
typename SCAL>
868 template<
int D,
typename SCAL>
869 INLINE AutoDiffRec<D,SCAL>
Inv1 (AutoDiffRec<D,SCAL> x)
871 return AutoDiffRec<D,SCAL> (
Inv1(x.Rec()), (-sqr(1.0/x.Value())) * x.Last());
875 template<
int D,
typename SCAL>
883 template<
int D,
typename SCAL,
typename SCAL2,
884 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
892 template<
int D,
typename SCAL,
typename SCAL2,
893 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
906 template <
int D,
typename SCAL>
907 INLINE
bool operator== (AutoDiffRec<D,SCAL> x, SCAL val2)
909 return x.Value() == val2;
913 template <
int D,
typename SCAL>
914 INLINE
bool operator!= (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
916 return x.Value() != val2;
920 template <
int D,
typename SCAL>
921 INLINE
bool operator< (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
923 return x.Value() < val2;
927 template <
int D,
typename SCAL>
928 INLINE
bool operator> (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
930 return x.Value() > val2;
934 template<
int D,
typename SCAL>
935 INLINE AutoDiffRec<D,SCAL> fabs (
const AutoDiffRec<D,SCAL> & x)
937 auto sign = IfPos(x.Value(), SCAL(1.0), IfPos(-x.Value(), SCAL(-1.0), SCAL(0.0)));
938 return AutoDiffRec<D,SCAL> (fabs(x.Rec()), sign*x.Last());
954 template<
int D,
typename SCAL>
955 INLINE
auto sqrt (
const AutoDiffRec<D,SCAL> & x)
957 return AutoDiffRec<D,SCAL> (sqrt(x.Rec()), (0.5/sqrt(x.Value()))*x.Last());
962 template <
int D,
typename SCAL>
963 auto log (AutoDiffRec<D,SCAL> x)
965 return AutoDiffRec<D,SCAL> (log(x.Rec()), (1.0/x.Value())*x.Last());
968 template <
int D,
typename SCAL>
969 auto exp (AutoDiffRec<D,SCAL> x)
971 return AutoDiffRec<D,SCAL> (exp(x.Rec()), exp(x.Value())*x.Last());
974 template <
int D,
typename SCAL>
975 INLINE AutoDiffRec<D,SCAL> pow (AutoDiffRec<D,SCAL> x, AutoDiffRec<D,SCAL> y )
977 return exp(log(x)*y);
981 template <
int D,
typename SCAL>
982 auto sin (AutoDiffRec<D,SCAL> x)
984 return AutoDiffRec<D,SCAL> (sin(x.Rec()), cos(x.Value())*x.Last());
987 template <
int D,
typename SCAL>
988 auto cos (AutoDiffRec<D,SCAL> x)
990 return AutoDiffRec<D,SCAL> (cos(x.Rec()), -sin(x.Value())*x.Last());
993 template <
int D,
typename SCAL>
994 auto tan (AutoDiffRec<D,SCAL> x)
996 return sin(x) / cos(x);
999 template <
int D,
typename SCAL>
1000 auto sinh (AutoDiffRec<D,SCAL> x)
1002 return AutoDiffRec<D,SCAL> (sinh(x.Rec()), cosh(x.Value())*x.Last());
1005 template <
int D,
typename SCAL>
1006 auto cosh (AutoDiffRec<D,SCAL> x)
1008 return AutoDiffRec<D,SCAL> (cosh(x.Rec()), sinh(x.Value())*x.Last());
1011 template <
int D,
typename SCAL>
1012 auto erf (AutoDiffRec<D,SCAL> x)
1014 return AutoDiffRec<D,SCAL> (erf(x.Rec()), 2. / sqrt(M_PI) * exp(- x.Value() * x.Value())*x.Last());
1017 template <
int D,
typename SCAL>
1018 auto floor (AutoDiffRec<D,SCAL> x)
1020 return AutoDiffRec<D,SCAL> (floor(x.Rec()), 0.0);
1023 template <
int D,
typename SCAL>
1024 auto ceil (AutoDiffRec<D,SCAL> x)
1026 return AutoDiffRec<D,SCAL> (ceil(x.Rec()), 0.0);
1031 template <
int D,
typename SCAL>
1032 auto atan (AutoDiffRec<D,SCAL> x)
1034 return AutoDiffRec<D,SCAL> (atan(x.Rec()), (1./(1.+x.Value()*x.Value()))*x.Last());
1037 template <
int D,
typename SCAL>
1038 auto atan2 (AutoDiffRec<D,SCAL> x, AutoDiffRec<D,SCAL> y)
1040 return AutoDiffRec<D,SCAL> (atan2(x.Rec(), y.Rec()),
1041 (1./(x.Value()*x.Value()+y.Value()*y.Value()))*(x.Value()*y.Last()-y.Value()*x.Last()));
1044 template <
int D,
typename SCAL>
1045 auto acos (AutoDiffRec<D,SCAL> x)
1047 return AutoDiffRec<D,SCAL> (acos(x.Rec()), (-1./sqrt(1.-x.Value()*x.Value()))*x.Last());
1050 template <
int D,
typename SCAL>
1051 auto asin (AutoDiffRec<D,SCAL> x)
1053 return AutoDiffRec<D,SCAL> (asin(x.Rec()), (1./sqrt(1.-x.Value()*x.Value()))*x.Last());
1057 template <
int D,
typename SCAL,
typename TB,
typename TC>
1058 auto IfPos (AutoDiffRec<D,SCAL> a, TB b, TC c)
1060 return IfPos (a.Value(), b, c);
1063 template <
int D,
typename SCAL>
1064 INLINE AutoDiffRec<D,SCAL> IfPos (SCAL a, AutoDiffRec<D,SCAL> b, AutoDiffRec<D,SCAL> c)
1073 return AutoDiffRec<D,SCAL> (IfPos(a, b.Rec(), c.Rec()), IfPos(a, b.Last(), c.Last()));
1076 template <
int D,
typename SCAL,
typename TC>
1077 INLINE AutoDiffRec<D,SCAL> IfPos (SCAL a, AutoDiffRec<D,SCAL> b, TC c)
1079 return IfPos (a, b, AutoDiffRec<D,SCAL> (c));
1084template <
int D,
typename SCAL =
double>
1085using AutoDiff = AutoDiffRec<D,SCAL>;
1093 template <
typename T>
struct is_scalar_type;
1094 template <
int D,
typename T>
1099 template<
int D,
typename SCAL>
1105 template<
int D,
typename SCAL>
1108 return IfPos(x.Value(), x, -x);
1113 template<
int D,
typename TAD>
1119 for(
int i=0;i<D;i++)
Definition autodiff.hpp:643
Datatype for automatic differentiation.
Definition autodiff.hpp:26
INLINE AutoDiffVec(SCAL aval)
initial object with constant value
Definition autodiff.hpp:51
INLINE SCAL & Value()
access value
Definition autodiff.hpp:104
AutoDiffVec(const AutoDiffVec &ad2)=default
copy constructor
AutoDiffVec()=default
elements are undefined
INLINE SCAL & DValue(int i)
accesses partial derivative
Definition autodiff.hpp:107
INLINE AutoDiffVec(SCAL aval, int diffindex)
init object with (val, e_diffindex)
Definition autodiff.hpp:59
INLINE AutoDiffVec & operator=(SCAL aval)
assign constant value
Definition autodiff.hpp:74
INLINE SCAL DValue(int i) const
returns partial derivative
Definition autodiff.hpp:88
INLINE SCAL Value() const
returns value
Definition autodiff.hpp:85
namespace for standard data types and algorithms.
Definition ngstd.hpp:42
ostream & operator<<(ostream &ost, const AutoDiffDiff< D, SCAL > &x)
Prints AudoDiffDiff.
Definition autodiffdiff.hpp:256
auto Inv1(SCAL x)
Inverse of AutoDiffRec.
Definition autodiff.hpp:866
Definition autodiffdiff.hpp:716