Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,10 @@ def inverse(self, annotated: bool = False):
None if self._label in ("State Preparation", "State Preparation Dg") else self._label
)

return StatePreparation(self._params_arg, inverse=not self._inverse, label=label)
num_qubits = self.num_qubits if self._from_int else None
return StatePreparation(
self._params_arg, num_qubits=num_qubits, inverse=not self._inverse, label=label
)

def broadcast_arguments(self, qargs, cargs):
flat_qargs = [qarg for sublist in qargs for qarg in sublist]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
fixes:
- |
Fixed :meth:`.StatePreparation.inverse` for integer-bitmap inputs with an
explicit ``num_qubits`` so the inverse gate preserves the original qubit
width.
Fixed `#16430 <https://github.com/Qiskit/qiskit/issues/16430>`__.
30 changes: 30 additions & 0 deletions test/python/circuit/library/test_state_preparation.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,31 @@ def test_inverse(self, state):
qc.append(stateprep.inverse(), [0, 1])
self.assertTrue(np.allclose(Operator(qc).data, np.identity(2**qc.num_qubits)))

def test_inverse_preserves_integer_bitmap_width(self):
"""Test inverse preserves explicit width for integer-bitmap inputs."""
stateprep = StatePreparation(1, num_qubits=2)
inverse = stateprep.inverse()
qc = QuantumCircuit(2)
qc.append(stateprep, [0, 1])
qc.append(inverse, [0, 1])

self.assertEqual(inverse.num_qubits, 2)
self.assertTrue(np.allclose(Operator(qc).data, np.identity(2**qc.num_qubits)))

def test_inverse_integer_bitmap_matches_vector_form(self):
"""Test integer-bitmap inverse matches the equivalent vector-form semantics."""
int_stateprep = StatePreparation(1, num_qubits=2)
vector_stateprep = StatePreparation([0, 1, 0, 0])

for stateprep, inverse in (
(int_stateprep, vector_stateprep.inverse()),
(vector_stateprep, int_stateprep.inverse()),
):
qc = QuantumCircuit(2)
qc.append(stateprep, [0, 1])
qc.append(inverse, [0, 1])
self.assertTrue(Statevector(qc) == Statevector.from_label("00"))

def test_double_inverse(self):
"""Test twice inverse of StatePreparation"""
desired_sv = Statevector([1 / math.sqrt(2), 0, 0, 1 / math.sqrt(2)])
Expand All @@ -96,6 +121,11 @@ def test_incompatible_state_and_qubit_args(self):
with self.assertRaises(QiskitError):
qc.prepare_state("11")

def test_num_qubits_with_non_integer_params(self):
"""Test number of qubits is rejected for non-integer state arguments."""
with self.assertRaises(QiskitError):
StatePreparation([1, 0], num_qubits=1)

def test_incompatible_int_state_and_qubit_args(self):
"""Test error raised if number of qubits not compatible with integer state arg"""
with self.assertRaises(QiskitError):
Expand Down