예제 #1
0
def test_create2():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test2', Node('test3')))
    assert [node.name for node in G.dfs()] == ['test1', 'test2', 'test3']
    assert not G.verify_edges()
예제 #2
0
def create_graph(doc):
    G = Graph()

    for node in doc['network']['networkStructure']['nodes']['node']:
        G.add_node(node['@id'], lat=node['coordinates']['x'], lon=node['coordinates']['y'])

    for edge in doc['network']['networkStructure']['links']['link']:
        modules = []
        try: 
            for _,v in edge['additionalModules'].iteritems():
                if isinstance(v,list):
                    for e in v:
                        m = {'capacity': e['capacity'], 'cost': e['cost']}
                        modules.append(m)
                else:
                    m = {'capacity': v['capacity'], 'cost': v['cost']}
                    modules.append(m)
        except KeyError:
            modules = []
        try:
            preInstalled=edge['preInstalledModule']
        except KeyError:
            preInstalled=''

        G.add_edge(edge['source'], edge['target'], preInstalledModule=preInstalled, additionalModules=modules)
    return G
예제 #3
0
def test_match_fail():
    class MatchSuffNode(MatchNode):
        def __init__(self, name, suff):
            super().__init__(name)
            self.suff = suff

        def _match(self, G, node, edge):
            return node.name.endswith(self.suff)

    G = Graph()
    G.add_node(Node("test1a"))
    G.add_edge(Edge('test1a', Node('test2a')))
    G.add_edge(Edge('test2a', Node('test3b')))
    G.add_edge(Edge('test3b', Node('test4a')))

    fragment = Graph()
    fragment.add_node(MatchSuffNode('match1', 'a'))
    fragment.add_node(MatchSuffNode('match2', 'b'))
    fragment.add_edge(Edge('match1', 'match2'))

    res = G.match_fragment(fragment)
    assert len(res) == 1
    assert res[0].num_nodes() == 2
    assert res[0].num_edges() == 1
    assert [node.name for node in res[0].nodes()] == ['test2a', 'test3b']
예제 #4
0
def test_reverse_dfs1():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    expect = ['test1', 'test2', 'test3']
    assert [node.name for node in G.dfs()] == expect
    expect.reverse()
    assert [node.name for node in G.dfs(reverse=True)] == expect
예제 #5
0
def test_create4():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', Node('test3')))
    assert not G.verify_edges()
    G.replace_node('test2', Node('test4'))
    expect = ['test1', 'test4', 'test3']
    assert [node.name for node in G.dfs()] == expect
    expect.reverse()
    assert [node.name for node in G.dfs(reverse=True)] == expect
    assert not G.verify_edges()
예제 #6
0
def test_create1():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', Node('test3')))
    expect = ['test1', 'test2', 'test3']
    assert [node.name for node in G.dfs()] == expect
    expect.reverse()
    assert [node.name for node in G.dfs(reverse=True)] == expect
    assert G.num_in_edges('test1') == 0
    assert G.num_out_edges('test1') == 1
    assert not G.verify_edges()
예제 #7
0
def test_match_and_remove():
    G = Graph()
    G.add_node(Node("test0"))
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test0', 'test1'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4'))
    G.add_edge(Edge('test4', Node('test5')))

    fragment = Graph()
    fragment.add_node(MatchNameNode("test1"))
    fragment.add_node(MatchNameNode('test2'))
    fragment.add_edge(Edge('test1', 'test2'))
    fragment.add_edge(Edge('test1', MatchNameNode('test3')))

    res = G.match_fragment(fragment)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
    G.remove_fragment(res[0])
    assert [node.name for node in G.dfs()] == ['test0', 'test4', 'test5']
    assert not G.verify_edges()
예제 #8
0
def test_create5():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4'))
    assert G.num_in_edges('test4') == 2
    assert G.num_out_edges('test1') == 2
    assert [node.name
            for node in G.dfs()] == ['test1', 'test2', 'test3', 'test4']
    assert not G.verify_edges()
