@@ -170,12 +170,8 @@ struct Args {
170170
171171 // Sample orientations of the error model to use for the det priority
172172 {
173- config.det_orders .resize (num_det_orders);
174- std::mt19937_64 rng (det_order_seed);
175- std::normal_distribution<double > dist (/* mean=*/ 0 , /* stddev=*/ 1 );
176-
177- std::vector<std::vector<double >> detector_coords = get_detector_coords (config.dem );
178173 if (verbose) {
174+ auto detector_coords = get_detector_coords (config.dem );
179175 for (size_t d = 0 ; d < detector_coords.size (); ++d) {
180176 std::cout << " Detector D" << d << " coordinate (" ;
181177 size_t e = std::min (3ul , detector_coords[d].size ());
@@ -186,88 +182,8 @@ struct Args {
186182 std::cout << " )" << std::endl;
187183 }
188184 }
189-
190- if (det_order_bfs) {
191- auto graph = build_detector_graph (config.dem );
192- std::uniform_int_distribution<size_t > dist_det (0 , graph.size () - 1 );
193- for (size_t det_order = 0 ; det_order < num_det_orders; ++det_order) {
194- std::vector<size_t > perm;
195- perm.reserve (graph.size ());
196- std::vector<char > visited (graph.size (), false );
197- std::queue<size_t > q;
198- size_t start = dist_det (rng);
199- while (perm.size () < graph.size ()) {
200- if (!visited[start]) {
201- visited[start] = true ;
202- q.push (start);
203- perm.push_back (start);
204- }
205- while (!q.empty ()) {
206- size_t cur = q.front ();
207- q.pop ();
208- auto neigh = graph[cur];
209- std::shuffle (neigh.begin (), neigh.end (), rng);
210- for (size_t n : neigh) {
211- if (!visited[n]) {
212- visited[n] = true ;
213- q.push (n);
214- perm.push_back (n);
215- }
216- }
217- }
218- if (perm.size () < graph.size ()) {
219- do {
220- start = dist_det (rng);
221- } while (visited[start]);
222- }
223- }
224- std::vector<size_t > inv_perm (graph.size ());
225- for (size_t i = 0 ; i < perm.size (); ++i) {
226- inv_perm[perm[i]] = i;
227- }
228- config.det_orders [det_order] = inv_perm;
229- }
230- } else {
231- std::vector<double > inner_products (config.dem .count_detectors ());
232-
233- if (!detector_coords.size () || !detector_coords.at (0 ).size ()) {
234- // If there are no detector coordinates, just use the standard
235- // ordering of the indices.
236- for (size_t det_order = 0 ; det_order < num_det_orders; ++det_order) {
237- config.det_orders [det_order].resize (config.dem .count_detectors ());
238- std::iota (config.det_orders [det_order].begin (), config.det_orders [det_order].end (), 0 );
239- }
240-
241- } else {
242- // Use the coordinates to order the detectors based on a random
243- // orientation
244- for (size_t det_order = 0 ; det_order < num_det_orders; ++det_order) {
245- // Sample a direction
246- std::vector<double > orientation_vector;
247- for (size_t i = 0 ; i < detector_coords.at (0 ).size (); ++i) {
248- orientation_vector.push_back (dist (rng));
249- }
250-
251- for (size_t i = 0 ; i < detector_coords.size (); ++i) {
252- inner_products[i] = 0 ;
253- for (size_t j = 0 ; j < orientation_vector.size (); ++j) {
254- inner_products[i] += detector_coords[i][j] * orientation_vector[j];
255- }
256- }
257- std::vector<size_t > perm (config.dem .count_detectors ());
258- std::iota (perm.begin (), perm.end (), 0 );
259- std::sort (perm.begin (), perm.end (), [&](const size_t & i, const size_t & j) {
260- return inner_products[i] > inner_products[j];
261- });
262- // Invert the permutation
263- std::vector<size_t > inv_perm (config.dem .count_detectors ());
264- for (size_t i = 0 ; i < perm.size (); ++i) {
265- inv_perm[perm[i]] = i;
266- }
267- config.det_orders [det_order] = inv_perm;
268- }
269- }
270- }
185+ config.det_orders =
186+ build_det_orders (config.dem , num_det_orders, det_order_bfs, det_order_seed);
271187 }
272188
273189 if (sample_num_shots > 0 ) {
0 commit comments