fix statevector handling global phase (#5239)

Co-authored-by: Matthew Treinish <mtreinish@kortar.org>
This commit is contained in:
Ali Javadi-Abhari 2020-10-15 15:56:08 -04:00 committed by GitHub
parent 2dbe7760c3
commit cf0b039e32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 1 deletions

View File

@ -676,7 +676,7 @@ class Statevector(QuantumState):
raise QiskitError('{} instruction definition is {}; expected QuantumCircuit'.format(
obj.name, type(obj.definition)))
if obj.definition.global_phase:
statevec._data *= np.exp(1j * obj.definition.global_phase)
statevec._data *= np.exp(1j * float(obj.definition.global_phase))
for instr, qregs, cregs in obj.definition:
if cregs:
raise QiskitError(

View File

@ -22,6 +22,7 @@ from numpy.testing import assert_allclose
from qiskit.test import QiskitTestCase
from qiskit import QiskitError
from qiskit import QuantumRegister, QuantumCircuit
from qiskit import transpile
from qiskit.circuit.library import HGate
from qiskit.quantum_info.random import random_unitary
@ -866,6 +867,17 @@ class TestStatevector(QiskitTestCase):
expval = psi.expectation_value(op)
self.assertAlmostEqual(expval, target)
def test_global_phase(self):
"""Test global phase is handled correctly when evolving statevector."""
qc = QuantumCircuit(1)
qc.rz(0.5, 0)
qc2 = transpile(qc, basis_gates=['p'])
sv = Statevector.from_instruction(qc2)
expected = np.array([0.96891242-0.24740396j, 0])
self.assertEqual(float(qc2.global_phase), -1/4)
self.assertEqual(sv, Statevector(expected))
if __name__ == '__main__':
unittest.main()