
    h@S                     ^   S r SSKrSSKr " S S5      r " S S5      r\R                  R                  S\R                  \R                  \R                  \R                  /5      S 5       r " S	 S
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)z8
Unit tests for dedensification and graph summarization
    Nc                   X    \ rS rSrS rS rS r\SS j5       rS r	S r
S rS	 rS
 rSrg)TestDirectedDedensification
   c                     SSS/ SQ4SSSS/4S	S/4/n[         R                  " 5       nU H  u  p4U H  nUR                  X55        M     M!     U$ )
N1BC2ABC3AB64r   5ABr   r   r   nxDiGraphadd_edgeselforiginal_matrixgraphsourcetargetstargets         ^/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/tests/test_summarization.pybuild_original_graph0TestDirectedDedensification.build_original_graph   se    /"3%L3%L
 

.OF!v. "  /     c                     SSS/4S/ SQ4SS/4SSS	/4S
S/4S/n[         R                  " 5       nU H  u  p4U H  nUR                  X55        M     M!     U$ )Nr   r   r   r   r   r   r   r   r   r   )r   r   r   r   compressed_matrixcompressed_graphr   r    r!   s         r"   build_compressed_graph2TestDirectedDedensification.build_compressed_graph   sy    5'N/"5'N3%L3%L	
 ::<0OF! ))&9 "  1  r%   c                 |    [         R                  " 5       n[         R                  " USS9u  p#U[        5       :X  d   eg)zD
Verify that an empty directed graph results in no compressor nodes
   	thresholdN)r   r   	dedensifyset)r   Gr)   c_nodess       r"   
test_empty&TestDirectedDedensification.test_empty,   s3     JJL$&LLa$@!#%r%   c                 ~   U(       a  U R                  5       n U H  n[        [        R                  " X5      5      n[        U R	                  U5      5      nU H  nU R                  X65        M     XE-
  nU H.  nU R                  X5        U H  nU R                  X5        M     M0     U R                  U5        M     U $ )an  
Reconstructs the original graph from a dedensified, directed graph

Parameters
----------
G: dedensified graph
   A networkx graph
compressor_nodes: iterable
   Iterable of compressor nodes in the dedensified graph
inplace: bool, optional (default: False)
   Indicates if densification should be done inplace

