22#define EPSILON_CONTAINS codac2::next_float(0.) * 1000.
26 class AbstractSlicedTube;
30 class Slice :
public AbstractSlice
34 explicit Slice(
size_t n,
const AbstractSlicedTube& tube_vector,
const std::list<TSlice>::iterator& it_tslice) :
35 Slice(T(n), tube_vector, it_tslice)
40 explicit Slice(
const T& codomain,
const AbstractSlicedTube& tube_vector,
const std::list<TSlice>::iterator& it_tslice) :
41 AbstractSlice(tube_vector,it_tslice), _codomain(codomain)
46 Slice(
const Slice& s) :
47 Slice(s, s._tubevector)
52 Slice(
const Slice& s,
const AbstractSlicedTube& tubevector) :
53 AbstractSlice(tubevector, s._it_tslice), _codomain(s._codomain)
65 Slice& operator=(
const Slice&) =
delete;
66 Slice(Slice&&) =
delete;
67 Slice& operator=(Slice&&) =
delete;
69 const AbstractSlicedTube& tube_vector()
const
74 virtual std::shared_ptr<AbstractSlice> duplicate()
const
76 return std::make_shared<Slice>(*
this);
79 virtual size_t size()
const
82 if constexpr(std::is_same<T,Interval>::value)
85 return codomain().size();
90 if constexpr(std::is_same<T,Interval>::value)
91 return codomain().diam();
93 return codomain().volume();
101 bool is_empty()
const
104 return _codomain.is_empty();
106 return input_gate().is_empty() || output_gate().is_empty();
109 bool is_unbounded()
const
111 return codomain().is_unbounded();
186 const std::shared_ptr<Slice<T>> prev_slice_ptr()
const
188 return std::static_pointer_cast<Slice<T>>(prev_abstract_slice_ptr());
191 std::shared_ptr<Slice<T>> prev_slice_ptr()
193 return std::const_pointer_cast<Slice<T>>(
194 static_cast<const Slice&
>(*this).prev_slice_ptr());
197 const std::shared_ptr<Slice<T>> next_slice_ptr()
const
199 return std::static_pointer_cast<Slice<T>>(next_abstract_slice_ptr());
202 std::shared_ptr<Slice<T>> next_slice_ptr()
204 return std::const_pointer_cast<Slice<T>>(
205 static_cast<const Slice&
>(*this).next_slice_ptr());
208 const T& codomain()
const
215 if(!prev_slice_ptr())
220 if(prev_slice_ptr()->is_gate())
221 return prev_slice_ptr()->codomain();
223 return codomain() & prev_slice_ptr()->codomain();
227 T output_gate()
const
229 if(!next_slice_ptr())
234 if(next_slice_ptr()->is_gate())
235 return next_slice_ptr()->codomain();
237 return codomain() & next_slice_ptr()->codomain();
241 void set(
const T& x,
bool propagate =
true)
243 if constexpr(!std::is_same<T,Interval>::value) {
244 assert((
size_t)codomain().size() == size());
251 if constexpr(!std::is_same<T,Interval>::value) {
252 assert((
size_t)prev_slice_ptr()->codomain().size() == size());
255 _codomain &= prev_slice_ptr()->codomain();
256 else if(prev_slice_ptr()->is_gate())
257 prev_slice_ptr()->_codomain &= _codomain;
262 if constexpr(!std::is_same<T,Interval>::value) {
263 assert((
size_t)next_slice_ptr()->codomain().size() == size());
266 _codomain &= next_slice_ptr()->codomain();
267 else if(next_slice_ptr()->is_gate())
268 next_slice_ptr()->_codomain &= _codomain;
298 if constexpr(std::is_same_v<T,codac2::IntervalVector>)
299 _codomain = T(size());
309 void set_component(
size_t i,
const Interval& xi)
311 assert((
size_t)codomain().size() == size());
316 _codomain[i] &= prev_slice_ptr()->codomain()[i];
318 _codomain[i] &= next_slice_ptr()->codomain()[i];
322 const Slice<T>& inflate(
double rad)
324 assert(rad >= 0. &&
"cannot inflate negative value");
325 _codomain.inflate(rad);
329 bool operator==(
const Slice& x)
const
331 return _codomain == x._codomain;
334 bool operator!=(
const Slice& x)
const
336 return _codomain != x._codomain;
339 friend std::ostream& operator<<(std::ostream& os,
const Slice& x)
342 <<
"↦" << x.codomain()
bool is_degenerated() const
Tests if this is degenerated, that is, in the form of .
Definition codac2_Interval_impl.h:207