In [1]:
import copy
import networkx as nx
from regraph.exceptions import RewritingError
from regraph.hierarchy import Hierarchy
from regraph.rules import Rule
from regraph import primitives
from regraph import plotting
In [2]:
hierarchy = Hierarchy()
colors = nx.DiGraph()
primitives.add_nodes_from(
colors,
["red", "blue"]
)
primitives.add_edges_from(
colors,
[("red", "red"), ("blue", "red"), ("red", "blue")]
)
hierarchy.add_graph("colors", colors)
mmm = nx.DiGraph()
primitives.add_nodes_from(
mmm,
["component", "state", "action"]
)
primitives.add_edges_from(
mmm,
[("component", "action"),
("component", "component"),
("state", "component"),
("action", "state")]
)
hierarchy.add_graph("mmm", mmm)
mm = nx.DiGraph()
primitives.add_nodes_from(
mm,
["gene", "residue", "state", "mod"]
)
primitives.add_edges_from(
mm,
[("residue", "gene"),
("state", "gene"),
("state", "residue"),
("mod", "state"),
("gene", "mod")
]
)
hierarchy.add_graph("mm", mm)
action_graph = nx.DiGraph()
primitives.add_nodes_from(
action_graph,
["A", "A_res_1", "p", "B", "mod"]
)
primitives.add_edges_from(
action_graph,
[("A_res_1", "A"),
("p", "A_res_1"),
("mod", "p"),
("B", "mod")]
)
hierarchy.add_graph(
"ag", action_graph
)
nugget_1 = nx.DiGraph()
primitives.add_nodes_from(
nugget_1,
["A", "A_res_1", "p", "B", "mod"]
)
primitives.add_edges_from(
nugget_1,
[("A_res_1", "A"),
("p", "A_res_1"),
("mod", "p"),
("B", "mod")]
)
hierarchy.add_graph(
"n1", nugget_1
)
# add typings
hierarchy.add_typing(
"mm", "mmm",
{
"gene" : "component",
"residue": "component",
"state": "state",
"mod": "action"
}, total=True
)
hierarchy.add_typing(
"mm", "colors",
{
"gene": "red",
"residue": "red",
"state": "red",
"mod": "blue"
}
)
hierarchy.add_typing(
"ag", "mm",
{
"A": "gene",
"B": "gene",
"A_res_1": "residue",
"mod" : "mod",
"p": "state"
}, total=True
)
hierarchy.add_typing(
"n1", "ag",
dict((n, n) for n in nugget_1.nodes()),
total=True
)
In [3]:
plotting.plot_graph(hierarchy.graph["colors"])
plotting.plot_graph(hierarchy.graph["mmm"])
plotting.plot_graph(hierarchy.graph["mm"])
plotting.plot_graph(hierarchy.graph["ag"])
plotting.plot_graph(hierarchy.graph["n1"])
Out[3]:
In [4]:
p = nx.DiGraph()
primitives.add_nodes_from(
p, ["B"]
)
l = nx.DiGraph()
primitives.add_nodes_from(
l, ["B"]
)
r = nx.DiGraph()
primitives.add_nodes_from(
r, ["B", "B_res_1", "X", "Y"]
)
primitives.add_edge(r, "B_res_1", "B")
rule = Rule(p, l, r)
plotting.plot_rule(rule)
instance = {"B": "B"}
rhs_typing = {"mm": {"B_res_1": "residue"}, "mmm": {"X": "component"}, "colors": {"Y": "red"}}
print(rule.to_commands())
In [5]:
try:
hierarchy.rewrite("n1", rule, instance, lhs_typing=None, rhs_typing=rhs_typing)
except RewritingError as e:
print("Error received: \n", e)
In [6]:
hierarchy.rewrite("n1", rule, instance, lhs_typing=None, rhs_typing=rhs_typing, strict=False)
Out[6]:
In [7]:
plotting.plot_graph(hierarchy.node["n1"].graph)
plotting.plot_graph(hierarchy.node["ag"].graph)
plotting.plot_graph(hierarchy.node["mm"].graph)
plotting.plot_graph(hierarchy.node["mmm"].graph)
plotting.plot_graph(hierarchy.node["colors"].graph)
Out[7]:
In [8]:
print(hierarchy.edge["n1"]["ag"].mapping)
print(hierarchy.edge["ag"]["mm"].mapping)
print(hierarchy.edge["mm"]["mmm"].mapping)
print(hierarchy.edge["mm"]["colors"].mapping)
In [9]:
p = nx.DiGraph()
p.add_nodes_from([1, 2])
p.add_edges_from([(2, 1)])
merging_rule = Rule.from_transform(p)
merging_rule.remove_edge(2, 1)
merging_rule.merge_nodes(1, 2, "hybrid")
lhs_typing = {"mm": {1: "gene", 2: "residue"}}
rhs_typing = {"mmm": {"hybrid": "component"}}
In [10]:
plotting.plot_rule(merging_rule)
print(merging_rule.to_commands())
In [11]:
instances = hierarchy.find_matching("n1", merging_rule.lhs, lhs_typing)
print(instances)
In [12]:
hierarchy.rewrite("n1", merging_rule, instances[0], lhs_typing, rhs_typing, strict=False)
Out[12]:
In [13]:
plotting.plot_graph(hierarchy.node["n1"].graph)
plotting.plot_graph(hierarchy.node["ag"].graph)
plotting.plot_graph(hierarchy.node["mm"].graph)
plotting.plot_graph(hierarchy.node["mmm"].graph)
plotting.plot_graph(hierarchy.node["colors"].graph)
Out[13]:
In [14]:
hierarchy.rewrite("n1", merging_rule, instances[1], strict=False)
plotting.plot_graph(hierarchy.node["n1"].graph)
plotting.plot_graph(hierarchy.node["ag"].graph)
plotting.plot_graph(hierarchy.node["mm"].graph)
plotting.plot_graph(hierarchy.node["mmm"].graph)
plotting.plot_graph(hierarchy.node["colors"].graph)
Out[14]:
In [15]:
p = nx.DiGraph()
p.add_nodes_from([1, 2])
p.add_edges_from([(2, 1)])
merging_rule1 = Rule.from_transform(p)
merging_rule1.remove_edge(2, 1)
merging_rule1.merge_nodes(1, 2, "hybrid")
lhs_typing = {"mm": {1: "state", 2: "mod"}}
rhs_typing = {"mmm": {"hybrid": "component"}}
In [16]:
lhs_typing
Out[16]:
In [17]:
instances = hierarchy.find_matching("n1", merging_rule1.lhs, lhs_typing)
print(instances)
In [18]:
hierarchy.rewrite("n1", merging_rule1, instances[0], lhs_typing, rhs_typing)