o
    3ήc                     @   s   d dl Z d dl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d Zdd Zdd Zdd ZdS )    Nc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )TestConfigurationModelzLUnit tests for the :func:`~networkx.configuration_model`
    function.

    c                 C   s   t g }t|dksJ dS )z:Tests that an empty degree sequence yields the null graph.r   N)nxconfiguration_modellenselfG r	   P/tmp/pip-target-vg8gfxp4/lib/python/networkx/generators/tests/test_degree_seq.pytest_empty_degree_sequence   s   
z1TestConfigurationModel.test_empty_degree_sequencec                 C   s2   t g d}t|dksJ | dksJ dS )zSTests that a degree sequence of all zeros yields the empty
        graph.

        )r   r   r      r   N)r   r   r   number_of_edgesr   r	   r	   r
   test_degree_zero   s   z'TestConfigurationModel.test_degree_zeroc                 C   sp   g d}t j|dd}tdd | D ddg dksJ tdd |tt|D ddg dks6J d	S )
zjTests that the degree sequence of the generated graph matches
        the input degree sequence.

        )   r   r   r   r      r   r      r   r   iNa seedc                 s       | ]\}}|V  qd S Nr	   .0ndr	   r	   r
   	<genexpr>!       z>TestConfigurationModel.test_degree_sequence.<locals>.<genexpr>T)reversec                 s   r   r   r	   r   r	   r	   r
   r   .   r   N)r   r   sorteddegreeranger   )r   deg_seqr   r	   r	   r
   test_degree_sequence   s   &4z+TestConfigurationModel.test_degree_sequencec                 C   sf   dgd }t j|dd}t j|dd}t ||sJ t j|dd}t j|dd}t ||s1J dS )zZTests that each call with the same random seed generates the
        same graph.

        r        r   
   N)r   r   is_isomorphic)r   r    G1G2r	   r	   r
   test_random_seed<   s   
z'TestConfigurationModel.test_random_seedc                 C   sD   t tj tjg t d W d   dS 1 sw   Y  dS )zyTests that attempting to create a configuration model graph
        using a directed graph yields an exception.

        create_usingN)pytestraisesr   NetworkXNotImplementedr   DiGraphr   r	   r	   r
   test_directed_disallowedI   s   "z/TestConfigurationModel.test_directed_disallowedc                 C   s@   t tj tddg W d   dS 1 sw   Y  dS )zTTests that a degree sequence whose sum is odd yields an
        exception.

        r   r   N)r+   r,   r   NetworkXErrorr   r/   r	   r	   r
   test_odd_degree_sumQ   s   "z*TestConfigurationModel.test_odd_degree_sumN)
__name__
__module____qualname____doc__r   r   r!   r(   r0   r2   r	   r	   r	   r
   r      s    	"r   c                  C   sN   t tj g d} g d}t| | W d    d S 1 s w   Y  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   r1   directed_configuration_model)zinzoutr	   r	   r
   (test_directed_configuation_raise_unequalZ   s
   "r:   c                  C   s$   t jg g dd} t| dksJ d S )Nr   r   r   r7   r   r   r	   r	   r
    test_directed_configuation_modela   s   r=   c                  C   s,   t jddgddgdd} t| dksJ d S )Nr   r   r   r   r;   r<   r	   r	   r
   'test_simple_directed_configuation_modelf   s   r>   c                  C   s&   g } t | }t| i ksJ d S r   )r   expected_degree_graphdictr   )r    r   r	   r	   r
    test_expected_degree_graph_emptyk   s   
