def detach(self, indices=None): if indices is None: segments = [list(range(len(self)))] return Structures(self.points, segments, self.adjacency) else: points = self.points[indices] adjacency = subgraph(self.adjacency, indices) clockwise = find_clockwise(points, adjacency) segments = [clockwise_traversal((0, 1), adjacency, clockwise)] return Structures(points, segments, adjacency)
def check_isomorphism(adjacency, clockwise, other_adjacency): """Returns True if two plane graphs rooted graphs are isomorphs else False""" for i in adjacency[0]: edge = (0, i) traversal = clockwise_traversal(edge, adjacency, clockwise) permuted_adjacency = subgraph(adjacency, traversal) if permuted_adjacency == other_adjacency: return True return False
def select_segments(indices, points, segments, adjacency=None): if adjacency is not None: adjacency = subgraph(adjacency, sorted(in_groups(segments))) segments = [segments[i] for i in indices] points = points[sorted(in_groups(segments))] segments = relabel_groups(segments) if adjacency is None: return points, segments else: return points, segments, adjacency
def subgraph_isomorphism(adjacency, clockwise, subgraph_adjacency): # TODO : Implement in Cython """Returns all clockwise ordered subgraph isomorphs. Parameters: ---------- adjacency : list of sets Adjacency list of larger graph, ordered according to a clockwise traversal clockwise : dict Dictionary directed edges as keys mapping to the next adjacent edge in the clockwise direction. subgraph_adjacency : list of sets Adjacency list of smaller graph, ordered according to a clockwise traversal """ outer_queue = [] for i in adjacency[0]: outer_queue.append(Traversal([(0, i)], [], set())) subgraph_order = len(subgraph_adjacency) subgraph_adjacents = [subgraph_adjacency[n] - set(range(n)) for n in range(subgraph_order)] degree = [len(adjacent) for adjacent in adjacency] results = [] while outer_queue: traversal = outer_queue.pop(0) n = len(traversal) if n == subgraph_order: print(traversal.order,subgraph(adjacency, traversal.order)) if subgraph(adjacency, traversal.order) == subgraph_adjacency: results.append(traversal) continue elif len(traversal.edges) == 0: continue else: edge = traversal.edges.pop(0) if not edge[0] in traversal.marked: for i in range(degree[edge[0]]): edge = clockwise[edge] if edge[1] not in traversal.marked: traversal.edges.append((edge[1], edge[0])) traversal.marked.add(edge[0]) traversal.order.append(edge[0]) adjacent = adjacency[edge[0]] - traversal.marked discrepancy = len(adjacent) - len(subgraph_adjacents[n]) if discrepancy > 0: if len(subgraph_adjacents[n]) == 0: traversal.marked.update(adjacent) outer_queue.append(traversal) else: for i, combination in enumerate(itertools.combinations(adjacent, discrepancy)): #if i == 0: # outer_queue.append(traversal) #else: outer_queue.append(traversal.copy()) outer_queue[-1].marked.update(set(combination)) elif discrepancy < 0: #outer_queue.append(traversal) pass # TODO : Is this OK? else: outer_queue.append(traversal) else: outer_queue.append(traversal) print(results) return [traversal.order for traversal in results]
def adjacency(self): return subgraph(self.structures.adjacency, self.segment)
structures = lattice_traversal(a, b, max_depth=5) points = structures.points adjacency = structures.adjacency clockwise = find_clockwise(points, adjacency) i = 0 n = 20 selected = set((0, )) while len(selected) < n: i = random.sample(adjacency[i], 1)[0] selected.add(i) selected = list(selected) subgraph_points = points[selected] subgraph_adjacency = subgraph(adjacency, selected) root = 0 edge = (root, random.sample(subgraph_adjacency[root], 1)[0]) subgraph_clockwise = find_clockwise(subgraph_points, subgraph_adjacency) traversal = clockwise_traversal(edge, subgraph_adjacency, subgraph_clockwise) subgraph_points = subgraph_points[traversal] subgraph_adjacency = subgraph(subgraph_adjacency, traversal) isomorphisms = subgraph_isomorphism(adjacency, clockwise, subgraph_adjacency) if not show_plots: assert len(isomorphisms) >= 4 quit()
structures = lattice_traversal(a, b, max_depth=3) points = structures.points adjacency = structures.adjacency clockwise = find_clockwise(points, adjacency) i = 0 n = 10 selected = set((0, )) while len(selected) < n: i = random.sample(adjacency[i], 1)[0] selected.add(i) selected = list(selected) subgraph_points = points[selected] subgraph_adjacency = subgraph(adjacency, selected) root = 0 edge = (root, random.sample(subgraph_adjacency[root], 1)[0]) subgraph_clockwise = find_clockwise(subgraph_points, subgraph_adjacency) traversal = clockwise_traversal(edge, subgraph_adjacency, subgraph_clockwise) subgraph_points = subgraph_points[traversal] subgraph_adjacency = subgraph(subgraph_adjacency, traversal) # import matplotlib.pyplot as plt # plt.plot(points[:,0],points[:,1],'o') # plt.plot(subgraph_points[:,0],subgraph_points[:,1],'x') # plt.show()