
    Vhl                         d dl Z d dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZ e j                  j                  dd      d        Zd Zd Zd	 Z G d
 d      Zy)    N)graph_edit_distanceoptimal_edit_pathsoptimize_graph_edit_distance)circular_ladder_graphcycle_graph
path_graphwheel_graphsource)
   fooc                    t        j                  d       t        j                  d      }t        j                  |d|       }t        j
                  t        j                  d      5  t        |       d d d        y # 1 sw Y   y xY w)Nnumpy      )sample_sizer
   zInitial node.*not in Gmatch)pytestimportorskipnxcomplete_graphgenerate_random_pathsraisesNodeNotFoundnext)r
   Gpath_gens      Y/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/tests/test_similarity.py*test_generate_random_paths_source_not_in_Gr      sc    
 
!A''qHH	r.F	G X  s   (A==Bc                     | |k(  S N n1n2s     r   nmatchr&          8O    c                     | |k(  S r!   r"   e1e2s     r   ematchr-      r'   r(   c                  >   t        j                         } | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  ddd       | j                  ddd       | j                  ddd       | S )	NAlabelBCDa-bb-cb-d)r   Graphadd_nodeadd_edge)r   s    r   getCanonicalr;   #   s    

AJJs#JJJs#JJJs#JJJs#JJJsCuJ%JJsCuJ%JJsCuJ%Hr(   c                   4   e Zd Zed        Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej@                  ejB                  jD                  jF                  gZ$e%jL                  jO                  de$      d        Z(e%jL                  jO                  de$      d        Z)e%jL                  jO                  de$      d        Z*e%jL                  jO                  de$      d         Z+e%jL                  jO                  d!e$      d"        Z,d# Z-d$ Z.d% Z/d& Z0d' Z1d( Z2d) Z3d* Z4d+ Z5d, Z6e%jL                  jO                  d-d.      e%jL                  jO                  d/d0      d1               Z7d2 Z8d3 Z9d4 Z:y5)6TestSimilarityc                 X    t        j                  d      at        j                  d       y )Nr   scipy)r   r   np)clss    r   setup_classzTestSimilarity.setup_class0   s"       )G$r(   c                    t        j                  d      }|j                         }t        j                  t
        t        ||dg       t        j                  t
        t        ||g d       t        j                  t         j                  t        ||d       t        j                  t         j                  t        ||d       t        j                  t         j                  t        ||d       t        ||d      d	k(  sJ t        ||d
      dk(  sJ t        ||dd      d	k(  sJ t        ||d
d      dk(  sJ t        ||d
d      J t        j                  t         j                  t        ||d	       y )Nr      )roots)rD   r      )	   r   )r   rG   )rG   rG      rD   r   r   rI      )rE   timeout-C6?)rL   )	r   
star_graphcopyr   r   
ValueErrorr   r   NetworkXError)selfG0G1s      r   *test_graph_edit_distance_roots_and_timeoutz9TestSimilarity.test_graph_edit_distance_roots_and_timeout6   s$   ]]1WWYj"5r2aSIj"5r2YOboo':B&Qboo':B&Qboo':B&Q"2r8A==="2r8A==="2rCqHHH"2rCqHHH"2rHPPPb&&(;RQOr(   c                    t        j                         }t        d      }t        d      }t	        d      }t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ y )	N      r            rI   rK   )r   r8   r   r   r	   r   rR   rS   rT   G2G3s        r   test_graph_edit_distancez'TestSimilarity.test_graph_edit_distanceF   sx   XXZ]^^"2r*a///"2r*b000"2r*b000"2r*b000"2r*b000"2r*b000"2r*b000"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///r(   c                 >   t        d      }t        d      }|j                  j                         D ]  \  }}|dz  dk(  rdnd|d<    |j                  j                         D ]  \  }}|dz  dk(  rdnd|d<    t        ||      dk(  sJ t        ||d 	      dk(  sJ y )
Nr   rD   r   redbluecolorrI   c                     | d   |d   k(  S Nrc   r"   r#   s     r   <lambda>zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>j       "W+G2L r(   )
node_match)r   nodesitemsr   )rR   rT   r]   nattrs        r   #test_graph_edit_distance_node_matchz2TestSimilarity.test_graph_edit_distance_node_match`   s    ^^xx~~' 	<GAt%&UaZEVDM	<xx~~' 	<GAt%&UaZEVDM	<"2r*a///B#L 	
r(   c                 b   t        d      }t        d      }|j                  j                         D ]  \  }}t        |      dz  dk(  rdnd|d<    |j                  j                         D ]  \  }}t        |      dz  dk(  rdnd|d<    t	        ||      dk(  sJ t	        ||d 	      dk(  sJ y )
NrW   rD   r   ra   rb   rc   r   c                     | d   |d   k(  S re   r"   r*   s     r   rf   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>y   rg   r(   )
edge_matchr   edgesrj   minr   )rR   rT   r]   erl   s        r   #test_graph_edit_distance_edge_matchz2TestSimilarity.test_graph_edit_distance_edge_matcho   s    ]]xx~~' 	AGAt%(VaZ1_E&DM	Axx~~' 	BGAt%(Vq[A%5E6DM	B"2r*a///B#L 	
r(   c                 0   t        d      }t        d      }|j                  j                         D ]  \  }}|dz  dk(  rdnd|d<    |j                  j                         D ]  \  }}|dz  dk(  rdnd|d<    d }d	 }d
 }t        |||||      dk(  sJ y )NrW   rD   r   ra   rb   rc   rI   c                     | d   |d   k(  ryy)Nrc   rI   r   r"   )uattrvattrs     r   node_subst_costzJTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_subst_cost   s    W~w/r(   c                     | d   dk(  ryy)Nrc   rb      2   r"   rl   s    r   node_del_costzHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_del_cost   s    G}&r(   c                     | d   dk(  ryy)Nrc   rb   (   d   r"   r~   s    r   node_ins_costzHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost   s    G}&r(   )rz   r   r   )r   ri   rj   r   )rR   rT   r]   rk   rl   rz   r   r   s           r   "test_graph_edit_distance_node_costz1TestSimilarity.test_graph_edit_distance_node_cost~   s    ]]xx~~' 	<GAt%&UaZEVDM	<xx~~' 	<GAt%&UaZEVDM	<			   /++ 		
