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 |