21 static std::string str(
const X1& x1, Index i)
23 return x1->str(!x1->is_str_leaf()) +
"[" + std::to_string(i) +
"]";
27 static std::string str(
const X1& x1, Index i, Index j)
29 return x1->str(!x1->is_str_leaf()) +
"(" + std::to_string(i) +
"," + std::to_string(j) +
")";
33 static std::pair<Index,Index> output_shape(
const X1& s1, Index i)
35 auto shape1 = s1->output_shape();
36 assert(shape1.second==1 && i<shape1.first);
41 static std::pair<Index,Index> output_shape(
const X1& s1, Index i, Index j)
43 auto shape1 = s1->output_shape();
44 assert(j<shape1.second && i<shape1.first);
48 static Interval fwd(
const IntervalVector& x1, Index i);
49 static ScalarType fwd_natural(
const VectorType& x1, Index i);
50 static ScalarType fwd_centered(
const VectorType& x1, Index i);
51 static void bwd(
const Interval& y, IntervalVector& x1, Index i);
53 static Interval fwd(
const IntervalMatrix& x1, Index i, Index j);
54 static ScalarType fwd_natural(
const MatrixType& x1, Index i, Index j);
55 static ScalarType fwd_centered(
const MatrixType& x1, Index i, Index j);
56 static void bwd(
const Interval& y, IntervalMatrix& x1, Index i, Index j);
62 class AnalyticOperationExpr<ComponentOp,ScalarType,VectorType> :
public AnalyticExpr<ScalarType>,
public OperationExprBase<AnalyticExpr<VectorType>>
66 AnalyticOperationExpr(
const std::shared_ptr<AnalyticExpr<VectorType>>& x1, Index i)
70 AnalyticOperationExpr(
const AnalyticOperationExpr& e)
74 std::shared_ptr<ExprBase> copy()
const
76 return std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,VectorType>>(*this);
79 void replace_arg(
const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
84 ScalarType fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const
87 return AnalyticExpr<ScalarType>::init_value(
88 v, ComponentOp::fwd_natural(std::get<0>(this->
_x)->fwd_eval(v, total_input_size, natural_eval), _i));
90 return AnalyticExpr<ScalarType>::init_value(
91 v, ComponentOp::fwd_centered(std::get<0>(this->
_x)->fwd_eval(v, total_input_size, natural_eval), _i));
94 void bwd_eval(ValuesMap& v)
const
96 ComponentOp::bwd(AnalyticExpr<ScalarType>::value(v).a, std::get<0>(this->
_x)->value(v).a, _i);
97 std::get<0>(this->
_x)->bwd_eval(v);
100 std::pair<Index,Index> output_shape()
const
102 return ComponentOp::output_shape(std::get<0>(this->
_x),_i);
105 virtual bool belongs_to_args_list(
const FunctionArgsList& args)
const
107 return std::get<0>(this->
_x)->belongs_to_args_list(args);
110 std::string str(
bool in_parentheses =
false)
const
112 std::string s = ComponentOp::str(std::get<0>(this->
_x), _i);
113 return in_parentheses ?
"(" + s +
")" : s;
116 virtual bool is_str_leaf()
const
127 class AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType> :
public AnalyticExpr<ScalarType>,
public OperationExprBase<AnalyticExpr<MatrixType>>
131 AnalyticOperationExpr(
const std::shared_ptr<AnalyticExpr<MatrixType>>& x1, Index i, Index j)
135 AnalyticOperationExpr(
const AnalyticOperationExpr& e)
139 std::shared_ptr<ExprBase> copy()
const
141 return std::make_shared<AnalyticOperationExpr<ComponentOp,ScalarType,MatrixType>>(*this);
144 void replace_arg(
const ExprID& old_arg_id,
const std::shared_ptr<ExprBase>& new_expr)
149 ScalarType fwd_eval(ValuesMap& v, Index total_input_size,
bool natural_eval)
const
152 return AnalyticExpr<ScalarType>::init_value(
153 v, ComponentOp::fwd_natural(std::get<0>(this->
_x)->fwd_eval(v, total_input_size, natural_eval), _i, _j));
155 return AnalyticExpr<ScalarType>::init_value(
156 v, ComponentOp::fwd_centered(std::get<0>(this->
_x)->fwd_eval(v, total_input_size, natural_eval), _i, _j));
159 void bwd_eval(ValuesMap& v)
const
161 ComponentOp::bwd(AnalyticExpr<ScalarType>::value(v).a, std::get<0>(this->
_x)->value(v).a, _i, _j);
162 std::get<0>(this->
_x)->bwd_eval(v);
165 std::pair<Index,Index> output_shape()
const
167 return ComponentOp::output_shape(std::get<0>(this->
_x),_i,_j);
170 virtual bool belongs_to_args_list(
const FunctionArgsList& args)
const
172 return std::get<0>(this->
_x)->belongs_to_args_list(args);
175 std::string str(
bool in_parentheses =
false)
const
177 std::string s = ComponentOp::str(std::get<0>(this->
_x), _i, _j);
178 return in_parentheses ?
"(" + s +
")" : s;
181 virtual bool is_str_leaf()
const
195 inline Interval ComponentOp::fwd(
const IntervalVector& x1, Index i)
197 assert(i >= 0 && i < x1.size());
201 inline ScalarType ComponentOp::fwd_natural(
const VectorType& x1, Index i)
203 assert(i >= 0 && i < x1.a.rows());
210 inline ScalarType ComponentOp::fwd_centered(
const VectorType& x1, Index i)
212 if(centered_form_not_available_for_args(x1))
213 return fwd_natural(x1,i);
215 assert(i >= 0 && i < x1.a.rows());
224 inline void ComponentOp::bwd(
const Interval& y, IntervalVector& x1, Index i)
226 assert(i >= 0 && i < x1.size());
232 inline Interval ComponentOp::fwd(
const IntervalMatrix& x1, Index i, Index j)
234 assert(i >= 0 && i < x1.rows());
235 assert(j >= 0 && j < x1.cols());
239 inline ScalarType ComponentOp::fwd_natural(
const MatrixType& x1, Index i, Index j)
241 assert(i >= 0 && i < x1.a.rows());
242 assert(j >= 0 && j < x1.a.cols());
249 inline ScalarType ComponentOp::fwd_centered(
const MatrixType& x1, Index i, Index j)
251 if(centered_form_not_available_for_args(x1))
252 return fwd_natural(x1,i,j);
254 assert(i >= 0 && i < x1.a.rows());
255 assert(j >= 0 && j < x1.a.cols());
259 x1.da.row(x1.a.rows()*i+j),
264 inline void ComponentOp::bwd(
const Interval& y, IntervalMatrix& x1, Index i, Index j)
266 assert(i >= 0 && i < x1.rows());
267 assert(j >= 0 && j < x1.cols());
Interval class, for representing closed and connected subsets of .
Definition codac2_Interval.h:62
A base class for expressions representing operations with multiple operands.
Definition codac2_ExprBase.h:164
OperationExprBase(std::shared_ptr< X >... x)
Definition codac2_ExprBase.h:176
std::tuple< std::shared_ptr< X >... > _x
Definition codac2_ExprBase.h:258