r(   c                 T   t        d      }t        d      }|j                  j                         D ]  \  }}t        |      dz  dk(  rdnd|d<    |j                  j                         D ]  \  }}t        |      dz  dk(  rdnd|d<    d }d	 }d
 }t	        |||||      dk(  sJ y )NrW   rD   r   ra   rb   rc   r   c                     | d   |d   k(  ryy)Nrc   {Gz?皙?r"   )gattrhattrs     r   edge_subst_costzJTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_subst_cost   s    W~w/r(   c                     | d   dk(  ryy)Nrc   rb   皙?      ?r"   r~   s    r   edge_del_costzHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_cost       G}&r(   c                     | d   dk(  ryy)Nrc   rb   g?      ?r"   r~   s    r   edge_ins_costzHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost   r   r(   )r   r   r   gq=
ףp?rq   )rR   rT   r]   rt   rl   r   r   r   s           r   "test_graph_edit_distance_edge_costz1TestSimilarity.test_graph_edit_distance_edge_cost   s    ]]xx~~' 	AGAt%(VaZ1_E&DM	Axx~~' 	BGAt%(Vq[A%5E6DM	B			   /++ 		
r(   c                     t        d      }t        d      }t        ||d      J t        ||d      dk(  sJ t        ||      dk(  sJ y )NrD   rW   r   )upper_bound      )r   r   rR   rT   r]   s      r   $test_graph_edit_distance_upper_boundz3TestSimilarity.test_graph_edit_distance_upper_bound   sW    "1%"1%"2rq9AAA"2rr:b@@@"2r*b000r(   c                 @   t        d      }t        d      }t        ||      \  }}|dk(  sJ t        |      dk(  sJ d }g dg dfg dg dfg d	g d
fg dg dfg dg dfg dg dfg}|D ch c]  } || 	 c}|D ch c]  } || 	 c}k(  sJ y c c}w c c}w )Nr   rI   rW   c                 X    t        t        |             t        t        |d             fS )Nc                     d | v | fS r!   r"   )xs    r   rf   zKTestSimilarity.test_optimal_edit_paths.<locals>.canonical.<locals>.<lambda>   s    tqy!n r(   )key)tuplesorted)vertex_path	edge_paths     r   	canonicalz9TestSimilarity.test_optimal_edit_paths.<locals>.canonical   s)    f[)*fY,DEF r(   )r   r   rI   rI   rD   rD   )rJ   rJ   rH   rH   Nr   rD   )r   rH   rD   rI   )rJ   r   r   NrJ   )rJ   rI   r   r   )r   rH   r   NrH   )rJ   rH   rD   r   )rJ   rH   r   r   )r   r   r   )r   rH   rJ   r   )r   r   r   )r   r   r   )r   r   r   len)rR   rT   r]   pathscostr   expected_pathsps           r   test_optimal_edit_pathsz&TestSimilarity.test_optimal_edit_paths   s    ]^(R0tqyy5zQ	 )D
 )D
 )D
 )D
 )D
 )D+
