
    wg                     f    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 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_graphc                     | |k(  S N n1n2s     n/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_similarity.py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)nxGraphadd_nodeadd_edge)Gs    r   getCanonicalr(      s    

AJJs#JJJs#JJJs#JJJs#JJJsCuJ%JJsCuJ%JJsCuJ%Hr   c                      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, Z6d- Z7d. Z8d/ Z9y0)1TestSimilarityc                 X    t        j                  d      at        j                  d       y )Nnumpyscipy)pytestimportorskipnp)clss    r   setup_classzTestSimilarity.setup_class&   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 )N      )roots)r5         )	   r7   )r7   r9   )r9   r9      r5   r   r   r;      )r6   timeout-C6?)r>   )	r#   
star_graphcopyr.   raises
ValueErrorr   NodeNotFoundNetworkXError)selfG0G1s      r   *test_graph_edit_distance_roots_and_timeoutz9TestSimilarity.test_graph_edit_distance_roots_and_timeout,   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            r;   r=   )r#   r$   r   r   r	   r   rF   rG   rH   G2G3s        r   test_graph_edit_distancez'TestSimilarity.test_graph_edit_distance<   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 )
Nr4   r5   r   redbluecolorr;   c                     | d   |d   k(  S NrW   r   r   s     r   <lambda>zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>`       "W+G2L r   )
node_match)r   nodesitemsr   )rF   rH   rQ   nattrs        r   #test_graph_edit_distance_node_matchz2TestSimilarity.test_graph_edit_distance_node_matchV   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 )
NrK   r5   r   rU   rV   rW   r7   c                     | d   |d   k(  S rY   r   r   s     r   rZ   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>o   r[   r   )
edge_matchr   edgesr^   minr   )rF   rH   rQ   er`   s        r   #test_graph_edit_distance_edge_matchz2TestSimilarity.test_graph_edit_distance_edge_matche   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 )NrK   r5   r   rU   rV   rW   r;   c                     | d   |d   k(  ryy)NrW   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)NrW   rV      2   r   r`   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)NrW   rV   (   d   r   rs   s    r   node_ins_costzHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost   s    G}&r   )ro   rt   rx   )r   r]   r^   r   )rF   rH   rQ   r_   r`   ro   rt   rx   s           r   "test_graph_edit_distance_node_costz1TestSimilarity.test_graph_edit_distance_node_costt   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 )NrK   r5   r   rU   rV   rW   r7   c                     | d   |d   k(  ryy)NrW   {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)NrW   rV   皙?      ?r   rs   s    r   edge_del_costzHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_cost       G}&r   c                     | d   dk(  ryy)NrW   rV   g?      ?r   rs   s    r   edge_ins_costzHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost   r   r   )r   r   r   gq=
ףp?re   )rF   rH   rQ   rh   r`   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 )Nr5   rK   r4   )upper_bound      )r   r   rF   rH   rQ   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 )Nr7   r;   rK   c                 X    t        t        |             t        t        |d             fS )Nc                     d | v | fS r   r   )xs    r   rZ   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   r;   r;   r5   r5   )r<   r<   r:   r:   Nr   r5   )r   r:   r5   r;   )r<   r   r   Nr<   )r<   r;   r   r   )r   r:   r   Nr:   )r<   r:   r5   r   )r<   r:   r   r   )r   r   r   )r   r:   r<   r   )r   r   r   )r   r   r   )r   r   r   len)rF   rH   rQ   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 )Nr5   rK   i  r   )r   r   )rF   rH   rQ   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   r   )r   r   r   )r   r   r   r   r8   r4   r;   )r#   r$   add_edges_fromr   rP   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   r   r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   r   r   r=   r5   r8   )r#   DiGraphr   r   rP   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   rK   rL   r=   r;   r5   )r#   
MultiGraphr   r   rP   s        r   test_multigraphzTestSimilarity.test_multigraph6  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   r4   )r#   MultiDiGraphr   r   r   s      r   test_multidigraphz TestSimilarity.test_multidigraphS  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   r   r   r    r\   rd   r   )r#   r$   r%   r&   r   rA   r   r   rF   r'   s     r   testCopyzTestSimilarity.testCopyk  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#   r$   r%   r&   r   r   r   r   s      r   testSamezTestSimilarity.testSamet      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   r   r   r    badr   r;   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   r   r   r    Zr   r;   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   r   r   r    r   r   r;   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   r   r   r   r    a-cr   r;   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   r   r   r    r   r   r   r5   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   r   r   r   Er    r"   d-er   r7   r(   r#   r$   r%   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   r   r   r   r   r   r    r!   c-dzc-er   r8   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   r   r   r   r   r   Fr'   r   a-dr   zd-fzd-gze-br   rN   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   r   r   r   r   r    r!   r   r   r5   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   r   r   r   r   r    r!   r   r   r5   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   r   r   r   r   r    r!   r   r   r;   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 )Nr4   r;   퓭I?~$oC?퓭I?r   r;   r5   r7   r8   r|   absr   Univr   ProfAr5   ProfBr7   StudentAr8   StudentBr<   r   )r;   r7   r5   r8   )r8   r5   )r7   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)r#   r   r^   r.   approxr   r%   r   )rF   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 )Nr4   r;   r   r   r   r   r   sourcer|   r   r   r   r   r5   r   r7   r   r8   r  r  r  r  r  r  r  r  r#   r   r.   r	  r   r%   r   rF   r   r'   r
  r  s        r   test_simrank_source_no_targetz,TestSimilarity.test_simrank_source_no_targeta  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 )Nr4   abcder;   r   r   r   )abcdrh   r  r  r|   r   r   r   r   r   r5   r   r7   r   r8   r  r  r   r  r  r  )r   r   r   r   r  r  r  )r#   r   relabel_nodesdict	enumerater.   r	  r   r%   r   get_node_attributesvalues)rF   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 )Nr4   r;   r   r  targetr|   r   r   r   r   r5   r   r7   r   r8   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 )Nr4   rl   )max_iterations)r#   r   r.   rB   ExceededMaxIterations)rF   r'  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)Nr4   Source node 10 not in Gmatchrl   r  r#   r   r.   rB   rD   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)Nr4   zTarget node 10 not in Gr.  rl   )r%  r0  r   s     r   test_simrank_target_not_foundz,TestSimilarity.test_simrank_target_not_found  r2  r3  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 )Nr4   r;   gLZ??gR9Y@?gR9Y@?r   r   IC?ΫcA?r   r  Hz>r   r?   gMbP?)r#   r   r   r.   r	  
similarity_simrank_similarity_python)rF   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 )	Nr4   r   r7  r8  r8  r7  )r7  r   r7  r8  r8  )r8  r7  r   r7  r8  )r8  r8  r7  r   r7  )r7  r8  r8  r7  r   r9  atolr#   r   r0   arrayr:  _simrank_similarity_numpytestingassert_allcloserF   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 )Nr4   r@  r   r  r9  rA  rC  rH  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 )Nr4   r   r   r$  r9  rA  )r#   r   r:  rE  r0   rF  rG  rH  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   r;   r5   r7   r8   r   g      ?)r7   r5   r;   r8   )path_lengthr0   randomseedr#   r$   r&   panther_similarityrF   r'   r
  sims       r   "test_panther_similarity_unweightedz1TestSimilarity.test_panther_similarity_unweighted&  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 )NrO  v1v2r4   )wv3r;   v4r5   r}   v5g      ?r   g      ?)r\  r]  rZ  r^  r[  )rP  weightrQ  rU  s       r    test_panther_similarity_weightedz/TestSimilarity.test_panther_similarity_weighted3  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)r<   r   )r   r7   r:   r  r-  r.  rl   r  )r#   r$   r   r.   rB   rD   rT  r   s     r   (test_panther_similarity_source_not_foundz7TestSimilarity.test_panther_similarity_source_not_found@  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)Nr4   zAPanther similarity is not defined for the isolated source node 1.r.  r;   r  )r#   r$   add_nodes_fromranger.   rB   NetworkXUnfeasiblerT  r   s     r    test_panther_similarity_isolatedz/TestSimilarity.test_panther_similarity_isolatedF  s^    HHJ	q"]]!!U
 	/ !!!A.		/ 	/ 	/s   A55A>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 )Nrl   r5   r   r;   r7   r8   rO  )rP  	index_maprS  )r7   r   r7   )r8   r5   r;   )r5   r;   r   )r5   r   r7   )r7   r   r;   )r8   r5   r   )r7   r   r5   )r5   r;   r5   >   r   r5   r7   r8   r4   rK   rL   r=   >   r;   r5   r8   r4   rL   r9   >   r;   r5   r7   rK   rL   r=   r9   >   r   r7   r8   r4   r=   rK   r   )r#   r$   r&   generate_random_pathslistrF   ri  	num_pathsrP  r'   r   r   expected_maps           r   %test_generate_random_paths_unweightedz4TestSimilarity.test_generate_random_paths_unweightedO  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 )!NrO  rl   rK   r  r  g333333?)r_  r  r   r  r}   rh   gffffff?fg?g333333?)rP  ri  )r  r  rq  r  r  r  r  )rh   r  rq  r  rq  r  rh   )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  )rq  r  rq  r  rq  r  rh   )r  r  r  r  r  r  r  )rh   r  rq  r  rh   r  r  >   r   r5   r7   r8   r4   rK   r=   r9   >   r   r;   r5   r4   rL   r9   >   r   r;   rL   r9   >   r   r5   r7   r8   r4   rK   r=   >   r;   rL   r9   )r  r  rq  r  r  rh   )r0   rR  rS  r#   r$   r&   rj  rk  rl  s           r   #test_generate_random_paths_weightedz2TestSimilarity.test_generate_random_paths_weighteds  s   
		r		HHJ	

3C
(	

3C
(	

3C
(	

3C
(	

3C
(	

3C
(((ykY

 0/////////
 *#&&
 e,,,y(((r   c                 Z   t        d       t        d       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        d       t        j                  ||||      dk(  sJ t        d	       t        j                  ||||      dk(  sJ y )
Nz%G2 is edge (a,b) and G3 is edge (a,a)z7but node order for G2 is (a,b) while for G3 it is (b,a)r   r`   c                     | |k(  S r   r   )r   ys     r   rZ   zCTestSimilarity.test_symmetry_with_custom_matching.<locals>.<lambda>  s
    Q!V r   z!Starting G2 to G3 GED calculationr   r;   z!Starting G3 to G2 GED calculation)printr#   r$   rd  r   r]   rf   r   )	rF   r  r  rQ   rR   r'   r_   rh   r/  s	            r   "test_symmetry_with_custom_matchingz1TestSimilarity.test_symmetry_with_custom_matching  s1   56GH1XXZ
1a&!
Aq6(#XXZ
1a&!
Aq6(#b 	'A '%&
6"'WW '%&
6"'	'
 $12%%b"5QUVVVV12%%b"5QUVVVVr   N):__name__
__module____qualname__classmethodr2   rI   rS   ra   ri   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r   
algorithmsr:  r;  simrank_algsr.   markparametrizer  r  r"  r&  r+  r1  r5  r>  rI  rK  rM  rW  r`  rb  rg  ro  rr  rw  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/")H')RWr   r*   )r.   networkxr#   networkx.algorithms.similarityr   r   r   networkx.generators.classicr   r   r   r	   r   r   r(   r*   r   r   r   <module>r     s<      
 	MW MWr   