
    Pi                          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                            dd          d             Ze j                            d          d             Zd	 Zd
 Zd Z G d d          ZdS )    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            d S # 1 swxY w Y   d S )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      }/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/networkx/algorithms/tests/test_similarity.py*test_generate_random_paths_source_not_in_Gr      s    
   
!A'qHHHH	r.F	G	G	G  X                 s    A==BBzignore::RuntimeWarningc            	         t          j        d           t          j                    } |                     g d           |                     dd           t          t          j        | dddd                    }t          |          dk    sJ t          d |D                       sJ t          d	 |D                       sJ t          j        | dddd          }t          j
        t          d
          5  t          |           d d d            n# 1 swxY w Y   t          j        | ddd          }t          j
        t          d
          5  t          |           d d d            d S # 1 swxY w Y   d S )Nr   )r         r   r!   r"   *   )path_lengthr
   seedc              3   <   K   | ]}t          |          d k    V  dS )r   N)len.0paths     r   	<genexpr>zAtest_generate_random_paths_with_isolated_nodes.<locals>.<genexpr>%   s,      00$s4yyA~000000    c              3   .   K   | ]}|d          d k    V  dS r   N r(   s     r   r+   zAtest_generate_random_paths_with_isolated_nodes.<locals>.<genexpr>&   s*      ..tAw!|......r,   zprobabilities contain NaNr   r$   r%   )r   r   r   Graphadd_nodes_fromadd_edgelistr   r'   allr   
ValueError)r   pathsr   s      r   .test_generate_random_paths_with_isolated_nodesr8      s   
   


