25 void contract(Interval& t, T& z, SlicedTube<T>& x,
const SlicedTube<T>& v)
const
26 requires std::is_same_v<T,Interval> || std::is_same_v<T,IntervalVector>
28 assert_release(TDomain::are_same(x.tdomain(), v.tdomain()));
29 assert_release(x.size() == v.size());
30 assert_release(z.size() == x.size());
32 if(t.is_empty() || z.is_empty() || x.is_empty() || v.is_empty())
36 x.set(x.empty_value());
40 t &= x.invert(z, v, t);
46 if(t.is_degenerated())
48 x.set(x(t.lb()) & z, t.lb());
54 auto it_t_beg = x.tdomain()->sample(t.lb(),
true);
56 auto it_t_end = std::next(x.tdomain()->sample(t.ub(),
true));
59 while(it_t != it_t_end)
63 T slices_union = x.empty_value();
66 auto it_t1 = x.tdomain()->sample(t.lb(),
true);
67 auto it_t1_end = it_t_end;
68 while(it_t1 != it_t1_end)
72 T y1 = x(it_t1->lb()) & z;
78 auto it_t1_t_end = it_t;
79 while(it_t1_t != it_t1_t_end)
81 if(!it_t1_t->is_gate())
85 Interval d = Interval(it_t1_t->ub())-Interval(it_t1_t->lb());
86 if(it_t1->lb() > it_t->lb())
88 y1 += d*v.slice(it_t1_t)->codomain();
91 if(it_t1->lb() < it_t->lb())
104 x.slice(it_t)->set(slices_union);
110 CtcDeriv ctc_deriv(TimePropag::FWD_BWD,
true);
111 ctc_deriv.restrict_tdomain(t);
112 ctc_deriv.contract(x,v);
115 if(t.is_empty() || z.is_empty() || x.is_empty())
119 x.set(x.empty_value());
Definition codac2_OctaSym.h:21