U
    ?h}                     @   sf   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d Zdd Zdd	 ZG d
d dZdS )    N)graph_edit_distanceoptimal_edit_pathsoptimize_graph_edit_distance)circular_ladder_graphcycle_graph
path_graphwheel_graphc                 C   s   | |kS N Zn1Zn2r
   r
   [/var/www/html/venv/lib/python3.8/site-packages/networkx/algorithms/tests/test_similarity.pynmatch   s    r   c                 C   s   | |kS r	   r
   e1e2r
   r
   r   ematch   s    r   c                  C   st   t  } | jddd | jddd | jddd | jddd | jdddd | jdddd | jdddd | S )	NAlabelBCDa-bb-cb-d)nxGraphadd_nodeadd_edge)Gr
   r
   r   getCanonical   s    r    c                   @   s  e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zej ej!j"j#gZ$e%j&'d7e$d8d9 Z(e%j&'d7e$d:d; Z)e%j&'d7e$d<d= Z*e%j&'d7e$d>d? Z+e%j&'d@e$dAdB Z,dCdD Z-dEdF Z.dGdH Z/dIdJ Z0dKdL Z1dMdN Z2dOdP Z3dQdR Z4dSdT Z5dUS )VTestSimilarityc                 C   s   t dat d d S )NnumpyZscipy)pytestZimportorskipnp)clsr
   r
   r   setup_class&   s    
zTestSimilarity.setup_classc                 C   s  t d}| }tjtt||dgd tjtt||dddgd tjt jt||dd tjt jt||dd tjt jt||dd t||d	dd
kstt||dddkstt||d	ddd
kstt||ddddkstt||dddd ksttjt j	t||d
d d S )N      )roots      )	   r*   )r*   r,   )r,   r,      r(   r   r   r.      )r)   timeout-C6?)r1   )
r   Z
star_graphcopyr#   raises
ValueErrorr   ZNodeNotFoundAssertionErrorZNetworkXError)selfG0G1r
   r
   r   *test_graph_edit_distance_roots_and_timeout,   s    