AYYYJJq! )!QAabQQQRREu::????00%00000000.......... '1!ABOOOH	z)D	E	E	E  X               '1!"EEEH	z)D	E	E	E  X                 s$   :DDDE11E58E5c                     | |k    S Nr/   n1n2s     r   nmatchr>   3       8Or,   c                     | |k    S r:   r/   e1e2s     r   ematchrD   7   r?   r,   c                  t   t          j                    } |                     dd           |                     dd           |                     dd           |                     dd           |                     ddd           |                     ddd           |                     ddd           | S )	NAlabelBCDa-bb-cb-d)r   r1   add_noder3   )r   s    r   getCanonicalrP   ;   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j!        j"        j#        gZ$e%j&        '                    de$          d             Z(e%j&        '                    de$          d             Z)e%j&        '                    de$          d             Z*e%j&        '                    de$          d              Z+e%j&        '                    d!e$          d"             Z,d# Z-d$ Z.d% Z/d& Z0d' Z1d( Z2d) Z3d* Z4d+ Z5d, Z6e%j&        '                    d-d.          e%j&        '                    d/d0          d1                         Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZDd? ZEd@ ZFdA ZGdB ZHdC ZIdDS )ETestSimilarityc                 V    t          j        d          at          j        d           d S )Nr   scipy)r   r   np)clss    r   setup_classzTestSimilarity.setup_classH   s+      ))G$$$$$r,   c                    t          j        d          }|                                }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	           d S )Nr   r"   )roots)r"   r      )	   r   )r   r[   )r[   r[   r!   r"   r   r   r!      )rY   timeout-C6?)r_   )	r   
star_graphcopyr   r   r6   r   r   NetworkXError)selfG0G1s      r   *test_graph_edit_distance_roots_and_timeoutz9TestSimilarity.test_graph_edit_distance_roots_and_timeoutN   s|   ]1WWYYj"5r2aSIIIIj"5r2YYYOOOObo':B&QQQQbo':B&QQQQbo':B&QQQQ"2r888A===="2r888A===="2rCCCqHHHH"2rCCCqHHHH"2rHHHPPPb&(;RQOOOOOOr,   c                 F   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 d S )	N      r            r!   r^   )r   r1   r   r   r	   r   rd   re   rf   G2G3s        r   test_graph_edit_distancez'TestSimilarity.test_graph_edit_distance^   s   XZZ]]^^^^"2r**a////"2r**b0000"2r**b0000"2r**b0000"2r**b0000"2r**b0000"2r**b0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                                        D ]\  }}|dz  dk    rdnd|d<   |j                                        D ]\  }}|dz  dk    rdnd|d<   t          ||          dk    sJ t          ||d 	          dk    sJ d S )
Nr   r"   r   redbluecolorr!   c                 &    | d         |d         k    S Nru   r/   r;   s     r   <lambda>zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>       "W+G2L r,   )
node_match)r   nodesitemsr   )rd   rf   ro   nattrs        r   #test_graph_edit_distance_node_matchz2TestSimilarity.test_graph_edit_distance_node_matchx   s    ^^^^x~~'' 	< 	<GAt%&UaZZEEVDMMx~~'' 	< 	<GAt%&UaZZEEVDMM"2r**a////B#L#L        r,   c                    t          d          }t          d          }|j                                        D ]"\  }}t          |          dz  dk    rdnd|d<   #|j                                        D ]"\  }}t          |          dz  dk    rdnd|d<   #t	          ||          dk    sJ t	          ||d 	          dk    sJ d S )
Nri   r"   r   rs   rt   ru   r   c                 &    | d         |d         k    S rw   r/   rA   s     r   rx   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>   ry   r,   )
edge_matchr   edgesr|   minr   )rd   rf   ro   er~   s        r   #test_graph_edit_distance_edge_matchz2TestSimilarity.test_graph_edit_distance_edge_match   s    ]]]]x~~'' 	A 	AGAt%(VVaZ1__EE&DMMx~~'' 	B 	BGAt%(VVq[A%5%5EE6DMM"2r**a////B#L#L        r,   c                 D   t          d          }t          d          }|j                                        D ]\  }}|dz  dk    rdnd|d<   |j                                        D ]\  }}|dz  dk    rdnd|d<   d }d	 }d
 }t          |||||          dk    sJ d S )Nri   r"   r   rs   rt   ru   r!   c                 .    | d         |d         k    rdS dS )Nru   r!   r   r/   )uattrvattrs     r   node_subst_costzJTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_subst_cost   s    W~w//qrr,   c                 "    | d         dk    rdS dS )Nru   rt      2   r/   r~   s    r   node_del_costzHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_del_cost   s    G}&&rrr,   c                 "    | d         dk    rdS dS )Nru   rt   (   d   r/   r   s    r   node_ins_costzHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost   s    G}&&rsr,   )r   r   r   )r   r{   r|   r   )rd   rf   ro   r}   r~   r   r   r   s           r   "test_graph_edit_distance_node_costz1TestSimilarity.test_graph_edit_distance_node_cost   s    ]]]]x~~'' 	< 	<GAt%&UaZZEEVDMMx~~'' 	< 	<GAt%&UaZZEEVDMM	 	 		 	 		 	 	   /++        r,   c                 x   t          d          }t          d          }|j                                        D ]"\  }}t          |          dz  dk    rdnd|d<   #|j                                        D ]"\  }}t          |          dz  dk    rdnd|d<   #d }d	 }d
 }t	          |||||          dk    sJ d S )Nri   r"   r   rs   rt   ru   r   c                 .    | d         |d         k    rdS dS )Nru   {Gz?皙?r/   )gattrhattrs     r   edge_subst_costzJTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_subst_cost   s    W~w//tsr,   c                 "    | d         dk    rdS dS )Nru   rt   皙?      ?r/   r   s    r   edge_del_costzHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_cost       G}&&ssr,   c                 "    | d         dk    rdS dS )Nru   rt   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?r   )rd   rf   ro   r   r~   r   r   r   s           r   "test_graph_edit_distance_edge_costz1TestSimilarity.test_graph_edit_distance_edge_cost   s   ]]]]x~~'' 	A 	AGAt%(VVaZ1__EE&DMMx~~'' 	B 	BGAt%(VVq[A%5%5EE6DMM	 	 		 	 		 	 	   /++        r,   c                     t          d          }t          d          }t          ||d          J t          ||d          dk    sJ t          ||          dk    sJ d S )Nr"   ri   r   )upper_bound      )r   r   rd   rf   ro   s      r   $test_graph_edit_distance_upper_boundz3TestSimilarity.test_graph_edit_distance_upper_bound   sx    "1%%"1%%"2rq999AAA"2rr:::b@@@@"2r**b000000r,   c                 B   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}fd|D             fd|D             k    sJ d S )Nr   r!   ri   c                 x    t          t          |                     t          t          |d                     fS )Nc                     d | v | fS r:   r/   )xs    r   rx   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,DEEEFF r,   )r   r   r!   r!   r"   r"   )r]   r]   r\   r\   Nr   r"   )r   r\   r"   r!   )r]   r   r   Nr]   )r]   r!   r   r   )r   r\   r   Nr\   )r]   r\   r"   r   )r]   r\   r   r   )r   r   r   )r   r\   r]   r   )r   r   r   )r   r   r   c                     h | ]} | S r/   r/   r)   pr   s     r   	<setcomp>z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>  s    ---!		1---r,   c                     h | ]} | S r/   r/   r   s     r   r   z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>  s    1X1X1XA))Q-1X1X1Xr,   )r   r   r   r'   )rd   rf   ro   r7   costexpected_pathsr   s         @r   test_optimal_edit_pathsz&TestSimilarity.test_optimal_edit_paths   s:   ]]^^(R00tqyyyy5zzQ	 	 	 )((DDD
 )((DDD
 )((DDD
 )((DDD
 )((DDD
 )((DDD+
4 .---u---1X1X1X1X1X1X1XXXXXXXr,   c                     t          d          }t          d          }d}t          ||          D ]}||k     sJ |}|dk    sJ d S )Nr"   ri   i  r   )r   r   )rd   rf   ro   bestcostr   s        r   !test_optimize_graph_edit_distancez0TestSimilarity.test_optimize_graph_edit_distance  s_    "1%%"1%%0R88 	 	D(????HH2~~~~~~r,   c                    t          j                    }t          j                    }|                    d           t          j                    }|                    d           t          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 d S )N)rF   rF   rF   rI   )r   rI   rI   )r   r   r   r   rZ   r   r!   )r   r1   add_edges_fromr   rn   s        r   test_selfloopszTestSimilarity.test_selfloops  s#   XZZXZZ
2333XZZ
2333XZZ
>???"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                    }|                    d           t          j                    }|                    d           t          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 d S )N)r   rI   rJ   rJ   rK   )rK   rF   )r   r   r   rF   rK   )r   rF   rJ   )rI   rK   r   r   r^   r"   rZ   )r   DiGraphr   r   rn   s        r   test_digraphzTestSimilarity.test_digraph;  s#   Z\\Z\\
JKKKZ\\
JKKKZ\\
JKK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                    }|                    d           t          j                    }|                    d           t          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 d S )
N)r   r   r   )r   r   r   r   )r   r   r   r   r   r   ri   rj   r^   r!   r"   )r   
MultiGraphr   r   rn   s        r   test_multigraphzTestSimilarity.test_multigraphX  s#   ]__]__
>???]__
JKKK]__
VWW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                    }|                    d           t          j                    }|                    d           t          ||          dk    sJ t          ||          dk    sJ d S )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_multidigraphu  s    _
	
 	
 	
 _
	
 	
 	
 #2r**a////"2r**a//////r,   c                 "   t          j                    }|                    dd           |                    dd           |                    ddd           t	          ||                                t          t                    dk    sJ d S NrF   rG   rI   rL   rz   r   r   )r   r1   rO   r3   r   rb   r>   rD   rd   r   s     r   testCopyzTestSimilarity.testCopy  s    HJJ	

