Get track candidates from a list of space points.
87{
88 int64_t numSpacepoints = (int64_t)spacepoints.size();
89 std::vector<float> eNodeFeatures;
90 std::vector<float> fNodeFeatures;
91 std::vector<float> gNodeFeatures;
92 std::vector<uint32_t> spacepointIDs;
94
95 int sp_idx = 0;
96 for(
const auto&
sp: spacepoints){
98 regions.push_back(featureMap[
"region"]);
99
101 eNodeFeatures.push_back(
103 }
104
105
107 fNodeFeatures.push_back(
109 }
110
111
113 gNodeFeatures.push_back(
115 }
116
117 spacepointIDs.push_back(sp_idx++);
118 }
119
120
121
123 std::vector<Ort::Value> eInputTensor;
125
126 std::vector<Ort::Value> eOutputTensor;
127 std::vector<float> eOutputData;
129
131
132
133
134
135 std::vector<int64_t> senders;
136 std::vector<int64_t> receivers;
138 int64_t numEdges = senders.size();
139
140
141 eNodeFeatures.clear();
142 eInputTensor.clear();
143 eOutputData.clear();
144 eOutputTensor.clear();
145
146
147 std::vector<std::pair<int64_t, int64_t>> edgePairs;
148 for(int64_t idx = 0;
idx < numEdges;
idx ++ ) {
149 edgePairs.push_back({senders[
idx], receivers[
idx]});
150 }
151 std::sort(edgePairs.begin(), edgePairs.end());
152 edgePairs.erase(
std::unique(edgePairs.begin(), edgePairs.end()), edgePairs.end());
153
154
155 std::random_device rd;
156 std::mt19937 rdm_gen(rd());
157 std::random_shuffle(edgePairs.begin(), edgePairs.end());
158
159
160 std::sort(edgePairs.begin(), edgePairs.end(),
161 [numSpacepoints](
const std::pair<int64_t, int64_t>&
a,
const std::pair<int64_t, int64_t>& b){
162 return a.first * numSpacepoints + a.second < b.first * numSpacepoints + b.second;
163 });
164
165
166 senders.clear();
167 receivers.clear();
168 for(const auto& edge: edgePairs){
169 senders.push_back(edge.first);
170 receivers.push_back(edge.second);
171 }
172
173 edgePairs.clear();
174
175
176
177
178 std::vector<Ort::Value> fInputTensor;
180
181 std::vector<int64_t> edgeList(numEdges * 2);
182 std::copy(senders.begin(), senders.end(), edgeList.begin());
183 std::copy(receivers.begin(), receivers.end(), edgeList.begin() + senders.size());
184
185
187
188 std::vector<float> fOutputData;
189 std::vector<Ort::Value> fOutputTensor;
191
193
194
195
196
197 std::vector<int64_t> rowIndices;
198 std::vector<int64_t> colIndices;
199 for (int64_t i = 0;
i < numEdges;
i++){
200 float v = 1.f / (1.f + std::exp(-fOutputData[i]));
202 auto src = edgeList[
i];
203 auto dst = edgeList[numEdges +
i];
204 if (src > dst) {
206 }
207 rowIndices.push_back(src);
208 colIndices.push_back(dst);
209 };
210 };
211 int64_t numEdgesAfterF = rowIndices.size();
212
213
214 fNodeFeatures.clear();
215 fInputTensor.clear();
216 fOutputData.clear();
217 fOutputTensor.clear();
218
219 senders.clear();
220 receivers.clear();
221
222 std::vector<int64_t> edgesAfterFiltering(numEdgesAfterF * 2);
223 std::copy(rowIndices.begin(), rowIndices.end(), edgesAfterFiltering.begin());
224 std::copy(colIndices.begin(), colIndices.end(), edgesAfterFiltering.begin() + senders.size());
225
226
227
228
229
230
231 for(
size_t idx = 0; idx < static_cast<size_t>(numSpacepoints);
idx++){
235 }
236 }
237 }
238
239 std::vector<Ort::Value> gInputTensor;
242
243
244 std::vector<float> gnnEdgeFeatures;
247
248
249 std::vector<float> gOutputData;
250 std::vector<Ort::Value> gOutputTensor;
252
254
255 for(auto& v : gOutputData){
256 v = 1.f / (1.f + std::exp(-v));
257 };
258
259
260 gNodeFeatures.clear();
261 gInputTensor.clear();
262 edgesAfterFiltering.clear();
263
264
265
266
267 tracks.clear();
269 numSpacepoints,
270 rowIndices, colIndices, gOutputData,
272 );
273
274 return StatusCode::SUCCESS;
275}
#define ATH_CHECK
Evaluate an expression and check for errors.
static const std::vector< std::string > regions
void CCandWalk(vertex_t numSpacepoints, const std::vector< int64_t > &rowIndices, const std::vector< int64_t > &colIndices, const std::vector< weight_t > &edgeWeights, std::vector< std::vector< uint32_t > > &tracks, float ccCut, float walkMin, float walkMax)
void calculateEdgeFeatures(const std::vector< float > &gNodeFeatures, int64_t numSpacepoints, const std::vector< int64_t > &rowIndices, const std::vector< int64_t > &colIndices, std::vector< float > &edgeFeatures)
void buildEdges(const std::vector< float > &embedFeatures, std::vector< int64_t > &senders, std::vector< int64_t > &receivers, int64_t numSpacepoints, int embeddingDim, float rVal, int kVal)
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.
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)