예제 #1
0
 def simulate_one_amp(G, gamma, beta):
     composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
     composer.ansatz_state()
     print(composer.circuit)
     sim = QtreeSimulator()
     result = sim.simulate(composer.circuit)
     print('QTensor 1 amp', result.data)
     print('QTensor 1 prob', np.abs(result.data)**2)
예제 #2
0
    def get_tw_costs(N):
        G, gamma, beta = get_test_problem(N, p=3, d=3)

        composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
        composer.energy_expectation_lightcone(list(G.edges())[0])
        tn = QtreeTensorNet.from_qtree_gates(composer.circuit)
        opt = OrderingOptimizer()
        peo, _ = opt.optimize(tn)
        tw = opt.treewidth
        mems, flops = tn.simulation_cost(peo)
        print('Max memory=', max(mems), 'Total flops=', sum(flops),
              'Treewidth=', tw)
        return tw, max(mems), sum(flops)
예제 #3
0
def test_tamaki_trimming_opt():
    G, gamma, beta = get_test_problem(34, p=3, d=3)

    composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
    composer.ansatz_state()
    sim = FeynmanSimulator()
    sim.optimizer = SlicesOptimizer
    result = sim.simulate(composer.circuit, batch_vars=3, tw_bias=7)
    print(result)

    sim.optimizer = TamakiTrimSlicing
    sim.opt_args = {'wait_time': 5}
    result_tam = sim.simulate(composer.circuit, batch_vars=3, tw_bias=7)
    print(result_tam)
    assert np.allclose(result_tam, result)
예제 #4
0
def test_profiled(capsys):
    G, gamma, beta = get_test_problem()

    composer = QtreeQAOAComposer(graph=G, gamma=[np.pi / 3], beta=[np.pi / 4])
    composer.ansatz_state()

    print(composer.circuit)
    backend = PerfNumpyBackend()
    sim = QtreeSimulator(bucket_backend=backend)

    result = sim.simulate(composer.circuit)
    print("Profile results")
    print(backend.gen_report())

    qtree_amp = result

    assert qtree_amp
예제 #5
0
def test_parallel_batched():
    G, gamma, beta = get_test_problem(14, 3, d=4)
    batch_vars = 3

    composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
    composer.ansatz_state()

    sim = QtreeSimulator()
    amp = sim.simulate(composer.circuit)
    amps = sim.simulate_batch(composer.circuit, batch_vars=2)
    print('ordinary qtree amp', amp)
    print('ordinary qtree 2 amps', amps)
    assert abs(amp - amps[0]) < 1e-6

    sim = FeynmanSimulator()
    result = sim.simulate(composer.circuit, batch_vars=batch_vars, tw_bias=7)
    print(result)

    batch_amps = 2**batch_vars
    assert len(result) == batch_amps
    assert abs(amp - result[0]) < 1e-6
예제 #6
0
def test_qiskit_convert():
    G, gamma, beta = get_test_problem()

    qiskit_com = QiskitQAOAComposer(
        graph=G, gamma=[np.pi/3], beta=[np.pi/4])
    qiskit_com.ansatz_state()

    # Convert Qiskit circuit to Qtree circuit
    n, qc = from_qiskit_circuit(qiskit_com.circuit)
    sim = QtreeSimulator()
    all_gates = sum(qc, [])
    # Simulate converted circuit
    first_amp_from_qiskit = sim.simulate(all_gates)

    com = QtreeQAOAComposer(
        graph=G, gamma=[np.pi/3], beta=[np.pi/4])
    com.ansatz_state()
    # Simulate same circuit but created by Qtree composer
    first_amp_orig = sim.simulate(com.circuit)
    assert np.allclose(*[np.abs(x) for x in (first_amp_from_qiskit, first_amp_orig)])
    assert np.allclose(first_amp_from_qiskit, first_amp_orig)
예제 #7
0
def test_orderings():
    opt = OrderingOptimizer()
    tam = TamakiOptimizer(wait_time=5)
    seed = 43
    np.random.seed(seed)

    for n in range(14, 45, 2):
        p = 3
        G, gamma, beta = get_test_problem(n, p=p)
        composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
        composer.ansatz_state()

        tn = QtreeTensorNet.from_qtree_gates(composer.circuit)

        peo, tn = opt.optimize(tn)
        treewidth = opt.treewidth
        print_row(n, p, seed, 'greedy', treewidth)

        peo, tn = tam.optimize(tn)
        treewidth = tam.treewidth
        print_row(n, p, seed, 'tamaki', treewidth)
예제 #8
0
def test_qtree_smoke():
    G, gamma, beta = get_test_problem()

    composer = QtreeQAOAComposer(
        graph=G, gamma=[np.pi/3], beta=[np.pi/4])
    composer.ansatz_state()

    print(composer.circuit)
    assert composer.circuit
    assert composer.n_qubits == G.number_of_nodes()

    composer = QtreeQAOAComposer(
        graph=G, gamma=[np.pi/3], beta=[np.pi/4])
    composer.energy_expectation_lightcone(list(G.edges())[0])

    print(composer.circuit)
    assert composer.circuit
    assert composer.n_qubits == G.number_of_nodes()
예제 #9
0
def test_qtree():
    G, gamma, beta = get_test_problem()

    composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
    composer.ansatz_state()

    print(composer.circuit)
    sim = QtreeSimulator()
    result = sim.simulate(composer.circuit)
    print(result)
    qtree_amp = result

    composer = CirqQAOAComposer(graph=G, gamma=gamma, beta=beta)
    composer.ansatz_state()

    print(composer.circuit)
    sim = CirqSimulator()
    result = sim.simulate(composer.circuit)
    print(result)
    final_cirq = result.final_state
    assert final_cirq[0] - qtree_amp < 1e-5

    assert result
예제 #10
0
from qtensor.optimisation.Optimizer import OrderingOptimizer
from qtensor.optimisation.TensorNet import QtreeTensorNet
from qtensor import QtreeQAOAComposer
from qtensor import QAOAQtreeSimulator
from qtensor import PerfNumpyBackend
from qtensor import QAOA_energy
import networkx as nx
import numpy as np

G = nx.random_regular_graph(4, 20)
gamma, beta = [np.pi / 3], [np.pi / 2]

composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
composer.ansatz_state()

backend = PerfNumpyBackend(print=True)
sim = QAOAQtreeSimulator(composer, bucket_backend=backend)
sim.simulate(composer.circuit)
print(sim.bucket_backend)
print(backend._profile_results)
print(backend.gen_report())
예제 #11
0
    def add_two_nodes_to_leafs(graph):
        """ Works in-place """
        leaves = [n for n in graph.nodes() if graph.degree(n) <= 1]
        n = graph.number_of_nodes()
        for leaf in leaves:
            graph.add_edges_from([(leaf, n + 1), (leaf, n + 2)])
            n += 2

    graph = nx.Graph()
    graph.add_edges_from([(0, 1)])
    for i in range(n):
        add_two_nodes_to_leafs(graph)
    return graph


D = 6
G = bethe_lattice(D)

for p in range(1, D + 1):
    print(f'{p=}, {G.number_of_nodes()=}')
    gamma, beta = [0.1] * p, [0.2] * p
    composer = QtreeQAOAComposer(graph=G, gamma=gamma, beta=beta)
    composer.energy_expectation_lightcone((0, 1))
    tn = QtreeTensorNet.from_qtree_gates(composer.circuit)
    print(f'{tn.get_line_graph().number_of_nodes()=}')

    opt = OrderingOptimizer()
    peo, tn = opt.optimize(tn)
    treewidth = opt.treewidth
    print(f"{treewidth=}")