Exemple #1
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 #2
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 #3
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 #4
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 #5
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 #6
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 #7
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 #8
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 #9
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 #10
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())
Exemple #11
0
    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 #12
0
 def test_inject_add_node_attrs(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)
     clone_name_p, clone_name_rhs = rule.inject_clone_node(2)
     rule.inject_add_node(4)
     merge = rule.inject_merge_nodes([1, 3])
     rule.inject_add_node_attrs(2, {"a": {True}})
     assert ("a" in rule.rhs.node[2])
     assert ("a" in rule.rhs.node[clone_name_rhs])
     rule.inject_add_node_attrs(clone_name_p, {"b": {True}})
     assert ("b" in rule.rhs.node[clone_name_rhs])
     assert ("b" not in rule.rhs.node[2])
     rule.inject_add_node_attrs(4, {"c": {True}})
     assert ("c" in rule.rhs.node[4])
     rule.inject_add_node_attrs(merge, {"d": {True}})
     assert ("d" in rule.rhs.node[merge])
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
Exemple #13
0
 def test_inject_add_edge(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_add_node(4)
     rule.inject_add_edge(1, 4)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ((1, 4) in rule.rhs.edges())
     merge_node = rule.inject_merge_nodes([1, 2])
     rule.inject_add_edge(merge_node, 3)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ((merge_node, 3) in rule.rhs.edges())
     new_p_node, new_rhs_node = rule.inject_clone_node(2)
     rule.inject_add_edge(new_p_node, merge_node)
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ((new_rhs_node, merge_node) in rule.rhs.edges())
Exemple #14
0
 def test_inject_remove_node_attrs(self):
     pattern = nx.DiGraph()
     prim.add_nodes_from(pattern,
                         [1, (2, {
                             "a2": {True}
                         }), (3, {
                             "a3": {False}
                         })])
     prim.add_edges_from(pattern, [(1, 2), (3, 2)])
     rule = Rule.from_transform(pattern)
     rule.inject_remove_node_attrs(3, {"a3": {False}})
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ("a3" not in rule.p.node[3])
     assert ("a3" in rule.lhs.node[3])
     new_p_node, new_rhs_node = rule.inject_clone_node(2)
     rule.inject_remove_node_attrs(new_p_node, {"a2": {True}})
     check_homomorphism(rule.p, rule.lhs, rule.p_lhs)
     check_homomorphism(rule.p, rule.rhs, rule.p_rhs)
     assert ("a2" not in rule.p.node[new_p_node])
     assert ("a2" in rule.p.node[2])
     assert ("a2" not in rule.rhs.node[new_rhs_node])
     assert ("a2" in rule.rhs.node[2])
Exemple #15
0
    def test_graph_rollback(self):
        g = VersionedGraph(self.initial_graph)

        # Branch 'test'
        g.branch("test")

        pattern = NXGraph()
        pattern.add_node("square")
        rule = Rule.from_transform(pattern)
        # _, rhs_clone =
        rule.inject_clone_node("square")
        g.rewrite(
            rule, {"square": "square"},
            "Clone square")

        # Switch to master
        g.switch_branch("master")

        print("\n\n\nasserting...............")
        for s, t in g._revision_graph.edges():
            print(g._revision_graph.nodes[s]["message"])
            print(g._revision_graph.nodes[t]["message"])
            d = g._revision_graph.adj[s][t]["delta"]
            assert(
                set(d["rule"].rhs.nodes()) ==
                set(d["rhs_instance"].keys())
            )

        # Add edge and triangle
        pattern = NXGraph()
        pattern.add_nodes_from(["circle"])
        rule = Rule.from_transform(pattern)
        # _, rhs_clone =
        rule.inject_add_edge("circle", "circle")
        rule.inject_add_node("triangle")
        rule.inject_add_edge("triangle", "circle")
        rhs_instance, _ = g.rewrite(
            rule, {"circle": "circle"},
            "Add edge to circle and triangle")
        triangle = rhs_instance["triangle"]

        # Clone circle
        pattern = NXGraph()
        pattern.add_node("circle")
        rule = Rule.from_transform(pattern)
        _, rhs_clone = rule.inject_clone_node("circle")

        rhs_instance, rollback_commit = g.rewrite(
            rule, {"circle": "circle"},
            "Clone circle")

        rhs_circle_clones = list({
            rule.p_rhs[p] for p in rule.cloned_nodes()["circle"]
        })

        # Remove original circle
        pattern = NXGraph()
        pattern.add_node("circle")
        rule = Rule.from_transform(pattern)
        rule.inject_remove_node("circle")

        rhs_instance, _ = g.rewrite(
            rule,
            {"circle": rhs_instance[rhs_circle_clones[0]]},
            message="Remove circle")

        # Merge circle clone and triangle
        pattern = NXGraph()
        pattern.add_nodes_from(["circle", "triangle"])
        rule = Rule.from_transform(pattern)
        rule.inject_merge_nodes(["circle", "triangle"])

        rhs_instance, _ = g.rewrite(
            rule,
            {
                "circle": rhs_instance[rhs_clone],
                "triangle": triangle
            },
            message="Merge circle and triangle")
        g.print_history()
        g.rollback(rollback_commit)

        g.merge_with("test")
Exemple #16
0
    def test_neo4j_hierarchy_versioning(self):
        """Test hierarchy versioning functionality."""
        try:
            hierarchy = Neo4jHierarchy(uri="bolt://localhost:7687",
                                       user="******",
                                       password="******")
            hierarchy._clear()
            hierarchy.add_graph("shapes",
                                node_list=[("c", {
                                    "a": 1
                                }), ("s", {
                                    "b": 2
                                })])
            hierarchy.add_graph("colors",
                                node_list=[("w", {
                                    "a": 1,
                                    "b": 2
                                }), ("b", {
                                    "a": 1,
                                    "b": 2
                                })])
            hierarchy.add_graph("ag",
                                node_list=[("wc", {
                                    "a": 1
                                }), "bc", "ws", ("bs", {
                                    "b": 2
                                })])
            hierarchy.add_graph("nugget",
                                node_list=[("wc1", {
                                    "a": 1
                                }), "wc2", "bc1", "ws1", ("bs2", {
                                    "b": 2
                                })])

            hierarchy.add_typing("ag", "shapes", {
                "wc": "c",
                "bc": "c",
                "ws": "s",
                "bs": "s"
            })
            hierarchy.add_typing("ag", "colors", {
                "wc": "w",
                "bc": "b",
                "ws": "w",
                "bs": "b"
            })
            hierarchy.add_typing("nugget", "ag", {
                "wc1": "wc",
                "wc2": "wc",
                "bc1": "bc",
                "ws1": "ws",
                "bs2": "bs"
            })
            hierarchy.add_typing("nugget", "colors", {
                "wc1": "w",
                "wc2": "w",
                "bc1": "b",
                "ws1": "w",
                "bs2": "b"
            })

            hierarchy.add_graph("base", node_list=[("node", {"a": 1, "b": 2})])
            hierarchy.add_typing("colors", "base", {"w": "node", "b": "node"})

            pattern = nx.DiGraph()
            pattern.add_nodes_from(["s", "c"])
            rule = Rule.from_transform(pattern)
            rule.inject_add_edge("s", "c", {"c": 3})

            hierarchy.rewrite("nugget", rule, {"s": "bs2", "c": "wc1"})

            h = VersionedHierarchy(hierarchy)
            rollback_commit = h._heads["master"]

            pattern = nx.DiGraph()
            primitives.add_nodes_from(pattern, [("s", {
                "b": 2
            }), ("c", {
                "a": 1
            })])
            primitives.add_edges_from(pattern, [("s", "c", {"c": 3})])
            rule2 = Rule.from_transform(pattern)
            clone, _ = rule2.inject_clone_node("s")
            rule2.inject_add_node("new_node")
            rule2.inject_add_edge("new_node", "s", {"d": 4})
            merged_rule_node = rule2.inject_merge_nodes([clone, "c"])
            rule2.inject_remove_edge("s", "c")

            rhs_instances, first_commit = h.rewrite(
                "ag",
                rule2, {
                    "s": "bs",
                    "c": "wc"
                },
                message="Rewriting neo4j graph")

            merged_ag_node = rhs_instances["ag"][merged_rule_node]

            h.branch('test')

            pattern = nx.DiGraph()
            pattern.add_nodes_from(["ws"])
            rule3 = Rule.from_transform(pattern)
            rule3.inject_remove_node("ws")

            h.rewrite("ag", rule3, {"ws": "ws"}, message="Removed ws from ag")

            h.switch_branch("master")

            pattern = nx.DiGraph()
            pattern.add_nodes_from([merged_ag_node])
            rule4 = Rule.from_transform(pattern)
            rule4.inject_clone_node(merged_ag_node)

            h.rewrite("ag",
                      rule4, {merged_ag_node: merged_ag_node},
                      message="Cloned merged from ag")
            h.merge_with("test")

            data = h.to_json()
            h1 = VersionedHierarchy.from_json(hierarchy, data)
            h1.print_history()
            h1.rollback(rollback_commit)
        # except ServiceUnavailable as e:
        #     print(e)
        except:
            print()
Exemple #17
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())
Exemple #18
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 #20
0
def apply_mod_semantics(corpus, nugget_id):
    """Apply mod semantics to the created nugget."""
    template_rel = corpus._hierarchy.get_relation("mod_template", nugget_id)

    bnd_template_rel = None
    if "bnd_template" in corpus._hierarchy.adjacent_relations(nugget_id):
        bnd_template_rel = corpus._hierarchy.get_relation(
            "bnd_template", nugget_id)

    enzyme = None
    if "enzyme" in template_rel.keys():
        enzyme = list(template_rel["enzyme"])[0]

    if enzyme is None:
        return None

    mod_state = None
    if "mod_state" in template_rel.keys():
        mod_state = list(template_rel["mod_state"])[0]
    mod_residue = None

    if "substrate_residue" in template_rel.keys():
        mod_residue = list(template_rel["substrate_residue"])[0]

    mod_node = list(template_rel["mod"])[0]
    ag_enzyme = None
    ag_typing = corpus._hierarchy.get_typing(nugget_id,
                                             corpus._action_graph_id)
    if enzyme is not None:
        ag_enzyme = ag_typing[enzyme]
        enzyme_uniprot = corpus.get_uniprot(ag_enzyme)

    ag_mod_node = ag_typing[mod_node]
    ag_bnd_node = None
    bnd_node = None
    if bnd_template_rel:
        bnd_node = list(bnd_template_rel["bnd"])[0]
        ag_bnd_node = ag_typing[bnd_node]

    ag_sag_rel = corpus._hierarchy.get_relation(corpus._action_graph_id,
                                                "semantic_action_graph")

    phospho = False

    nugget = corpus.get_nugget(nugget_id)

    if enzyme is not None and mod_state is not None:
        if "phosphorylation" in nugget.get_node(mod_state)["name"]:
            if True in nugget.get_node(mod_node)["value"]:
                phospho = True
            # elif False in nugget.get_node(mod_node)["test"]:
            #     dephospho = True

    # 1. Phospho semantics
    if phospho:
        phospho_semantic_rel = {
            "mod": "phospho",
            mod_state: "phospho_state",
        }

        if mod_residue is not None:
            phospho_semantic_rel[mod_residue] = "phospho_target_residue"

        if bnd_node:
            phospho_semantic_rel[bnd_node] = "protein_kinase_bnd"

        if "enzyme_region" in template_rel.keys():
            # Enzyme region is specified in the nugget
            enz_region = list(template_rel["enzyme_region"])[0]
            ag_enz_region = ag_typing[enz_region]
            if ag_enz_region in ag_sag_rel.keys() and\
                    "protein_kinase" in ag_sag_rel[ag_enz_region]:
                # This enzyme region is typed by the protein kinase
                # in the action graph
                phospho_semantic_rel[enz_region] = "protein_kinase"

                # 1. MOD action merge
                kinase_mods =\
                    corpus.ag_successors_of_type(
                        ag_enz_region, "mod")

                if len(kinase_mods) > 1:
                    pattern = NXGraph()
                    pattern.add_nodes_from([ag_enz_region] + kinase_mods)

                    mod_merge_rule = Rule.from_transform(pattern)
                    new_mod_id = mod_merge_rule.inject_merge_nodes(kinase_mods)

                    message = (
                        "Merged modification actions ({}) ".format(kinase_mods)
                        + "of the protein kinase {} ".format(
                            _generate_fragment_repr(corpus, ag_enzyme,
                                                    ag_enz_region)) +
                        "of the protoform with the UniProt AC '{}'".format(
                            enzyme_uniprot))
                    rhs_ag = corpus.rewrite(
                        corpus._action_graph_id,
                        mod_merge_rule,
                        instance={n: n
                                  for n in mod_merge_rule.lhs.nodes()},
                        message=message,
                        update_type="auto")
                # 1.5 BND action merge
                if bnd_template_rel:
                    kinase_bnds =\
                        corpus.ag_successors_of_type(
                            ag_enz_region, "bnd")
                    if len(kinase_bnds) > 1:
                        pattern = NXGraph()
                        pattern.add_nodes_from([ag_enz_region] + kinase_bnds)

                        bnd_merge_rule = Rule.from_transform(pattern)
                        new_mod_id = bnd_merge_rule.inject_merge_nodes(
                            kinase_bnds)
                        message = (
                            "Merged binding actions ({}) ".format(kinase_bnds)
                            + "of the protein kinase {} ".format(
                                _generate_fragment_repr(
                                    corpus, ag_enzyme, ag_enz_region)) +
                            "of the protoform with the UniProt AC '{}'".format(
                                enzyme_uniprot))
                        rhs_ag = corpus.rewrite(
                            corpus._action_graph_id,
                            bnd_merge_rule,
                            instance={
                                n: n
                                for n in bnd_merge_rule.lhs.nodes()
                            },
                            message=message,
                            update_type="auto")

                # 2. Autocompletion
                enz_region_predecessors = nugget.predecessors(enz_region)

                # Check if kinase activity is specified in the nugget
                activity_found = False

                for pred in enz_region_predecessors:
                    ag_pred = ag_typing[pred]
                    ag_pred_type = corpus.get_action_graph_typing()[ag_pred]
                    pred_attrs = nugget.get_node(pred)
                    if ag_pred_type == "state" and\
                       "activity" in pred_attrs["name"] and\
                       True in pred_attrs["test"]:
                        phospho_semantic_rel[pred] = "protein_kinase_activity"
                        activity_found = True
                        break
                if activity_found is False:
                    # If activity is not specified, we autocomplete
                    # nugget with it
                    autocompletion_rule = Rule.from_transform(nugget)
                    new_activity_state = "{}_activity".format(enzyme)
                    autocompletion_rule.inject_add_node(
                        new_activity_state, {
                            "name": "activity",
                            "test": True
                        })
                    autocompletion_rule.inject_add_edge(
                        new_activity_state, enz_region)
                    # identify if there already exists the activity state
                    # in the action graph
                    rhs_typing = {corpus._action_graph_id: {}}
                    ag_activity = corpus.get_activity_state(ag_enz_region)

                    if ag_activity is not None:
                        rhs_typing[corpus._action_graph_id][new_activity_state] =\
                            ag_activity

                    # Apply autocompletion rule
                    message = (
                        "Autocompleted the nugget '{}' ".format(nugget_id) +
                        "with an activity state "
                        "of the protein kinase {} ".format(
                            _generate_fragment_repr(corpus, ag_enzyme,
                                                    ag_enz_region)) +
                        "of the protoform  with the UniProt AC '{}'".format(
                            enzyme_uniprot))
                    rhs_g = corpus.rewrite(nugget_id,
                                           autocompletion_rule,
                                           rhs_typing=rhs_typing,
                                           message=message,
                                           update_type="auto")
                    phospho_semantic_rel[rhs_g[new_activity_state]] =\
                        "protein_kinase_activity"
            else:
                # Phosphorylation is performed by the region not
                # identified as a protein kinase
                warnings.warn(
                    "Region '{}' performing phosphorylation is not "
                    "a protein kinase region".format(ag_enz_region),
                    KamiHierarchyWarning)
        elif "enzyme_site" in template_rel:
            pass
        else:
            # Enzyme region is NOT specified in the nugget
            enz_region = None
            # Search for the unique kinase region associated
            # with respective protoform in the action graph
            unique_kinase_region =\
                corpus.unique_kinase_region(ag_enzyme)

            if unique_kinase_region is not None:
                # 1. MOD action merge
                kinase_mods =\
                    corpus.ag_successors_of_type(
                        unique_kinase_region, "mod")
                # 1.5 BND action merge
                kinase_bnds = []
                if bnd_template_rel:
                    kinase_bnds =\
                        corpus.ag_successors_of_type(
                            unique_kinase_region, "bnd")

                pattern = NXGraph()
                pattern.add_nodes_from([ag_mod_node, ag_enzyme])
                pattern.add_edges_from([(ag_enzyme, ag_mod_node)])

                if ag_bnd_node:
                    pattern.add_nodes_from([ag_bnd_node])
                    pattern.add_edges_from([(ag_enzyme, ag_bnd_node)])

                mod_merge_rule = Rule.from_transform(pattern)
                mod_merge_rule.inject_remove_edge(ag_enzyme, ag_mod_node)
                if ag_bnd_node:
                    mod_merge_rule.inject_remove_edge(ag_enzyme, ag_bnd_node)

                merged_actions_str = []
                merged_mods = None
                if len(kinase_mods) > 0:
                    # generate a rule that merges mods
                    for n in kinase_mods:
                        mod_merge_rule._add_node_lhs(n)
                    merged_mods = [ag_mod_node] + kinase_mods
                    new_mod_id = mod_merge_rule.inject_merge_nodes(merged_mods)
                    merged_actions_str.append(
                        "merged MOD-mechanisms {}".
                        format(merged_mods) if merged_mods else "")

                merged_bnds = None
                if len(kinase_bnds) > 0:
                    for n in kinase_bnds:
                        mod_merge_rule._add_node_lhs(n)
                    merged_bnds = [ag_bnd_node] + kinase_bnds
                    new_bnd_id = mod_merge_rule.inject_merge_nodes(merged_bnds)
                    merged_actions_str.append(
                        "merged BND-mechanisms {}".
                        format(merged_bnds) if merged_bnds else "")

                message = (
                    "Rewired phosphorylation ('{}') to be mediated by ".format(
                        ag_mod_node) +
                    "the existing protein kinase {} ".format(
                        _generate_fragment_repr(corpus, ag_enzyme,
                                                unique_kinase_region)) +
                    "of the protoform with the UniProt AC '{}' {}".format(
                        enzyme_uniprot,
                        "({})".format(", ".join(merged_actions_str))
                        if len(merged_actions_str) > 0 else ""))
                rhs_ag = corpus.rewrite(
                    corpus._action_graph_id,
                    mod_merge_rule,
                    instance={n: n
                              for n in mod_merge_rule.lhs.nodes()},
                    message=message,
                    update_type="auto")

                # 2. Autocompletion
                if len(kinase_mods) > 0:
                    new_ag_mod = rhs_ag[new_mod_id]
                else:
                    new_ag_mod = ag_mod_node

                if len(kinase_bnds) > 0:
                    new_ag_bnd = rhs_ag[new_bnd_id]
                else:
                    new_ag_bnd = ag_bnd_node

                autocompletion_rule = Rule.from_transform(nugget)
                autocompletion_rule.inject_add_node(
                    unique_kinase_region,
                    corpus.action_graph.get_node(unique_kinase_region))

                activity_state = "{}_activity".format(unique_kinase_region)

                autocompletion_rule.inject_add_node(activity_state, {
                    "name": "activity",
                    "test": True
                })
                autocompletion_rule.inject_add_edge(unique_kinase_region,
                                                    enzyme)
                autocompletion_rule.inject_add_edge(unique_kinase_region,
                                                    mod_node)
                autocompletion_rule.inject_add_edge(activity_state,
                                                    unique_kinase_region)

                rhs_typing = {
                    corpus._action_graph_id: {
                        unique_kinase_region: unique_kinase_region,
                        mod_node: new_ag_mod,
                    }
                }

                if ag_bnd_node:
                    rhs_typing[corpus._action_graph_id][bnd_node] = new_ag_bnd

                ag_activity = corpus.get_activity_state(unique_kinase_region)
                if ag_activity is not None:
                    rhs_typing[
                        corpus._action_graph_id][activity_state] = ag_activity

                message = ("Autocompleted the nugget '{}' ".format(nugget_id) +
                           "with the protein kinase {} ".format(
                               _generate_fragment_repr(corpus, ag_enzyme,
                                                       unique_kinase_region)) +
                           "of the protoform with the UniProt AC '{}'".format(
                               enzyme_uniprot))

                rhs_nugget = corpus.rewrite(
                    nugget_id,
                    autocompletion_rule,
                    instance={n: n
                              for n in autocompletion_rule.lhs.nodes()},
                    rhs_typing=rhs_typing,
                    message=message,
                    update_type="auto")

                enz_region = rhs_nugget[unique_kinase_region]
                phospho_semantic_rel[rhs_nugget[unique_kinase_region]] =\
                    "protein_kinase"
                for k, v in corpus._hierarchy.get_typing(
                        nugget_id, corpus._action_graph_id).items():
                    if v == ag_activity:
                        nugget_activity = k
                phospho_semantic_rel[rhs_nugget[activity_state]] =\
                    "protein_kinase_activity"
                corpus._hierarchy.set_node_relation(nugget_id, "mod_template",
                                                    enz_region,
                                                    "enzyme_region")
            else:
                # The repective protoform in the action graph contains
                # either no or multiple kinase regions
                warnings.warn(
                    "Could not find the unique protein kinase "
                    "region associated with the protoform '%s'" % ag_enzyme,
                    KamiHierarchyWarning)

        # Add a relation to the phosporylation semantic nugget
        corpus.add_semantic_nugget_rel(nugget_id,
                                       "phosphorylation_semantic_nugget",
                                       phospho_semantic_rel)
        # propagate this phospho semantics to the ag nodes
        _propagate_semantics_to_ag(corpus, nugget_id,
                                   "phosphorylation_semantic_nugget")
