54 void apply(std::vector<ACellHolder*>
const& cellHolders,
56 std::vector<ACluster>& clusters)
override
59 assert(std::is_sorted(cellHolderRelations.begin(),
60 cellHolderRelations.end()));
66 for (ACellHolder* cellHolder : cellHolders) {
71 std::vector<ACellHolder*> cluster;
75 for (ACellHolder* cellHolder : cellHolders) {
82 cluster.push_back(cellHolder);
86 clusters.emplace_back(std::move(cluster));
94 std::vector<ACellHolder*>& cluster)
const
96 ACellHolder* seedCellHolder = cluster.front();
100 std::vector<ACellHolder*> checkNow;
101 std::vector<ACellHolder*> checkNext;
103 checkNow.reserve(10);
104 checkNext.reserve(10);
106 checkNext.push_back(seedCellHolder);
108 while (not checkNext.empty()) {
110 checkNow.swap(checkNext);
113 for (ACellHolder* cellHolder : checkNow) {
115 ConstVectorRange<WeightedRelation<ACellHolder> > neighborRelations(
116 std::equal_range(cellHolderRelations.begin(),
117 cellHolderRelations.end(),
121 size_t nNeighbors = neighborRelations.
size();
125 ACellHolder* neighborCellHolder = neighborRelation.getTo();
127 Weight neighborICluster =
getCellState(neighborCellHolder);
128 if (neighborICluster == -1) {
131 cluster.push_back(neighborCellHolder);
134 checkNext.push_back(neighborCellHolder);
138 if (neighborICluster != iCluster) {
139 B2WARNING(
"Clusterizer: Neighboring item was already assigned to different "
140 "cluster. Check if the neighborhood is symmetric.");