예제 #1
0
    def test_invalid_qubit_state_unitary(self, analytic, shots):
        """Test that an exception is raised if the
        unitary matrix is the wrong size"""
        dev = SimulatorDevice(2, analytic=analytic, shots=shots)
        state = np.array([[0, 123.432], [-0.432, 023.4]])

        with pytest.raises(ValueError, match=r"Not a unitary matrix"):
            with mimic_execution_for_apply(dev):
                dev.apply([qml.QubitUnitary(state, wires=[0, 1])])
예제 #2
0
    def test_qubit_state_vector(self, init_state, analytic, shots, tol):
        """Test PauliX application"""
        dev = SimulatorDevice(1, analytic=analytic, shots=shots)
        state = init_state(1)

        with mimic_execution_for_apply(dev):
            dev.apply([qml.QubitStateVector(state, wires=[0])])

        res = dev._state
        expected = state
        assert np.allclose(res, expected, **tol)
예제 #3
0
    def test_invalid_qubit_state_vector(self, analytic, shots):
        """Test that an exception is raised if the state
        vector is the wrong size"""
        dev = SimulatorDevice(2, analytic=analytic, shots=shots)
        state = np.array([0, 123.432])

        with pytest.raises(
                qml.DeviceError,
                match=
                r"For QubitStateVector, the state has to be specified for the correct number of qubits",
        ):
            with mimic_execution_for_apply(dev):
                dev.apply([qml.QubitStateVector(state, wires=[0, 1])])
예제 #4
0
    def test_qubit_state_vector_on_wires_subset(self, init_state, device_wires,
                                                op_wires, shots, tol):
        """Test QubitStateVector application on a subset of device wires"""
        dev = SimulatorDevice(device_wires, shots=shots)
        state = init_state(len(op_wires))

        with mimic_execution_for_apply(dev):
            dev.apply([qml.QubitStateVector(state, wires=op_wires)])

        res = dev.state
        expected = dev._expand_state(state, op_wires)

        assert np.allclose(res, expected, **tol)
예제 #5
0
    def test_basis_state(self, analytic, shots, tol):
        """Test basis state initialization"""
        dev = SimulatorDevice(4, analytic=analytic, shots=shots)
        state = np.array([0, 0, 1, 0])

        with mimic_execution_for_apply(dev):
            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 np.allclose(res, expected, **tol)
예제 #6
0
    def test_three_qubit_no_parameters(self, init_state, analytic, shots, name,
                                       mat, tol):
        dev = SimulatorDevice(3, analytic=analytic, shots=shots)
        state = init_state(3)

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=[0, 1, 2]),
                qml.__getattribute__(name)(wires=[0, 1, 2]),
            ])

        res = dev._state
        expected = mat @ state
        assert np.allclose(res, expected, **tol)
예제 #7
0
    def test_two_qubit_no_parameters(self, init_state, shots, name, mat, tol):
        """Test PauliX application"""
        dev = SimulatorDevice(2, shots=shots)
        state = init_state(2)

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=[0, 1]),
                qml.__getattribute__(name)(wires=[0, 1]),
            ])

        res = dev._state
        expected = mat @ state
        assert np.allclose(res, expected, **tol)
예제 #8
0
    def test_qubit_unitary(self, init_state, analytic, shots, mat, tol):
        N = int(np.log2(len(mat)))
        dev = SimulatorDevice(N, analytic=analytic, shots=shots)
        state = init_state(N)

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=list(range(N))),
                qml.QubitUnitary(mat, wires=list(range(N))),
            ])

        res = dev._state
        expected = mat @ state
        assert np.allclose(res, expected, **tol)
예제 #9
0
    def test_two_qubits_parameters(self, init_state, analytic, shots, name,
                                   func, theta, tol):
        """Test application of two qubit gates with parameters"""
        dev = SimulatorDevice(2, analytic=analytic, shots=shots)
        state = init_state(2)

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=[0, 1]),
                qml.__getattribute__(name)(theta, wires=[0, 1]),
            ])

        res = dev._state
        expected = func(theta) @ state
        assert np.allclose(res, expected, **tol)
예제 #10
0
    def test_single_qubit_no_parameters(self, init_state, analytic, shots,
                                        name, mat, tol):
        """Test application of single qubit gates without parameters"""
        dev = SimulatorDevice(1, analytic=analytic, shots=shots)
        state = init_state(1)

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=[0]),
                qml.__getattribute__(name)(wires=[0]),
            ])

        res = dev._state
        expected = mat @ state
        assert np.allclose(res, expected, **tol)
예제 #11
0
    def test_basis_state_on_wires_subset(self, state, device_wires, op_wires,
                                         tol):
        """Test basis state initialization on a subset of device wires"""
        dev = SimulatorDevice(device_wires)

        with mimic_execution_for_apply(dev):
            dev.apply([qml.BasisState(state, wires=op_wires)])

        res = np.abs(dev.state)**2
        # compute expected probabilities
        expected = np.zeros([2**len(op_wires)])
        expected[np.ravel_multi_index(state, [2] * len(op_wires))] = 1

        expected = dev._expand_state(expected, op_wires)

        assert np.allclose(res, expected, **tol)
예제 #12
0
    def test_rotation(self, init_state, analytic, shots, tol):
        """Test three axis rotation gate"""
        dev = SimulatorDevice(1, analytic=analytic, shots=shots)
        state = init_state(1)

        a = 0.542
        b = 1.3432
        c = -0.654

        with mimic_execution_for_apply(dev):
            dev.apply([
                qml.QubitStateVector(state, wires=[0]),
                qml.Rot(a, b, c, wires=[0])
            ])

        res = dev._state
        expected = rot(a, b, c) @ state
        assert np.allclose(res, expected, **tol)
예제 #13
0
    def test_apply_cphase(self, tol, par, input, shots):
        """Tests that applying the CPhase gate yields the expected output."""
        device = SimulatorDevice(2, shots=shots)

        cphase_mat = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0],
                               [0, 0, 0, np.exp(1j * par)]])

        expected = cphase_mat @ input

        device.reset()
        device._initial_state = np.array(input, dtype=np.complex64)
        device.apply([ops.CPhase(par, wires=[0, 1])])

        assert np.allclose(device.state, expected, **tol)
예제 #14
0
    def test_apply_iswap(self, tol, input, shots):
        """Tests that applying the iSWAP gate yields the expected output."""
        device = SimulatorDevice(2, shots=shots)

        iswap_mat = np.array([[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0],
                              [0, 0, 0, 1]])

        expected = iswap_mat @ input

        device.reset()
        device._initial_state = np.array(input, dtype=np.complex64)
        device.apply([ops.ISWAP(wires=[0, 1])])

        assert np.allclose(device.state, expected, **tol)
예제 #15
0
def simulator_device_3_wires(shots, analytic):
    """Return a three wire instance of the SimulatorDevice class."""
    yield SimulatorDevice(3, shots=shots, analytic=analytic)
def simulator_device_2_wires(shots):
    """Return a two wire instance of the SimulatorDevice class."""
    yield SimulatorDevice(2, shots=shots)
예제 #17
0
def simulator_device_1_wire(shots, analytic):
    """Return a single wire instance of the SimulatorDevice class."""
    yield SimulatorDevice(1, shots=shots, analytic=analytic)
def test_expand_state(state, op_wires, device_wires, expected, tol):
    """Test that the expand_state method works as expected."""
    dev = SimulatorDevice(device_wires)
    res = dev._expand_state(state, op_wires)

    assert np.allclose(res, expected, **tol)