o
    3ήc.                     @   s   d dl Z d dlZd dlZejdd Zej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d.d/ Zd0d1 Zd2d3 ZdS )4    Nc                  C   s   t  } | jddd | jddd | 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 | S )Nar   demandbcidi      weightcapacity   
      	         nxDiGraphadd_nodeadd_edgeG r   Y/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/flow/tests/test_networksimplex.pysimple_flow_graph   s   r   c                  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	 | S Nsr   r   tr   r   r   r	   r   r   r   r   r   r   r   r   r   r   simple_no_flow_graph   s   r$   c                 C   sH   d}|  D ]}||   D ]}||| | | | | d  7 }qq|S )z1Returns flow cost calculated from flow dictionaryr   r   )keys)r   flowDictflowCostuvr   r   r   get_flowcost_from_flowdict$   s   "r*   c                 C   s6   | }t d}t|dd|ii ttjtj| d S Ninfr   r   floatr   set_node_attributespytestraisesNetworkXErrornetwork_simplexr   r   r,   r   r   r   test_infinite_demand_raise-   s   r5   c                 C   s8   | }t d}t|dd| ii ttjtj| d S r+   r-   r4   r   r   r   test_neg_infinite_demand_raise4   s   r6   c                 C   s<   | }t d}t|d|id|id ttjtj| d S )Nr,   r   )r   r   )r   r   )r.   r   set_edge_attributesr0   r1   r2   r3   r4   r   r   r   test_infinite_weight_raise;   s   r9   c                 C   .   | }t |dddii tt jt j| d S )Nr   r   r   r/   r0   r1   NetworkXUnfeasibler3   r   r   r   r   r   test_nonzero_net_demand_raiseD      r?   c                 C   s4   | }t |ddiddid tt jt j| d S )Nr   r   r   ir7   )r   r8   r0   r1   r=   r3   r>   r   r   r   test_negative_capacity_raiseJ   s   rA   c                 C   s   | }t tjtj| d S N)r0   r1   r   r=   r3   r$   r   r   r   r   test_no_flow_satisfying_demandsP   s   rD   c                 C   r:   )Nr    r   r
   r<   rC   r   r   r   test_sum_demands_not_zeroU   r@   rE   c            
      C      t  } g d}g d}g d}g d}g d}d}tt|D ]}| j|d||  d q tt|D ]}| j|| || || || d	 q4t | \}}	||ksUJ |t| |	ks^J d
S )E
    https://developers.google.com/optimization/flow/mincostflow
    )	r   r   r   r   r   r   r   r	   r
   )	r   r   r   r	   r
   r	   r
   r
   r   )	         r
   r   rH   r
   rJ   r   )	r
   r
   r   r   r   r   r	   r   r	   )rJ   r   r   r      r   r   Nr   r   rangelenr   r   r3   r*   
r   start_nodes	end_nodes
capacities
unit_costssuppliesanswerir'   r&   r   r   r   test_google_or_tools_example[       rY   c            
      C   rF   )rG   )
r   r   r   r   r   r   r   r	   r
   r	   )
r   r   r   r	   r
   r	   r
   r
   r   r   )
rH   rI   rJ   r
   r   rH   r
   rJ   r   r   )
r
   r
   r   r   r   r   r	   r   r	   r
   )   r   r   r   rK      rM   r   r   NrN   rQ   r   r   r   test_google_or_tools_example2t   rZ   r^   c                  C   sR   t jt jtd} t| }t|\}}d|ksJ dt||ks'J d S )Nznetgen-2.gpickle.bz2l   [$ )	ospathjoindirname__file__r   read_gpickler3   cost_of_flow)fnamer   r'   r&   r   r   r   
test_large   s
   
rg   c                  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 d S )Nr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   )r   r   )r   r   r   r      )r   r   r   r   r3   min_cost_flow_costr   r'   Hsolnr   r   r   test_simple_digraph   s   rm   c                  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|  d S r   )r   r   r   r   r0   r1   r=   r3   r   r   r   r   test_negcycle_infcap   s   rn   c                  C   s  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 ||ksJ d S )!Nr   r   r   r   r#   r   r   r	   er;   fghr   rr!   r   r   r"   r   r
         rM   i)r   rs   )rs   rp   )r   rq   rr   )r   rq   )r   r   )	r   r   r   r   ro   rp   rq   rr   rs   )   r   r   r   r   r3   rj   r   r   r   test_transshipment   sJ   
rx   c                  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 d S )Nr   ir   r
   r   rH   r   r   r   r	   rI   r   r   r   ru   )r   r	   r   )r	   r
   r      )r
   r   r   r   r	   r
   r   rL   )r   r   r   add_edges_fromr3   ri   rj   r   r   r   test_digraph1   s4   
r}   c                  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 dS )z+Address issue raised in ticket #617 by arv.r   r   ry   r   r	   r   r
   rM   r   )r   r   )r	   r   )r	   r
   r{   r   N)r   r   r|   nodesr3   ri   rj   r   r   r   test_zero_capacity_edges   s&   &r   c                  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 dS )zHCheck if digons are handled properly. Taken from ticket
    #618 by arv.r   r   r   r;   r	   r
   i'	 ry   r   r   -
 )r   r	   r   r   r	   i+ N)r   r   add_nodes_fromr3   )r~   edgesr   r'   rk   rl   r   r   r   
test_digon  s   

r   c                  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 )zZCheck 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   rJ   g?ry   N)
r   r   r   rO   r~   r|   r0   r1   r=   r3   r   r   r   r   test_deadend%  s   r   c                  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| dS )zNAn infinite capacity negative cost digon results in an unbounded
    instance.r   r   r   r;   r	   r
   r   ir   r   r   ry   N)r   r   r   r0   r1   NetworkXUnboundedr3   )r~   r   r   r   r   r    test_infinite_capacity_neg_digon2  s   

r   c                  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 d	S )
zMultidigraphs are acceptable.)r   r   r   )r   r	   r   r   r!   r   r   r	   r   N)r   MultiDiGraphadd_weighted_edges_fromr3   r   r'   rk   r   r   r   test_multidigraphA  s
   (r   c                  C   s   t  } | jdddd tt jt j|  d| d d d< t | \}}|dks*J |dddiiks4J t  } | jddddd | jddddd tt jt j|  d| d d d d< t | \}}|dksjJ |dddd	d
iikswJ dS )ziNegative selfloops should cause an exception if uncapacitated and
    always be saturated otherwise.
    r   rM   r!   r   r   r#   xyr   )r   r   N)r   r   r   r0   r1   r   r3   r   r   r   r   r   test_negative_selfloopsJ  s   r   c                  C   s   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 d S )Nr   r;   r   r   r   r	   r
   r#   r   )r   r   )r   r   r   r	   r
   r   rw   r   r   r   r   test_bone_shapedb  s   .r   c                  C   sR   t  } tt jt j|  t  } tt jt j|  t  } tt jt j|  d S rB   )	r   Graphr0   r1   NetworkXNotImplementedr3   
MultiGraphr   r2   r   r   r   r   test_graphs_type_exceptionsu  s   r   )r_   r0   networkxr   fixturer   r$   r*   r5   r6   r9   r?   rA   rD   rE   rY   r^   rg   rm   rn   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s<    

		)!	