codac 1.5.6
Loading...
Searching...
No Matches
codac2_SetExpr.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <map>
13#include <memory>
14#include <utility>
15#include <functional>
16#include "codac2_ExprBase.h"
17#include "codac2_Domain.h"
20
21namespace codac2
22{
23 using SetValuesMap = std::map<ExprID,std::shared_ptr<SepBase>>;
24
25 class SetExpr : public ExprBase
26 {
27 public:
28
29 SetExpr& operator=(const SetExpr& x) = delete;
30 virtual std::shared_ptr<CtcBase<IntervalVector>> create_ctc(const FunctionArgsList& args, const std::vector<std::shared_ptr<CtcBase<IntervalVector>>>& x) const = 0;
31 virtual std::shared_ptr<SepBase> create_sep(const FunctionArgsList& args, const std::vector<std::shared_ptr<SepBase>>& x) const = 0;
32
33 virtual bool belongs_to_args_list(const FunctionArgsList& args) const = 0;
34 };
35
36 template<typename C,typename... X>
37 class SetOperationExpr : public SetExpr, public OperationExprBase<X...>
38 {
39 public:
40
41 SetOperationExpr(std::shared_ptr<X>... x)
42 : OperationExprBase<X...>(x...)
43 { }
44
45 SetOperationExpr(const SetOperationExpr<C,X...>& e)
46 : OperationExprBase<X...>(e)
47 { }
48
49 std::shared_ptr<ExprBase> copy() const
50 {
51 return std::make_shared<SetOperationExpr<C,X...>>(*this);
52 }
53
54 void replace_expr(const ExprID& old_expr_id, const std::shared_ptr<ExprBase>& new_expr)
55 {
56 return OperationExprBase<X...>::replace_expr(old_expr_id, new_expr);
57 }
58
59 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
60 {
61 bool b = true;
62
63 std::apply([&b,args](auto &&... x)
64 {
65 ((b &= x->belongs_to_args_list(args)), ...);
66 }, this->_x);
67
68 return b;
69 }
70
71 std::shared_ptr<CtcBase<IntervalVector>> create_ctc(const FunctionArgsList& args, const std::vector<std::shared_ptr<CtcBase<IntervalVector>>>& values) const
72 {
73 return std::apply(
74 [this,values,args](auto &&... x)
75 {
76 return C::create_ctc(x->create_ctc(args,values)...);
77 },
78 this->_x);
79 }
80
81 std::shared_ptr<SepBase> create_sep(const FunctionArgsList& args, const std::vector<std::shared_ptr<SepBase>>& values) const
82 {
83 return std::apply(
84 [this,values,args](auto &&... x)
85 {
86 return C::create_sep(x->create_sep(args,values)...);
87 },
88 this->_x);
89 }
90 };
91
92 template<>
93 class SetOperationExpr<ProjSetOp,SetExpr> : public SetExpr, public OperationExprBase<SetExpr>
94 {
95 public:
96
97 SetOperationExpr(std::shared_ptr<SetExpr> x, const std::vector<Index>& proj_indices, double eps)
98 : OperationExprBase<SetExpr>(x), _proj_indices(proj_indices), _y(nullptr), _eps(eps)
99 { }
100
101 SetOperationExpr(std::shared_ptr<SetExpr> x, const std::vector<Index>& proj_indices, const IntervalVector& y, double eps)
102 : OperationExprBase<SetExpr>(x), _proj_indices(proj_indices), _y(std::make_shared<IntervalVector>(y)), _eps(eps)
103 { }
104
105 SetOperationExpr(const SetOperationExpr& e)
106 : OperationExprBase<SetExpr>(e), _proj_indices(e._proj_indices), _y(e._y), _eps(e._eps)
107 { }
108
109 std::shared_ptr<ExprBase> copy() const
110 {
111 return std::make_shared<SetOperationExpr<ProjSetOp,SetExpr>>(*this);
112 }
113
114 void replace_expr(const ExprID& old_expr_id, const std::shared_ptr<ExprBase>& new_expr)
115 {
116 return OperationExprBase<SetExpr>::replace_expr(old_expr_id, new_expr);
117 }
118
119 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
120 {
121 return std::get<0>(this->_x)->belongs_to_args_list(args);
122 }
123
124 std::shared_ptr<CtcBase<IntervalVector>> create_ctc(const FunctionArgsList& args, const std::vector<std::shared_ptr<CtcBase<IntervalVector>>>& values) const
125 {
126 throw std::logic_error("CtcProj not yet available");
127 return nullptr;
128 }
129
130 std::shared_ptr<SepBase> create_sep(const FunctionArgsList& args, const std::vector<std::shared_ptr<SepBase>>& values) const
131 {
132 if(_y)
133 return ProjSetOp::create_sep(std::get<0>(this->_x)->create_sep(args,values), _proj_indices, *_y, _eps);
134 else
135 return ProjSetOp::create_sep(std::get<0>(this->_x)->create_sep(args,values), _proj_indices, _eps);
136 }
137
138 protected:
139
140 const std::vector<Index> _proj_indices;
141 const std::shared_ptr<IntervalVector> _y;
142 const double _eps;
143 };
144
145 template<>
146 class SetOperationExpr<InverseSetOp,SetExpr> : public SetExpr, public OperationExprBase<SetExpr>
147 {
148 public:
149
150 SetOperationExpr(const AnalyticFunction<VectorType>& f, std::shared_ptr<SetExpr> x)
151 : OperationExprBase<SetExpr>(x), _f(f)
152 { }
153
154 SetOperationExpr(const SetOperationExpr& e)
155 : OperationExprBase<SetExpr>(e), _f(e._f)
156 { }
157
158 std::shared_ptr<ExprBase> copy() const
159 {
160 return std::make_shared<SetOperationExpr<InverseSetOp,SetExpr>>(*this);
161 }
162
163 void replace_expr(const ExprID& old_expr_id, const std::shared_ptr<ExprBase>& new_expr)
164 {
165 return OperationExprBase<SetExpr>::replace_expr(old_expr_id, new_expr);
166 }
167
168 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
169 {
170 return std::get<0>(this->_x)->belongs_to_args_list(args);
171 }
172
173 std::shared_ptr<CtcBase<IntervalVector>> create_ctc(const FunctionArgsList& args, const std::vector<std::shared_ptr<CtcBase<IntervalVector>>>& values) const
174 {
175 return InverseSetOp::create_ctc(_f, std::get<0>(this->_x)->create_ctc(args,values));
176 }
177
178 std::shared_ptr<SepBase> create_sep(const FunctionArgsList& args, const std::vector<std::shared_ptr<SepBase>>& values) const
179 {
180 return InverseSetOp::create_sep(_f, std::get<0>(this->_x)->create_sep(args,values));
181 }
182
183 protected:
184
185 const AnalyticFunction<VectorType> _f;
186 };
187
188 template<>
189 class SetOperationExpr<ActionSetOp,SetExpr> : public SetExpr, public OperationExprBase<SetExpr>
190 {
191 public:
192
193 SetOperationExpr(const OctaSym& a, std::shared_ptr<SetExpr> x)
194 : OperationExprBase<SetExpr>(x), _a(a)
195 { }
196
197 SetOperationExpr(const SetOperationExpr& e)
198 : OperationExprBase<SetExpr>(e), _a(e._a)
199 { }
200
201 std::shared_ptr<ExprBase> copy() const
202 {
203 return std::make_shared<SetOperationExpr<ActionSetOp,SetExpr>>(*this);
204 }
205
206 void replace_expr(const ExprID& old_expr_id, const std::shared_ptr<ExprBase>& new_expr)
207 {
208 return OperationExprBase<SetExpr>::replace_expr(old_expr_id, new_expr);
209 }
210
211 virtual bool belongs_to_args_list(const FunctionArgsList& args) const
212 {
213 return std::get<0>(this->_x)->belongs_to_args_list(args);
214 }
215
216 std::shared_ptr<CtcBase<IntervalVector>> create_ctc(const FunctionArgsList& args, const std::vector<std::shared_ptr<CtcBase<IntervalVector>>>& values) const
217 {
218 return ActionSetOp::create_ctc(_a, std::get<0>(this->_x)->create_ctc(args,values));
219 }
220
221 std::shared_ptr<SepBase> create_sep(const FunctionArgsList& args, const std::vector<std::shared_ptr<SepBase>>& values) const
222 {
223 return ActionSetOp::create_sep(_a, std::get<0>(this->_x)->create_sep(args,values));
224 }
225
226 protected:
227
228 const OctaSym _a;
229 };
230}