o
    3ήcI                     @   s   d Z ddlZddlZddlmZmZmZmZm	Z	m
Z
mZ eee	e
ehZejejhZejejhZee@ Zee@ Zdd Zdd Zdd	 ZdddZG dd dZG dd dZdd Zdd Zdd ZG dd dZdS )z$Maximum flow algorithms test suite.
    N)boykov_kolmogorovbuild_flow_dictbuild_residual_networkdinitzedmonds_karppreflow_pushshortest_augmenting_pathc                    sH   |\}t  } fdd|D D ]\}|fdd|D  q|S )Nc                 3   s    | ]	}| | fV  qd S N .0nGr
   R/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/flow/tests/test_maxflow.py	<genexpr>    s    z!compute_cutset.<locals>.<genexpr>c                 3   s     | ]}| v r|fV  qd S r	   r
   )r   v)non_reachableur
   r   r   !       )setupdate)r   	partition	reachablecutsetnbrsr
   )r   r   r   r   compute_cutset   s
   r   c                 C   s0  d|j  }t| t|ksJ || D ]}t| | t|| ks&J |qdd |D }	|D ]9}||  D ]0\}
}|| | |
 v rP|| | |
 | ksPJ |dksXJ ||	|  |8  < |	|
  |7  < q8q0|	 D ]'\}}||kr|| ksJ |qn||kr||ksJ |qn|dksJ |qnd S )NAssertion failed in function: c                 S   s   i | ]}|d qS )r   r
   )r   r   r
   r
   r   
<dictcomp>*   s    z"validate_flows.<locals>.<dictcomp>r   )__name__r   items)r   stflowDict	solnValuecapacity	flow_funcerrmsgr   excessr   flowexcr
   r
   r   validate_flows%   s(   "r+   c           
         s   d|j  }t fdd|d D sJ |t fdd|d D s(J |t |}t fdd|D s<J ||t fdd|D ksNJ |  }	|	|   sft|	rdJ |d S t	|	roJ |d S )	Nr   c                 3       | ]}| v V  qd S r	   r
   r   r   r
   r   r   =       z validate_cuts.<locals>.<genexpr>r   c                 3   r,   r	   r
   r   r   r
   r   r   >   r-      c                 3   s     | ]\}}  ||V  qd S r	   )has_edger   r   r   r   r
   r   r   @   r   c                 3   s$    | ]\}} | |  V  qd S r	   r
   r0   r   r%   r
   r   r   A   s   " )
r   allr   sumcopyremove_edges_fromis_directednxis_connectedis_strongly_connected)
r   r!   r"   r$   r   r%   r&   r'   r   Hr
   r1   r   validate_cuts;   s   ""
$
r;   r%   c              	   C   s   t D ]A}d|j }|| |||}|jd }	t| |}
|	|ks#J |t| |||
||| tj| ||||d\}}t| |||||| qd S )Nr   
flow_value)r%   r&   )
flow_funcsr   graphr   r+   r7   minimum_cutr;   )r   r!   r"   	solnFlowsr$   r%   r&   r'   Rr<   	flow_dict	cut_valuer   r
   r
   r   compare_flows_and_cutsJ   s   



rD   c                   @   s   e 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!S )"TestMaxflowMinCutCommonc                 C   s>   t  }|jdddd ddiddid}t|dd|d d S )Nr.            ?r%   r.   rF   r7   Graphadd_edgerD   selfr   r@   r
   r
   r   test_graph1[   s   z#TestMaxflowMinCutCommon.test_graph1c              	   C   s   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 |jdddd |j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|dd|d
 d S )Nxa      @rH   brG   c      @d      @e       @y   r.   rQ   rS   )rT   rP   rF   )rT   rV   rP   )rQ   rS   rZ   )rS   rX   )rV   rZ   )rT   rX   rP   rQ   rS   rT   rV   rX   rZ   rJ   rN   r   r:   r
   r
   r   test_graph2d   s$   


