24 template<
typename P,
typename... X>
25 requires (std::is_same_v<X,IntervalVector> && ...)
26 class Paving :
public Domain
30 using Node_ = std::shared_ptr<const PavingNode<P>>;
31 using NodeTuple_ = std::tuple<X...>;
32 using NodeValue_ = std::function<std::list<IntervalVector>(Node_)>;
33 using ConnectedSubset_ = Subpaving<P>;
42 inline Index size()
const
44 return std::get<0>(_tree->boxes()).size();
47 inline std::shared_ptr<const PavingNode<P>> tree()
const
52 inline std::shared_ptr<PavingNode<P>> tree()
54 return std::const_pointer_cast<PavingNode<P>>(
const_cast<const Paving<P,X...
>*>(
this)->tree());
57 inline std::list<IntervalVector> boxes(
const NodeValue_& node_value)
const
62 inline std::list<IntervalVector> boxes(
const NodeValue_& node_value,
const IntervalVector& intersecting_box)
const
64 std::list<IntervalVector> l;
66 this->tree()->visit([&]
69 for(
const auto& bi : node_value(n))
70 if(bi.intersects(intersecting_box))
72 return n->hull().intersects(intersecting_box);
76 l.push_back(IntervalVector::empty(this->size()));
80 inline std::list<ConnectedSubset_> connected_subsets(
const NodeValue_& node_value)
const
85 inline std::list<ConnectedSubset_> connected_subsets(
const IntervalVector& x0,
const NodeValue_& node_value)
const
87 std::list<IntervalVector> l_boxes = boxes(node_value, x0);
88 [[maybe_unused]] Index nb_boxes = l_boxes.size();
89 std::list<ConnectedSubset_> l_subsets;
91 while(!l_boxes.empty())
93 auto current_box = l_boxes.front();
94 l_subsets.push_back({ current_box });
97 std::list<IntervalVector> l_neighbouring_boxes_to_visit { current_box };
101 current_box = l_neighbouring_boxes_to_visit.front();
102 l_neighbouring_boxes_to_visit.pop_front();
104 for(
const auto& ni : boxes(node_value, current_box))
106 if(std::find(l_boxes.begin(), l_boxes.end(), ni) != l_boxes.end())
109 l_neighbouring_boxes_to_visit.push_back(ni);
110 l_subsets.back().push_back(ni);
114 }
while(!l_neighbouring_boxes_to_visit.empty());
117 assert(l_boxes.empty() &&
"all the nodes should have been visited");
118 assert([&]() ->
bool { Index s = 0;
for(
const auto& si : l_subsets) s += si.size();
return s == nb_boxes; } ()
119 &&
"the total number of boxes should match the sum of number of boxes of each subset");
126 friend class PavingNode<P>;
130 _tree = std::make_shared<PavingNode<P>>(*
static_cast<P*
>(
this), x);
135 return std::make_tuple(((X)x)...);
138 std::shared_ptr<PavingNode<P>> _tree;
143 using PavingOut_Node = PavingNode<PavingOut>;
145 class PavingOut :
public Paving<PavingOut,IntervalVector>
152 std::list<PavingOut::ConnectedSubset_> connected_subsets(
const PavingOut::NodeValue_& node_value = PavingOut::outer)
const;
153 std::list<PavingOut::ConnectedSubset_> connected_subsets(
const IntervalVector& x0,
const PavingOut::NodeValue_& node_value = PavingOut::outer)
const;
157 assert_release(x.size() == this->size());
165 auto d = x.diff(this->tree()->hull());
166 for(
const auto& di : d)
169 this->tree()->visit([&]
172 for(
const auto& bi : PavingOut::outer(n))
174 return n->hull().intersects(x);
176 assert(x_.is_subset(x));
180 static const NodeValue_ outer, outer_complem;
187 using PavingInOut_Node = PavingNode<PavingInOut>;
189 class PavingInOut :
public Paving<PavingInOut,IntervalVector,IntervalVector>
193 PavingInOut(Index n);
196 std::list<PavingInOut::ConnectedSubset_> connected_subsets(
const PavingInOut::NodeValue_& node_value = PavingInOut::outer)
const;
197 std::list<PavingInOut::ConnectedSubset_> connected_subsets(
const IntervalVector& x0,
const PavingInOut::NodeValue_& node_value = PavingInOut::outer)
const;
199 static const NodeValue_ outer, outer_complem, inner, bound, all;
Definition codac2_OctaSym.h:21
Eigen::Matrix< Interval,-1, 1 > IntervalVector
Alias for a dynamic-size column vector of intervals.
Definition codac2_IntervalVector.h:25
CtcInterType< typenameC1::ContractedTypes >::Ctc operator&(const C1 &c1, const C2 &c2)
Builds an intersection contractor from two contractors.
Definition codac2_CtcInter.h:230