示例#1
0
 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
示例#3
0
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]
示例#5
0
 def adjacency(self):
     return subgraph(self.structures.adjacency, self.segment)
示例#6
0
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()
示例#7
0
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()