Returns
-------
G: graph
   A densified networkx graph
)copyr1   r   all_neighbors	neighborsremove_edger   remove_node)	r2   compressor_nodesr7   compressor_noder8   out_neighborsout_neighborin_neighborsin_neighbors	            r"   densify#TestDirectedDedensification.densify4   s    & A/O 0 0 DEMO <=M -o< !.(8L+k;$1LJJ{9 %2  , MM/*  0 r%   c                     SU l         g )N)r   r3   r   s    r"   setup_method(TestDirectedDedensification.setup_methodV   s	    r%   c                    U R                  5       nU R                  5       n[        R                  " USS9u  p4UR	                  5        Hb  u  pVSR                  [        U5      5      nSR                  [        U5      5      nUR                  XV5      n	UR                  Xx5      n
X:X  a  Mb   e   [        U5      [        U R                  5      :X  d   eg)za
Verifies that dedensify produced the correct edges to/from compressor
nodes in a directed graph
r-   r.    N)
r#   r*   r   r0   edgesjoinsortedhas_edgelenr3   )r   r2   compressed_Gr)   r3   sto_so_tcompressed_graph_existsverified_compressed_existss              r"   test_dedensify_edges0TestDirectedDedensification.test_dedensify_edgesY   s    
 %%'224$&LLa$@!$**,DA''&)$C''&)$C&6&?&?&E#)5)>)>s)H&*HHH - 7|s4<<0000r%   c                 "   U R                  5       n[        UR                  5       5      n[        R                  " USS9u  p4[        UR                  5       5      nXR::  d   eU R                  5       nU[        UR                  5       5      :X  d   eg)z]
Verifies that dedensify produced the correct number of compressor nodes
in a directed graph
r-   r.   N)r#   rO   rK   r   r0   r*   )r   r2   original_edge_countc_Gr3   compressed_edge_countrP   s          r"   test_dedensify_edge_count5TestDirectedDedensification.test_dedensify_edge_counti   s{    
 %%'!!'')n||A3 #CIIK 0$;;;224$L,>,>,@(AAAAr%   c                     U R                  5       nU R                  XR                  SS9nU R                  5       nUR	                  5        H+  u  pEUR                  XE5      UR                  XE5      :X  a  M+   e   g)zY
Verifies that densification produces the correct edges from the
original directed graph
T)r7   N)r*   rB   r3   r#   rK   rN   )r   rP   original_graphr2   rQ   rR   s         r"   test_densify_edges.TestDirectedDedensification.test_densify_edgesv   sj    
 224lLLtL%%'GGIDA::a#~'>'>q'DDDD r%   c                 *   U R                  5       n[        UR                  5       5      nU R                  XR                  5      n[        UR                  5       5      nX$::  d   eU R                  5       nU[        UR                  5       5      :X  d   eg)za
Verifies that densification produces the correct number of edges in the
original directed graph
N)r*   rO   rK   rB   r3   r#   )r   rP   r\   r`   rZ   r2   s         r"   test_densify_edge_count3TestDirectedDedensification.test_densify_edge_count   s~    
 224 #L$6$6$8 9lLLA!."6"6"89$;;;%%'"c!'')n444r%   rE   N)T)__name__
__module____qualname____firstlineno__r#   r*   r4   staticmethodrB   rG   rW   r]   ra   rd   __static_attributes__ r%   r"   r   r   
   sA      "   B 1 B	E5r%   r   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
TestUnDirectedDedensification   c                     SSS/ SQ4SSSS/4S	S/4/n[         R                  " 5       nU H  u  p4U H  nUR                  X55        M     M!     U$ )
z3
Builds graph shown in the original research paper
)r   CBr
   r   r   r   r   r   r   r   r   Graphr   r   s         r"   r#   2TestUnDirectedDedensification.build_original_graph   sg    
 /"3%L3%L
 
.OF!v. "  / r%   c                 |    [         R                  " 5       n[         R                  " USS9u  p#U[        5       :X  d   eg)zF
Verify that an empty undirected graph results in no compressor nodes
r-   r.   N)r   rs   r0   r1   )r   r2   rP   r3   s       r"   r4   (TestUnDirectedDedensification.test_empty   s2     HHJ "Q! <#%r%   c                     SU l         g )N)6ABr   rE   rF   s    r"   rG   *TestUnDirectedDedensification.setup_method   s	    %r%   c           
          SSS/4SS/4SS/4SS/4S	S/4S
SS/4SSS/4SSS/4SS/4/	n[         R                  " 5       nU H  u  p4U H  nUR                  X55        M     M!     U$ )Nr   r   Cr   r   r   rx   r   r   r   r   rr   r'   s         r"   r*   4TestUnDirectedDedensification.build_compressed_graph   s    3*5'N5'N5'N5'N5#,5%.!5%.!5'N

 88:0OF! ))&9 "  1  r%   c                    U R                  5       n[        R                  " USS9u  p#U R                  5       nUR	                  5        Hb  u  pVSR                  [        U5      5      nSR                  [        U5      5      nUR                  XV5      n	UR                  Xx5      n
