#!/usr/bin/env python3 import util.script as script import util.queries as queries import util.graph as graph import networkx as nx import dwave_networkx as dnx from neal import SimulatedAnnealingSampler import dimod from dwave.system.composites import FixedEmbeddingComposite from dwave.system.samplers import DWaveSampler from tqdm import tqdm __QUBO__ = 1 __ISING__ = 2 def main(): mode = __get_mode() ising_qubo_collection = input("ising/qubo collection: ") model_type = __get_model_type() result_collection = input("result collection: ") if mode == "SIMAN": __run_siman(ising_qubo_collection, model_type, result_collection) elif mode == "QPU": __run_qpu(ising_qubo_collection, model_type, result_collection) def __get_negation(): print("qubo_negation:") print("(t)rue ") print("(f)alse") mode = input() if mode == "t": return True else: return False def __get_mode(): print("choose mode:") print("(1) simulated annealing") print("(2) qpu") mode = int(input()) if mode == 1: return "SIMAN" elif mode == 2: return "QPU" def __get_model_type(): print("model types:") print("(q) qubo") print("(i) ising") model_type = input("choose: ") if model_type == "q": return __QUBO__ if model_type == "i": return __ISING__ def __run_siman(ising_qubo_collection, model_type, result_collection): db = script.connect_to_instance_pool() target_graph = dnx.chimera_graph(16, 16, 4) target_graph_id = queries.get_id_of_solver_graph(db["solver_graphs"], nx.node_link_data(target_graph)) solver_input_query = __get_solver_input_query(db, target_graph_id, ising_qubo_collection) base_sampler = SimulatedAnnealingSampler() chimera_sampler = dimod.StructureComposite(base_sampler, target_graph.nodes(), target_graph.edges()) __run_on_scope(solver_input_query, db[result_collection], chimera_sampler, model_type=model_type, negate=__get_negation()) def __run_qpu(ising_qubo_collection, model_type, result_collection): db = script.connect_to_instance_pool() base_solver = DWaveSampler() solver_graph_id = __get_solver_graph_id(db, base_solver.solver) solver_input_query = __get_solver_input_query(db, solver_graph_id, ising_qubo_collection) solver_args = {} solver_args["annealing_time"] = int(input("annealing time (in us): ")) solver_args["num_reads"] = int(input("number of reads per instance: ")) __run_on_scope(solver_input_query, db[result_collection], base_solver, model_type, negate=__get_negation(), solver_args=solver_args) def __get_solver_graph_id(db, solver): solver_graph = graph.create_qpu_solver_nxgraph(solver) return queries.get_id_of_solver_graph(db["solver_graphs"], nx.node_link_data(solver_graph)) def __get_solver_input_query(db, solver_graph_id, ising_qubo_collection): scope = input("scope: ") solver_input_query = queries.WMIS_solver_input_scope_query(db, ising_qubo_collection) solver_input_query.query(scope, solver_graph_id) return solver_input_query def __run_on_scope(solver_input_query, result_collection, base_solver, model_type, negate=False, solver_args={}): run = int(input("save as run (numbered): ")) for solver_input in tqdm(solver_input_query): embedding = solver_input["embeddings"][0] qubo = __negate_qubo(solver_input["qubo"]) if negate else solver_input["qubo"] solver = FixedEmbeddingComposite(base_solver, embedding) res = None if model_type == __QUBO__: res = solver.sample_qubo(qubo, **solver_args) elif model_type == __ISING__: h, J = graph.split_ising(qubo) res = solver.sample_ising(h, J, **solver_args) script.save_sample_set(result_collection, res, solver_input, emb_list_index = 0, run = run) def __negate_qubo(qubo): negative_qubo = {} for coupler, energy in qubo.items(): negative_qubo[coupler] = -1 * energy return negative_qubo if __name__ == "__main__": main()