4 (--!	1-1XA)Q-1XXXX-1Xs   0BBc                 v    t        d      }t        d      }d}t        ||      D ]  }||k  sJ |} |dk(  sJ y )NrD   rW   i  r   )r   r   )rR   rT   r]   bestcostr   s        r   !test_optimize_graph_edit_distancez0TestSimilarity.test_optimize_graph_edit_distance   sP    "1%"1%0R8 	D(?"?H	 2~~r(   c                 *   t        j                         }t        j                         }|j                  d       t        j                         }|j                  d       t        j                         }|j                  d       t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ y )N)r/   r/   r/   r2   )r   r2   r2   )r   r   r   r   rF   r   rI   )r   r8   add_edges_fromr   r\   s        r   test_selfloopszTestSimilarity.test_selfloops  s   XXZXXZ
23XXZ
23XXZ
>?"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///r(   c                 *   t        j                         }t        j                         }|j                  d       t        j                         }|j                  d       t        j                         }|j                  d       t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ y )N)r   r2   r3   r3   r4   )r4   r/   )r   r   r   )r/   r4   )r   r/   r3   )r2   r4   r   r   rK   rD   rF   )r   DiGraphr   r   r\   s        r   test_digraphzTestSimilarity.test_digraph#  s   ZZ\ZZ\
JKZZ\
JKZZ\
JK"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///r(   c                 *   t        j                         }t        j                         }|j                  d       t        j                         }|j                  d       t        j                         }|j                  d       t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      d	k(  sJ t        ||      d	k(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ t        ||      dk(  sJ y )
N)r   r   r   )r   r   r   r   )r   r   r   r   r   r   rW   rX   rK   rI   rD   )r   
MultiGraphr   r   r\   s        r   test_multigraphzTestSimilarity.test_multigraph@  s   ]]_]]_
>?]]_
JK]]_
VW"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///"2r*a///r(   c                     t        j                         }|j                  d       t        j                         }|j                  d       t        ||      dk(  sJ t        ||      dk(  sJ y )N))hardwarekernel)r   r   )r   	userspace)r   r   ))winterspring)r   summer)r   autumn)r   r   r   )r   MultiDiGraphr   r   r   s      r   test_multidigraphz TestSimilarity.test_multidigraph]  sn    __
	
 __
	
 #2r*a///"2r*a///r(   c                     t        j                         }|j                  dd       |j                  dd       |j                  ddd       t	        ||j                         t        t              dk(  sJ y Nr/   r0   r2   r5   rh   rp   r   )r   r8   r9   r:   r   rO   r&   r-   rR   r   s     r   testCopyzTestSimilarity.testCopyu  sa    HHJ	

3c
"	

3c
"	

