コード例 #1
0
def test_qaoa_errors():
    # Invalid Hamiltonian type
    with pytest.raises(TypeError):
        qaoa = models.QAOA("test")
    # Hamiltonians of different type
    h = hamiltonians.TFIM(4, h=1.0, dense=False)
    m = hamiltonians.X(4, dense=True)
    with pytest.raises(TypeError):
        qaoa = models.QAOA(h, mixer=m)
    # distributed execution with RK solver
    with pytest.raises(NotImplementedError):
        qaoa = models.QAOA(h, solver="rk4", accelerators={"/GPU:0": 2})
    # minimize with odd number of parameters
    qaoa = models.QAOA(h)
    with pytest.raises(ValueError):
        qaoa.minimize(np.random.random(5))
コード例 #2
0
def test_qaoa_execution(backend, solver, dense, accel=None):
    h = hamiltonians.TFIM(6, h=1.0, dense=dense)
    m = hamiltonians.X(6, dense=dense)
    # Trotter and RK require small p's!
    params = 0.01 * (1 - 2 * np.random.random(4))
    state = random_state(6)
    # set absolute test tolerance according to solver
    if "rk" in solver:
        atol = 1e-2
    elif not dense:
        atol = 1e-5
    else:
        atol = 0

    target_state = np.copy(state)
    h_matrix = K.to_numpy(h.matrix)
    m_matrix = K.to_numpy(m.matrix)
    for i, p in enumerate(params):
        if i % 2:
            u = expm(-1j * p * m_matrix)
        else:
            u = expm(-1j * p * h_matrix)
        target_state = u @ target_state

    qaoa = models.QAOA(h, mixer=m, solver=solver, accelerators=accel)
    qaoa.set_parameters(params)
    final_state = qaoa(np.copy(state))
    K.assert_allclose(final_state, target_state, atol=atol)
コード例 #3
0
def test_qaoa_callbacks(backend, accelerators):
    from qibo import callbacks
    # use ``Y`` Hamiltonian so that there are no errors
    # in the Trotter decomposition
    if accelerators:
        with K.on_cpu():
            h = hamiltonians.Y(5)
    else:
        h = hamiltonians.Y(5)
    energy = callbacks.Energy(h)
    params = 0.1 * np.random.random(4)
    state = random_state(5)

    ham = hamiltonians.Y(5, dense=False)
    qaoa = models.QAOA(ham, callbacks=[energy], accelerators=accelerators)
    qaoa.set_parameters(params)
    final_state = qaoa(np.copy(state))

    h_matrix = K.to_numpy(h.matrix)
    m_matrix = K.to_numpy(qaoa.mixer.matrix)
    calc_energy = lambda s: (s.conj() * h_matrix.dot(s)).sum()
    target_state = np.copy(state)
    target_energy = [calc_energy(target_state)]
    for i, p in enumerate(params):
        if i % 2:
            u = expm(-1j * p * m_matrix)
        else:
            u = expm(-1j * p * h_matrix)
        target_state = u @ target_state
        target_energy.append(calc_energy(target_state))
    K.assert_allclose(energy[:], target_energy)
コード例 #4
0
def test_initial_state(accelerators):
    h = hamiltonians.TFIM(3, h=1.0, trotter=True)
    qaoa = models.QAOA(h, accelerators=accelerators)
    qaoa.set_parameters(np.random.random(4))
    target_state = np.ones(2 ** 3) / np.sqrt(2 ** 3)
    final_state = qaoa.get_initial_state()
    np.testing.assert_allclose(final_state, target_state)
コード例 #5
0
def test_initial_state(backend, accelerators):
    h = hamiltonians.TFIM(5, h=1.0, dense=False)
    qaoa = models.QAOA(h, accelerators=accelerators)
    qaoa.set_parameters(np.random.random(4))
    target_state = np.ones(2**5) / np.sqrt(2**5)
    final_state = qaoa.get_initial_state()
    K.assert_allclose(final_state, target_state)
コード例 #6
0
def test_qaoa_callbacks(accelerators):
    from qibo import callbacks
    # use ``Y`` Hamiltonian so that there are no errors
    # in the Trotter decomposition
    h = hamiltonians.Y(3)
    energy = callbacks.Energy(h)
    params = 0.1 * np.random.random(4)
    state = utils.random_numpy_state(3)

    ham = hamiltonians.Y(3, trotter=True)
    qaoa = models.QAOA(ham, callbacks=[energy], accelerators=accelerators)
    qaoa.set_parameters(params)
    final_state = qaoa(np.copy(state))

    h_matrix = h.matrix.numpy()
    m_matrix = qaoa.mixer.matrix.numpy()
    calc_energy = lambda s: (s.conj() * h_matrix.dot(s)).sum()
    target_state = np.copy(state)
    target_energy = [calc_energy(target_state)]
    for i, p in enumerate(params):
        if i % 2:
            u = expm(-1j * p * m_matrix)
        else:
            u = expm(-1j * p * h_matrix)
        target_state = u @ target_state
        target_energy.append(calc_energy(target_state))
    np.testing.assert_allclose(energy[:], target_energy)
コード例 #7
0
def test_qaoa_execution(solver, trotter, accelerators):
    h = hamiltonians.TFIM(4, h=1.0, trotter=trotter)
    m = hamiltonians.X(4, trotter=trotter)
    # Trotter and RK require small p's!
    params = 0.01 * (1 - 2 * np.random.random(4))
    state = utils.random_numpy_state(4)
    # set absolute test tolerance according to solver
    if "rk" in solver:
        atol = 1e-2
    elif trotter:
        atol = 1e-5
    else:
        atol = 0

    target_state = np.copy(state)
    h_matrix = h.matrix.numpy()
    m_matrix = m.matrix.numpy()
    for i, p in enumerate(params):
        if i % 2:
            u = expm(-1j * p * m_matrix)
        else:
            u = expm(-1j * p * h_matrix)
        target_state = u @ target_state

    qaoa = models.QAOA(h, mixer=m, solver=solver, accelerators=accelerators)
    qaoa.set_parameters(params)
    final_state = qaoa(np.copy(state))
    np.testing.assert_allclose(final_state, target_state, atol=atol)