예제 #9
0
def test_all_predecessors():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4', to_idx=1))
    preds = set()
    for node in G.all_predecessors('test4'):
        assert node.name not in preds
        preds.add(node.name)
    test_fn = lambda name: set(node.name for node in G.all_predecessors(name))
    assert set(['test1', 'test2', 'test3']) == test_fn('test4')
    assert set(['test1']) == test_fn('test2')
    assert set(['test1']) == test_fn('test3')
    assert not test_fn('test1')
예제 #10
0
def test_insert():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4', to_idx=2))

    G.insert_node(Node('test5'), 'test2', 'test4')

    nodes = [node.name for node in G.dfs()]
    assert nodes == ['test1', 'test2', 'test5', 'test3', 'test4']
    suc = G.successor_names('test5')
    pred = G.predecessor_names('test5')
    assert len(suc) == 1 and 'test4' in suc
    assert len(pred) == 1 and 'test2' in pred
    assert not G.verify_edges()
예제 #11
0
def test_match1():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test3', 'test4'))
    assert not G.verify_edges()

    fragment = GraphMatcher()
    fragment.add_edge(
        MatchEdgeByIdx(from_node=MatchNodeByName("test1"),
                       to_node=MatchNodeByName('test2')))

    res = fragment.match_graph(G)
    assert len(res) == 1
    assert len(res[0]) == 2
    assert res[0].num_edges() == 1
예제 #12
0
def test_remove_edge():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', Node('test3')))
    assert [node.name for node in G.dfs()] == ['test1', 'test2', 'test3']
    assert G.num_edges() == 2
    edge12 = G.edge('test1', 'test2')
    assert edge12.from_node.name == 'test1' and edge12.from_idx == 0
    assert edge12.to_node.name == 'test2' and edge12.to_idx == 0
    assert not G.verify_edges()
    G.remove_edge(edge12)
    assert G.num_edges() == 1
    assert G.num_in_edges('test1') == 0
    assert G.num_out_edges('test1') == 0
    assert G.num_in_edges('test2') == 0
    assert G.num_out_edges('test2') == 1
    assert G.num_in_edges('test3') == 1
    assert G.num_out_edges('test3') == 0
    assert not G.verify_edges()
