|
16 | 16 | import os |
17 | 17 |
|
18 | 18 | from numpy import pi |
| 19 | +import scipy |
19 | 20 |
|
20 | 21 | from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit |
21 | 22 | from qiskit import transpile |
|
33 | 34 | XGate, |
34 | 35 | SXGate, |
35 | 36 | CXGate, |
| 37 | + RXGate, |
| 38 | + RZZGate, |
36 | 39 | ) |
37 | 40 | from qiskit.converters import circuit_to_dag, dag_to_circuit, circuit_to_instruction |
38 | 41 | from qiskit.exceptions import QiskitError |
| 42 | +from qiskit.providers.fake_provider import GenericBackendV2 |
39 | 43 | from qiskit.quantum_info import Operator |
40 | 44 | from qiskit.transpiler.target import Target, InstructionProperties |
41 | 45 | from qiskit.transpiler.exceptions import TranspilerError |
42 | 46 | from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions |
| 47 | +from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager |
43 | 48 | from qiskit.circuit.library.standard_gates.equivalence_library import ( |
44 | 49 | StandardEquivalenceLibrary as std_eqlib, |
45 | 50 | ) |
@@ -1223,3 +1228,48 @@ def __init__(self): |
1223 | 1228 |
|
1224 | 1229 | out = BasisTranslator(eq_lib, {"my_h", "my_cx"}, target)(qc) |
1225 | 1230 | self.assertEqual(out, expected) |
| 1231 | + |
| 1232 | + def test_fractional_gate_in_basis_from_string(self): |
| 1233 | + """Test transpiling with RZZ in basis with only basis_gates option.""" |
| 1234 | + num_qubits = 2 |
| 1235 | + seed = 9169 |
| 1236 | + basis_gates = ["rz", "rx", "rzz"] |
| 1237 | + qc = QuantumCircuit(num_qubits) |
| 1238 | + mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed) |
| 1239 | + qc.unitary(mat, range(num_qubits)) |
| 1240 | + pm = generate_preset_pass_manager( |
| 1241 | + optimization_level=1, basis_gates=basis_gates, seed_transpiler=134 |
| 1242 | + ) |
| 1243 | + cqc = pm.run(qc) |
| 1244 | + self.assertEqual(Operator(qc), Operator(cqc)) |
| 1245 | + |
| 1246 | + def test_fractional_gate_in_basis_from_backendv2(self): |
| 1247 | + """Test transpiling with RZZ in basis of backendv2.""" |
| 1248 | + num_qubits = 2 |
| 1249 | + seed = 9169 |
| 1250 | + basis_gates = ["rz", "rx", "rzz"] |
| 1251 | + qc = QuantumCircuit(num_qubits) |
| 1252 | + mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed) |
| 1253 | + qc.unitary(mat, range(num_qubits)) |
| 1254 | + backend = GenericBackendV2(num_qubits, basis_gates=basis_gates) |
| 1255 | + target = backend.target |
| 1256 | + pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134) |
| 1257 | + cqc = pm.run(qc) |
| 1258 | + self.assertEqual(Operator(qc), Operator.from_circuit(cqc)) |
| 1259 | + |
| 1260 | + def test_fractional_gate_in_basis_from_custom_target(self): |
| 1261 | + """Test transpiling with RZZ in basis of custom target.""" |
| 1262 | + num_qubits = 2 |
| 1263 | + seed = 9169 |
| 1264 | + qc = QuantumCircuit(num_qubits) |
| 1265 | + mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed) |
| 1266 | + qc.unitary(mat, range(num_qubits)) |
| 1267 | + target = Target() |
| 1268 | + target.add_instruction(RZGate(self.theta), {(i,): None for i in range(qc.num_qubits)}) |
| 1269 | + target.add_instruction(RXGate(self.phi), {(i,): None for i in range(qc.num_qubits)}) |
| 1270 | + target.add_instruction( |
| 1271 | + RZZGate(self.lam), {(i, i + 1): None for i in range(qc.num_qubits - 1)} |
| 1272 | + ) |
| 1273 | + pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134) |
| 1274 | + cqc = pm.run(qc) |
| 1275 | + self.assertEqual(Operator(qc), Operator.from_circuit(cqc)) |
0 commit comments