コード例 #8
0
def test_qaoa_optimization(method, options, trotter, filename):
    h = hamiltonians.XXZ(3, trotter=trotter)
    qaoa = models.QAOA(h)
    initial_p = [0.05, 0.06, 0.07, 0.08]
    best, params = qaoa.minimize(initial_p, method=method, options=options)
    if filename is not None:
        utils.assert_regression_fixture(params, filename)
コード例 #9
0
def test_qaoa_optimization(backend, method, options, dense, filename):
    if method == "sgd" and qibo.get_backend() != "tensorflow":
        pytest.skip("Skipping SGD test for unsupported backend.")
    h = hamiltonians.XXZ(3, dense=dense)
    qaoa = models.QAOA(h)
    initial_p = [0.05, 0.06, 0.07, 0.08]
    best, params, _ = qaoa.minimize(initial_p, method=method, options=options)
    if filename is not None:
        assert_regression_fixture(params, filename)
コード例 #10
0
def test_initial_state(backend, accelerators):
    original_backend = qibo.get_backend()
    qibo.set_backend(backend)
    h = hamiltonians.TFIM(5, h=1.0, trotter=True)
    qaoa = models.QAOA(h, accelerators=accelerators)
    qaoa.set_parameters(np.random.random(4))
    target_state = np.ones(2**5) / np.sqrt(2**5)
    final_state = qaoa.get_initial_state()
    np.testing.assert_allclose(final_state, target_state)
    qibo.set_backend(original_backend)
コード例 #11
0
ファイル: qaoa.py プロジェクト: qiboteam/qibo
def main(nqubits,
         nangles,
         dense=True,
         solver="exp",
         method="Powell",
         maxiter=None,
         filename=None):
    """Performs a QAOA minimization test."""

    print("Number of qubits:", nqubits)
    print("Number of angles:", nangles)
    logs = BenchmarkLogger(filename)
    logs.append({
        "nqubits": nqubits,
        "nangles": nangles,
        "dense": dense,
        "solver": solver,
        "backend": qibo.get_backend(),
        "precision": qibo.get_precision(),
        "device": qibo.get_device(),
        "threads": qibo.get_threads(),
        "method": method,
        "maxiter": maxiter
    })

    hamiltonian = hamiltonians.XXZ(nqubits=nqubits, dense=dense)
    start_time = time.time()
    qaoa = models.QAOA(hamiltonian, solver=solver)
    logs[-1]["creation_time"] = time.time() - start_time

    target = np.real(np.min(K.to_numpy(hamiltonian.eigenvalues())))
    print("\nTarget state =", target)

    np.random.seed(0)
    initial_parameters = np.random.uniform(0, 0.1, nangles)

    start_time = time.time()
    options = {'disp': True, 'maxiter': maxiter}
    best, params, _ = qaoa.minimize(initial_parameters,
                                    method=method,
                                    options=options)
    logs[-1]["minimization_time"] = time.time() - start_time

    logs[-1]["best_energy"] = float(best)
    logs[-1]["target_energy"] = float(target)
    logs[-1]["epsilon"] = np.log10(1 / np.abs(best - target))
    print("Found state =", best)
    print("Final eps =", logs[-1]["epsilon"])

    print("\nCreation time =", logs[-1]["creation_time"])
    print("Minimization time =", logs[-1]["minimization_time"])
    print("Total time =",
          logs[-1]["creation_time"] + logs[-1]["minimization_time"])
    logs.dump()
コード例 #12
0
def test_qaoa_optimization(backend, method, options, trotter, filename):
    original_backend = qibo.get_backend()
    if method == "sgd" and backend != "matmuleinsum":
        pytest.skip("Skipping SGD test for unsupported backend.")
    qibo.set_backend(backend)
    h = hamiltonians.XXZ(3, trotter=trotter)
    qaoa = models.QAOA(h)
    initial_p = [0.05, 0.06, 0.07, 0.08]
    best, params, _ = qaoa.minimize(initial_p, method=method, options=options)
    if filename is not None:
        assert_regression_fixture(params, filename)
    qibo.set_backend(original_backend)
コード例 #13
0
ファイル: qaoa.py プロジェクト: NourO93/qibo
def main(nqubits,
         nangles,
         trotter=False,
         solver="exp",
         method="Powell",
         maxiter=None):
    """Performs a QAOA minimization test."""

    print("Number of qubits:", nqubits)
    print("Number of angles:", nangles)

    hamiltonian = hamiltonians.XXZ(nqubits=nqubits, trotter=trotter)
    start_time = time.time()
    qaoa = models.QAOA(hamiltonian, solver=solver)
    creation_time = time.time() - start_time

    target = np.real(np.min(hamiltonian.eigenvalues().numpy()))
    print("\nTarget state =", target)

    np.random.seed(0)
    initial_parameters = np.random.uniform(0, 0.1, nangles)

    start_time = time.time()
    options = {'disp': True, 'maxiter': maxiter}
    best, params, _ = qaoa.minimize(initial_parameters,
                                    method=method,
                                    options=options)
    minimization_time = time.time() - start_time

    epsilon = np.log10(1 / np.abs(best - target))
    print("Found state =", best)
    print("Final eps =", epsilon)

    print("\nCreation time =", creation_time)
    print("Minimization time =", minimization_time)
    print("Total time =", minimization_time + creation_time)