def test_crx_decomposition_correctness(self, phi, tol): """Test that the decomposition of the controlled X qubit rotation is correct""" expected = CRotx(phi) obtained = np.kron(I, Rotz(-np.pi / 2)) @ CNOT @ np.kron( I, Roty(-phi / 2)) @ CNOT @ np.kron(I, Roty(phi / 2)) @ np.kron( I, Rotz(np.pi / 2)) assert np.allclose(expected, obtained, atol=tol, rtol=0)
def test_y_rotation(self, tol): """Test y rotation is correct""" # test identity for theta=0 assert np.allclose(Roty(0), np.identity(2), atol=tol, rtol=0) # test identity for theta=pi/2 expected = np.array([[1, -1], [1, 1]]) / np.sqrt(2) assert np.allclose(Roty(np.pi / 2), expected, atol=tol, rtol=0) # test identity for theta=pi expected = np.array([[0, -1], [1, 0]]) assert np.allclose(Roty(np.pi), expected, atol=tol, rtol=0)
def test_y_rotation(self): """Test y rotation is correct""" self.logTestName() # test identity for theta=0 self.assertAllAlmostEqual(Roty(0), np.identity(2), delta=self.tol) # test identity for theta=pi/2 expected = np.array([[1, -1], [1, 1]]) / np.sqrt(2) self.assertAllAlmostEqual(Roty(np.pi / 2), expected, delta=self.tol) # test identity for theta=pi expected = np.array([[0, -1], [1, 0]]) self.assertAllAlmostEqual(Roty(np.pi), expected, delta=self.tol)
def test_pauliz_tensor_hadamard(self, theta, phi, varphi, tol): """Test that a tensor product involving PauliZ and hadamard works correctly""" dev = qml.device("default.qubit", wires=3) @qml.qnode(dev) def circuit(a, b, c): ansatz(a, b, c) return sample(qml.PauliZ(0) @ qml.Hadamard(1) @ qml.PauliY(2)) s1 = circuit(theta, phi, varphi) zero_state = np.zeros(2**3) zero_state[0] = 1 psi = zero_state psi = tensor_product([Rotx(theta), I, I]) @ zero_state psi = tensor_product([I, Rotx(phi), I]) @ psi psi = tensor_product([I, I, Rotx(varphi)]) @ psi psi = tensor_product([CNOT, I]) @ psi psi = tensor_product([I, CNOT]) @ psi # Diagonalize according to the observable psi = tensor_product([I, Roty(-np.pi / 4), I]) @ psi psi = tensor_product([I, I, Z]) @ psi psi = tensor_product([I, I, S]) @ psi psi = tensor_product([I, I, H]) @ psi expected_probabilities = np.abs(psi)**2 assert np.allclose(dev.probability(), expected_probabilities, atol=tol, rtol=0) # s1 should only contain 1 and -1 assert np.allclose(s1**2, 1, atol=tol, rtol=0)
def test_multiple_expectation_different_wires(self, qubit_device_2_wires, tol): """Tests that qnodes return multiple expectation values.""" a, b, c = torch.tensor(0.5), torch.tensor(0.54), torch.tensor(0.3) @qml.qnode(qubit_device_2_wires, interface='torch') def circuit(x, y, z): qml.RX(x, wires=[0]) qml.RZ(y, wires=[0]) qml.CNOT(wires=[0, 1]) qml.RY(y, wires=[0]) qml.RX(z, wires=[0]) return qml.expval(qml.PauliY(0)), qml.expval(qml.PauliZ(1)) res = circuit(a, b, c) out_state = np.kron(Rotx(c.numpy()), I) @ np.kron(Roty(b.numpy()), I) @ CNOT \ @ np.kron(Rotz(b.numpy()), I) @ np.kron(Rotx(a.numpy()), I) @ np.array([1, 0, 0, 0]) ex0 = np.vdot(out_state, np.kron(Y, I) @ out_state) ex1 = np.vdot(out_state, np.kron(I, Z) @ out_state) ex = np.array([ex0, ex1]) assert np.allclose(ex, res.numpy(), atol=tol, rtol=0)
def test_multiple_expectation_different_wires(self): "Tests that qnodes return multiple expectation values." self.logTestName() a, b, c = 0.5, 0.54, 0.3 @qml.qnode(self.dev2) def circuit(x, y, z): qml.RX(x, [0]) qml.RZ(y, [0]) qml.CNOT([0, 1]) qml.RY(y, [0]) qml.RX(z, [0]) return qml.expval.PauliY(0), qml.expval.PauliZ(1) res = circuit(a, b, c) out_state = np.kron(Rotx(c), I) @ np.kron(Roty(b), I) @ CNOT \ @ np.kron(Rotz(b), I) @ np.kron(Rotx(a), I) @ np.array([1, 0, 0, 0]) ex0 = np.vdot(out_state, np.kron(Y, I) @ out_state) ex1 = np.vdot(out_state, np.kron(I, Z) @ out_state) ex = np.array([ex0, ex1]) self.assertAllAlmostEqual(ex, res, delta=self.tol)
def test_multiple_expectation_different_wires(self): "Tests that qnodes return multiple expectation values." self.logTestName() a, b, c = tf.constant(0.5), tf.constant(0.54), tf.constant(0.3) @qml.qnode(self.dev2, interface='tfe') def circuit(x, y, z): qml.RX(x, wires=[0]) qml.RZ(y, wires=[0]) qml.CNOT(wires=[0, 1]) qml.RY(y, wires=[0]) qml.RX(z, wires=[0]) return qml.expval(qml.PauliY(0)), qml.expval(qml.PauliZ(1)) res = circuit(a, b, c) out_state = np.kron(Rotx(c.numpy()), I) @ np.kron(Roty(b.numpy()), I) @ CNOT \ @ np.kron(Rotz(b.numpy()), I) @ np.kron(Rotx(a.numpy()), I) @ np.array([1, 0, 0, 0]) ex0 = np.vdot(out_state, np.kron(Y, I) @ out_state) ex1 = np.vdot(out_state, np.kron(I, Z) @ out_state) ex = np.array([ex0, ex1]) self.assertAllAlmostEqual(ex, res.numpy(), delta=self.tol)