rA   c                  C   st   g d} t j| dd}t|dksJ t j| dd}t ||s"J t j| dd}t j| dd}t ||s8J 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'   r	   r	   r
   test_expected_degree_graphr   s   rD   c                  C   sL   g d} t j| ddd}t j| ddd}t ||sJ t|dks$J d S )NrB   r#   F)r   	selfloopsr"   r   r?   r%   r   rC   r	   r	   r
   $test_expected_degree_graph_selfloops   s
   rG   c                  C   sH   g d} t j| dd}t j| dd}t ||sJ t|dks"J d S )N)r$   r   r   r   r   r#   r   r   rF   rC   r	   r	   r
   test_expected_degree_graph_skew   s
   rH   c                  C   s   t g } t| dksJ g d}tt jt j| g d}tt jt j| g d}t |} t |} g d}tt jt j| g d}t |} tjt jt j|t  d d S )Nr   r#   r   r   r   r   r   r   r   r   r   r   )Ar   r   r   r   r   r   r   r   r   r   )r      r   r   r   r   r   r   )   r   rK   rK   r   r   r   r   )r$   r   r   r   r   r   r   r   r   r   r   r)   )r   havel_hakimi_graphr   r+   r,   r1   r   r.   )r   zr	   r	   r
   test_havel_hakimi_construction   s   



rO   c                  C   s  d\} }d| }t |D ]T}t| ||d  d d}tdd | D }tdd | D }t||}tdd | D }td	d | D }	t|t|ksVJ t|t|	ks`J qg d
}
g d}t	tj
jtj||
 g d}
g d}t||
}dd | D }	dd | D }t|
t|	ksJ t|t|ksJ g d}t	tj
jtj||
 g d}t	tj
jtj||
 d S )N)d   r$   g      ?r   Tc                 s   r   r   r	   r   r	   r	   r
   r      r   z-test_directed_havel_hakimi.<locals>.<genexpr>c                 s   r   r   r	   r   r	   r	   r
   r      r   c                 s   r   r   r	   r   r	   r	   r
   r      r   c                 s   r   r   r	   r   r	   r	   r
   r      r   rI   )
g   f   rR   rR   rR   rR   rR   rR   rR   rR   
r   r   r   r   r   r   r   r   r   rK   )
r   r   r   r   r   r   r   r   r   r   c                 s   r   r   r	   r   r	   r	   r
   r      r   c                 s   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   erdos_renyi_graphlist	in_degree
out_degreedirected_havel_hakimi_graphr   r+   r,   	exceptionr1   )r   rpir&   din1dout1r'   din2dout2doutdinr	   r	   r
   test_directed_havel_hakimi   s2   rd   c                  C   s~   g d} t | }t|t| ksJ tt| t| d ks#J tjt jt j| t 	 d g d} tt jt j|  d S )NrS   r   r)   r   r   r   r   r   r   r   r   r   r   rK   )
r   degree_sequence_treer   rV   edgessumr+   r,   r1   r.   )rN   r   r	   r	   r
   test_degree_sequence_tree   s   
 ri   c                  C   s8   g d} t j| dd}| tdd | D ksJ d S )N)r   r   r   r   *   r   c                 s   r   r   r	   r   r	   r	   r
   r      r   z4test_random_degree_sequence_graph.<locals>.<genexpr>)r   random_degree_sequence_graphr   r   )r   r   r	   r	   r
   !test_random_degree_sequence_graph   s   "rl   c                  C   s   g d} t tjtj|  d S )Nre   )r+   r,   r   NetworkXUnfeasiblerk   )rN   r	   r	   r
   'test_random_degree_sequence_graph_raise   s   rn   c                  C   sZ   t jdddd} dd |  D }t j|dd}dd | D }t|t|ks+J d S )NrP   g?rj   r   c                 s   r   r   r	   r   r	   r	   r
   r      r   z4test_random_degree_sequence_large.<locals>.<genexpr>c                 s   r   r   r	   r   r	   r	   r
   r      r   )r   fast_gnp_random_graphr   rk   r   )r&   d1r'   d2r	   r	   r
   !test_random_degree_sequence_large   s
   rr   )r+   networkxr   r   r:   r=   r>   rA   rD   rG   rH   rO   rd   ri   rl   rn   rr   r	   r	   r	   r
   <module>   s     T"