Exemple #1
0
 def test_remove_edge(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.remove_edge(1, 2)
     assert_graph_eq(rule.lhs, self.pattern)
     assert(('d', 'a') in rule.p.edges())
     assert(('s', 'x') in rule.rhs.edges())
     return
Exemple #2
0
 def test_add_edge(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.add_edge(4, 2)
     assert_graph_eq(rule.lhs, self.pattern)
     assert_graph_eq(rule.p, self.p)
     assert(('s', 'y') in rule.rhs.edges())
     return
Exemple #3
0
 def test_update_node_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.update_node_attrs(4, {'b': 2})
     assert(rule.p.node['d'] is None)
     test_dict = {'b': {2}}
     normalize_attrs(test_dict)
     assert(rule.rhs.node['s'] == test_dict)
     return
Exemple #4
0
 def test_add_edge_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.add_edge_attrs(4, 1, {'amazing': True})
     assert_graph_eq(rule.p, self.p)
     t = {'amazing': {True}}
     normalize_attrs(t)
     assert(rule.rhs.edge['s']['x'] == t)
     return
Exemple #5
0
 def test_update_edge_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.update_edge_attrs(2, 3, {'b': 1})
     assert(rule.p.edge['b']['c'] is None)
     test_dict = {'b': FiniteSet({1})}
     # normalize_attrs(test_dict)
     assert(rule.rhs.edge['y']['z'] == test_dict)
     return
Exemple #6
0
 def merge_node_list(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.merge_node_list([2, 3], 'wow_name')
     assert(rule.lhs == self.pattern)
     assert(rule.p == self.p)
     assert('wow_name' in rule.rhs.nodes())
     assert(('wow_name', 'wow_name') in rule.rhs.edges())
     assert(('wow_name', 'y') in rule.rhs.edges())
Exemple #7
0
 def test_merge_nodes(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     new_name = rule.merge_nodes(1, 4)
     assert_graph_eq(rule.lhs, self.pattern)
     assert_graph_eq(rule.p, self.p)
     assert(new_name in rule.rhs.nodes())
     assert((new_name, new_name) in rule.rhs.edges())
     assert((new_name, 'y') in rule.rhs.edges())
     return
Exemple #8
0
 def test_add_node(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.add_node('g', {'a': 1})
     assert_graph_eq(rule.p, self.p)
     assert_graph_eq(rule.lhs, self.pattern)
     assert('g' in rule.rhs)
     t = {'a': set([1])}
     normalize_attrs(t)
     assert(rule.rhs.node['g'] == t)
     return
Exemple #9
0
 def test_clone_node(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.clone_node(2)
     assert_graph_eq(rule.lhs, self.pattern)
     assert('b1' in rule.p.nodes())
     assert('y1' in rule.rhs.nodes())
     assert(('a', 'b1') in rule.p.edges())
     assert(('b1', 'c') in rule.p.edges())
     assert(('x', 'y1') in rule.rhs.edges())
     assert(('t', 'y1') in rule.rhs.edges())
     return
Exemple #10
0
 def test_remove_node(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.remove_node(2)
     assert_graph_eq(rule.lhs, self.pattern)
     assert('b' not in rule.p.nodes())
     assert(('a', 'b') not in rule.p.edges())
     assert(('b', 'c') not in rule.p.edges())
     assert('y' not in rule.rhs.nodes())
     assert(('x', 'y') not in rule.rhs.edges())
     assert(('t', 'y') not in rule.rhs.edges())
     assert(('y', 'z') not in rule.rhs.edges())
     return
Exemple #11
0
    def test_from_commands(self):
        pattern = nx.DiGraph()
        prim.add_nodes_from(pattern, [(1, {
            'state': 'p'
        }), (2, {
            'name': 'BND'
        }), 3, 4])
        prim.add_edges_from(pattern, [(1, 2, {
            's': 'p'
        }), (3, 2, {
            's': 'u'
        }), (3, 4)])

        p = nx.DiGraph()
        prim.add_nodes_from(p, [(1, {
            'state': 'p'
        }), ("1_clone", {
            'state': 'p'
        }), (2, {
            'name': 'BND'
        }), 3, 4])
        prim.add_edges_from(p, [(1, 2), ('1_clone', 2), (3, 4)])

        rhs = nx.DiGraph()
        prim.add_nodes_from(rhs, [(1, {
            'state': 'p'
        }), ("1_clone", {
            'state': 'p'
        }), (2, {
            'name': 'BND'
        }), 3, 4, 5])

        prim.add_edges_from(rhs, [(1, 2, {
            's': 'u'
        }), ('1_clone', 2), (2, 4), (3, 4), (5, 3)])

        p_lhs = {1: 1, '1_clone': 1, 2: 2, 3: 3, 4: 4}
        p_rhs = {1: 1, '1_clone': '1_clone', 2: 2, 3: 3, 4: 4}
        rule1 = Rule(p, pattern, rhs, p_lhs, p_rhs)

        commands = "clone 1.\n" +\
            "delete_edge 3 2.\n" +\
            "add_node 5.\n" +\
            "add_edge 2 4.\n" +\
            "add_edge 5 3."

        rule2 = Rule.from_transform(pattern, commands)
        assert ((5, 3) in rule2.rhs.edges())
        assert (5 in rule2.rhs.nodes() and 5 not in rule2.p.nodes())
        assert ((2, 4) in rule2.rhs.edges())
Exemple #12
0
    def test_triangle_1(self):
        h = Hierarchy()

        g1 = nx.DiGraph()
        g1.add_nodes_from(["1", "2"])

        g2 = nx.DiGraph()
        g2.add_nodes_from(["1a", "1b", "2a", "2b"])

        g3 = nx.DiGraph()
        g3.add_nodes_from(["1x", "1y", "2x", "2y"])

        h.add_graph("g1", g1)
        h.add_graph("g2", g2)
        h.add_graph("g3", g3)
        h.add_typing("g2", "g1", {"1a": "1", "1b": "1", "2a": "2", "2b": "2"})
        h.add_typing("g3", "g1", {"1x": "1", "1y": "1", "2x": "2", "2y": "2"})
        h.add_typing("g2", "g3", {
            "1a": "1x",
            "1b": "1y",
            "2a": "2y",
            "2b": "2x"
        })

        pattern = nx.DiGraph()
        pattern.add_nodes_from([1, 2])
        rule = Rule.from_transform(pattern)
        rule.inject_remove_node(1)
        rule.inject_clone_node(2)

        instances = h.find_matching("g1", pattern)
        new_h, _ = h.rewrite("g1", rule, instances[0], inplace=False)
Exemple #13
0
    def test_irreversible_hierarchy(self):
        hierarchy = NXHierarchy()
        d = NXGraph()
        d.add_nodes_from(["c1", "c2", "s1", "s2"])
        hierarchy.add_graph("d", d)

        s = NXGraph()
        s.add_nodes_from(["c", "s"])
        hierarchy.add_graph("s", s)

        hierarchy.add_typing(
            "d", "s", {
                "c1": "c",
                "c2": "c",
                "s1": "s",
                "s2": "s"
            })
        h = VersionedHierarchy(hierarchy)

        pattern = NXGraph()
        pattern.add_nodes_from(["c1", "s1"])
        rule = Rule.from_transform(pattern)
        rule.inject_merge_nodes(["c1", "s1"])

        instance = {
            "c1": "c1",
            "s1": "s1"
        }

        h.rewrite("d", rule, instance)

        h.rollback(h.initial_commit())
        print(h.hierarchy.get_typing("d", "s"))
Exemple #14
0
 def test_inject_clone_node(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern, [1, 2, 3])
     prim.add_edges_from(pattern, [(1, 2), (3, 2)])
     rule = Rule.from_transform(pattern)
     new_p_node, new_rhs_node = rule.inject_clone_node(2)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert (new_p_node in rule.p.nodes())
     assert (new_rhs_node in rule.rhs.nodes())
     assert (rule.p_rhs[new_p_node] == new_rhs_node)
     assert ((1, new_p_node) in rule.p.edges())
     assert ((3, new_p_node) in rule.p.edges())
     assert ((1, new_rhs_node) in rule.rhs.edges())
     assert ((3, new_rhs_node) in rule.rhs.edges())
     new_p_node, new_rhs_node = rule.inject_clone_node(2)
     assert (len(keys_by_value(rule.p_lhs, 2)) == 3)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     rule.inject_remove_node(3)
     try:
         rule.inject_clone_node(3)
         raise ValueError("Cloning of removed node was not caught")
     except:
         pass
Exemple #15
0
 def test_remove_edge_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.remove_edge_attrs(2, 3, {'a': set()})
     t1 = {'a': {1}}
     normalize_attrs(t1)
     assert(rule.p.edge['b']['c'] == t1)
     assert(rule.rhs.edge['y']['z'] == t1)
     rule.remove_edge_attrs(2, 3, {'a': {1}})
     t2 = {'a': set()}
     normalize_attrs(t2)
     print(t2)
     print(rule.p.edge['b']['c'])
     assert(rule.p.edge['b']['c'] == t2)
     assert(rule.rhs.edge['y']['z'] == t2)
     return
Exemple #16
0
 def process_json(json_data, directed=True):
     rule = Rule.from_json(json_data["rule"], directed)
     if "attrs" not in json_data.keys():
         attrs = dict()
     else:
         attrs = AttributeContainter.attrs_from_json(json_data["attrs"])
     return rule, attrs
Exemple #17
0
def clone_node(hie, g_id, parent, node, new_name, propagate=False):
    """Create a clone of a node. If propagate is True, also clone all the nodes typed by it"""
    if isinstance(hie.node[g_id], GraphNode):
        if new_name in hie.node[g_id].graph.nodes():
            raise ValueError("node {} already in graph".format(new_name))
        if propagate:
            lhs = nx.DiGraph()
            lhs.add_node(node)
            ppp = nx.DiGraph()
            ppp.add_node(node)
            ppp.add_node(new_name)
            rhs = nx.DiGraph()
            rhs.add_node(node)
            rhs.add_node(new_name)
            rule = Rule(ppp, lhs, rhs, {node: node, new_name: node}, None)
            _rewrite(hie, g_id, rule, {node: node})
        else:
            prim.clone_node(hie.node[g_id].graph, node, new_name)
            for _, typing in hie.out_edges(g_id):
                mapping = hie.edge[g_id][typing].mapping
                if node in mapping.keys():
                    mapping[new_name] = mapping[node]

    elif isinstance(hie.node[g_id], RuleNode):
        hie.node[g_id].rule.clone_rhs_node(node, new_name)
        for _, typing in hie.out_edges(g_id):
            mapping = hie.edge[g_id][typing].rhs_mapping
            if node in mapping:
                mapping[new_name] = mapping[node]
    else:
        raise ValueError("node is neither a rule nor a graph")
Exemple #18
0
def rm_node(hie, g_id, parent, node_id, force=False):
    """remove a node from a graph """
    if isinstance(hie.node[g_id], GraphNode):
        if [
                c for c in all_children(hie, g_id)
                if node_id in hie.edge[c][g_id].mapping.values()
        ]:
            if not force:
                raise ValueError("some nodes are typed by {}"
                                 "set the force argument to"
                                 "delete the as well".format(node_id))

        lhs = nx.DiGraph()
        lhs.add_node(node_id)
        ppp = nx.DiGraph()
        rhs = nx.DiGraph()
        rule = Rule(ppp, lhs, rhs)
        _rewrite(hie, g_id, rule, {node_id: node_id})
    elif isinstance(hie.node[g_id], RuleNode):
        hie.node[g_id].rule.remove_node_rhs(node_id)
        for _, typing in hie.out_edges(g_id):
            if node_id in hie.edge[g_id][typing].rhs_mapping.keys():
                del hie.edge[g_id][typing].rhs_mapping[node_id]
    else:
        raise ValueError("node is neither a rule nor a graph")
    def test_rewrite(self):
        pattern = nx.DiGraph()
        add_nodes_from(pattern,
            [(1, {'state': 'p'}),
             (2, {'name': 'BND'}),
             3,
             4]
        )
        add_edges_from(pattern,
            [(1, 2, {'s': 'p'}),
             (3, 2, {'s': 'u'}),
             (3, 4)]
        )

        p = nx.DiGraph()
        add_nodes_from(p, [
            (1, {'state': 'p'}),
            (2, {'name': 'BND'}),
            3,
            4
        ])
        p.add_edges_from([
            (1, 2),
            (3, 4)
        ])

        rhs = nx.DiGraph()
        add_nodes_from(rhs, [
            (1, {'state': 'p'}),
            (2, {'name': 'BND'}),
            (3, {'merged': 'yes'}),
            (4, {'new': 'yes'})
        ])

        add_edges_from(rhs, [
            (1, 2, {'s': 'u'}),
            (2, 4),
            (3, 3),
            (3, 4, {'from': 'merged'})
        ])

        p_lhs = {1: 1, 2: 2, 3: 3, 4: 4}
        p_rhs = {1: 1, 2: 2, 3: 3, 4: 3}

        rule = Rule(p, pattern, rhs, p_lhs, p_rhs)
        instances = find_matching_with_types(self.graph, rule.lhs, {}, {}, {})
        rule.apply_to(self.graph, instances[0], rule)
Exemple #20
0
    def test_rewrite(self):
        pattern = nx.DiGraph()
        prim.add_nodes_from(pattern, [1, (2, {"a": {1, 2}}), 3])
        prim.add_edges_from(pattern, [(1, 2), (2, 3)])
        lhs_typing = {
            "g0": {
                1: "circle",
                2: "square",
                3: "triangle"
            },
            "g00": {
                1: "white",
                2: "white",
                3: "black"
            }
        }

        p = nx.DiGraph()
        p.add_nodes_from([1, 2, 3])
        p.add_edges_from([(2, 3)])

        rhs = nx.DiGraph()
        prim.add_nodes_from(
            rhs, [1, (2, {
                "a": {3, 5}
            }), (3, {
                "new_attrs": {1}
            }), 4])
        prim.add_edges_from(rhs, [(2, 1, {
            "new_attrs": {2}
        }), (2, 4, {
            "new_attrs": {3}
        }), (2, 3, {
            "new_attrs": {4}
        })])
        p_lhs = {1: 1, 2: 2, 3: 3}
        p_rhs = {1: 1, 2: 2, 3: 3}

        rule = Rule(p, pattern, rhs, p_lhs, p_rhs)
        rhs_typing = {
            "g0": {
                1: "circle",
                2: "square",
                3: "triangle",
                4: "triangle"
            },
            "g00": {
                1: "white",
                2: "white",
                3: "black",
                4: "black"
            }
        }

        instances = self.hierarchy.find_matching("g1", pattern, lhs_typing)
        # print(instances[0])
        self.hierarchy.rewrite("g1", rule, instances[0], lhs_typing,
                               rhs_typing)
Exemple #21
0
 def test_add_node_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.add_node_attrs(1, {'a': 1})
     t1 = {'a': {1}}
     t2 = {'a': {1, 2}}
     t3 = {'a': {1, 2}, 'b': {1}}
     normalize_attrs(t1)
     normalize_attrs(t2)
     normalize_attrs(t3)
     assert(rule.rhs.node['x'] == t1)
     rule.add_node_attrs(4, {'a': 1})
     assert(rule.rhs.node['s'] == t1)
     rule.add_node_attrs(4, {'a': 2})
     assert(rule.rhs.node['s'] == t2)
     rule.add_node_attrs(4, {'b': 1})
     assert(rule.rhs.node['s'] == t3)
     return
Exemple #22
0
 def _create_identity_delta():
     """Create an identity-delta."""
     rule = Rule.identity_rule()
     identity_delta = {
         "rule": rule,
         "lhs_instance": {},
         "rhs_instance": {}
     }
     return identity_delta
Exemple #23
0
 def test_inject_remove_node(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern, [1, 2, 3])
     prim.add_edges_from(pattern, [(1, 2), (3, 2)])
     rule = Rule.from_transform(pattern)
     rule.inject_remove_node(2)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert (2 in rule.lhs.nodes())
     assert (2 not in rule.p.nodes())
     assert (2 not in rule.rhs.nodes())
Exemple #24
0
    def _delta_from_json(json_data):
        delta = {}
        delta["rule_hierarchy"] = {
            "rules": {},
            "rule_homomorphisms": json_data["rule_hierarchy"]["rule_homomorphisms"]
        }
        for graph, rule in json_data["rule_hierarchy"]["rules"].items():
            delta["rule_hierarchy"]["rules"][graph] = Rule.from_json(rule)

        delta["lhs_instances"] = json_data["lhs_instances"]
        delta["rhs_instances"] = json_data["rhs_instances"]
        return delta
Exemple #25
0
    def test_rewrite(self):
        pattern = nx.DiGraph()
        add_nodes_from(pattern, [(1, {
            'state': 'p'
        }), (2, {
            'name': 'BND'
        }), 3, 4])
        add_edges_from(pattern, [(1, 2, {
            's': 'p'
        }), (3, 2, {
            's': 'u'
        }), (3, 4)])

        p = nx.DiGraph()
        add_nodes_from(p, [(1, {'state': 'p'}), (2, {'name': 'BND'}), 3, 4])
        p.add_edges_from([(1, 2), (3, 4)])

        rhs = nx.DiGraph()
        add_nodes_from(rhs, [(1, {
            'state': 'p'
        }), (2, {
            'name': 'BND'
        }), (3, {
            'merged': 'yes'
        }), (4, {
            'new': 'yes'
        })])

        add_edges_from(rhs, [(1, 2, {
            's': 'u'
        }), (2, 4), (3, 3), (3, 4, {
            'from': 'merged'
        })])

        p_lhs = {1: 1, 2: 2, 3: 3, 4: 4}
        p_rhs = {1: 1, 2: 2, 3: 3, 4: 3}

        rule = Rule(p, pattern, rhs, p_lhs, p_rhs)
        instances = find_matching_with_types(self.graph, rule.lhs, {}, {}, {})
        rule.apply_to(self.graph, instances[0], rule)
Exemple #26
0
 def test_inject_add_node(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern, [1, 2, 3])
     prim.add_edges_from(pattern, [(1, 2), (3, 2)])
     rule = Rule.from_transform(pattern)
     try:
         rule.inject_add_node(3)
         raise ValueError("Node duplication was not caught")
     except RuleError:
         pass
     rule.inject_add_node(4)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert (4 in rule.rhs.nodes() and 4 not in rule.lhs.nodes()
             and 4 not in rule.p.nodes())
Exemple #27
0
    def test_porpagation_node_attrs_adds(self):

        p = nx.DiGraph()
        primitives.add_nodes_from(
            p, [1, 2]
        )

        lhs = nx.DiGraph()
        primitives.add_nodes_from(
            lhs, [1, 2]
        )

        rhs = nx.DiGraph()
        primitives.add_nodes_from(
            rhs,
            [
                (1, {"a1": True}),
                (2, {"a2": 1}),
                (3, {"a3": "x"})]
        )

        rule = Rule(p, lhs, rhs)
        instance = {1: "A", 2: "A_res_1"}

        rhs_typing = {"mm": {3: "state"}}

        try:
            self.hierarchy.rewrite(
                "n1", rule, instance, lhs_typing=None, rhs_typing=rhs_typing)
            raise ValueError("Error was not caught!")
        except RewritingError:
            pass

        new_hierarchy, _ = self.hierarchy.rewrite(
            "n1", rule, instance,
            lhs_typing=None, rhs_typing=rhs_typing,
            strict=False, inplace=False)

        # test propagation of the node attribute adds
        assert("a1" in new_hierarchy.graph["n1"].node["A"])
        assert("a2" in new_hierarchy.graph["n1"].node["A_res_1"])
        assert("a3" in new_hierarchy.graph["n1"].node[3])

        assert("a1" in new_hierarchy.graph["ag"].node["A"])
        assert("a2" in new_hierarchy.graph["ag"].node["A_res_1"])
        assert("a3" in new_hierarchy.graph["ag"].node[3])
Exemple #28
0
 def test_inject_merge_nodes(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern, [1, 2, 3])
     prim.add_edges_from(pattern, [(1, 2), (3, 2)])
     rule = Rule.from_transform(pattern)
     new_name = rule.inject_merge_nodes([1, 2])
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ((new_name, new_name) in rule.rhs.edges())
     assert ((3, new_name) in rule.rhs.edges())
     new_p_name, new_rhs_name = rule.inject_clone_node(2)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     new_name = rule.inject_merge_nodes([2, 3])
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert (new_p_name in rule.rhs.nodes())
Exemple #29
0
def remove_attributes(hie, g_id, parent, node, json_attrs):
    """remove the attributes from json_attrs from the node"""
    attrs = prim.json_dict_to_attrs(json_attrs)
    if isinstance(hie.node[g_id], GraphNode):
        lhs = nx.DiGraph()
        lhs.add_node(node)
        add_node_attrs(lhs, node, attrs)
        ppp = nx.DiGraph()
        ppp.add_node(node)
        rhs = nx.DiGraph()
        rhs.add_node(node)
        rule = Rule(ppp, lhs, rhs)
        _rewrite(hie, g_id, rule, {node: node})
    elif isinstance(hie.node[g_id], RuleNode):
        hie.node[g_id].rule.remove_node_attrs_rhs(node, attrs)
    else:
        raise ValueError("node is neither a rule nor a graph")
Exemple #30
0
 def test_remove_node_attrs(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.add_node_attrs(4, {'a': 2})
     rule.remove_node_attrs(4, {'a': 1})
     t1 = {'a': set()}
     t2 = {'a': set([2])}
     normalize_attrs(t1)
     normalize_attrs(t2)
     assert(rule.p.node['d'] == t1)
     assert(rule.rhs.node['s'] == t2)
     return
Exemple #31
0
    def test_from_commands(self):
        pattern = nx.DiGraph()
        prim.add_nodes_from(
            pattern,
            [(1, {'state': 'p'}),
             (2, {'name': 'BND'}),
             3,
             4]
        )
        prim.add_edges_from(
            pattern,
            [(1, 2, {'s': 'p'}),
             (3, 2, {'s': 'u'}),
             (3, 4)]
        )

        p = nx.DiGraph()
        prim.add_nodes_from(
            p,
            [(1, {'state': 'p'}), ("1_clone", {'state': 'p'}), (2, {'name': 'BND'}), 3, 4])
        prim.add_edges_from(
            p, [(1, 2), ('1_clone', 2), (3, 4)])

        rhs = nx.DiGraph()
        prim.add_nodes_from(
            rhs,
            [(1, {'state': 'p'}), ("1_clone", {'state': 'p'}), (2, {'name': 'BND'}), 3, 4, 5])

        prim.add_edges_from(
            rhs, [(1, 2, {'s': 'u'}), ('1_clone', 2), (2, 4), (3, 4), (5, 3)])

        p_lhs = {1: 1, '1_clone': 1, 2: 2, 3: 3, 4: 4}
        p_rhs = {1: 1, '1_clone': '1_clone', 2: 2, 3: 3, 4: 4}
        rule1 = Rule(p, pattern, rhs, p_lhs, p_rhs)

        commands = "clone 1.\n" +\
            "delete_edge 3 2.\n" +\
            "add_node 5.\n" +\
            "add_edge 2 4.\n" +\
            "add_edge 5 3."

        rule2 = Rule.from_transform(pattern, commands)
        assert((5, 3) in rule2.rhs.edges())
        assert(5 in rule2.rhs.nodes() and 5 not in rule2.p.nodes())
        assert((2, 4) in rule2.rhs.edges())
Exemple #32
0
 def test_inject_remove_edge_attrs(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern, [1, 2, 3])
     prim.add_edges_from(pattern, [(1, 2, {
         "a12": {True}
     }), (3, 2, {
         "a32": {True}
     })])
     rule = Rule.from_transform(pattern)
     rule.inject_remove_edge_attrs(1, 2, {"a12": {True}})
     assert ("a12" not in rule.p.edge[1][2])
     new_p_node, new_rhs_node = rule.inject_clone_node(2)
     assert ("a12" not in rule.p.edge[1][new_p_node])
     rule.inject_remove_edge_attrs(3, new_p_node, {"a32": {True}})
     assert ("a32" in rule.p.edge[3][2])
     assert ("a32" not in rule.p.edge[3][new_p_node])
     assert ("a32" in rule.rhs.edge[3][rule.p_rhs[2]])
     assert ("a32" not in rule.rhs.edge[3][new_rhs_node])
Exemple #33
0
def new_rule(hie, parent, name, pattern_name=None):
    """create a new rule """
    if valid_child_name(hie, parent, name):
        if pattern_name is None:
            pattern = nx.DiGraph()
        else:
            pattern_id = child_from_name(hie, parent, pattern_name)
            pattern = hie.node[pattern_id].graph
        rule_id = hie.unique_graph_id(name)
        rule = Rule(pattern, pattern, pattern)
        hie.add_rule(rule_id, rule, {"name": name})
        if parent is not None:
            if pattern_name is None:
                hie.add_rule_typing(rule_id, parent, {}, {})
            else:
                mapping = hie.edge[pattern_id][parent].mapping
                hie.add_rule_typing(rule_id, parent, mapping, mapping)
    else:
        raise ValueError("Invalid new name")
Exemple #34
0
    def test_component_getters(self):
        pattern = nx.DiGraph()
        prim.add_nodes_from(
            pattern,
            [(1, {"a1": {1}}), (2, {"a2": {2}}), (3, {"a3": {3}})]
        )
        prim.add_edges_from(
            pattern,
            [
                (1, 2, {"a12": {12}}),
                (2, 3),
                (3, 2, {"a32": {32}})
            ]
        )

        rule = Rule.from_transform(pattern)
        rule.remove_node(1)
        rule.remove_edge(2, 3)
        new_name, _ = rule.clone_node(2)
        print(new_name)
        rule.remove_node_attrs(3, {"a3": {3}})
        rule.remove_edge_attrs(3, 2, {"a32": {32}})
        rule.add_node_attrs(3, {"a3": {100}})
        rule.add_node(4)
        rule.add_edge_rhs(4, "21")

        assert(rule.removed_nodes() == {1})
        print(rule.removed_edges())
        assert(rule.removed_edges() == {(2, 3), (new_name[0], 3)})
        assert(len(rule.cloned_nodes()) == 1 and
               2 in rule.cloned_nodes().keys())
        assert(len(rule.removed_node_attrs()) == 1 and
               3 in rule.removed_node_attrs()[3]["a3"])
        assert(len(rule.removed_edge_attrs()) == 1 and
               32 in rule.removed_edge_attrs()[(3, 2)]["a32"])

        assert(rule.added_nodes() == {4})
        assert(rule.added_edges() == {(4, "21")})
        # rule.merged_nodes()
        # rule.added_edge_attrs()
        assert(len(rule.added_node_attrs()) == 1 and
               100 in rule.added_node_attrs()[3]["a3"])
        assert(rule.is_restrictive() and rule.is_relaxing())
    def test_add_relation(self):
        self.hierarchy.add_relation(
            "a1", "a2",
            [
                ("white_circle", "right_circle"),
                ("white_square", "middle_square"),
                ("black_circle", "left_circle"),
                ("black_circle", "right_circle")
            ],
            {"name": "Some relation"}
        )
        # print(self.hierarchy.relations())
        # print(self.hierarchy.relation)
        g, l, r = self.hierarchy.relation_to_span(
            "a1", "a2", edges=True, attrs=True
        )
        # print_graph(g)
        # print(l)
        # print(r)
        # print(self.hierarchy)
        # self.hierarchy.remove_graph("a1")
        # print(self.hierarchy.relation)

        lhs = nx.DiGraph()
        lhs.add_nodes_from(["s", "c"])

        rule = Rule.from_transform(lhs)
        rule.clone_node("s")

        # instances = self.hierarchy.find_matching(
        #     "base",
        #     rule.lhs
        # )

        new_hierarchy, _ = self.hierarchy.rewrite(
            "base",
            rule,
            {"s": "square", "c": "circle"},
            inplace=False
        )
        g, l, r = new_hierarchy.relation_to_span(
            "a1", "a2"
        )
Exemple #36
0
 def test_from_script(self):
     commands = "clone 2 as 21.\nadd_node 'a' {'a': 1}.\ndelete_node 3."
     rule = Rule.from_transform(self.pattern, commands=commands)
     assert('a' in rule.rhs.nodes())
     assert('21' in rule.rhs.nodes())
     assert(3 not in rule.rhs.nodes())
    def test_triangle_1(self):
        h = Hierarchy()

        g1 = nx.DiGraph()
        g1.add_nodes_from([
            "1", "2"
        ])

        g2 = nx.DiGraph()
        g2.add_nodes_from([
            "1a", "1b", "2a", "2b"
        ])

        g3 = nx.DiGraph()
        g3.add_nodes_from([
            "1x", "1y", "2x", "2y"
        ])

        h.add_graph("g1", g1)
        h.add_graph("g2", g2)
        h.add_graph("g3", g3)
        h.add_typing(
            "g2", "g1",
            {
                "1a": "1",
                "1b": "1",
                "2a": "2",
                "2b": "2"
            },
            total=True
        )
        h.add_typing(
            "g3", "g1",
            {
                "1x": "1",
                "1y": "1",
                "2x": "2",
                "2y": "2"
            },
            total=True
        )
        h.add_typing(
            "g2", "g3",
            {
                "1a": "1x",
                "1b": "1y",
                "2a": "2y",
                "2b": "2x"
            },
            total=True
        )

        pattern = nx.DiGraph()
        pattern.add_nodes_from([
            1, 2
        ])
        rule = Rule.from_transform(pattern)
        rule.remove_node(1)
        rule.clone_node(2)

        instances = h.find_matching("g1", pattern)
        new_h, _ = h.rewrite("g1", rule, instances[0], inplace=False)
Exemple #38
0
 def test_all(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.clone_node(2)
     rule.remove_node(1)
Exemple #39
0
 def test_remove_non_existing_edge(self):
     rule = Rule(self.p, self.pattern, self.rhs,
                 self.p_lhs, self.p_rhs)
     rule.remove_edge(3, 2)
     return