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>;
187 friend inline std::ostream& operator<<(std::ostream& os,
const Slice& x)
190 <<
"↦" << x.codomain()
197 template<
typename T_>
198 friend class SlicedTube;
202 this->T::set_empty();
204 update_adjacent_codomains();
207 inline void update_adjacent_codomains()
211 assert(prev_slice()->size() == this->size());
213 codomain() &= prev_slice()->codomain();
214 else if(prev_slice()->is_gate())
215 prev_slice()->codomain() &= codomain();
220 assert(next_slice()->size() == this->size());
222 codomain() &= next_slice()->codomain();
223 else if(next_slice()->is_gate())
224 next_slice()->codomain() &= codomain();
void set_empty()
Marks the interval matrix as empty.
Definition codac2_Matrix_addons_IntervalMatrixBase.h:299
auto lb() const
Returns a matrix containing the lower bounds of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:91
auto ub() const
Returns a matrix containing the upper bounds of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:103
Definition codac2_OctaSym.h:21