o
    ˷e}                     @   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      | |kS N n1n2r   r   `/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/tests/test_similarity.pynmatch      r   c                 C   r	   r
   r   e1e2r   r   r   ematch   r   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"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 Z/dKdL Z0dMdN Z1dOdP Z2dQdR Z3dSdT Z4dUS )VTestSimilarityc                 C   s   t dat d d S )Nnumpyscipy)pytest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||g d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sLJ t||d
ddksWJ t||dddd	kscJ t||d
dddksoJ t||d
ddd u s{J tjt jt||d	d d S )N      )roots)r.         )	   r0   )r0   r2   )r2   r2      r.   r   r   r4      )r/   timeout-C6?)r7   )	r   
star_graphcopyr(   raises
ValueErrorr   NodeNotFoundNetworkXError)selfG0G1r   r   r   *test_graph_edit_distance_roots_and_timeout,   s   
z9TestSimilarity.test_graph_edit_distance_roots_and_timeoutc                 C   sD  t  }td}td}td}t||dksJ t||dks"J t||dks+J t||dks4J t||dks=J t||dksFJ t||dksOJ t||dksXJ t||dksaJ t||dksjJ t||dkssJ t||dks|J t||dksJ t||dksJ t||dksJ t||dksJ d S )	N      r            r4   r6   )r   r    r   r   r   r   r?   r@   rA   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rdnd|d< q|j D ]\}}|d dkr/dnd|d< q#t||dks=J t||dd	 d
dksJJ d S )Nr-   r.   r   redbluecolorr4   c                 S      | d |d kS NrN   r   r   r   r   r   <lambda>`       zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>)
node_match)r   nodesitemsr   )r?   rA   rI   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rdnd|d< q|j D ]\}}t|d dkr3dnd|d< q%t||dksAJ t||dd	 d
dksNJ d S )NrC   r.   r   rL   rM   rN   r0   c                 S   rO   rP   r   r   r   r   r   rQ   o   rR   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>)
edge_matchr   edgesrU   minr   )r?   rA   rI   erW   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rdnd|d< q|j D ]\}}|d dkr/dnd|d< q#dd	 }d
d }dd }t|||||ddksMJ d S )NrC   r.   r   rL   rM   rN   r4   c                 S      | d |d kr
dS dS )NrN   r4   
   r   )uattrvattrr   r   r   node_subst_cost|      zJTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_subst_costc                 S      | d dkrdS dS )NrN   rM      2   r   rW   r   r   r   node_del_cost      zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_del_costc                 S   re   )NrN   rM   (   d   r   rh   r   r   r   node_ins_cost   rj   zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost)rc   ri   rm   )r   rT   rU   r   )r?   rA   rI   rV   rW   rc   ri   rm   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rdnd|d< q|j D ]\}}t|d dkr3dnd|d< q%dd	 }d
d }dd }t|||||ddksQJ d S )NrC   r.   r   rL   rM   rN   r0   c                 S   r_   )NrN   {Gz?皙?r   )gattrhattrr   r   r   edge_subst_cost   rd   zJTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_subst_costc                 S   re   )NrN   rM   皙?      ?r   rh   r   r   r   edge_del_cost   rj   zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_costc                 S   re   )NrN   rM   g?      ?r   rh   r   r   r   edge_ins_cost   rj   zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost)rs   rv   rx   gq=
ףp?rZ   )r?   rA   rI   r]   rW   rs   rv   rx   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 u sJ t||dddksJ t||dks'J d S )Nr.   rC   r-   )upper_bound      )r   r   r?   rA   rI   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J t|dksJ d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|D  fdd|D ksaJ d S )Nr0   r4   rC   c                 S   s    t t| t t|dd dfS )Nc                 S   s   d | v | fS r
   r   )xr   r   r   rQ      s    zKTestSimilarity.test_optimal_edit_paths.<locals>.canonical.<locals>.<lambda>)key)tuplesorted)vertex_path	edge_pathr   r   r   	canonical   s   
z9TestSimilarity.test_optimal_edit_paths.<locals>.canonical)r   r   r4   r4   r.   r.   )r5   r5   r3   r3   Nr   r.   )r   r3   r.   r4   )r5   r   r   Nr5   )r5   r4   r   r   )r   r3   r   Nr3   )r5   r3   r.   r   )r5   r3   r   r   )r   r   r   )r   r3   r5   r   )r   r   r   )r   r   r   c                    s   h | ]} | qS r   r   ).0pr   r   r   	<setcomp>   s    z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>)r   r   r   len)r?   rA   rI   pathscostexpected_pathsr   r   r   test_optimal_edit_paths   s4   ,z&TestSimilarity.test_optimal_edit_pathsc                 C   sD   t d}t d}d}t||D ]
}||k sJ |}q|dks J d S )Nr.   rC   i  r|   )r   r   )r?   rA   rI   bestcostr   r   r   r   !test_optimize_graph_edit_distance   s   z0TestSimilarity.test_optimize_graph_edit_distancec                 C   sb  t  }t  }|d t  }|d t  }|d t||dks(J t||dks1J t||dks:J t||dksCJ t||dksLJ t||dksUJ t||dks^J t||dksgJ t||dkspJ t||dksyJ t||dksJ t||dksJ t||dksJ t||dksJ t||dksJ t||dksJ d S )N)r   r   r   r   )r   r   r   )r   r   r   r   r1   r-   r4   )r   r    add_edges_fromr   rH   r   r   r   test_selfloops   .   


