o
    3ήc,                     @   s   d Z ddlZddlZddlZddlZddlmZ G dd dZ	G dd dZ
G d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S )z*
    Tests for VF2 isomorphism algorithm.
    N)isomorphismc                   @   s   e Zd ZddgddgddgddgddgddgddgddgddgddgddgddggZd	d
gd
dgddgdd	gddgddgddgddgd	dgd
dgddgddggZdd Zdd Zdd ZdS )TestWikipediaExampleaghibjcd                        c                 C   s^   t  }t  }|| j || j t||}| s J | s&J t	|j
 }d S )N)nxGraphadd_edges_fromg1edgesg2edgesisoGraphMatcheris_isomorphicsubgraph_is_monomorphicsortedmappingitems)selfg1g2gmr    r$   ]/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py
test_graph2   s   zTestWikipediaExample.test_graphc                 C   sR   t  }t  }|| j || j |g d}t||}| s'J d S )N)r   r   r   r   )	r   r   r   r   r   subgraphr   r   subgraph_is_isomorphic)r    r!   r"   g3r#   r$   r$   r%   test_subgraphD   s   z"TestWikipediaExample.test_subgraphc                 C   sT   t  }t  }|| j |ddgddgddgg t||}| s(J d S )Nr   r   r   r   )r   r   r   r   r   r   r   )r    r!   r"   r#   r$   r$   r%   test_subgraph_monoM   s   z'TestWikipediaExample.test_subgraph_monoN)__name__
__module____qualname__r   r   r&   r*   r+   r$   r$   r$   r%   r      s<    	r   c                   @   s(   e Zd Zedd Zdd Zdd ZdS )TestVF2GraphDBc                 C   s   t | dd}td|dd }t }t|D ]%}td|dd }t|D ]}td|dd }||| q*q|  |S )z+Creates a Graph instance from the filename.rb)modez<Hr   r   )	openstructunpackreadr   r   rangeadd_edgeclose)filenamefhnodesgraph	from_nodeedgesedgeto_noder$   r$   r%   create_graphY   s   zTestVF2GraphDB.create_graphc                 C   sT   t jt\}}| t j|d}| t j|d}t||}| s(J d S )Nziso_r01_s80.A99ziso_r01_s80.B99)	ospathsplit__file__rA   joinr   r   r   )r    headtailr!   r"   r#   r$   r$   r%   r&   x   s
   zTestVF2GraphDB.test_graphc                 C   s`   t jt\}}| t j|d}| t j|d}t||}| s(J |	 s.J d S )Nzsi2_b06_m200.A99zsi2_b06_m200.B99)
rB   rC   rD   rE   rA   rF   r   r   r(   r   )r    rG   rH   r'   r<   r#   r$   r$   r%   r*      s   zTestVF2GraphDB.test_subgraphN)r,   r-   r.   staticmethodrA   r&   r*   r$   r$   r$   r%   r/   V   s
    
r/   c                   @   s    e Zd Zedd Zdd ZdS )	TestAtlasc                 C   s    dd l m  ma t | _d S )Nr   )networkx.generators.atlas
generatorsatlasgraph_atlas_gGAG)clsr$   r$   r%   setup_class   s   zTestAtlas.setup_classc           
      C   s   | j dd }ttd}|D ]3}t|}|d t| }tdD ] }t| tt||}t	||}t
||}	|	 sAJ q!qd S )Nr   d      
   )rO   listr6   lenrandomshuffledictzipr   relabel_nodesr   r   r   )
r    Atlasalphabetr<   nlistlabelssr   relabelr#   r$   r$   r%   test_graph_atlas   s   
zTestAtlas.test_graph_atlasN)r,   r-   r.   classmethodrQ   rb   r$   r$   r$   r%   rJ      s    
rJ   c                  C   s   g d} t td}t t fD ]A}||  tdD ]5}t |}t| tt	||}t
||}| s@t||}nt||}| sLJ | sRJ qqd S )N)r   r   r   r   )r   r   )r   r   r   r   )r   r   )r   r   )r   r   )r   	   )rg   rT   rT      rh   ri      rj   rk      rl   rm      rn   ro      rp   rq      rr   rs      rt   ru      rv   rw      rx   ry   r   rz      rT   )rU   r6   r   
MultiGraphMultiDiGraphr   rW   rX   rY   rZ   r[   is_directedr   r   DiGraphMatcherr   r   r>   r;   r!   _	new_nodesr   r"   r#   r$   r$   r%   test_multiedge   s     

r   c                  C   s   g d} t td}t t fD ];}||  tdD ]/}t |}t| tt	||}t
||}| s@t||}nt||}| sLJ qqd S )N)rd   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   rR   )rU   r6   r   r   DiGraphr   rW   rX   rY   rZ   r[   r~   r   r   r   r   r   r$   r$   r%   test_selfloop   s   

r   c            	      C   s   g d} | dg }t td}t t fD ]C}|| tdD ]7}t |}t| tt	||}t
||}|t| | sMt||}nt||}| rYJ q"qd S )N)
rd   r   re   r   r   r   r   r   rf   r   r   r   rR   )rU   r6   r   r   r   r   rW   rX   rY   rZ   r[   remove_edges_fromselfloop_edgesr~   r   r   r   r   )	edges0r>   r;   r!   r   r   r   r"   r#   r$   r$   r%   test_selfloop_mono   s"   


r   c                  C   s   t  } t  }t  }| dd | dd |dd |dd t| |}t| |}t| }t| }ddd|v sEJ ddd|v sNJ ddd|v sWJ ddd|v s`J t|t|ksjJ t|dksrJ d S )	NABCYZr   r   r   r   r   )r   r   r7   r   r   rU   subgraph_isomorphisms_iterrV   )r!   r"   r)   gm12gm13xyr$   r$   r%   test_isomorphism_iter1  s"   r   c                  C   s   t  } t  }| dd | dd | dd |dd |dd t| |}t| }dddd|v s<J dddd|v sFJ dddd|v sPJ t|dksXJ t|| }| rdJ d S )	Nr   r   r   Xr   r   )r   r   r   r   )	r   r   r7   r   r   rU   subgraph_monomorphisms_iterrV   r   )r!   r"   r   r   gm21r$   r$   r%   test_monomorphism_iter1/  s   r   c                  C   s   t ddD ]} t| }t||}tt| }|dks J qt ddD ]} t| }t||}tt| }|d|  ksCJ q&d S )Nr   rT   r   )	r6   r   
path_graphr   r   rV   rU   isomorphisms_itercycle_graph)Lr!   r#   r`   r$   r$   r%   test_isomorphism_iter2B  s   

