diff --git a/qiskit/primitives/utils.py b/qiskit/primitives/utils.py index 64ed562f2e..f93e22f98a 100644 --- a/qiskit/primitives/utils.py +++ b/qiskit/primitives/utils.py @@ -12,9 +12,10 @@ """ Utility functions for primitives """ - from __future__ import annotations +import numpy as np + from qiskit.circuit import Instruction, ParameterExpression, QuantumCircuit from qiskit.circuit.bit import Bit from qiskit.extensions.quantum_initializer.initializer import Initialize @@ -146,7 +147,10 @@ def _circuit_key(circuit: QuantumCircuit, functional: bool = True) -> tuple: _bits_key(data.qubits, circuit), # qubits _bits_key(data.clbits, circuit), # clbits data.operation.name, # operation.name - tuple(data.operation.params), # operation.params + tuple( + param.data.tobytes() if isinstance(param, np.ndarray) else param + for param in data.operation.params + ), # operation.params ) for data in circuit.data ), diff --git a/releasenotes/notes/fix-primitives-numpy-parameters-1589d997864dfb37.yaml b/releasenotes/notes/fix-primitives-numpy-parameters-1589d997864dfb37.yaml new file mode 100644 index 0000000000..dccfef915d --- /dev/null +++ b/releasenotes/notes/fix-primitives-numpy-parameters-1589d997864dfb37.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed the problem in which primitives did not work when passing a circuit with ``numpy.ndarray`` + as a parameter. diff --git a/test/python/primitives/test_sampler.py b/test/python/primitives/test_sampler.py index c7a3b4915b..2c526facf5 100644 --- a/test/python/primitives/test_sampler.py +++ b/test/python/primitives/test_sampler.py @@ -22,6 +22,7 @@ from qiskit import QuantumCircuit, pulse, transpile from qiskit.circuit import Parameter from qiskit.circuit.library import RealAmplitudes from qiskit.exceptions import QiskitError +from qiskit.extensions.unitary import UnitaryGate from qiskit.primitives import Sampler, SamplerResult from qiskit.primitives.utils import _circuit_key from qiskit.providers import JobStatus, JobV1 @@ -770,6 +771,18 @@ class TestSampler(QiskitTestCase): keys = [_circuit_key(test_with_scheduling(i)) for i in range(1, 5)] self.assertEqual(len(keys), len(set(keys))) + def test_circuit_with_unitary(self): + """Test for circuit with unitary gate.""" + gate = UnitaryGate(np.eye(2)) + + circuit = QuantumCircuit(1) + circuit.append(gate, [0]) + circuit.measure_all() + + sampler = Sampler() + sampler_result = sampler.run([circuit]).result() + self.assertDictAlmostEqual(sampler_result.quasi_dists[0], {0: 1, 1: 0}) + if __name__ == "__main__": unittest.main()