Skip to content

Commit 2b09a3f

Browse files
authored
Move measurements after verbatim box (#187)
1 parent fbb3f00 commit 2b09a3f

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

qiskit_braket_provider/providers/adapter.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
from qiskit.circuit import Measure, Parameter, ParameterExpression
3030
from qiskit.circuit.parametervector import ParameterVectorElement
3131
from qiskit.transpiler import Target
32-
from qiskit_ionq import ionq_gates
32+
from qiskit_ionq import add_equivalences, ionq_gates
3333

3434
from qiskit_braket_provider.exception import QiskitBraketException
3535

36+
add_equivalences()
37+
3638
_GPHASE_GATE_NAME = "global_phase"
3739

3840
_BRAKET_TO_QISKIT_NAMES = {
@@ -436,6 +438,7 @@ def to_braket(
436438
_validate_name_conflicts(circuit.parameters)
437439

438440
# Handle qiskit to braket conversion
441+
measured_qubits = set()
439442
for circuit_instruction in circuit.data:
440443
operation = circuit_instruction.operation
441444
gate_name = operation.name
@@ -445,7 +448,11 @@ def to_braket(
445448
if gate_name == "measure":
446449
qubit = qubits[0] # qubit count = 1 for measure
447450
qubit_index = circuit.find_bit(qubit).index
448-
braket_circuit.measure(qubit_index)
451+
if qubit_index in measured_qubits:
452+
raise ValueError(
453+
f"Cannot measure previously measured qubit {qubit_index}"
454+
)
455+
measured_qubits.add(qubit_index)
449456
elif gate_name == "barrier":
450457
warnings.warn(
451458
"The Qiskit circuit contains barrier instructions that are ignored."
@@ -463,6 +470,10 @@ def to_braket(
463470

464471
# Getting the index from the bit mapping
465472
qubit_indices = [circuit.find_bit(qubit).index for qubit in qubits]
473+
if intersection := measured_qubits.intersection(qubit_indices):
474+
raise ValueError(
475+
f"Cannot apply operation {gate_name} to measured qubits {intersection}"
476+
)
466477
params = _create_free_parameters(operation)
467478
if gate_name in _QISKIT_CONTROLLED_GATE_NAMES_TO_BRAKET_GATES:
468479
for gate in _QISKIT_CONTROLLED_GATE_NAMES_TO_BRAKET_GATES[gate_name](
@@ -492,10 +503,13 @@ def to_braket(
492503
)
493504

494505
if verbatim:
495-
return Circuit(braket_circuit.result_types).add_verbatim_box(
506+
braket_circuit = Circuit(braket_circuit.result_types).add_verbatim_box(
496507
Circuit(braket_circuit.instructions)
497508
)
498509

510+
for qubit in sorted(measured_qubits):
511+
braket_circuit.measure(qubit)
512+
499513
return braket_circuit
500514

501515

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.4.0"
3+
__version__ = "0.4.1"

tests/providers/test_adapter.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,28 @@ def test_measure(self):
323323

324324
self.assertEqual(braket_circuit, expected_braket_circuit)
325325

326+
def test_measure_repeated(self):
327+
"""Tests that repeated measurement on a qubit raises a ValueError."""
328+
qiskit_circuit = QuantumCircuit(2, 2)
329+
qiskit_circuit.h(0)
330+
qiskit_circuit.cx(0, 1)
331+
qiskit_circuit.measure(0, 0)
332+
qiskit_circuit.measure([0, 1], [0, 1])
333+
334+
with self.assertRaises(ValueError):
335+
to_braket(qiskit_circuit)
336+
337+
def test_gate_after_measure(self):
338+
"""Tests that adding a gate to a measured qubit raises a ValueError."""
339+
qiskit_circuit = QuantumCircuit(2, 2)
340+
qiskit_circuit.h(0)
341+
qiskit_circuit.cx(0, 1)
342+
qiskit_circuit.measure(0, 0)
343+
qiskit_circuit.h(0)
344+
345+
with self.assertRaises(ValueError):
346+
to_braket(qiskit_circuit)
347+
326348
def test_reset(self):
327349
"""Tests if NotImplementedError is raised for reset operation."""
328350

@@ -436,13 +458,14 @@ def test_multiple_registers(self):
436458

437459
def test_verbatim(self):
438460
"""Tests that transpilation is skipped for verbatim circuits."""
439-
qiskit_circuit = QuantumCircuit(2)
461+
qiskit_circuit = QuantumCircuit(2, 1)
440462
qiskit_circuit.h(0)
441463
qiskit_circuit.cx(0, 1)
464+
qiskit_circuit.measure(1, 0)
442465

443466
assert to_braket(qiskit_circuit, {"x"}, True) == Circuit().add_verbatim_box(
444467
Circuit().h(0).cnot(0, 1)
445-
)
468+
).measure(1)
446469

447470
def test_parameter_vector(self):
448471
"""Tests ParameterExpression translation."""

0 commit comments

Comments
 (0)