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
   M/tmp/pip-unpacked-wheel-j2te_plx/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 )NZ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?)r0   )
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-   r/   )r   r   r   r   r   r   r5   r6   r7   r8   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 NrE   r
   r   r
   r
   r   <lambda>`       zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>)
node_match)r   nodesitemsr   r5   )r6   r8   r@   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   rC   rD   rE   r)   c                 S   s   | d |d kS rF   r
   r   r
   r
   r   rG   o   rH   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>)
edge_matchr   edgesrK   minr   r5   )r6   r8   r@   erM   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   rC   rD   rE   r-   c                 S   s   | d |d krdS dS d S )NrE   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 )NrE   rD      2   r
   rM   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 )NrE   rD   (   d   r
   rY   r
   r
   r   node_ins_cost   s    zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost)rV   rZ   r]   )r   rJ   rK   r   r5   )r6   r8   r@   rL   rM   rV   rZ   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   rC   rD   rE   r)   c                 S   s   | d |d krdS dS d S )NrE   {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 )NrE   rD   皙?      ?r
   rY   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 )NrE   rD   g?      ?r
   rY   r
   r
   r   edge_ins_cost   s    zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost)ra   rd   rf   gq=
ףp?rP   )r6   r8   r@   rS   rM   ra   rd   rf   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&   )Zupper_bound      )r   r   r5   r6   r8   r@   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   rG      rH   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.   rq   )Nr.   r.   )r-   r   )r,   rq   )Nr,   )r'   r   )r.   r,   rq   )r,   r.   c                    s   h | ]} | qS r
   r
   ).0prp   r
   r   	<setcomp>   s     z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>)r   r   r   r5   len)r6   r8   r@   pathscostexpected_pathsr
   rt   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  ri   )r   r   r5   )r6   r8   r@   Zbestcostrx   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   r5   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   r/   r'   r*   )r   DiGraphr   r   r5   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;   r/   r-   r'   )r   Z
MultiGraphr   r   r5   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   r5   rj   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   rI   rO   r   )	r   r   r   r   r   r2   r   r   r5   )r6   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   r5   rj   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   rj   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   rj   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   rj   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   rj   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   rj   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   r5   rj   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   rj   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   rj   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   rj   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   rj   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   rj   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.   rq   r-   r)   r'   r*   r*   r'   r)   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)	r   r   rK   r"   approxr5   r   r   r   )r6   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.   rq   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   r5   r   r   r   r6   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drS   r   r   r_   r   r   r   r   r   r'   r   r)   r   r*   r   r.   rq   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   Zrelabel_nodesdict	enumerater"   r   r5   r   r   r   Zget_node_attributesvalues)r6   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.   rq   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&   rU   )Zmax_iterations)r   r   r"   r3   ZExceededMaxIterations)r6   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   re   IC?ΫcA?r   r   Hz>r   r1   gMbP?)r   r   r   r"   r   r5   
similarity_simrank_similarity_python)r6   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&   re   r   r   r   Zatolr   r   r#   arrayr   _simrank_similarity_numpytestingassert_allcloser6   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&   re   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&   re   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*   rc   g      ?)r)   r'   r-   r*   path_lengthr#   randomseedr   r   r   Zpanther_similarityr5   r6   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&   Zweightv3r-   v4r'   r`   v5g      ?rc   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   rU   r'   r   r-   r)   r*   r   	index_mapr&   r:   r;   r/   r+   r   	r#   r   r   r   r   r   Zgenerate_random_pathslistr5   r6   r   Z	num_pathsr   r   rw   ry   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   rU   r:   r   r   g333333?r   r   rb   r   r`   rS   gffffff?fg?g333333?r   r   r'   r)   r*   r&   r/   r+   r-   r;   )r   r   r   r   r   rS   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}   rM   c                 S   s   | |kS r	   r
   )rl   yr
   r
   r   rG     rH   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   rJ   rQ   r   r5   )	r6   r   r   r@   rA   r   rL   rS   matchr
   r
   r   "test_symmetry_with_custom_matching  s&    
z1TestSimilarity.test_symmetry_with_custom_matchingN)6__name__
__module____qualname__classmethodr%   r9   rB   rN   rT   r^   rg   rk   rz   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   