Beispiel #1
0
 def test_maxcut_qaoa_large(self):
     G = nx.random_regular_graph(3, 20, seed=1)
     w = nx.adjacency_matrix(G, nodelist=range(G.number_of_nodes()))
     obj = partial(maxcut_obj, w=w)
     C, offset = get_maxcut_operator(w)
     start = time.time()
     varopt = VariationalQuantumOptimizerSequential(
         obj,
         'COBYLA',
         initial_point=np.zeros(2),
         optimizer_parameters={
             'maxiter': 1,
             'disp': True
         },
         varform_description={
             'name': 'QAOA',
             'p': 1,
             'cost_operator': C,
             'num_qubits': G.number_of_nodes()
         },
         backend_description={
             'package': 'qiskit',
             'provider': 'Aer',
             'name': 'qasm_simulator'
         },
         problem_description={
             'offset': offset,
             'do_not_check_cost_operator': True
         },
         execute_parameters=self.execute_parameters)
     res = varopt.optimize()
     end = time.time()
     self.assertTrue(end - start < 1)
    def test_qaoa_pass_mixer(self):
        w = np.array([[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]])
        C, offset = get_maxcut_operator(w)
        var_form_operator_mix = VarForm(varform_description={
            'name': 'QAOA',
            'p': 2,
            'cost_operator': C,
            'num_qubits': 4
        })
        # build initial state circuit
        initial_state_circuit = QuantumCircuit(4)
        initial_state_circuit.u2(0, np.pi, range(4))

        # build transverse field mixer circuit
        mixer_circuit = QuantumCircuit(4)
        beta = Parameter('beta')
        for q1 in range(4):
            mixer_circuit.h(q1)
            mixer_circuit.rz(2 * beta, q1)
            mixer_circuit.h(q1)
        # pass it to variational form
        var_form_circuit_mix = VarForm(
            varform_description={
                'name': 'QAOA',
                'p': 2,
                'cost_operator': C,
                'num_qubits': 4,
                'use_mixer_circuit': True,
                'mixer_circuit': mixer_circuit,
                'initial_state_circuit': initial_state_circuit
            })

        self.assertEqual(var_form_operator_mix.num_parameters,
                         var_form_circuit_mix.num_parameters)
        parameters = np.random.uniform(0, np.pi,
                                       var_form_operator_mix.num_parameters)
        sv_operator_mix = var_form_operator_mix.run(parameters,
                                                    backend_description={
                                                        'package':
                                                        'qiskit',
                                                        'provider':
                                                        'Aer',
                                                        'name':
                                                        'statevector_simulator'
                                                    },
                                                    execute_parameters={})
        sv_circuit_mix = var_form_circuit_mix.run(parameters,
                                                  backend_description={
                                                      'package':
                                                      'qiskit',
                                                      'provider':
                                                      'Aer',
                                                      'name':
                                                      'statevector_simulator'
                                                  },
                                                  execute_parameters={})
        # check that the two statevectors are equal up to global phase
        phase_diff = sv_circuit_mix / sv_operator_mix
        self.assertTrue(
            np.allclose(phase_diff, np.full(phase_diff.shape, phase_diff[0])))
Beispiel #3
0
 def test_maxcut_qaoa_smooth(self):
     import logging
     logging.disable(logging.CRITICAL)
     C, offset = get_maxcut_operator(self.w)
     varopt = VariationalQuantumOptimizerSequential(
         self.obj,
         'COBYLA',
         initial_point=[np.pi / 4, 0, 0, np.pi / 2],
         optimizer_parameters=self.optimizer_parameters,
         varform_description={
             'name': 'QAOA',
             'p': 15,
             'cost_operator': C,
             'num_qubits': 4
         },
         backend_description={
             'package': 'qiskit',
             'provider': 'Aer',
             'name': 'statevector_simulator'
         },
         problem_description={
             'offset': offset,
             'smooth_schedule': True
         },
         execute_parameters=self.execute_parameters)
     res = varopt.optimize()
     self.assertTrue(res['min_val'] < -3.5)
     logging.disable(logging.NOTSET)
