23 template<
typename... X>
24 static std::string str(
const X&... x)
26 std::string s = ((
"\t" + x->str() +
",\n") + ...);
27 s.pop_back(); s.pop_back();
28 return "[\n" + s +
"\n]";
31 template<
typename X1,
typename... X>
32 static std::pair<Index,Index> output_shape(
const X1& s1, [[maybe_unused]]
const X&... s)
34 auto shape1 = s1->output_shape();
35 assert(shape1.second == 1);
36 return { shape1.first, 1+
sizeof...(X) };
41 assert(i >= 0 && i < m.cols());
42 assert_release(x.size() == m.rows());
46 template<
typename X1,
typename... X>
47 requires ((X1::ColsAtCompileTime == 1) && ((X::ColsAtCompileTime == 1) && ...))
52 MatrixOp::set_col_i(m, x1, i++);
53 (MatrixOp::set_col_i(m, x, i++), ...);
57 template<
typename... X>
58 requires (std::is_base_of_v<VectorType,X> && ...)
59 static inline MatrixType fwd_natural(
const X&... x)
62 MatrixOp::fwd(x.a...),
69 d.middleRows(l,dax.rows())=dax;
74 template<
typename X1,
typename... X>
75 requires (std::is_base_of_v<VectorType,X1>
76 && (std::is_base_of_v<VectorType,X> && ...))
77 static inline MatrixType fwd_centered(
const X1& x1,
const X&... x)
79 if (centered_form_not_available_for_args(x1,x...))
80 return fwd_natural(x1,x...);
84 d.topRows(x1.da.rows()) = x1.da;
86 ( MatrixOp::fill_diff_matrix(d,x.da,l) , ...);
90 MatrixOp::fwd(x1.m,x.m...),
91 MatrixOp::fwd(x1.a,x.a...),
93 (x1.def_domain && (x.def_domain && ...))
97 template<
typename... X>
98 requires (std::is_base_of_v<IntervalVector,X> && ...)
102 ((x &= y.col(i++)), ...);
108 inline void replace_vector_child(std::shared_ptr<AnalyticExpr<VectorType>>& x,
109 const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
111 if(x->unique_id() == old_arg_id)
113 auto new_x = std::dynamic_pointer_cast<AnalyticExpr<VectorType>>(new_expr);
114 assert_release(new_x);
119 x->replace_arg(old_arg_id, new_expr);
122 class DynamicMatrixExpr final :
public AnalyticExpr<MatrixType>
126 explicit DynamicMatrixExpr(
const std::vector<VectorExpr>& xs)
128 _xs.reserve(xs.size());
129 for(
const auto& x : xs)
131 auto vx = std::dynamic_pointer_cast<AnalyticExpr<VectorType>>(x);
137 DynamicMatrixExpr(
const DynamicMatrixExpr& e)
139 _xs.reserve(e._xs.size());
140 for(
const auto& x : e._xs)
142 auto vx = std::dynamic_pointer_cast<AnalyticExpr<VectorType>>(x->copy());
148 std::shared_ptr<ExprBase>
copy()
const override
150 return std::make_shared<DynamicMatrixExpr>(*
this);
153 void replace_arg(
const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
override
156 replace_vector_child(x, old_arg_id, new_expr);
159 MatrixType fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const override
162 return this->init_value(v, natural_fwd(v, total_input_size));
164 std::vector<VectorType> vals;
165 vals.reserve(_xs.size());
166 bool centered_available =
true;
167 for(
const auto& x : _xs)
169 vals.push_back(x->fwd_eval(v, total_input_size,
false));
170 centered_available &= (vals.back().da.size() != 0);
173 if(!centered_available)
174 return this->init_value(v, natural_fwd(v, total_input_size));
176 const Index cols =
static_cast<Index
>(_xs.size());
177 const Index rows = vals.empty() ? 0 : vals.front().a.size();
178 const Index input_cols = vals.empty() ? total_input_size : vals.front().da.cols();
179 IntervalMatrix m(rows, cols), a(rows, cols), da(rows*cols, input_cols);
180 bool def_domain =
true;
183 for(Index j = 0 ; j < cols ; ++j)
185 const auto& xj = vals[
static_cast<std::size_t
>(j)];
188 da.middleRows(l, xj.da.rows()) = xj.da;
190 def_domain &= xj.def_domain;
193 return this->init_value(v, MatrixType(m, a, da, def_domain));
196 void bwd_eval(ValuesMap& v)
const override
198 for(
const auto& x : _xs)
202 std::pair<Index,Index> output_shape()
const override
207 const auto shape = _xs.front()->output_shape();
208 assert(shape.second == 1);
209 return { shape.first,
static_cast<Index
>(_xs.size()) };
212 bool belongs_to_args_list(
const FunctionArgsList& args)
const override
215 for(
const auto& x : _xs)
216 ok &= x->belongs_to_args_list(args);
220 std::string str(
bool in_parentheses =
false)
const override
223 return in_parentheses ?
"([])" :
"[]";
226 for(
const auto& x : _xs)
227 s +=
"\t" + x->str() +
",\n";
232 s =
"[\n" + s +
"\n]";
233 return in_parentheses ?
"(" + s +
")" : s;
236 bool is_str_leaf()
const override
243 std::vector<std::shared_ptr<ExprBase>> children;
244 children.reserve(_xs.size());
245 for(
const auto& x : _xs)
246 children.push_back(std::dynamic_pointer_cast<ExprBase>(x));
252 MatrixType natural_fwd(ValuesMap& v, Index total_input_size)
const
254 const Index cols =
static_cast<Index
>(_xs.size());
255 const Index rows = _xs.empty() ? 0 : _xs.front()->output_shape().first;
257 bool def_domain =
true;
259 for(Index j = 0 ; j < cols ; ++j)
261 auto xj = _xs[
static_cast<std::size_t
>(j)]->fwd_eval(v, total_input_size,
true);
263 def_domain &= xj.def_domain;
266 return { a, def_domain };
269 std::vector<std::shared_ptr<AnalyticExpr<VectorType>>> _xs;
278 template<
typename... X>
280 mat(
const std::shared_ptr<AnalyticExpr<X>>&... x)
282 return { std::make_shared<AnalyticOperationExpr<MatrixOp,MatrixType,X...>>(
283 AnalyticOperationExpr<MatrixOp,MatrixType,X...>(x...)) };
289 mat(
const std::vector<VectorExpr>& x)
291 return { std::make_shared<detail::DynamicMatrixExpr>(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