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)]
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