Beispiel #4
0
 def test_maxcut_qaoa_sv(self):
     import logging
     logging.disable(logging.CRITICAL)
     C, offset = get_maxcut_operator(self.w)
     varopt = VariationalQuantumOptimizerSequential(
         self.obj,
         'COBYLA',
         optimizer_parameters=self.optimizer_parameters,
         varform_description={
             'name': 'QAOA',
             'p': 2,
             'cost_operator': C,
             'num_qubits': 4
         },
         backend_description={
             'package': 'qiskit',
             'provider': 'Aer',
             'name': 'statevector_simulator'
         },
         problem_description={'offset': offset},
         execute_parameters=self.execute_parameters)
     varopt.optimize()
     res = varopt.get_optimal_solution()
     self.assertEqual(res[0], -4)
     self.assertTrue(
         np.array_equal(res[1], np.array([1, 0, 0, 1]))
         or np.array_equal(res[1], np.array([0, 1, 1, 0])))
     logging.disable(logging.NOTSET)
 def setUp(self):
     self.varform_description = {'name':'RYRZ', 'num_qubits':4, 'depth':1}
     self.backend_description={'package':'mpsbackend'}
     self.execute_parameters={'shots':100}
     self.w = np.array([[0,1,1,0],[1,0,1,1],[1,1,0,1],[0,1,1,0]])
     self.obj = partial(maxcut_obj, w=self.w) 
     self.C, _ = get_maxcut_operator(self.w)
 def test_precompute_obj_cost_ham(self):
     w = nx.adjacency_matrix(self.G,
                             nodelist=range(self.G.number_of_nodes()))
     C, offset = get_maxcut_operator(w)
     cost_diag = cost_operator_to_vec(C, offset)
     precomputed = precompute_obj(self.obj, self.G.number_of_nodes())
     self.assertTrue(np.allclose(cost_diag, precomputed))
 def test_qasm_sv_obj_peterson(self):
     elist = [[0, 1], [1, 2], [2, 3], [3, 4], [4, 0], [0, 5], [1, 6], [2, 7], [3, 8], [4, 9], [5, 7], [5, 8], [6, 8], [6, 9], [7, 9]]
     G = nx.OrderedGraph()
     G.add_edges_from(elist)
     def obj_f_cut(x):
         cut = 0
         for i, j in G.edges():
             if x[i] != x[j]:
                 # the edge is cut
                 cut -= 1
         return cut
     w = nx.adjacency_matrix(G, nodelist=range(10)).toarray()
     obj = partial(maxcut_obj,w=w)
     C, _ = get_maxcut_operator(w)
     brute_force_opt_imported, _ = brute_force(obj, G.number_of_nodes())
     brute_force_opt_custom, _ = brute_force(obj_f_cut, G.number_of_nodes())
     self.assertEqual(brute_force_opt_imported, brute_force_opt_custom)
     obj_sv = ObjectiveWrapper(obj, 
             varform_description={'name':'QAOA', 'p':9, 'num_qubits':10, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'statevector_simulator'}, 
             objective_parameters={'save_resstrs':True},
             execute_parameters={})
     obj_qasm = ObjectiveWrapper(obj, 
             varform_description={'name':'QAOA', 'p':9, 'num_qubits':10, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'qasm_simulator'}, 
             objective_parameters={'save_resstrs':True},
             execute_parameters={'shots':10000})
     obj_sv_custom = ObjectiveWrapper(obj_f_cut, 
             varform_description={'name':'QAOA', 'p':9, 'num_qubits':10, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'statevector_simulator'}, 
             objective_parameters={'save_resstrs':True},
             execute_parameters={})
     obj_qasm_custom = ObjectiveWrapper(obj_f_cut, 
             varform_description={'name':'QAOA', 'p':9, 'num_qubits':10, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'qasm_simulator'}, 
             objective_parameters={'save_resstrs':True},
             execute_parameters={'shots':10000})
     parameters = np.array([5.192253984583296, 5.144373231492732, 5.9438949617723775, 5.807748946652058, 3.533458907810596, 6.006206583282401, 6.122313961527631, 6.218468942101044, 6.227704753217614, 0.3895570099244132, -0.1809282325810937, 0.8844522327007089, 0.7916086532373585, 0.21294534589417236, 0.4328896243354414, 0.8327451563500539, 0.7694639329585451, 0.4727893829336214]) 
     sv_imported = obj_sv.get_obj()(parameters)
     resstrs_sv_imported = list(sorted(state_to_ampl_counts(obj_sv.resstrs[0],eps=0.01).items(), key=itemgetter(0))) 
     qasm_imported = obj_qasm.get_obj()(parameters)
     resstrs_qasm_imported = list(("".join(str(x) for x in k),v) for k, v in Counter(tuple(x) for x in obj_qasm.resstrs[0]).items() if v > 5)
     sv_custom = obj_sv_custom.get_obj()(parameters)
     resstrs_sv_custom = list(sorted(state_to_ampl_counts(obj_sv_custom.resstrs[0],eps=0.01).items(), key=itemgetter(0))) 
     qasm_custom = obj_qasm_custom.get_obj()(parameters)
     resstrs_qasm_custom = list(("".join(str(x) for x in k),v) for k, v in Counter(tuple(x) for x in obj_qasm_custom.resstrs[0]).items() if v > 5)
     self.assertTrue(set(x[0] for x in resstrs_sv_imported) == set(x[0] for x in resstrs_sv_custom))
     self.assertTrue(set(x[0] for x in resstrs_sv_imported) == set(x[0] for x in resstrs_qasm_imported))
     self.assertTrue(set(x[0] for x in resstrs_sv_custom) == set(x[0] for x in resstrs_qasm_custom))
     self.assertTrue(np.isclose(sv_imported, brute_force_opt_custom,rtol=0.01))
     self.assertTrue(np.isclose(sv_imported, sv_custom))
     self.assertTrue(np.isclose(sv_imported, qasm_imported, rtol=0.01))
     self.assertTrue(np.isclose(sv_custom, qasm_custom, rtol=0.01))
 def test_qaoa_maxcut(self):
     w = np.array([[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]])
     C, offset = get_maxcut_operator(w)
     var_form = VarForm(varform_description={
         'name': 'QAOA',
         'p': 2,
         'cost_operator': C,
         'num_qubits': 4
     })
     parameters = np.random.uniform(0, np.pi, var_form.num_parameters)
     execute_parameters = {'shots': 100}
     resstrs = var_form.run(parameters,
                            backend_description={
                                'package': 'qiskit',
                                'provider': 'Aer',
                                'name': 'qasm_simulator'
                            },
                            execute_parameters=execute_parameters)
     self.assertEqual(len(resstrs), execute_parameters['shots'])
     self.assertTrue(all(len(x) == 4 for x in resstrs))
 def test_qasm_sv_obj_from_elist(self):
     elist = [[3,1],[3,2],[0,1],[0,2],[1,2]]
     G = nx.OrderedGraph()
     G.add_edges_from(elist)
     def obj_f_cut(x):
         cut = 0
         for i, j in G.edges():
             if x[i] != x[j]:
                 # the edge is cut
                 cut -= 1
         return cut
     w = nx.adjacency_matrix(G, nodelist=range(4)).toarray()
     obj = partial(maxcut_obj,w=w)
     C, _ = get_maxcut_operator(w)
     obj_sv = ObjectiveWrapper(obj, 
             varform_description={'name':'QAOA', 'p':10, 'num_qubits':4, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'statevector_simulator'}, 
             execute_parameters={}).get_obj()
     obj_qasm = ObjectiveWrapper(obj, 
             varform_description={'name':'QAOA', 'p':10, 'num_qubits':4, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'qasm_simulator'}, 
             execute_parameters={'shots':10000}).get_obj()
     obj_sv_custom = ObjectiveWrapper(obj_f_cut, 
             varform_description={'name':'QAOA', 'p':10, 'num_qubits':4, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'statevector_simulator'}, 
             execute_parameters={}).get_obj()
     obj_qasm_custom = ObjectiveWrapper(obj_f_cut, 
             varform_description={'name':'QAOA', 'p':10, 'num_qubits':4, 'cost_operator':C}, 
             backend_description={'package':'qiskit', 'provider':'Aer', 'name':'qasm_simulator'}, 
             execute_parameters={'shots':10000}).get_obj()
     parameters = np.array([ 5.97337687,  2.58355601,  1.40698116,  1.41929411, -0.78430107,
     -4.46418963, -0.61290647, -0.59975086,  0.48811492,  4.20269641,
     -2.71558857,  2.82117292,  2.93922949,  2.06076731,  2.19543793,
      2.42960372, -1.0079554 ,  2.22741002, -1.06316475,  0.53106839]) 
     sv_imported = obj_sv(parameters)
     qasm_imported = obj_qasm(parameters)
     sv_custom = obj_sv_custom(parameters)
     qasm_custom = obj_qasm_custom(parameters)
     self.assertTrue(np.isclose(sv_imported, sv_custom))
     self.assertTrue(np.isclose(sv_imported, qasm_imported, rtol=0.01))
     self.assertTrue(np.isclose(sv_custom, qasm_custom, rtol=0.01))