3c
"""	

3c
"""	

35
)))166886RRRVWWWWWWWr,   c                    t          j                    }|                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    ddd           t	          ||t
          t                    dk    sJ d S r   r   r1   rO   r3   r   r>   rD   r   s      r   testSamezTestSimilarity.testSame      XZZ
Cs###
Cs###
CE***XZZ
Cs###
Cs###
CE***"2rfPPPTUUUUUUUr,   c                    t          j                    }|                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    ddd           t	          ||t
          t                    dk    sJ d S )NrF   rG   rI   rL   badr   r!   r   r   s      r   testOneEdgeLabelDiffz#TestSimilarity.testOneEdgeLabelDiff  r   r,   c                    t          j                    }|                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    ddd           t	          ||t
          t                    dk    sJ d S )NrF   rG   rI   rL   Zr   r!   r   r   s      r   testOneNodeLabelDiffz#TestSimilarity.testOneNodeLabelDiff  r   r,   c                    t          j                    }|                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    ddd           |                    dd           t	          ||t
          t                    dk    sJ d S )NrF   rG   rI   rL   rJ   r   r!   r   r   s      r   testOneExtraNodezTestSimilarity.testOneExtraNode  s    XZZ
Cs###
Cs###
CE***XZZ
Cs###
Cs###
CE***
Cs###"2rfPPPTUUUUUUUr,   c                 j   t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           t	          ||t
          t                    dk    sJ d S )	NrF   rG   rI   rJ   rL   a-cr   r!   r   r   s      r   testOneExtraEdgezTestSimilarity.testOneExtraEdge  s#   XZZ
Cs###
Cs###
Cs###
Cs###
CE***XZZ
Cs###
Cs###
Cs###
CE***
CE***"2rfPPPTUUUUUUUr,   c                    t          j                    }|                    dd           |                    dd           |                    ddd           t          j                    }|                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           t	          ||t
          t                    dk    sJ d S )	NrF   rG   rI   rL   rJ   r   r   r"   r   r   s      r   testOneExtraNodeAndEdgez&TestSimilarity.testOneExtraNodeAndEdge  s    XZZ
