Skip to content

Commit 157d7ab

Browse files
authored
Ignore global phase if unsupported (#156)
1 parent e29cbaf commit 157d7ab

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

qiskit_braket_provider/providers/adapter.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
from qiskit_braket_provider.exception import QiskitBraketException
3434

35+
_GPHASE_GATE_NAME = "global_phase"
36+
3537
_BRAKET_TO_QISKIT_NAMES = {
3638
"u": "u",
3739
"phaseshift": "p",
@@ -63,6 +65,7 @@
6365
"gpi": "gpi",
6466
"gpi2": "gpi2",
6567
"ms": "ms",
68+
"gphase": _GPHASE_GATE_NAME,
6669
}
6770

6871
_CONTROLLED_GATES_BY_QUBIT_COUNT = {
@@ -108,12 +111,14 @@
108111
"ecr": lambda: [braket_gates.ECR()],
109112
"iswap": lambda: [braket_gates.ISwap()],
110113
# IonQ gates
111-
"gpi": lambda angle: [braket_gates.GPi(2 * pi * angle)],
112-
"gpi2": lambda angle: [braket_gates.GPi2(2 * pi * angle)],
113-
"ms": lambda angle_1, angle_2, angle_3: [
114-
braket_gates.MS(2 * pi * angle_1, 2 * pi * angle_2, 2 * pi * angle_3)
114+
"gpi": lambda turns: [braket_gates.GPi(2 * pi * turns)],
115+
"gpi2": lambda turns: [braket_gates.GPi2(2 * pi * turns)],
116+
"ms": lambda turns_1, turns_2, turns_3: [
117+
braket_gates.MS(2 * pi * turns_1, 2 * pi * turns_2, 2 * pi * turns_3)
115118
],
116119
"zz": lambda angle: [braket_gates.ZZ(2 * pi * angle)],
120+
# Global phase
121+
_GPHASE_GATE_NAME: lambda phase: [braket_gates.GPhase(phase)],
117122
}
118123

119124
_QISKIT_CONTROLLED_GATE_NAMES_TO_BRAKET_GATES: dict[str, Callable] = {
@@ -174,6 +179,7 @@
174179
Parameter("phi1") / (2 * pi),
175180
Parameter("theta") / (2 * pi),
176181
),
182+
"gphase": qiskit_gates.GlobalPhaseGate(Parameter("theta")),
177183
}
178184

179185

@@ -398,10 +404,11 @@ def to_braket(
398404
Returns:
399405
Circuit: Braket circuit
400406
"""
401-
basis_gates = basis_gates or _TRANSLATABLE_QISKIT_GATE_NAMES
402407
if not isinstance(circuit, QuantumCircuit):
403408
raise TypeError(f"Expected a QuantumCircuit, got {type(circuit)} instead.")
404409

410+
basis_gates = set(basis_gates or _TRANSLATABLE_QISKIT_GATE_NAMES)
411+
405412
braket_circuit = Circuit()
406413
if not verbatim and not {gate.name for gate, _, _ in circuit.data}.issubset(
407414
basis_gates
@@ -460,8 +467,15 @@ def to_braket(
460467
target=qubit_indices,
461468
)
462469

463-
if circuit.global_phase > _EPS:
464-
braket_circuit.gphase(circuit.global_phase)
470+
global_phase = circuit.global_phase
471+
if abs(global_phase) > _EPS:
472+
if _GPHASE_GATE_NAME in basis_gates:
473+
braket_circuit.gphase(global_phase)
474+
else:
475+
warnings.warn(
476+
f"Device does not support global phase; "
477+
f"global phase of {global_phase} will not be included in Braket circuit"
478+
)
465479

466480
if verbatim:
467481
return Circuit(braket_circuit.result_types).add_verbatim_box(

qiskit_braket_provider/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Qiskit-Braket provider version."""
22

3-
__version__ = "0.1.0"
3+
__version__ = "0.1.1"

tests/providers/test_adapter.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from braket.devices import LocalSimulator
1010
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister, transpile
1111
from qiskit.circuit import Parameter, ParameterVector
12-
from qiskit.circuit.library import PauliEvolutionGate
12+
from qiskit.circuit.library import GlobalPhaseGate, PauliEvolutionGate
1313
from qiskit.circuit.library import standard_gates as qiskit_gates
1414
from qiskit.providers.basicaer import BasicAer
1515
from qiskit.quantum_info import SparsePauliOp
@@ -242,14 +242,20 @@ def test_global_phase(self):
242242
"""Tests conversion when transpiler generates a global phase"""
243243
qiskit_circuit = QuantumCircuit(1, global_phase=np.pi / 2)
244244
qiskit_circuit.h(0)
245+
gate = GlobalPhaseGate(1.23)
246+
qiskit_circuit.append(gate, [])
245247

246248
braket_circuit = to_braket(qiskit_circuit)
247-
248-
expected_braket_circuit = Circuit().h(0).gphase(np.pi / 2)
249-
250-
self.assertEqual(braket_circuit.global_phase, qiskit_circuit.global_phase)
249+
expected_braket_circuit = Circuit().h(0).gphase(1.23).gphase(np.pi / 2)
250+
self.assertEqual(
251+
braket_circuit.global_phase, qiskit_circuit.global_phase + gate.params[0]
252+
)
251253
self.assertEqual(braket_circuit, expected_braket_circuit)
252254

255+
braket_circuit_no_gphase = to_braket(qiskit_circuit, basis_gates={"h"})
256+
self.assertEqual(braket_circuit_no_gphase.global_phase, 0)
257+
self.assertEqual(braket_circuit_no_gphase, Circuit().h(0))
258+
253259
def test_exponential_gate_decomp(self):
254260
"""Tests adapter translation of exponential gates"""
255261
aer_backend = BasicAer.get_backend("statevector_simulator")
@@ -303,6 +309,7 @@ def test_mappers(self):
303309
"rxx": "xx",
304310
"ryy": "yy",
305311
"zz": "zz",
312+
"global_phase": "gphase",
306313
}
307314

308315
qiskit_to_braket_gate_names |= {

0 commit comments

Comments
 (0)