r   c                  C   s   g d} t  t  ft  t  ffD ]g\}}||  ||  t |ddg}| s;t||}t||}nt||}t||}|	 sMJ |
d | s]t||}nt||}| siJ | soJ | suJ | s{J qd S )N)r   )r   r   r   r   r   r   )r   r   r   r   r'   r~   r   r   r   r   remove_noder(   r   )r>   r!   r"   r)   gmAgmBr$   r$   r%   test_multipleQ  s(   (


r   c                  C   s   t  } t  }t  }t| ||g}t||}| sJ | s#J tj| ||gtjd}tj||| gtjd}t||}| sEJ | sKJ d S )N)create_using)	objectr   r   r   r   r   r   r   r   )node1node2node3Gr#   Hdgmr$   r$   r%   test_noncomparable_nodesp  s   r   c                  C   s   t  } | d | d | jdddd | jdddd | jdddd t  }|d |d |jdddd tj| |td	d d
}| sNJ d S )Nr   r   r   )labelr   r   r   r   r   )
edge_match)r   r   add_noder7   r   r   categorical_edge_matchr   )r   SGr#   r$   r$   r%   test_monomorphism_edge_match  s   



r   )__doc__rB   rW   r3   networkxr   networkx.algorithmsr   r   r   r/   rJ   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   s$    I85 