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"])


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
Out[3]:
{'A': array([ 1.        ,  0.16889575]),
 'A_res_1': array([ 0.82458138,  0.69062891]),
 'B': array([ 0.05793942,  0.        ]),
 'mod': array([ 0.        ,  0.41235443]),
 'p': array([ 0.31807457,  0.76750799])}

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())


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
ADD_NODE X {}.
ADD_NODE B_res_1 {}.
ADD_NODE Y {}.
ADD_EDGE B_res_1 B {}.


In [5]:
try:
    hierarchy.rewrite("n1", rule, instance, lhs_typing=None, rhs_typing=rhs_typing)
except RewritingError as e:
    print("Error received: \n", e)


Error received: 
 Rewriting is strict (no propagation of types is allowed), typing of the node `B_res_1` in rhs is required (typing by the following graph stays unresolved: 'ag')!

In [6]:
hierarchy.rewrite("n1", rule, instance, lhs_typing=None, rhs_typing=rhs_typing, strict=False)


Out[6]:
(<regraph.hierarchy.Hierarchy at 0x7fc8b833bef0>, None)

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)


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
Out[7]:
{'X': array([ 0.,  1.]),
 'blue': array([ 0.73122253,  0.27373617]),
 'red': array([ 0.26052453,  0.        ])}

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)


{'A': 'A', 'A_res_1': 'A_res_1', 'p': 'p', 'B': 'B', 'mod': 'mod', 'B_res_1': 'B_res_1', 'X': 'X', 'Y': 'Y'}
{'A': 'gene', 'A_res_1': 'residue', 'p': 'state', 'B': 'gene', 'mod': 'mod', 'B_res_1': 'residue', 'X': 'X', 'Y': 'Y'}
{'gene': 'component', 'residue': 'component', 'state': 'state', 'mod': 'action', 'X': 'component', 'Y': 'Y'}
{'gene': 'red', 'residue': 'red', 'state': 'red', 'mod': 'blue', 'X': 'X', 'Y': 'red'}

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())


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
DELETE_EDGE 2 1.
MERGE [1, 2] AS 'hybrid'.


In [11]:
instances = hierarchy.find_matching("n1", merging_rule.lhs, lhs_typing)
print(instances)


[{1: 'A', 2: 'A_res_1'}, {1: 'B', 2: 'B_res_1'}]

In [12]:
hierarchy.rewrite("n1", merging_rule, instances[0], lhs_typing, rhs_typing, strict=False)


Out[12]:
(<regraph.hierarchy.Hierarchy at 0x7fc8b833bef0>, None)

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)


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
Out[13]:
{'X': array([ 1.        ,  0.59764341]),
 'blue': array([ 0.18220371,  0.        ]),
 'red': array([ 0.        ,  0.51081464])}

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)


/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:522: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(edge_color) \
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:543: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if cb.is_string_like(edge_color) or len(edge_color) == 1:
/home/eugenia/anaconda3/lib/python3.6/site-packages/networkx-1.11-py3.6.egg/networkx/drawing/nx_pylab.py:724: MatplotlibDeprecationWarning: The is_string_like function was deprecated in version 2.1.
  if not cb.is_string_like(label):
Out[14]:
{'X': array([ 0.,  1.]),
 'blue': array([ 0.66466189,  0.2397552 ]),
 'red': array([ 0.1771719,  0.       ])}

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]:
{'mm': {1: 'state', 2: 'mod'}}

In [17]:
instances = hierarchy.find_matching("n1", merging_rule1.lhs, lhs_typing)
print(instances)


[{1: 'p', 2: 'mod'}]

In [18]:
hierarchy.rewrite("n1", merging_rule1, instances[0], lhs_typing, rhs_typing)


---------------------------------------------------------------------------
RewritingError                            Traceback (most recent call last)
<ipython-input-18-e8bc61f4ab45> in <module>()
----> 1 hierarchy.rewrite("n1", merging_rule1, instances[0], lhs_typing, rhs_typing)

~/anaconda3/lib/python3.6/site-packages/ReGraph-1.0-py3.6.egg/regraph/hierarchy.py in rewrite(self, graph_id, rule, instance, lhs_typing, rhs_typing, strict, inplace)
   1400             try:
   1401                 rule_type_checking._check_self_consistency(
-> 1402                     self, new_rhs_typing, strict)
   1403             except ReGraphError as e:
   1404                 raise RewritingError(

~/anaconda3/lib/python3.6/site-packages/ReGraph-1.0-py3.6.egg/regraph/rule_type_checking.py in _check_self_consistency(hierarchy, typing, strict)
    104                                             (key, anc_typing[val],
    105                                              ", ".join(typing[anc][key]),
--> 106                                              anc))
    107                             except TypeError:
    108                                 if value in anc_typing.keys() and\

RewritingError: Node 'hybrid' is typed as 'action' and 'component' in the graph 'mmm'