95 {
96
97 candidateIdsPerSegment.assign(graph.nNodes, {});
98
99 if (graph.nNodes == 0) return StatusCode::SUCCESS;
100
102
103
105 componentsAboveThreshold(graph, pairScore,
108
109
110
111
112
113
114
115
117 std::vector<NodeVec> recovery =
118 componentsAboveThreshold(graph, pairScore,
122 std::make_move_iterator(recovery.begin()),
123 std::make_move_iterator(recovery.end()));
124 }
125
126
127
128
129
130
134 std::iota(
all.begin(),
all.end(), 0);
136 }
137
138
139 std::set<NodeVec> seen;
141 for (NodeVec& nodes : candidates) {
143 nodes.erase(
std::unique(nodes.begin(), nodes.end()), nodes.end());
145 if (!seen.insert(nodes).second) continue;
146
147 for (std::size_t n : nodes) {
148 addUnique(candidateIdsPerSegment[n], next);
149 }
151 }
152
153 for (auto& ids : candidateIdsPerSegment) {
155 }
156
157 std::unordered_map<unsigned, unsigned> candSegCount;
158 candSegCount.reserve(next);
159 for (const auto& ids : candidateIdsPerSegment) {
160 for (
unsigned id : ids) ++candSegCount[
id];
161 }
162
163 std::size_t assignedNodes = 0;
164 std::size_t multiAssignedNodes = 0;
165 for (const auto& ids : candidateIdsPerSegment) {
166 assignedNodes += !
ids.empty();
167 multiAssignedNodes +=
ids.size() > 1;
168 }
169
171 << " candidate(s) from " << graph.nNodes
172 << " segment(s); assignedNodes=" << assignedNodes
173 << ", multiAssignedNodes=" << multiAssignedNodes
178 if (msgLvl(MSG::VERBOSE)) {
179 for (const auto& [id, nSegs] : candSegCount) {
180 ATH_MSG_VERBOSE(
" candidate " <<
id <<
": " << nSegs <<
" segment(s)");
181 }
182 }
183
184 return StatusCode::SUCCESS;
185}
#define ATH_MSG_VERBOSE(x)
FastGraph::NodeVec NodeVec
DataModel_detail::iterator< DVL > unique(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of unique for DataVector/List.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.