o
    ]Zh                     @   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 Zn1Zn2r   r   X/var/www/auris/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"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 Z5dUdV Z6dWdX Z7dYdZ Z8d[d\ Z9d]S )^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||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*         )	   r,   )r,   r.   )r.   r.      r*   r   r   r0      )r+   timeout-C6?)r3   )	r   Z
star_graphcopyr%   raises
ValueErrorr   NodeNotFoundZ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            r0   r2   )r   r   r   r   r   r   r9   r:   r;   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colorr0   c                 S      | d |d kS NrH   r   r   r   r   r   <lambda>`       zDTestSimilarity.test_graph_edit_distance_node_match.<locals>.<lambda>)
node_match)r   nodesitemsr   )r9   r;   rC   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 )Nr=   r*   r   rF   rG   rH   r,   c                 S   rI   rJ   r   r   r   r   r   rK   o   rL   zDTestSimilarity.test_graph_edit_distance_edge_match.<locals>.<lambda>)
edge_matchr   edgesrO   minr   )r9   r;   rC   erQ   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 )Nr=   r*   r   rF   rG   rH   r0   c                 S      | d |d kr
dS dS )NrH   r0   
   r   )ZuattrZ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 )NrH   rG      2   r   rQ   r   r   r   node_del_cost      zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_del_costc                 S   r]   )NrH   rG   (   d   r   r`   r   r   r   node_ins_cost   rb   zHTestSimilarity.test_graph_edit_distance_node_cost.<locals>.node_ins_cost)r[   ra   re   )r   rN   rO   r   )r9   r;   rC   rP   rQ   r[   ra   re   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 )Nr=   r*   r   rF   rG   rH   r,   c                 S   rY   )NrH   {Gz?皙?r   )ZgattrZhattrr   r   r   edge_subst_cost   r\   zJTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_subst_costc                 S   r]   )NrH   rG   皙?      ?r   r`   r   r   r   edge_del_cost   rb   zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_del_costc                 S   r]   )NrH   rG   g?      ?r   r`   r   r   r   edge_ins_cost   rb   zHTestSimilarity.test_graph_edit_distance_edge_cost.<locals>.edge_ins_cost)ri   rl   rn   gq=
ףp?rT   )r9   r;   rC   rW   rQ   ri   rl   rn   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*   r=   r)   )upper_bound      )r   r   r9   r;   rC   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 )Nr,   r0   r=   c                 S   s    t t| t t|dd dfS )Nc                 S   s   d | v | fS r
   r   )xr   r   r   rK      s    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   r0   r0   r*   r*   )r1   r1   r/   r/   Nr   r*   )rz   r/   r*   r0   )r1   r   r~   Nr1   )r1   r0   r   r|   )r}   r/   r   Nr/   )r1   r/   r*   r   )r1   r/   r   r   )r   r   r   )r   r/   r1   r   )r   r{   r   )r   r   r   c                    s   h | ]} | qS r   r   ).0pry   r   r   	<setcomp>   s    z9TestSimilarity.test_optimal_edit_paths.<locals>.<setcomp>)r   r   r   len)r9   r;   rC   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*   r=   i  rr   )r   r   )r9   r;   rC   Z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   r-   r)   r0   )r   r   add_edges_fromr   rB   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   r2   r*   r-   )r   DiGraphr   r   rB   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   r=   r>   r2   r0   r*   )r   Z
