ó žÃÒYc@s»dZddlZddlZdjdddgƒZddd d d d d gZd„Zde d„Z dd„Z dd„Z ddd„Z de d„Zdd„Zdd„ZdS(sÝFunctions to convert NetworkX graphs to and from other formats. The preferred way of converting data to a NetworkX graph is through the graph constuctor. The constructor calls the to_networkx_graph() function which attempts to guess the input type and convert it automatically. Examples -------- Create a graph with a single edge from a dictionary of dictionaries >>> d={0: {1: 1}} # dict-of-dicts single edge (0,1) >>> G=nx.Graph(d) See Also -------- nx_agraph, nx_pydot iÿÿÿÿNs s%Aric Hagberg sPieter Swart (swart@lanl.gov)sDan Schult(dschult@colgate.edu)tto_networkx_graphtfrom_dict_of_dictstto_dict_of_dictstfrom_dict_of_liststto_dict_of_listst from_edgelistt to_edgelistcCs>|dkrtjƒSy|jƒWntdƒ‚nX|S(sReturn a graph object ready to be populated. If create_using is None return the default (just networkx.Graph()) If create_using.clear() works, assume it returns a graph object. Otherwise raise an exception because create_using is not a networkx graph. s(Input graph is not a networkx graph typeN(tNonetnxtGraphtcleart TypeError(t create_using((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyt_prep_create_using#s  cs¦tˆdƒr®yƒtˆjd|dˆjƒƒ}tˆdƒrX|jjˆjƒntˆdƒr|jjd„ˆjjƒDƒƒn|SWq®t j dƒ‚q®Xntˆdƒróyt j j ˆd|ƒSWqót j d ƒ‚qóXnt ˆtƒrSytˆd|d|ƒSWqSytˆd|ƒSWqPtd ƒ‚qPXqSXnt ˆttfƒst‡fd †d d dgDƒƒr½ytˆd|ƒSWq½t j dƒ‚q½Xny´ddl}t ˆ|jƒrpˆjdˆjdkr1yt jˆd|ƒSWqmd}t j |ƒ‚qmXqpyt jˆdtd|ƒSWqpd}t j |ƒ‚qpXnWn'tk ršd}tj|tƒnXy^ddl}t ˆ|j |j!fƒrøyt j"ˆd|ƒSWqøt j dƒ‚qøXnWn!tk rtjdtƒnXyRddl#}tˆdƒrnyt j$ˆd|ƒSWqnt j dƒ‚qnXnWn!tk r’tjdtƒnXt j dƒ‚dS(síMake a NetworkX graph from a known data structure. The preferred way to call this is automatically from the class constructor >>> d = {0: {1: {'weight':1}}} # dict-of-dicts single edge (0,1) >>> G = nx.Graph(d) instead of the equivalent >>> G = nx.from_dict_of_dicts(d) Parameters ---------- data : object to be converted Current known types are: any NetworkX graph dict-of-dicts dict-of-lists list of edges Pandas DataFrame (row per edge) numpy matrix numpy ndarray scipy sparse matrix pygraphviz agraph create_using : NetworkX graph Use specified graph for result. Otherwise a new graph is created. multigraph_input : bool (default False) If True and data is a dict_of_dicts, try to create a multigraph assuming dict_of_dict_of_lists. If data and create_using are both multigraphs then create a multigraph from a multigraph. tadjR tmultigraph_inputtgraphtnodescss'|]\}}||jƒfVqdS(N(tcopy(t.0tntdd((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys css&Input is not a correct NetworkX graph.t is_stricts(Input is not a correct pygraphviz graph.sInput is not known type.c3s|]}tˆ|ƒVqdS(N(thasattr(Rtattr(tdata(sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys }st_adjdicttnextt__next__sInput is not a valid edge listiÿÿÿÿNiis9Input is not a correct Pandas DataFrame adjacency matrix.t edge_attrs2Input is not a correct Pandas DataFrame edge-list.s+pandas not found, skipping conversion test.s-Input is not a correct numpy matrix or array.s*numpy not found, skipping conversion test.tformats0Input is not a correct scipy sparse matrix type.s*scipy not found, skipping conversion test.s.Input is not a known data type for conversion.(%RRRt is_multigraphRtupdatet_nodeRtitemsRt NetworkXErrort nx_agrapht from_agrapht isinstancetdictRR tlistttupletanyRtpandast DataFrametshapetfrom_pandas_adjacencytfrom_pandas_edgelisttTruet ImportErrortwarningstwarnt ImportWarningtnumpytmatrixtndarraytfrom_numpy_matrixtscipytfrom_scipy_sparse_matrix(RR RtresulttpdtmsgR5R9((Rsf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyR4s’' & %          cCsb|dkr|}ni}x@|D]8}g|j|ƒD]}||kr8|^q8||>> dol = {0: [1]} # single edge (0,1) >>> G = nx.from_dict_of_lists(dol) or >>> G = nx.Graph(dol) # use Graph constructor icss.|]$\}}|D]}||fVqqdS(N((RtnodetnbrlistRB((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys ðs (R tadd_nodes_fromRt is_directedR"tadd_edgetadd_edges_from(RAR R?tseenRCRDRB((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyRÎs    cs?i}ˆdkr„|dkrNx`|jƒD]\}}|jƒ||sc3s!|]}|ˆkr|VqdS(N((RRJ(R@(sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys sN(Rt adjacencyRtfromkeysR"(R?R@t edge_datatdodtutnbrdictRJR((R@sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyRõs"     -  !cs‚t|ƒ}|j|ƒ|r«|jƒrw|jƒrW|jd„|jƒDƒƒq¨|jd„|jƒDƒƒq~|jƒrtƒ}x|jƒD]w\‰}xh|jƒD]Z\‰}ˆˆf|kr²|j‡‡fd†|jƒDƒƒ|jˆˆfƒq²q²Wq™Wq~tƒ}x[|jƒD]w\‰}xh|jƒD]Z\‰}ˆˆf|krF|j‡‡fd†|jƒDƒƒ|jˆˆfƒqFqFWq-WnÓ|jƒra|jƒ ratƒ}x®|jƒD]€\‰}xq|jƒD]c\‰}ˆˆf|krC|jˆˆddƒ|ˆˆdj |ƒn|jˆˆfƒqóWqÚWn|jd„|jƒDƒƒ|S(s¿Return a graph from a dictionary of dictionaries. Parameters ---------- d : dictionary of dictionaries A dictionary of dictionaries adjacency representation. create_using : NetworkX graph Use specified graph for result. Otherwise a new graph is created. multigraph_input : bool (default False) When True, the values of the inner dict are assumed to be containers of edge data for multiple edges. Otherwise this routine assumes the edge data are singletons. Examples -------- >>> dod = {0: {1: {'weight': 1}}} # single edge (0,1) >>> G = nx.from_dict_of_dicts(dod) or >>> G = nx.Graph(dod) # use Graph constructor cssY|]O\}}|jƒD]6\}}|jƒD]\}}||||fVq/qqdS(N(R"(RROtnbrsRJtdatadicttkeyR((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys >s cssV|]L\}}|jƒD]3\}}|jƒD]\}}|||fVq/qqdS(N(R"(RRORQRJRRRSR((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys Cs c3s'|]\}}ˆˆ||fVqdS(N((RRSR(RORJ(sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys Msc3s$|]\}}ˆˆ|fVqdS(N((RRSR(RORJ(sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys UsRSicss=|]3\}}|jƒD]\}}|||fVqqdS(N(R"(RRORQRJR((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pys fs ( R RERFRRHR"tsettaddRGR (RAR RR?RIRQRRR((RORJsf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyRsF        ! !  cCs/|dkr|jdtƒS|j|dtƒS(s°Return a list of edges in the graph. Parameters ---------- G : graph A NetworkX graph nodelist : list Use only nodes specified in nodelist RN(RtedgesR0(R?R@((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyRls cCst|ƒ}|j|ƒ|S(sšReturn a graph from a list of edges. Parameters ---------- edgelist : list or iterator Edge tuples create_using : NetworkX graph Use specified graph for result. Otherwise a new graph is created. Examples -------- >>> edgelist = [(0, 1)] # single edge (0,1) >>> G = nx.from_edgelist(edgelist) or >>> G = nx.Graph(edgelist) # use Graph constructor (R RH(tedgelistR R?((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyR}s  (t__doc__R2tnetworkxRtjoint __author__t__all__R RtFalseRRRRRRR(((sf/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/convert.pyts"        '(O