21 class SlicedTube :
public SlicedTubeBase
25 explicit SlicedTube(
const std::shared_ptr<TDomain>& tdomain,
27 : SlicedTubeBase(tdomain)
29 for(
auto it = _tdomain->begin(); it != _tdomain->end(); ++it)
32 std::make_shared<Slice<T>>(*this, it, codomain)
36 explicit SlicedTube(
const std::shared_ptr<TDomain>& tdomain,
37 const AnalyticFunction<
typename ExprType<T>::Type>& f)
38 : SlicedTubeBase(tdomain)
40 assert_release(f.args().size() == 1
41 &&
"function's inputs must be limited to one system variable");
43 for(
auto it = _tdomain->begin(); it != _tdomain->end(); ++it)
46 std::make_shared<Slice<T>>(*
this, it, f.eval((Interval)*it))
51 requires std::is_same_v<typename Wrapper<V>::Domain,T>
52 explicit SlicedTube(
const std::shared_ptr<TDomain>& tdomain,
53 const SampledTraj<V>& f)
54 : SlicedTubeBase(tdomain)
56 for(
auto it = _tdomain->begin(); it != _tdomain->end(); ++it)
59 std::make_shared<Slice<T>>(*this, it, f((Interval)*it))
63 SlicedTube(
const SlicedTube<T>& x)
64 : SlicedTubeBase(x.tdomain())
66 for(
auto it = _tdomain->begin(); it != _tdomain->end(); ++it)
69 std::make_shared<Slice<T>>(*x(it), *this)
73 inline SlicedTube& operator=(
const SlicedTube& x)
75 assert_release(_tdomain == x._tdomain);
77 for(
auto it = _tdomain->begin(); it != _tdomain->end(); ++it)
78 (*this)(it)->set(x(it)->codomain(),
false);
83 inline Index size()
const
85 return first_slice()->size();
88 inline double volume()
const
91 for(
const auto& s : *
this)
97 inline std::shared_ptr<Slice<T>> first_slice()
99 return std::const_pointer_cast<Slice<T>>(
100 static_cast<const SlicedTube&
>(*this).first_slice());
103 inline std::shared_ptr<const Slice<T>> first_slice()
const
105 return std::static_pointer_cast<const Slice<T>>(
106 this->SlicedTubeBase::first_slice());
109 inline std::shared_ptr<Slice<T>> last_slice()
111 return std::const_pointer_cast<Slice<T>>(
112 static_cast<const SlicedTube&
>(*this).last_slice());
115 inline std::shared_ptr<const Slice<T>> last_slice()
const
117 return std::static_pointer_cast<const Slice<T>>(
118 this->SlicedTubeBase::last_slice());
121 inline bool is_empty()
const
125 for(
const auto& s : *
this)
126 if(s.is_gate() && s.is_empty())
128 for(
const auto& s : *
this)
129 if(!s.is_gate() && s.is_empty())
134 inline bool is_unbounded()
const
136 for(
const auto& s : *
this)
142 inline T codomain()
const
144 T x = first_slice()->codomain();
145 for(
const auto& s : *
this)
150 inline std::shared_ptr<Slice<T>> operator()(
const std::list<TSlice>::iterator& it)
152 return std::const_pointer_cast<Slice<T>>(
153 static_cast<const SlicedTube&
>(*this).operator()(it));
156 inline std::shared_ptr<const Slice<T>> operator()(
const std::list<TSlice>::const_iterator& it)
const
158 return std::static_pointer_cast<const Slice<T>>(
159 it->slices().at(
this));
162 inline std::shared_ptr<Slice<T>> operator()(
const std::list<TSlice>::reverse_iterator& it)
164 return std::const_pointer_cast<Slice<T>>(
165 static_cast<const SlicedTube&
>(*this).operator()(it));
168 inline std::shared_ptr<const Slice<T>> operator()(
const std::list<TSlice>::const_reverse_iterator& it)
const
170 return std::static_pointer_cast<const Slice<T>>(
171 it->slices().at(
this));
174 inline T operator()(
double t)
const
177 return all_reals_codomain();
179 auto it_t = _tdomain->tslice(t);
180 assert(it_t != _tdomain->end());
181 T x = (*this)(it_t)->codomain();
182 if(!it_t->is_gate() && t==it_t->lb() && it_t!=_tdomain->begin())
183 x &= (*this)(--it_t)->codomain();
187 inline T operator()(
const Interval& t)
const
190 return all_reals_codomain();
192 if(t.is_degenerated())
193 return (*
this)(t.lb());
195 auto t_ = t & _tdomain->t0_tf();
197 auto it = _tdomain->tslice(t_.lb());
198 T codomain = (*this)(it)->codomain();
200 while(it != std::next(_tdomain->tslice(t_.ub())))
202 if(it->lb() == t_.ub())
break;
203 codomain |= (*this)(it)->codomain();
210 std::pair<T,T> enclosed_bounds(
const Interval& t)
const
212 auto x = this->empty_codomain();
213 auto bounds = std::make_pair(x,x);
215 if(t.lb() < _tdomain->t0_tf().lb() || t.ub() > _tdomain->t0_tf().ub())
217 x.init(Interval(-oo,0));
219 x.init(Interval(0,oo));
223 Interval t_inter = t & _tdomain->t0_tf();
224 auto si = (*this)(_tdomain->tslice(t_inter.lb()));
226 while(si && si->t0_tf().lb() <= t_inter.ub())
228 auto slice_bounds = si->enclosed_bounds(t_inter & si->t0_tf());
229 bounds.first |= slice_bounds.first;
230 bounds.second |= slice_bounds.second;
231 si = si->next_slice();
237 inline void set(
const T& codomain)
239 assert_release(codomain.size() == this->size());
243 s.set(codomain,
false);
247 s.set(codomain,
false);
250 inline void set(
const T& codomain,
double t)
252 assert_release(codomain.size() == this->size());
253 (*this)(_tdomain->sample(t,
true))->set(codomain);
256 inline void set(
const T& codomain,
const Interval& t)
258 auto it_lb = _tdomain->sample(t.lb(), t.is_degenerated());
259 std::list<TSlice>::iterator it_ub;
261 if(!t.is_degenerated())
263 it_ub = _tdomain->sample(t.ub(),
false);
265 if(it_ub->lb() == t.ub())
268 if(it_lb->ub() == t.lb())
277 (*this)(it_lb)->set(codomain);
278 }
while(it_lb != it_ub && (++it_lb) != _tdomain->end());
281 inline void set_ith_slice(
const T& codomain, Index i)
284 for(
auto& si : *
this)
292 const SlicedTube<T>& inflate(
double rad)
294 assert_release(
rad >= 0.);
298 s.set(T(s.codomain()).inflate(
rad),
false);
302 s.set(T(s.codomain()).inflate(
rad),
false);
307 SlicedTube<Interval> operator[](Index i)
const
309 assert_release(i >= 0 && i < size());
310 SlicedTube<Interval> xi(tdomain(), Interval());
311 for(
auto it = tdomain()->begin() ; it != tdomain()->end() ; it++)
312 xi(it)->codomain() = (*this)(it)->codomain()[i];
316 SlicedTube<IntervalVector> subvector(Index i, Index j)
const
318 assert_release(i >= 0 && i <= j && j < size());
320 for(
auto it = tdomain()->begin() ; it != tdomain()->end() ; it++)
321 xij(it)->codomain() = (*this)(it)->codomain().subvector(i,j);
325 inline bool operator==(
const SlicedTube& x)
const
327 if(!TDomain::are_same(tdomain(), x.tdomain()))
330 auto it_this = _tdomain->begin();
331 auto it_x = x.tdomain()->cbegin();
333 while(it_this != _tdomain->end())
334 if(*(*
this)(it_this++) != *x(it_x++))
340 inline SlicedTube operator&=(
const SlicedTube& x)
342 assert(TDomain::are_same(tdomain(), x.tdomain()));
343 auto it_this = _tdomain->begin();
344 auto it_x = x.tdomain()->cbegin();
346 while(it_this != _tdomain->end())
348 auto s = (*this)(it_this);
349 s->set(s->codomain() & x(it_x)->codomain());
353 assert(it_x == x.tdomain()->cend());
357 friend inline std::ostream& operator<<(std::ostream& os,
const SlicedTube<T>& x)
360 <<
"↦" << x.codomain()
361 <<
", " << x.nb_slices()
362 <<
" slice" << (x.nb_slices() > 1 ?
"s" :
"")
369 T integral(
const Interval& t)
const;
370 T integral(
const Interval& t1,
const Interval& t2)
const;
371 std::pair<T,T> partial_integral(
const Interval& t)
const;
372 std::pair<T,T> partial_integral(
const Interval& t1,
const Interval& t2)
const;
374 inline SlicedTube<T> primitive()
const
376 auto x = all_reals_codomain();
377 auto p = SlicedTube<T>(this->tdomain(), x);
379 p.set(x, this->tdomain()->t0_tf().
lb());
388 using base_container = std::list<TSlice>;
390 struct iterator :
public base_container::iterator
394 iterator(SlicedTube& x, base_container::iterator it)
395 : base_container::iterator(it), _x(x) { }
397 std::shared_ptr<Slice<T>> operator->()
402 Slice<T>& operator*()
404 return *operator->();
412 iterator begin() {
return { *
this, _tdomain->begin() }; }
413 iterator end() {
return { *
this, _tdomain->end() }; }
415 struct reverse_iterator :
public base_container::reverse_iterator
419 reverse_iterator(SlicedTube& x, base_container::reverse_iterator it)
420 : base_container::reverse_iterator(it), _x(x) { }
422 std::shared_ptr<Slice<T>> operator->()
427 Slice<T>& operator*()
429 return *operator->();
437 reverse_iterator rbegin() {
return { *
this, _tdomain->rbegin() }; }
438 reverse_iterator rend() {
return { *
this, _tdomain->rend() }; }
440 struct const_iterator :
public base_container::const_iterator
444 const_iterator(
const SlicedTube& x, base_container::const_iterator it)
445 : base_container::const_iterator(it), _x(x) { }
447 std::shared_ptr<const Slice<T>> operator->()
452 const Slice<T>& operator*()
454 return *operator->();
459 const SlicedTube& _x;
462 const_iterator begin()
const {
return { *
this, _tdomain->cbegin() }; }
463 const_iterator end()
const {
return { *
this, _tdomain->cend() }; }
465 struct const_reverse_iterator :
public base_container::const_reverse_iterator
469 const_reverse_iterator(
const SlicedTube& x, base_container::const_reverse_iterator it)
470 : base_container::const_reverse_iterator(it), _x(x) { }
472 std::shared_ptr<const Slice<T>> operator->()
477 const Slice<T>& operator*()
479 return *operator->();
484 const SlicedTube& _x;
487 const_reverse_iterator rbegin()
const {
return { *
this, _tdomain->crbegin() }; }
488 const_reverse_iterator rend()
const {
return { *
this, _tdomain->crend() }; }
492 inline T all_reals_codomain()
const
494 T x = first_slice()->codomain();
499 inline T empty_codomain()
const
501 T x = first_slice()->codomain();
511 SlicedTube(
const std::shared_ptr<TDomain>& tdomain,
const AnalyticFunction<T>& f) ->
512 SlicedTube<typename Wrapper<T>::Domain>;
515 SlicedTube(
const std::shared_ptr<TDomain>& tdomain,
const SampledTraj<T>& f) ->
516 SlicedTube<typename Wrapper<T>::Domain>;
Eigen::Matrix< Interval,-1, 1 > IntervalVector
Alias for a dynamic-size column vector of intervals.
Definition codac2_IntervalVector.h:25
auto lb() const
Returns a matrix containing the lower bounds of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:91
bool is_superset(const Matrix< codac2::Interval, RowsAtCompileTime, ColsAtCompileTime > &x) const
Checks whether this matrix is a superset of another interval matrix.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:648
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:198
auto rad() const
Returns a matrix containing the radii of each interval element.
Definition codac2_MatrixBase_addons_IntervalMatrixBase.h:171