o
    3ήcE                     @   s*   d dl Z d dlZd dlZG dd dZdS )    Nc                   @   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!d" Zd#d$ Zd%d& Zd'S )(TestMinCostFlowc                 C   s$  t  }|jddd |jddd |jddddd	 |jdd
ddd	 |jddddd	 |jd
dddd	 t |\}}dddddiddii d}|dksQJ t |dksZJ ||ks`J t ||ksiJ t ||dkssJ t |\}}|dksJ t ||dksJ ||ksJ d S )Nademandd   b      weightcapacityc   
      	      )r	   r   )r   r	   r   r      	nxDiGraphadd_nodeadd_edgenetwork_simplexmin_cost_flow_costmin_cost_flowcost_of_flowcapacity_scalingselfGflowCostHsoln r&   R/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/flow/tests/test_mincost.pytest_simple_digraph	   s$   z#TestMinCostFlow.test_simple_digraphc                 C   s   t  }|jddd |jddd |jd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	 tt jt j| tt jt j	| d S Nsr   r   tr   r   r   r
   r   r	   r   r   r   )
r   r   r   r   pytestraisesNetworkXUnfeasibler   NetworkXUnboundedr   r!   r"   r&   r&   r'   test_negcycle_infcap      z$TestMinCostFlow.test_negcycle_infcapc                 C      t  }|jddd |jddd |jd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	 tt jt j| tt jt j| d S )Nr*   r   r   r+   r   r   r   r
   r   r	   r,   r   r-   r   r.   	r   r   r   r   r/   r0   r1   r   r   r3   r&   r&   r'   test_sum_demands_not_zero+   r5   z)TestMinCostFlow.test_sum_demands_not_zeroc                 C   r6   r)   r7   r3   r&   r&   r'   test_no_flow_satisfying_demands8   r5   z/TestMinCostFlow.test_no_flow_satisfying_demandsc                 C   sN  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 |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 |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 |\}}ddidddddii dddddddddiddddddd	}|d ksJ t |d ksJ ||ksJ t ||ksJ t ||d ksJ t |\}}|d ksJ t ||d ksJ ||ks%J d S )!Nr   r   r   r	   r.   r   r   r
   efghr   rr,   r   r   r-   r   r         i)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_transshipmentE   sX   
z"TestMinCostFlow.test_transshipmentc                 C   sP  t  }|jdddd |jddddd |jdddd	 |jd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iddii d}t j|ddddd}||ks[J t j||dddksgJ |jdddd	 t j|ddd\}}|dd |dksJ |d d dksJ |d d= ||ksJ t j||dddksJ d S )Nr*   r   r   )	bandwidthr   r   )rF   costr	   )rG   r      r@   r+   r   r   rC   )r*   r   r	   r   r   r+   rF   rG   r   r   r,   Z   if)r   r   r   max_flow_min_costr   r   remove_edge)r!   r"   r%   flowr#   r&   r&   r'   test_max_flow_min_costu   s2   
z&TestMinCostFlow.test_max_flow_min_costc                 C   s~  t  }|jddd |jddd |jddd |dddddfdd	d
ddfdd	ddifdddddfdddddfd	ddddfd	ddd	dfddddifdd	dddfg	 t |\}}dd
dd
ddddddddid	did}|dks~J t |dksJ ||ksJ t ||ksJ t ||dksJ t |\}}|dksJ ||ksJ t ||dksJ d S )Nr   ir   r   r      r   rI   r
   rH   r   r   r   rA   )r   r
   r   )r
   r   r      )r   r   r   r   r
   r   r      )	r   r   r   add_edges_fromr   r   r   r   r   r    r&   r&   r'   test_digraph1   s@   
zTestMinCostFlow.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
d |jddddd |jdd
ddd |jddddd |jddd
d
d |jddddd |jddddd |jd
ddd
d |jddddd |jd
ddd |jdddd |jdddd t |dd}dddddd
ddddiddddddddiddddi d}||ksJ |jdddd t |\}}|dd |d d dksJ |dksJ |d d= ||ksJ t ||dksJ d S ) Nr*   r   rA   r   r   r   r
      rQ   r   rI   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+   rK   r,       iA   )r   r   r   rL   r   rM   r   )r!   r"   rN   r%   r#   r&   r&   r'   test_digraph2   sF   




zTestMinCostFlow.test_digraph2c                 C   s  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d
d |dd	 |d d	 d
dd 	 t j|dd	ddd}tdd |d  D }d|ksJ dt j||ddksJ |d dddksJ |d dddksJ |d dd
dksJ |d	 i ksJ |d	d |d	 d ddi t j|ddd\}}|	d	d tdd |d  D }d|ksJ |d	 d dksJ |dks	J |d	 d= |d dddksJ |d dddks&J |d dd
dks2J |d	 i ks;J t j||dddksHJ dS )zCombinatorial Optimization: Algorithms and Complexity,
        Papadimitriou Steiglitz at page 140 has an example, 7.1, but that
        admits multiple solutions, so I alter it a bit. From ticket #430
        by mfrasca.r*   r   r   r   )r   r   r	   r   r   r+   r
   r   rI   c                 s       | ]}|V  qd S Nr&   .0vr&   r&   r'   	<genexpr>       z0TestMinCostFlow.test_digraph3.<locals>.<genexpr>   r,   r   r	   )r	   r+   )r   r+   rK   c                 s   r`   ra   r&   rb   r&   r&   r'   re     rf   iN)