z9TestSimilarity.test_graph_edit_distance_roots_and_timeoutc                 C   sL  t  }td}td}td}t||dks2tt||dksDtt||dksVtt||dkshtt||dksztt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dks tt||dks4tt||dksHtd S )	N      r            r.   r0   )r   r   r   r   r   r   r6   r7   r8   r9   G2G3r
   r
   r   test_graph_edit_distance<   s(    z'TestSimilarity.test_graph_edit_distancec                 C   s   t d}t d}|j D ] \}}|d dkr2dnd|d< q|j D ] \}}|d dkr^dnd|d< qFt||dksztt||dd	 d
dkstd S )Nr'   r(   r   redbluecolorr.   c                 S   s   | d |d kS NrF   r
   r   r
   r
   r   <lambda>`       zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>)
node_match)r   nodesitemsr   r6   )r7   r9   rA   nattrr
   r
   r   #test_graph_edit_distance_node_matchV   s      z2TestSimilarity.test_graph_edit_distance_node_matchc                 C   s   t d}t d}|j D ]$\}}t|d dkr6dnd|d< q|j D ]$\}}t|d dkrfdnd|d< qJt||dkstt||dd	 d
dkstd S )Nr;   r(   r   rD   rE   rF   r*   c                 S   s   | d |d kS rG   r
   r   r
   r
   r   rH   o   rI   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>)
edge_matchr   edgesrL   minr   r6   )r7   r9   rA   erN   r
   r
   r   #test_graph_edit_distance_edge_matche   s      z2TestSimilarity.test_graph_edit_distance_edge_matchc                 C   s   t d}t d}|j D ] \}}|d dkr2dnd|d< q|j D ] \}}|d dkr^dnd|d< qFdd	 }d
d }dd }t|||||ddkstd S )Nr;   r(   r   rD   rE   rF   r.   c                 S   s   | d |d krdS dS d S )NrF   r.   
   r
   )ZuattrZvattrr
   r
   r   node_subst_cost|   s    zJTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_subst_costc                 S   s   | d dkrdS dS d S )NrF   rE      2   r
   rN   r
   r
   r   node_del_cost   s    zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_del_costc                 S   s   | d dkrdS dS d S )NrF   rE   (   d   r
   rZ   r
   r
   r   node_ins_cost   s    zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost)rW   r[   r^   )r   rK   rL   r   r6   )r7   r9   rA   rM   rN   rW   r[   r^   r
   r
   r   "test_graph_edit_distance_node_costt   s&    z1TestSimilarity.test_graph_edit_distance_node_costc                 C   s   t d}t d}|j D ]$\}}t|d dkr6dnd|d< q|j D ]$\}}t|d dkrfdnd|d< qJdd	 }d
d }dd }t|||||ddkstd S )Nr;   r(   r   rD   rE   rF   r*   c                 S   s   | d |d krdS dS d S )NrF   {Gz?皙?r
   )ZgattrZhattrr
   r
   r   edge_subst_cost   s    zJTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_subst_costc                 S   s   | d dkrdS dS d S )NrF   rE   皙?      ?r
   rZ   r
   r
   r   edge_del_cost   s    zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_costc                 S   s   | d dkrdS dS d S )NrF   rE   g?      ?r
   rZ   r
   r
   r   edge_ins_cost   s    zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost)rb   re   rg   gq=
ףp?rQ   )r7   r9   rA   rT   rN   rb   re   rg   r
   r
   r   "test_graph_edit_distance_edge_cost   s&    z1TestSimilarity.test_graph_edit_distance_edge_costc                 C   sR   t d}t d}t||ddd ks&tt||dddks<tt||dksNtd S )Nr(   r;   r'   )upper_bound      )r   r   r6   r7   r9   rA   r
   r
   r   $test_graph_edit_distance_upper_bound   s
    z3TestSimilarity.test_graph_edit_distance_upper_boundc              	      s   t d}td}t||\}}|dks*tt|dks:tdd  dddgd	d
dgfdddgdd
dgfdddgd	ddgfdddgdddgfdddgdddgfdddgdddgfg} fdd|D  fdd|D kstd S )Nr*   r.   r;   c                 S   s    t t| t t|dd dfS )Nc                 S   s   d | k| fS r	   r
   )xr
   r
   r   rH      rI   zKTestSimilarity.test_optimal_edit_paths.<locals>.canonical.<locals>.<lambda>)key)tuplesorted)Zvertex_pathZ	edge_pathr
   r
   r   	canonical   s    
z9TestSimilarity.test_optimal_edit_paths.<locals>.canonical)r   r   )r.   r.   )r(   r(   )r/   r/   )r-   r-   )Nr   r(   r-   )r(   r.   )r/   rs   )Nr/   r/   )r.   r   )r-   rs   )Nr-   )r(   r   )r/   r-   rs   )r-   r/   c                    s   h | ]} | qS r
   r
   ).0prr   r
   r   	<setcomp>   s     z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>)r   r   r   r6   len)r7   r9   rA   pathscostexpected_pathsr
   rv   r   test_optimal_edit_paths   s4    z&TestSimilarity.test_optimal_edit_pathsc                 C   sD   t d}t d}d}t||D ]}||k s.t|}q|dks@td S )Nr(   r;   i  rk   )r   r   r6   )r7   r9   rA   Zbestcostrz   r
   r
   r   !test_optimize_graph_edit_distance   s    z0TestSimilarity.test_optimize_graph_edit_distancec                 C   sn  t  }t  }|d t  }|d t  }|d t||dksPtt||dksbtt||dksttt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dks.tt||dksBtt||dksVtt||dksjtd S )N)r   r   r   r   )r   r   r   )r~   r   r   r   r+   r'   r.   )r   r   add_edges_fromr   r6   r@   r
   r
   r   test_selfloops   s.    


zTestSimilarity.test_selfloopsc                 C   sn  t  }t  }|d t  }|d t  }|d t||dksPtt||dksbtt||dksttt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dks.tt||dksBtt||dksVtt||dksjtd S )N)r   r   r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   r   r   r0   r(   r+   )r   DiGraphr   r   r6   r@   r
   r
   r   test_digraph  s.    


zTestSimilarity.test_digraphc                 C   sn  t  }t  }|d t  }|d t  }|d t||dksPtt||dksbtt||dksttt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||dkstt||d	kstt||d	kstt||dks.tt||dksBtt||dksVtt||dksjtd S )
N)r   r   r   )r   r   r   r   )r   r   r   r   r   r   r;   r<   r0   r.   r(   )r   Z
MultiGraphr   r   r6   r@   r
   r
   r   test_multigraph6  s.    


zTestSimilarity.test_multigraphc                 C   sL   t  }|d t  }|d t||dks6tt||dksHtd S )N))hardwarekernel)r   r   )r   	userspace)r   r   ))winterspring)r   summer)r   autumn)r   r   r'   )r   ZMultiDiGraphr   r   r6   rl   r
   r
   r   test_multidigraphS  s    	z TestSimilarity.test_multidigraphc                 C   sT   t  }|jddd |jddd |jdddd t|| ttddksPtd S Nr   r   r   r   rJ   rP   r   )	r   r   r   r   r   r3   r   r   r6   )r7   r   r
   r
   r   testCopyk  s    zTestSimilarity.testCopyc                 C   s   t  }|jddd |jddd |jdddd t  }|jddd |jddd |jdddd t||ttddkstd S r   r   r   r   r   r   r   r   r6   rl   r
   r
   r   testSamet  s    zTestSimilarity.testSamec                 C   s   t  }|jddd |jddd |jdddd t  }|jddd |jddd |jdddd t||ttddkstd S )Nr   r   r   r   badr   r.   r   rl   r
   r
   r   testOneEdgeLabelDiff  s    z#TestSimilarity.testOneEdgeLabelDiffc                 C   s   t  }|jddd |jddd |jdddd t  }|jddd |jddd |jdddd t||ttddkstd S )Nr   r   r   r   Zr   r.   r   rl   r
   r
   r   testOneNodeLabelDiff  s    z#TestSimilarity.testOneNodeLabelDiffc                 C   s   t  }|jddd |jddd |jdddd t  }|jddd |jddd |jdddd |jddd t||ttddkstd S )Nr   r   r   r   r   r   r.   r   rl   r
   r
   r   testOneExtraNode  s    zTestSimilarity.testOneExtraNodec                 C   s   t  }|jddd |jddd |jddd |jddd |jdddd t  }|jddd |jddd |jddd |jdddd |jdddd t||ttddkstd S )	Nr   r   r   r   r   a-cr   r.   r   rl   r
   r
   r   testOneExtraEdge  s    zTestSimilarity.testOneExtraEdgec                 C   s   t  }|jddd |jddd |jdddd t  }|jddd |jddd |jddd |jdddd |jdddd t||ttddkstd S )	Nr   r   r   r   r   r   r   r(   r   rl   r
   r
   r   testOneExtraNodeAndEdge  s    z&TestSimilarity.testOneExtraNodeAndEdgec                 C   s   t  }t }|jddd |jddd |jddd |jddd |jdddd |jdddd |jdddd t||ttd	d
kstd S )Nr   r   r   r   Er   r   d-er   r*   	r    r   r   r   r   r   r   r   r6   rl   r
   r
   r   
testGraph1  s    zTestSimilarity.testGraph1c                 C   s   t  }t }|jddd |jddd |jddd |jddd |jddd |jdddd |jdddd |jddd	d |jddd
d t||ttddkstd S )Nr   r   r   r   r   r   r   r   c-dzc-er   r+   r   rl   r
   r
   r   
testGraph2  s    zTestSimilarity.testGraph2c                 C   s   t  }t }|jd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 |jddd	d |jddd
d |jdddd |jdddd |jdddd |jdddd t||ttddkstd S )Nr   r   r   r   r   r   Fr   r   a-dr   zd-fzd-gze-br   r>   r   rl   r
   r
   r   
testGraph3  s     zTestSimilarity.testGraph3c                 C   s   t  }t }|jddd |jddd |jddd |jddd |jdddd |jdddd |jdddd t||ttd	d
kstd S )Nr   r   r   r   r   r   r   r   r   r(   r   rl   r
   r
   r   
testGraph4  s    zTestSimilarity.testGraph4c                 C   s   t  }t }|jddd |jddd |jddd |jddd |jdddd |jdddd |jdddd t||ttd	d
kstd S )Nr   r   r   r   r   r   r   r   r   r(   r   rl   r
   r
   r   testGraph4_a  s    zTestSimilarity.testGraph4_ac                 C   s   t  }t }|jddd |jddd |jddd |jddd |jdddd |jdddd |jdddd t||ttd	d
kstd S )Nr   r   r   r   r   r   r   r   r   r.   r   rl   r
   r
   r   testGraph4_b  s    zTestSimilarity.testGraph4_bsimrank_similarityc              
   C   sz  t 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dksftqft  }|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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dksNtqNd S )#Nr'   r.   퓭I?~$oC?퓭I?r   r.   r(   r*   r+   r`   absr   Univr   ProfAr(   ProfBr*   StudentAr+   StudentBr/   rs   r.   r*   r(   r+   r+   r(   r*   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)	r   r   rL   r#   approxr6   r   r   r   )r7   r   r   expectedactualkvr
   r
   r    test_simrank_no_source_no_target  sz    
%z/TestSimilarity.test_simrank_no_source_no_targetc                 C   s   t d}dddddd}||dd}|tj|d	d
ks<tt  }|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dg dddddd}||ddd}|tj|d	d
kstd S )Nr'   r.   r   r   r   r   r   sourcer`   r   r   r   r   r(   r   r*   r   r+   r   r/   rs   r   r   r   r   r   r   r   r   r   r   r   r   r#   r   r6   r   r   r   r7   r   r   r   r   r
   r
   r   test_simrank_source_no_targeta  s&    
