Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/networkx/readwrite/json_graph/tree.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/tree.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,146 @@ +from itertools import chain +import networkx as nx + +__all__ = ["tree_data", "tree_graph"] + +_attrs = dict(id="id", children="children") + + +def tree_data(G, root, attrs=_attrs): + """Returns data in tree format that is suitable for JSON serialization + and use in Javascript documents. + + Parameters + ---------- + G : NetworkX graph + G must be an oriented tree + + root : node + The root of the tree + + attrs : dict + A dictionary that contains two keys 'id' and 'children'. The + corresponding values provide the attribute names for storing + NetworkX-internal graph data. The values should be unique. Default + value: :samp:`dict(id='id', children='children')`. + + 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.DiGraph([(1, 2)]) + >>> data = json_graph.tree_data(G, root=1) + + To serialize with json + + >>> import json + >>> s = json.dumps(data) + + Notes + ----- + Node attributes are stored in this format but keys + for attributes must be strings if you want to serialize with JSON. + + Graph and edge attributes are not stored. + + The default value of attrs will be changed in a future release of NetworkX. + + See Also + -------- + tree_graph, node_link_data, node_link_data + """ + if G.number_of_nodes() != G.number_of_edges() + 1: + raise TypeError("G is not a tree.") + if not G.is_directed(): + raise TypeError("G is not directed.") + + id_ = attrs["id"] + children = attrs["children"] + if id_ == children: + raise nx.NetworkXError("Attribute names are not unique.") + + def add_children(n, G): + nbrs = G[n] + if len(nbrs) == 0: + return [] + children_ = [] + for child in nbrs: + d = dict(chain(G.nodes[child].items(), [(id_, child)])) + c = add_children(child, G) + if c: + d[children] = c + children_.append(d) + return children_ + + data = dict(chain(G.nodes[root].items(), [(id_, root)])) + data[children] = add_children(root, G) + return data + + +def tree_graph(data, attrs=_attrs): + """Returns graph from tree data format. + + Parameters + ---------- + data : dict + Tree formatted graph data + + Returns + ------- + G : NetworkX DiGraph + + attrs : dict + A dictionary that contains two keys 'id' and 'children'. The + corresponding values provide the attribute names for storing + NetworkX-internal graph data. The values should be unique. Default + value: :samp:`dict(id='id', children='children')`. + + Examples + -------- + >>> from networkx.readwrite import json_graph + >>> G = nx.DiGraph([(1, 2)]) + >>> data = json_graph.tree_data(G, root=1) + >>> H = json_graph.tree_graph(data) + + Notes + ----- + The default value of attrs will be changed in a future release of NetworkX. + + See Also + -------- + tree_graph, node_link_data, adjacency_data + """ + graph = nx.DiGraph() + id_ = attrs["id"] + children = attrs["children"] + + def add_children(parent, children_): + for data in children_: + child = data[id_] + graph.add_edge(parent, child) + grandchildren = data.get(children, []) + if grandchildren: + add_children(child, grandchildren) + nodedata = { + str(k): v for k, v in data.items() if k != id_ and k != children + } + graph.add_node(child, **nodedata) + + root = data[id_] + children_ = data.get(children, []) + nodedata = {str(k): v for k, v in data.items() if k != id_ and k != children} + graph.add_node(root, **nodedata) + add_children(root, children_) + return graph