Get track candidates from a list of space points.
88{
89 int64_t numSpacepoints = (int64_t)spacepoints.size();
90 std::vector<float> eNodeFeatures;
91 std::vector<float> fNodeFeatures;
92 std::vector<float> gNodeFeatures;
93 std::vector<uint32_t> spacepointIDs;
95
96 int sp_idx = 0;
97 for(
const auto&
sp: spacepoints){
99 regions.push_back(featureMap[
"region"]);
100
102 eNodeFeatures.push_back(
104 }
105
106
108 fNodeFeatures.push_back(
110 }
111
112
114 gNodeFeatures.push_back(
116 }
117
118 spacepointIDs.push_back(sp_idx++);
119 }
120
121
122
124 std::vector<Ort::Value> eInputTensor;
126
127 std::vector<Ort::Value> eOutputTensor;
128 std::vector<float> eOutputData;
130
132
133
134
135
136 std::vector<int64_t> senders;
137 std::vector<int64_t> receivers;
139 int64_t numEdges = senders.size();
140
141
142 eNodeFeatures.clear();
143 eInputTensor.clear();
144 eOutputData.clear();
145 eOutputTensor.clear();
146
147
148 std::vector<std::pair<int64_t, int64_t>> edgePairs;
149 for(int64_t idx = 0;
idx < numEdges;
idx ++ ) {
150 edgePairs.push_back({senders[
idx], receivers[
idx]});
151 }
152 std::sort(edgePairs.begin(), edgePairs.end());
153 edgePairs.erase(
std::unique(edgePairs.begin(), edgePairs.end()), edgePairs.end());
154
155
156 std::random_device rd;
157 std::mt19937 rdm_gen(rd());
158 std::random_shuffle(edgePairs.begin(), edgePairs.end());
159
160
161 std::sort(edgePairs.begin(), edgePairs.end(),
162 [numSpacepoints](
const std::pair<int64_t, int64_t>&
a,
const std::pair<int64_t, int64_t>& b){
163 return a.first * numSpacepoints + a.second < b.first * numSpacepoints + b.second;
164 });
165
166
167 senders.clear();
168 receivers.clear();
169 for(const auto& edge: edgePairs){
170 senders.push_back(edge.first);
171 receivers.push_back(edge.second);
172 }
173
174 edgePairs.clear();
175
176
177
178
179 std::vector<Ort::Value> fInputTensor;
181
182 std::vector<int64_t> edgeList(numEdges * 2);
183 std::copy(senders.begin(), senders.end(), edgeList.begin());
184 std::copy(receivers.begin(), receivers.end(), edgeList.begin() + senders.size());
185
186
188
189 std::vector<float> fOutputData;
190 std::vector<Ort::Value> fOutputTensor;
192
194
195
196
197
198 std::vector<int64_t> rowIndices;
199 std::vector<int64_t> colIndices;
200 for (int64_t i = 0;
i < numEdges;
i++){
201 float v = 1.f / (1.f + std::exp(-fOutputData[i]));
203 auto src = edgeList[
i];
204 auto dst = edgeList[numEdges +
i];
205 if (src > dst) {
207 }
208 rowIndices.push_back(src);
209 colIndices.push_back(dst);
210 };
211 };
212 int64_t numEdgesAfterF = rowIndices.size();
213
214
215 fNodeFeatures.clear();
216 fInputTensor.clear();
217 fOutputData.clear();
218 fOutputTensor.clear();
219
220 senders.clear();
221 receivers.clear();
222
223 std::vector<int64_t> edgesAfterFiltering(numEdgesAfterF * 2);
224 std::copy(rowIndices.begin(), rowIndices.end(), edgesAfterFiltering.begin());
225 std::copy(colIndices.begin(), colIndices.end(), edgesAfterFiltering.begin() + senders.size());
226
227
228
229
230
231
232 for(
size_t idx = 0; idx < static_cast<size_t>(numSpacepoints);
idx++){
236 }
237 }
238 }
239
240 std::vector<Ort::Value> gInputTensor;
243
244
245 std::vector<float> gnnEdgeFeatures;
248
249
250 std::vector<float> gOutputData;
251 std::vector<Ort::Value> gOutputTensor;
253
255
256 for(auto& v : gOutputData){
257 v = 1.f / (1.f + std::exp(-v));
258 };
259
260
261 gNodeFeatures.clear();
262 gInputTensor.clear();
263 edgesAfterFiltering.clear();
264
265
266
267
268 tracks.clear();
270 numSpacepoints,
271 rowIndices, colIndices, gOutputData,
273 );
274
275 return StatusCode::SUCCESS;
276}
#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)