Exemple #21
0
    def _apply_sh2_py_semantics(region_node,
                                region_bnd,
                                partner_gene,
                                partner_region=None,
                                partner_site=None):
        ag_typing = corpus._hierarchy.get_typing(nugget_id,
                                                 corpus._action_graph_id)

        ag_region = ag_typing[region_node]
        ag_protoform = corpus.get_protoform_of(ag_region)
        protoform_uniprot = corpus.get_uniprot(ag_protoform)
        ag_sag_relation = corpus._hierarchy.get_relation(
            corpus._action_graph_id, "semantic_action_graph")

        if ag_region in ag_sag_relation.keys() and\
           "sh2_domain" in ag_sag_relation[ag_region]:
            sh2_semantic_rel = {
                region_node: "sh2_domain",
                region_bnd: "sh2_domain_pY_bnd",
            }

            # Check if there are multiple bnd actions associated with the
            # same SH2 domain, merge them if it's the case
            ag_region_bnds = []
            for bnd in corpus.ag_successors_of_type(ag_region, "bnd"):
                ag_region_bnds.append(bnd)
            if len(ag_region_bnds) > 1:
                # generate a rule that merges bnds and loci
                pattern = NXGraph()
                pattern.add_nodes_from(ag_region_bnds)
                bnd_merge_rule = Rule.from_transform(pattern)
                bnd_merge_rule.inject_merge_nodes(ag_region_bnds)
                message = (
                    "Merged binding actions ({}) ".format(ag_region_bnds) +
                    "of the SH2 {} ".format(
                        _generate_fragment_repr(corpus, ag_protoform,
                                                ag_region)) +
                    "of the protoform with the UniProt AC '{}'".format(
                        protoform_uniprot))
                corpus.rewrite(corpus._action_graph_id,
                               bnd_merge_rule,
                               message=message,
                               update_type="auto")

            # Process/autocomplete pY sites and Y residues
            if partner_site:
                ag_partner_site = ag_typing[partner_site]
                ag_partner_protoform = corpus.get_protoform_of(ag_partner_site)
                partner_uniprot = corpus.get_uniprot(ag_partner_protoform)

                sh2_semantic_rel[partner_site] = "pY_site"
                # check if site has phosphorylated 'Y' residue
                py_residue_states = []
                for pred in nugget.predecessors(partner_site):
                    ag_pred = ag_typing[pred]
                    if corpus.get_action_graph_typing()[ag_pred] == "residue" and\
                       "Y" in nugget.get_node(pred)["aa"]:
                        for residue_pred in nugget.predecessors(pred):
                            ag_residue_pred = ag_typing[residue_pred]
                            if corpus.get_action_graph_typing()[
                                    ag_residue_pred] == "state" and\
                               "phosphorylation" in nugget.get_node(residue_pred)["name"]:
                                py_residue_states.append((pred, residue_pred))
                # if pY residue was not found it, autocomplete nugget with it
                if len(py_residue_states) == 0:
                    pattern = NXGraph()
                    pattern.add_nodes_from([partner_site])
                    autocompletion_rule = Rule.from_transform(pattern)
                    autocompletion_rule.inject_add_node(
                        "pY_residue", {"aa": "Y"})
                    autocompletion_rule.inject_add_node(
                        "pY_residue_phospho", {
                            "name": "phosphorylation",
                            "test": True
                        })
                    autocompletion_rule.inject_add_edge(
                        "pY_residue_phospho", "pY_residue")
                    autocompletion_rule.inject_add_edge(
                        "pY_residue", partner_site)
                    rhs_typing = {
                        "meta_model": {
                            "pY_residue": "residue",
                            "pY_residue_phospho": "state"
                        }
                    }
                    message = (
                        "Autocompleted the nugget '{}' ".format(nugget_id) +
                        "by additing a phosphorylated Y to {}".format(
                            _generate_fragment_repr(
                                corpus, ag_partner_protoform, ag_partner_site,
                                "site")) +
                        "of the protoform with the UniProt AC '{}'".format(
                            partner_uniprot))
                    rhs_nugget = corpus.rewrite(
                        nugget_id,
                        autocompletion_rule,
                        instance={
                            n: n
                            for n in autocompletion_rule.lhs.nodes()
                        },
                        rhs_typing=rhs_typing,
                        message=message,
                        update_type="auto")

                    # add necessary semantic rels
                    sh2_semantic_rel[rhs_nugget["pY_residue"]] = "pY_residue"
                    sh2_semantic_rel[rhs_nugget["pY_residue_phospho"]] =\
                        "phosphorylation"
                else:
                    # Add semantic rels
                    for residue, state in py_residue_states:
                        sh2_semantic_rel[residue] = "pY_residue"
                        sh2_semantic_rel[state] = "phosphorylation"

                    # Update action graph by merging all the sites
                    # sharing the same residue
                    residues = corpus.get_attached_residues(ag_partner_site)
                    if len(residues) == 1:
                        ag_gene = ag_typing[partner_gene]
                        sites_to_merge = set()
                        sites = [
                            s for s in corpus.get_attached_sites(ag_gene)
                            if s != ag_partner_site
                        ]
                        for s in sites:
                            s_residues = corpus.get_attached_residues(s)
                            if len(s_residues) == 1:
                                if residues[0] == s_residues[0]:
                                    sites_to_merge.add(s)
                        if len(sites_to_merge) > 0:
                            message = (
                                "Merged sites ('{}')".format(sites_to_merge) +
                                "with the pY {} ".format(
                                    _generate_fragment_repr(
                                        corpus, ag_partner_protoform,
                                        ag_partner_site, "site")) +
                                "of the protoform with the UniProt AC '{}' (sites share residues)"
                                .format(partner_uniprot))
                            sites_to_merge.add(ag_partner_site)
                            pattern = NXGraph()
                            pattern.add_nodes_from(sites_to_merge)
                            site_merging_rule = Rule.from_transform(pattern)
                            site_merging_rule.inject_merge_nodes(
                                sites_to_merge)
                            corpus.rewrite(corpus._action_graph_id,
                                           site_merging_rule,
                                           message=message,
                                           update_type="auto")
            else:
                # Generate a rule that adds pY site with a phospho Y residue
                if partner_region is not None:
                    attached_to = partner_region
                else:
                    attached_to = partner_gene
                pattern = NXGraph()
                pattern.add_nodes_from([region_bnd, attached_to])
                pattern.add_edges_from([(attached_to, region_bnd)])
                autocompletion_rule = Rule.from_transform(pattern)
                autocompletion_rule.inject_remove_edge(attached_to, region_bnd)
                autocompletion_rule.inject_add_node("pY_site")
                autocompletion_rule.inject_add_node("pY_residue", {"aa": "Y"})
                autocompletion_rule.inject_add_node("pY_residue_phospho", {
                    "name": "phosphorylation",
                    "test": True
                })
                autocompletion_rule.inject_add_edge("pY_residue_phospho",
                                                    "pY_residue")
                autocompletion_rule.inject_add_edge("pY_residue", "pY_site")
                autocompletion_rule.inject_add_edge("pY_site", attached_to)
                autocompletion_rule.inject_add_edge("pY_site", region_bnd)
                rhs_typing = {
                    "meta_model": {
                        "pY_site": "site",
                        "pY_residue": "residue",
                        "pY_residue_phospho": "state"
                    }
                }

                message = ("Autocompleted the nugget '{}' ".format(nugget_id) +
                           "by additing a pY site " +
                           "to the protoform with the UniProt AC '{}'".format(
                               corpus.get_uniprot(ag_typing[partner_gene])))

                # Rewrite nugget and propagate to the AG
                rhs_nugget = corpus.rewrite(nugget_id,
                                            autocompletion_rule,
                                            rhs_typing=rhs_typing,
                                            message=message,
                                            update_type="auto")

                partner_site = rhs_nugget["pY_site"]

                sh2_semantic_rel[partner_site] = "pY_site"
                sh2_semantic_rel[rhs_nugget["pY_residue"]] = "pY_residue"
                sh2_semantic_rel[rhs_nugget["pY_residue_phospho"]] =\
                    "phosphorylation"

            return sh2_semantic_rel
        return None