Cs###
Cs###
CE***XZZ
Cs###
Cs###
Cs###
CE***
CE***"2rfPPPTUUUUUUUr,   c                    t                      }t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           |                    ddd           t          ||t          t          	          d
k    sJ d S )NrF   rG   rI   rK   ErL   rN   d-er   r   rP   r   r1   rO   r3   r   r>   rD   r   s      r   
testGraph1zTestSimilarity.testGraph1      ^^XZZ
Cs###
Cs###
Cs###
Cs###
CE***
CE***
CE***"2rfPPPTUUUUUUUr,   c                 4   t                      }t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           |                    ddd	           |                    ddd
           t          ||t          t                    dk    sJ d S )NrF   rG   rI   rJ   rK   r  rL   rM   c-dzc-er   rZ   r  r   s      r   
testGraph2zTestSimilarity.testGraph2  s   ^^XZZ
Cs###
Cs###
Cs###
Cs###
Cs###
CE***
CE***
CE***
CE***"2rfPPPTUUUUUUUr,   c                    t                      }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           t          ||t          t                    dk    sJ d S )NrF   rG   rI   rJ   rK   r  Fr   r   a-dr  zd-fzd-gze-br   rl   r  r   s      r   
testGraph3zTestSimilarity.testGraph3  si   ^^XZZ
Cs###
Cs###
Cs###
Cs###
Cs###
Cs###
Cs###
CE***
CE***
CE***
CE***
CE***
CE***"2rfPPPTVVVVVVVr,   c                    t                      }t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           |                    ddd           t          ||t          t          	          d
k    sJ d S )NrF   rG   rI   rJ   rK   rL   rM   r	  r   r"   r  r   s      r   
testGraph4zTestSimilarity.testGraph4  r  r,   c                    t                      }t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           |                    ddd           t          ||t          t          	          d
k    sJ d S )NrF   rG   rI   rJ   rK   rL   rM   r  r   r"   r  r   s      r   testGraph4_azTestSimilarity.testGraph4_a  r  r,   c                    t                      }t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    ddd           |                    ddd           |                    ddd           t          ||t          t          	          d
k    sJ d S )NrF   rG   rI   rJ   rK   rL   rM   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} ||          }|                                D ]'\  }}|t          j        ||         d          k    sJ (t          j                    }|                    d	d
           |                    dd           |                    dd           |                    dd           |                    dd           |                    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          }|                                D ]'\  }}|t          j        ||         d          k    sJ (d S )Nr   r!   퓭I?~$oC?퓭I?r   r!   r"   r   rZ   r   absr   UnivrG   ProfAr"   ProfBr   StudentArZ   StudentBr]   r   )r!   r   r"   rZ   )rZ   r"   )r   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)r   r   r|   r   approxr   rO   r   )rd   r  r   expectedactualkvs          r    test_simrank_no_source_no_targetz/TestSimilarity.test_simrank_no_source_no_target5  sq   N1 %%%%  &%%%  &%%%  &%%%  &%%% ;$
 $
J $#A&&NN$$ 	; 	;DAqfQiT:::::::: JLL	

1F
###	

1G
$$$	

1G
$$$	

1J
'''	

1J
'''	IIIJJJ !3@STT1!3@STT%%&&  3#61AST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                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           |                    g d           dddddd} ||dd          }|t          j        |d	
          k    sJ d S )Nr   r!   r  r  r  r  r   r
   r   r  r  rG   r  r"   r  r   r   rZ   r!  r"  r$  r%  r&  r'  r(  r
   r   r   r   r)  r   rO   r   rd   r  r   r*  r+  s        r   test_simrank_source_no_targetz,TestSimilarity.test_simrank_source_no_target  sK   N1!!!!
 
 $#Aa0006=T::::::: JLL	

1F
###	

1G
$$$	

1G
$$$	

1J
'''	

1J
'''	IIIJJJS%7CDWXX##AQGGG6=T:::::::::r,   c                 8   t          j        d          }t          j        |t          t	          d                              }dddddd} ||d	          }|t          j        |d
          k    sJ t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           |	                    g d           t          t	          t          j
        |d                                                              }t          j        ||          }dddddd} ||dd          }|t          j        |d
          k    sJ d S )Nr   abcder!   r  r  r  )abcdr   r7  r0  r   r  r   r  rG   r  r"   r  r   r   rZ   r!  r"  rH   r$  r%  r&  )r  r  r  r   r!  r'  r1  )r   r   relabel_nodesdict	enumerater   r)  r   rO   r   get_node_attributesvalues)rd   r  r   r*  r+  node_labelss         r   test_simrank_noninteger_nodesz,TestSimilarity.test_simrank_noninteger_nodes  s   N1QYw%7%7 8 899####
 
 $#Ac2226=T::::::: JLL	