35
)16686RVWW	
Wr(   c                 t   t        j                         }|j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  ddd       t	        ||t
        t              dk(  sJ y r   r   r8   r9   r:   r   r&   r-   r   s      r   testSamezTestSimilarity.testSame~      XXZ
Cs#
Cs#
CE*XXZ
Cs#
Cs#
CE*"2rfPTUUUUr(   c                 t   t        j                         }|j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  ddd       t	        ||t
        t              dk(  sJ y )Nr/   r0   r2   r5   badr   rI   r   r   s      r   testOneEdgeLabelDiffz#TestSimilarity.testOneEdgeLabelDiff  r   r(   c                 t   t        j                         }|j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  ddd       t	        ||t
        t              dk(  sJ y )Nr/   r0   r2   r5   Zr   rI   r   r   s      r   testOneNodeLabelDiffz#TestSimilarity.testOneNodeLabelDiff  r   r(   c                    t        j                         }|j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  ddd       |j                  dd       t	        ||t
        t              dk(  sJ y )Nr/   r0   r2   r5   r3   r   rI   r   r   s      r   testOneExtraNodezTestSimilarity.testOneExtraNode  s    XXZ
Cs#
Cs#
CE*XXZ
Cs#
Cs#
CE*
Cs#"2rfPTUUUUr(   c                    t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  ddd       |j                  ddd       t	        ||t
        t              dk(  sJ y )	Nr/   r0   r2   r3   r5   a-cr   rI   r   r   s      r   testOneExtraEdgezTestSimilarity.testOneExtraEdge  s    XXZ
Cs#
Cs#
Cs#
Cs#
CE*XXZ
Cs#
Cs#
Cs#
CE*
CE*"2rfPTUUUUr(   c                    t        j                         }|j                  dd       |j                  dd       |j                  ddd       t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  ddd       |j                  ddd       t	        ||t
        t              dk(  sJ y )	Nr/   r0   r2   r5   r3   r   r   rD   r   r   s      r   testOneExtraNodeAndEdgez&TestSimilarity.testOneExtraNodeAndEdge  s    XXZ
Cs#
Cs#
CE*XXZ
Cs#
Cs#
Cs#
CE*
CE*"2rfPTUUUUr(   c                    t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd       |j	                  ddd       |j	                  ddd       t        ||t        t        	      d
k(  sJ y )Nr/   r0   r2   r4   Er5   r7   d-er   r   r;   r   r8   r9   r:   r   r&   r-   r   s      r   
testGraph1zTestSimilarity.testGraph1      ^XXZ
Cs#
Cs#
Cs#
Cs#
CE*
CE*
CE*"2rfPTUUUUr(   c                    t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd       |j	                  ddd       |j	                  ddd	       |j	                  ddd
       t        ||t        t              dk(  sJ y )Nr/   r0   r2   r3   r4   r   r5   r6   c-dzc-er   rF   r   r   s      r   
testGraph2zTestSimilarity.testGraph2  s    ^XXZ
Cs#
Cs#
Cs#
Cs#
Cs#
CE*
CE*
CE*
CE*"2rfPTUUUUr(   c                 r   t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd	       |j	                  ddd
       |j	                  ddd       |j	                  ddd       |j	                  ddd       |j	                  ddd       t        ||t        t              dk(  sJ y )Nr/   r0   r2   r3   r4   r   Fr   r   a-dr   zd-fzd-gze-br   rZ   r   r   s      r   
testGraph3zTestSimilarity.testGraph3  s
   ^XXZ
Cs#
Cs#
Cs#
Cs#
Cs#
Cs#
Cs#
CE*
CE*
CE*
CE*
CE*
CE*"2rfPTVVVVr(   c                    t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd       |j	                  ddd       |j	                  ddd       t        ||t        t        	      d
k(  sJ y )Nr/   r0   r2   r3   r4   r5   r6   r   r   rD   r   r   s      r   
testGraph4zTestSimilarity.testGraph4  r   r(   c                    t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd       |j	                  ddd       |j	                  ddd       t        ||t        t        	      d
k(  sJ y )Nr/   r0   r2   r3   r4   r5   r6   r   r   rD   r   r   s      r   testGraph4_azTestSimilarity.testGraph4_a  r   r(   c                    t               }t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j	                  ddd       |j	                  ddd       |j	                  ddd       t        ||t        t        	      d
k(  sJ y )Nr/   r0   r2   r3   r4   r5   r6   r   r   rI   r   r   s      r   testGraph4_bzTestSimilarity.testGraph4_b  r   r(   simrank_similarityc           
         t        j                  d      }ddddddddddddddddddddddddddddddd} ||      }|j                         D ]$  \  }}|t        j                  ||   d      k(  r$J  t        j
                         }|j                  d	d
       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  g d       ddddddddddddddddddddddddddddddd} ||d      }|j                         D ]$  \  }}|t        j                  ||   d      k(  r$J  y )Nr   rI   퓭I?~$oC?퓭I?r   rI   rD   r   rF   r   absr   Univr0   ProfArD   ProfBr   StudentArF   StudentBrJ   r   )rI   r   rD   rF   )rF   rD   )r   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)r   r   rj   r   approxr   r9   r   )rR   r   r   expectedactualkvs          r    test_simrank_no_source_no_targetz/TestSimilarity.test_simrank_no_source_no_target  s   NN1 %%%% &%%% &%%% &%%% &%%%;$
J $A&NN$ 	;DAqfQiT::::	;
 JJL	

