Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix issue/12311 with fractional gate in basis #12511

Merged
merged 7 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions qiskit/transpiler/passes/synthesis/unitary_synthesis.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
CZGate,
RXXGate,
RZXGate,
RZZGate,
ECRGate,
RXGate,
SXGate,
Expand Down Expand Up @@ -779,6 +780,8 @@ def _replace_parameterized_gate(op):
op = RXXGate(pi / 2)
elif isinstance(op, RZXGate) and isinstance(op.params[0], Parameter):
op = RZXGate(pi / 4)
elif isinstance(op, RZZGate) and isinstance(op.params[0], Parameter):
op = RZZGate(pi / 2)
return op

try:
Expand Down
50 changes: 50 additions & 0 deletions test/python/transpiler/test_basis_translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import os

from numpy import pi
import scipy

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
from qiskit import transpile
Expand All @@ -33,13 +34,17 @@
XGate,
SXGate,
CXGate,
RXGate,
RZZGate,
)
from qiskit.converters import circuit_to_dag, dag_to_circuit, circuit_to_instruction
from qiskit.exceptions import QiskitError
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.quantum_info import Operator
from qiskit.transpiler.target import Target, InstructionProperties
from qiskit.transpiler.exceptions import TranspilerError
from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit.library.standard_gates.equivalence_library import (
StandardEquivalenceLibrary as std_eqlib,
)
Expand Down Expand Up @@ -1223,3 +1228,48 @@ def __init__(self):

out = BasisTranslator(eq_lib, {"my_h", "my_cx"}, target)(qc)
self.assertEqual(out, expected)

def test_fractional_gate_in_basis_from_string(self):
"""Test transpiling with RZZ in basis with only basis_gates option."""
num_qubits = 2
seed = 9169
basis_gates = ["rz", "rx", "rzz"]
qc = QuantumCircuit(num_qubits)
mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)
qc.unitary(mat, range(num_qubits))
pm = generate_preset_pass_manager(
optimization_level=1, basis_gates=basis_gates, seed_transpiler=134
)
cqc = pm.run(qc)
self.assertEqual(Operator(qc), Operator(cqc))

def test_fractional_gate_in_basis_from_backendv2(self):
"""Test transpiling with RZZ in basis of backendv2."""
num_qubits = 2
seed = 9169
basis_gates = ["rz", "rx", "rzz"]
qc = QuantumCircuit(num_qubits)
mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)
qc.unitary(mat, range(num_qubits))
backend = GenericBackendV2(num_qubits, basis_gates=basis_gates)
target = backend.target
pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134)
cqc = pm.run(qc)
self.assertEqual(Operator(qc), Operator.from_circuit(cqc))

def test_fractional_gate_in_basis_from_custom_target(self):
"""Test transpiling with RZZ in basis of custom target."""
num_qubits = 2
seed = 9169
qc = QuantumCircuit(num_qubits)
mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)
qc.unitary(mat, range(num_qubits))
target = Target()
target.add_instruction(RZGate(self.theta), {(i,): None for i in range(qc.num_qubits)})
target.add_instruction(RXGate(self.phi), {(i,): None for i in range(qc.num_qubits)})
target.add_instruction(
RZZGate(self.lam), {(i, i + 1): None for i in range(qc.num_qubits - 1)}
)
pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134)
cqc = pm.run(qc)
self.assertEqual(Operator(qc), Operator.from_circuit(cqc))
Loading