def test_qaoa_energy_vs_qiskit(test_problem): G, gamma, beta = test_problem print('no_zz', G.number_of_nodes(), G.number_of_edges(), len(gamma)) sim = QAOAQtreeSimulator(QtreeQAOAComposer) with prof.timing('QTensor energy time'): E = sim.energy_expectation(G, gamma=gamma, beta=beta) assert E gamma, beta = -np.array(gamma) * 2 * np.pi, np.array(beta) * np.pi with prof.timing('Qiskit energy time'): qiskit_E = simulate_qiskit_amps(G, gamma, beta) assert np.isclose(E, qiskit_E)
def test_qaoa_energy_multithread(): G, gamma, beta = get_test_problem() sim = QAOAQtreeSimulator(QtreeQAOAComposer) res = sim.energy_expectation_parallel(G, gamma=gamma, beta=beta, n_processes=4) print('result parallel', res) assert res res_1 = sim.energy_expectation(G, gamma=gamma, beta=beta) print('result serial', res_1) assert res_1 - res < 1e-6
def test_default_qaoa_energy_vs_qiskit(test_problem): G, gamma, beta = test_problem print('default', G.number_of_nodes(), G.number_of_edges(), len(gamma)) sim = QAOAQtreeSimulator(DefaultQAOAComposer) with prof.timing('QTensor energy time'): E = sim.energy_expectation(G, gamma=gamma, beta=beta) assert E gamma, beta = -np.array(gamma) * 2 * np.pi, np.array(beta) * np.pi with prof.timing('Qiskit energy time'): qiskit_E = simulate_qiskit_amps(G, gamma, beta, shots=QISKIT_SHOTS) assert np.isclose(E, qiskit_E, rtol=REL_MARGIN)
def qaoa_energy_sim(nodes, seed, degree, p, graph_type, max_time, max_tw, ordering_algo, backend, n_processes, profile, composer_type='default'): np.random.seed(seed) random.seed(seed) if graph_type == 'random_regular': G = nx.random_regular_graph(degree, nodes, seed=seed) elif graph_type == 'erdos_renyi': G = nx.erdos_renyi_graph(nodes, degree / (nodes - 1), seed=seed) else: raise Exception('Unsupported graph type') gamma, beta = [np.pi / 3] * p, [np.pi / 2] * p optimizer = get_ordering_algo(ordering_algo) Backend = choose_backend(backend) backend_obj = Backend() if profile: backend_obj = PerfBackend(print=False) backend_obj.backend = Backend() sim = QAOAQtreeSimulator(DefaultQAOAComposer, bucket_backend=backend_obj, optimizer=optimizer) start = time.time() if n_processes == 1: result = sim.energy_expectation(G, gamma, beta) if profile: print('Profiling results') backend_obj.gen_report() else: result = sim.energy_expectation_parallel(G, gamma, beta, n_processes=n_processes) end = time.time() print(f"Simutation time: {end - start}") print(result)
def test_qtree_energy(): G, gamma, beta = get_test_problem(16, 2, d=3) sim = QAOAQtreeSimulator(QtreeQAOAComposer) E = sim.energy_expectation(G=G, gamma=gamma, beta=beta) print('Energy', E) assert np.imag(E) < 1e-6 E = np.real(E) Ed = G.number_of_edges() C = (Ed - E) / 2 print("Edges", Ed) print("Cost", C) assert E
def test_qaoa_energy_feynman(): G, gamma, beta = get_test_problem(10, 3, 3) sim = QAOAQtreeSimulator(QtreeQAOAComposer) res = sim.energy_expectation(G, gamma=gamma, beta=beta) print('result simple simulator', res) sim = FeynmanQAOASimulator(QtreeQAOAComposer) sim.optimizer = TreeTrimSplitter(max_tw=13, tw_bias=0) res_1 = sim.energy_expectation(G, gamma=gamma, beta=beta) print('result feynman simulator', res_1) assert np.isclose(res, res_1)
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())