X:X  a  Mb   e   [        U5      [        U R                  5      :X  d   eg)z
Verifies that dedensify produced correct compressor nodes and the
correct edges to/from the compressor nodes in an undirected graph
r-   r.   rJ   N)
r#   r   r0   r*   rK   rL   rM   rN   rO   r3   )r   r2   r[   r3   v_compressed_GrQ   rR   rS   rT   has_compressed_edgeverified_has_compressed_edges              r"   rW   2TestUnDirectedDedensification.test_dedensify_edges   s    
 %%'||A3446IIKDA''&)$C''&)$C"%,,q"4+9+B+B3+L(&FFF   7|s4<<0000r%   c                 &   U R                  5       n[        R                  " USSS9u  p#[        UR	                  5       5      n[        UR	                  5       5      nXE::  d   eU R                  5       n[        UR	                  5       5      nXG:X  d   eg)zU
Verifies that dedensify produced the correct number of edges in an
undirected graph
r-   T)r/   r7   N)r#   r   r0   rO   rK   r*   )r   r2   r[   r3   r\   verified_original_edge_countverified_compressed_Gverified_compressed_edge_counts           r"   r]   7TestUnDirectedDedensification.test_dedensify_edge_count   s    
 %%'||A> #CIIK 0'*1779~$$DDD $ ; ; =),-B-H-H-J)K&$FFFr%   rE   N)rf   rg   rh   ri   r#   r4   rG   r*   rW   r]   rk   rl   r%   r"   rn   rn      s!    & & $1 Gr%   rn   
