41 template<
typename T, std::
size_t dim>
44 for(
size_t i=0; i< nbCells; ++i) cells[i]=
nullptr;
47 template<
typename T, std::
size_t dim>
57 for(
size_t i=0; i<nbCells; ++i)
60 data.insert(
data.end(), o.data.begin(), o.data.end());
65 for(
size_t i=0; i<nbCells;++i)
69 cells[i]->parent =
this;
73 template<
typename T, std::
size_t dim>
75 parent{
nullptr}, bb{o.bb.center, o.bb.radius}, depth{o.depth}
84 std::make_move_iterator(o.data.begin()),
85 std::make_move_iterator(o.data.end()));
88 for(
size_t i=0; i<nbCells; ++i)
90 cells[i] = o.cells[i];
96 template<
typename T, std::
size_t dim>
101 for(
size_t i=0; i<nbCells; ++i)
105 template<
typename T, std::
size_t dim>
116 for(
size_t i=0; i<nbCells; ++i)
124 for(
size_t i=0; i<nbCells; ++i)
128 cells[i]->parent =
this;
134 template<
typename T, std::
size_t dim>
141 bb.center = o.bb.center;
142 bb.radius = o.bb.radius;
150 std::make_move_iterator(o.data.begin()),
151 std::make_move_iterator(o.data.end()));
155 for(
size_t i=0; i<nbCells; ++i)
157 cells[i] = o.cells[i];
165 template<
typename T, std::
size_t dim>
168 return (cells[0]==
nullptr);
170 template<
typename T, std::
size_t dim>
173 return (parent==
nullptr);
175 template<
typename T, std::
size_t dim>
178 return (
data.size() == 0);
180 template<
typename T, std::
size_t dim>
185 for(
size_t i=0; i<
dim; ++i)
186 id|= ((pt(i) > bb.center(i)) << i);
191 template<
typename T, std::
size_t dim>
194 return idx(pts.features.col(d).head(
dim));
196 template<
typename T, std::
size_t dim>
201 template<
typename T, std::
size_t dim>
206 template<
typename T, std::
size_t dim>
211 template<
typename T, std::
size_t dim>
216 template<
typename T, std::
size_t dim>
223 template<
typename T, std::
size_t dim>
230 template<
typename T, std::
size_t dim>
238 Vector minValues = pts.features.rowwise().minCoeff();
239 Vector maxValues = pts.features.rowwise().maxCoeff();
244 Point radii = max - min;
245 box.center = min + radii * 0.5;
247 box.radius = radii(0);
248 for(
size_t i=1; i<
dim; ++i)
249 if (
box.radius < radii(i))
box.radius = radii(i);
254 const size_t nbpts = pts.getNbPoints();
255 std::vector<Id> indexes;
256 indexes.reserve(nbpts);
258 for(
size_t i=0; i<nbpts; ++i)
259 indexes.emplace_back(
Id(i));
264 return this->build(pts, std::move(datas), std::move(
box), maxDataByNode, maxSizeByNode, parallelBuild);
268 template<
typename T, std::
size_t dim>
303 template<
typename T, std::
size_t dim>
305 size_t maxDataByNode,
T maxSizeByNode,
bool parallelBuild)
308 this->bb.center = bb.center;
309 this->bb.radius = bb.radius;
312 if((bb.radius*2.0 <= maxSizeByNode) or (datas.size() <= maxDataByNode))
316 std::make_move_iterator(datas.begin()), make_move_iterator(datas.end()));
321 const std::size_t nbData = datas.size();
324 for(
size_t i=0; i<nbCells; ++i)
325 sDatas[i].reserve(nbData);
327 for(
auto&& d : datas)
328 (sDatas[idx(pts, d)]).emplace_back(d);
330 for(
size_t i=0; i<nbCells; ++i)
331 sDatas[i].shrink_to_fit();
334 BoundingBox boxes[nbCells];
335 const T half_radius = this->bb.radius * 0.5;
336 for(
size_t i=0; i<nbCells; ++i)
339 boxes[i].radius = half_radius;
340 boxes[i].center = this->bb.center + offset;
345 std::vector<std::future<void>> futures;
347 for(
size_t i=0; i<nbCells; ++i)
349 auto compute = [maxDataByNode, maxSizeByNode, i, &pts, &sDatas, &boxes,
this](){
352 this->cells[i]->depth = this->depth+1;
354 this->cells[i]->parent =
this;
356 this->cells[i]->build(pts, std::move(sDatas[i]), std::move(boxes[i]), maxDataByNode, maxSizeByNode,
false);
360 futures.push_back( std::async( std::launch::async, compute ));
365 for(
auto& f : futures) f.get();
367 return (!isLeaf() and ret);
371 template<
typename T, std::
size_t dim>
372 template<
typename Callback>
377 if (!cb(*
this))
return false;
381 for (
size_t i=0; i<nbCells; ++i)
382 if (!cells[i]->visit(cb))
return false;