1F
#	

1G
$	

1G
$	

1J
'	

1J
'	IJ !3@ST1!3@ST%%&& 3#61AST&&&%
( $A=NN$ 	;DAqfQiT::::	;r(   c                    t        j                  d      }dddddd} ||d      }|t        j                  |d	
      k(  sJ t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  g d       dddddd} ||dd      }|t        j                  |d	
      k(  sJ y )Nr   rI   r  r  r  r  r   r
   r   r  r  r0   r	  rD   r
  r   r  rF   r  r  r  r  r  r  r  r
   r   r   r   r  r   r9   r   rR   r   r   r  r  s        r   test_simrank_source_no_targetz,TestSimilarity.test_simrank_source_no_targetk  s    NN1!!!!
 $Aa06==T:::: JJL	

1F
#	

1G
$	

1G
$	

1J
'	

1J
'	IJS%7CDWX#AQG6==T::::r(   c                    t        j                  d      }t        j                  |t        t	        d                  }dddddd} ||d	      }|t        j                  |d
      k(  sJ t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  g d       t        t	        t        j                  |d      j                                     }t        j                  ||      }dddddd} ||dd      }|t        j                  |d
      k(  sJ y )Nr   abcderI   r  r  r  )abcdrt   r"  r  r   r  r   r  r0   r	  rD   r
  r   r  rF   r  r  r1   r  r  r  )r  r	  r
  r  r  r  r  )r   r   relabel_nodesdict	enumerater   r  r   r9   r   get_node_attributesvalues)rR   r   r   r  r  node_labelss         r   test_simrank_noninteger_nodesz,TestSimilarity.test_simrank_noninteger_nodes  sM   NN1QYw%7 89####
 $Ac26==T:::: JJL	

1F
#	

1G
$	

1G
$	

1J
'	

1J
'	IJ9R%;%;Aw%G%N%N%PQRQ, '+
 $AVL6==T::::r(   c                    t        j                  d      }d} ||dd      }|t        j                  |d      k(  sJ t        j                         }|j                  dd       |j                  dd	       |j                  d
d       |j                  dd       |j                  dd       |j                  g d       d} ||ddd
      }|t        j                  |d      k(  sJ y )Nr   rI   r   r
   targetr   r  r  r0   r	  rD   r
  r   r  rF   r  r  r  r  )r  r
   r/  gh㈵>r  r  s        r   test_simrank_source_and_targetz-TestSimilarity.test_simrank_source_and_target  s    NN1#Aa:6==T:::: JJL	

1F
#	

1G
$	

1G
$	

1J
'	

1J
'	IJ% $AQqQ6==T::::r(   algc                 |    t        j                  d      }t        j                  t         j                  ||d       y )Nr   r   )max_iterations)r   r   r   r   ExceededMaxIterations)rR   r1  r   s      r   test_simrank_max_iterationsz*TestSimilarity.test_simrank_max_iterations  s(    NN1b..QrJr(   c                     t        j                  d      }t        j                  t         j                  d      5  t        j
                  |d       d d d        y # 1 sw Y   y xY w)Nr   Source node 10 not in Gr   r   r  r   r   r   r   r   r   r   s     r   test_simrank_source_not_foundz,TestSimilarity.test_simrank_source_not_found  H    NN1]]2??2KL 	0!!!B/	0 	0 	0   AA%c                     t        j                  d      }t        j                  t         j                  d      5  t        j
                  |d       d d d        y # 1 sw Y   y xY w)Nr   zTarget node 10 not in Gr   r   )r/  r8  r   s     r   test_simrank_target_not_foundz,TestSimilarity.test_simrank_target_not_found  r:  r;  c                    t        j                  d      }dddddd}ddd	d	dd}t        j                  |d
      }|t        j                  |d      k(  sJ |t        j                  |d      k7  sJ |t        j                  |d      k(  sJ t         j
                  j                  |d
      }|t        j                  |d      k(  sJ |t        j                  |d      k7  sJ |t        j                  |d      k(  sJ y )Nr   rI   gLZ??gR9Y@?gR9Y@?r  r   IC?ΫcA?r   r  Hz>r  rM   gMbP?)r   r   r   r   r  
similarity_simrank_similarity_python)rR   r   expected_python_tol4expected_numpy_tol4r  s        r   test_simrank_between_versionsz,TestSimilarity.test_simrank_between_versions  s   NN1  !!  
 !  !
 &&q3"fmmF&EEEE#v}}V'FFFF#v}}V'FFFF99!A9F#v}}V'FFFF"fmmF&EEEE"fmmF&EEEEr(   c                     t        j                  d      }t        j                  g dg dg dg dg dg      }t         j                  j                  |      }t        j                  j                  ||d       y )	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   rA  atolr   r   r@   arrayrB  _simrank_similarity_numpytestingassert_allcloserR   r   r  r  s       r   &test_simrank_numpy_no_source_no_targetz5TestSimilarity.test_simrank_numpy_no_source_no_target  sl    NN188;$&
