244 std::vector< size_t > toMergeS, toMergeE;
245 int idxMaxS = -1, idxMaxE = -1;
247 for (
size_t i = 0; i < group.size(); i++)
250 if (group[i].isEM())
continue;
252 if (group[i].isDenseStart())
256 std::vector< size_t > toMerge;
257 TVector2 start0(group[i].start()->Point2D());
258 for (
size_t j = 0; j < group.size(); j++)
260 if (group[j].isEM())
continue;
264 if ((group[j].
size() > 1) &&
265 (group[j].length2() < rad2)) ns++;
270 if (
pma::Dist2(start0, group[j].start()->Point2D()) < rad2)
272 ns++; toMerge.push_back(j); tagged =
true;
274 if ((group[j].
size() > 1) && (
pma::Dist2(start0, group[j].
end()->Point2D()) < rad2))
276 ns++;
if (!tagged) toMerge.push_back(j);
280 if (ns > maxS) { maxS =
ns; idxMaxS = i; toMergeS = toMerge; }
283 if ((group[i].
size() > 1) && group[i].isDenseEnd())
286 std::vector< size_t > toMerge;
287 TVector2 end0(group[i].
end()->Point2D());
288 for (
size_t j = 0; j < group.size(); j++)
290 if (group[j].isEM())
continue;
294 if ((group[j].
size() > 1) &&
295 (group[j].length2() < rad2)) ne++;
300 if (
pma::Dist2(end0, group[j].start()->Point2D()) < rad2)
302 ne++; toMerge.push_back(j); tagged =
true;
304 if ((group[j].
size() > 1) && (
pma::Dist2(end0, group[j].
end()->Point2D()) < rad2))
306 ne++;
if (!tagged) toMerge.push_back(j);
310 if (ne > maxE) { maxE = ne; idxMaxE = i; toMergeE = toMerge; }
315 std::vector< size_t > toMergeIdxs = toMergeS;
316 if (idxMaxE > idx) { idx = idxMaxE; toMergeIdxs = toMergeE; }
319 toMergeIdxs.push_back(idx);
322 if (idx > -1) group[idx].tagEM(
true);
end
while True: pbar.update(maxval-len(onlies[E][S])) #print iS, "/", len(onlies[E][S]) found = False for...
int mergeClusters(std::vector< tss::Cluster2D > &group, const std::vector< size_t > &idxs) const
double Dist2(const TVector2 &v1, const TVector2 &v2)
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.