Exemple #22
0
    def test_networkx_hierarchy_versioning(self):
        """Test hierarchy versioning functionality."""
        hierarchy = NXHierarchy()
        shapes = NXGraph()
        shapes.add_nodes_from(["c", "s"])
        hierarchy.add_graph("shapes", shapes)

        colors = NXGraph()
        colors.add_nodes_from(["w", "b"])
        hierarchy.add_graph("colors", colors)

        ag = NXGraph()
        ag.add_nodes_from(
            ["wc", "bc", "ws", "bs"])
        hierarchy.add_graph("ag", ag)

        nugget = NXGraph()
        nugget.add_nodes_from(
            ["wc1", "wc2", "bc1", "ws1", "bs2"])
        hierarchy.add_graph("nugget", nugget)

        hierarchy.add_typing(
            "ag", "shapes", {
                "wc": "c",
                "bc": "c",
                "ws": "s",
                "bs": "s"
            })
        hierarchy.add_typing(
            "ag", "colors", {
                "wc": "w",
                "bc": "b",
                "ws": "w",
                "bs": "b"
            })
        hierarchy.add_typing(
            "nugget", "ag", {
                "wc1": "wc",
                "wc2": "wc",
                "bc1": "bc",
                "ws1": "ws",
                "bs2": "bs"
            })
        hierarchy.add_typing(
            "nugget", "colors", {
                "wc1": "w",
                "wc2": "w",
                "bc1": "b",
                "ws1": "w",
                "bs2": "b"
            })

        base = NXGraph()
        base.add_nodes_from(["node"])
        hierarchy.add_graph("base", base)
        hierarchy.add_typing(
            "colors",
            "base", {
                "w": "node",
                "b": "node"
            })

        h = VersionedHierarchy(hierarchy)

        h.branch("test1")

        pattern = NXGraph()
        pattern.add_nodes_from(["s"])
        rule2 = Rule.from_transform(pattern)
        rule2.inject_remove_node("s")

        h.rewrite(
            "shapes",
            rule2, {"s": "s"},
            message="Remove square in shapes")

        h.switch_branch("master")

        pattern = NXGraph()
        pattern.add_nodes_from(["wc"])

        rule1 = Rule.from_transform(pattern)
        rule1.inject_clone_node("wc")

        _, clone_commit = h.rewrite(
            "ag",
            rule1, {"wc": "wc"},
            message="Clone 'wc' in ag")

        pattern = NXGraph()
        pattern.add_nodes_from(["wc1"])

        rule3 = Rule.from_transform(pattern)
        rule3.inject_add_node("new_node")
        rule3.inject_add_edge("new_node", "wc1")

        h.rewrite("nugget", rule3, {"wc1": "wc1"})
        # print(h.print_history())
        h.switch_branch("test1")
        h.switch_branch("master")
        h.merge_with("test1")

        h.rollback(clone_commit)
        h.switch_branch("test1")