z,TestSimilarity.test_simrank_source_no_targetc                 C   s  t d}t |ttd}dddddd}||dd	}|tj|d
dksPtt  }|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dg ttt |d }t ||}dddddd }||d!dd"}|tj|d
dkstd S )#Nr'   Zabcder.   r   r   r   )abcdrT   r   r   r`   r   r   r   r   r   r(   r   r*   r   r+   r   r/   rs   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   Zrelabel_nodesdict	enumerater#   r   r6   r   r   r   Zget_node_attributesvalues)r7   r   r   r   r   Znode_labelsr
   r
   r   test_simrank_noninteger_nodes}  s6    
z,TestSimilarity.test_simrank_noninteger_nodesc                 C   s   t d}d}||ddd}|tj|ddks2tt  }|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dg d}||ddd
d}|tj|ddkstd S )Nr'   r.   r   r   targetr`   r   r   r   r   r(   r   r*   r   r+   r   r/   rs   r   r   r   r   r   r   )r   r   r   gh㈵>r   r   r
   r
   r   test_simrank_source_and_target  s    
z-TestSimilarity.test_simrank_source_and_targetalgc                 C   s"   t d}tjt j||dd d S )Nr'   rV   )Zmax_iterations)r   r   r#   r4   ZExceededMaxIterations)r7   r   r   r
   r
   r   test_simrank_max_iterations  s    
