o
    3ήc<                     @   s,  d dl Zd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZ 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%d9d0d1Z&	d:d3d4Z'd;d5d6Z(d7d8 Z)dS )<    N)k_edge_augmentation)_unpack_available_edgescollapsecomplement_edgesis_k_edge_connectedis_locally_k_edge_connectedpairwise   c                  C   s2   g d} g d}t tjdd | | D  }|S )N))   r
         r   r   )         r   )   	   
   r   )            r   )            r   r   ))r   r   )r   r   )r   r   c                 s   s    | ]}t |V  qd S Nr   ).0path r   d/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/connectivity/tests/test_edge_augmentation.py	<genexpr>$       z&tarjan_bridge_graph.<locals>.<genexpr>)nxGraphitchain)ccsbridgesGr   r   r    tarjan_bridge_graph   s   r*   c                     s   t  } | g d | g d ddh}td ttt| | } fdd|D }t	| dd	 t	| d|d
 t	| d|dd t
| |dd d S )N)	r   r
   r   r   r   r   r   r   r   ))r   r   )r   r
   r
   r   )r   r   )r   r   r   c                    s"   g | ]\}}||d    ifqS )costrandomr   uvrngr   r    
<listcomp>/   s   " z#test_weight_key.<locals>.<listcomp>r   kr6   availr,   )r6   r8   weightr9   )r#   r$   add_nodes_fromadd_edges_fromr.   Randomlistsetr   _augment_and_check_check_augmentations)r)   
impossibleavail_uvr8   r   r2   r    test_weight_key(   s   
rD   c                   C   sJ   t jtjtt dd t jtjtt dd t jttt dd d S )Nr   r5   )	pytestraisesr#   NetworkXNotImplementedr   DiGraph
MultiGraph
ValueErrorr$   r   r   r   r    +test_is_locally_k_edge_connected_exceptions8   s   rK   c                  C   s   t dd} t| ddsJ t| ddrJ t  } | ddg t| ddr)J t| ddr1J t d} t| dds>J t| ddsFJ t| ddsNJ t| d	dsVJ d S )
Nr   r   r   r5   r
   r   r   r   r   )r#   barbell_graphr   r$   r;   complete_graphr)   r   r   r    test_is_k_edge_connected>   s   
rO   c                   C   sV   t jtjtt dddd t jtjtt dddd t jttt dddd d S )Nr   r
   r   r5   )	rE   rF   r#   rG   r   rH   rI   rJ   r$   r   r   r   r    #test_is_k_edge_connected_exceptionsO   s   rP   c                  C   sb   t dd} t| ddddsJ t| ddddrJ t  } | ddg t| ddddr/J d S )Nr   r   r   r   r   r5   r
   )r#   rL   r   r$   r;   rN   r   r   r     test_is_locally_k_edge_connected^   s   rQ   c                  C   s   t  } t| td d d S )Nr
   max_k)r#   r$   rA   MAX_EFFICIENT_KrN   r   r   r    test_null_graphh   s   rU   c                  C   s.   t ddD ]} t| }t|td d qd S Nr   r   r
   rR   )ranger#   rM   rA   rT   nr)   r   r   r    test_cliquesm   s   
rZ   c                  C   s<   t ddD ]} t| }|| d  t|td d qd S rV   )rW   r#   rM   add_noderA   rT   rX   r   r   r    test_clique_and_nodes   s
   
r\   c                  C   s&   t  } | d t| td d d S )Nr   r
   rR   )r#   r$   r[   rA   rT   rN   r   r   r    test_point_graphz   s   
