17 template <
class LHSType,
class RHSType
18 ,
class = std::enable_if_t<
19 util::is_not_both_arithmetic_v<LHSType, RHSType> &&
20 util::is_valid_op_param_v<LHSType> &&
21 util::is_valid_op_param_v<RHSType>
26 return expr::var::details::operator_helper<ad::core::Add>(lhs, rhs);
29 template <
class LHSType,
class RHSType
30 ,
class = std::enable_if_t<
31 util::is_not_both_arithmetic_v<LHSType, RHSType> &&
32 util::is_valid_op_param_v<LHSType> &&
33 util::is_valid_op_param_v<RHSType>
38 return expr::var::details::operator_helper<ad::core::Sub>(lhs, rhs);
41 template <
class LHSType,
class RHSType
42 ,
class = std::enable_if_t<
43 util::is_not_both_arithmetic_v<LHSType, RHSType> &&
44 util::is_valid_op_param_v<LHSType> &&
45 util::is_valid_op_param_v<RHSType>
50 return expr::var::details::operator_helper<ad::core::Mul>(lhs, rhs);
53 template <
class LHSType,
class RHSType
54 ,
class = std::enable_if_t<
55 util::is_not_both_arithmetic_v<LHSType, RHSType> &&
56 util::is_valid_op_param_v<LHSType> &&
57 util::is_valid_op_param_v<RHSType>
62 return expr::var::details::operator_helper<ad::core::Div>(lhs, rhs);
66 template <
class TParamViewType
68 ,
class = std::enable_if_t<
69 util::is_tparam_v<TParamViewType> &&
70 util::is_valid_op_param_v<VarExprType>
72 constexpr
inline auto operator+=(
const TParamViewType& tp_view,
73 const VarExprType& expr)
75 return expr::var::details::opeq_helper<expr::var::AddEq>(tp_view, expr);
78 template <
class TParamViewType
80 ,
class = std::enable_if_t<
81 util::is_tparam_v<TParamViewType> &&
82 util::is_valid_op_param_v<VarExprType>
84 constexpr
inline auto operator-=(
const TParamViewType& tp_view,
85 const VarExprType& expr)
87 return expr::var::details::opeq_helper<expr::var::SubEq>(tp_view, expr);
90 template <
class TParamViewType
92 ,
class = std::enable_if_t<
93 util::is_tparam_v<TParamViewType> &&
94 util::is_valid_op_param_v<VarExprType>
96 constexpr
inline auto operator*=(
const TParamViewType& tp_view,
97 const VarExprType& expr)
99 return expr::var::details::opeq_helper<expr::var::MulEq>(tp_view, expr);
102 template <
class TParamViewType
104 ,
class = std::enable_if_t<
105 util::is_tparam_v<TParamViewType> &&
106 util::is_valid_op_param_v<VarExprType>
108 constexpr
inline auto operator/=(
const TParamViewType& tp_view,
109 const VarExprType& expr)
111 return expr::var::details::opeq_helper<expr::var::DivEq>(tp_view, expr);
115 template <
class LHSExprType
117 ,
class = std::enable_if_t<
118 (util::is_var_expr_v<LHSExprType> ||
119 util::is_model_expr_v<LHSExprType>) &&
120 (util::is_var_expr_v<RHSExprType> ||
121 util::is_model_expr_v<RHSExprType>)
124 const RHSExprType& rhs)
126 if constexpr (util::is_var_expr_v<LHSExprType> &&
127 util::is_var_expr_v<RHSExprType>) {
130 lhs_t wrap_lhs = lhs;
131 rhs_t wrap_rhs = rhs;
134 }
else if constexpr (util::is_model_expr_v<LHSExprType> &&
135 util::is_model_expr_v<RHSExprType>) {
139 static_assert(util::is_var_expr_v<LHSExprType> &&
140 util::is_var_expr_v<RHSExprType>,
141 "Both expressions must be either variable expression or model expressions.");
150 template <
class VarType
152 ,
class = std::enable_if_t<
153 util::is_var_v<VarType> &&
154 util::is_dist_assignable_v<VarType> &&
155 util::is_dist_expr_v<DistType>
158 const DistType& dist)
161 view_t var_view = var;
165 template <
class TPExpr
167 ,
class = std::enable_if_t<
168 util::is_var_expr_v<TPExpr> &&
169 util::is_model_expr_v<ModelExpr>
172 const ModelExpr& model)
175 using model_t = ModelExpr;