N 88;


""8V$"?r(   c                     t        j                  d      }t        j                  g d      }t         j                  j                  |d      }t        j                  j                  ||d       y )Nr   rH  r   r  rA  rI  rK  rP  s       r   #test_simrank_numpy_source_no_targetz2TestSimilarity.test_simrank_numpy_source_no_target  sW    NN188
 8818E


""8V$"?r(   c                     t        j                  d      }d}t         j                  j                  |dd      }t        j
                  j                  ||d       y )Nr   r   r   r.  rA  rI  )r   r   rB  rM  r@   rN  rO  rP  s       r   $test_simrank_numpy_source_and_targetz3TestSimilarity.test_simrank_numpy_source_and_target*  sI    NN1881Q8O


""8V$"?r(   c                 j   t         j                  j                  d       t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       ddddd	}t        j                  |dd
      }||k(  sJ y )N*   r   rI   rD   r   rF   r   g      ?)r   rD   rI   rF   )path_lengthr@   randomseedr   r8   r:   panther_similarityrR   r   r  sims       r   "test_panther_similarity_unweightedz1TestSimilarity.test_panther_similarity_unweighted0  s    
		rHHJ	

1a	

1a	

1a	

1a	

1assu5##Aqa8hr(   c                    t         j                  j                  d       t        j                         }|j                  ddd       |j                  ddd       |j                  ddd	       |j                  ddd
       |j                  ddd       ddddd}t        j                  |dd	d      }||k(  sJ y )NrW  v1v2r   )wv3rI   v4rD   r   v5g      ?r   g      ?)rd  re  rb  rf  rc  )rX  weightrY  r]  s       r    test_panther_similarity_weightedz/TestSimilarity.test_panther_similarity_weighted=  s    
		rHHJ	

4
#	

4
#	

4
#	

4
%	