z#TestMaxflowMinCutCommon.test_graph2c                 C   s   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d
ddii d}t|dd|d d S )NrQ   rS   g     @@rH   rT   rG   rV   rS   rT   r   rT   rV   )rQ   rS   rT   rV   g     @@r7   DiGraphrL   rD   r^   r
   r
   r   test_digraph1}   s   z%TestMaxflowMinCutCommon.test_digraph1c                 C   s   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 dd
ddd
idd
iddid	dii d}t|dd	|d d S )Nr!   rS   rF   rH   rT   r.   rV   rQ   r"   r   r`   )r!   rT   rV   rS   rQ   r"   rb   r^   r
   r
   r   test_digraph2   s   	z%TestMaxflowMinCutCommon.test_digraph2c                 C   s   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 |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ddd
dddddddi d}t|dd|d d S )Nr!   v1g      0@rH   v2g      *@g      $@rW   v3g      (@g      "@v4g      ,@g      @r"   g      4@g      &@)rf   rg   r   )rf   ri   )rg   rh   g      3@)rg   r"   )rh   r"   )r!   rg   rf   rh   ri   r"   g      7@rb   r^   r
   r
   r   test_digraph3   s&   	z%TestMaxflowMinCutCommon.test_digraph3c                 C   s   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 |jdddd |jdddd dddddidddddiddiddii d}t|dd|d d S )NrP   rQ   rR   rH   rS   rG   rT   rU   rV   rW   rX   rY   rZ   r\   r   ra   r]   rb   r^   r
   r
   r   test_digraph4   s$   
z%TestMaxflowMinCutCommon.test_digraph4c                 C   s   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 |jdd
dd |jdddd |jdd
dd dddddd	id
d	iddddd	di d}t|dd
|d d S )Nr!   r.   
   rH   rF   r[         	   r"      r   )rF   r[   rm      )r[   r"   rI   )r.   rF   r[   rm   r!   r"      rb   rM   r
   r
   r   test_wikipedia_dinitz_example   s$   
	z5TestMaxflowMinCutCommon.test_wikipedia_dinitz_examplec                 C   s   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 |jdddd |jdddd dddddidddddiddiddii d}d}d}d}t|||||dd d S )NrP   rQ   rR   )spamrS   rG   rT   rU   rV   rW   rX   rY   rZ   r\   r   ra   r]   rt   rH   rb   )rN   r   r@   r$   r!   r"   r
   r
   r   test_optional_capacity   s*   	z.TestMaxflowMinCutCommon.test_optional_capacityc                 C   s>  t  }|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dd
dddid	dii d}t|dd	|d t  }|jdddd |jdddd |dd |dd |jdddd |jdd	d
d |jdd	dd ddddd
ddddddii d}t|dd	|d d S )Nr!   rQ   rS      rH   rT         r"   <   U   r\   )rT   r"   %   r!   rQ   rS   rT   r"   a   r   rQ   r"   )r!   rQ   rT   rS   r"   rb   r^   r
   r
   r   test_digraph_infcap_edges	  s:   z1TestMaxflowMinCutCommon.test_digraph_infcap_edgesc                 C   s~   t  }|dd |jdddd |dd |jdddd |jddd	d |dd tD ]}tt j||dd q0d S )
Nr!   rQ   rS   rv   rH   rT   rx   r"   ry   )r7   rc   rL   	all_funcspytestraisesNetworkXUnboundedrN   r   r&   r
   r
   r   test_digraph_infcap_path1  s   z0TestMaxflowMinCutCommon.test_digraph_infcap_pathc                 C   s   t  }|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ddd
ddddddddd
ddd}t|dd	|d d S )Nr!   rQ   rS   rv   rH   rT   rw   rx   r"   ry   rz   r\   )rT   r!   r"   )rT   r!   r{   )rQ   rS   r"   )rQ   rT   r|   r}   rJ   r^   r
   r
   r   test_graph_infcap_edges>  s   