graph_typec                 v    U " 5       n[         R                  " USS9n[         R                  " X!5      (       d   eg )Ncolor)node_attributes)r   snap_aggregationis_isomorphic)r   r2   summary_graphs      r"   test_summarization_emptyr      s4     	A'':FMM----r%   c                   0    \ rS rSrSrS rS rS rS rSr	g)	AbstractSNAP   r   c                     g Nrl   rF   s    r"   r#   !AbstractSNAP.build_original_graph       r%   c                     g r   rl   rF   s    r"   build_summary_graph AbstractSNAP.build_summary_graph   r   r%   c                     U R                  5       nU R                  5       nSn[        R                  " XR                  U5      nU R                  U5      n[        R                  " X%5      (       d   eg Ntyper#   r   r   r   r   deterministic_labelsr   r   r`   r   relationship_attributesgenerated_summary_graphrelabeled_summary_graphs         r"   test_summary_graphAbstractSNAP.test_summary_graph   sl    224002"+"$"5"5002I#
 #'";";<S"TGGGGr%   c                    ^ [        TR                  5      n[        UU4S jS9nUR                  5         0 n[	        U5       H  u  pESU 3nXcU'   M     [
        R                  " TU5      $ )Nc                 @   > [        TR                  U    S   5      S   $ )Ngroupr   )rM   nodes)nr2   s    r"   <lambda>3AbstractSNAP.deterministic_labels.<locals>.<lambda>   s    qwwqz'?R8STU8Vr%   )keyz
Supernode-)listr   rM   sort	enumerater   relabel_nodes)r   r2   node_labelslabel_mappingindexnodelabels    `     r"   r   !AbstractSNAP.deterministic_labels   sh    177m[.VW$[1KE (E"'$ 2 =11r%   rl   N)
rf   rg   rh   ri   r   r#   r   r   r   rk   rl   r%   r"   r   r      s     O	H
2r%   r   c                   *    \ rS rSrSrS rS rS rSrg)TestSNAPNoEdgeTypesi	  rl   c                     U R                  5       nU R                  5       nSn[        R                  " XR                  5      nU R                  U5      n[        R                  " X%5      (       d   eg r   r   r   s         r"   r   &TestSNAPNoEdgeTypes.test_summary_graph  si    224002"+"$"5"500#
 #'";";<S"TGGGGr%   c                     SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0S.n/ SQn[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgUR                  Xg5        M     U$ )Nr   RedBlueYellowr   r   r{   DEFr2   HIJKL))r   r   )r   r{   )r   r   )r   r   )r   r   )r   r   )r   r   )r{   r2   )r   r   )r   r   )r   r   )r   r   r   rs   add_noder   )r   r   rK   r2   r   
attributesr   r!   s           r"   r#   (TestSNAPNoEdgeTypes.build_original_graph  s    5!5!5!5!6"6"6"6"8$8$8$8$

 HHJDJJJt*z*  $NFJJv& $ r%   c                 2   SS0SS0SS0SS0SS0SS0S.n/ SQn[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgUR                  Xg5        M     SS1S	S
1SS1SS1SS1SS1S.n[         R                  " X8S5        U$ )Nr   r   r   r   Supernode-0Supernode-1Supernode-2Supernode-3Supernode-4Supernode-5))r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   r   r   r{   r   r   r   r2   r   r   r   r   r   r   r   rs   r   r   set_node_attributes)	r   r   rK   r2   r   r   r   r!   
supernodess	            r"   r   'TestSNAPNoEdgeTypes.build_summary_graph>  s    #U+#U+#V,#V,#X.#X.

 HHJDJJJt*z*  $NFJJv& $  ::::::

 	qg6r%   N)	rf   rg   rh   ri   r   r   r#   r   rk   rl   r%   r"   r   r   	  s     	H%N#r%   r   c                        \ rS rSrS rS rSrg)TestSNAPUndirectedid  c                     SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0SS0S.n/ SQn[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnUR                  XgUS9  M     U$ )Nr   r   r   r   r   ))r   r   Strong)r   r{   Weakr   r   r   )r   r   r   )r   r   r   )r   r   r   r   r   r   )r{   r2   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   r   r   	r   r   rK   r2   r   r   r   r!   r   s	            r"   r#   'TestSNAPUndirected.build_original_graphe  s    5!5!5!5!6"6"6"6"8$8$8$8$

 HHJDJJJt*z*  %* FDJJvDJ1 %* r%   c                 8   SS0SS0SS0SS0SS0SS0S.n/ SQn[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnUR                  XgSU0/S9  M     S	S
1SS1SS1SS1SS1SS1S.n	[         R                  " X9S5        U$ )Nr   r   r   r   r   ))r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   r   typesr   r   r{   r   r   r   r2   r   r   r   r   r   r   r   )
r   r   rK   r2   r   r   r   r!   r   r   s
             r"   r   &TestSNAPUndirected.build_summary_graph  s    #U+#U+#V,#V,#X.#X.

 HHJDJJJt*z*  %* FDJJvvtn-=J> %*  ::::::

 	qg6r%   rl   Nrf   rg   rh   ri   r#   r   rk   rl   r%   r"   r   r   d  s    %N#r%   r   c                        \ rS rSrS rS rSrg)TestSNAPDirectedi  c           	          SS0SS0SS0SS0SS0SS0SS0SS0S.n/ SQn[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnUR                  XgUS9  M     U$ )	Nr   r   Greenr   r   r   r   r{   r   r   r   r2   r   ))r   r{   r   r   )r   r   r   )r   r   r   )r   r   r   r   )r{   r2   r   )r{   r   r   )r   r   r   )r   r   r   )r2   r   r   )r   r   r   r   )r   r   r   r   r   s	            r"   r#   %TestSNAPDirected.build_original_graph  s    5!5!7#7#6"6"8$8$	

 JJLDJJJt*z*  %* FDJJvDJ1 %* r%   c                 n   SS0SS0SS0SS0S.nSSS	S
0/4SSS	S0S	S
0/4SSS	S
0/4SSS	S
0/4SSS	S
0/4/n[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnUR                  XgUS9  M     SS1SS1SS1SS1SS1SS1S.n	[         R                  " X9S5        U$ )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r2   r   r   r   r   r   r   r   )r   r   r   r   r   )
r   r   rK   r2   r   r   r   r!   r   r   s
             r"   r   $TestSNAPDirected.build_summary_graph  s-   #U+#W-#V,#X.	
 MVX,>+?@MVV,<vx>P+QRMVX,>+?@MVX,>+?@MVX,>+?@
 JJLDJJJt*z*  &+!FEJJvUJ3 &+  ::::::

 	qg6r%   rl   Nr   rl   r%   r"   r   r     s    !Fr%   r   c                        \ rS rSrS rS rSrg)TestSNAPUndirectedMultii  c                 T   SS0SS0SS0SS0SS0SS0SS0SS0SS0S.	nSSSS	/4S
SSS	/4SSS	/4SSS	/4SSS/4SSSS	/4SSSS	/4SSSS	/4/n[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnU H  n	UR                  XgU	S9  M     M!     U$ )Nr   r   r   r   )	r   r   r{   r   r   r   r2   r   r   r   r   r   r   r   r   r   r   r   r2   r   )r   
MultiGraphr   r   
r   r   rK   r2   r   r   r   r!   r   r   s
             r"   r#   ,TestSNAPUndirectedMulti.build_original_graph  s*   5!5!5!6"6"6"8$8$8$

 #)*#)*#z"#z"#x #)*#)*#)*	
 MMODJJJt*z*  &+!FE

6
5  &+ r%   c           	         SS0SS0SS0SS0SS0SS0S.nSSSS	0/4SS
SS	0SS0/4SS
SS0/4SSSS	0SS0/4S
S
SS	0SS0/4/n[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnU H  n	UR                  XgU	S9  M     M!     SS1SS1SS1SS1SS1SS1S.n
[         R                  " X:S5        U$ )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r2   r   r   r   r   r   r   )r   r   r   r   r   r   r   rK   r2   r   r   r   r!   r   r   r   s              r"   r   +TestSNAPUndirectedMulti.build_summary_graph  sU   #U+#V,#X.#V,#X.#U+
 MVV,<+=>MVV,<vx>P+QRMVX,>+?@MVV,<vx>P+QRMVV,<vx>P+QR
 MMODJJJt*z*  &+!FE

6
5  &+
  ::::::

 	qg6r%   rl   Nr   rl   r%   r"   r   r     s    B"r%   r   c                        \ rS rSrS rS rSrg)TestSNAPDirectedMultii?  c                 t   SS0SS0SS0SS0SS0SS0SS0SS0S.nSSS	S
/4SSS
/4SSS	/4SSS	S
/4SSS	/4SSS
/4SSS	S
/4SSS
/4SSS
/4SSS	S
/4SSS
/4SSS
/4/n[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnU H  n	UR                  XgU	S9  M     M!     U$ )Nr   r   r   r   r   r   r   r{   r   r   r   r   r   r   r2   r   r   )r   MultiDiGraphr   r   r   s
             r"   r#   *TestSNAPDirectedMulti.build_original_graph@  sP   5!5!7#7#6"6"8$8$	
 #)*#z"#x #)*#x #z"#)*#z"#z"#)*#z"#z"
 OODJJJt*z*  &+!FE

6
5  &+ r%   c                 `   SS0SS0SS0SS0S.nSSSS	/4SS
SS	/4SS
S	/4SSSS	/4SS
S	/4/n[         R                  " 5       nU H  nX   nUR                  " U40 UD6  M     U H  u  pgnU H  n	UR                  XgU	S9  M     M!     SS1SS1SS1SS1S.n
[         R                  " X:S5        U$ )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r2   r   r   )r   r   r   r   r   r   s              r"   r   )TestSNAPDirectedMulti.build_summary_graphd  s   #U+#V,#X.#V,	
 MFH+=>MFH+=>MH:6MFH+=>MH:6
 OODJJJt*z*  &+!FE

6
5  &+
  ::::	

 	qg6r%   rl   Nr   rl   r%   r"   r   r   ?  s    "Hr%   r   )__doc__pytestnetworkxr   r   rn   markparametrizers   r   r   r   r   r   r   r   r   r   r   rl   r%   r"   <module>r     s     B5 B5JMG MG` 288RZZH..2 2BX, XvK K\C| CLDl DNCL Cr%   