#ifndef DEF_AUTOMATIC_DIFFERENTIATION_MATH #define DEF_AUTOMATIC_DIFFERENTIATION_MATH #include // Basic mathematical functions for Scalar numbers // Trigonometric functions template Scalar sec(const Scalar & x) { return Scalar(1.)/cos(x); } template Scalar cot(const Scalar & x) { return cos(x)/sin(x); } template Scalar csc(const Scalar & x) { return Scalar(1.)/sin(x); } // Inverse trigonometric functions template Scalar asec(const Scalar & x) { return acos(Scalar(1.)/x); } template Scalar acot(const Scalar & x) { return atan(Scalar(1.)/x); } template Scalar acsc(const Scalar & x) { return asin(Scalar(1.)/x); } // Hyperbolic trigonometric functions template Scalar sech(const Scalar & x) { return Scalar(1.)/cosh(x); } template Scalar coth(const Scalar & x) { return cosh(x)/sinh(x); } template Scalar csch(const Scalar & x) { return Scalar(1.)/sinh(x); } // Inverse hyperbolic trigonometric functions template Scalar asech(const Scalar & x) { return log((Scalar(1.) + sqrt(Scalar(1.) - x*x))/x); } template Scalar acoth(const Scalar & x) { return Scalar(0.5)*log((x + Scalar(1.))/(x - Scalar(1.))); } template Scalar acsch(const Scalar & x) { return (x >= Scalar(0.)) ? log((Scalar(1.) + sqrt(Scalar(1.) + x*x))/x) : log((Scalar(1.) - sqrt(Scalar(1.) + x*x))/x); } // Other functions template Scalar exp10(const Scalar & x) { return exp(x*log(Scalar(10.))); } template Scalar sign(const Scalar & x) { return (x >= Scalar(0.)) ? ((x > Scalar(0.)) ? Scalar(1.) : Scalar(0.)) : Scalar(-1.); } template Scalar heaviside(const Scalar & x) { return Scalar(x >= Scalar(0.)); } template Scalar abs(const Scalar & x) { return (x >= Scalar(0.)) ? x : -x; } #endif