コード例 #1
0
 def __init__(self, problem_instance: dimod.BinaryQuadraticModel, qpu: Type[QPU], initial_mapping: Mapping = None):
     self.problem = problem_instance
     self.remaining_interactions = problem_instance.to_networkx_graph()
     self.qpu = qpu
     if initial_mapping is None:
         self.initial_mapping = Mapping(self.qpu, self.problem)
     else:
         self.initial_mapping = initial_mapping
     self.mapping = cp.deepcopy(self.initial_mapping)
     self.layers = [Layer(self.qpu)]
コード例 #2
0
ファイル: twoColorMapper.py プロジェクト: MLeib/QAOA
def decompose_into_chains(problem_instance: dimod.BinaryQuadraticModel):
    problem_graph = problem_instance.to_networkx_graph()
    for log_qb in problem_graph:
        problem_graph.add_node(log_qb, endnode=False)
    problem_size = len(problem_graph)
    color_sets = find_edge_coloring(problem_graph)
    color_sets = sorted(color_sets,
                        key=lambda color_set: len(color_set),
                        reverse=True)
    for log_qb0, log_qb1 in problem_graph.edges():
        if frozenset((log_qb0, log_qb1)) in color_sets[0]:
            color0 = problem_graph[log_qb0][log_qb1]['color']
            break
    for log_qb0, log_qb1 in problem_graph.edges():
        if frozenset((log_qb0, log_qb1)) in color_sets[1]:
            color1 = problem_graph[log_qb0][log_qb1]['color']
            break

    def filter_edge(log_qb0, log_qb1) -> bool:
        if problem_graph[log_qb0][log_qb1]['color'] == color0:
            return True
        elif problem_graph[log_qb0][log_qb1]['color'] == color1:
            return True
        else:
            return False

    twocolor_graph = nx.subgraph_view(problem_graph, filter_edge=filter_edge)
    components = [
        twocolor_graph.subgraph(c).copy()
        for c in nx.connected_components(twocolor_graph)
    ]
    chains, loops = [], []
    for component in components:
        deg = 3
        for node in component:
            if component.degree(node) < deg:
                node0 = node
                deg = component.degree(node)
        for neighbor in component.neighbors(node0):
            node1 = neighbor
            break
        lst = [node0, node1]
        for _ in range(len(component) - 2):
            for neighbor in component.neighbors(node1):
                if neighbor is not node0:
                    node0 = node1
                    node1 = neighbor
                    lst.append(node1)
                    break
        if deg == 1:
            chains.append(lst)
        elif deg == 2:
            loops.append(lst)

    return chains, loops