r   r   r   updaterL   sumvaluesr   r   rM   )r!   r"   solrN   r#   r&   r&   r'   test_digraph3   sH   
zTestMinCostFlow.test_digraph3c                 C   s`  t  }|dddddfdddddfdddddfdddddfdddddfdddddfdddddfg d|jd d	< d|jd d	< d|jd d	< t |\}}ddd
dddddii dddd}|dksoJ t |dksxJ ||ks~J t ||ksJ t ||dksJ t |\}}|dksJ ||ksJ t ||dksJ dS )z+Address issue raised in ticket #617 by arv.r   r   rI   r   r
   r   r   rB   r   )r   r   )r
   r   )r
   r   rR   r   N)	r   r   rT   nodesr   r   r   r   r   r    r&   r&   r'   test_zero_capacity_edges  s2   &z(TestMinCostFlow.test_zero_capacity_edgesc                 C   s$  di fdddifdddifg}dddddfdddd	dfddd
ddfdddd	dfg}t |}|| t |\}}dd	id	dddd	id}|dksQJ t |dksZJ ||ks`J t ||ksiJ t ||dkssJ t |\}}|dksJ ||ksJ t ||dksJ dS )zLCheck if digons are handled properly. Taken from ticket
        #618 by arv.r   r   r   r;   r
   r   i'	 rI   r   r   -
 )r   r
   r\   i+ N)r   r   add_nodes_fromr   r   r   r   r   )r!   rn   edgesr"   r#   r$   r%   r&   r&   r'   
test_digon.  s&   