1F
###	

1G
$$$	

1G
$$$	

1J
'''	

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

1F
###	

1G
$$$	

1G
$$$	

1J
'''	

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

""8V$"?????r,   c                     t          j        d          }t                              g d          }t           j                            |d          }t          j                            ||d           d S )Nr   r]  r   r0  rV  r^  r`  re  s       r   #test_simrank_numpy_source_no_targetz2TestSimilarity.test_simrank_numpy_source_no_target4  sr    N188  
 
 8818EE

""8V$"?????r,   c                     t          j        d          }d}t           j                            |dd          }t          j                            ||d           d S )Nr   r   r   rC  rV  r^  )r   r   rW  rb  rU   rc  rd  re  s       r   $test_simrank_numpy_source_and_targetz3TestSimilarity.test_simrank_numpy_source_and_targetB  sU    N1881Q8OO

""8V$"?????r,   c                 V   t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           ddddd}t          j        |ddd	
          }||k    sJ d S )Nr   r!   r"   r   rZ   r   g      ?)r   r"   r!   rZ   r#   r0   r   r1   r3   panther_similarityrd   r   r*  sims       r   "test_panther_similarity_unweightedz1TestSimilarity.test_panther_similarity_unweightedH  s    HJJ	

1a	

1a	

1a	

1a	

1assu55#AqabAAAhr,   c                 l   t          j                    }|                    ddd           |                    ddd           |                    ddd           |                    ddd	           |                    dd
d           ddddd}t          j        |dddd          }||k    sJ d S )Nv1v2r   )wv3r!   v4r"   r   v5g      ?r   g      ?)ru  rv  rs  rw  rt  r#   )r$   weightr%   rl  rn  s       r    test_panther_similarity_weightedz/TestSimilarity.test_panther_similarity_weightedS  s    HJJ	

4
###	

4
###	

4
###	

4
%%%	