r]   c                  C   s"   t  } | g d t|  d S )N)r   r
   r   r   )r#   r$   r;   rA   rN   r   r   r    test_edgeless_graph   s   r^   c                  C   s8   t  } tttt| dd tttt| dd d S )Nr5   r   )r#   r$   rE   rF   rJ   r>   r   rN   r   r   r    test_invalid_k   s   r`   c               	   C   s   t  } ttjtt| dg d ttjtt| dg d ttjtt| ddgd tt| ddgdd}|dgks=J t| g td d t| dgtd d d S )Nr   r7   r
   )r   r   T)r6   r8   partial)r8   rS   )	r*   rE   rF   r#   NetworkXUnfeasibler>   r   rA   rT   )r)   	aug_edgesr   r   r    test_unfeasible   s   rd   c                  C   st   t  } tt| ddd }td| t|dksJ g d}tt| |ddd }t|dks3J t| | d S )	Nr
   r5   r   aug_edges = r   )
)r   r   )r   r   )r
   r   )r   r   )r   r   )r   r   r+   )r   r   )r   r   )r   r   )r8   r6   r   )r*   r?   r@   printlenrA   )r)   rc   r8   r   r   r    test_tarjan   s   rh   c                  C   sR   g d} | D ] }t jd|dd}t t j||d}|t | t| qd S )N)i  i  i  i     i  )seedtriesrj   )r#   random_powerlaw_tree_sequencer$   configuration_modelremove_edges_fromselfloop_edgesrA   )seedsrj   deg_seqr)   r   r   r    test_configuration   s   
rs   c                  C   s2   dg} | D ]}ddg}t j||d}t| qd S )Nr   )r   F   g?)r   (   g333333?rl   )r#   random_shell_graphrA   )rq   rj   constructorr)   r   r   r    
test_shell   s   
rx   c                  C   s   t  } t|  d S r   )r#   karate_club_graphrA   rN   r   r   r    test_karate   s   rz   c                  C   s:   t d} t|  t d} t|  t d} t|  d S )Nr   r   r   )r#   
star_graphrA   rN   r   r   r    	test_star   s   


r|   c                  C   sT   t dd} t|  t dd} t|  t dd} t|  t dd} t|  d S )Nr   r   r
   r   r   )r#   rL   rA   rN   r   r   r    test_barbell   s   r}   c                  C   s   t g d} t|  d S )N))Y	    )r~   }
  )r   r   )i  r   )r#   r$   rA   rN   r   r   r    test_bridge   s   r   c                     s>   t d tjdddd}  fddt| D }t| | d S )Nr      g{Gzt?rl   c                    s.   i | ]\}}   d k r||fd    qS )g      ?r   r-   r/   r2   r   r    
<dictcomp>   s
    z)test_gnp_augmentation.<locals>.<dictcomp>)r.   r=   r#   gnp_random_graphr   rA   )r)   r8   r   r2   r    test_gnp_augmentation   s   

r   c                    s   durt fdd|D sJ dttttt|}ttttt|}t|t|ks3J dtdd |D r@J dt fdd|D rOJ d	dS )
z0Checks that aug_edges are consistently formattedNc                 3   s    | ]}| v V  qd S r   r   r   e
avail_dictr   r    r!      s    
z._assert_solution_properties.<locals>.<genexpr>z4when avail is specified aug-edges should be in availzedges should be uniquec                 s   s    | ]	\}}||kV  qd S r   r   r/   r   r   r    r!     s    zshould be no self-edgesc                 3   s     | ]\}}  ||V  qd S r   )has_edger/   rN   r   r    r!   
  s    
z(aug edges and G.edges should be disjoint)allr?   maptuplesortedr>   rg   any)r)   rc   r   
unique_augr   )r)   r   r    _assert_solution_properties   s   

r   Fc                    s\  |du rzt | }W n t jy   d}Y nw i }zL|dur+ttt||d  nd z t j| |||d}t|tr@J dg }	|D ]}
|		|
 qDW n t j