4
#cDA##At3Ghr(   c                     t        j                         }|j                  g d       t        j                  t         j
                  d      5  t        j                  |d       d d d        y # 1 sw Y   y xY w)NrJ   r   )r   r   rH   r  r7  r   r   r  )r   r8   r   r   r   r   r\  r   s     r   (test_panther_similarity_source_not_foundz7TestSimilarity.test_panther_similarity_source_not_foundJ  sT    HHJ	AB]]2??2KL 	0!!!B/	0 	0 	0s   A..A7c                    t        j                         }|j                  t        d             t	        j
                  t         j                  d      5  t        j                  |d       d d d        y # 1 sw Y   y xY w)Nr   zAPanther similarity is not defined for the isolated source node 1.r   rI   r  )r   r8   add_nodes_fromranger   r   NetworkXUnfeasibler\  r   s     r    test_panther_similarity_isolatedz/TestSimilarity.test_panther_similarity_isolatedP  s^    HHJ	q"]]!!U
 	/ !!!A.		/ 	/ 	/s   A55A>	num_paths)rI   r   r   r
   rJ   c                    t        j                  g d      }i }t        j                  ||d|      }t        |      }t	        |      |k(  sJ t        fd|D              sJ t        |         t        t        |            k(  sJ y )Nrj  rD   )rX  	index_mapr
   c              3   .   K   | ]  }|d    k(    yw)r   Nr"   ).0r   r
   s     r   	<genexpr>zGTestSimilarity.test_generate_random_paths_with_start.<locals>.<genexpr>k  s     1a1Q46>1s   )r   r8   r   listr   allr   rn  )rR   rq  r
   r   rs  r   r   s     `    r   %test_generate_random_paths_with_startz4TestSimilarity.test_generate_random_paths_with_startY  s     HH=>	++
 X 5zY&&&151111 i'(Dy1A,BBBBr(   c                    i }d}d}t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       t        j                  ||||d      }g d	g d
g dg dg dg dg dg dg dg dg
}h dh dh dh dddhd}|t	        |      k(  sJ ||k(  sJ y )Nr   rD   r   rI   r   rF   rW  )rX  rs  r[  )r   r   r   )rF   rD   rI   )rD   rI   r   )rD   r   r   )r   r   rI   )rF   rD   r   )r   r   rD   )rD   rI   rD   >   r   rD   r   rF   r   rW   rX   rK   >   rI   rD   rF   r   rX   rG   >   rI   rD   r   rW   rX   rK   rG   >   r   r   rF   r   rK   rW   r  )r   r8   r:   r   rw  rR   rs  rq  rX  r   r   r   expected_maps           r   %test_generate_random_paths_unweightedz4TestSimilarity.test_generate_random_paths_unweightedp  s    		HHJ	

1a	

1a	

1a	

1a	

1a((ykYR
 
 (!$1v
 e,,,y(((r(   c                 0   t         j                  j                  d       i }d}d}t        j                         }|j                  ddd       |j                  ddd	       |j                  dd
d       |j                  ddd       |j                  ddd       |j                  dd
d       t        j                  ||||      }g dg dg dg dg dg dg dg dg dg dg
}h dh dh dh dh dh dd }|t        |      k(  sJ ||k(  sJ y )!NrW  r   rW   r"  r#  g333333?)rg  r$  r   r%  r   rt   gffffff?fg?g333333?)rX  rs  )r%  r$  r  r$  r%  r"  r#  )rt   r$  r  r$  r  r$  rt   )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#  r"  r#  )r  r$  r  r$  r  r$  rt   )r%  r"  r%  r"  r#  r"  r#  )rt   r$  r  r$  rt   r$  r%  >   r   rD   r   rF   r   rW   rK   rG   >   r   rI   rD   r   rX   rG   >   r   rI   rX   rG   >   r   rD   r   rF   r   rW   rK   >   rI   rX   rG   )r%  r$  r  r"  r#  rt   )r@   rZ  r[  r   r8   r:   r   rw  r{  s           r   #test_generate_random_paths_weightedz2TestSimilarity.test_generate_random_paths_weighted  s   
		r		HHJ	

3C
(	

3C
(	

3C
(	

3C
(	

3C
(	

3C
(((ykY

 0/////////
 *#&&
 e,,,y(((r(   c                    d\  }}t        j                         }|j                  ||f       |j                  ||fg       t        j                         }|j                  ||f       |j                  ||fg       ||fD ]>  }|D ]  }||j                  |   d<    |j
                  D ]  }||j
                  |   d<    @ d }t        j                  ||||      dk(  sJ t        j                  ||||      dk(  sJ y)zgG2 has edge (a,b) and G3 has edge (a,a) but node order for G2 is (a,b)
        while for G3 it is (b,a)r   rl   c                     | |k(  S r!   r"   )r   ys     r   
user_matchzETestSimilarity.test_symmetry_with_custom_matching.<locals>.user_match  s    6Mr(   r   rI   N)r   r8   rm  r   ri   rr   r   )	rR   r"  r#  r]   r^   r   rk   rt   r  s	            r   "test_symmetry_with_custom_matchingz1TestSimilarity.test_symmetry_with_custom_matching  s    1XXZ
1a&!
Aq6(#XXZ
1a&!
Aq6(#b 	'A '%&
6"'WW '%&
6"'	'	 ""2rjZX	
 ""2rjZX	
r(   N);__name__
__module____qualname__classmethodrB   rU   r_   rm   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
algorithmsrB  rC  simrank_algsr   markparametrizer  r  r,  r0  r5  r9  r=  rF  rQ  rS  rU  r_  rh  rk  rp  ry  r}  r  r  r"   r(   r   r=   r=   /   s   % %
P 04

#
J#
J1'YR0:0:0:00
	V	V	V
VVV
VVW$
V
V
V 	
  ;;L
 [[1<@K; AK;Z [[1<@; A;6 [[1<@"; A";H [[1<@; A;, [[UL1K 2K0
0
F<*@X@@0/ [[[*5[[Xv.C / 6C*")H')R
r(   r=   )r   networkxr   networkx.algorithms.similarityr   r   r   networkx.generators.classicr   r   r   r	   r  r  r   r&   r-   r;   r=   r"   r(   r   <module>r     s_      
  ;/ 0	i
 i
r(   