zTestMinCostFlow.test_digonc                 C   s`   t  }|jtddd d|jd d< d|jd d< |jg d	d
dd tt jt j	| dS )z^Check if one-node cycles are handled properly. Taken from ticket
        #2906 from @sshraven.r   r   r   ir   r      r
   ))r   r   )r   r
   )r   r   r[   g?rI   N)
r   r   rq   rangern   rT   r/   r0   r1   r   r3   r&   r&   r'   test_deadendG  s   zTestMinCostFlow.test_deadendc                 C   s   di fdddifdddifg}ddddifdddd	ifddd
ddfdddd	dfg}t |}|| tt jt j| tt jt j| dS )zRAn infinite capacity negative cost digon results in an unbounded
        instance.r   r   r   r;   r
   r   r   ir   r   rp   rI   N)r   r   rq   r/   r0   r2   r   r   )r!   rn   rr   r"   r&   r&   r'    test_infinite_capacity_neg_digonS  s   

z0TestMinCostFlow.test_infinite_capacity_neg_digonc                 C   s   t  }|jddddd |jddddd d}t ||ks!J t |\}}|dks.J |ddiddidks;J t ||dksEJ dS )	zoThe digon should receive the maximum amount of flow it can handle.
        Taken from ticket #749 by @chuongdo.r   r	   r   rB   rI   r.   rh   N)r   r   r   r   r   r   )r!   r"   min_costr#   r$   r&   r&   r'   test_finite_capacity_neg_digonb  s   z.TestMinCostFlow.test_finite_capacity_neg_digonc                 C   s   t  }|jddgdd t |\}}|dksJ |dddiidddiii dks,J t |\}}|dks9J |dddiidddiii dksKJ d	S )
zMultidigraphs are acceptable.)r   r   r   )r   r
   r   r   r,   r   r   r
   r\   N)r   MultiDiGraphadd_weighted_edges_fromr   r   r!   r"   r#   r$   r&   r&   r'   test_multidigraphp  s   $(z!TestMinCostFlow.test_multidigraphc                 C   sx  t  }|jdddd tt jt j| tt jt j| d|d d d< t |\}}|dks3J |dddiiks=J t |\}}|dksJJ |dddiiksTJ t  }|jddddd |jddddd tt jt j| tt jt j| d|d d d d< t |\}}|dksJ |dddd	d
iiksJ t |\}}|dksJ |dddd	d
iiksJ dS )zqNegative selfloops should cause an exception if uncapacitated and
        always be saturated otherwise.
        r   rB   r,   r   r   r.   xyr   )r~   r   N)	r   r   r   r/   r0   r2   r   r   rz   r|   r&   r&   r'   test_negative_selfloops|  s.   z'TestMinCostFlow.test_negative_selfloopsc                 C   s8  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d
 |jdddd
 |jdddd
 |jd	ddd
 |jdddd
 t |\}}|dkscJ |ddddi i i ddiddidksxJ t |\}}|dksJ |ddddi i i ddiddidksJ d S )Nr   r;   r   r   r   r
   r   r.   r   rV   r\   )r   r   r   r
   r   r   )r   r   r   r   r   r   r|   r&   r&   r'   test_bone_shaped  s$   *.z TestMinCostFlow.test_bone_shapedc                 C   s  t  }tt jt j| tt jt j| t  }tt jt j| tt jt j| t  }tt j	t j| tt j	t j| |j
dtdd tt j	t j| tt jt j| d|jd d< |j
ddd |jddtd d tt j	t j| tt jt j| d|d d d< |jddtdd tt j	t j| d|d d d< d|d d d	< tt jt j| d|d d d	< d|d d d	< tt jt j| d S )
Nr   infr   r   r   r,   r   rB   r   )r   Graphr/   r0   NetworkXNotImplementedr   r   
MultiGraphr   NetworkXErrorr   floatr1   rn   r   r3   r&   r&   r'   test_exceptions  s4   zTestMinCostFlow.test_exceptionsc                 C   s   t jt jtd}t|}t|\}}d|ksJ dt||ks'J t	|\}}d|ks4J dt||ks>J d S )Nznetgen-2.gpickle.bz2l   [$ )
ospathjoindirname__file__r   read_gpickler   r   r   )r!   fnamer"   r#   flowDictr&   r&   r'   
test_large  s   
zTestMinCostFlow.test_largeN)__name__
__module____qualname__r(   r4   r8   r9   rE   rO   rU   r_   rm   ro   rs   rv   rw   ry   r}   r   r   r   r   r&   r&   r&   r'   r      s(    0')-r   )r   r/   networkxr   r   r&   r&   r&   r'   <module>   s    