def test_invalid_qubit_state_vector_size(self): """Test that an exception is raised if the state vector is the wrong size""" dev = DefaultQubitTF(wires=2) state = np.array([0, 1]) with pytest.raises(ValueError, match=r"State vector must be of length 2\*\*wires"): dev.apply([qml.QubitStateVector(state, wires=[0, 1])])
def test_invalid_basis_state(self, tol): """Test that an exception is raised if the basis state is invalid""" dev = DefaultQubitTF(wires=4) state = np.array([0, 0, 1, 2]) with pytest.raises( ValueError, match=r"BasisState parameter must consist of 0 or 1 integers"): dev.apply([qml.BasisState(state, wires=[0, 1, 2, 3])])
def test_invalid_qubit_state_vector_norm(self): """Test that an exception is raised if the state vector is not normalized""" dev = DefaultQubitTF(wires=2) state = np.array([0, 12]) with pytest.raises( ValueError, match=r"Sum of amplitudes-squared does not equal one"): dev.apply([qml.QubitStateVector(state, wires=[0])])
def test_invalid_basis_state_length(self, tol): """Test that an exception is raised if the basis state is the wrong size""" dev = DefaultQubitTF(wires=4) state = np.array([0, 0, 1, 0]) with pytest.raises( ValueError, match=r"BasisState parameter and wires must be of equal length" ): dev.apply([qml.BasisState(state, wires=[0, 1, 2])])
def test_qubit_state_vector(self, init_state, tol): """Test qubit state vector application""" dev = DefaultQubitTF(wires=1) state = init_state(1) dev.apply([qml.QubitStateVector(state, wires=[0])]) res = dev.state expected = state assert isinstance(res, tf.Tensor) assert np.allclose(res, expected, atol=tol, rtol=0)
def test_two_qubit_parameters(self, init_state, op, func, theta, tol): """Test two qubit parametrized operations""" dev = DefaultQubitTF(wires=2) state = init_state(2) queue = [qml.QubitStateVector(state, wires=[0, 1])] queue += [op(theta, wires=[0, 1])] dev.apply(queue) res = dev.state expected = func(theta) @ state assert np.allclose(res, expected, atol=tol, rtol=0)
def test_three_qubit_no_parameters(self, init_state, op, mat, tol): """Test non-parametrized three qubit operations""" dev = DefaultQubitTF(wires=3) state = init_state(3) queue = [qml.QubitStateVector(state, wires=[0, 1, 2])] queue += [op(wires=[0, 1, 2])] dev.apply(queue) res = dev.state expected = mat @ state assert np.allclose(res, expected, atol=tol, rtol=0)
def test_invalid_state_prep(self): """Test that an exception is raised if a state preparation is not the first operation in the circuit.""" dev = DefaultQubitTF(wires=2) state = np.array([0, 12]) with pytest.raises( qml.DeviceError, match= r"cannot be used after other Operations have already been applied", ): dev.apply([qml.PauliZ(0), qml.QubitStateVector(state, wires=[0])])
def test_qubit_unitary(self, init_state, mat, tol): """Test application of arbitrary qubit unitaries""" N = int(np.log2(len(mat))) dev = DefaultQubitTF(wires=N) state = init_state(N) queue = [qml.QubitStateVector(state, wires=range(N))] queue += [qml.QubitUnitary(mat, wires=range(N))] dev.apply(queue) res = dev.state expected = mat @ state assert np.allclose(res, expected, atol=tol, rtol=0)
def test_single_qubit_no_parameters(self, init_state, op, mat, tol): """Test non-parametrized single qubit operations""" dev = DefaultQubitTF(wires=1) state = init_state(1) queue = [qml.QubitStateVector(state, wires=[0])] queue += [op(wires=0)] dev.apply(queue) res = dev.state expected = mat @ state assert isinstance(res, tf.Tensor) assert np.allclose(res, expected, atol=tol, rtol=0)
def test_basis_state(self, tol): """Test basis state initialization""" dev = DefaultQubitTF(wires=4) state = np.array([0, 0, 1, 0]) dev.apply([qml.BasisState(state, wires=[0, 1, 2, 3])]) res = dev.state expected = np.zeros([2**4]) expected[np.ravel_multi_index(state, [2] * 4)] = 1 assert isinstance(res, tf.Tensor) assert np.allclose(res, expected, atol=tol, rtol=0)
def test_controlled_rotation(self, init_state, tol): """Test three axis controlled-rotation gate""" dev = DefaultQubitTF(wires=2) state = init_state(2) a = 0.542 b = 1.3432 c = -0.654 queue = [qml.QubitStateVector(state, wires=[0, 1])] queue += [qml.CRot(a, b, c, wires=[0, 1])] dev.apply(queue) res = dev.state expected = CRot3(a, b, c) @ state assert np.allclose(res, expected, atol=tol, rtol=0)
def test_inverse_operation(self, init_state, tol): """Test that the inverse of an operation is correctly applied""" """Test three axis rotation gate""" dev = DefaultQubitTF(wires=1) state = init_state(1) a = 0.542 b = 1.3432 c = -0.654 queue = [qml.QubitStateVector(state, wires=[0])] queue += [qml.Rot(a, b, c, wires=0).inv()] dev.apply(queue) res = dev.state expected = np.linalg.inv(Rot3(a, b, c)) @ state assert np.allclose(res, expected, atol=tol, rtol=0)