def simulate_qiskit_amps(G, gamma, beta):
    assert len(gamma) == len(beta)
    p = len(gamma)

    w = nx.adjacency_matrix(G, nodelist=list(G.nodes())).toarray()
    obj = partial(maxcut_obj, w=w)
    C, _ = get_maxcut_operator(w)
    parameters = np.concatenate([beta, -np.array(gamma)])

    varform = QAOAVarForm(p=p, cost_operator=C)
    circuit = varform.construct_circuit(parameters)

    circuit_qiskit = transpile(circuit,
                               optimization_level=0,
                               basis_gates=['u1', 'u2', 'u3', 'cx'])
    #print(circuit_qiskit)
    sv = execute(circuit, backend=Aer.get_backend(
        "statevector_simulator")).result().get_statevector()

    res = -obj_from_statevector(sv, obj)
    return res
Beispiel #11
0
 def test_maxcut_qaoa_mixer_circuit(self):
     import logging
     logging.disable(logging.CRITICAL)
     C, offset = get_maxcut_operator(self.w)
     # build transverse field mixer circuit
     mixer_circuit = QuantumCircuit(4)
     beta = Parameter('beta')
     for q1 in range(4):
         mixer_circuit.h(q1)
         mixer_circuit.rz(2 * beta, q1)
         mixer_circuit.h(q1)
     # pass it to variational quantum optimizer
     varopt = VariationalQuantumOptimizerSequential(
         self.obj,
         'COBYLA',
         optimizer_parameters=self.optimizer_parameters,
         varform_description={
             'name': 'QAOA',
             'p': 2,
             'cost_operator': C,
             'num_qubits': 4,
             'use_mixer_circuit': True,
             'mixer_circuit': mixer_circuit
         },
         backend_description={
             'package': 'qiskit',
             'provider': 'Aer',
             'name': 'statevector_simulator'
         },
         problem_description={'offset': offset},
         execute_parameters=self.execute_parameters)
     varopt.optimize()
     res = varopt.get_optimal_solution()
     self.assertEqual(res[0], -4)
     self.assertTrue(
         np.array_equal(res[1], np.array([1, 0, 0, 1]))
         or np.array_equal(res[1], np.array([0, 1, 1, 0])))
     logging.disable(logging.NOTSET)