z*TestSimilarity.test_simrank_max_iterationsc                 C   s   t d}dddddd}ddd	d	dd}t j|d
d}|tj|ddksNt|tj|ddksdt|tj|ddksztt jj|d
d}|tj|ddkst|tj|ddkst|tj|ddkstd S )Nr'   r.   gLZ??gR9Y@?gR9Y@?r   rf   IC?ΫcA?r   r   Hz>r   r2   gMbP?)r   r   r   r#   r   r6   
similarity_simrank_similarity_python)r7   r   Zexpected_python_tol4Zexpected_numpy_tol4r   r
   r
   r   test_simrank_between_versions  s*    
	z,TestSimilarity.test_simrank_between_versionsc                 C   sr   t d}tdddddgdddddgdddddgdddddgdddddgg}t j|}tjj||dd d S )Nr'   rf   r   r   r   Zatolr   r   r$   arrayr   _simrank_similarity_numpytestingassert_allcloser7   r   r   r   r
   r
   r   &test_simrank_numpy_no_source_no_target  sH    
'z5TestSimilarity.test_simrank_numpy_no_source_no_targetc                 C   sD   t d}tdddddg}t jj|dd}tjj||dd d S )	Nr'   rf   r   r   r   r   r   r   r   r   r
   r
   r   #test_simrank_numpy_source_no_target  s    
	z2TestSimilarity.test_simrank_numpy_source_no_targetc                 C   s6   t d}d}t jj|ddd}tjj||dd d S )Nr'   rf   r   r   r   r   )r   r   r   r   r$   r   r   r   r
   r
   r   $test_simrank_numpy_source_and_target  s    