예제 #13
0
def test_match4alt():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_node(Node('test3'))
    G.add_node(Node('test4'))
    G.add_node(Node('test5'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4', to_idx=1))
    G.add_edge(Edge('test4', 'test5'))

    fragment = GraphMatcher()
    m2 = MatchNodeByName("test2")
    m3 = MatchNodeByName('test3')
    m4 = MatchNodeByName('test4')
    e1 = MatchEdgeInputsGroupFactory()

    fragment.add_edge(e1.get_edge(from_node=m2, to_node=m4))
    fragment.add_edge(e1.get_edge(from_node=m3, to_node=m4))

    res = fragment.match_graph(G)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
예제 #14
0
def test_match3(caplog):
    caplog.set_level(logging.DEBUG)
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    # not the same - look here

    fragment = GraphMatcher()
    n1 = MatchNodeByName('test1')
    fragment.add_edge(
        MatchEdgeByIdx(from_node=n1, to_node=MatchNodeByName('test2')))
    fragment.add_edge(
        MatchEdgeByIdx(from_node=n1, to_node=MatchNodeByName('test3')))

    res = fragment.match_graph(G)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
예제 #15
0
def test_match_fail(caplog):
    caplog.set_level(logging.DEBUG)

    class MatchSuffNode(NodeMatch):
        def __init__(self, suff):
            self._suff = suff
            self._has_matched = False

        def match(self, G, node, state):
            if self._has_matched:
                return False
            if node.name.endswith(self._suff):
                self._has_matched = True
                return True
            return False

        def commit_match(self, G, node, state):
            pass

        def reset_match(self, G, state, node=None, init=False):
            self._has_matched = False

    G = Graph()
    G.add_node(Node("test1a"))
    G.add_edge(Edge('test1a', Node('test2a')))
    G.add_edge(Edge('test2a', Node('test3b')))
    G.add_edge(Edge('test3b', Node('test4a')))

    fragment = GraphMatcher()
    fragment.add_edge(
        MatchEdgeByIdx(from_node=MatchSuffNode('a'),
                       to_node=MatchSuffNode('b')))

    res = fragment.match_graph(G)
    assert len(res) == 1
    assert res[0].num_nodes() == 2
    assert res[0].num_edges() == 1
    assert set([node.name
                for node in res[0].nodes()]) == set(['test2a', 'test3b'])
예제 #16
0
def test_match4():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_node(Node('test3'))
    G.add_node(Node('test4'))
    G.add_node(Node('test5'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4', to_idx=1))
    G.add_edge(Edge('test4', 'test5'))

    fragment = Graph()
    fragment.add_node(MatchNameNode("test2"))
    fragment.add_node(MatchNameNode('test3'))
    fragment.add_node(MatchNameNode('test4'))
    fragment.add_edge(Edge('test2', 'test4'))
    fragment.add_edge(Edge('test3', 'test4', to_idx=1))

    res = G.match_fragment(fragment)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
예제 #17
0
def test_match1():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test3', 'test4'))
    assert not G.verify_edges()

    fragment = Graph()
    fragment.add_node(MatchNameNode("test1"))
    fragment.add_node(MatchNameNode('test2'))
    fragment.add_edge(Edge('test1', 'test2'))
    assert not fragment.verify_edges()

    res = G.match_fragment(fragment)
    assert len(res) == 1
    assert len(res[0]) == 2
    assert res[0].num_edges() == 1
예제 #18
0
def test_match3():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test1', Node('test3')))
    G.add_node(Node('test4'))
    G.add_edge(Edge('test2', 'test4'))
    # not the same - look here

    fragment = Graph()
    fragment.add_node(MatchNameNode("test1"))
    fragment.add_node(MatchNameNode('test2'))
    fragment.add_edge(Edge('test1', 'test2'))
    fragment.add_edge(Edge('test1', MatchNameNode('test3')))

    res = G.match_fragment(fragment)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
예제 #19
0
def test_match4():
    G = Graph()
    G.add_node(Node("test1"))
    G.add_node(Node('test2'))
    G.add_node(Node('test3'))
    G.add_node(Node('test4'))
    G.add_node(Node('test5'))
    G.add_edge(Edge('test1', 'test2'))
    G.add_edge(Edge('test2', 'test4'))
    G.add_edge(Edge('test3', 'test4', to_idx=1))
    G.add_edge(Edge('test4', 'test5'))

    fragment = GraphMatcher()
    m2 = MatchNodeByName("test2")
    m3 = MatchNodeByName('test3')
    m4 = MatchNodeByName('test4')
    fragment.add_edge(MatchEdgeByIdx(from_node=m2, to_node=m4))
    fragment.add_edge(MatchEdgeByIdx(from_node=m3, to_node=m4, to_idx=1))

    res = fragment.match_graph(G)
    assert len(res) == 1
    assert res[0].num_nodes() == 3
    assert res[0].num_edges() == 2
예제 #20
0
    searcher = Searcher(mat=adjacency_matrix)
    start_node_idx = 0

    routes = searcher.generate_tree(start_node_idx)

    start_point = nodes[start_node_idx]
    for idx in routes[8]["path"] + searcher.generate_tree(
            8)[2]["path"] + searcher.generate_tree(2)[11]["path"]:
        end_point = nodes[idx]
        plt.arrow(start_point[0],
                  start_point[1],
                  end_point[0] - start_point[0],
                  end_point[1] - start_point[1],
                  head_width=0.5,
                  head_length=0.5,
                  color='blue',
                  zorder=3,
                  length_includes_head=True)
        start_point = end_point

    plt.plot(*splitxy(nodes), 'ro', label="hi")

    graph = Graph()
    for node in nodes:
        graph.add_node(node[0], node[1])

    print(graph.adjacency_list)
    print(graph.matrix)
    # plt.show()