diff env/lib/python3.9/site-packages/networkx/readwrite/json_graph/node_link.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/networkx/readwrite/json_graph/node_link.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,184 @@
+from itertools import chain, count
+import networkx as nx
+from networkx.utils import to_tuple
+
+__all__ = ["node_link_data", "node_link_graph"]
+
+
+_attrs = dict(source="source", target="target", name="id", key="key", link="links")
+
+
+def node_link_data(G, attrs=None):
+    """Returns data in node-link format that is suitable for JSON serialization
+    and use in Javascript documents.
+
+    Parameters
+    ----------
+    G : NetworkX graph
+
+    attrs : dict
+        A dictionary that contains five keys 'source', 'target', 'name',
+        'key' and 'link'.  The corresponding values provide the attribute
+        names for storing NetworkX-internal graph data.  The values should
+        be unique.  Default value::
+
+            dict(source='source', target='target', name='id',
+                 key='key', link='links')
+
+        If some user-defined graph data use these attribute names as data keys,
+        they may be silently dropped.
+
+    Returns
+    -------
+    data : dict
+       A dictionary with node-link formatted data.
+
+    Raises
+    ------
+    NetworkXError
+        If values in attrs are not unique.
+
+    Examples
+    --------
+    >>> from networkx.readwrite import json_graph
+    >>> G = nx.Graph([("A", "B")])
+    >>> data1 = json_graph.node_link_data(G)
+    >>> H = nx.gn_graph(2)
+    >>> data2 = json_graph.node_link_data(
+    ...     H, {"link": "edges", "source": "from", "target": "to"}
+    ... )
+
+    To serialize with json
+
+    >>> import json
+    >>> s1 = json.dumps(data1)
+    >>> s2 = json.dumps(
+    ...     data2, default={"link": "edges", "source": "from", "target": "to"}
+    ... )
+
+    Notes
+    -----
+    Graph, node, and link attributes are stored in this format.  Note that
+    attribute keys will be converted to strings in order to comply with JSON.
+
+    Attribute 'key' is only used for multigraphs.
+
+    See Also
+    --------
+    node_link_graph, adjacency_data, tree_data
+    """
+    multigraph = G.is_multigraph()
+    # Allow 'attrs' to keep default values.
+    if attrs is None:
+        attrs = _attrs
+    else:
+        attrs.update({k: v for (k, v) in _attrs.items() if k not in attrs})
+    name = attrs["name"]
+    source = attrs["source"]
+    target = attrs["target"]
+    links = attrs["link"]
+    # Allow 'key' to be omitted from attrs if the graph is not a multigraph.
+    key = None if not multigraph else attrs["key"]
+    if len({source, target, key}) < 3:
+        raise nx.NetworkXError("Attribute names are not unique.")
+    data = {
+        "directed": G.is_directed(),
+        "multigraph": multigraph,
+        "graph": G.graph,
+        "nodes": [dict(chain(G.nodes[n].items(), [(name, n)])) for n in G],
+    }
+    if multigraph:
+        data[links] = [
+            dict(chain(d.items(), [(source, u), (target, v), (key, k)]))
+            for u, v, k, d in G.edges(keys=True, data=True)
+        ]
+    else:
+        data[links] = [
+            dict(chain(d.items(), [(source, u), (target, v)]))
+            for u, v, d in G.edges(data=True)
+        ]
+    return data
+
+
+def node_link_graph(data, directed=False, multigraph=True, attrs=None):
+    """Returns graph from node-link data format.
+
+    Parameters
+    ----------
+    data : dict
+        node-link formatted graph data
+
+    directed : bool
+        If True, and direction not specified in data, return a directed graph.
+
+    multigraph : bool
+        If True, and multigraph not specified in data, return a multigraph.
+
+    attrs : dict
+        A dictionary that contains five keys 'source', 'target', 'name',
+        'key' and 'link'.  The corresponding values provide the attribute
+        names for storing NetworkX-internal graph data.  Default value:
+
+            dict(source='source', target='target', name='id',
+                key='key', link='links')
+
+    Returns
+    -------
+    G : NetworkX graph
+        A NetworkX graph object
+
+    Examples
+    --------
+    >>> from networkx.readwrite import json_graph
+    >>> G = nx.Graph([("A", "B")])
+    >>> data = json_graph.node_link_data(G)
+    >>> H = json_graph.node_link_graph(data)
+
+    Notes
+    -----
+    Attribute 'key' is only used for multigraphs.
+
+    See Also
+    --------
+    node_link_data, adjacency_data, tree_data
+    """
+    # Allow 'attrs' to keep default values.
+    if attrs is None:
+        attrs = _attrs
+    else:
+        attrs.update({k: v for k, v in _attrs.items() if k not in attrs})
+    multigraph = data.get("multigraph", multigraph)
+    directed = data.get("directed", directed)
+    if multigraph:
+        graph = nx.MultiGraph()
+    else:
+        graph = nx.Graph()
+    if directed:
+        graph = graph.to_directed()
+    name = attrs["name"]
+    source = attrs["source"]
+    target = attrs["target"]
+    links = attrs["link"]
+    # Allow 'key' to be omitted from attrs if the graph is not a multigraph.
+    key = None if not multigraph else attrs["key"]
+    graph.graph = data.get("graph", {})
+    c = count()
+    for d in data["nodes"]:
+        node = to_tuple(d.get(name, next(c)))
+        nodedata = {str(k): v for k, v in d.items() if k != name}
+        graph.add_node(node, **nodedata)
+    for d in data[links]:
+        src = tuple(d[source]) if isinstance(d[source], list) else d[source]
+        tgt = tuple(d[target]) if isinstance(d[target], list) else d[target]
+        if not multigraph:
+            edgedata = {str(k): v for k, v in d.items() if k != source and k != target}
+            graph.add_edge(src, tgt, **edgedata)
+        else:
+            ky = d.get(key, None)
+            edgedata = {
+                str(k): v
+                for k, v in d.items()
+                if k != source and k != target and k != key
+            }
+            graph.add_edge(src, tgt, ky, **edgedata)
+    return graph