File indexing completed on 2026-08-17 08:48:09
0001
0002
0003
0004
0005 #ifndef REVERSE_MODE_AUTODIFF_STL_ET_HPP
0006 #define REVERSE_MODE_AUTODIFF_STL_ET_HPP
0007
0008 #include <boost/math/differentiation/detail/reverse_mode_autodiff_stl_expressions.hpp>
0009 namespace boost {
0010 namespace math {
0011 namespace differentiation {
0012 namespace reverse_mode {
0013
0014 template<typename RealType, size_t DerivativeOrder, typename ARG>
0015 fabs_expr<RealType, DerivativeOrder, ARG> fabs(const expression<RealType, DerivativeOrder, ARG> &arg)
0016 {
0017 return fabs_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0018 }
0019 template<typename RealType, size_t DerivativeOrder, typename ARG>
0020 auto abs(const expression<RealType, DerivativeOrder, ARG> &arg)
0021 {
0022 return fabs(arg);
0023 }
0024 template<typename RealType, size_t DerivativeOrder, typename ARG>
0025 ceil_expr<RealType, DerivativeOrder, ARG> ceil(const expression<RealType, DerivativeOrder, ARG> &arg)
0026 {
0027 return ceil_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0028 }
0029 template<typename RealType, size_t DerivativeOrder, typename ARG>
0030 floor_expr<RealType, DerivativeOrder, ARG> floor(
0031 const expression<RealType, DerivativeOrder, ARG> &arg)
0032 {
0033 return floor_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0034 }
0035
0036 template<typename RealType, size_t DerivativeOrder, typename ARG>
0037 exp_expr<RealType, DerivativeOrder, ARG> exp(const expression<RealType, DerivativeOrder, ARG> &arg)
0038 {
0039 return exp_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0040 }
0041
0042 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0043 pow_expr<RealType, DerivativeOrder, LHS, RHS> pow(
0044 const expression<RealType, DerivativeOrder, LHS> &lhs,
0045 const expression<RealType, DerivativeOrder, RHS> &rhs)
0046 {
0047 return pow_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0048 }
0049
0050 template<typename RealType2,
0051 typename RealType1,
0052 size_t DerivativeOrder,
0053 typename ARG,
0054 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0055 expr_pow_float_expr<RealType1, DerivativeOrder, ARG> pow(
0056 const expression<RealType1, DerivativeOrder, ARG> &arg, const RealType2 &v)
0057 {
0058 return expr_pow_float_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0059 };
0060
0061 template<typename RealType, size_t DerivativeOrder, typename ARG>
0062 float_pow_expr_expr<RealType, DerivativeOrder, ARG> pow(
0063 const RealType &v, const expression<RealType, DerivativeOrder, ARG> &arg)
0064 {
0065 return float_pow_expr_expr<RealType, DerivativeOrder, ARG>(arg, v);
0066 };
0067
0068 template<typename RealType, size_t DerivativeOrder, typename ARG>
0069 log_expr<RealType, DerivativeOrder, ARG> log(const expression<RealType, DerivativeOrder, ARG> &arg)
0070 {
0071 return log_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0072 };
0073
0074 template<typename RealType, size_t DerivativeOrder, typename ARG>
0075 sqrt_expr<RealType, DerivativeOrder, ARG> sqrt(const expression<RealType, DerivativeOrder, ARG> &arg)
0076 {
0077 return sqrt_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0078 };
0079
0080 template<typename RealType, size_t DerivativeOrder, typename ARG>
0081 auto frexp(const expression<RealType, DerivativeOrder, ARG> &arg, int *i)
0082 {
0083 BOOST_MATH_STD_USING
0084 frexp(arg.evaluate(), i);
0085 return arg / pow(static_cast<RealType>(2.0), *i);
0086 }
0087
0088 template<typename RealType, size_t DerivativeOrder, typename ARG>
0089 auto ldexp(const expression<RealType, DerivativeOrder, ARG> &arg, const int &i)
0090 {
0091 BOOST_MATH_STD_USING
0092 return arg * pow(static_cast<RealType>(2.0), i);
0093 }
0094
0095 template<typename RealType, size_t DerivativeOrder, typename ARG>
0096 cos_expr<RealType, DerivativeOrder, ARG> cos(const expression<RealType, DerivativeOrder, ARG> &arg)
0097 {
0098 return cos_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0099 };
0100
0101 template<typename RealType, size_t DerivativeOrder, typename ARG>
0102 sin_expr<RealType, DerivativeOrder, ARG> sin(const expression<RealType, DerivativeOrder, ARG> &arg)
0103 {
0104 return sin_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0105 };
0106
0107 template<typename RealType, size_t DerivativeOrder, typename ARG>
0108 tan_expr<RealType, DerivativeOrder, ARG> tan(const expression<RealType, DerivativeOrder, ARG> &arg)
0109 {
0110 return tan_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0111 };
0112
0113 template<typename RealType, size_t DerivativeOrder, typename ARG>
0114 acos_expr<RealType, DerivativeOrder, ARG> acos(const expression<RealType, DerivativeOrder, ARG> &arg)
0115 {
0116 return acos_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0117 };
0118
0119 template<typename RealType, size_t DerivativeOrder, typename ARG>
0120 asin_expr<RealType, DerivativeOrder, ARG> asin(const expression<RealType, DerivativeOrder, ARG> &arg)
0121 {
0122 return asin_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0123 };
0124
0125 template<typename RealType, size_t DerivativeOrder, typename ARG>
0126 atan_expr<RealType, DerivativeOrder, ARG> atan(const expression<RealType, DerivativeOrder, ARG> &arg)
0127 {
0128 return atan_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0129 };
0130
0131 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0132 atan2_expr<RealType, DerivativeOrder, LHS, RHS> atan2(
0133 const expression<RealType, DerivativeOrder, LHS> &lhs,
0134 const expression<RealType, DerivativeOrder, RHS> &rhs)
0135 {
0136 return atan2_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0137 }
0138
0139 template<typename RealType, size_t DerivativeOrder, typename ARG>
0140 atan2_right_float_expr<RealType, DerivativeOrder, ARG> atan2(
0141 const expression<RealType, DerivativeOrder, ARG> &arg, const RealType &v)
0142 {
0143 return atan2_right_float_expr<RealType, DerivativeOrder, ARG>(arg, v);
0144 };
0145
0146 template<typename RealType, size_t DerivativeOrder, typename ARG>
0147 atan2_left_float_expr<RealType, DerivativeOrder, ARG> atan2(
0148 const RealType &v, const expression<RealType, DerivativeOrder, ARG> &arg)
0149 {
0150 return atan2_left_float_expr<RealType, DerivativeOrder, ARG>(arg, v);
0151 };
0152
0153 template<typename RealType, size_t DerivativeOrder, typename ARG>
0154 trunc_expr<RealType, DerivativeOrder, ARG> trunc(
0155 const expression<RealType, DerivativeOrder, ARG> &arg)
0156 {
0157 return trunc_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0158 }
0159
0160 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0161 auto fmod(const expression<RealType, DerivativeOrder, LHS> &lhs,
0162 const expression<RealType, DerivativeOrder, RHS> &rhs)
0163 {
0164 return fmod_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0165 }
0166
0167 template<typename RealType, size_t DerivativeOrder, typename ARG>
0168 auto fmod(const expression<RealType, DerivativeOrder, ARG> &lhs, const RealType rhs)
0169 {
0170 return fmod_right_float_expr<RealType, DerivativeOrder, ARG>(lhs, rhs);
0171 }
0172
0173 template<typename RealType, size_t DerivativeOrder, typename ARG>
0174 auto fmod(const RealType lhs, const expression<RealType, DerivativeOrder, ARG> &rhs)
0175 {
0176 return fmod_left_float_expr<RealType, DerivativeOrder, ARG>(rhs, lhs);
0177 }
0178
0179 template<typename RealType, size_t DerivativeOrder, typename ARG>
0180 round_expr<RealType, DerivativeOrder, ARG> round(
0181 const expression<RealType, DerivativeOrder, ARG> &arg)
0182 {
0183 return round_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0184 }
0185
0186 template<typename RealType, size_t DerivativeOrder, typename ARG>
0187 int iround(const expression<RealType, DerivativeOrder, ARG> &arg)
0188 {
0189 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0190 return iround(tmp.item());
0191 }
0192 template<typename RealType, size_t DerivativeOrder, typename ARG>
0193 long lround(const expression<RealType, DerivativeOrder, ARG> &arg)
0194 {
0195 BOOST_MATH_STD_USING
0196 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0197 return lround(tmp.item());
0198 }
0199
0200 template<typename RealType, size_t DerivativeOrder, typename ARG>
0201 long long llround(const expression<RealType, DerivativeOrder, ARG> &arg)
0202 {
0203 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0204 return llround(tmp.item());
0205 }
0206
0207 template<typename RealType, size_t DerivativeOrder, typename ARG>
0208 int itrunc(const expression<RealType, DerivativeOrder, ARG> &arg)
0209 {
0210 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0211 return itrunc(tmp.item());
0212 }
0213
0214 template<typename RealType, size_t DerivativeOrder, typename ARG>
0215 long ltrunc(const expression<RealType, DerivativeOrder, ARG> &arg)
0216 {
0217 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0218 return ltrunc(tmp.item());
0219 }
0220
0221 template<typename RealType, size_t DerivativeOrder, typename ARG>
0222 long long lltrunc(const expression<RealType, DerivativeOrder, ARG> &arg)
0223 {
0224 rvar<RealType, DerivativeOrder> tmp = arg.evaluate();
0225 return lltrunc(tmp.item());
0226 }
0227
0228 template<typename RealType, size_t DerivativeOrder, typename ARG>
0229 sinh_expr<RealType, DerivativeOrder, ARG> sinh(const expression<RealType, DerivativeOrder, ARG> &arg)
0230 {
0231 return sinh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0232 }
0233
0234 template<typename RealType, size_t DerivativeOrder, typename ARG>
0235 cosh_expr<RealType, DerivativeOrder, ARG> cosh(const expression<RealType, DerivativeOrder, ARG> &arg)
0236 {
0237 return cosh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0238 }
0239
0240 template<typename RealType, size_t DerivativeOrder, typename ARG>
0241 tanh_expr<RealType, DerivativeOrder, ARG> tanh(const expression<RealType, DerivativeOrder, ARG> &arg)
0242 {
0243 return tanh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0244 }
0245
0246 template<typename RealType, size_t DerivativeOrder, typename ARG>
0247 log10_expr<RealType, DerivativeOrder, ARG> log10(
0248 const expression<RealType, DerivativeOrder, ARG> &arg)
0249 {
0250 return log10_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0251 }
0252 template<typename RealType, size_t DerivativeOrder, typename ARG>
0253 asinh_expr<RealType, DerivativeOrder, ARG> asinh(
0254 const expression<RealType, DerivativeOrder, ARG> &arg)
0255 {
0256 return asinh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0257 }
0258 template<typename RealType, size_t DerivativeOrder, typename ARG>
0259 acosh_expr<RealType, DerivativeOrder, ARG> acosh(
0260 const expression<RealType, DerivativeOrder, ARG> &arg)
0261 {
0262 return acosh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0263 }
0264 template<typename RealType, size_t DerivativeOrder, typename ARG>
0265 atanh_expr<RealType, DerivativeOrder, ARG> atanh(
0266 const expression<RealType, DerivativeOrder, ARG> &arg)
0267 {
0268 return atanh_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(0.0));
0269 }
0270 }
0271 }
0272 }
0273 }
0274
0275 #endif