zTestSimilarity.test_selfloopsc                 C   sb  t  }t  }|d t  }|d t  }|d t||dks(J t||dks1J t||dks:J t||dksCJ t||dksLJ t||dksUJ t||dks^J t||dksgJ t||dkspJ t||dksyJ t||dksJ t||dksJ t||dksJ t||dksJ t||dksJ t||dksJ d S )N)r   r   r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   r   r   r6   r.   r1   )r   DiGraphr   r   rH   r   r   r   test_digraph  r   zTestSimilarity.test_digraphc                 C   sb  t  }t  }|d t  }|d t  }|d t||dks(J t||dks1J t||dks:J t||dksCJ t||dksLJ t||dksUJ t||dks^J t||dksgJ t||dkspJ t||dksyJ t||d	ksJ t||d	ksJ t||dksJ t||dksJ t||dksJ t||dksJ d S )
N)r   r   r   )r   r   r   r   )r   r   r   r   r   r   rC   rD   r6   r4   r.   )r   
MultiGraphr   r   rH   r   r   r   test_multigraph6  r   zTestSimilarity.test_multigraphc                 C   sL   t  }|d t  }|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}   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s(J d S Nr   r   r   r   rS   rY   r   )r   r    r!   r"   r   r:   r   r   )r?   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s@J d S r   r   r    r!   r"   r   r   r   r}   r   r   r   testSamet     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s@J d S )Nr   r   r   r   badr   r4   r   r}   r   r   r   testOneEdgeLabelDiff  r   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s@J d S )Nr   r   r   r   Zr   r4   r   r}   r   r   r   testOneNodeLabelDiff  r   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sGJ d S )Nr   r   r   r   r   r   r4   r   r}   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s]J d S )	Nr   r   r   r   r   a-cr   r4   r   r}   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sOJ d S )	Nr   r   r   r   r   r   r   r.   r   r}   r   r   r   testOneExtraNodeAndEdge  s   z&TestSimilarity.testOneExtraNodeAndEdgec                 C      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sGJ d S )Nr   r   r   r   Er   r   d-er   r0   r$   r   r    r!   r"   r   r   r   r}   r   r   r   
testGraph1     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sVJ d S )Nr   r   r   r   r   r   r   r   c-dzc-er   r1   r   r}   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stJ d S )Nr   r   r   r   r   r   Fr#   r   a-dr   zd-fzd-gze-br   rF   r   r}   r   r   r   
testGraph3  s    zTestSimilarity.testGraph3c                 C   r   )Nr   r   r   r   r   r   r   r   r   r.   r   r}   r   r   r   
testGraph4  r   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sGJ d S )Nr   r   r   r   r   r   r   r   r   r.   r   r}   r   r   r   testGraph4_a  r   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sGJ d S )Nr   r   r   r   r   r   r   r   r   r4   r   r}   r   r   r   testGraph4_b  r   zTestSimilarity.testGraph4_bsimrank_similarityc              
   C   sn  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sDJ q3t  }|jd	d