z/TestMaxflowMinCutCommon.test_graph_infcap_edgesc                 C   s   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 ddd
dd	ddddi d}t|dd|d d S )Nr!   rQ   rF   rH   rS   rq   r"   r.   r[   )rS   r"   r   r~   r\   )rQ   rS   r!   r"   rm   rb   rN   r   flowSolnr
   r
   r   test_digraph5R  s   z%TestMaxflowMinCutCommon.test_digraph5c                 C   sb   t  }|jg ddd |d t |dddksJ i ddiddid}t|dd|d d S )	N)r   r.   r.   )r.   rF   r.   )rF   r[   r.   r%   weightr.   r   r[   rF   )r   rF   r[   )r7   rK   add_weighted_edges_fromremove_nodemaximum_flow_valuerD   r   r
   r
   r   test_disconnectedc  s   
z)TestMaxflowMinCutCommon.test_disconnectedc                 C   s   t  }|jg ddd |d tD ]}tt j||dd q|jg ddd |d tD ]}tt j||dd q1d S )Nr   r%   r   r   r[   )r7   rK   r   r   r   r   r   NetworkXErrorr   r
   r
   r   test_source_target_not_in_graphk  s   

z7TestMaxflowMinCutCommon.test_source_target_not_in_graphc                 C   s4   t  }|d tD ]}tt j||dd qd S )Nr   )r7   rK   add_noder   r   r   r   r   r
   r
   r   test_source_target_coincidev  s
   
z3TestMaxflowMinCutCommon.test_source_target_coincidec                 C   sD   t  }t  }|jddgdd tD ]}tt j||dd qd S )N)r   r.   )r.   r   TrH   r   )r7   
MultiGraphMultiDiGraphadd_edges_fromr   r   r   r   )rN   r   Mr&   r
   r
   r   test_multigraphs_raise|  s   z.TestMaxflowMinCutCommon.test_multigraphs_raiseN)r   
__module____qualname__rO   r_   rd   re   rj   rk   rs   ru   r   r   r   r   r   r   r   r   r
   r
   r
   r   rE   Z   s"    	(rE   c                   @   sD   e 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S )TestMaxFlowMinCutInterfacec                 C   s   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 |jdddd |jdddd || _t  }|jdddd |jdddd || _d S )NrP   rQ   rR   rH   rS   rG   rT   rU   rV   rW   rX   rY   rZ   r   r.   rF   )r7   rc   rL   r   r:   r^   r
   r
   r   setup_method  s   
z'TestMaxFlowMinCutInterface.setup_methodc              
   C   sp   ddh dg}t  }|jg ddd tD ]}|D ]}tjt j||dd|d	 tjt j||dd|d	 qqd S )
Nthis_should_be_callablerl   >   r.   rF   r[   r   r%   r   r   r.   r&   )r7   rK   r   interface_funcsr   r   r   )rN   elementsr   r&   elementr
   r
   r   test_flow_func_not_callable  s   z6TestMaxFlowMinCutInterface.test_flow_func_not_callablec                 C   sf   | j }d}tD ])}tD ]$}d|j d|j }||dd|d}|tv r'|d }||ks/J |qqd S )NrR   r    in interface rP   rZ   r   r   )r   r   r=   r   max_min_funcs)rN   r   fvinterface_funcr&   r'   resultr
   r
   r   test_flow_func_parameters  s   
z4TestMaxFlowMinCutInterface.test_flow_func_parametersc              
   C   sL   | j }tD ]}tjtjtj|dd|dd tjtjtj|dd|dd qd S )NrP   rZ   rG   r&   cutoff)r   r=   r   r   r7   r   r?   minimum_cut_valuer   r
   r
   r   test_minimum_cut_no_cutoff  s*   	z5TestMaxFlowMinCutInterface.test_minimum_cut_no_cutoffc           	      C   s   | j }d}ttddfttddff}tD ]/}|D ]*\}}d|j d|j }||dd	fd
|i|}|tv r;|d }||ksCJ |qqd S )NrG   T	two_phaserq   global_relabel_freqr   r   r   rF   r&   )r:   r   dictr   r   r   r   )	rN   r   r   to_testr   r&   kwargsr'   r   r
   r
   r   test_kwargs  s"   
