21 class Slice :
public SliceBase,
28 explicit Slice(
const SlicedTubeBase& tube,
const std::list<TSlice>::iterator& it_tslice,
const T& codomain)
29 : SliceBase(tube, it_tslice), T(codomain)
32 Slice(
const Slice& s,
const SlicedTubeBase& tube)
33 : SliceBase(tube, s._it_tslice), T(s.codomain())
38 Slice(
const Slice& s) =
delete;
39 Slice& operator=(
const Slice&) =
delete;
40 Slice(Slice&&) =
delete;
41 Slice& operator=(Slice&&) =
delete;
43 inline const SlicedTube<T>& tube()
const
45 return static_cast<const SlicedTube<T>&
>(_tube);
48 inline virtual std::shared_ptr<SliceBase> copy()
const
50 return std::make_shared<Slice>(*
this, this->_tube);
53 inline Index size()
const
55 return this->T::size();
63 inline const T& codomain()
const
65 return (
const T&)(*this);
68 inline bool is_gate()
const
70 return t0_tf().is_degenerated();
73 inline std::shared_ptr<const Slice<T>> prev_slice()
const
75 return std::static_pointer_cast<const Slice<T>>(
76 this->SliceBase::prev_slice());
79 inline std::shared_ptr<Slice<T>> prev_slice()
81 return std::const_pointer_cast<Slice<T>>(
82 static_cast<const Slice<T>&
>(*this).prev_slice());
85 inline std::shared_ptr<const Slice<T>> next_slice()
const
87 return std::static_pointer_cast<const Slice<T>>(
88 this->SliceBase::next_slice());
91 inline std::shared_ptr<Slice<T>> next_slice()
93 return std::const_pointer_cast<Slice<T>>(
94 static_cast<const Slice<T>&
>(*this).next_slice());
97 inline T input_gate()
const
104 if(prev_slice()->is_gate())
105 return prev_slice()->codomain();
107 return codomain() & prev_slice()->codomain();
111 inline T output_gate()
const
118 if(next_slice()->is_gate())
119 return next_slice()->codomain();
121 return codomain() & next_slice()->codomain();
125 inline std::pair<T,T> enclosed_bounds(
const Interval& t)
const
127 T x = *
this; x.set_empty();
128 auto bounds = std::make_pair(x,x);
130 if(t.lb() < t0_tf().
lb() || t.ub() > t0_tf().
ub())
132 x.init(Interval(-oo,0));
134 x.init(Interval(0,oo));
138 if(t.contains(t0_tf().
lb()))
140 bounds.first |= input_gate().lb();
141 bounds.second |= input_gate().ub();
144 if(t.contains(t0_tf().
ub()))
146 bounds.first |= output_gate().lb();
147 bounds.second |= output_gate().ub();
150 if(t.is_subset(t0_tf()) && t != t0_tf().
lb() && t != t0_tf().
ub())
152 bounds.first |= this->
lb();
153 bounds.second |= this->
ub();
159 inline void set(
const T& x,
bool propagate =
true)
161 assert_release(x.size() == this->size());
164 update_adjacent_codomains();
173 inline void set_empty()
178 inline bool operator==(
const Slice& x)
const
180 return codomain() == x.codomain();
183 inline ConvexPolygon polygon_slice(
const Slice<T>& v)
const
184 requires std::is_same_v<T,Interval>
186 const Interval& t = this->t0_tf();
187 Interval input = this->input_gate(), output = this->output_gate();
191 Interval d = Interval(t.ub())-Interval(t.lb());
193 Interval proj_output = input + d * v;
194 Interval proj_input = output - d * v;
196 return CtcDeriv::polygon_slice(
203 inline ConvexPolygon polygon_slice_i(
const Slice<T>& v, Index i)
const
204 requires std::is_same_v<T,IntervalVector>
206 const Interval& t = this->t0_tf();
210 Interval d = Interval(t.ub())-Interval(t.lb());
212 Interval input = this->input_gate()[i], output = this->output_gate()[i];
213 Interval proj_output = input + d * v[i];
214 Interval proj_input = output - d * v[i];
216 return CtcDeriv::polygon_slice(
229 inline T operator()(
double t)
const
231 if(t == t0_tf().
lb())
234 else if(t == t0_tf().
ub())
235 return output_gate();
241 return all_reals_value();
250 inline T operator()(
const Interval& t)
const
252 if(t.is_degenerated())
253 return operator()(t.lb());
255 else if(t.is_subset(t0_tf()))
259 return all_reals_value();
270 inline T operator()(
double t,
const Slice<T>& v)
const
271 requires (std::is_same_v<T,Interval> || std::is_same_v<T,IntervalVector>)
273 return operator()(Interval(t),v);
284 inline T operator()(
const Interval& t,
const Slice<T>& v)
const
285 requires (std::is_same_v<T,Interval> || std::is_same_v<T,IntervalVector>)
287 if constexpr(std::is_same_v<T,Interval>)
288 return untrunc((polygon_slice(v) & ConvexPolygon(cart_prod(t,trunc(codomain())))).box()[1]);
290 else if constexpr(std::is_same_v<T,IntervalVector>)
292 T y = all_reals_value();
294 for(Index i = 0 ; i < size() ; i++)
295 y[i] &= untrunc((polygon_slice_i(v,i) & ConvexPolygon(cart_prod(t,trunc(codom[i])))).box()[1]);
307 inline Interval invert(
const T& y,
const Interval& t = Interval())
const
312 else if(t.is_strict_superset(t0_tf()))
315 else if((t0_tf() & t) == t0_tf() && codomain().
is_subset(y))
318 else if(t == t0_tf().
lb())
320 if(y.intersects(input_gate()))
326 else if(t == t0_tf().
ub())
328 if(y.intersects(output_gate()))
336 if(y.intersects(codomain()))
353 inline Interval invert(
const T& y,
const Slice<T>& v,
const Interval& t = Interval()) const
354 requires (std::is_same_v<T,Interval> || std::is_same_v<T,
IntervalVector>)
356 if(t.is_empty() || y.is_empty())
359 else if(!t.is_subset(t0_tf()))
364 if constexpr(std::is_same_v<T,Interval>)
365 return untrunc((polygon_slice(v) & ConvexPolygon(cart_prod(t,trunc(y)))).box()[0]);
367 else if constexpr(std::is_same_v<T,IntervalVector>)
370 for(Index i = 0 ; i < size() ; i++)
372 t_ &= untrunc((polygon_slice_i(v,i) & ConvexPolygon(cart_prod(t_,trunc(y[i])))).box()[0]);
378 friend inline std::ostream& operator<<(std::ostream& os,
const Slice& x)
381 <<
"↦" << x.codomain()
386 inline T all_reals_value()
const
393 inline T empty_value()
const
403 template<
typename T_>
404 friend class SlicedTube;
408 this->T::set_empty();
410 update_adjacent_codomains();
413 inline void update_adjacent_codomains()
417 assert(prev_slice()->size() == this->size());
419 codomain() &= prev_slice()->codomain();
420 else if(prev_slice()->is_gate())
421 prev_slice()->codomain() &= codomain();
426 assert(next_slice()->size() == this->size());
428 codomain() &= next_slice()->codomain();
429 else if(next_slice()->is_gate())
430 next_slice()->codomain() &= codomain();
static Interval empty()
Provides an empty interval.
Definition codac2_Interval_impl.h:568
void set_empty()
Marks the interval matrix as empty.
Definition codac2_Matrix_addons_IntervalMatrixBase.h:141
auto lb() const
Returns a matrix containing the lower bounds of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:91
bool is_subset(const Matrix< codac2::Interval, RowsAtCompileTime, ColsAtCompileTime > &x) const
Checks whether this matrix is a subset of another interval matrix.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:652
auto ub() const
Returns a matrix containing the upper bounds of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:103
bool contains(const Matrix< double, RowsAtCompileTime, ColsAtCompileTime > &x) const
Checks if this interval matrix contains the specified matrix x.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:382
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