24 template<
typename... X>
25 static inline std::string str(
const X&... x)
27 std::string s = ((
"\t" + x->str() +
",\n") + ...);
28 s.pop_back(); s.pop_back();
29 return "[\n" + s +
"\n]";
32 template<
typename... X>
33 static std::pair<Index,Index> output_shape([[maybe_unused]]
const X&... x)
35 return {
sizeof...(X), 1 };
38 template<
typename... X>
39 requires (std::is_base_of_v<Interval,X> && ...)
45 template<
typename... X>
46 requires (std::is_base_of_v<ScalarType,X> && ...)
47 static inline VectorType fwd_natural(
const X&... x)
49 bool def_domain =
true;
50 ((def_domain &= x.def_domain), ...);
58 template<
typename... X>
59 requires (std::is_base_of_v<ScalarType,X> && ...)
60 static inline VectorType fwd_centered(
const X&... x)
62 if(centered_form_not_available_for_args(x...))
63 return fwd_natural(x...);
65 IntervalMatrix d(
sizeof...(X),std::get<0>(std::tie(x...)).da.cols());
67 ((d.row(i++) = x.da), ...);
69 bool def_domain =
true;
70 ((def_domain &= x.def_domain), ...);
80 template<
typename... X>
81 requires (std::is_base_of_v<Interval,X> && ...)
91 inline void replace_scalar_child(std::shared_ptr<AnalyticExpr<ScalarType>>& x,
92 const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
94 if(x->unique_id() == old_arg_id)
96 auto new_x = std::dynamic_pointer_cast<AnalyticExpr<ScalarType>>(new_expr);
97 assert_release(new_x);
102 x->replace_arg(old_arg_id, new_expr);
105 class DynamicVectorExpr final :
public AnalyticExpr<VectorType>
109 explicit DynamicVectorExpr(
const std::vector<ScalarExpr>& xs)
111 _xs.reserve(xs.size());
112 for(
const auto& x : xs)
114 auto sx = std::dynamic_pointer_cast<AnalyticExpr<ScalarType>>(x);
120 DynamicVectorExpr(
const DynamicVectorExpr& e)
122 _xs.reserve(e._xs.size());
123 for(
const auto& x : e._xs)
125 auto sx = std::dynamic_pointer_cast<AnalyticExpr<ScalarType>>(x->copy());
131 std::shared_ptr<ExprBase>
copy()
const override
133 return std::make_shared<DynamicVectorExpr>(*
this);
136 void replace_arg(
const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
override
139 replace_scalar_child(x, old_arg_id, new_expr);
142 VectorType fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const override
145 return this->init_value(v, natural_fwd(v, total_input_size));
147 std::vector<ScalarType> vals;
148 vals.reserve(_xs.size());
149 bool centered_available =
true;
150 for(
const auto& x : _xs)
152 vals.push_back(x->fwd_eval(v, total_input_size,
false));
153 centered_available &= (vals.back().da.size() != 0);
156 if(!centered_available)
157 return this->init_value(v, natural_fwd(v, total_input_size));
159 const Index n =
static_cast<Index
>(_xs.size());
160 const Index input_cols = vals.empty() ? total_input_size : vals.front().da.cols();
163 bool def_domain =
true;
165 for(Index i = 0 ; i < n ; ++i)
167 const auto& xi = vals[
static_cast<std::size_t
>(i)];
171 def_domain &= xi.def_domain;
174 return this->init_value(v, VectorType(m, a, da, def_domain));
177 void bwd_eval(ValuesMap& v)
const override
179 for(
const auto& x : _xs)
183 std::pair<Index,Index> output_shape()
const override
185 return {
static_cast<Index
>(_xs.size()), 1 };
188 bool belongs_to_args_list(
const FunctionArgsList& args)
const override
191 for(
const auto& x : _xs)
192 ok &= x->belongs_to_args_list(args);
196 std::string str(
bool in_parentheses =
false)
const override
199 return in_parentheses ?
"([])" :
"[]";
202 for(
const auto& x : _xs)
203 s +=
"\t" + x->str() +
",\n";
208 s =
"[\n" + s +
"\n]";
209 return in_parentheses ?
"(" + s +
")" : s;
212 bool is_str_leaf()
const override
219 std::vector<std::shared_ptr<ExprBase>> children;
220 children.reserve(_xs.size());
221 for(
const auto& x : _xs)
222 children.push_back(std::dynamic_pointer_cast<ExprBase>(x));
228 VectorType natural_fwd(ValuesMap& v, Index total_input_size)
const
230 const Index n =
static_cast<Index
>(_xs.size());
232 bool def_domain =
true;
233 for(Index i = 0 ; i < n ; ++i)
235 auto xi = _xs[
static_cast<std::size_t
>(i)]->fwd_eval(v, total_input_size,
true);
237 def_domain &= xi.def_domain;
240 return { a, def_domain };
243 std::vector<std::shared_ptr<AnalyticExpr<ScalarType>>> _xs;
250 inline const ScalarExpr& _add_to_vec(
const ScalarExpr& x)
255 inline ScalarExpr _add_to_vec(
double x)
257 return const_value(x);
262 template<
typename... X>
263 requires ((std::is_same_v<typename ExprType<X>::Type,ScalarType>) && ...)
267 return { std::make_shared<AnalyticOperationExpr<VectorOp,VectorType,typename ExprType<X>::Type...>>(_add_to_vec(x)...) };
273 vec(
const std::vector<ScalarExpr>& x)
275 return { std::make_shared<detail::DynamicVectorExpr>(x) };
virtual std::vector< std::shared_ptr< ExprBase > > children_expr_base() const
Definition codac2_ExprBase.h:152
virtual std::shared_ptr< ExprBase > copy() const =0
Creates a copy of the current expression.
Definition codac2_OctaSym.h:21
Eigen::Matrix< Interval,-1, 1 > IntervalVector
Alias for a dynamic-size column vector of intervals.
Definition codac2_IntervalVector.h:25
Eigen::Matrix< Interval,-1,-1 > IntervalMatrix
Alias for a dynamic-size matrix of intervals.
Definition codac2_IntervalMatrix.h:25