Beispiel #12
0
                        help="maximum depth to explore")
    args = parser.parse_args()

    #import logging; logging.basicConfig(level=logging.INFO)

    # For testing purposes, hardcode Peterson graph

    elist = [[0, 1], [1, 2], [2, 3], [3, 4], [4, 0], [0, 5], [1, 6], [2, 7],
             [3, 8], [4, 9], [5, 7], [5, 8], [6, 8], [6, 9], [7, 9]]

    G = nx.OrderedGraph()
    G.add_edges_from(elist)

    w = nx.adjacency_matrix(G)
    obj_f_cut = partial(maxcut_obj, G=G)
    C, _ = get_maxcut_operator(w)

    lb = np.array([0, 0] * args.p)
    ub = np.array([np.pi / 2] * args.p + [np.pi] * args.p)

    np.random.seed(0)
    init_theta = np.random.uniform(lb, ub)

    obj_w = ObjectiveWrapper(obj_f_cut,
                             varform_description={
                                 'name': 'QAOA',
                                 'p': args.p,
                                 'cost_operator': C,
                                 'num_qubits': G.number_of_nodes()
                             },
                             backend_description={
Beispiel #13
0
def find_lowest_p(elist, maxiter, rtol):
    G = nx.OrderedGraph()
    G.add_edges_from(elist)

    w = nx.adjacency_matrix(G, nodelist=range(G.number_of_nodes()))
    obj_f = partial(maxcut_obj, G=G)
    C, offset = get_maxcut_operator(w)
    brute_force_opt, _ = brute_force(obj_f, G.number_of_nodes())
    print(f"Brute force optimum: {brute_force_opt}")

    precomputed_energies = precompute_obj(obj_f, G.number_of_nodes())

    init_thetas = [
        [np.pi / 4, 0, 0, np.pi / 2],
        [np.pi / 5, 0, 0, np.pi / 2.5],
        [np.pi / 6, 0, 0, np.pi / 3],
        [np.pi / 7, 0, 0, np.pi / 3.5],
        [np.pi / 8, 0, 0, np.pi / 4],
    ]

    for p in range(2, 100):
        start = time.time()
        if is_master:
            start = MPI.Wtime()
        varopt = VariationalQuantumOptimizerAPOSMM(
            obj_f,
            'scipy_COBYLA',
            gen_specs_user={
                'initial_sample_size': len(init_thetas),
                'sample_points': init_thetas,
                'max_active_runs': len(init_thetas),
                'run_max_eval': maxiter
            },
            variable_bounds=[(0, np.pi / 2), (0, np.pi / 2), (0, np.pi),
                             (0, np.pi)],
            optimizer_parameters={'maxiter': maxiter},
            varform_description={
                'name': 'QAOA',
                'p': p,
                'cost_operator': C,
                'num_qubits': G.number_of_nodes()
            },
            backend_description={
                'package': 'qiskit',
                'provider': 'Aer',
                'name': 'statevector_simulator'
            },
            execute_parameters={},
            problem_description={
                'offset': offset,
                'smooth_schedule': True,
                'do_not_check_cost_operator': True
            },
            objective_parameters={
                'precomputed_energies': precomputed_energies
            })

        res = varopt.optimize()
        if is_master:
            end = MPI.Wtime()

            print(
                f"Found {res['min_val']} at p={p} with theta: [{', '.join('{:0.2f}'.format(i) for i in res['opt_params'])}] in {res['num_optimizer_evals']} evals, {end-start:.2f} sec, {G.number_of_nodes()} nodes",
                flush=True)
            if abs(res['min_val'] - brute_force_opt) < abs(
                    rtol * brute_force_opt):
                for rank in range(1, world_size):
                    MPI.COMM_WORLD.send(RETURN_FLAG, dest=rank)
                return p, res
            else:
                for rank in range(1, world_size):
                    MPI.COMM_WORLD.send(BLANK_FLAG, dest=rank)
        else:
            flag = MPI.COMM_WORLD.recv(source=0)
            if flag == RETURN_FLAG:
                return
Beispiel #14
0
    for i, j in G.edges():
        if x[i] != x[j]:
            # the edge is cut
            cut -= 1
    return cut


elist = [[0, 1], [1, 2], [2, 3], [3, 4], [4, 0], [0, 5], [1, 6], [2, 7],
         [3, 8], [4, 9], [5, 7], [5, 8], [6, 8], [6, 9], [7, 9]]

G = nx.OrderedGraph()
G.add_edges_from(elist)

w = nx.adjacency_matrix(G)
obj = partial(maxcut_obj, G=G)
C, offset = get_maxcut_operator(w)

p = 10
lb = np.array([0, 0] * p)
ub = np.array([np.pi / 2] * p + [np.pi] * p)

np.random.seed(0)
init_theta = np.random.uniform(lb, ub)
print(f"Init point: {init_theta}")

np.random.seed(0)
varopt_aposmm = VariationalQuantumOptimizerAPOSMM(
    obj,
    'scipy_COBYLA',
    initial_point=init_theta,
    optimizer_parameters={