d |jddd |jddd |jddd |j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}| D ]\}}|tj|| ddksJ qd S )Nr-   r4   퓭I?~$oC?퓭I?r   r4   r.   r0   r1   ro   absr   Univr   ProfAr.   ProfBr0   StudentAr1   StudentBr5   r   )r4   r0   )r.   r1   )r1   r.   )r0   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)r   r   rU   r(   approxr   r!   r   )r?   r   r#   expectedactualkvr   r   r    test_simrank_no_source_no_target  s|   
%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J t  }|jddd |jddd |jddd |jddd |jddd |g d dddddd}||ddd}|tj|d	d
ksfJ d S )Nr-   r4   r   r   r   r   r   sourcero   r   r   r   r   r.   r   r0   r   r1   r   r   r   r   r   r   r   r   r   r   r(   r   r   r!   r   r?   r   r#   r   r   r   r   r   test_simrank_source_no_target^  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s(J t  }|jddd |jddd |jddd |jddd |jddd |	g d ttt 
|d }t ||}dddddd}||ddd}|tj|d
dksJ d S )Nr-   abcder4   r   r   r   )abcdr]   r   r   ro   r   r   r   r   r   r.   r   r0   r   r1   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   relabel_nodesdict	enumerater(   r   r   r!   r   get_node_attributesvalues)r?   r   r#   r   r   node_labelsr   r   r   test_simrank_noninteger_nodesz  s6   
z,TestSimilarity.test_simrank_noninteger_nodesc                 C   s   t d}d}||ddd}|tj|ddksJ t  }|jddd |jdd	d |jd
dd |jddd |jddd |g d d}||ddd
d}|tj|ddks\J d S )Nr-   r4   r   r   targetro   r   r   r   r   r.   r   r0   r   r1   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-   r`   )max_iterations)r   r   r(   r;   ExceededMaxIterations)r?   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s'J |tj|ddks2J |tj|ddks=J t jj|d
d}|tj|ddksPJ |tj|ddks[J |tj|ddksfJ d S )Nr-   r4   gLZ??gR9Y@?gR9Y@?r   rw   IC?ΫcA?r   r   Hz>r   r8   gMbP?)r   r   r   r(   r   
similarity_simrank_similarity_python)r?   r#   expected_python_tol4expected_numpy_tol4r   r   r   r   test_simrank_between_versions  s*   
	z,TestSimilarity.test_simrank_between_versionsc                 C   sT   t d}tg dg dg dg dg dg}t j|}tjj||dd d S )	Nr-   rw   r  r  r  r  )r  rw   r  r  r  )r  r  rw   r  r  )r  r  r  rw   r  )r  r  r  r  rw   r  atolr   r   r*   arrayr  _simrank_similarity_numpytestingassert_allcloser?   r#   r   r   r   r   r   &test_simrank_numpy_no_source_no_target  s   
'z5TestSimilarity.test_simrank_numpy_no_source_no_targetc                 C   s>   t d}tg d}t jj|dd}tjj||dd d S )Nr-   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-   rw   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s=J d S )N*   r   r4   r.   r0   r1   ru   g      ?)r0   r.   r4   r1   path_lengthr*   randomseedr   r    r"   panther_similarityr?   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sGJ d S )Nr  v1v2r-   weightv3r4   v4r.   rp   v5g      ?ru   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}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sqJ ||kswJ d S )Nr  r`   r.   r   r4   r0   r1   r  	index_map)r0   r   r0   )r1   r.   r4   )r.   r4   r   )r.   r   r0   )r0   r   r4   )r1   r.   r   )r0   r   r.   )r.   r4   r.   >   r   r.   r0   r1   r-   rC   rD   r6   >   r4   r.   r1   r-   rD   r2   >   r4   r.   r0   rC   rD   r6   r2   >   r   r0   r1   r-   r6   rC   r   r*   r  r  r   r    r"   generate_random_pathslistr?   r+  	num_pathsr  r#   r   r   expected_mapr   r   r   %test_generate_random_paths_unweighted3  s@   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}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sJ ||ksJ d S )!Nr  r`   rC   r   r   g333333?r$  r   rt   r   rp   r]   gffffff?fg?g333333?r*  )r   r   r3  r   r   r   r   )r]   r   r3  r   r3  r   r]   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )r3  r   r3  r   r3  r   r]   )r   r   r   r   r   r   r   )r]   r   r3  r   r]   r   r   >   r   r.   r0   r1   r-   rC   r6   r2   >   r   r4   r.   r-   rD   r2   >   r   r4   rD   r2   >   r   r.   r0   r1   r-   rC   r6   >   r4   rD   r2   )r   r   r3  r   r   r]   r,  r/  r   r   r   #test_generate_random_paths_weightedY  sD   	z2TestSimilarity.test_generate_random_paths_weightedc           	      C   s   t d t d d\}}t }|||f |||fg t }|||f |||fg ||fD ]}|D ]	}||j| d< q:|jD ]	}||j| d< qGq6dd }t d tj||||dd	ksgJ t d
 tj||||dd	ksxJ 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   rW   c                 S   r	   r
   r   )r   yr   r   r   rQ     s    zCTestSimilarity.test_symmetry_with_custom_matching.<locals>.<lambda>z!Starting G2 to G3 GED calculationr   r4   z!Starting G3 to G2 GED calculation)printr   r    add_nodes_fromr   rT   r[   r   )	r?   r   r   rI   rJ   r#   rV   r]   matchr   r   r   "test_symmetry_with_custom_matching  s(   
z1TestSimilarity.test_symmetry_with_custom_matchingN)5__name__
__module____qualname__classmethodr,   rB   rK   rX   r^   rn   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  simrank_algsr(   markparametrizer   r   r   r   r  r  r  r  r  r!  r)  r2  r4  r9  r   r   r   r   r%   %   sb    
%%)	
M

$

,&)r%   )r(   networkxr   networkx.algorithms.similarityr   r   r   networkx.generators.classicr   r   r   r   r   r   r$   r%   r   r   r   r   <module>   s    