codac 1.5.6
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_expr(const ExprID& old_expr_id, const std::shared_ptr<ExprBase>& new_expr)
66 {
67 return OperationExprBase<AnalyticExpr<ScalarType>>::replace_expr(old_expr_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 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
83 {
84 return std::get<0>(this->_x)->belongs_to_args_list(args);
85 }
86
87 protected:
88
89 const TrajBase<T>& _x1;
90 };
91
92 template<typename T>
93 AnalyticFunction<typename ValueType<T>::Type> TrajBase<T>::as_function() const
94 {
95 using D = typename ValueType<T>::Type;
96
97 ScalarVar t;
98 return {{t},
99 AnalyticExprWrapper<D>(std::make_shared<
100 AnalyticOperationExpr
101 <TrajectoryOp<T>, D, ScalarType>>(*this,t))
102 };
103 }
104}