K i֚dZddlZddlZddlmZmZmZmZmZddl Z ddl m Z gdZ e dddd Zdd Ze dd e j dd ddZGddZGddeZGddeZdZy)aSRead and write graphs in GEXF format. .. warning:: This parser uses the standard xml library present in Python, which is insecure - see :external+python:mod:`xml` for additional information. Only parse GEFX files you trust. GEXF (Graph Exchange XML Format) is a language for describing complex network structures, their associated data and dynamics. This implementation does not support mixed graphs (directed and undirected edges together). Format ------ GEXF is an XML format. See http://gexf.net/schema.html for the specification and http://gexf.net/basic.html for examples. N)Element ElementTree SubElementregister_namespacetostring) open_file) write_gexf read_gexfrelabel_gexf_graph generate_gexfwb)modeTcdt|||}|j||j|y)a4Write G in GEXF format to path. "GEXF (Graph Exchange XML Format) is a language for describing complex networks structures, their associated data and dynamics" [1]_. Node attributes are checked according to the version of the GEXF schemas used for parameters which are not user defined, e.g. visualization 'viz' [2]_. See example for usage. Parameters ---------- G : graph A NetworkX graph path : file or string File or file name to write. File names ending in .gz or .bz2 will be compressed. encoding : string (optional, default: 'utf-8') Encoding for text data. prettyprint : bool (optional, default: True) If True use line breaks and indenting in output XML. version: string (optional, default: '1.2draft') The version of GEXF to be used for nodes attributes checking Examples -------- >>> G = nx.path_graph(4) >>> nx.write_gexf(G, "test.gexf") # visualization data >>> G.nodes[0]["viz"] = {"size": 54} >>> G.nodes[0]["viz"]["position"] = {"x": 0, "y": 1} >>> G.nodes[0]["viz"]["color"] = {"r": 0, "g": 0, "b": 256} Notes ----- This implementation does not support mixed graphs (directed and undirected edges together). The node id attribute is set to be the string of the node label. If you want to specify an id use set it as node data, e.g. node['a']['id']=1 to set the id of node 'a' to 1. References ---------- .. [1] GEXF File Format, http://gexf.net/ .. [2] GEXF schema, http://gexf.net/schema.html encoding prettyprintversionN) GEXFWriter add_graphwrite)Gpathrrrwriters ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/networkx/readwrite/gexf.pyr r $s-d{G TF Q LLc#Kt|||}|j|t|jEd{y7w)aGenerate lines of GEXF format representation of G. "GEXF (Graph Exchange XML Format) is a language for describing complex networks structures, their associated data and dynamics" [1]_. Parameters ---------- G : graph A NetworkX graph encoding : string (optional, default: 'utf-8') Encoding for text data. prettyprint : bool (optional, default: True) If True use line breaks and indenting in output XML. version : string (default: 1.2draft) Version of GEFX File Format (see http://gexf.net/schema.html) Supported values: "1.1draft", "1.2draft" Examples -------- >>> G = nx.path_graph(4) >>> linefeed = chr(10) # linefeed= >>> s = linefeed.join(nx.generate_gexf(G)) >>> for line in nx.generate_gexf(G): # doctest: +SKIP ... print(line) Notes ----- This implementation does not support mixed graphs (directed and undirected edges together). The node id attribute is set to be the string of the node label. If you want to specify an id use set it as node data, e.g. node['a']['id']=1 to set the id of node 'a' to 1. References ---------- .. [1] GEXF File Format, https://gephi.org/gexf/format/ rN)rrstr splitlines)rrrrrs rr r [s;P{G TF Q6{%%'''sz'GEXF.construct_types..s; ;s)r;r4boollistdictrnumpyfloat64float32float16int_int8int16int32int64uint8uint16uint32uint64intcintp ImportErrorxml_type python_type)selftypesnps rconstruct_typeszGEXF.construct_typessY )  G  H  9  8  8  &M ,  (O (O     W%W%W%% % 5!5!5!5!E"E"E"% % %  !E$U  ;U;;/   s D>> E  E TF)truefalseTrueFalse0r1r c|jj|}|tjd|d|d|_|d|_|d|_|d|_|d|_||_ y)NzUnknown GEXF version .r,r-r.r/r0) versionsgetnx NetworkXErrorr,r-r.r/r0r)rWrds r set_versionzGEXF.set_versionsw MM  g & 9""%:7)1#EF F| k k  01|  rN)__name__ __module__ __qualname__joinrcrZ convert_boolrhrrr)r)s68A!hh2;   68A!hh2;   H6(\}}}|jd}||jjt |@|j jddk(rd}nd}|j rd}nd}|j jd d }td ||| } | |_|j|| |j|| |jj| y) NTdataidrryrzdirected undirectednamer)defaultedgetyperr) edgesrdraddrr is_directedr graph_element add_nodes add_edgesr{r) rWruvddeidrdefaultrrs rrzGEXFWriter.add_graphGsT* 0HAq"&&,C!!%%c#h/ 0 77;;v ) +DD ==? G"Gww{{62&tRVW * q-( q-(  &rctd}|jdD]{\}}|j}t|j d|}d|i}t|j d|} | |d< |j d} t| |d< |j d} t| |d<|j |  |j d} t| |d<|j | td i|} |jjd i}|j| |}|jd k(r|j| |}n|j| |}|j| |}|jd | ||}|j| ~|j|y#t $rY'wxYw#t $rYwxYw#t $rYwxYw) NnodesTrrlabelpidstartendrw node_defaultr+)rw)rrcopyrpopKeyErroralter_graph_mode_timeformatrrd add_parentsr0 add_slices add_spellsadd_vizadd_attributesr)rWrr nodes_elementrwr node_datanode_idkwrrrr node_elementrs rrzGEXFWriter.add_nodes^s( ''t'," /JD$ I)--d34GB gt45EBwK mmE*H5  ! g.!%j7 007 mmE*H5 005#0R0Lggkk."5G((yAI||u$ OOL)D  OOL)D  \9=I++FL)WUI   .E" /F ]+5        s65F/0F?0G/ F<;F<? G  G  GGcxfd}td}||D]\}}}}dt|i} |jd} t| | d< |jd} t| | d< |jd} t| | d< |jd} t| | d<j |  |jd}t|| d<j |t|j |j d|}t|j |j d|}td ||d | }|jj d i}jd k(rj||}nj||}j||}jd |||}|j||j|y#t$rYwxYw#t$rYwxYw#t$rYwxYw#t$rYgwxYw#t$rYFwxYw)Nc3hK|jr|jddD]\}}}}|j}|j||j dd}|}t j }t|jvr-t j }t|jvr-jjt|||||fy|jdD]\}}}|j}|j dd}|}t j }t|jvr-t j }t|jvr-jjt|||||fyw)NT)rkeys)keyrr) is_multigraphrrupdaternextrrrr)rrrrr edge_datarrWs r edge_key_dataz+GEXFWriter.add_edges..edge_key_datasz '(wwDtw'D 3OAq#t $ I$$$-'mmD$7G"&t||"4!'ld.?.??&*4<<&8G"'ld.?.??))--c'l;Q22 3#$''t'"43JAq$ $ I'mmD$7G"&t||"4!'ld.?.??&*4<<&8G"'ld.?.??))--c'l;Q223sB:F2>CF2/F2rrrweighttyperrrx)sourcetarget edge_defaultr+)rx)rrrrrrrdrr0rrrrr)rWrrr edges_elementrrrrr edge_label edge_weight edge_typerr source_id target_id edge_elementrs` rrzGEXFWriter.add_edgess4 30 ( $1!$4' / Aq#yC!B &]]73 !*o7  'mmH5 ";/8  %MM&1  ^6  ! g.!%j7 007 mmE*H5 005AGGAJNN434IAGGAJNN434I"T)ITQSTLggkk."5G||u$ OOL)D  OOL)D  \9=I++FL)WUI   .O' /P ]+G              sYG,G<1H 0H0H,, G98G9< H H  HH H)(H), H98H9ctd}t|dk(r|Sd}|jD]\}}|dk(rd}t|} | |jvrt d| t |tr\|D];\} } } t| } | | d}|j| |j| n|jt||j| |||} |D]\} } } td}| |jd <t| |jd <| ture|jd d k(rd |jd <nC|jd d k(rd|jd <n!|jd dk(rd|jd <| t| |jd<| t| |jd<|j|d}|jt||j| |||} td}| |jd <t |tr't|j|jd <nt||jd <| ture|jd d k(rd |jd <nC|jd d k(rd|jd <n!|jd dk(rd|jd <|j||j||S)N attvaluesrrzr networkx_keyz%attribute value type is not allowed: ryattvalueforvalueinfINFnanNaNz-infz-INFrr)rlenitemsrrU TypeError isinstancerCr get_attr_idrattribr4rrBlower)rW node_or_edgexml_objrrrrkrval_typevalrrres rrzGEXFWriter.add_attributessK( t9>KJJL8 $DAqEz"AwHt}},"Gz RSS!T"'(OC#CyH(CO(88?88= **FDMM(3\7D()(OC +A&-AHHUO(+CAHHW%5(88G,505AHHW-XXg.%705AHHW-XXg.&806AHHW-(,/J)*-c($$Q'!(& **FDMM(3\7DJ'")a&(+A AHHW%(+AAHHW%5(88G,505AHHW-XXg.%705AHHW-XXg.&806AHHW-  #q8 $r y! rcz |j|||S#t$rtt|j}||j|||<|||d}t d i|}|j |} | ,t d} t| | _|j| d} |jjdD]3} | j d} | j dd}| |k(s,||k(s2| } 5| ,||d}t d i|} |jjd| | j|Y|SwxYw) N)rtitlerr attributesclassrrz)rrr) attribute)r) rrrrrrrdr}rrfindallinsert)rWr attr_type edge_or_noderrnew_id attr_kwargsr default_titledefault_elementattributes_elementr@a_classa_modes rrzGEXFWriter.get_attr_id sM 199\*407 7 1dll+,F39DIIl #D )% 0!'%KK;{;I#KK.M("))"4'*='9$  1!% ''// = +%%.vx0l*v~)*&  + ")'+lC %,%I[%I"""))!-?@  % %i 0 5 1sCD:-D:3AD:9D:c |jdd}|r|jd}||jdk(rftd|jdt |jdt |jdt |jd  }ntd|jdt |jdt |jdt |jd t |jd d  }|j ||jd}|5td|jdt |}|j ||jd}|5td|jdt |}|j ||jd}|l|jdr&td|jddt |}n$td|jdt |}|j ||jd} | vtd|jdt | jdt | jdt | jd}|j ||S)NrvFcolorr+{}colorrgbrrrr@g?rrrr@size}size)r thickness }thicknessshapehttp}shapeimage)ruriposition }positionxyzr r r )rrdr0rr-rr startswith) rWelementrrvrrrrrrs rrzGEXFWriter.add_viz+sImmE5) GGG$E <<5(T[[M1eiin-eiin-eiin- A T[[M1eiin-eiin-eiin-eiiS12 Aq!776?Db V4CIFq! ,I$b [9YPq!GGG$E ##F+T[[M1c%jA "T[[M 9ULAq!wwz*H# Z0(,,s+,(,,s+,(,,s+,  q!rc|jdd}|rWtd}|D]6}td}t||jd<|j |8|j ||S)NparentsFparentr)rrrrr)rWrrrparents_elementprs rrzGEXFWriter.add_parents`sm-- 51 %i0O *H%"%a&&&q) *    0rc|jdd}|rWtd}|D]6\}}tdt|t|}|j|8|j||S)NslicesFslice)rr)rrrr)rWnode_or_edge_elementnode_or_edge_datarslices_elementrrrs rrzGEXFWriter.add_slicesksn"&&x7 $X.N$ ) sG3u:3s8D%%a( ) ! ' ' 7  rc^|jdd}|rtd}|D]w\}}td}|)t||jd<|j ||)t||jd<|j ||j |y|j ||S)NspellsFspellrr)rrrrrr)rWrrrspells_elementrrrs rrzGEXFWriter.add_spellsus"&&x7 $X.N$ ) sG$$(+E AHHW%44U;?&)#hAHHUO44S9%%a( ) ! ' ' 7  rcT|t|trd}n;t|trd}n(t|trd}nt j d|j jd||j jddk(r|j jddyyy) Ndater5r8z2timeformat should be of the type int, float or str timeformatrrzry) rrr4r;rerfrr~rd)rW start_or_endr!s rrz&GEXFWriter.alter_graph_mode_timeformats  #,,# L%0% L#.# &&H    " "< <!!%%f-9""&&vy9: $rc|jr|j|jt|j}|j ||j dy)NT)rxml_declaration)rrr{rrr)rWfhdocuments rrzGEXFWriter.writes?    KK !txx(rDMM4Hrcdd|zz}t|r|jr|jjs |dz|_|jr|jjs||_|D]}|j ||dz|jr|jjs||_yy|r/|jr|jjs||_yyy)N z r )rr}striptailr)rWelemlevelis rrzGEXFWriter.indents 4%<  t999DIIOO$5H 99DIIOO$5  - D%!), -99DIIOO$5 %6diityy/@ 0Aur)Nutf-8Tr1)r)rirjrkrrrrrrrrrrrrrrrnrrrrsXGQ)"V '.%,NB,H@D@3j !! :$IrrcXeZdZddZdZdZddZdZdZdZ d Z d Z d Z d Z d Zy)r%Ncb|j||_d|_|j|y)NT)rZr$ simple_graphrh)rWr$rs rrzGEXFReader.__init__s+ "  !rct||_|jjd|jd}||j |S|j D]Q}|j ||jjd|jd}|@|j |cStjd)N)filerz}graphz No element in GEXF file.) rr{findr, make_graphrcrhrerf)rWstreamrrs r__call__zGEXFReader.__call__sF+ HHMMBt||nG4 5 =??1% %}} *G   W % 4<<.89A}q))  * ABBrc.|jdd}|dk(rtj}ntj}|jdd}|dk7r||jd<|jd}|||jd<|jd}|||jd<|jdd}|dk(rd|jd<nd |jd<|jd |_|j d k(rd |_|j d |jd}i} i} i} i} |D]} | jd}|dk(rF|j| \}}| j|| j|| |jd<_|dk(rF|j| \}}| j|| j|| |jd<ddd ddi}i}| j|| j|| |jd<|jd |jd}|7|j d |jdD]}|j||| |jd |jd}|7|j d |jdD]}|j||| |jr<|jrtj|}|Stj |}|S)Nrrrrrrrryrzr!r r7rz }attributesrrwrrxrrr5)rrr}nodes}nodez}edgesz}edge)rdre MultiDiGraph MultiGraphrr!rr,find_gexf_attributesrr4add_nodeadd_edger1rDiGraphGraph)rW graph_xml edgedefaultr graph_name graph_start graph_end graph_modeattributes_elements node_attrr edge_attrrr@ attr_classnandeaedrnode_xmlredge_xmls rr5zGEXFReader.make_graphsmm$5t< * $!A A]]62.  (AGGFOmmG,  "*AGGG MM%(  &AGGEN]]62.  "'AGGFO&AGGFO$-- 5 ??f $&DO(//"T\\N,0OP    $ AwJV#2215B  $##B'*6'v%2215B  $##B'*6' "8hO P B"."DLL>'AB  $)11Bt||nF2KL 6 a95 6"DLL>'AB  $)11Bt||nF2KL 6 a95 6   }}JJqMHHQKrc|j||}|j||}|jdk(r|j||}n|j ||}|j ||}|j ||}|jd}|j|j|}|jd}||d<|jd|}|||d<|jd|jd}|9|jd|jdD]}|j|||||j|fi|y) Nr+rrrrr9r:)node_pid) decode_attr_elementsrr0rrr add_start_endrdr$r4r,rr>) rWrrPrIrSrr node_labelsubnodess rr>zGEXFReader.add_nodesM((H=h/ <<5 ??42D??42D||D(+!!$1,,t$ >> %nnW-G\\'* "W <<x0  "DK==2dll^7!;<  $,,r$,,v-FG H a9w G H  7#d#rc|j}|jd}||j|||d<|jd}||j|||d<|S)Nrr)r!rdrV)rWrr{ttype node_startnode_ends rrUzGEXFReader.add_start_end8smWWW%  !3D,,U3J?DM775>  1$**51(;DK rc i}|jd|jd}||jdk(rRt|j dt|j dt|j dd|d<nkt|j dt|j dt|j dt |j d d d |d<|jd|jd }|t |j d |d<|jd|jd}|t |j d |d<|jd|jd}|0|j d|d<|ddk(r|j d|d<|jd|jd}|Tt |j ddt |j ddt |j ddd|d<t |dkDr||d<|S)Nrrr+rrrrrr@r rrrrrrrrrrr r rr r r rrv)r4r-r0r;rdr4r) rWrrPrvrrrrrs rrzGEXFReader.add_vizCs 4;;-w78  ||u$UYYs^,UYYs^,UYYs^, G UYYs^,UYYs^,UYYs^,uyya01  G }}r$++f56   12CKMMBt{{m;"?@  $Y]]7%;  8<<Q/08<<Q/08<<Q/0C O s8a<DK rc|jd|jd}|Ng|d<|jd|jdD]'}|jd}|dj |)|S)Nrz}parentsrz}parentrr4r,rrdr)rWrrPrrrs rrzGEXFReader.add_parentspsy"--"T\\N)(DE  & DO$,,r$,,x-HI /uY&&v. / rc |jd|jd}|ag|d<|jd|jdD]:}|jd}|jd}|dj ||f<|S)Nrz}slicesrz}slicerrr^)rWrnode_or_edge_xmlrrrrs rrzGEXFReader.add_slicesys)..DLL>/JK  %DN#++bg,FG 4geeElX%%ucl3 4 rcn|jd|jd}|g|d<|j}|jd|jdD]`}|j||j d}|j||j d}|dj ||fb|S)Nrz}spellsrz}spellrr)r4r,r!rrVrdr)rWrr`rrYrrrs rrzGEXFReader.add_spellss)..DLL>/JK  %DNOOE#++bg,FG 4/((/g?-d&&u-aeeEl;X%%ucl3 4 rc|jd}|jr|dk(rtjd|js|dk(rtjd|jd}|jd}|j"|j |}|j |}|j ||}|j ||}|jdk(r|j||}n|j||}|jd }|||d <|jd d} | | }|jd } | t| |d <|jd } | | |d <|j||rd |_ |j||fd|i||dk(r|j||fd|i|yy)Nrrz(Undirected edge found in directed graph.rz(Directed edge found in undirected graph.rrr+rrrrFrmutual)rdrrerfr$rTrUr0rrrr4has_edger1r?) rWrrrJedge_directionrrrrmultigraph_keyrrs rr?zGEXFReader.add_edges&))&1 ==?~=""#MN N ^z%A""#MN N!!(+!!(+ >> %^^F+F^^F+F((LA!!$ 5 <<5 ??46D??46D ""4(   DJ.$7  %$G!!(+  "6]DN!%%g.  !&DM ::ff % %D  667w7$7 X % AJJvv ;7 ;d ; &rci}|jd|jd}| |jd|jdD]}|jd} ||d}||d} |jd } | d k(r|j| } n|j| | } ||d d k(rz|j} |j| |jd } |j| |jd} ||vr||j| | | f| | | fg||<| ||<|S#t$r}t j d|d|d}~wwxYw)Nrz }attvaluesz }attvaluerrzNo attribute defined for=rbrrr6rryrr) r4r,rrdrrerfrmrVr!r)rW gexf_keysobj_xmlr attr_elementr@rrerratyperrYrrs rrTzGEXFReader.decode_attr_elementss||bk$BC  #!))Bt||nJ*GH (eeElX%cN73E"#v.gI% --e4E3D,,U3E:ES>&)Y6!OOE3D,,U3AEE'NCE1$**51!%%,?C}U **E5#+>?(-uc':&;U #(DK1 (2 + X**-Fse1+MNTWWXsD22 E;EEci}i}|jd}|jd|jdD]}|jd}|jd}|jd}|||d||<|jd|jd} | a|d k(r|j| j } n|j || j } | ||<||fS) Nrrz }attributerrr)rrrz}defaultr6)rdrr,r4rmr}rV) rWrattrsdefaultsrrrrrlrrs rr=zGEXFReader.find_gexf_attributess!%%f-#++bk,JK (AeeDkGEE'NEEE&ME',eTJE'Nffr$,,y9:G"I% --gll;E3D,,U3GLLAE"' (hr)Nr1r=)rirjrkrr7r5r>rUrrrrr?rTr=rnrrr%r%sE" CM^!$F +Z 2r}s& $ L 1433l*(Z 14T2( 3( V[[|YYx GGT / r