def test_expand_no_observable(self): """Check that an exception is raised if the measurement to be expanded has no observable""" m = MeasurementProcess(Probability, wires=qml.wires.Wires([0, 1])) with pytest.raises(NotImplementedError, match="Cannot expand"): m.expand()
def test_observable_with_no_eigvals(self): """An observable with no eigenvalues defined should cause the eigvals property on the associated measurement process to be None""" obs = qml.NumberOperator(wires=0) m = MeasurementProcess(Expectation, obs=obs) assert m.eigvals is None
def test_error_obs_and_eigvals(self): """Test that providing both eigenvalues and an observable results in an error""" obs = qml.Hermitian(np.diag([1, 2, 3]), wires=[0, 1, 2]) with pytest.raises(ValueError, match="Cannot set the eigenvalues"): MeasurementProcess(Expectation, obs=obs, eigvals=[0, 1])
def test_wires_match_observable(self): """Test that the wires of the measurement process match an internal observable""" obs = qml.Hermitian(np.diag([1, 2, 3]), wires=['a', 'b', 'c']) m = MeasurementProcess(Expectation, obs=obs) assert np.all(m.wires == obs.wires)
def test_eigvals_match_observable(self): """Test that the eigenvalues of the measurement process match an internal observable""" obs = qml.Hermitian(np.diag([1, 2, 3]), wires=[0, 1, 2]) m = MeasurementProcess(Expectation, obs=obs) assert np.all(m.eigvals == np.array([1, 2, 3])) # changing the observable data should be reflected obs.data = [np.diag([5, 6, 7])] assert np.all(m.eigvals == np.array([5, 6, 7]))
def test_expand_hermitian(self, tol): """Test the expansion of an hermitian observable""" H = np.array([[1, 2], [2, 4]]) obs = qml.Hermitian(H, wires=['a']) m = MeasurementProcess(Expectation, obs=obs) tape = m.expand() assert len(tape.operations) == 1 assert tape.operations[0].name == "QubitUnitary" assert tape.operations[0].wires.tolist() == ['a'] assert np.allclose(tape.operations[0].parameters[0], np.array([[-2, 1], [1, 2]]) / np.sqrt(5), atol=tol, rtol=0) assert len(tape.measurements) == 1 assert tape.measurements[0].return_type is Expectation assert tape.measurements[0].wires.tolist() == ['a'] assert np.all(tape.measurements[0].eigvals == np.array([0, 5]))
def test_expand_pauli(self): """Test the expansion of a Pauli observable""" obs = qml.PauliX(0) @ qml.PauliY(1) m = MeasurementProcess(Expectation, obs=obs) tape = m.expand() assert len(tape.operations) == 4 assert tape.operations[0].name == "Hadamard" assert tape.operations[0].wires.tolist() == [0] assert tape.operations[1].name == "PauliZ" assert tape.operations[1].wires.tolist() == [1] assert tape.operations[2].name == "S" assert tape.operations[2].wires.tolist() == [1] assert tape.operations[3].name == "Hadamard" assert tape.operations[3].wires.tolist() == [1] assert len(tape.measurements) == 1 assert tape.measurements[0].return_type is Expectation assert tape.measurements[0].wires.tolist() == [0, 1] assert np.all(tape.measurements[0].eigvals == np.array([1, -1, -1, 1]))