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