codac 2.0.0
Loading...
Searching...
No Matches
codac2_Traj_operator.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "codac2_SampledTraj.h"
14#include "codac2_ValueType.h"
15#include "codac2_Wrapper.h"
16
17namespace codac2
18{
19 template<typename T>
20 struct TrajectoryOp
21 {
22 static typename Wrapper<T>::Domain fwd(const TrajBase<T>& x1, const Interval& x2)
23 {
24 return x1(x2);
25 }
26
27 static typename ValueType<T>::Type fwd(const TrajBase<T>& x1, const ScalarType& x2)
28 {
29 IntervalMatrix d(x1.size(),x2.da.cols());
30
31 return {
32 fwd(x1,x2.m),
33 fwd(x1,x2.a),
34 d,
35 x2.def_domain && x1.tdomain().is_superset(x2.m)
36 };
37 }
38
39 static void bwd(
40 [[maybe_unused]] const TrajBase<T>& x1,
41 [[maybe_unused]] const typename Wrapper<T>::Domain& y,
42 [[maybe_unused]] Interval& x2)
43 {
44 // todo
45 }
46 };
47
48 template<typename T>
49 class AnalyticOperationExpr<TrajectoryOp<T>,typename ValueType<T>::Type,ScalarType>
50 : public AnalyticExpr<typename ValueType<T>::Type>, public OperationExprBase<AnalyticExpr<ScalarType>>
51 {
52 public:
53
54 using O = typename ValueType<T>::Type;
55
56 AnalyticOperationExpr(const TrajBase<T>& x1, const ScalarExpr& x2)
57 : OperationExprBase<AnalyticExpr<ScalarType>>(x2), _x1(x1)
58 { }
59
60 std::shared_ptr<ExprBase> copy() const
61 {
62 return std::make_shared<AnalyticOperationExpr<TrajectoryOp<T>,O,ScalarType>>(*this);
63 }
64
65 void replace_arg(const ExprID& old_arg_id, const std::shared_ptr<ExprBase>& new_expr)
66 {
67 return OperationExprBase<AnalyticExpr<ScalarType>>::replace_arg(old_arg_id, new_expr);
68 }
69
70 O fwd_eval(ValuesMap& v, Index total_input_size, bool natural_eval) const
71 {
72 return AnalyticExpr<O>::init_value(
73 v, TrajectoryOp<T>::fwd(_x1, std::get<0>(this->_x)->fwd_eval(v, total_input_size, natural_eval)));
74 }
75
76 void bwd_eval(ValuesMap& v) const
77 {
78 TrajectoryOp<T>::bwd(_x1, AnalyticExpr<O>::value(v).a, std::get<0>(this->_x)->value(v).a);
79 std::get<0>(this->_x)->bwd_eval(v);
80 }
81
82 std::pair<Index,Index> output_shape() const {
83 return _x1.shape();
84 }
85
86 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
87 {
88 return std::get<0>(this->_x)->belongs_to_args_list(args);
89 }
90
91 std::string str(bool in_parentheses = false) const
92 {
93 std::string s = "T"; // user cannot (yet) specify a name for the trajectory
94 return in_parentheses ? "(" + s + ")" : s;
95 }
96
97 virtual bool is_str_leaf() const
98 {
99 return true;
100 }
101
102 protected:
103
104 const TrajBase<T>& _x1;
105 };
106
107 template<typename T>
108 AnalyticFunction<typename ValueType<T>::Type> TrajBase<T>::as_function() const
109 {
110 using D = typename ValueType<T>::Type;
111
112 ScalarVar t;
113 return {{t},
114 AnalyticExprWrapper<D>(std::make_shared<
115 AnalyticOperationExpr
116 <TrajectoryOp<T>, D, ScalarType>>(*this,t))
117 };
118 }
119}
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