MultiGraphr   r   rB   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   ZMultiDiGraphr   r   rs   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   rM   rS   r   )r   r   r   r    r   r5   r   r   r9   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   rs   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   r0   r   rs   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   r0   r   rs   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   r0   r   rs   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   r0   r   rs   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   rs   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   r,   r"   r   r   r   r    r   r   r   rs   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   r-   r   rs   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   r@   r   rs   r   r   r   
testGraph3  s    zTestSimilarity.testGraph3c                 C   r   )Nr   r   r   r   r   r   r   r   r   r*   r   rs   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   rs   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   r0   r   rs   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)   r0   퓭I?~$oC?퓭I?r   r0   r*   r,   r-   rg   absr   Univr   ProfAr*   ProfBr,   StudentAr-   StudentBr1   r   )r0   r,   r*   r-   )r-   r*   )r,   r           (-f?@<yX?gЏw?g$=?gPD?glɋݕ?gs,?皙?)importance_factor)r   r   rO   r%   approxr   r   r   )r9   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)   r0   r   r   r   r   r   sourcerg   r   r   r   r   r*   r   r,   r   r-   r   r   r   r   r   r   r   r   r   r   r%   r   r   r   r   r9   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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)   Zabcder0   r   r   r   )abcdrW   r   r   rg   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   Zrelabel_nodesdict	enumerater%   r   r   r   r   Zget_node_attributesvalues)r9   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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)   r0   r   r   targetrg   r   r   r   r   r*   r   r,   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)   rZ   )Zmax_iterations)r   r   r%   r6   ZExceededMaxIterations)r9   r   r!   r   r   r   test_simrank_max_iterations  s   
z*TestSimilarity.test_simrank_max_iterationsc                 C   N   t d}tjt jdd t j|dd W d    d S 1 s w   Y  d S )Nr)   Source node 10 not in GmatchrZ   r   r   r   r%   r6   r8   r   r   r   r   r   test_simrank_source_not_found     
"z,TestSimilarity.test_simrank_source_not_foundc                 C   r   )Nr)   zTarget node 10 not in Gr   rZ   )r   r   r   r   r   r   test_simrank_target_not_found  r   z,TestSimilarity.test_simrank_target_not_foundc                 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)   r0   gLZ??gR9Y@?gR9Y@?r   rm   IC?ΫcA?r   r   Hz>r   r4   gMbP?)r   r   r   r%   r   
similarity_simrank_similarity_python)r9   r!   Zexpected_python_tol4Z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)   rm   r   r   r   r   )r   rm   r   r   r   )r   r   rm   r   r   )r   r   r   rm   r   )r   r   r   r   rm   r   Zatolr   r   r&   arrayr   _simrank_similarity_numpytestingassert_allcloser9   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)   rm   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   r0   r*   r,   r-   rk   g      ?)r,   r*   r0   r-   )path_lengthr&   randomseedr   r   r    panther_similarityr9   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d}||ksHJ d S )Nr
  v1v2r)   )wv3r0   v4r*   rh   v5g      ?rk   g      ?)r  r  r  r  r  )r  weightr  r  r   r   r    test_panther_similarity_weighted3  s   z/TestSimilarity.test_panther_similarity_weightedc                 C   sZ   t  }|g d tjt jdd t j|dd W d    d S 1 s&w   Y  d S )N)r1   r   )r   r,   r/   r   r   r   rZ   r   )r   r   r   r%   r6   r8   r  r   r   r   r   (test_panther_similarity_source_not_found@  s
   "z7TestSimilarity.test_panther_similarity_source_not_foundc                 C   sZ   t  }|td tjt jdd t j|dd W d    d S 1 s&w   Y  d S )Nr)   zAPanther similarity is not defined for the isolated source node 1.r   r0   r   )r   r   add_nodes_fromranger%   r6   ZNetworkXUnfeasibler  r   r   r   r    test_panther_similarity_isolatedF  s   "z/TestSimilarity.test_panther_similarity_isolatedc                 C   s   i }d}d}t  }|dd |dd |dd |dd |dd t j||||d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slJ ||ksrJ d S )NrZ   r*   r   r0   r,   r-   r
  )r  	index_mapr  )r,   r   r,   )r-   r*   r0   )r*   r0   r   )r*   r   r,   )r,   r   r0   )r-   r*   r   )r,   r   r*   )r*   r0   r*   >   r   r*   r,   r-   r)   r=   r>   r2   >   r0   r*   r-   r)   r>   r.   >   r0   r*   r,   r=   r>   r2   r.   >   r   r,   r-   r)   r2   r=   r   )r   r   r    generate_random_pathslistr9   r  Z	num_pathsr  r!   r   r   Zexpected_mapr   r   r   %test_generate_random_paths_unweightedO  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
  rZ   r=   r   r   g333333?)r  r   rj   r   rh   rW   gffffff?fg?g333333?)r  r  )r   r   r$  r   r   r   r   )rW   r   r$  r   r$  r   rW   )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   r$  r   r$  r   rW   )r   r   r   r   r   r   r   )rW   r   r$  r   rW   r   r   >   r   r*   r,   r-   r)   r=   r2   r.   >   r   r0   r*   r)   r>   r.   >   r   r0   r.   r>   >   r   r*   r,   r-   r)   r=   r2   >   r0   r.   r>   )r   r   r$  r   r   rW   )r&   r  r  r   r   r    r   r!  r"  r   r   r   #test_generate_random_paths_weighteds  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   rQ   c                 S   r	   r
   r   )ru   yr   r   r   rK     s    zCTestSimilarity.test_symmetry_with_custom_matching.<locals>.<lambda>z!Starting G2 to G3 GED calculationr   r0   z!Starting G3 to G2 GED calculation)printr   r   r  r   rN   rU   r   )	r9   r   r   rC   rD   r!   rP   rW   r   r   r   r   "test_symmetry_with_custom_matching  s(   
z1TestSimilarity.test_symmetry_with_custom_matchingN):__name__
__module____qualname__classmethodr(   r<   rE   rR   rX   rf   ro   rt   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   r   r   r   r#   %   sn    
%%)	
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    