23 template <
int D,
typename SCAL =
double>
53 for (
int i = 0; i < D; i++)
61 for (
int i = 0; i < D; i++)
76 for (
int i = 0; i < D; i++)
84 INLINE SCAL
Value()
const throw() {
return val; }
87 INLINE SCAL
DValue (
int i)
const throw() {
return dval[i]; }
90 INLINE
void StoreGradient (SCAL * p)
const 92 for (
int i = 0; i < D; i++)
96 INLINE
void LoadGradient (
const SCAL * p)
98 for (
int i = 0; i < D; i++)
103 INLINE SCAL &
Value() throw() {
return val; }
106 INLINE SCAL &
DValue (
int i)
throw() {
return dval[i]; }
113 template<
int D,
typename SCAL>
116 ost << x.
Value() <<
", D = ";
117 for (
int i = 0; i < D; i++)
118 ost << x.
DValue(i) <<
" ";
123 template<
int D,
typename SCAL>
127 res.
Value () = x.Value()+y.Value();
129 for (
int i = 0; i < D; i++)
130 res.
DValue(i) = x.DValue(i) + y.DValue(i);
136 template<
int D,
typename SCAL>
140 res.
Value() = x.Value()-y.Value();
142 for (
int i = 0; i < D; i++)
143 res.
DValue(i) = x.DValue(i) - y.DValue(i);
148 template<
int D,
typename SCAL,
typename SCAL2,
149 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
153 res.
Value() = x+y.Value();
154 for (
int i = 0; i < D; i++)
155 res.
DValue(i) = y.DValue(i);
160 template<
int D,
typename SCAL,
typename SCAL2,
161 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
165 res.
Value() = x+y.Value();
166 for (
int i = 0; i < D; i++)
167 res.
DValue(i) = y.DValue(i);
173 template<
int D,
typename SCAL>
177 res.
Value() = -x.Value();
178 for (
int i = 0; i < D; i++)
179 res.
DValue(i) = -x.DValue(i);
184 template<
int D,
typename SCAL,
typename SCAL2,
185 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
189 res.
Value() = x.Value()-y;
190 for (
int i = 0; i < D; i++)
191 res.
DValue(i) = x.DValue(i);
196 template<
int D,
typename SCAL,
typename SCAL2,
197 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
198 INLINE AutoDiffVec<D,SCAL> operator- (SCAL2 x,
const AutoDiffVec<D,SCAL> & y)
throw()
200 AutoDiffVec<D,SCAL> res;
201 res.
Value() = x-y.Value();
202 for (
int i = 0; i < D; i++)
203 res.DValue(i) = -y.DValue(i);
209 template<
int D,
typename SCAL,
typename SCAL2,
210 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
214 res.
Value() = x*y.Value();
215 for (
int i = 0; i < D; i++)
216 res.
DValue(i) = x*y.DValue(i);
221 template<
int D,
typename SCAL,
typename SCAL2,
222 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
227 res.
Value() = x*y.Value();
228 for (
int i = 0; i < D; i++)
229 res.
DValue(i) = x*y.DValue(i);
234 template<
int D,
typename SCAL>
242 for (
int i = 0; i < D; i++)
243 res.
DValue(i) = hx*y.DValue(i) + hy*x.DValue(i);
249 template<
int D,
typename SCAL>
256 for (
int i = 0; i < D; i++)
257 res.
DValue(i) = hx*x.DValue(i);
262 template<
int D,
typename SCAL>
266 for (
int i = 0; i < D; i++)
273 template<
int D,
typename SCAL>
280 template<
int D,
typename SCAL,
typename SCAL2,
281 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
288 template<
int D,
typename SCAL,
typename SCAL2,
289 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
298 template <
int D,
typename SCAL,
typename SCAL2>
299 INLINE AutoDiffVec<D,SCAL> & operator+= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
throw()
307 template <
int D,
typename SCAL>
308 INLINE AutoDiffVec<D,SCAL> & operator+= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
310 x.Value() += y.Value();
311 for (
int i = 0; i < D; i++)
312 x.DValue(i) += y.DValue(i);
317 template <
int D,
typename SCAL>
318 INLINE AutoDiffVec<D,SCAL> & operator-= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
320 x.Value() -= y.Value();
321 for (
int i = 0; i < D; i++)
322 x.DValue(i) -= y.DValue(i);
327 template <
int D,
typename SCAL,
typename SCAL2>
328 INLINE AutoDiffVec<D,SCAL> & operator-= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
335 template <
int D,
typename SCAL>
336 INLINE AutoDiffVec<D,SCAL> & operator*= (AutoDiffVec<D,SCAL> & x, AutoDiffVec<D,SCAL> y)
338 for (
int i = 0; i < D; i++)
339 x.DValue(i) = x.DValue(i)*y.Value() + x.Value() * y.DValue(i);
340 x.Value() *= y.Value();
345 template <
int D,
typename SCAL,
typename SCAL2>
346 INLINE AutoDiffVec<D,SCAL> & operator*= (AutoDiffVec<D,SCAL> & x, SCAL2 y)
349 for (
int i = 0; i < D; i++)
355 template <
int D,
typename SCAL>
356 INLINE AutoDiffVec<D,SCAL> & operator/= (AutoDiffVec<D,SCAL> & x, SCAL y)
360 for (
int i = 0; i < D; i++)
369 template <
int D,
typename SCAL>
370 INLINE
bool operator== (AutoDiffVec<D,SCAL> x, SCAL val2)
372 return x.Value() == val2;
376 template <
int D,
typename SCAL>
377 INLINE
bool operator!= (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
379 return x.Value() != val2;
383 template <
int D,
typename SCAL>
384 INLINE
bool operator< (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
386 return x.Value() < val2;
390 template <
int D,
typename SCAL>
391 INLINE
bool operator> (AutoDiffVec<D,SCAL> x, SCAL val2)
throw()
393 return x.Value() > val2;
399 template<
int D,
typename SCAL>
400 INLINE AutoDiffVec<D,SCAL> fabs (
const AutoDiffVec<D,SCAL> & x)
402 double abs = fabs (x.Value());
403 AutoDiffVec<D,SCAL> res( abs );
405 for (
int i = 0; i < D; i++)
406 res.DValue(i) = x.Value()*x.DValue(i) / abs;
408 for (
int i = 0; i < D; i++)
414 template<
int D,
typename SCAL>
415 INLINE AutoDiffVec<D,SCAL> sqrt (
const AutoDiffVec<D,SCAL> & x)
417 AutoDiffVec<D,SCAL> res;
418 res.Value() = sqrt(x.Value());
419 for (
int j = 0; j < D; j++)
420 res.DValue(j) = 0.5 / res.Value() * x.DValue(j);
425 template <
int D,
typename SCAL>
426 AutoDiffVec<D,SCAL> log (AutoDiffVec<D,SCAL> x)
428 AutoDiffVec<D,SCAL> res;
429 res.Value() = log(x.Value());
430 for (
int k = 0; k < D; k++)
431 res.DValue(k) = x.DValue(k) / x.Value();
436 template <
int D,
typename SCAL>
437 INLINE AutoDiffVec<D,SCAL> exp (AutoDiffVec<D,SCAL> x)
439 AutoDiffVec<D,SCAL> res;
440 res.Value() = exp(x.Value());
441 for (
int k = 0; k < D; k++)
442 res.DValue(k) = x.DValue(k) * res.Value();
447 template <
int D,
typename SCAL>
448 INLINE AutoDiffVec<D,SCAL> pow (AutoDiffVec<D,SCAL> x, AutoDiffVec<D,SCAL> y )
450 return exp(log(x)*y);
467 template <
int D,
typename SCAL>
468 INLINE AutoDiffVec<D,SCAL> sin (AutoDiffVec<D,SCAL> x)
470 return sin(AutoDiffRec<D,SCAL>(x));
486 template <
int D,
typename SCAL>
487 INLINE AutoDiffVec<D,SCAL> cos (AutoDiffVec<D,SCAL> x)
489 return cos(AutoDiffRec<D,SCAL>(x));
493 template <
int D,
typename SCAL>
494 INLINE AutoDiffVec<D,SCAL> tan (AutoDiffVec<D,SCAL> x)
495 {
return sin(x) / cos(x); }
498 template <
int D,
typename SCAL>
499 INLINE AutoDiffVec<D,SCAL> sinh (AutoDiffVec<D,SCAL> x)
501 AutoDiffVec<D,SCAL> res;
502 res.Value() = sinh(x.Value());
503 SCAL ch = cosh(x.Value());
504 for (
int k = 0; k < D; k++)
505 res.DValue(k) = x.DValue(k) * ch;
510 template <
int D,
typename SCAL>
511 INLINE AutoDiffVec<D,SCAL> cosh (AutoDiffVec<D,SCAL> x)
513 AutoDiffVec<D,SCAL> res;
514 res.Value() = cosh(x.Value());
515 SCAL sh = sinh(x.Value());
516 for (
int k = 0; k < D; k++)
517 res.DValue(k) = x.DValue(k) * sh;
522 template<
int D,
typename SCAL>
523 INLINE AutoDiffVec<D,SCAL> floor (
const AutoDiffVec<D,SCAL> & x)
525 AutoDiffVec<D,SCAL> res;
526 res.Value() = floor(x.Value());
527 for (
int j = 0; j < D; j++)
533 template<
int D,
typename SCAL>
534 INLINE AutoDiffVec<D,SCAL> ceil (
const AutoDiffVec<D,SCAL> & x)
536 AutoDiffVec<D,SCAL> res;
537 res.Value() = ceil(x.Value());
538 for (
int j = 0; j < D; j++)
557 template <
int D,
typename SCAL>
558 AutoDiffVec<D,SCAL> atan (AutoDiffVec<D,SCAL> x)
560 return atan (AutoDiffRec<D,SCAL> (x));
564 template <
int D,
typename SCAL>
565 INLINE AutoDiffVec<D,SCAL> atan2 (AutoDiffVec<D,SCAL> x, AutoDiffVec<D,SCAL> y)
567 AutoDiffVec<D,SCAL> res;
568 SCAL a = atan2(x.Value(), y.Value());
570 for (
int k = 0; k < D; k++)
571 res.DValue(k) = (x.Value()*y.DValue(k)-y.Value()*x.DValue(k))/(y.Value()*y.Value()+x.Value()*x.Value());
577 template <
int D,
typename SCAL>
578 INLINE AutoDiffVec<D,SCAL> acos (AutoDiffVec<D,SCAL> x)
580 AutoDiffVec<D,SCAL> res;
581 SCAL a = acos(x.Value());
583 SCAL da = -1 / sqrt(1-x.Value()*x.Value());
584 for (
int k = 0; k < D; k++)
585 res.DValue(k) = x.DValue(k)*da;
591 template <
int D,
typename SCAL>
592 INLINE AutoDiffVec<D,SCAL> asin (AutoDiffVec<D,SCAL> x)
594 AutoDiffVec<D,SCAL> res;
595 SCAL a = asin(x.Value());
597 SCAL da = 1 / sqrt(1-x.Value()*x.Value());
598 for (
int k = 0; k < D; k++)
599 res.DValue(k) = x.DValue(k)*da;
606 template <
int D,
typename SCAL,
typename TB,
typename TC>
607 auto IfPos (AutoDiffVec<D,SCAL> a, TB b, TC c)
609 return IfPos (a.Value(), b, c);
612 template <
int D,
typename SCAL>
613 INLINE AutoDiffVec<D,SCAL> IfPos (SCAL a, AutoDiffVec<D,SCAL> b, AutoDiffVec<D,SCAL> c)
615 AutoDiffVec<D,SCAL> res;
616 res.Value() = IfPos (a, b.Value(), c.Value());
617 for (
int j = 0; j < D; j++)
618 res.DValue(j) = IfPos (a, b.DValue(j), c.DValue(j));
622 template <
int D,
typename SCAL,
typename TC>
623 INLINE AutoDiffVec<D,SCAL> IfPos (SCAL a, AutoDiffVec<D,SCAL> b, TC c)
625 return IfPos (a, b, AutoDiffVec<D,SCAL> (c));
632 template <
int D,
typename SCAL>
635 AutoDiffRec<D-1, SCAL> rec;
639 INLINE AutoDiffRec () =
default;
640 INLINE AutoDiffRec (
const AutoDiffRec &) =
default;
641 INLINE AutoDiffRec (AutoDiffRec<D-1,SCAL> _rec, SCAL _last) : rec(_rec), last(_last) { ; }
642 INLINE AutoDiffRec & operator= (
const AutoDiffRec &) =
default;
644 INLINE AutoDiffRec (SCAL aval) : rec(aval), last(0.0) { ; }
645 INLINE AutoDiffRec (SCAL aval,
int diffindex) : rec(aval, diffindex), last((diffindex==D-1) ? 1.0 : 0.0) { ; }
646 INLINE AutoDiffRec (SCAL aval,
const SCAL * grad)
647 : rec(aval, grad), last(grad[D-1]) { }
649 INLINE AutoDiffRec (
const AutoDiffVec<D,SCAL> & ad)
651 Value() = ad.Value();
652 for (
int i = 0; i < D; i++)
653 DValue(i) = ad.DValue(i);
656 INLINE AutoDiffRec & operator= (SCAL aval) { rec = aval; last = 0.0;
return *
this; }
657 INLINE SCAL Value()
const {
return rec.Value(); }
658 INLINE SCAL DValue(
int i)
const {
return (i == D-1) ? last : rec.DValue(i); }
659 INLINE SCAL & Value() {
return rec.Value(); }
660 INLINE SCAL & DValue(
int i) {
return (i == D-1) ? last : rec.DValue(i); }
661 INLINE
auto Rec()
const {
return rec; }
662 INLINE
auto Last()
const {
return last; }
663 INLINE
auto & Rec() {
return rec; }
664 INLINE
auto & Last() {
return last; }
665 INLINE
operator AutoDiffVec<D,SCAL> ()
const 667 AutoDiffVec<D,SCAL> res(Value());
668 for (
int i = 0; i < D; i++)
669 res.DValue(i) = DValue(i);
674 template<
int D,
typename SCAL>
675 ostream &
operator<< (ostream & ost, AutoDiffRec<D,SCAL> ad)
677 return ost << AutoDiffVec<D,SCAL> (ad);
680 template <
typename SCAL>
681 class AutoDiffRec<0,SCAL> :
public AlignedAlloc<AutoDiffRec<0,SCAL>>
688 INLINE
AutoDiffRec (SCAL _val, SCAL ) : val(_val) { ; }
693 INLINE
AutoDiffRec & operator= (SCAL aval) { val = aval;
return *
this; }
695 INLINE SCAL Value()
const {
return val; }
696 INLINE SCAL DValue(
int i)
const {
return SCAL(0); }
697 INLINE SCAL & Value() {
return val; }
699 INLINE
auto Rec()
const {
return val; }
700 INLINE
auto Last()
const {
return SCAL(0); }
701 INLINE
auto & Rec() {
return val; }
702 INLINE
auto & Last() {
return val; }
707 template <
typename SCAL>
708 class AutoDiffRec<1,SCAL> :
public AlignedAlloc<AutoDiffRec<1,SCAL>>
715 INLINE
AutoDiffRec (SCAL _val) : val(_val), last(0.0) { ; }
716 INLINE
AutoDiffRec (SCAL _val, SCAL _last) : val(_val), last(_last) { ; }
717 INLINE
AutoDiffRec (SCAL aval,
int diffindex) : val(aval), last((diffindex==0) ? 1.0 : 0.0) { ; }
719 : val(aval), last(grad[0]) { }
723 Value() = ad.
Value();
728 INLINE
AutoDiffRec & operator= (SCAL aval) { val = aval; last = 0.0;
return *
this; }
730 INLINE SCAL Value()
const {
return val; }
731 INLINE SCAL DValue(
int i)
const {
return last; }
732 INLINE SCAL & Value() {
return val; }
733 INLINE SCAL & DValue(
int i) {
return last; }
734 INLINE
auto Rec()
const {
return val; }
735 INLINE
auto Last()
const {
return last; }
736 INLINE
auto & Rec() {
return val; }
737 INLINE
auto & Last() {
return last; }
742 res.
DValue(0) = DValue(0);
747 template <
int D,
typename SCAL,
typename SCAL2,
748 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
754 template <
int D,
typename SCAL,
typename SCAL2,
755 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
756 INLINE AutoDiffRec<D,SCAL> operator+ (AutoDiffRec<D,SCAL> a, SCAL2 b)
758 return AutoDiffRec<D,SCAL> (a.Rec()+b, a.Last());
761 template <
int D,
typename SCAL>
762 INLINE AutoDiffRec<D,SCAL> operator+ (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
764 return AutoDiffRec<D,SCAL> (a.Rec()+b.Rec(), a.Last()+b.Last());
767 template <
int D,
typename SCAL,
typename SCAL2,
768 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
769 INLINE AutoDiffRec<D,SCAL> operator- (SCAL2 b, AutoDiffRec<D,SCAL> a)
771 return AutoDiffRec<D,SCAL> (b-a.Rec(), -a.Last());
774 template <
int D,
typename SCAL,
typename SCAL2,
775 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
776 INLINE AutoDiffRec<D,SCAL> operator- (AutoDiffRec<D,SCAL> a, SCAL2 b)
778 return AutoDiffRec<D,SCAL> (a.Rec()-b, a.Last());
781 template <
int D,
typename SCAL>
782 INLINE AutoDiffRec<D,SCAL> operator- (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
784 return AutoDiffRec<D,SCAL> (a.Rec()-b.Rec(), a.Last()-b.Last());
788 template<
int D,
typename SCAL>
794 template <
int D,
typename SCAL>
795 INLINE AutoDiffRec<D,SCAL> operator* (AutoDiffRec<D,SCAL> a, AutoDiffRec<D,SCAL> b)
797 return AutoDiffRec<D,SCAL> (a.Rec()*b.Rec(), a.Value()*b.Last()+b.Value()*a.Last());
800 template <
int D,
typename SCAL,
typename SCAL1,
801 typename std::enable_if<std::is_convertible<SCAL1,SCAL>::value,
int>::type = 0>
802 INLINE AutoDiffRec<D,SCAL> operator* (AutoDiffRec<D,SCAL> b, SCAL1 a)
804 return AutoDiffRec<D,SCAL> (a*b.Rec(), a*b.Last());
807 template <
int D,
typename SCAL,
typename SCAL1,
808 typename std::enable_if<std::is_convertible<SCAL1,SCAL>::value,
int>::type = 0>
809 INLINE AutoDiffRec<D,SCAL> operator* (SCAL1 a, AutoDiffRec<D,SCAL> b)
811 return AutoDiffRec<D,SCAL> (a*b.Rec(), a*b.Last());
814 template <
int D,
typename SCAL>
815 INLINE AutoDiffRec<D,SCAL> & operator+= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
818 a.Last() += b.Last();
822 template <
int D,
typename SCAL>
823 INLINE AutoDiffRec<D,SCAL> & operator-= (AutoDiffRec<D,SCAL> & a,
double b)
829 template <
int D,
typename SCAL>
830 INLINE AutoDiffRec<D,SCAL> & operator-= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
833 a.Last() -= b.Last();
838 template <
int D,
typename SCAL>
839 INLINE AutoDiffRec<D,SCAL> & operator*= (AutoDiffRec<D,SCAL> & a, AutoDiffRec<D,SCAL> b)
846 template <
int D,
typename SCAL,
typename SCAL2>
847 INLINE AutoDiffRec<D,SCAL> & operator*= (AutoDiffRec<D,SCAL> & b, SCAL2 a)
856 template <
typename SCAL>
857 auto Inv1 (SCAL x) {
return 1.0/x; }
859 template<
int D,
typename SCAL>
860 INLINE AutoDiffRec<D,SCAL>
Inv1 (AutoDiffRec<D,SCAL> x)
862 return AutoDiffRec<D,SCAL> (
Inv1(x.Rec()), (-
sqr(1.0/x.Value())) * x.Last());
866 template<
int D,
typename SCAL>
874 template<
int D,
typename SCAL,
typename SCAL2,
875 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
883 template<
int D,
typename SCAL,
typename SCAL2,
884 typename std::enable_if<std::is_convertible<SCAL2,SCAL>::value,
int>::type = 0>
897 template <
int D,
typename SCAL>
898 INLINE
bool operator== (AutoDiffRec<D,SCAL> x, SCAL val2)
900 return x.Value() == val2;
904 template <
int D,
typename SCAL>
905 INLINE
bool operator!= (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
907 return x.Value() != val2;
911 template <
int D,
typename SCAL>
912 INLINE
bool operator< (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
914 return x.Value() < val2;
918 template <
int D,
typename SCAL>
919 INLINE
bool operator> (AutoDiffRec<D,SCAL> x, SCAL val2)
throw()
921 return x.Value() > val2;
925 template<
int D,
typename SCAL>
926 INLINE AutoDiffRec<D,SCAL> fabs (
const AutoDiffRec<D,SCAL> & x)
928 auto sign = IfPos(x.Value(), SCAL(1.0), IfPos(-x.Value(), SCAL(-1.0), SCAL(0.0)));
929 return AutoDiffRec<D,SCAL> (fabs(x.Rec()), sign*x.Last());
945 template<
int D,
typename SCAL>
946 INLINE
auto sqrt (
const AutoDiffRec<D,SCAL> & x)
948 return AutoDiffRec<D,SCAL> (sqrt(x.Rec()), (0.5/sqrt(x.Value()))*x.Last());
953 template <
int D,
typename SCAL>
954 auto log (AutoDiffRec<D,SCAL> x)
956 return AutoDiffRec<D,SCAL> (log(x.Rec()), (1.0/x.Value())*x.Last());
959 template <
int D,
typename SCAL>
960 auto exp (AutoDiffRec<D,SCAL> x)
962 return AutoDiffRec<D,SCAL> (exp(x.Rec()), exp(x.Value())*x.Last());
965 template <
int D,
typename SCAL>
966 INLINE AutoDiffRec<D,SCAL> pow (AutoDiffRec<D,SCAL> x, AutoDiffRec<D,SCAL> y )
968 return exp(log(x)*y);
972 template <
int D,
typename SCAL>
973 auto sin (AutoDiffRec<D,SCAL> x)
975 return AutoDiffRec<D,SCAL> (sin(x.Rec()), cos(x.Value())*x.Last());
978 template <
int D,
typename SCAL>
979 auto cos (AutoDiffRec<D,SCAL> x)
981 return AutoDiffRec<D,SCAL> (cos(x.Rec()), -sin(x.Value())*x.Last());
984 template <
int D,
typename SCAL>
985 auto tan (AutoDiffRec<D,SCAL> x)
987 return sin(x) / cos(x);
990 template <
int D,
typename SCAL>
991 auto sinh (AutoDiffRec<D,SCAL> x)
993 return AutoDiffRec<D,SCAL> (sinh(x.Rec()), cosh(x.Value())*x.Last());
996 template <
int D,
typename SCAL>
997 auto cosh (AutoDiffRec<D,SCAL> x)
999 return AutoDiffRec<D,SCAL> (cosh(x.Rec()), sinh(x.Value())*x.Last());
1002 template <
int D,
typename SCAL>
1003 auto floor (AutoDiffRec<D,SCAL> x)
1005 return AutoDiffRec<D,SCAL> (floor(x.Rec()), 0.0);
1008 template <
int D,
typename SCAL>
1009 auto ceil (AutoDiffRec<D,SCAL> x)
1011 return AutoDiffRec<D,SCAL> (ceil(x.Rec()), 0.0);
1016 template <
int D,
typename SCAL>
1017 auto atan (AutoDiffRec<D,SCAL> x)
1019 return AutoDiffRec<D,SCAL> (atan(x.Rec()), (1./(1.+x.Value()*x.Value()))*x.Last());
1022 template <
int D,
typename SCAL>
1023 auto atan2 (AutoDiffRec<D,SCAL> x, AutoDiffRec<D,SCAL> y)
1025 return AutoDiffRec<D,SCAL> (atan2(x.Rec(), y.Rec()),
1026 (1./(x.Value()*x.Value()+y.Value()*y.Value()))*(x.Value()*y.Last()-y.Value()*x.Last()));
1029 template <
int D,
typename SCAL>
1030 auto acos (AutoDiffRec<D,SCAL> x)
1032 return AutoDiffRec<D,SCAL> (acos(x.Rec()), (-1./sqrt(1.-x.Value()*x.Value()))*x.Last());
1035 template <
int D,
typename SCAL>
1036 auto asin (AutoDiffRec<D,SCAL> x)
1038 return AutoDiffRec<D,SCAL> (asin(x.Rec()), (1./sqrt(1.-x.Value()*x.Value()))*x.Last());
1042 template <
int D,
typename SCAL,
typename TB,
typename TC>
1043 auto IfPos (AutoDiffRec<D,SCAL> a, TB b, TC c)
1045 return IfPos (a.Value(), b, c);
1048 template <
int D,
typename SCAL>
1049 INLINE AutoDiffRec<D,SCAL> IfPos (SCAL a, AutoDiffRec<D,SCAL> b, AutoDiffRec<D,SCAL> c)
1058 return AutoDiffRec<D,SCAL> (IfPos(a, b.Rec(), c.Rec()), IfPos(a, b.Last(), c.Last()));
1061 template <
int D,
typename SCAL,
typename TC>
1062 INLINE AutoDiffRec<D,SCAL> IfPos (SCAL a, AutoDiffRec<D,SCAL> b, TC c)
1064 return IfPos (a, b, AutoDiffRec<D,SCAL> (c));
1069 template <
int D,
typename SCAL =
double>
1070 using AutoDiff = AutoDiffRec<D,SCAL>;
INLINE AutoDiffVec & operator=(SCAL aval)
assign constant value
Definition: autodiff.hpp:73
AutoDiffVec()=default
elements are undefined
INLINE AutoDiffVec(SCAL aval)
initial object with constant value
Definition: autodiff.hpp:50
ostream & operator<<(ostream &ost, const AutoDiffDiff< D, SCAL > &x)
Prints AudoDiffDiff.
Definition: autodiffdiff.hpp:255
INLINE SCAL DValue(int i) const
returns partial derivative
Definition: autodiff.hpp:87
INLINE AutoDiffVec(SCAL aval, int diffindex)
init object with (val, e_diffindex)
Definition: autodiff.hpp:58
INLINE AutoDiffVec< D, SCAL > sqr(const AutoDiffVec< D, SCAL > &x)
AutoDiffVec times AutoDiffVec.
Definition: autodiff.hpp:250
INLINE SCAL & Value()
access value
Definition: autodiff.hpp:103
namespace for standard data types and algorithms.
Definition: ngstd.hpp:81
Definition: autodiff.hpp:15
Datatype for automatic differentiation.
Definition: autodiff.hpp:24
INLINE SCAL Value() const
returns value
Definition: autodiff.hpp:84
INLINE SCAL & DValue(int i)
accesses partial derivative
Definition: autodiff.hpp:106
auto Inv1(SCAL x)
Inverse of AutoDiffRec.
Definition: autodiff.hpp:857