File indexing completed on 2026-08-17 08:48:09
0001
0002
0003
0004
0005
0006 #ifndef REVERSE_MODE_AUTODIFF_BASIC_OPS_ET_HPP
0007 #define REVERSE_MODE_AUTODIFF_BASIC_OPS_ET_HPP
0008
0009 #include <boost/math/differentiation/detail/reverse_mode_autodiff_basic_operator_expressions.hpp>
0010 namespace boost {
0011 namespace math {
0012 namespace differentiation {
0013 namespace reverse_mode {
0014 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0015 mult_expr<RealType, DerivativeOrder, LHS, RHS> operator*(
0016 const expression<RealType, DerivativeOrder, LHS> &lhs,
0017 const expression<RealType, DerivativeOrder, RHS> &rhs)
0018 {
0019 return mult_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0020 }
0021
0022
0023
0024
0025
0026 template<typename RealType2,
0027 typename RealType1,
0028 size_t DerivativeOrder,
0029 typename ARG,
0030 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0031 mult_const_expr<RealType1, DerivativeOrder, ARG> operator*(
0032 const expression<RealType1, DerivativeOrder, ARG> &arg, const RealType2 &v)
0033 {
0034 return mult_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0035 }
0036 template<typename RealType2,
0037 typename RealType1,
0038 size_t DerivativeOrder,
0039 typename ARG,
0040 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0041 mult_const_expr<RealType1, DerivativeOrder, ARG> operator*(
0042 const RealType2 &v, const expression<RealType1, DerivativeOrder, ARG> &arg)
0043 {
0044 return mult_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0045 }
0046
0047
0048 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0049 add_expr<RealType, DerivativeOrder, LHS, RHS> operator+(
0050 const expression<RealType, DerivativeOrder, LHS> &lhs,
0051 const expression<RealType, DerivativeOrder, RHS> &rhs)
0052 {
0053 return add_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0054 }
0055 template<typename RealType2,
0056 typename RealType1,
0057 size_t DerivativeOrder,
0058 typename ARG,
0059 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0060 add_const_expr<RealType1, DerivativeOrder, ARG> operator+(
0061 const expression<RealType1, DerivativeOrder, ARG> &arg, const RealType2 &v)
0062 {
0063 return add_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0064 }
0065 template<typename RealType2,
0066 typename RealType1,
0067 size_t DerivativeOrder,
0068 typename ARG,
0069 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0070 add_const_expr<RealType1, DerivativeOrder, ARG> operator+(
0071 const RealType2 &v, const expression<RealType1, DerivativeOrder, ARG> &arg)
0072 {
0073 return add_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0074 }
0075
0076
0077
0078
0079 template<typename RealType, size_t DerivativeOrder, typename ARG>
0080 mult_const_expr<RealType, DerivativeOrder, ARG> operator-(
0081 const expression<RealType, DerivativeOrder, ARG> &arg)
0082 {
0083 return mult_const_expr<RealType, DerivativeOrder, ARG>(arg, static_cast<RealType>(-1.0));
0084 }
0085
0086
0087
0088 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0089 sub_expr<RealType, DerivativeOrder, LHS, RHS> operator-(
0090 const expression<RealType, DerivativeOrder, LHS> &lhs,
0091 const expression<RealType, DerivativeOrder, RHS> &rhs)
0092 {
0093 return sub_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0094 }
0095
0096
0097
0098 template<typename RealType2,
0099 typename RealType1,
0100 size_t DerivativeOrder,
0101 typename ARG,
0102 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0103 add_const_expr<RealType1, DerivativeOrder, ARG> operator-(
0104 const expression<RealType1, DerivativeOrder, ARG> &arg, const RealType2 &v)
0105 {
0106
0107 return add_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(-v));
0108 }
0109
0110
0111
0112
0113
0114 template<typename RealType2,
0115 typename RealType1,
0116 size_t DerivativeOrder,
0117 typename ARG,
0118 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0119 auto operator-(const RealType2 &v, const expression<RealType1, DerivativeOrder, ARG> &arg)
0120 {
0121 auto neg = -arg;
0122 return neg + static_cast<RealType1>(v);
0123 }
0124
0125
0126 template<typename RealType, size_t DerivativeOrder, typename LHS, typename RHS>
0127 div_expr<RealType, DerivativeOrder, LHS, RHS> operator/(
0128 const expression<RealType, DerivativeOrder, LHS> &lhs,
0129 const expression<RealType, DerivativeOrder, RHS> &rhs)
0130 {
0131 return div_expr<RealType, DerivativeOrder, LHS, RHS>(lhs, rhs);
0132 }
0133
0134 template<typename RealType2,
0135 typename RealType1,
0136 size_t DerivativeOrder,
0137 typename ARG,
0138 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0139 const_div_by_expr<RealType1, DerivativeOrder, ARG> operator/(
0140 const RealType2 &v, const expression<RealType1, DerivativeOrder, ARG> &arg)
0141 {
0142 return const_div_by_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0143 }
0144
0145 template<typename RealType2,
0146 typename RealType1,
0147 size_t DerivativeOrder,
0148 typename ARG,
0149 typename = typename std::enable_if<!detail::is_expression<RealType2>::value>::type>
0150 div_by_const_expr<RealType1, DerivativeOrder, ARG> operator/(
0151 const expression<RealType1, DerivativeOrder, ARG> &arg, const RealType2 &v)
0152 {
0153 return div_by_const_expr<RealType1, DerivativeOrder, ARG>(arg, static_cast<RealType1>(v));
0154 }
0155 }
0156 }
0157 }
0158 }
0159
0160 #endif