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 | #include "Replacement.hpp" | |||
16 | ||||
17 | #include "Circuit/CircPool.hpp" | |||
18 | #include "Circuit/CircUtils.hpp" | |||
19 | #include "Circuit/Circuit.hpp" | |||
20 | #include "Decomposition.hpp" | |||
21 | #include "Gate/GatePtr.hpp" | |||
22 | #include "Gate/GateUnitaryMatrix.hpp" | |||
23 | #include "OpType/OpType.hpp" | |||
24 | #include "OpType/OpTypeInfo.hpp" | |||
25 | #include "Transform.hpp" | |||
26 | ||||
27 | namespace tket { | |||
28 | ||||
29 | using namespace Transforms; | |||
30 | ||||
31 | 36 | static Circuit multi_controlled_to_2q( | ||
32 | const Op_ptr op, const OpType& two_q_type) { | |||
33 | 36 | unsigned n_qubits = op->n_qubits(); | ||
34 | 36 | OpType optype = op->get_type(); | ||
35 |
1/2✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
|
36 | Circuit c(n_qubits); | |
36 |
2/3✓ Branch 0 taken 11 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
|
36 | switch (optype) { | |
37 |
1/1✓ Decision 'true' taken 11 times.
|
11 | case OpType::CnRy: | |
38 |
2/4✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 11 times.
✗ Branch 6 not taken.
|
11 | c = CircPool::CnRy_normal_decomp(op, n_qubits); | |
39 | 11 | break; | ||
40 | 25 | case OpType::CnX: | ||
41 | case OpType::CnZ: | |||
42 | case OpType::CnY: | |||
43 |
3/4✓ Branch 0 taken 6 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
|
2/2✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 19 times.
|
25 | if (n_qubits >= 6 && n_qubits <= 50) { |
44 | // CnU_linear_depth_decomp performs better in this case | |||
45 | 6 | OpType target_type = | ||
46 | (optype == OpType::CnX) | |||
47 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
10 | ? OpType::X | |
48 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
4 | : ((optype == OpType::CnZ) ? OpType::Z : OpType::Y); | |
49 | Eigen::Matrix2cd target_u = | |||
50 |
2/4✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
|
6 | GateUnitaryMatrix::get_unitary(target_type, 1, {}); | |
51 |
2/4✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
|
6 | c = CircPool::CnU_linear_depth_decomp(n_qubits - 1, target_u); | |
52 | 6 | } else { | ||
53 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 14 times.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 14 times.
|
19 | if (optype == OpType::CnZ) { |
54 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
|
5 | c.add_op<unsigned>(OpType::H, {n_qubits - 1}); | |
55 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 9 times.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 9 times.
|
14 | } else if (optype == OpType::CnY) { |
56 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
|
5 | c.add_op<unsigned>(OpType::Sdg, {n_qubits - 1}); | |
57 | } | |||
58 |
2/4✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
|
19 | c.append(CircPool::CnX_normal_decomp(n_qubits - 1)); | |
59 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 14 times.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 14 times.
|
19 | if (optype == OpType::CnZ) { |
60 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
|
5 | c.add_op<unsigned>(OpType::H, {n_qubits - 1}); | |
61 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 9 times.
|
2/2✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 9 times.
|
14 | } else if (optype == OpType::CnY) { |
62 |
2/4✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
|
5 | c.add_op<unsigned>(OpType::S, {n_qubits - 1}); | |
63 | } | |||
64 | } | |||
65 | 25 | break; | ||
66 |
0/1✗ Decision 'true' not taken.
|
✗ | default: | |
67 | ✗ | throw BadOpType("The operation is not multi-controlled", optype); | ||
68 | } | |||
69 | ||||
70 |
2/2✓ Branch 0 taken 22 times.
✓ Branch 1 taken 14 times.
|
2/2✓ Decision 'true' taken 22 times.
✓ Decision 'false' taken 14 times.
|
36 | if (two_q_type == OpType::CX) { |
71 |
2/4✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 22 times.
✗ Branch 5 not taken.
|
22 | decompose_multi_qubits_CX().apply(c); | |
72 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
1/2✓ Decision 'true' taken 14 times.
✗ Decision 'false' not taken.
|
14 | } else if (two_q_type == OpType::TK2) { |
73 |
2/4✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 | decompose_multi_qubits_TK2().apply(c); | |
74 | } else { | |||
75 | ✗ | throw BadOpType("The target 2-q gate can only be CX or TK2", optype); | ||
76 | } | |||
77 | 36 | return c; | ||
78 | } | |||
79 | ||||
80 | 1126 | Circuit TK2_circ_from_multiq(const Op_ptr op) { | ||
81 |
1/2✓ Branch 2 taken 1126 times.
✗ Branch 3 not taken.
|
1126 | OpDesc desc = op->get_desc(); | |
82 |
2/4✓ Branch 1 taken 1126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1126 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 1126 times.
|
1126 | if (!desc.is_gate()) |
83 | ✗ | throw BadOpType( | ||
84 | ✗ | "Can only build replacement circuits for basic gates", desc.type()); | ||
85 |
3/4✓ Branch 1 taken 1126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 1112 times.
|
1126 | switch (desc.type()) { | |
86 | 14 | case OpType::CnRy: | ||
87 | case OpType::CnX: | |||
88 | case OpType::CnZ: | |||
89 | case OpType::CnY: | |||
90 | // TODO We should be able to do better than this. | |||
91 |
1/2✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
|
14 | return multi_controlled_to_2q(op, OpType::TK2); | |
92 |
1/1✓ Decision 'true' taken 2224 times.
|
1112 | default: | |
93 |
2/4✓ Branch 2 taken 1112 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1112 times.
✗ Branch 6 not taken.
|
2224 | return with_TK2(as_gate_ptr(op)); | |
94 | } | |||
95 | 1126 | } | ||
96 | ||||
97 | 904 | Circuit CX_circ_from_multiq(const Op_ptr op) { | ||
98 |
1/2✓ Branch 2 taken 904 times.
✗ Branch 3 not taken.
|
904 | OpDesc desc = op->get_desc(); | |
99 |
3/4✓ Branch 1 taken 904 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 903 times.
|
2/2✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 903 times.
|
904 | if (!desc.is_gate()) |
100 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
|
1 | throw BadOpType( | |
101 | 2 | "Can only build replacement circuits for basic gates", desc.type()); | ||
102 |
3/4✓ Branch 1 taken 903 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✓ Branch 4 taken 881 times.
|
903 | switch (desc.type()) { | |
103 | 22 | case OpType::CnRy: | ||
104 | case OpType::CnX: | |||
105 | case OpType::CnZ: | |||
106 | case OpType::CnY: | |||
107 |
1/2✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
|
22 | return multi_controlled_to_2q(op, OpType::CX); | |
108 |
1/1✓ Decision 'true' taken 1762 times.
|
881 | default: | |
109 |
2/4✓ Branch 2 taken 881 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 881 times.
✗ Branch 6 not taken.
|
1762 | return with_CX(as_gate_ptr(op)); | |
110 | } | |||
111 | 904 | } | ||
112 | ||||
113 | 39 | Circuit CX_ZX_circ_from_op(const Op_ptr op) { | ||
114 |
1/2✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
|
39 | OpDesc desc = op->get_desc(); | |
115 |
3/4✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 38 times.
|
2/2✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 38 times.
|
39 | if (!desc.is_gate()) |
116 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
|
1 | throw BadOpType( | |
117 | 2 | "Can only build replacement circuits for basic gates", desc.type()); | ||
118 |
20/25✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 19 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
|
38 | switch (desc.type()) { | |
119 |
0/1✗ Decision 'true' not taken.
|
✗ | case OpType::Phase: { | |
120 | ✗ | Circuit replacement(0); | ||
121 | ✗ | replacement.add_phase(op->get_params()[0]); | ||
122 | ✗ | return replacement; | ||
123 | } | |||
124 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Z: { | |
125 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
126 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 1., {0}); | |
127 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.5); | |
128 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
129 | 1 | } | ||
130 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::X: { | |
131 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
132 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 1., {0}); | |
133 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.5); | |
134 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
135 | 1 | } | ||
136 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Y: { | |
137 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
138 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 1., {0}); | |
139 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 1., {0}); | |
140 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(-0.5); | |
141 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
142 | 1 | } | ||
143 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::S: { | |
144 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
145 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 0.5, {0}); | |
146 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.25); | |
147 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
148 | 1 | } | ||
149 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Sdg: { | |
150 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
151 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, -0.5, {0}); | |
152 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(-0.25); | |
153 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
154 | 1 | } | ||
155 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::T: { | |
156 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
157 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 0.25, {0}); | |
158 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.125); | |
159 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
160 | 1 | } | ||
161 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Tdg: { | |
162 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
163 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, -0.25, {0}); | |
164 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(-0.125); | |
165 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
166 | 1 | } | ||
167 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::V: { | |
168 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
169 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 0.5, {0}); | |
170 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
171 | 1 | } | ||
172 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Vdg: { | |
173 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
174 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, -0.5, {0}); | |
175 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
176 | 1 | } | ||
177 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::SX: { | |
178 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
179 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 0.5, {0}); | |
180 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.25); | |
181 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
182 | 1 | } | ||
183 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::SXdg: { | |
184 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
185 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, -0.5, {0}); | |
186 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(-0.25); | |
187 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
188 | 1 | } | ||
189 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::H: { | |
190 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
191 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 0.5, {0}); | |
192 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 0.5, {0}); | |
193 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 0.5, {0}); | |
194 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | replacement.add_phase(0.5); | |
195 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
196 | 1 | } | ||
197 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::Ry: { | |
198 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle = op->get_params()[0]; | |
199 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
200 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, -0.5, {0}); | |
201 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, angle, {0}); | |
202 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, 0.5, {0}); | |
203 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
204 | 1 | } | ||
205 | 2 | case OpType::Rx: | ||
206 | case OpType::Rz: | |||
207 | case OpType::Measure: | |||
208 | case OpType::Collapse: { | |||
209 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | Circuit replacement(1); | |
210 |
2/4✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2 | replacement.add_op<unsigned>(op, {0}); | |
211 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | return replacement; | |
212 | 2 | } | ||
213 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::U3: { | |
214 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
215 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle_z1 = op->get_params()[2]; | |
216 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle_y = op->get_params()[0]; | |
217 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle_z2 = op->get_params()[1]; | |
218 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, angle_z1 - 0.5, {0}); | |
219 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, angle_y, {0}); | |
220 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, angle_z2 + 0.5, {0}); | |
221 |
4/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | replacement.add_phase((angle_z1 + angle_z2) / 2); | |
222 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
223 | 1 | } | ||
224 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::U2: { | |
225 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
226 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle_z1 = op->get_params()[1]; | |
227 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle_z2 = op->get_params()[0]; | |
228 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, angle_z1 - 0.5, {0}); | |
229 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, 0.5, {0}); | |
230 |
4/8✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, angle_z2 + 0.5, {0}); | |
231 |
4/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
|
1 | replacement.add_phase((angle_z1 + angle_z2) / 2); | |
232 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
233 | 1 | } | ||
234 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::U1: { | |
235 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
236 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr angle = op->get_params()[0]; | |
237 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, angle, {0}); | |
238 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
1 | replacement.add_phase(angle / 2); | |
239 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
240 | 1 | } | ||
241 |
1/1✓ Decision 'true' taken 1 times.
|
1 | case OpType::PhasedX: { | |
242 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | Circuit replacement(1); | |
243 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr theta = op->get_params()[0]; | |
244 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | Expr phi = op->get_params()[1]; | |
245 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, -phi, {0}); | |
246 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rx, theta, {0}); | |
247 |
2/4✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
1 | replacement.add_op<unsigned>(OpType::Rz, phi, {0}); | |
248 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | return replacement; | |
249 | 1 | } | ||
250 |
0/1✗ Decision 'true' not taken.
|
✗ | case OpType::CX: { | |
251 | ✗ | Circuit replacement(2); | ||
252 | ✗ | replacement.add_op<unsigned>(op, {0, 1}); | ||
253 | ✗ | return replacement; | ||
254 | } | |||
255 | 19 | case OpType::TK2: | ||
256 | case OpType::CY: | |||
257 | case OpType::CZ: | |||
258 | case OpType::CH: | |||
259 | case OpType::CV: | |||
260 | case OpType::CVdg: | |||
261 | case OpType::CSX: | |||
262 | case OpType::CSXdg: | |||
263 | case OpType::CRz: | |||
264 | case OpType::CRx: | |||
265 | case OpType::CRy: | |||
266 | case OpType::CU1: | |||
267 | case OpType::CU3: | |||
268 | case OpType::PhaseGadget: | |||
269 | case OpType::CCX: | |||
270 | case OpType::SWAP: | |||
271 | case OpType::CSWAP: | |||
272 | case OpType::ECR: | |||
273 | case OpType::ISWAP: | |||
274 | case OpType::XXPhase: | |||
275 | case OpType::XXPhase3: | |||
276 | case OpType::ZZMax: | |||
277 | case OpType::ZZPhase: | |||
278 | case OpType::YYPhase: | |||
279 | case OpType::CnRy: | |||
280 | case OpType::CnX: | |||
281 | case OpType::ESWAP: | |||
282 | case OpType::FSim: | |||
283 | case OpType::Sycamore: | |||
284 | case OpType::ISWAPMax: | |||
285 | case OpType::BRIDGE: { | |||
286 |
1/2✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
|
19 | Circuit replacement = CX_circ_from_multiq(op); | |
287 |
2/4✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
|
19 | decompose_ZX().apply(replacement); | |
288 |
1/2✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
|
19 | return replacement; | |
289 | 19 | } | ||
290 |
0/1✗ Decision 'true' not taken.
|
✗ | case OpType::TK1: { | |
291 | ✗ | Circuit replacement(1); | ||
292 | ✗ | std::vector<Expr> params = op->get_params(); | ||
293 | ✗ | replacement.add_op<unsigned>(OpType::Rz, params[2], {0}); | ||
294 | ✗ | replacement.add_op<unsigned>(OpType::Rx, params[1], {0}); | ||
295 | ✗ | replacement.add_op<unsigned>(OpType::Rz, params[0], {0}); | ||
296 | ✗ | return replacement; | ||
297 | } | |||
298 |
0/1✗ Decision 'true' not taken.
|
✗ | default: | |
299 | ✗ | throw BadOpType("Cannot find replacement circuit", desc.type()); | ||
300 | } | |||
301 | 39 | } | ||
302 | ||||
303 | } // namespace tket | |||
304 |