25 inline void contract(Slice<Interval>& x,
const Slice<Interval>& v)
const
27 assert_release(x.t0_tf() == v.t0_tf());
29 x.set(this->slice_hull({0,x.t0_tf().diam()},
30 x.codomain(),x.input_gate(),x.output_gate(),
35 auto x_next = x.next_slice();
36 if(x_next && x_next->is_gate())
40 (x.input_gate()+x.t0_tf().diam()*v.codomain()),
45 auto x_prev = x.prev_slice();
46 if(x_prev && x_prev->is_gate())
50 (x.output_gate()-x.t0_tf().diam()*v.codomain()),
56 inline void contract(Slice<IntervalVector>& x,
const Slice<IntervalVector>& v)
const
58 assert_release(x.size() == v.size());
59 assert_release(x.t0_tf() == v.t0_tf());
61 auto x_prev = x.prev_slice();
62 auto x_next = x.next_slice();
64 auto hull = x.codomain();
65 auto input_gate = x.input_gate();
66 auto output_gate = x.output_gate();
68 for(Index i = 0 ; i < x.size() ; i++)
70 hull[i] = this->slice_hull({0,x.t0_tf().diam()},
71 x.codomain()[i],x.input_gate()[i],x.output_gate()[i],
75 if(x_next && x_next->is_gate())
76 output_gate[i] &= input_gate[i]+x.t0_tf().diam()*v.codomain()[i];
78 if(x_prev && x_prev->is_gate())
79 input_gate[i] &= output_gate[i]-x.t0_tf().diam()*v.codomain()[i];
82 if(x_prev && x_prev->is_gate())
83 x_prev->set(input_gate,
false);
85 if(x_next && x_next->is_gate())
86 x_next->set(output_gate,
false);
93 inline void contract(SlicedTube<T>& x,
const SlicedTube<T>& v)
const
95 assert_release(x.tdomain()->all_gates_defined() &&
"not available without gates");
96 assert_release(x.tdomain() == v.tdomain());
98 auto xi = x.begin();
auto vi = v.begin();
101 assert(vi != v.end());
103 this->contract(*xi,*vi);
106 assert(vi == v.end());
108 auto rxi = x.rbegin();
auto rvi = v.rbegin();
109 while(rxi != x.rend())
111 assert(rvi != v.rend());
113 this->contract(*rxi,*rvi);
116 assert(rvi == v.rend());
121 Interval slice_hull(
const Interval& dt,
122 const Interval& x,
const Interval& input_x,
const Interval& output_x,
123 const Interval& v)
const
126 hull &= input_x + dt*v;
127 hull &= output_x - dt*v;