4
###cDAA#At3RPPPhr,   c                     t          j                    }|                    g d           t          j        t           j        d          5  t          j        |d           d d d            d S # 1 swxY w Y   d S )Nr]   r   )r   r   r\   r#  rL  r   r   r0  )r   r1   r   r   r   r   rm  r   s     r   (test_panther_similarity_source_not_foundz7TestSimilarity.test_panther_similarity_source_not_found^  s    HJJ	AAABBB]2?2KLLL 	0 	0!!B////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   A//A36A3c                    t          j                    }|                    t          d                     t	          j        t           j        d          5  t          j        |d           d d d            d S # 1 swxY w Y   d S )Nr   zAPanther similarity is not defined for the isolated source node 1.r   r!   r0  )r   r1   r2   ranger   r   NetworkXUnfeasiblerm  r   s     r    test_panther_similarity_isolatedz/TestSimilarity.test_panther_similarity_isolatedd  s    HJJ	q"""]!U
 
 
 	/ 	/ !!A....		/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   A::A>A>	num_paths)r!   r   r   r
   r]   c                 V   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 d S )Nr{  r"   )r$   	index_mapr
   c              3   0   K   | ]}|d          k    V  dS r.   r/   )r)   r   r
   s     r   r+   zGTestSimilarity.test_generate_random_paths_with_start.<locals>.<genexpr>  s+      11a1Q46>111111r,   )r   r1   r   r4   r'   r5   r   r~  )rd   r  r
   r   r  r   r7   s     `    r   %test_generate_random_paths_with_startz4TestSimilarity.test_generate_random_paths_with_startm  s     H===>>	+
 
 
 X 5zzY&&&&1111511111111 i'((Dy1A1A,B,BBBBBBBr,   c                    i }d}d}t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    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 d S )Nr   r"   r   r!   r   rZ   r#   r$   r  r%   )r   r   r   )rZ   r"   r!   )r"   r!   r   )r"   r   r   )r   r   r!   )rZ   r"   r   )r   r   r"   )r"   r!   r"   >   r   r"   r   rZ   r   ri   rj   r^   >   r!   r"   rZ   r   rj   r[   >   r!   r"   r   ri   rj   r^   r[   >   r   r   rZ   r   r^   ri   r  r   r1   r3   r   r4   rd   r  r  r$   r   r7   r   expected_maps           r   %test_generate_random_paths_unweightedz4TestSimilarity.test_generate_random_paths_unweighted  sX   		HJJ	

1a	

1a	

1a	

1a	

1a(ykYR
 
 
 IIIIIIIIIIIIIIIIIIII
 (''!!!$$$1v
 
 e,,,,y((((((r,   c                 .   i }d}d}t          j                    }|                    ddd           |                    ddd           |                    dd	d
           |                    ddd           |                    ddd           |                    d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h dh dd }|t	          |          k    sJ ||k    sJ d S )!Nr   ri   r7  r8  g333333?rx  r9  r   r:  r   r   gffffff?fg?g333333?r#   r  )r:  r9  r  r9  r:  r7  r8  )r   r9  r  r9  r  r9  r   )r:  r7  r8  r7  r8  r7  r9  )r8  r7  r:  r7  r8  r7  r8  )r:  r7  r8  r7  r8  r7  r:  )r:  r7  r8  r7  r8  r7  r8  )r  r9  r  r9  r  r9  r   )r:  r7  r:  r7  r8  r7  r8  )r   r9  r  r9  r   r9  r:  >   r   r"   r   rZ   r   ri   r^   r[   >   r   r!   r"   r   rj   r[   >   r   r!   rj   r[   >   r   r"   r   rZ   r   ri   r^   >   r!   rj   r[   )r:  r9  r  r7  r8  r   r  r  s           r   #test_generate_random_paths_weightedz2TestSimilarity.test_generate_random_paths_weighted  s   		HJJ	

3C
(((	

3C
(((	

3C
(((	

3C
(((	

3C
(((	

3C
((((ykYR
 
 

 0/////////////////////////////
 *))###&&&&&&
 
 e,,,,y((((((r,   c                     t          j        dg          }t          j                    }t          j        ||          dk    sJ d S )Nr   r"   r   r   r   r   s      r   &test_one_node_one_loop_and_empty_graphz5TestSimilarity.test_one_node_one_loop_and_empty_graph  sB    Z!!Z\\%b"--222222r,   c                     t          j        ddg          }t          j        |t          j                              dk    sJ t          j        |t          j                              dk    sJ d S )Nr   r   )r   r   r   r   )rd   rf   s     r   'test_one_node_two_loops_and_empty_graphz6TestSimilarity.test_one_node_two_loops_and_empty_graph  sf    _ff-..%b"*,,771<<<<%b"/*;*;<<AAAAAAr,   c                     t          j        ddg          }t          j        |t          j                              dk    sJ d S )Nr   r   rZ   r  r   s     r   test_two_directed_loopsz&TestSimilarity.test_two_directed_loops  s@    J'((%a66!;;;;;;r,   c                    d\  }}t          j                    }|                    ||f           |                    ||fg           t          j                    }|                    ||f           |                    ||fg           ||fD ]1}|D ]}||j        |         d<   |j        D ]}||j        |         d<   2d }t          j        ||||          dk    sJ t          j        ||||          dk    sJ dS )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   r~   c                     | |k    S r:   r/   )r   ys     r   
user_matchzETestSimilarity.test_symmetry_with_custom_matching.<locals>.user_match  s    6Mr,   r   r!   N)r   r1   r2   r   r{   r   r   )	rd   r7  r8  ro   rp   r   r}   r   r  s	            r   "test_symmetry_with_custom_matchingz1TestSimilarity.test_symmetry_with_custom_matching  s^    1XZZ
1a&!!!
Aq6(###XZZ
1a&!!!
Aq6(###b 	' 	'A ' '%&
6""W ' '%&
6""'	 	 	 "2rjZXXX    "2rjZXXX     r,   c                    t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           t          j        |ddddd          }t	          |          dk    sJ d|vsJ t          d |D                       sJ t          d	 |                                D                       sJ d
S )z2Basic test for panther_vector_similarity function.r   r!   r"   r   rZ   r#   rK   r,  r$   r%   c              3      K   | ]}|d v V  	dS )r!   r"   r   rZ   Nr/   r)   nodes     r   r+   zFTestSimilarity.test_panther_vector_similarity_basic.<locals>.<genexpr>  s'      88D4<'888888r,   c              3   6   K   | ]}d |cxk    odk    nc V  dS r   r!   Nr/   r)   scores     r   r+   zFTestSimilarity.test_panther_vector_similarity_basic.<locals>.<genexpr>  6      ==u1????????======r,   Nr   r1   r3   panther_vector_similarityr'   r5   r?  rd   r   ro  s      r   $test_panther_vector_similarity_basicz3TestSimilarity.test_panther_vector_similarity_basic  s   HJJ	

1a	

1a	

1a	

1a	

1a*1a1qrRRR3xx!||||||||88C88888888==

==========r,   c                    t          j                    }|                    dd           |                    dd           |                    dd           |                    dd           |                    dd           t          j        |ddddd          t	                    dk    sJ dvsJ t          fdd	D                       sJ t          d
                                 D                       sJ dS )z5Test panther_vector_similarity with unweighted graph.r   r!   r"   r   rZ   r#   r  c              3       K   | ]}|v V  	d S r:   r/   r)   r  ro  s     r   r+   zKTestSimilarity.test_panther_vector_similarity_unweighted.<locals>.<genexpr>  s'      88443;888888r,   r  c              3   6   K   | ]}d |cxk    odk    nc V  dS r  r/   r  s     r   r+   zKTestSimilarity.test_panther_vector_similarity_unweighted.<locals>.<genexpr>  r  r,   Nr  r  s     @r   )test_panther_vector_similarity_unweightedz8TestSimilarity.test_panther_vector_similarity_unweighted
  s	   HJJ	

1a	

1a	

1a	

1a	

1a*1a1qrRRR3xx1}}}}||||8888<88888888==

==========r,   c           	         t          j                    }|                    ddd           |                    ddd           |                    ddd           |                    ddd	           |                    dd
d           t          j        |dddddd          t	                    dk    sJ dvsJ t          d                                 D                       sJ t          fddD                       sJ dS )z3Test panther_vector_similarity with weighted graph.rr  rs  r   r  ru  r!   rv  r"   r   rw  r   rZ   rx  r#   )rK   r,  r$   rx  r%   c              3   6   K   | ]}d |cxk    odk    nc V  dS r  r/   r  s     r   r+   zITestSimilarity.test_panther_vector_similarity_weighted.<locals>.<genexpr>)  r  r,   c              3       K   | ]}|v V  	d S r:   r/   r  s     r   r+   zITestSimilarity.test_panther_vector_similarity_weighted.<locals>.<genexpr>*  s'      >>443;>>>>>>r,   )rs  ru  rv  Nr  r  s     @r   'test_panther_vector_similarity_weightedz6TestSimilarity.test_panther_vector_similarity_weighted  s)   HJJ	

4a
(((	

4a
(((	

4a
(((	

4c
***	

4a
(((*tqA1XB
 
 
 3xx1}}}}3==

========>>>>+=>>>>>>>>>>r,   c                     t          j                    }|                    g d           t          j        t           j                  5  t          j        |d           ddd           dS # 1 swxY w Y   dS )z=Test panther_vector_similarity with non-existent source node.r{  r   r0  N)r   r1   r   r   r   r   r  r   s     r   /test_panther_vector_similarity_source_not_foundz>TestSimilarity.test_panther_vector_similarity_source_not_found,  s    HJJ	AAABBB]2?++ 	7 	7(26666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   	A--A14A1c                 6   t          j                    }|                    t          d                     |                    dd           t          j        t           j                  5  t          j        |d           ddd           dS # 1 swxY w Y   dS )z9Test panther_vector_similarity with isolated source node.r   r   r!   r"   r0  N)	r   r1   r2   r~  r3   r   r   r  r  r   s     r   'test_panther_vector_similarity_isolatedz6TestSimilarity.test_panther_vector_similarity_isolated4  s    HJJ	q"""	

1a]2011 	6 	6(15555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   *BBBc                     t          j        d          }t          j        t           j                  5  t          j        |ddd           ddd           dS # 1 swxY w Y   dS )z%Test raises when D > number of nodes.r   r   r   )rK   r,  Nr   ra   r   r   r  r  r   s     r   *test_panther_vector_similarity_too_large_Dz9TestSimilarity.test_panther_vector_similarity_too_large_D=  s    M!]2011 	9 	9(Aa8888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s   AA Ac                     t          j        d          }t          j        t           j                  5  t          j        |dd           ddd           dS # 1 swxY w Y   dS )z%Test raises when k > number of nodes.r   r   r   )r,  Nr  r   s     r   *test_panther_vector_similarity_too_large_kz9TestSimilarity.test_panther_vector_similarity_too_large_kD  s    M!]2011 	4 	4(A3333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   AAAc                     t          j                    }|                    dd           t          j        |dddd          }t	          |          dk    sJ d|v sJ |d         dk    sJ dS )z7Test panther_vector_similarity with a very small graph.r   r!   r"   r#   )rK   r,  r%   N)r   r1   r3   r  r'   r  s      r   *test_panther_vector_similarity_small_graphz9TestSimilarity.test_panther_vector_similarity_small_graphK  sq    HJJ	

1a*1a1CCC3xx1}}}}Cxxxx1vzzzzzzr,   c                     t          j                    }|                    g d           t          j        |dddd          }t          j        |dddd          }||k    sJ dS )z4Test that results are deterministic with fixed seed.r{  r   r   r"   r#   )rK   r$   r%   N)r   r1   r   r  )rd   r   sim1sim2s       r   ,test_panther_vector_similarity_deterministicz;TestSimilarity.test_panther_vector_similarity_deterministicV  so    HJJ	AAABBB+AqA12NNN+AqA12NNNt||||||r,   c                     t          j        d           t          j                    }|                    g d           t          j        |dddd          }d|vsJ t          d |D                       sJ dS )	z/Test panther_similarity with string node names.r   r   r   r   r   rF   r"   r#   )r,  r$   r%   c              3   @   K   | ]}t          |t                    V  d S r:   
isinstancestrr  s     r   r+   zFTestSimilarity.test_panther_similarity_string_nodes.<locals>.<genexpr>j  ,      99T:dC((999999r,   N)r   r   r   r1   r   rm  r5   r  s      r   $test_panther_similarity_string_nodesz3TestSimilarity.test_panther_similarity_string_nodesa  s    G$$$HJJ	IIIJJJ#AsaQRHHH#~~~~99S9999999999r,   c                     t          j        d           t          j                    }|                    g d           t          j        |ddddd          }d|vsJ t          d |D                       sJ d	S )
z6Test panther_vector_similarity with string node names.r   r  rF   r   r"   r#   r  c              3   @   K   | ]}t          |t                    V  d S r:   r  r  s     r   r+   zMTestSimilarity.test_panther_vector_similarity_string_nodes.<locals>.<genexpr>u  r  r,   N)r   r   r   r1   r   r  r5   r  s      r   +test_panther_vector_similarity_string_nodesz:TestSimilarity.test_panther_vector_similarity_string_nodesl  s    G$$$HJJ	IIIJJJ*1cQ!QSTTT#~~~~99S9999999999r,   c                    t          j        d           t          j        d          }dD ]}t          j        |d|d          }t          |          |k    sJ d| dt          |           d	            d|vs
J d
            t          j        |d|d          }t          |          |k    sJ d| dt          |           d	            d|vs
J d
            d S )Nr   r   )r!   r"   r   rZ   r   r   r!   r#   )r
   r,  r%   zpanther_similarity k=z
 returned z resultsz$Source node should not be in resultszpanther_vector_similarity k=)r   r   r   ra   rm  r'   r  )rd   r   k_valresult_pantherresult_vectors        r   5test_panther_similarity_k_parameter_returns_k_resultszDTestSimilarity.test_panther_similarity_k_parameter_returns_k_resultsw  s+   G$$$M#( 	R 	RE21Q%bQQQN~&&%///VVV^9L9LVVV 0// N***,R***81TVWWWM}%%...\u\\M@R@R\\\ /.. M)))+Q))))	R 	Rr,   N)J__name__
__module____qualname__classmethodrW   rg   rq   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  
algorithmsrW  rX  simrank_algsr   markparametrizer.  r4  rA  rE  rJ  rN  rR  r[  rf  rh  rj  rp  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/   r,   r   rR   rR   G   s       % % [%
P P P 0 0 04
 
 

 
 
#
 #
 #
J#
 #
 #
J1 1 1'Y 'Y 'YR  0 0 0:0 0 0:0 0 0:0 0 00
 
 
	V 	V 	V	V 	V 	V	V 	V 	V
V 
V 
VV V VV V V
V 
V 
VV V VW W W$
V 
V 
V
V 
V 
V
V 
V 
V 	
 ;L
 [1<@@K; K; A@K;Z [1<@@; ; A@;6 [1<@@"; "; A@";H [1<@@; ; A@;, [UL11K K 21K0 0 0
0 0 0
F F F<*@ *@ *@X@ @ @@ @ @	 	 		 	 	0 0 0/ / / [[*55[Xv..C C /. 65C*") ") ")H%) %) %)N3 3 3
B B B
< < <
 
 
:> > > > > > ? ? ?$7 7 76 6 69 9 94 4 4	 	 		 	 		: 	: 	:	: 	: 	:R R R R Rr,   rR   )r   networkxr   networkx.algorithms.similarityr   r   r   networkx.generators.classicr   r   r   r	   r  r  r   filterwarningsr8   r>   rD   rP   rR   r/   r,   r   <module>r     sV                
            ;//  0/ 455  65.    	 	 	R R R R R R R R R Rr,   