Exemple #1
0
def test_distributed_qft_execution(nqubits, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend("custom")
    dist_c = models.QFT(nqubits, accelerators=accelerators)
    c = models.QFT(nqubits)

    initial_state = utils.random_numpy_state(nqubits)
    final_state = dist_c(initial_state).numpy()
    target_state = c(initial_state).numpy()
    np.testing.assert_allclose(target_state, final_state)
    qibo.set_backend(original_backend)
Exemple #2
0
def test_qft(backend, accelerators, nqubits):
    c = models.QFT(nqubits, accelerators=accelerators)
    initial_state = random_state(nqubits)
    final_state = c(np.copy(initial_state))
    cirq_gates = [(cirq.qft, list(range(nqubits)))]
    target_state, _ = execute_cirq(cirq_gates, nqubits, np.copy(initial_state))
    K.assert_allclose(target_state, final_state, atol=1e-6)
Exemple #3
0
def test_qft_errors():
    """Check that ``_DistributedQFT`` raises error if not sufficient qubits."""
    from qibo.models.circuit import _DistributedQFT
    with pytest.raises(NotImplementedError):
        c = _DistributedQFT(2, accelerators={"/GPU:0": 4})
    with pytest.raises(NotImplementedError):
        c = models.QFT(10, with_swaps=False, accelerators={"/GPU:0": 2})
Exemple #4
0
def test_qft_circuit_size(backend, nqubits):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)
    c = models.QFT(nqubits)
    assert c.nqubits == nqubits
    assert c.depth == 2 * nqubits
    assert c.ngates == nqubits ** 2 // 2 + nqubits
    qibo.set_backend(original_backend)
Exemple #5
0
def test_qft_matrix(backend, nqubits):
    c = models.QFT(nqubits)
    dim = 2**nqubits
    target_matrix = qft_matrix(dim)
    K.assert_allclose(c.unitary(), target_matrix)
    c = c.invert()
    target_matrix = qft_matrix(dim, inverse=True)
    K.assert_allclose(c.unitary(), target_matrix)
Exemple #6
0
def test_qft_transformation(nqubits):
    """Check QFT transformation for |00...0>."""
    c = models.QFT(nqubits)
    final_state = c.execute().numpy()

    initial_state = np.zeros_like(final_state)
    initial_state[0] = 1.0
    exact_state = exact_qft(initial_state)

    np.testing.assert_allclose(final_state, exact_state, atol=_atol)
Exemple #7
0
def test_qft(backend, nqubits, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)
    initial_state = utils.random_numpy_state(nqubits)
    c = models.QFT(nqubits, accelerators=accelerators)
    final_state = c(np.copy(initial_state)).numpy()
    cirq_gates = [(cirq.QFT, list(range(nqubits)))]
    target_state = execute_cirq(cirq_gates, nqubits, np.copy(initial_state))
    np.testing.assert_allclose(target_state, final_state, atol=1e-6)
    qibo.set_backend(original_backend)
Exemple #8
0
def test_qft_execution(backend, accelerators, nqubits, random):
    c = models.QFT(nqubits)
    if random:
        initial_state = random_state(nqubits)
        final_state = c(K.cast(np.copy(initial_state)))
    else:
        initial_state = c.get_initial_state()
        final_state = c()
    target_state = exact_qft(K.to_numpy(initial_state))
    K.assert_allclose(final_state, target_state)
Exemple #9
0
def CircuitFactory(nqubits, circuit_name, accelerators=None, **kwargs):
    if circuit_name == "qft":
        circuit = models.QFT(nqubits, accelerators=accelerators)
    else:
        if circuit_name not in _CIRCUITS:
            raise KeyError("Unknown benchmark circuit type {}."
                           "".format(circuit_name))
        circuit = models.Circuit(nqubits, accelerators=accelerators)
        circuit.add(_CIRCUITS.get(circuit_name)(nqubits, **kwargs))
    return circuit
Exemple #10
0
def test_qft_transformation_random(nqubits):
    """Check QFT transformation for random initial state."""
    initial_state = utils.random_numpy_state(nqubits)
    exact_state = exact_qft(initial_state)

    c_init = models.Circuit(nqubits)
    c_init.add(gates.Flatten(initial_state))
    c = c_init + models.QFT(nqubits)
    final_state = c.execute().numpy()

    np.testing.assert_allclose(final_state, exact_state, atol=_atol)
Exemple #11
0
def CircuitFactory(nqubits: int,
                   circuit_type: str,
                   accelerators: Dict[str, int] = None,
                   memory_device: str = "/CPU:0",
                   **kwargs):
    if circuit_type == "qft":
        circuit = models.QFT(nqubits, accelerators=accelerators,
                             memory_device=memory_device)
    else:
        if circuit_type not in _CIRCUITS:
            raise TypeError("Unknown benchmark circuit type {}."
                            "".format(circuit_type))
        circuit = models.Circuit(nqubits, accelerators=accelerators,
                                 memory_device=memory_device)
        circuit.add(_CIRCUITS[circuit_type](nqubits, **kwargs))
    return circuit
Exemple #12
0
def test_distributed_qft_error():
    """Check that ``_DistributedQFT`` raises error if not sufficient qubits."""
    with pytest.raises(NotImplementedError):
        c = models._DistributedQFT(2, accelerators={"/GPU:0": 4})
    with pytest.raises(NotImplementedError):
        c = models.QFT(10, with_swaps=False, accelerators={"/GPU:0": 2})
Exemple #13
0
def test_qft_sanity():
    """Check QFT circuit size and depth."""
    c = models.QFT(4)
    assert c.size == 4
    assert c.depth == 8
    assert c.ngates == 12
Exemple #14
0
def test_distributed_qft_global_qubits_validity(nqubits, ndevices):
    """Check that no gates are applied to global qubits for practical QFT cases."""
    c = models.QFT(nqubits, accelerators={"/GPU:0": ndevices})
    c.queues.set(c.queue)
    check_device_queues(c.queues)
Exemple #15
0
def test_qft_circuit_size(backend, nqubits):
    c = models.QFT(nqubits)
    assert c.nqubits == nqubits
    assert c.depth == 2 * nqubits
    assert c.ngates == nqubits**2 // 2 + nqubits