z&TestMaxFlowMinCutInterface.test_kwargsc              	   C   s,   | j }tD ]}tjtj||dddd qd S )Nr   r.   rF   r   )r:   r   r   r   r7   r   )rN   r   r   r
   r
   r   test_kwargs_default_flow_func  s   z8TestMaxFlowMinCutInterface.test_kwargs_default_flow_funcc              
   C   s   | j }d}d\}}t|d}tD ]1}tD ],}d|j d|j }tdD ]}	||dd||d	}
|tv r7|
d
 }
||
ks?J |q$qqd S )NrR   )rP   rZ   r%   r   r   r[   rP   rZ   )r&   residualr   )r   r   r   r=   r   ranger   )rN   r   r   r!   r"   rA   r   r&   r'   ir   r
   r
   r   test_reusing_residual  s(   


z0TestMaxFlowMinCutInterface.test_reusing_residualN)
r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r     s    	r   c                  C   sV   t  } | jdddd t| ddd d}|jd dksJ tjt jt| dddd d S )Nr.   rF   rH   r   r<   )r7   rc   rL   r   r>   r   r   r   r   rA   r
   r
   r   %test_preflow_push_global_relabel_freq  s
   r   c                  C   sV   t  } t j| g ddd t j| g ddd t| dddd}|jd	 dks)J d S )
N)r   r.   r[   r.   rH   )r.   rF   r[   r   r[   F)
value_onlyr<   )r7   rc   add_pathr   r>   r   r
   r
   r   $test_preflow_push_makes_enough_space  s
   r   c                     s   d} d}t  }t| D ]) |jd dfdd t j| fddt|D dd |j |d fd	dd qt|dd	d
d}|jd | ksGJ t|dd	dd}|jd | ksXJ d S )Nrq     r!   r   r.   rH   c                 3       | ]} |fV  qd S r	   r
   r   jr   r
   r   r     r-   z:test_shortest_augmenting_path_two_phase.<locals>.<genexpr>r"   Tr   r<   F)r7   rc   r   rL   r   r   r>   )kpr   rA   r
   r   r   'test_shortest_augmenting_path_two_phase  s   "r   c                   @   s   e Zd Zdd Zdd ZdS )
TestCutoffc                    s  d}d}t  }t|D ]) |jd dfdd t j| fddt|D dd |j |d	 fd
dd qt|dd
d|d}||jd   krOd| ksRJ  J t|dd
d|d}||jd   krkd| ksnJ  J t|dd
|d}||jd   krd| ksJ  J t|dd
|d}||jd   krd| ksJ  J t	|dd
|d}||jd   krd| ksJ  J d S )Nrq   r   r!   r   rF   rH   c                 3   r   r	   r
   r   r   r
   r   r     r-   z)TestCutoff.test_cutoff.<locals>.<genexpr>r.   r"   T)r   r   r<   F)r   )
r7   rc   r   rL   r   r   r>   r   r   r   )rN   r   r   r   rA   r
   r   r   test_cutoff  s"   "&&&&*zTestCutoff.test_cutoffc              	   C   sr   t d}t |dd | D d ttttfD ]}dD ]}t j|dd||d}||ks5J d	|j	 qqd S )
Nrq   c                 S   s   i | ]	\}}||fd qS )r.   r
   r0   r
   r
   r   r   %  s    z9TestCutoff.test_complete_graph_cutoff.<locals>.<dictcomp>r%   )r[   rF   r.   r   rm   r   zcutoff error in )
r7   complete_graphset_edge_attributesedgesr   r   r   r   r   r   )rN   r   r&   r   r   r
   r
   r   test_complete_graph_cutoff#  s   

z%TestCutoff.test_complete_graph_cutoffN)r   r   r   r   r   r
   r
   r
   r   r     s    r   rH   )__doc__r   networkxr7   networkx.algorithms.flowr   r   r   r   r   r   r   r=   maximum_flowr?   r   r   r   flow_value_funcsr   r   r   r+   r;   rD   rE   r   r   r   r   r   r
   r
   r
   r   <module>   s4    $
  ,l	