Skip to content

Commit aaaf107

Browse files
ewinstonmtreinish
andauthored
fix issue/12311 with fractional gate in basis (Qiskit#12511)
* linting * linting...relax check for 3-qubit circuit * update test docstrings * black update * bind RZZ to pi/2 if Rzz(theta) in basis * Apply suggestions from code review --------- Co-authored-by: Matthew Treinish <[email protected]>
1 parent d8903f3 commit aaaf107

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

qiskit/transpiler/passes/synthesis/unitary_synthesis.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
CZGate,
3838
RXXGate,
3939
RZXGate,
40+
RZZGate,
4041
ECRGate,
4142
RXGate,
4243
SXGate,
@@ -781,6 +782,8 @@ def _replace_parameterized_gate(op):
781782
op = RXXGate(pi / 2)
782783
elif isinstance(op, RZXGate) and isinstance(op.params[0], Parameter):
783784
op = RZXGate(pi / 4)
785+
elif isinstance(op, RZZGate) and isinstance(op.params[0], Parameter):
786+
op = RZZGate(pi / 2)
784787
return op
785788

786789
try:

test/python/transpiler/test_basis_translator.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import os
1717

1818
from numpy import pi
19+
import scipy
1920

2021
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
2122
from qiskit import transpile
@@ -33,13 +34,17 @@
3334
XGate,
3435
SXGate,
3536
CXGate,
37+
RXGate,
38+
RZZGate,
3639
)
3740
from qiskit.converters import circuit_to_dag, dag_to_circuit, circuit_to_instruction
3841
from qiskit.exceptions import QiskitError
42+
from qiskit.providers.fake_provider import GenericBackendV2
3943
from qiskit.quantum_info import Operator
4044
from qiskit.transpiler.target import Target, InstructionProperties
4145
from qiskit.transpiler.exceptions import TranspilerError
4246
from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions
47+
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
4348
from qiskit.circuit.library.standard_gates.equivalence_library import (
4449
StandardEquivalenceLibrary as std_eqlib,
4550
)
@@ -1223,3 +1228,48 @@ def __init__(self):
12231228

12241229
out = BasisTranslator(eq_lib, {"my_h", "my_cx"}, target)(qc)
12251230
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

Comments
 (0)