GCC Code Coverage Report


Directory: ./
File: Circuit/macro_circ_info.cpp
Date: 2022-10-15 05:10:18
Warnings: 44 unchecked decisions!
Exec Total Coverage
Lines: 617 625 98.7%
Functions: 48 48 100.0%
Branches: 780 1268 61.5%
Decisions: 176 277 63.5%

Line Branch Decision Exec Source
1 // Copyright 2019-2022 Cambridge Quantum Computing
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 ////////////////////////////////////////////////////
16 // ALL METHODS TO OBTAIN COMPLEX GRAPH INFORMATIION//
17 ////////////////////////////////////////////////////
18
19 #include <tklog/TketLog.hpp>
20
21 #include "Circuit.hpp"
22 #include "DAGDefs.hpp"
23 #include "OpType/EdgeType.hpp"
24 #include "OpType/OpType.hpp"
25 #include "Ops/OpPtr.hpp"
26 #include "Utils/GraphHeaders.hpp"
27
28 namespace tket {
29
30 223012 bool Circuit::is_simple() const {
31
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 223012 times.
0/1
? Decision couldn't be analyzed.
223012 if (!default_regs_ok()) return false;
32
5/8
✓ Branch 4 taken 255856 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 255848 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 478860 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 255856 times.
✓ Branch 13 taken 223004 times.
0/1
? Decision couldn't be analyzed.
478860 for (const BoundaryElement& el : boundary.get<TagID>()) {
33
1/2
✓ Branch 1 taken 255856 times.
✗ Branch 2 not taken.
255856 std::string reg = el.id_.reg_name();
34
8/10
✓ Branch 1 taken 255856 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 493 times.
✓ Branch 5 taken 255363 times.
✓ Branch 7 taken 493 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 485 times.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 255848 times.
1/2
✓ Decision 'true' taken 255856 times.
✗ Decision 'false' not taken.
255856 if (!(reg == q_default_reg() || reg == c_default_reg())) return false;
35
2/2
✓ Branch 1 taken 255848 times.
✓ Branch 2 taken 8 times.
255856 }
36 223004 return true;
37 }
38
39 223121 bool Circuit::default_regs_ok() const {
40
3/6
✓ Branch 1 taken 223121 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 223121 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 223121 times.
✗ Branch 8 not taken.
223121 opt_reg_info_t q_info = get_reg_info(q_default_reg());
41 223121 register_info_t correct_q_info = {UnitType::Qubit, 1};
42
5/8
✓ Branch 1 taken 223003 times.
✓ Branch 2 taken 118 times.
✓ Branch 4 taken 223003 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 223003 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 223121 times.
1/2
✓ Decision 'true' taken 223121 times.
✗ Decision 'false' not taken.
223121 if (q_info && q_info.value() != correct_q_info) return false;
43
3/6
✓ Branch 1 taken 223121 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 223121 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 223121 times.
✗ Branch 8 not taken.
223121 opt_reg_info_t c_info = get_reg_info(c_default_reg());
44 223121 register_info_t correct_c_info = {UnitType::Bit, 1};
45
5/8
✓ Branch 1 taken 262 times.
✓ Branch 2 taken 222859 times.
✓ Branch 4 taken 262 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 262 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 223121 times.
1/2
✓ Decision 'true' taken 223121 times.
✗ Decision 'false' not taken.
223121 if (c_info && c_info.value() != correct_c_info) return false;
46 223121 return true;
47 }
48
49 2 std::map<OpType, unsigned> Circuit::op_counts() const {
50 2 std::map<OpType, unsigned> counts;
51
9/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 37 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 37 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 37 times.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 37 times.
✓ Branch 15 taken 2 times.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
41 BGL_FORALL_VERTICES(v, dag, DAG) { counts[get_OpType_from_Vertex(v)]++; }
52 2 return counts;
53 }
54
55 2200 unsigned Circuit::count_gates(const OpType& op_type) const {
56 2200 unsigned counter = 0;
57
7/8
✓ Branch 1 taken 2200 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80079 times.
✓ Branch 6 taken 2200 times.
✓ Branch 8 taken 80079 times.
✓ Branch 9 taken 2200 times.
✓ Branch 11 taken 2200 times.
✓ Branch 12 taken 2200 times.
84479 BGL_FORALL_VERTICES(v, dag, DAG) {
58
3/4
✓ Branch 1 taken 80079 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16967 times.
✓ Branch 4 taken 63112 times.
2/2
✓ Decision 'true' taken 16967 times.
✓ Decision 'false' taken 63112 times.
80079 if (get_OpType_from_Vertex(v) == op_type) {
59 16967 ++counter;
60 }
61 }
62 2200 return counter;
63 }
64
65 6 VertexSet Circuit::get_gates_of_type(const OpType& op_type) const {
66 6 VertexSet vset;
67
7/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 6 times.
✓ Branch 8 taken 33 times.
✓ Branch 9 taken 6 times.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 6 times.
45 BGL_FORALL_VERTICES(v, dag, DAG) {
68
3/4
✓ Branch 1 taken 33 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 26 times.
2/2
✓ Decision 'true' taken 7 times.
✓ Decision 'false' taken 26 times.
33 if (get_OpType_from_Vertex(v) == op_type) {
69
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 vset.insert(v);
70 }
71 }
72 6 return vset;
73 }
74
75 3 std::list<Command> Circuit::get_commands_of_type(OpType op_type) const {
76 3 std::list<Command> coms;
77 46 std::function<bool(Op_ptr)> skip_func = [=](Op_ptr op) {
78 46 return (op->get_type() != op_type);
79 3 };
80
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Circuit::SliceIterator slice_iter(*this, skip_func);
81
3/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 3 times.
0/1
? Decision couldn't be analyzed.
7 for (const Vertex& v : *slice_iter) {
82
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 coms.push_back(command_from_vertex(
83 8 v, slice_iter.get_u_frontier(), slice_iter.get_prev_b_frontier()));
84 3 }
85
3/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 3 times.
0/1
? Decision couldn't be analyzed.
5 while (!slice_iter.finished()) {
86
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
4 slice_iter.cut_ = next_cut(
87 2 slice_iter.cut_.u_frontier, slice_iter.cut_.b_frontier, skip_func);
88
3/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 2 times.
0/1
? Decision couldn't be analyzed.
3 for (const Vertex& v : *slice_iter) {
89
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 coms.push_back(command_from_vertex(
90 2 v, slice_iter.get_u_frontier(), slice_iter.get_prev_b_frontier()));
91 2 }
92 }
93 6 return coms;
94 3 }
95
96 2806 Circuit Circuit::subcircuit(const Subcircuit& sc) const {
97
1/2
✓ Branch 1 taken 2806 times.
✗ Branch 2 not taken.
2806 Circuit sub;
98 2806 vertex_map_t vmap;
99 2806 VertexVec q_ins;
100 2806 VertexVec q_outs;
101 2806 VertexVec c_ins;
102 2806 VertexVec c_outs;
103 2806 std::map<Edge, Vertex> in_boundary_map;
104 2806 std::map<Edge, Vertex> out_boundary_map;
105
2/2
✓ Branch 4 taken 3217 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 3217 times.
✓ Decision 'false' taken 2806 times.
6023 for (const Edge& e : sc.q_in_hole) {
106
1/2
✓ Branch 2 taken 3217 times.
✗ Branch 3 not taken.
3217 Vertex added = sub.add_vertex(OpType::Input);
107
2/4
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3217 times.
✗ Branch 5 not taken.
3217 vmap[source(e)] = added;
108
1/2
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
3217 q_ins.push_back(added);
109
1/2
✓ Branch 2 taken 3217 times.
✗ Branch 3 not taken.
3217 in_boundary_map.insert({e, added});
110 }
111
2/2
✓ Branch 4 taken 3217 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 3217 times.
✓ Decision 'false' taken 2806 times.
6023 for (const Edge& e : sc.q_out_hole) {
112
1/2
✓ Branch 2 taken 3217 times.
✗ Branch 3 not taken.
3217 Vertex added = sub.add_vertex(OpType::Output);
113
2/4
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3217 times.
✗ Branch 5 not taken.
3217 vmap[target(e)] = added;
114
1/2
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
3217 q_outs.push_back(added);
115
1/2
✓ Branch 2 taken 3217 times.
✗ Branch 3 not taken.
3217 out_boundary_map.insert({e, added});
116 }
117
2/2
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 2806 times.
2807 for (const Edge& e : sc.c_in_hole) {
118
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Vertex added = sub.add_vertex(OpType::ClInput);
119
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 vmap[source(e)] = added;
120
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 c_ins.push_back(added);
121
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 in_boundary_map.insert({e, added});
122 }
123
2/2
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 2806 times.
2807 for (const Edge& e : sc.c_out_hole) {
124
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Vertex added = sub.add_vertex(OpType::ClOutput);
125
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 vmap[target(e)] = added;
126
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 c_outs.push_back(added);
127
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 out_boundary_map.insert({e, added});
128 }
129
2/2
✓ Branch 1 taken 3217 times.
✓ Branch 2 taken 2806 times.
2/2
✓ Decision 'true' taken 3217 times.
✓ Decision 'false' taken 2806 times.
6023 for (unsigned i = 0; i < q_ins.size(); i++) {
130
2/4
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 3217 times.
✗ Branch 8 not taken.
3217 sub.boundary.insert({Qubit(i), q_ins[i], q_outs[i]});
131 }
132
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2806 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 2806 times.
2807 for (unsigned i = 0; i < c_ins.size(); i++) {
133
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 sub.boundary.insert({Bit(i), c_ins[i], c_outs[i]});
134 }
135
2/2
✓ Branch 4 taken 16298 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 16298 times.
✓ Decision 'false' taken 2806 times.
19104 for (const Vertex& v : sc.verts) {
136
2/4
✓ Branch 2 taken 16298 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 16298 times.
✗ Branch 6 not taken.
16298 Vertex added = sub.add_vertex(get_Op_ptr_from_Vertex(v));
137
1/2
✓ Branch 1 taken 16298 times.
✗ Branch 2 not taken.
16298 vmap[v] = added;
138 }
139
2/2
✓ Branch 5 taken 16298 times.
✓ Branch 6 taken 2806 times.
2/2
✓ Decision 'true' taken 16298 times.
✓ Decision 'false' taken 2806 times.
19104 for (const Vertex& v : sc.verts) {
140 // iterate through original circuit as order of the set varies between Mac
141 // and Docker
142
11/16
✓ Branch 1 taken 16298 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16298 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 33515 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 17217 times.
✓ Branch 10 taken 16298 times.
✓ Branch 12 taken 17217 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 17217 times.
✓ Branch 15 taken 16298 times.
✓ Branch 17 taken 32596 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16298 times.
✓ Branch 20 taken 16298 times.
49813 BGL_FORALL_INEDGES(v, e, dag, DAG) {
143
1/2
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
17217 Vertex source = this->source(e);
144
1/2
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
17217 Vertex sub_source = vmap.at(source);
145
1/2
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
17217 port_t in_port = get_source_port(e);
146
1/2
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
17217 OpType type = sub.get_OpType_from_Vertex(sub_source);
147
7/8
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14008 times.
✓ Branch 4 taken 3209 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 14006 times.
✓ Branch 7 taken 3211 times.
✓ Branch 8 taken 14006 times.
2/2
✓ Decision 'true' taken 3211 times.
✓ Decision 'false' taken 14006 times.
17217 if (is_initial_q_type(type) || type == OpType::ClInput) {
148
1/2
✓ Branch 1 taken 3211 times.
✗ Branch 2 not taken.
3211 Edge boundary_edge = get_linear_edge(e);
149 // Multiple inputs might be mapped to the same source
150 // so need to distinguish them.
151
1/2
✓ Branch 1 taken 3211 times.
✗ Branch 2 not taken.
3211 sub_source = in_boundary_map.at(boundary_edge);
152 3211 in_port = 0;
153 }
154
1/2
✓ Branch 2 taken 17217 times.
✗ Branch 3 not taken.
17217 sub.add_edge(
155
4/8
✓ Branch 1 taken 17217 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17217 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 17217 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 17217 times.
✗ Branch 12 not taken.
34434 {sub_source, in_port}, {vmap.at(v), get_target_port(e)}, dag[e].type);
156 }
157 }
158
2/2
✓ Branch 4 taken 3217 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 3217 times.
✓ Decision 'false' taken 2806 times.
6023 for (const Edge& e : sc.q_out_hole) {
159 // Multiple outputs might be mapped to the same target
160 // so need to distinguish them.
161
1/2
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
3217 Vertex out = out_boundary_map[e];
162
2/4
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3217 times.
✗ Branch 5 not taken.
3217 Vertex sub_source = vmap.at(source(e));
163
1/2
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
3217 port_t in_port = get_source_port(e);
164
1/2
✓ Branch 1 taken 3217 times.
✗ Branch 2 not taken.
3217 std::map<Edge, Vertex>::iterator found = in_boundary_map.find(e);
165
2/2
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 3210 times.
2/2
✓ Decision 'true' taken 7 times.
✓ Decision 'false' taken 3210 times.
3217 if (found != in_boundary_map.end()) {
166 7 sub_source = found->second;
167 7 in_port = 0;
168 }
169
1/2
✓ Branch 3 taken 3217 times.
✗ Branch 4 not taken.
3217 sub.add_edge({sub_source, in_port}, {out, 0}, EdgeType::Quantum);
170 }
171
2/2
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2806 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 2806 times.
2807 for (const Edge& e : sc.c_out_hole) {
172
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Vertex out = out_boundary_map[e];
173
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 Vertex sub_source = vmap.at(source(e));
174
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 port_t in_port = get_source_port(e);
175
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 std::map<Edge, Vertex>::iterator found = in_boundary_map.find(e);
176
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1/2
✓ Decision 'true' taken 1 times.
✗ Decision 'false' not taken.
1 if (found != in_boundary_map.end()) {
177 1 sub_source = found->second;
178 1 in_port = 0;
179 }
180
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 sub.add_edge({sub_source, in_port}, {out, 0}, EdgeType::Classical);
181 }
182 5612 return sub;
183 2806 }
184
185 // returns qubit path via vertices & inhabited port in vertices
186 // used to construct a routing grid
187 35106 QPathDetailed Circuit::unit_path(const UnitID& unit) const {
188
1/2
✓ Branch 1 taken 35106 times.
✗ Branch 2 not taken.
35106 Vertex current_v = get_in(unit);
189
190
1/2
✓ Branch 3 taken 35106 times.
✗ Branch 4 not taken.
35106 QPathDetailed path = {{current_v, 0}};
191
1/2
✓ Branch 1 taken 35106 times.
✗ Branch 2 not taken.
35106 Edge betweenEdge = get_nth_out_edge(current_v, 0);
192
1/2
✓ Branch 1 taken 35106 times.
✗ Branch 2 not taken.
35106 current_v = target(betweenEdge);
193
194
3/4
✓ Branch 1 taken 422413 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 387307 times.
✓ Branch 4 taken 35106 times.
0/1
? Decision couldn't be analyzed.
422413 while (detect_final_Op(current_v) == false) {
195
2/4
✓ Branch 1 taken 387307 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 387307 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 387307 times.
387307 if (n_out_edges(current_v) == 0) {
196 throw CircuitInvalidity("A path ends before reaching an output vertex.");
197 }
198
1/2
✓ Branch 1 taken 387307 times.
✗ Branch 2 not taken.
387307 port_t n = get_target_port(betweenEdge);
199 387307 VertPort v_and_port = {current_v, n};
200
1/2
✓ Branch 1 taken 387307 times.
✗ Branch 2 not taken.
387307 path.push_back(v_and_port);
201
1/2
✓ Branch 1 taken 387307 times.
✗ Branch 2 not taken.
387307 betweenEdge = get_nth_out_edge(current_v, n);
202
1/2
✓ Branch 1 taken 387307 times.
✗ Branch 2 not taken.
387307 current_v = target(betweenEdge);
203 }
204
1/2
✓ Branch 2 taken 35106 times.
✗ Branch 3 not taken.
35106 path.push_back({current_v, 0});
205 70212 return path;
206 }
207
208 // returns a vector of each qubits path via qubit_path
209 // this is all the information required to make a circuit
210 13602 std::vector<QPathDetailed> Circuit::all_qubit_paths() const {
211 13602 std::vector<QPathDetailed> new_list_of_paths;
212
3/4
✓ Branch 1 taken 13602 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 33483 times.
✓ Branch 8 taken 13602 times.
0/1
? Decision couldn't be analyzed.
47085 for (const Qubit& q : all_qubits()) {
213
2/4
✓ Branch 1 taken 33483 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 33483 times.
✗ Branch 5 not taken.
33483 new_list_of_paths.push_back(unit_path(q));
214 13602 }
215 13602 return new_list_of_paths;
216 }
217
218 407 std::map<UnitID, QPathDetailed> Circuit::all_unit_paths() const {
219 407 std::map<UnitID, QPathDetailed> new_list_of_paths;
220
3/4
✓ Branch 1 taken 407 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 1206 times.
✓ Branch 8 taken 407 times.
0/1
? Decision couldn't be analyzed.
1613 for (const Qubit& q : all_qubits()) {
221
2/4
✓ Branch 1 taken 1206 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1206 times.
✗ Branch 6 not taken.
1206 new_list_of_paths.insert({q, unit_path(q)});
222 407 }
223
3/4
✓ Branch 1 taken 407 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 21 times.
✓ Branch 8 taken 407 times.
0/1
? Decision couldn't be analyzed.
428 for (const Bit& b : all_bits()) {
224
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
21 new_list_of_paths.insert({b, unit_path(b)});
225 407 }
226 407 return new_list_of_paths;
227 }
228
229 // safely return boundary iterator to UnitID
230 178 boundary_t::iterator boundary_elem(const Circuit& circ, const UnitID& unit) {
231
1/2
✓ Branch 2 taken 178 times.
✗ Branch 3 not taken.
178 boundary_t::iterator found = circ.boundary.get<TagID>().find(unit);
232
233
2/4
✓ Branch 3 taken 178 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 178 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 178 times.
178 if (found == circ.boundary.get<TagID>().end()) {
234 throw CircuitInvalidity("Unit not found in circuit: " + unit.repr());
235 }
236 178 return found;
237 }
238
239 /*
240 Permute output boundary of circuit according to qubit map
241 Assumes all circuit Qubits are mapped
242 */
243 30 void Circuit::permute_boundary_output(const qubit_map_t& qm) {
244 30 std::map<UnitID, BoundaryElement> new_entries;
245
246
2/2
✓ Branch 4 taken 89 times.
✓ Branch 5 taken 30 times.
2/2
✓ Decision 'true' taken 89 times.
✓ Decision 'false' taken 30 times.
119 for (const auto& qb_pair : qm) {
247
1/2
✓ Branch 1 taken 89 times.
✗ Branch 2 not taken.
89 boundary_t::iterator input = boundary_elem(*this, qb_pair.first);
248
1/2
✓ Branch 1 taken 89 times.
✗ Branch 2 not taken.
89 boundary_t::iterator output = boundary_elem(*this, qb_pair.second);
249
5/10
✓ Branch 1 taken 89 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 89 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 89 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 89 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 89 times.
✗ Branch 16 not taken.
89 new_entries.insert({output->id_, {output->id_, output->in_, input->out_}});
250 }
251
252
2/2
✓ Branch 5 taken 89 times.
✓ Branch 6 taken 30 times.
2/2
✓ Decision 'true' taken 89 times.
✓ Decision 'false' taken 30 times.
119 for (const auto& pair : new_entries) {
253
2/4
✓ Branch 2 taken 89 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 89 times.
✗ Branch 6 not taken.
89 boundary.erase(boundary.get<TagID>().find(pair.first));
254 }
255
256
2/2
✓ Branch 5 taken 89 times.
✓ Branch 6 taken 30 times.
2/2
✓ Decision 'true' taken 89 times.
✓ Decision 'false' taken 30 times.
119 for (const auto& pair : new_entries) {
257
1/2
✓ Branch 1 taken 89 times.
✗ Branch 2 not taken.
89 boundary.insert(pair.second);
258 }
259 30 }
260
261 7002 qubit_map_t Circuit::implicit_qubit_permutation() const {
262 7002 qubit_map_t perm;
263
3/4
✓ Branch 1 taken 7002 times.
✗ Branch 2 not taken.
✓ Branch 8 taken 20285 times.
✓ Branch 9 taken 7002 times.
0/1
? Decision couldn't be analyzed.
27287 for (const QPathDetailed& path : all_qubit_paths()) {
264
2/4
✓ Branch 2 taken 20285 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 20285 times.
✗ Branch 6 not taken.
20285 Qubit in_q(get_id_from_in(path.front().first));
265
2/4
✓ Branch 2 taken 20285 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 20285 times.
✗ Branch 6 not taken.
20285 Qubit out_q(get_id_from_out(path.back().first));
266
1/2
✓ Branch 2 taken 20285 times.
✗ Branch 3 not taken.
20285 perm.insert({in_q, out_q});
267 27287 }
268 7002 return perm;
269 }
270
271 708 bool Circuit::has_implicit_wireswaps() const {
272
1/2
✓ Branch 1 taken 708 times.
✗ Branch 2 not taken.
708 qubit_map_t perm = implicit_qubit_permutation();
273
2/2
✓ Branch 5 taken 2772 times.
✓ Branch 6 taken 680 times.
2/2
✓ Decision 'true' taken 2772 times.
✓ Decision 'false' taken 680 times.
3452 for (const std::pair<const Qubit, Qubit>& pair : perm) {
274
3/4
✓ Branch 1 taken 2772 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 28 times.
✓ Branch 4 taken 2744 times.
2/2
✓ Decision 'true' taken 680 times.
✓ Decision 'false' taken 2092 times.
2772 if (pair.first != pair.second) return true;
275 }
276 680 return false;
277 708 }
278
279 // returns a basic qubit path consisting of just vertices
280 // this was used in early methods for printing
281 // it is now only used for MatrixAnalysis methods
282 // TODO:: remove from circuit
283 134 VertexVec Circuit::qubit_path_vertices(const Qubit& qubit) const {
284
1/2
✓ Branch 1 taken 134 times.
✗ Branch 2 not taken.
134 QPathDetailed path = unit_path(qubit);
285 134 VertexVec follow_q;
286
2/2
✓ Branch 5 taken 481 times.
✓ Branch 6 taken 134 times.
2/2
✓ Decision 'true' taken 481 times.
✓ Decision 'false' taken 134 times.
615 for (const VertPort& pair : path) {
287
1/2
✓ Branch 1 taken 481 times.
✗ Branch 2 not taken.
481 follow_q.push_back(pair.first);
288 }
289 268 return follow_q;
290 134 }
291
292 // returns 'slices' of 'parallel' actions in dag as a vector encompassing all
293 // vertices
294 // requires the boundaries to be correct and the circuit to be fully connected
295 6920 SliceVec Circuit::get_slices() const {
296 6920 SliceVec slices;
297
5/8
✓ Branch 1 taken 6920 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 51223 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 51223 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 44303 times.
✓ Branch 11 taken 6920 times.
0/1
? Decision couldn't be analyzed.
51223 for (SliceIterator sit = this->slice_begin(); sit != slice_end(); ++sit) {
298
3/6
✓ Branch 1 taken 44303 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 44303 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 44303 times.
✗ Branch 9 not taken.
44303 slices.push_back(*sit);
299 6920 }
300 6920 return slices;
301 }
302
303 11257 Edge Circuit::skip_irrelevant_edges(Edge current) const {
304
1/2
✓ Branch 1 taken 11257 times.
✗ Branch 2 not taken.
11257 Vertex try_next_v = target(current);
305
3/4
✓ Branch 1 taken 11579 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 322 times.
✓ Branch 4 taken 11257 times.
0/1
? Decision couldn't be analyzed.
11579 while (n_out_edges_of_type(try_next_v, EdgeType::Quantum) == 1) {
306
1/2
✓ Branch 1 taken 322 times.
✗ Branch 2 not taken.
322 std::tie(try_next_v, current) = get_next_pair(try_next_v, current);
307 }
308 11257 return current;
309 }
310
311 296545 static std::shared_ptr<unit_frontier_t> get_next_u_frontier(
312 const Circuit& circ, std::shared_ptr<const unit_frontier_t> u_frontier,
313 const VertexSet& next_slice_lookup) {
314 std::shared_ptr<unit_frontier_t> next_frontier =
315 296545 std::make_shared<unit_frontier_t>();
316
5/8
✓ Branch 5 taken 3195807 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3195807 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3492352 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3195807 times.
✓ Branch 14 taken 296545 times.
0/1
? Decision couldn't be analyzed.
3492352 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
317
1/2
✓ Branch 1 taken 3195807 times.
✗ Branch 2 not taken.
3195807 Vertex next_v = circ.target(pair.second);
318
3/4
✓ Branch 2 taken 3195807 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2652471 times.
✓ Branch 6 taken 543336 times.
2/2
✓ Decision 'true' taken 2652471 times.
✓ Decision 'false' taken 543336 times.
3195807 if (next_slice_lookup.find(next_v) == next_slice_lookup.end()) {
319
1/2
✓ Branch 2 taken 2652471 times.
✗ Branch 3 not taken.
2652471 next_frontier->insert(pair);
320 } else {
321
1/2
✓ Branch 3 taken 543336 times.
✗ Branch 4 not taken.
1086672 next_frontier->insert(
322
1/2
✓ Branch 1 taken 543336 times.
✗ Branch 2 not taken.
1086672 {pair.first, circ.get_next_edge(next_v, pair.second)});
323 }
324 }
325 296545 return next_frontier;
326 }
327
328 296539 static std::shared_ptr<b_frontier_t> get_next_b_frontier(
329 const Circuit& circ, std::shared_ptr<const b_frontier_t> b_frontier,
330 std::shared_ptr<const unit_frontier_t> u_frontier,
331 const VertexSet& next_slice_lookup) {
332 std::shared_ptr<b_frontier_t> next_b_frontier =
333 296539 std::make_shared<b_frontier_t>();
334 // Copy any remaining edges
335
5/8
✓ Branch 5 taken 28828 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 28828 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 325367 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 28828 times.
✓ Branch 14 taken 296539 times.
0/1
? Decision couldn't be analyzed.
325367 for (const std::pair<Bit, EdgeVec>& pair : b_frontier->get<TagKey>()) {
336 28828 EdgeVec remaining;
337
2/2
✓ Branch 5 taken 966728 times.
✓ Branch 6 taken 28828 times.
2/2
✓ Decision 'true' taken 966728 times.
✓ Decision 'false' taken 28828 times.
995556 for (const Edge& e : pair.second) {
338
1/2
✓ Branch 1 taken 966728 times.
✗ Branch 2 not taken.
966728 Vertex targ = circ.target(e);
339
3/4
✓ Branch 2 taken 966728 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 961352 times.
✓ Branch 6 taken 5376 times.
2/2
✓ Decision 'true' taken 961352 times.
✓ Decision 'false' taken 5376 times.
966728 if (next_slice_lookup.find(targ) == next_slice_lookup.end()) {
340
1/2
✓ Branch 1 taken 961352 times.
✗ Branch 2 not taken.
961352 remaining.push_back(e);
341 }
342 }
343
2/2
✓ Branch 1 taken 19473 times.
✓ Branch 2 taken 9355 times.
2/2
✓ Decision 'true' taken 19473 times.
✓ Decision 'false' taken 9355 times.
28828 if (!remaining.empty()) {
344
2/4
✓ Branch 2 taken 19473 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 19473 times.
✗ Branch 6 not taken.
19473 next_b_frontier->insert({pair.first, remaining});
345 }
346 28828 }
347 // Add any new bits introduced in this slice
348
5/8
✓ Branch 5 taken 3195780 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3195780 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3492319 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3195780 times.
✓ Branch 14 taken 296539 times.
0/1
? Decision couldn't be analyzed.
3492319 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
349
3/4
✓ Branch 1 taken 3195780 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2938780 times.
✓ Branch 4 taken 257000 times.
2/2
✓ Decision 'true' taken 257000 times.
✓ Decision 'false' taken 3195535 times.
3452535 if (circ.get_edgetype(pair.second) == EdgeType::Quantum) continue;
350
1/2
✓ Branch 1 taken 257000 times.
✗ Branch 2 not taken.
257000 Vertex next_v = circ.target(pair.second);
351
3/4
✓ Branch 2 taken 257000 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 256755 times.
✓ Branch 6 taken 245 times.
2/2
✓ Decision 'true' taken 245 times.
✓ Decision 'false' taken 256755 times.
257000 if (next_slice_lookup.find(next_v) == next_slice_lookup.end()) continue;
352
3/6
✓ Branch 3 taken 245 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 245 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 245 times.
✗ Branch 10 not taken.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 245 times.
245 if (next_b_frontier->get<TagKey>().find(Bit(pair.first)) !=
353
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 245 times.
490 next_b_frontier->end()) {
354 throw CircuitInvalidity("RAW hazard created in slicing");
355 }
356
1/2
✓ Branch 1 taken 245 times.
✗ Branch 2 not taken.
245 port_t p = circ.get_target_port(pair.second);
357
1/2
✓ Branch 1 taken 245 times.
✗ Branch 2 not taken.
245 EdgeVec reads = circ.get_nth_b_out_bundle(next_v, p);
358
5/8
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 200 times.
✓ Branch 5 taken 45 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 45 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 45 times.
✗ Branch 12 not taken.
1/2
✓ Decision 'true' taken 245 times.
✗ Decision 'false' not taken.
245 if (!reads.empty()) next_b_frontier->insert({Bit(pair.first), reads});
359 245 }
360 296539 return next_b_frontier;
361 }
362
363 295826 CutFrontier Circuit::next_cut(
364 std::shared_ptr<const unit_frontier_t> u_frontier,
365 std::shared_ptr<const b_frontier_t> b_frontier) const {
366
1/2
✓ Branch 1 taken 295826 times.
✗ Branch 2 not taken.
295826 auto next_slice = std::make_shared<Slice>();
367 295826 VertexSet next_slice_lookup;
368 295826 VertexSet bad_vertices;
369 295826 std::list<Edge> all_edges;
370 295826 EdgeSet edge_lookup;
371
5/8
✓ Branch 5 taken 3193529 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3193529 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3489355 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3193529 times.
✓ Branch 14 taken 295826 times.
0/1
? Decision couldn't be analyzed.
3489355 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
372
2/2
✓ Branch 1 taken 256953 times.
✓ Branch 2 taken 2936576 times.
2/2
✓ Decision 'true' taken 256953 times.
✓ Decision 'false' taken 2936576 times.
3193529 if (pair.first.type() == UnitType::Bit) {
373
1/2
✓ Branch 1 taken 256953 times.
✗ Branch 2 not taken.
256953 Vertex targ = target(pair.second);
374 b_frontier_t::const_iterator found =
375
2/4
✓ Branch 3 taken 256953 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 256953 times.
✗ Branch 7 not taken.
256953 b_frontier->get<TagKey>().find(Bit(pair.first));
376
3/4
✓ Branch 4 taken 256953 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 20202 times.
✓ Branch 7 taken 236751 times.
2/2
✓ Decision 'true' taken 20202 times.
✓ Decision 'false' taken 236751 times.
256953 if (found != b_frontier->get<TagKey>().end()) {
377 20202 bool still_live = false;
378
3/4
✓ Branch 1 taken 20202 times.
✗ Branch 2 not taken.
✓ Branch 8 taken 19688 times.
✓ Branch 9 taken 514 times.
0/1
? Decision couldn't be analyzed.
20202 for (const Edge& e : found->second) {
379
2/4
✓ Branch 1 taken 19688 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 19688 times.
✗ Branch 4 not taken.
1/2
✓ Decision 'true' taken 19688 times.
✗ Decision 'false' not taken.
19688 if (target(e) != targ) {
380 19688 still_live = true;
381 19688 break;
382 }
383 }
384
2/2
✓ Branch 0 taken 19688 times.
✓ Branch 1 taken 514 times.
0/1
? Decision couldn't be analyzed.
20202 if (still_live) continue;
385 }
386 }
387
1/2
✓ Branch 1 taken 3173841 times.
✗ Branch 2 not taken.
3173841 all_edges.push_back(pair.second);
388
1/2
✓ Branch 1 taken 3173841 times.
✗ Branch 2 not taken.
3173841 edge_lookup.insert(pair.second);
389 }
390
5/8
✓ Branch 5 taken 28810 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 28810 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 324636 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 28810 times.
✓ Branch 14 taken 295826 times.
0/1
? Decision couldn't be analyzed.
324636 for (const std::pair<Bit, EdgeVec>& pair : b_frontier->get<TagKey>()) {
391
2/2
✓ Branch 5 taken 966719 times.
✓ Branch 6 taken 28810 times.
2/2
✓ Decision 'true' taken 966719 times.
✓ Decision 'false' taken 28810 times.
995529 for (const Edge& e : pair.second) {
392
1/2
✓ Branch 1 taken 966719 times.
✗ Branch 2 not taken.
966719 all_edges.push_back(e);
393
1/2
✓ Branch 1 taken 966719 times.
✗ Branch 2 not taken.
966719 edge_lookup.insert(e);
394 }
395 }
396 // find the next slice first
397
2/2
✓ Branch 5 taken 4140560 times.
✓ Branch 6 taken 295826 times.
2/2
✓ Decision 'true' taken 4140560 times.
✓ Decision 'false' taken 295826 times.
4436386 for (const Edge& e : all_edges) {
398
1/2
✓ Branch 1 taken 4140560 times.
✗ Branch 2 not taken.
4140560 Vertex try_v = target(e);
399
3/4
✓ Branch 1 taken 4140560 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1004793 times.
✓ Branch 4 taken 3135767 times.
2/2
✓ Decision 'true' taken 3135767 times.
✓ Decision 'false' taken 1923881 times.
5059648 if (detect_final_Op(try_v)) continue;
400
3/4
✓ Branch 2 taken 3135767 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 174919 times.
✓ Branch 6 taken 2960848 times.
2/2
✓ Decision 'true' taken 174919 times.
✓ Decision 'false' taken 2960848 times.
3135767 if (next_slice_lookup.find(try_v) != next_slice_lookup.end())
401 174919 continue; // already going to be in next slice
402
1/2
✓ Branch 2 taken 2960848 times.
✗ Branch 3 not taken.
2960848 bool good_vertex = bad_vertices.find(try_v) == bad_vertices.end();
403
2/2
✓ Branch 0 taken 744169 times.
✓ Branch 1 taken 2216679 times.
2/2
✓ Decision 'true' taken 2216679 times.
✓ Decision 'false' taken 744169 times.
2960848 if (!good_vertex) continue;
404
1/2
✓ Branch 1 taken 2216679 times.
✗ Branch 2 not taken.
2216679 EdgeVec ins = get_in_edges(try_v);
405
2/2
✓ Branch 5 taken 3971300 times.
✓ Branch 6 taken 372365 times.
2/2
✓ Decision 'true' taken 3971300 times.
✓ Decision 'false' taken 372365 times.
4343665 for (const Edge& in : ins) {
406
3/4
✓ Branch 2 taken 3971300 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1844314 times.
✓ Branch 6 taken 2126986 times.
2/2
✓ Decision 'true' taken 1844314 times.
✓ Decision 'false' taken 2126986 times.
3971300 if (edge_lookup.find(in) == edge_lookup.end()) {
407 1844314 good_vertex = false;
408
1/2
✓ Branch 1 taken 1844314 times.
✗ Branch 2 not taken.
1844314 bad_vertices.insert(try_v);
409 1844314 break;
410 }
411 }
412
2/2
✓ Branch 0 taken 372365 times.
✓ Branch 1 taken 1844314 times.
2/2
✓ Decision 'true' taken 372365 times.
✓ Decision 'false' taken 1844314 times.
2216679 if (good_vertex) {
413
1/2
✓ Branch 1 taken 372365 times.
✗ Branch 2 not taken.
372365 next_slice_lookup.insert(try_v);
414
1/2
✓ Branch 2 taken 372365 times.
✗ Branch 3 not taken.
372365 next_slice->push_back(try_v);
415 }
416 2216679 }
417
418 return {
419 next_slice, get_next_u_frontier(*this, u_frontier, next_slice_lookup),
420
2/4
✓ Branch 3 taken 295826 times.
✗ Branch 4 not taken.
✓ Branch 8 taken 295826 times.
✗ Branch 9 not taken.
591652 get_next_b_frontier(*this, b_frontier, u_frontier, next_slice_lookup)};
421 295826 }
422
423 554 CutFrontier Circuit::next_cut(
424 std::shared_ptr<const unit_frontier_t> u_frontier,
425 std::shared_ptr<const b_frontier_t> b_frontier,
426 const std::function<bool(Op_ptr)>& skip_func) const {
427 554 VertexSet bad_vertices;
428 554 std::list<Edge> all_edges;
429 554 EdgeSet edge_lookup;
430
5/8
✓ Branch 5 taken 1709 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1709 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2263 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1709 times.
✓ Branch 14 taken 554 times.
0/1
? Decision couldn't be analyzed.
2263 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
431 1709 Edge e = pair.second;
432
1/2
✓ Branch 1 taken 1709 times.
✗ Branch 2 not taken.
1709 all_edges.push_back(e);
433
1/2
✓ Branch 1 taken 1709 times.
✗ Branch 2 not taken.
1709 edge_lookup.insert(e);
434 }
435
5/8
✓ Branch 5 taken 17 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 17 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 571 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 17 times.
✓ Branch 14 taken 554 times.
0/1
? Decision couldn't be analyzed.
571 for (const std::pair<Bit, EdgeVec>& pair : b_frontier->get<TagKey>()) {
436
2/2
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 17 times.
2/2
✓ Decision 'true' taken 8 times.
✓ Decision 'false' taken 17 times.
25 for (const Edge& edge : pair.second) {
437 8 Edge e = edge;
438
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 all_edges.push_back(e);
439
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 edge_lookup.insert(e);
440 }
441 }
442 // advance through skippable
443 bool can_skip;
444
2/2
✓ Branch 0 taken 159 times.
✓ Branch 1 taken 554 times.
713 do {
445 713 can_skip = false;
446 713 VertexSet skip_slice_lookup;
447
2/2
✓ Branch 5 taken 2260 times.
✓ Branch 6 taken 713 times.
2/2
✓ Decision 'true' taken 2260 times.
✓ Decision 'false' taken 713 times.
2973 for (const Edge& e : all_edges) {
448
1/2
✓ Branch 1 taken 2260 times.
✗ Branch 2 not taken.
2260 Vertex try_v = target(e);
449
11/16
✓ Branch 1 taken 2260 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1924 times.
✓ Branch 4 taken 336 times.
✓ Branch 6 taken 1924 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1924 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1606 times.
✓ Branch 12 taken 318 times.
✓ Branch 13 taken 1924 times.
✓ Branch 14 taken 336 times.
✓ Branch 16 taken 1942 times.
✓ Branch 17 taken 318 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2/2
✓ Decision 'true' taken 2026 times.
✓ Decision 'false' taken 234 times.
2260 if (detect_final_Op(try_v) || (!skip_func(get_Op_ptr_from_Vertex(try_v))))
450 2026 continue;
451
3/4
✓ Branch 2 taken 318 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 42 times.
✓ Branch 6 taken 276 times.
2/2
✓ Decision 'true' taken 276 times.
✓ Decision 'false' taken 42 times.
318 if (skip_slice_lookup.find(try_v) != skip_slice_lookup.end()) continue;
452
1/2
✓ Branch 2 taken 276 times.
✗ Branch 3 not taken.
276 bool good_vertex = bad_vertices.find(try_v) == bad_vertices.end();
453
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 268 times.
2/2
✓ Decision 'true' taken 268 times.
✓ Decision 'false' taken 8 times.
276 if (!good_vertex) continue;
454
1/2
✓ Branch 1 taken 268 times.
✗ Branch 2 not taken.
268 const EdgeVec ins = get_in_edges(try_v);
455
2/2
✓ Branch 5 taken 323 times.
✓ Branch 6 taken 234 times.
2/2
✓ Decision 'true' taken 323 times.
✓ Decision 'false' taken 234 times.
557 for (const Edge& in : ins) {
456
3/4
✓ Branch 2 taken 323 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 34 times.
✓ Branch 6 taken 289 times.
2/2
✓ Decision 'true' taken 34 times.
✓ Decision 'false' taken 289 times.
323 if (edge_lookup.find(in) == edge_lookup.end()) {
457 34 good_vertex = false;
458 34 break;
459 }
460 }
461
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 234 times.
2/2
✓ Decision 'true' taken 34 times.
✓ Decision 'false' taken 234 times.
268 if (!good_vertex) {
462
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
34 bad_vertices.insert(try_v);
463 34 continue;
464 }
465
1/2
✓ Branch 1 taken 234 times.
✗ Branch 2 not taken.
234 skip_slice_lookup.insert(try_v);
466
2/2
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 34 times.
268 }
467
2/2
✓ Branch 1 taken 159 times.
✓ Branch 2 taken 554 times.
2/2
✓ Decision 'true' taken 159 times.
✓ Decision 'false' taken 554 times.
713 if (!skip_slice_lookup.empty()) {
468 b_frontier =
469
1/2
✓ Branch 3 taken 159 times.
✗ Branch 4 not taken.
159 get_next_b_frontier(*this, b_frontier, u_frontier, skip_slice_lookup);
470
1/2
✓ Branch 2 taken 159 times.
✗ Branch 3 not taken.
159 u_frontier = get_next_u_frontier(*this, u_frontier, skip_slice_lookup);
471
1/2
✓ Branch 1 taken 159 times.
✗ Branch 2 not taken.
159 bad_vertices = {};
472
1/2
✓ Branch 1 taken 159 times.
✗ Branch 2 not taken.
159 all_edges = {};
473
1/2
✓ Branch 1 taken 159 times.
✗ Branch 2 not taken.
159 edge_lookup = {};
474
475
5/8
✓ Branch 5 taken 542 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 542 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 701 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 542 times.
✓ Branch 14 taken 159 times.
0/1
? Decision couldn't be analyzed.
701 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
476 542 Edge e = pair.second;
477
1/2
✓ Branch 1 taken 542 times.
✗ Branch 2 not taken.
542 all_edges.push_back(e);
478
1/2
✓ Branch 1 taken 542 times.
✗ Branch 2 not taken.
542 edge_lookup.insert(e);
479 }
480
5/8
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 160 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 159 times.
0/1
? Decision couldn't be analyzed.
160 for (const std::pair<Bit, EdgeVec>& pair : b_frontier->get<TagKey>()) {
481
2/2
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 1 times.
2 for (const Edge& edge : pair.second) {
482 1 Edge e = edge;
483
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 all_edges.push_back(e);
484
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 edge_lookup.insert(e);
485 }
486 }
487 159 can_skip = true;
488 }
489 713 } while (can_skip);
490
491 // find the next slice first
492
1/2
✓ Branch 1 taken 554 times.
✗ Branch 2 not taken.
554 auto next_slice = std::make_shared<Slice>();
493 554 VertexSet next_slice_lookup;
494
495
2/2
✓ Branch 5 taken 1717 times.
✓ Branch 6 taken 554 times.
2/2
✓ Decision 'true' taken 1717 times.
✓ Decision 'false' taken 554 times.
2271 for (const Edge& e : all_edges) {
496
1/2
✓ Branch 1 taken 1717 times.
✗ Branch 2 not taken.
1717 Vertex try_v = target(e);
497
3/4
✓ Branch 1 taken 1717 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 300 times.
✓ Branch 4 taken 1417 times.
2/2
✓ Decision 'true' taken 1417 times.
✓ Decision 'false' taken 754 times.
2171 if (detect_final_Op(try_v)) continue;
498
3/4
✓ Branch 2 taken 1417 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 432 times.
✓ Branch 6 taken 985 times.
2/2
✓ Decision 'true' taken 432 times.
✓ Decision 'false' taken 985 times.
1417 if (next_slice_lookup.find(try_v) != next_slice_lookup.end())
499 432 continue; // already going to be in next slice
500
1/2
✓ Branch 2 taken 985 times.
✗ Branch 3 not taken.
985 bool good_vertex = bad_vertices.find(try_v) == bad_vertices.end();
501
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 963 times.
2/2
✓ Decision 'true' taken 963 times.
✓ Decision 'false' taken 22 times.
985 if (!good_vertex) continue;
502
1/2
✓ Branch 1 taken 963 times.
✗ Branch 2 not taken.
963 const EdgeVec ins = get_in_edges(try_v);
503
2/2
✓ Branch 5 taken 1474 times.
✓ Branch 6 taken 707 times.
2/2
✓ Decision 'true' taken 1474 times.
✓ Decision 'false' taken 707 times.
2181 for (const Edge& in : ins) {
504
3/4
✓ Branch 2 taken 1474 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 256 times.
✓ Branch 6 taken 1218 times.
2/2
✓ Decision 'true' taken 256 times.
✓ Decision 'false' taken 1218 times.
1474 if (edge_lookup.find(in) == edge_lookup.end()) {
505 256 good_vertex = false;
506
1/2
✓ Branch 1 taken 256 times.
✗ Branch 2 not taken.
256 bad_vertices.insert(try_v);
507 256 break;
508 }
509 }
510
2/2
✓ Branch 0 taken 707 times.
✓ Branch 1 taken 256 times.
2/2
✓ Decision 'true' taken 707 times.
✓ Decision 'false' taken 256 times.
963 if (good_vertex) {
511
1/2
✓ Branch 1 taken 707 times.
✗ Branch 2 not taken.
707 next_slice_lookup.insert(try_v);
512
1/2
✓ Branch 2 taken 707 times.
✗ Branch 3 not taken.
707 next_slice->push_back(try_v);
513 }
514 963 }
515
516 return {
517 next_slice, get_next_u_frontier(*this, u_frontier, next_slice_lookup),
518
2/4
✓ Branch 3 taken 554 times.
✗ Branch 4 not taken.
✓ Branch 8 taken 554 times.
✗ Branch 9 not taken.
1108 get_next_b_frontier(*this, b_frontier, u_frontier, next_slice_lookup)};
519 554 }
520
521 6 CutFrontier Circuit::next_q_cut(
522 std::shared_ptr<const unit_frontier_t> u_frontier) const {
523
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 auto next_slice = std::make_shared<Slice>();
524 6 VertexSet next_slice_lookup;
525 6 VertexSet bad_vertices;
526 6 EdgeSet edge_lookup;
527
5/8
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✓ Branch 14 taken 6 times.
0/1
? Decision couldn't be analyzed.
33 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
528
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
27 edge_lookup.insert(pair.second);
529 }
530
531 // find the next slice first
532
5/8
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 27 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 33 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 27 times.
✓ Branch 14 taken 6 times.
0/1
? Decision couldn't be analyzed.
33 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
533
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
27 Vertex try_v = target(pair.second);
534
3/4
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
2/2
✓ Decision 'true' taken 18 times.
✓ Decision 'false' taken 14 times.
32 if (detect_final_Op(try_v)) continue;
535
3/4
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 13 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 13 times.
18 if (next_slice_lookup.contains(try_v))
536 5 continue; // already going to be in next slice
537
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 bool good_vertex = !bad_vertices.contains(try_v);
538
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
1/2
✓ Decision 'true' taken 13 times.
✗ Decision 'false' not taken.
13 if (!good_vertex) continue;
539
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 EdgeVec ins = get_in_edges(try_v);
540
2/2
✓ Branch 5 taken 22 times.
✓ Branch 6 taken 8 times.
2/2
✓ Decision 'true' taken 22 times.
✓ Decision 'false' taken 8 times.
30 for (const Edge& in : ins) {
541
8/10
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 14 times.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 17 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 17 times.
22 if (!edge_lookup.contains(in) && get_edgetype(in) == EdgeType::Quantum) {
542 5 good_vertex = false;
543
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 bad_vertices.insert(try_v);
544 5 break;
545 }
546 }
547
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 5 times.
2/2
✓ Decision 'true' taken 8 times.
✓ Decision 'false' taken 5 times.
13 if (good_vertex) {
548
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 next_slice_lookup.insert(try_v);
549
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 next_slice->push_back(try_v);
550 }
551 13 }
552
553 return {
554 next_slice, get_next_u_frontier(*this, u_frontier, next_slice_lookup),
555
2/4
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
12 std::make_shared<b_frontier_t>()};
556 6 }
557
558 21 SliceVec Circuit::get_reverse_slices() const {
559 21 vertex_map_t mapping;
560 21 vertex_map_t rev_mapping;
561
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 Circuit rev;
562
4/6
✓ Branch 4 taken 59 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 80 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 59 times.
✓ Branch 10 taken 21 times.
0/1
? Decision couldn't be analyzed.
80 for (const BoundaryElement& el : boundary.get<TagID>()) {
563 Vertex new_in, new_out;
564
2/2
✓ Branch 1 taken 56 times.
✓ Branch 2 taken 3 times.
2/2
✓ Decision 'true' taken 56 times.
✓ Decision 'false' taken 3 times.
59 if (el.type() == UnitType::Qubit) {
565
1/2
✓ Branch 2 taken 56 times.
✗ Branch 3 not taken.
56 new_in = rev.add_vertex(OpType::Input);
566
1/2
✓ Branch 2 taken 56 times.
✗ Branch 3 not taken.
56 new_out = rev.add_vertex(OpType::Output);
567 } else {
568
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 new_in = rev.add_vertex(OpType::ClInput);
569
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 new_out = rev.add_vertex(OpType::ClOutput);
570 }
571
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
59 mapping[el.in_] = new_out;
572
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
59 rev_mapping[new_out] = el.in_;
573
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
59 mapping[el.out_] = new_in;
574
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
59 rev_mapping[new_in] = el.out_;
575
2/4
✓ Branch 2 taken 59 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 59 times.
✗ Branch 7 not taken.
59 rev.boundary.insert({el.id_, new_in, new_out});
576 }
577
7/8
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 242 times.
✓ Branch 6 taken 21 times.
✓ Branch 8 taken 242 times.
✓ Branch 9 taken 21 times.
✓ Branch 11 taken 21 times.
✓ Branch 12 taken 21 times.
284 BGL_FORALL_VERTICES(v, dag, DAG) {
578
1/2
✓ Branch 1 taken 242 times.
✗ Branch 2 not taken.
242 const Op_ptr op_ptr = get_Op_ptr_from_Vertex(v);
579
2/2
✓ Branch 2 taken 118 times.
✓ Branch 3 taken 124 times.
242 switch (op_ptr->get_type()) {
580 118 case OpType::Input:
581 case OpType::Create:
582 case OpType::Output:
583 case OpType::Discard:
584 case OpType::ClInput:
585 case OpType::ClOutput: {
586 118 break;
587 }
588
1/1
✓ Decision 'true' taken 124 times.
124 default: {
589
1/2
✓ Branch 3 taken 124 times.
✗ Branch 4 not taken.
124 Vertex v0 = rev.add_vertex(op_ptr);
590
1/2
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
124 mapping[v] = v0;
591
1/2
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
124 rev_mapping[v0] = v;
592 124 break;
593 }
594 }
595 242 }
596
12/18
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 250 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 271 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 250 times.
✓ Branch 13 taken 21 times.
✓ Branch 15 taken 250 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 250 times.
✓ Branch 18 taken 21 times.
✓ Branch 20 taken 42 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 21 times.
✓ Branch 23 taken 21 times.
292 BGL_FORALL_EDGES(e, dag, DAG) {
597
1/2
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
250 Vertex s = source(e);
598
1/2
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
250 port_t sp = get_source_port(e);
599
1/2
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
250 Vertex t = target(e);
600
1/2
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
250 port_t tp = get_target_port(e);
601
1/2
✓ Branch 1 taken 250 times.
✗ Branch 2 not taken.
250 EdgeType type = dag[e].type;
602
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 249 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 249 times.
250 if (type == EdgeType::Boolean) {
603 // Move Boolean to read from bit wire just before next write
604
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Edge bit_wire = get_nth_out_edge(s, sp);
605
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Vertex next_on_bit = target(bit_wire);
606
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 port_t next_p = get_target_port(bit_wire);
607
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 rev.add_edge({mapping[next_on_bit], next_p}, {mapping[t], tp}, type);
608 } else {
609
3/6
✓ Branch 1 taken 249 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 249 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 249 times.
✗ Branch 10 not taken.
249 rev.add_edge({mapping[t], tp}, {mapping[s], sp}, type);
610 }
611 }
612
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
42 SliceVec slices_of_rev = rev.get_slices();
613 21 SliceVec rev_slices;
614
2/2
✓ Branch 5 taken 114 times.
✓ Branch 6 taken 21 times.
2/2
✓ Decision 'true' taken 114 times.
✓ Decision 'false' taken 21 times.
135 for (const Slice& s : slices_of_rev) {
615 114 Slice sl;
616
2/2
✓ Branch 5 taken 124 times.
✓ Branch 6 taken 114 times.
2/2
✓ Decision 'true' taken 124 times.
✓ Decision 'false' taken 114 times.
238 for (const Vertex& v : s) {
617
2/4
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 124 times.
✗ Branch 5 not taken.
124 sl.push_back(rev_mapping[v]);
618 }
619
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
114 rev_slices.push_back(sl);
620 114 }
621 42 return rev_slices;
622 21 }
623
624 55 unsigned Circuit::depth() const {
625 55 unsigned count = 0;
626 470 std::function<bool(Op_ptr)> skip_func = [&](Op_ptr op) {
627 470 return (op->get_type() == OpType::Barrier);
628 55 };
629
1/2
✓ Branch 1 taken 55 times.
✗ Branch 2 not taken.
55 Circuit::SliceIterator slice_iter(*this, skip_func);
630
3/4
✓ Branch 1 taken 55 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 43 times.
✓ Branch 6 taken 12 times.
0/1
? Decision couldn't be analyzed.
55 if (!(*slice_iter).empty()) count++;
631
3/4
✓ Branch 1 taken 199 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 144 times.
✓ Branch 4 taken 55 times.
0/1
? Decision couldn't be analyzed.
199 while (!slice_iter.finished()) {
632
1/2
✓ Branch 3 taken 144 times.
✗ Branch 4 not taken.
288 slice_iter.cut_ = this->next_cut(
633 144 slice_iter.cut_.u_frontier, slice_iter.cut_.b_frontier, skip_func);
634
3/4
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 143 times.
✓ Branch 6 taken 1 times.
2/2
✓ Decision 'true' taken 55 times.
✓ Decision 'false' taken 89 times.
144 if (!(*slice_iter).empty()) count++;
635 }
636 55 return count;
637 55 }
638
639 38 unsigned Circuit::depth_by_type(OpType _type) const {
640 38 unsigned count = 0;
641 478 std::function<bool(Op_ptr)> skip_func = [&](Op_ptr op) {
642 478 return (op->get_type() != _type);
643 38 };
644
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
38 Circuit::SliceIterator slice_iter(*this, skip_func);
645
3/4
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 36 times.
✓ Branch 6 taken 2 times.
0/1
? Decision couldn't be analyzed.
38 if (!(*slice_iter).empty()) count++;
646
3/4
✓ Branch 1 taken 143 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 105 times.
✓ Branch 4 taken 38 times.
0/1
? Decision couldn't be analyzed.
143 while (!slice_iter.finished()) {
647
1/2
✓ Branch 3 taken 105 times.
✗ Branch 4 not taken.
210 slice_iter.cut_ = this->next_cut(
648 105 slice_iter.cut_.u_frontier, slice_iter.cut_.b_frontier, skip_func);
649
3/4
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✓ Branch 6 taken 5 times.
2/2
✓ Decision 'true' taken 38 times.
✓ Decision 'false' taken 67 times.
105 if (!(*slice_iter).empty()) count++;
650 }
651 38 return count;
652 38 }
653
654 1 unsigned Circuit::depth_by_types(const OpTypeSet& _types) const {
655 1 unsigned count = 0;
656 7 std::function<bool(Op_ptr)> skip_func = [&](Op_ptr op) {
657
1/2
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 return (_types.find(op->get_type()) == _types.end());
658 1 };
659
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Circuit::SliceIterator slice_iter(*this, skip_func);
660
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
0/1
? Decision couldn't be analyzed.
1 if (!(*slice_iter).empty()) count++;
661
3/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
0/1
? Decision couldn't be analyzed.
2 while (!slice_iter.finished()) {
662
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 slice_iter.cut_ = this->next_cut(
663 1 slice_iter.cut_.u_frontier, slice_iter.cut_.b_frontier, skip_func);
664
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1/2
✓ Decision 'true' taken 1 times.
✗ Decision 'false' not taken.
1 if (!(*slice_iter).empty()) count++;
665 }
666 1 return count;
667 1 }
668
669 198 std::map<Vertex, unit_set_t> Circuit::vertex_unit_map() const {
670 198 std::map<Vertex, unit_set_t> map;
671
9/12
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13240 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13240 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 13240 times.
✓ Branch 12 taken 198 times.
✓ Branch 14 taken 13240 times.
✓ Branch 15 taken 198 times.
✓ Branch 17 taken 198 times.
✓ Branch 18 taken 198 times.
13636 BGL_FORALL_VERTICES(v, dag, DAG) { map[v] = {}; }
672
3/4
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 8 taken 570 times.
✓ Branch 9 taken 198 times.
0/1
? Decision couldn't be analyzed.
768 for (const std::pair<const UnitID, QPathDetailed>& path : all_unit_paths()) {
673
2/2
✓ Branch 5 taken 15307 times.
✓ Branch 6 taken 570 times.
2/2
✓ Decision 'true' taken 15307 times.
✓ Decision 'false' taken 570 times.
15877 for (const VertPort& vp : path.second) {
674
2/4
✓ Branch 1 taken 15307 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15307 times.
✗ Branch 5 not taken.
15307 map[vp.first].insert(path.first);
675 }
676 198 }
677 198 return map;
678 }
679
680 17 std::map<Vertex, unsigned> Circuit::vertex_depth_map() const {
681 17 std::map<Vertex, unsigned> map;
682 17 unsigned i = 0;
683
5/8
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 122 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 122 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 105 times.
✓ Branch 11 taken 17 times.
0/1
? Decision couldn't be analyzed.
122 for (SliceIterator it = slice_begin(); it != slice_end(); ++it) {
684
3/4
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 111 times.
✓ Branch 8 taken 105 times.
0/1
? Decision couldn't be analyzed.
216 for (const Vertex& v : *it) {
685
1/2
✓ Branch 1 taken 111 times.
✗ Branch 2 not taken.
111 map[v] = i;
686 105 }
687
1/2
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
105 i++;
688 17 }
689
4/6
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 64 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 47 times.
✓ Branch 9 taken 17 times.
0/1
? Decision couldn't be analyzed.
64 for (const BoundaryElement& el : boundary) {
690
1/2
✓ Branch 1 taken 47 times.
✗ Branch 2 not taken.
47 map[el.in_] = 0;
691
2/4
✓ Branch 1 taken 47 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 47 times.
✗ Branch 5 not taken.
47 map[el.out_] = i;
692 }
693 17 return map;
694 }
695
696 17 std::map<Vertex, unsigned> Circuit::vertex_rev_depth_map() const {
697 17 std::map<Vertex, unsigned> map;
698
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 SliceVec slices = get_reverse_slices();
699
2/2
✓ Branch 1 taken 105 times.
✓ Branch 2 taken 17 times.
2/2
✓ Decision 'true' taken 105 times.
✓ Decision 'false' taken 17 times.
122 for (unsigned i = 0; i < slices.size(); i++) {
700
2/2
✓ Branch 5 taken 111 times.
✓ Branch 6 taken 105 times.
2/2
✓ Decision 'true' taken 111 times.
✓ Decision 'false' taken 105 times.
216 for (const Vertex& v : slices[i]) {
701
1/2
✓ Branch 1 taken 111 times.
✗ Branch 2 not taken.
111 map[v] = i;
702 }
703 }
704
4/6
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 64 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 47 times.
✓ Branch 9 taken 17 times.
0/1
? Decision couldn't be analyzed.
64 for (const BoundaryElement& el : boundary) {
705
1/2
✓ Branch 2 taken 47 times.
✗ Branch 3 not taken.
47 map[el.in_] = slices.size();
706
2/4
✓ Branch 1 taken 47 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 47 times.
✗ Branch 5 not taken.
47 map[el.out_] = 0;
707 }
708 34 return map;
709 17 }
710
711 181 std::map<Edge, UnitID> Circuit::edge_unit_map() const {
712 181 std::map<Edge, UnitID> map;
713
3/4
✓ Branch 1 taken 181 times.
✗ Branch 2 not taken.
✓ Branch 8 taken 523 times.
✓ Branch 9 taken 181 times.
0/1
? Decision couldn't be analyzed.
704 for (const std::pair<const UnitID, QPathDetailed>& path : all_unit_paths()) {
714 523 QPathDetailed::const_iterator it = path.second.begin();
715
2/2
✓ Branch 3 taken 14516 times.
✓ Branch 4 taken 523 times.
2/2
✓ Decision 'true' taken 14516 times.
✓ Decision 'false' taken 523 times.
15039 for (++it; it != path.second.end(); ++it) {
716
2/4
✓ Branch 3 taken 14516 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 14516 times.
✗ Branch 8 not taken.
14516 map.insert({get_nth_in_edge(it->first, it->second), path.first});
717 }
718 181 }
719 181 return map;
720 }
721
722 /*SliceIterator related methods*/
723 23410 Circuit::SliceIterator::SliceIterator(const Circuit& circ)
724 23410 : cut_(), circ_(&circ) {
725
1/2
✓ Branch 1 taken 23410 times.
✗ Branch 2 not taken.
23410 cut_.init();
726
3/4
✓ Branch 1 taken 23410 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 48855 times.
✓ Branch 8 taken 23410 times.
0/1
? Decision couldn't be analyzed.
72265 for (const Qubit& q : circ.all_qubits()) {
727
1/2
✓ Branch 1 taken 48855 times.
✗ Branch 2 not taken.
48855 Vertex in = circ.get_in(q);
728
1/2
✓ Branch 2 taken 48855 times.
✗ Branch 3 not taken.
48855 cut_.slice->push_back(in);
729
2/4
✓ Branch 2 taken 48855 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 48855 times.
✗ Branch 7 not taken.
48855 cut_.u_frontier->insert({q, circ.get_nth_out_edge(in, 0)});
730 23410 }
731
3/4
✓ Branch 1 taken 23410 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 665 times.
✓ Branch 8 taken 23410 times.
0/1
? Decision couldn't be analyzed.
24075 for (const Bit& b : circ.all_bits()) {
732
1/2
✓ Branch 1 taken 665 times.
✗ Branch 2 not taken.
665 Vertex in = circ.get_in(b);
733
1/2
✓ Branch 2 taken 665 times.
✗ Branch 3 not taken.
665 cut_.slice->push_back(in);
734
2/4
✓ Branch 2 taken 665 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 665 times.
✗ Branch 7 not taken.
665 cut_.b_frontier->insert({b, circ.get_nth_b_out_bundle(in, 0)});
735
2/4
✓ Branch 2 taken 665 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 665 times.
✗ Branch 7 not taken.
665 cut_.u_frontier->insert({b, circ.get_nth_out_edge(in, 0)});
736 23410 }
737 23410 prev_b_frontier_ = cut_.b_frontier;
738
1/2
✓ Branch 3 taken 23410 times.
✗ Branch 4 not taken.
23410 cut_ = circ.next_cut(cut_.u_frontier, cut_.b_frontier);
739
740 // Add all vertices that have no Quantum or Classical edges (e.g. Phase) and
741 // no Boolean inputs:
742 23410 VertexSet loners;
743
7/8
✓ Branch 1 taken 23410 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 417914 times.
✓ Branch 6 taken 23403 times.
✓ Branch 8 taken 417914 times.
✓ Branch 9 taken 23403 times.
✓ Branch 11 taken 23403 times.
✓ Branch 12 taken 23410 times.
464727 BGL_FORALL_VERTICES(v, circ.dag, DAG) {
744
1/2
✓ Branch 1 taken 417914 times.
✗ Branch 2 not taken.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 417913 times.
417914 if (circ.n_in_edges(v) == 0 &&
745
7/8
✓ Branch 0 taken 49521 times.
✓ Branch 1 taken 368393 times.
✓ Branch 3 taken 49521 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 666 times.
✓ Branch 6 taken 48855 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 417913 times.
418580 circ.n_out_edges_of_type(v, EdgeType::Quantum) == 0 &&
746
3/4
✓ Branch 1 taken 666 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 665 times.
666 circ.n_out_edges_of_type(v, EdgeType::Classical) == 0) {
747
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 loners.insert(v);
748 }
749 }
750
1/2
✓ Branch 7 taken 23410 times.
✗ Branch 8 not taken.
23410 cut_.slice->insert(cut_.slice->end(), loners.begin(), loners.end());
751 23410 }
752
753 116 Circuit::SliceIterator::SliceIterator(
754 116 const Circuit& circ, const std::function<bool(Op_ptr)>& skip_func)
755 116 : cut_(), circ_(&circ) {
756
1/2
✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
116 cut_.init();
757
3/4
✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 347 times.
✓ Branch 8 taken 116 times.
0/1
? Decision couldn't be analyzed.
463 for (const Qubit& q : circ.all_qubits()) {
758
1/2
✓ Branch 1 taken 347 times.
✗ Branch 2 not taken.
347 Vertex in = circ.get_in(q);
759
2/4
✓ Branch 2 taken 347 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 347 times.
✗ Branch 7 not taken.
347 cut_.u_frontier->insert({q, circ.get_nth_out_edge(in, 0)});
760 116 }
761
3/4
✓ Branch 1 taken 116 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 116 times.
0/1
? Decision couldn't be analyzed.
128 for (const Bit& b : circ.all_bits()) {
762
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 Vertex in = circ.get_in(b);
763
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
12 cut_.b_frontier->insert({b, circ.get_nth_b_out_bundle(in, 0)});
764
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
12 cut_.u_frontier->insert({b, circ.get_nth_out_edge(in, 0)});
765 116 }
766 116 prev_b_frontier_ = cut_.b_frontier;
767
1/2
✓ Branch 3 taken 116 times.
✗ Branch 4 not taken.
116 cut_ = circ.next_cut(cut_.u_frontier, cut_.b_frontier, skip_func);
768 116 }
769
770 23410 Circuit::SliceIterator Circuit::slice_begin() const {
771 23410 return Circuit::SliceIterator(*this);
772 }
773
774 58214 Circuit::SliceIterator Circuit::slice_end() { return nullsit; }
775 const Circuit::SliceIterator Circuit::nullsit = Circuit::SliceIterator();
776
777 12 Circuit::SliceIterator::Sliceholder Circuit::SliceIterator::operator++(int) {
778
1/2
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
12 Sliceholder ret(*cut_.slice);
779
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 ++*this;
780 12 return ret;
781 }
782
783 223432 Circuit::SliceIterator& Circuit::SliceIterator::operator++() {
784
2/2
✓ Branch 1 taken 6839 times.
✓ Branch 2 taken 216593 times.
2/2
✓ Decision 'true' taken 6839 times.
✓ Decision 'false' taken 216593 times.
223432 if (this->finished()) {
785 6839 *this = circ_->slice_end();
786 6839 return *this;
787 }
788 216593 prev_b_frontier_ = cut_.b_frontier;
789
1/2
✓ Branch 3 taken 216593 times.
✗ Branch 4 not taken.
216593 cut_ = circ_->next_cut(cut_.u_frontier, cut_.b_frontier);
790 216593 return *this;
791 }
792
793 419202 bool Circuit::SliceIterator::finished() const {
794 419202 for (const std::pair<UnitID, Edge>& pair :
795
5/8
✓ Branch 5 taken 566511 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 170482 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 589684 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 566511 times.
✓ Branch 14 taken 23173 times.
1008886 this->cut_.u_frontier->get<TagKey>()) {
796
4/6
✓ Branch 1 taken 566511 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 566511 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 396029 times.
✓ Branch 7 taken 170482 times.
2/2
✓ Decision 'true' taken 23173 times.
✓ Decision 'false' taken 543338 times.
566511 if (!circ_->detect_final_Op(circ_->target(pair.second))) return false;
797 }
798 23173 for (const std::pair<Bit, EdgeVec>& pair :
799
2/8
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 11 taken 23173 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 23173 times.
46346 this->cut_.b_frontier->get<TagKey>()) {
800
0/1
? Decision couldn't be analyzed.
if (!pair.second.empty()) return false;
801 }
802 23173 return true;
803 }
804
805 16469 Circuit::CommandIterator::CommandIterator(const Circuit& circ)
806
1/2
✓ Branch 1 taken 16469 times.
✗ Branch 2 not taken.
16469 : current_slice_iterator_(circ.slice_begin()),
807 16469 current_index_(0),
808 16469 circ_(&circ) {
809
3/4
✓ Branch 1 taken 16469 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 115 times.
✓ Branch 6 taken 16354 times.
2/2
✓ Decision 'true' taken 115 times.
✓ Decision 'false' taken 16354 times.
16469 if ((*current_slice_iterator_).size() == 0)
810
2/4
✓ Branch 1 taken 115 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 115 times.
✗ Branch 5 not taken.
115 *this = circ.end();
811 else {
812
1/2
✓ Branch 1 taken 16354 times.
✗ Branch 2 not taken.
16354 current_vertex_ = (*current_slice_iterator_)[0];
813 16354 current_command_ = circ.command_from_vertex(
814
1/2
✓ Branch 2 taken 16354 times.
✗ Branch 3 not taken.
32708 current_vertex_, current_slice_iterator_.get_u_frontier(),
815 49062 current_slice_iterator_.get_prev_b_frontier());
816 }
817 16469 }
818
819 16469 Circuit::CommandIterator Circuit::begin() const {
820 16469 return CommandIterator(*this);
821 }
822
823 323904 const Circuit::CommandIterator Circuit::end() const { return nullcit; }
824
825 const Circuit::CommandIterator Circuit::nullcit = CommandIterator();
826
827 3 Circuit::CommandIterator::Commandholder Circuit::CommandIterator::operator++(
828 int) {
829
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 Commandholder ret(current_command_);
830
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 ++*this;
831 3 return ret;
832 }
833
834 249764 Circuit::CommandIterator& Circuit::CommandIterator::operator++() {
835
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 249764 times.
1/2
✓ Decision 'true' taken 249764 times.
✗ Decision 'false' not taken.
249764 if (*this == circ_->end()) return *this;
836
2/2
✓ Branch 3 taken 195216 times.
✓ Branch 4 taken 54548 times.
2/2
✓ Decision 'true' taken 195216 times.
✓ Decision 'false' taken 54548 times.
249764 if (current_index_ == (*current_slice_iterator_).size() - 1) {
837
2/2
✓ Branch 1 taken 16218 times.
✓ Branch 2 taken 178998 times.
2/2
✓ Decision 'true' taken 16218 times.
✓ Decision 'false' taken 178998 times.
195216 if (current_slice_iterator_.finished()) {
838
1/2
✓ Branch 2 taken 16218 times.
✗ Branch 3 not taken.
16218 *this = circ_->end();
839 16218 return *this;
840 }
841 178998 ++current_slice_iterator_;
842 178998 current_index_ = 0;
843 } else
844 54548 ++current_index_;
845 233546 current_vertex_ = (*current_slice_iterator_)[current_index_];
846 233546 current_command_ = circ_->command_from_vertex(
847
1/2
✓ Branch 2 taken 233546 times.
✗ Branch 3 not taken.
467092 current_vertex_, current_slice_iterator_.get_u_frontier(),
848 700638 current_slice_iterator_.get_prev_b_frontier());
849 233546 return *this;
850 }
851
852 249918 unit_vector_t Circuit::args_from_frontier(
853 const Vertex& vert, std::shared_ptr<const unit_frontier_t> u_frontier,
854 std::shared_ptr<const b_frontier_t> prev_b_frontier) const {
855
1/2
✓ Branch 1 taken 249918 times.
✗ Branch 2 not taken.
249918 EdgeVec ins = get_in_edges(vert);
856 249918 unit_vector_t args;
857
2/2
✓ Branch 1 taken 359577 times.
✓ Branch 2 taken 249916 times.
2/2
✓ Decision 'true' taken 359577 times.
✓ Decision 'false' taken 249916 times.
609493 for (port_t p = 0; p < ins.size(); ++p) {
858
3/4
✓ Branch 2 taken 359577 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3405 times.
✓ Branch 5 taken 356172 times.
2/2
✓ Decision 'true' taken 3405 times.
✓ Decision 'false' taken 356172 times.
359577 if (get_edgetype(ins[p]) == EdgeType::Boolean) {
859 3405 bool found = false;
860 3405 for (const std::pair<Bit, EdgeVec>& pair :
861
4/8
✓ Branch 5 taken 15548 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 12143 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 15548 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 15548 times.
✗ Branch 14 not taken.
18953 prev_b_frontier->get<TagKey>()) {
862
2/2
✓ Branch 5 taken 676576 times.
✓ Branch 6 taken 12143 times.
2/2
✓ Decision 'true' taken 676576 times.
✓ Decision 'false' taken 12143 times.
688719 for (const Edge& edge : pair.second) {
863
3/4
✓ Branch 2 taken 676576 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3405 times.
✓ Branch 5 taken 673171 times.
2/2
✓ Decision 'true' taken 3405 times.
✓ Decision 'false' taken 673171 times.
676576 if (edge == ins[p]) {
864
1/2
✓ Branch 1 taken 3405 times.
✗ Branch 2 not taken.
3405 args.push_back(pair.first);
865 3405 found = true;
866 3405 break;
867 }
868 }
869
2/2
✓ Branch 0 taken 3405 times.
✓ Branch 1 taken 12143 times.
2/2
✓ Decision 'true' taken 3405 times.
✓ Decision 'false' taken 12143 times.
15548 if (found) break;
870 }
871
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3405 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 3405 times.
3405 if (!found)
872 throw CircuitInvalidity(
873 "Vertex edges not found in CRead frontier. Edge: " +
874 get_Op_ptr_from_Vertex(source(ins[p]))->get_name() + " -> " +
875 get_Op_ptr_from_Vertex(target(ins[p]))->get_name());
876 } else {
877
1/2
✓ Branch 2 taken 356172 times.
✗ Branch 3 not taken.
356172 Edge out = get_next_edge(vert, ins[p]);
878 356172 bool found = false;
879
5/8
✓ Branch 5 taken 1610472 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1254302 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1610474 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1610472 times.
✓ Branch 14 taken 2 times.
0/1
? Decision couldn't be analyzed.
1610474 for (const std::pair<UnitID, Edge>& pair : u_frontier->get<TagKey>()) {
880
3/4
✓ Branch 1 taken 1610472 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 356170 times.
✓ Branch 4 taken 1254302 times.
2/2
✓ Decision 'true' taken 356170 times.
✓ Decision 'false' taken 1254302 times.
1610472 if (pair.second == out) {
881
1/2
✓ Branch 1 taken 356170 times.
✗ Branch 2 not taken.
356170 args.push_back(pair.first);
882 356170 found = true;
883 356170 break;
884 }
885 }
886
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 356170 times.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 356170 times.
356172 if (!found)
887
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 throw CircuitInvalidity(
888
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 "Vertex edges not found in frontier. Edge: " +
889
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
6 get_Op_ptr_from_Vertex(source(out))->get_name() + " -> " +
890
3/6
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
4 get_Op_ptr_from_Vertex(target(out))->get_name());
891 }
892 }
893 499832 return args;
894 249920 }
895
896 249911 Command Circuit::command_from_vertex(
897 const Vertex& vert, std::shared_ptr<const unit_frontier_t> u_frontier,
898 std::shared_ptr<const b_frontier_t> prev_b_frontier) const {
899
1/2
✓ Branch 3 taken 249911 times.
✗ Branch 4 not taken.
499822 unit_vector_t args = args_from_frontier(vert, u_frontier, prev_b_frontier);
900 return Command(
901
5/10
✓ Branch 1 taken 249911 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 249911 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 249911 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 249911 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 249911 times.
✗ Branch 14 not taken.
749733 get_Op_ptr_from_Vertex(vert), args, get_opgroup_from_Vertex(vert), vert);
902 249911 }
903
904 } // namespace tket
905