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)
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()
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=}")