z3TestSimilarity.test_simrank_numpy_source_and_targetc                 C   s~   t jd t }|dd |dd |dd |dd |dd ddddd	}tj|ddd
}||ksztd S )N*   r   r.   r(   r*   r+   rd   g      ?)r*   r(   r.   r+   path_lengthr$   randomseedr   r   r   Zpanther_similarityr6   r7   r   r   simr
   r
   r   "test_panther_similarity_unweighted  s    z1TestSimilarity.test_panther_similarity_unweightedc                 C   s   t jd t }|jdddd |jdddd |jddd	d |jddd
d |jdddd ddddd}tj|dd	d}||kstd S )Nr   Zv1v2r'   weightv3r.   v4r(   ra   v5g      ?rd   g      ?)r   r   r   r   r   r   r   r
   r
   r    test_panther_similarity_weighted)  s    z/TestSimilarity.test_panther_similarity_weightedc                 C   s.  t jd i }d}d}t }|dd |dd |dd |dd |dd tj||||d}dddgdddgdddgdddgdddgdddgdddgdddgdddgdddgg
}ddddd	d
ddhdddd	ddhdddd
dddhdddd	dhdd
hd}|t|kst||ks*td S )Nr   rV   r(   r   r.   r*   r+   r   	index_mapr'   r;   r<   r0   r,   r   	r$   r   r   r   r   r   Zgenerate_random_pathslistr6   r7   r   Z	num_pathsr   r   ry   r{   Zexpected_mapr
   r
   r   %test_generate_random_paths_unweighted6  sF       z4TestSimilarity.test_generate_random_paths_unweightedc                 C   s  t jd i }d}d}t }|jdddd |jddd	d |jdd
dd |jdddd |jdddd |jdd
dd tj||||d}d
dddd
ddgdddddddgd
ddddddgddd
ddddgd
dddddd
gd
ddddddgd
ddddddgdddddddgd
dd
ddddgddddddd
gg
}ddddddddhddddddhddddhdddddddhdddddddhdddhd}|t|kst||kstd S )Nr   rV   r;   r   r   g333333?r   r   rc   r   ra   rT   gffffff?fg?g333333?r   r   r(   r*   r+   r'   r0   r,   r.   r<   )r   r   r   r   r   rT   r   r   r
   r
   r   #test_generate_random_paths_weighted\  sJ       
	z2TestSimilarity.test_generate_random_paths_weightedc           	      C   s   t d t d d\}}t }|||f |||fg t }|||f |||fg ||fD ]6}|D ]}||j| d< qt|jD ]}||j| d< qqldd }t d tj||||dd	kstt d
 tj||||dd	kstd S )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   rN   c                 S   s   | |kS r	   r
   )rn   yr
   r
   r   rH     rI   zCTestSimilarity.test_symmetry_with_custom_matching.<locals>.<lambda>z!Starting G2 to G3 GED calculationr   r.   z!Starting G3 to G2 GED calculation)	printr   r   Zadd_nodes_fromr   rK   rR   r   r6   )	r7   r   r   rA   rB   r   rM   rT   matchr
   r
   r   "test_symmetry_with_custom_matching  s&    
z1TestSimilarity.test_symmetry_with_custom_matchingN)6__name__
__module____qualname__classmethodr&   r:   rC   rO   rU   r_   rh   rm   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z
algorithmsr   r   Zsimrank_algsr#   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r  r
   r
   r
   r   r!   %   sd   
%%)	
M

$

,&)r!   )r#   Znetworkxr   Znetworkx.algorithms.similarityr   r   r   Znetworkx.generators.classicr   r   r   r   r   r   r    r!   r
   r
   r
   r   <module>   s   