y   d}d|d< t|	dkseJ d|du r||  }||ks{J d	| d
| n+|du r|  }|   zt |}W n t jy   d}Y nw ||k sJ dtt j| ||d|d}t||d<  du rt|tt| ksJ dn*t dkr|  }|| t |}|t   t |}||ksJ d|}	Y nw d}t|	}|durt fdd|	D }n|}||d< ||d< |  }||	 zt |}W n t jy9   d}Y nw ||d< |sU||k rU|d |ksUJ d| d|d |ks`J dt| |	  W n3 ty   d|d< tdt|    tdt|    tdt|	  td|   w |rtd|  |rd}	|	|fS )zP
    Does one specific augmentation and checks for properties of the result
    Nr   r:   )r6   r9   r8   zshould always return an iterT
infeasiblez*should not generate anything if unfeasiblez=unconstrained cases are only unfeasible if |V| <= k. Got |V|=z and k=zWavail should only be unfeasible if using all edges does not achieve k-edge-connectivity)r6   r9   ra   r8   n_partial_edgesz5unweighted partial solutions should be the complementz,adding more edges should not increase k-connFc                 3   s    | ]} | V  qd S r   r   r   r   r   r    r!   d  r"   z%_augment_and_check.<locals>.<genexpr>total_weight	num_edgesaug_kz"connectivity should increase to k=z or morez+augmenting should never reduce connectivityfailedzedges = znodes = re   zinfo  = )r#   edge_connectivityNetworkXPointlessConceptdictzipr   r   
isinstancer>   appendrb   rg   number_of_nodescopyr<   keysr?   r   sumr   	Exceptionrf   edgesnodes)r)   r6   r8   r9   verboseorig_k	max_aug_kinfo	generatorrc   edger   n_nodes	G_aug_allpartial_edgesHpartial_conn	full_connr   r   G_augr   r   r   r    r@     s   




7

r@   c              
   C   s&  zt | }W n t jy   d}Y nw |dur=t||dd }|  }|| zt |}W n t jy<   d}Y nw |  d }|du rLtd|}dd t| D }	|rt	d t	d	|   t	d
| 
  t	d| t	d| t	d| td|d D ]}
|rt	d t	d|
  |rt	d t| |
||d\}}|rt	d t| |
|	|||  d d\}}|dur|rt	d t| |
|||||d\}}|dur|
dkr|d |d ksJ |
dkr|dkr|d |d d ksJ n|d |d d ksJ t| | qdS )zCHelper to check weighted/unweighted cases with multiple values of kr   Nr:   r   r   c                 S   s   i | ]}|d qS r   r   r   r   r   r    r     s    z(_check_augmentations.<locals>.<dictcomp>z
=== CHECK_AUGMENTATION ===zG.number_of_nodes = zG.number_of_edges = zmax_k = zmax_aug_k = z	orig_k = z---------------zChecking k = zunweighted case)r6   r   r   zweighted uniform case)r6   r8   r   r   r   zweighted case)r6   r8   r9   r   r   r   r   r
   r   )r#   r   r   r   r   r<   r   minr   rf   number_of_edgesrW   r@   $_check_unconstrained_bridge_property)r)   r8   rS   r9   r   r   all_aug_edgesr   r   avail_uniformr6   
aug_edges1info1
aug_edges2info2
aug_edges3info3r   r   r    rA     s   









rA   c           	      C   s   dd l }ttj| }t| |}tdd | D }tdd | D }|| dkrB||d | }|d }||ksDJ dd S d S )	Nr   c                 S      g | ]
\}}|d kr|qS r   r   r   rY   dr   r   r    r4         z8_check_unconstrained_bridge_property.<locals>.<listcomp>c                 S   r   )r   r   r   r   r   r    r4     r   r   r
   r   z8augmentation size is different from what theory predicts)	mathr>   r#   connectivitybridge_componentsr   rg   degreeceil)	r)   r   r   
bridge_ccsCpqsize_targetsize_augr   r   r    r     s   
r   r   )NNFNN)NNNF)*	itertoolsr%   r.   rE   networkxr#    networkx.algorithms.connectivityr   2networkx.algorithms.connectivity.edge_augmentationr   r   r   r   r   networkx.utilsr	   rT   r*   rD   rK   rO   rP   rQ   rU   rZ   r\   r]   r^   r`   rd   rh   rs   rx   rz   r|   r}   r   r   r   r@   rA   r   r   r   r   r    <module>   sD    

	



}V