51 SepImage(
const AnalyticFunction<VectorType>& f,
const AnalyticFunction<VectorType>& psi_0,
const std::vector<OctaSym>& Sigma,
double epsilon,
const C& ctc_init,
double epsilon_pave = -1)
55 int dim = f.output_size();
56 auto v_par =
PEIBOS(f,psi_0,Sigma,epsilon);
59 ctc_init.contract(X0);
62 CtcUnion ctc_union (dim);
63 for (
const auto& par : v_par)
64 ctc_union |= CtcWrapper(par);
66 SepCtcPair sep_boundary(CtcIdentity(dim), ctc_union);
69 ctc_union.contract(Y0);
70 Y0.inflate(Y0.min_diam()/10.);
73 if (epsilon_pave == -1)
74 epsilon_pave = Y0.min_diam()/50.;
77 PavingInOut p = pave(Y0,sep_boundary,epsilon_pave);
80 auto v_cs = p.connected_subsets(PavingInOut::outer_complem);
81 std::list<std::shared_ptr<PavingInOut::ConnectedSubset_>> cs_to_color;
82 for (
const auto& cs: v_cs)
85 for (
const auto& box : cs.boxes())
86 if (box.volume()>max_box.volume())
89 CtcInverse ctc_inv (f, max_box.mid());
91 bool could_contract =
false;
93 ctc_inv.contract(X0_copy);
94 ctc_init.contract(X0_copy);
98 could_contract =
true;
99 if (!X0_copy.is_empty())
100 cs_to_color.push_back(std::make_shared<PavingInOut::ConnectedSubset_>(cs));
107 std::vector<IntervalVector> boxes;
108 split(X0_copy,0.125,boxes);
109 for (
auto box: boxes)
112 ctc_inv.contract(box);
113 ctc_init.contract(box);
116 could_contract =
true;
119 cs_to_color.push_back(std::make_shared<PavingInOut::ConnectedSubset_>(cs));
127 printf(
"warning, the SepImage was not able to conclude on the inner regions\n");
133 auto visitor = [&](std::shared_ptr<PavingNode<PavingInOut>> n)
135 std::list<IntervalVector> boxes_to_color;
136 for (
const auto& cs : cs_to_color)
137 for (
const auto& box : cs->boxes())
138 boxes_to_color.push_back(box);
143 for (
const auto& bi : boxes_to_color)
148 if (std::get<0>(n->boxes()).is_empty())
150 n->set_boxes(std::make_tuple(std::get<1>(n->boxes()),std::get<0>(n->boxes())));
154 std::list<IntervalVector> lbi;
156 for (
const auto& bj : boxes_to_color)
167 while (h != prev_x_in)
171 for (
const auto& li : lbi)
173 std::list<IntervalVector> d = h.diff(li);
179 for (
const auto& di : d)
187 n->set_boxes(std::make_tuple(hull(lbi)|u, h));
195 p.tree()->visit(visitor);
198 SepWrapper<PavingInOut> sep_paving(p);
202 SepInter sep_inter = sep_paving&Y0;
204 _sep.push_back(sep_inter);
219 SepImage(
const AnalyticFunction<VectorType>& f,
const AnalyticFunction<VectorType>& psi_0,
const std::vector<OctaSym>& Sigma,
double epsilon,
const std::shared_ptr<C>& ctc_init,
double epsilon_pave = -1)
220 :
SepImage(f, psi_0, Sigma, epsilon, *ctc_init, epsilon_pave)