
    VhE                     @    d dl Z d dlZd dlZd dlZd dlZ G d d      Zy)    Nc                   ~    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestMinCostFlowc                    t        j                         }|j                  dd       |j                  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diddii d}|dk(  sJ t        j
                  |      dk(  sJ ||k(  sJ t        j                  |      |k(  sJ t        j                  ||      dk(  sJ t        j                  |      \  }}|dk(  sJ t        j                  ||      dk(  sJ ||k(  sJ y )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solns        [/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/flow/tests/test_mincost.pytest_simple_digraphz#TestMinCostFlow.test_simple_digraph   sT   JJL	

3r
"	

3q
!	

3A
2	

3A
3	

3A
2	

3A
2((+!1%S!HC8"M2~~$$Q'2---Dyy"d***q!$***))!,!2~~q!$***Dyy    c                 8   t        j                         }|j                  dd       |j                  dd       |j                  dddd	       |j                  dd
d       |j                  ddd       |j                  d
dd       |j                  ddd       |j                  dddd	       t	        j
                  t         j                  t         j                  |       t	        j
                  t         j                  t         j                  |       y Nsr   r   tr   r   r   r   r   r   r   r   r
   )
r   r   r   r   pytestraisesNetworkXUnfeasibler   NetworkXUnboundedr"   r$   r%   s     r)   test_negcycle_infcapz$TestMinCostFlow.test_negcycle_infcap    s    JJL	

3r
"	

3q
!	

3A
2	

3A
&	

3B
'	

3A
&	

3B
'	

3A
2b++R-?-?Cb**B,?,?Cr+   c                 8   t        j                         }|j                  dd       |j                  dd       |j                  dddd	       |j                  dd
d       |j                  ddd       |j                  d
dd       |j                  ddd       |j                  dddd	       t	        j
                  t         j                  t         j                  |       t	        j
                  t         j                  t         j                  |       y )Nr.   r   r   r/   r   r   r   r   r   r   r0   r   r1   r
   r2   	r   r   r   r   r3   r4   r5   r   r"   r7   s     r)   test_sum_demands_not_zeroz)TestMinCostFlow.test_sum_demands_not_zero-       JJL	

3r
"	

3q
!	

3A
2	

3A
&	

3B
'	

3A
&	

3B
'	

3A
2b++R-?-?Cb++R-@-@!Dr+   c                 8   t        j                         }|j                  dd       |j                  dd       |j                  dddd	       |j                  dd
d       |j                  ddd       |j                  d
dd       |j                  ddd       |j                  dddd	       t	        j
                  t         j                  t         j                  |       t	        j
                  t         j                  t         j                  |       y r-   r:   r7   s     r)   test_no_flow_satisfying_demandsz/TestMinCostFlow.test_no_flow_satisfying_demands:   r<   r+   c                 b   t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  d	d
       |j                  dd
       |j                  dd       |j                  dd       |j                  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       |j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       t        j                  |      \  }}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(  sJ t        j
                  |      d k(  sJ ||k(  sJ t        j                  |      |k(  sJ t        j                  ||      d k(  sJ t        j                  |      \  }}|d k(  sJ t        j                  ||      d k(  sJ ||k(  sJ y )!Nr   r   r   r   r2   r   r
   r   efghr   rr0   r   r   r1   r   r         i)r   rE   )rE   rB   )r
   rC   rD   )r   rC   r   r   )	r   r   r   r
   r@   rB   rC   rD   rE   )   r   r#   s        r)   test_transshipmentz"TestMinCostFlow.test_transshipmentG   s   JJL	

3q
!	

3r
"	

3r
"	

3q
!	

3r
"	

3r
"	

3q
!	

3q
!	

3q
!	

3A
&	

3A
&	

3A
&	

3A
&	

3B
'	

3A
&	

3A
&	

3A
&	

3A
&	

3A
&	

3B
'	

3B
'	

3B
'	

3C
(((+!qq!qq!qq)qq!q!

 2~~$$Q'2---Dyy"d***q!$***))!,!2~~q!$***Dyyr+   c                    t        j                         }|j                  ddd       |j                  dddd       |j                  ddd	       |j                  dd
dd       |j                  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        j                  |dddd      }||k(  sJ t        j                  ||d      dk(  sJ |j                  ddd	       t        j
                  |dd      \  }}|j                  dd       |dk(  sJ |d   d   dk(  sJ |d   d= ||k(  sJ t        j                  ||d      dk(  sJ y )Nr.   r   r   )	bandwidthr   r   )rM   costr   )rN   r
      rF   r/   r   r   rI   )r.   r   r   r   r
   r/   rM   rN   r   r   r0   Z   if)r   r   r   max_flow_min_costr!   r"   remove_edge)r$   r%   r(   flowr&   s        r)   test_max_flow_min_costz&TestMinCostFlow.test_max_flow_min_costw   s|   JJL	

3q
)	

3r
3	

3!
$	

3qq
1	

3"
%	

3qq
1q!qqqq
 ##AsC+fUt||q$v6"<<<	

3$
',,QVT$	c34Cy~"""IcNt||q$v6"<<<r+   c                    t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  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        j                  |      \  }}dd
dd
ddddddddid	did}|dk(  sJ t        j
                  |      dk(  sJ ||k(  sJ t        j                  |      |k(  sJ t        j                  ||      dk(  sJ t        j                  |      \  }}|dk(  sJ ||k(  sJ t        j                  ||      dk(  sJ y )Nr   ir   r   r      r   rP   r   rO   r   r   r   rG   )r   r   r   )r   r   r      )r   r   r   r   r   r   r      )	r   r   r   add_edges_fromr   r   r    r!   r"   r#   s        r)   test_digraph1zTestMinCostFlow.test_digraph1   s    JJL	

1S
!	

1Q
	

1R
 	AB!45AA34A!}%AA34AB!45AB!45AA34A!}%AA34
	
 ((+!!}q!!}2w1v
 3$$Q'3...Dyy"d***q!$+++))!,!3Dyyq!$+++r+   c           
         t        j                         }|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       |j                  ddd       |j                  ddd       t        j                  |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(  sJ |j                  ddd       t        j                  |      \  }}|j                  dd       |d   d   dk(  sJ |dk(  sJ |d   d= ||k(  sJ t        j                  ||      dk(  sJ y ) Nr.   r   rG   r   r   r   r      rY   r   rP   r   r         r/   rF      )r   r   r   )r   r   r      )r   r/   r   )r   r/   r   r   r   )r   r   r   r   r   r   r.   r/   rR   r0       iA   )r   r   r   rS   r"   rT   r!   )r$   r%   rU   r(   r&   s        r)   test_digraph2zTestMinCostFlow.test_digraph2   s    JJL	

3B
'	

3A
&	

3B
'	

1a"Q
/	

1a!A
.	

1a!A
.	

1a!B
/	

1a!A
.	

1a!A
.	

1a"Q
/	

1a"Q
/	

1a!A
.	

1cA
&	

1cA
&	

1cB
'##AsC0q!q!2w1~1~RyA"%	
 t||	

3D
),,Q/$	c3Cy~###5   IcNt||q$'3...r+   c                 6   t        j                         }|j                  dd       |d   d   j                  ddd       |j                  dd       |d   d   j                  ddd       |j                  dd       |d   d   j                  ddd       |j                  dd	       |d   d	   j                  ddd       |j                  dd       |d   d   j                  dd
d       |j                  dd	       |d   d	   j                  d
dd       	 t        j                  |dd	dd      }t        d |d   j                         D              }d|k(  sJ dt        j                  ||d      k(  sJ |d   dddk(  sJ |d   dddk(  sJ |d   dd
dk(  sJ |d	   i k(  sJ |j                  d	d       |d	   d   j                  ddi       t        j                  |dd      \  }}|j                  d	d       t        d |d   j                         D              }d|k(  sJ |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(  sJ |d	   i k(  sJ t        j                  ||d      dk(  sJ y)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   rP   c              3       K   | ]  }|  y wN .0vs     r)   	<genexpr>z0TestMinCostFlow.test_digraph3.<locals>.<genexpr>        010      r0   r   r   )r   r/   )r   r/   rR   c              3       K   | ]  }|  y wrk   rl   rm   s     r)   rp   z0TestMinCostFlow.test_digraph3.<locals>.<genexpr>  rq   rr   iN)
r   r   r   updaterS   sumvaluesr!   r"   rT   )r$   r%   solrU   r&   s        r)   test_digraph3zTestMinCostFlow.test_digraph3   s    JJL	

3	#sqQ<(	

3	#sqQ<(	

3	#sqQ<(	

3	#sqQ<(	

3	#sqQ<(	

3	#sqQ<(*""1c31E0c#hoo/00DyyR__QA66663x++++3x++++3x++++3x2~~	

3	#sAt9%++A!D#	c30c#hoo/00Dyy3x}!!!4HSM3x++++3x++++3x++++3x2~~q#a0B666r+   c                    t        j                         }|j                  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        j                  |      \  }}ddd
dddddii dddd}|dk(  sJ t        j
                  |      dk(  sJ ||k(  sJ t        j                  |      |k(  sJ t        j                  ||      dk(  sJ t        j                  |      \  }}|dk(  sJ ||k(  sJ t        j                  ||      dk(  sJ y)z+Address issue raised in ticket #617 by arv.r   r   rP   r   r   r   r   rH   r	   )r   r   )r   r   )r   r   rZ   r   N)	r   r   r\   nodesr   r   r    r!   r"   r#   s        r)   test_zero_capacity_edgesz(TestMinCostFlow.test_zero_capacity_edges  s   JJL	AA34AA34AA34AA34AA34AA34AA34
	
  "
8!
8 
8((+!Q<aLaV1QR|T1}}$$Q'1,,,Dyy"d***q!$)))))!,!1}}Dyyq!$)))r+   c                 0   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        j                  |      }|j                  |       t        j                  |      \  }}dd	id	dddd	id}|dk(  sJ t        j                  |      dk(  sJ ||k(  sJ t        j
                  |      |k(  sJ t        j                  ||      dk(  sJ t        j                  |      \  }}|dk(  sJ ||k(  sJ t        j                  ||      dk(  sJ y)zLCheck if digons are handled properly. Taken from ticket
        #618 by arv.r   r   r	   rA   r   r   i'	 rP   r   r   -
 )r   r   re   i+ N)r   r   add_nodes_fromr   r   r    r!   r"   )r$   r|   edgesr%   r&   r'   r(   s          r)   
test_digonzTestMinCostFlow.test_digon0  s_    R1xn-Ha=/ABV45Q/0V45Q/0	
 JJu	((+!q6!l1v67"""$$Q'7222Dyy"d***q!$///))!,!7"""Dyyq!$///r+   c                 >   t        j                         }|j                  t        d      d       d|j                  d   d<   d|j                  d   d<   |j                  g d	d
d       t        j                  t         j                  t         j                  |       y)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   rd   g?rP   N)
r   r   r   ranger|   r\   r3   r4   r5   r    r7   s     r)   test_deadendzTestMinCostFlow.test_deadendI  s|     JJL	q!,"
8!
8	1BsKb++R-=-=qAr+   c                 r   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        j                  |      }|j                  |       t        j                  t         j
                  t         j                  |       t        j                  t         j
                  t         j                  |       y)zRAn infinite capacity negative cost digon results in an unbounded
        instance.r   r   r	   rA   r   r   r   ir   r   r   rP   N)r   r   r   r3   r4   r6   r   r"   )r$   r|   r   r%   s       r)    test_infinite_capacity_neg_digonz0TestMinCostFlow.test_infinite_capacity_neg_digonU  s     R1xn-Ha=/ABHd#$Ha=!V45Q/0	
 JJu	b**B,>,>Bb**B,?,?Cr+   c                 H   t        j                         }|j                  dddd       |j                  dddd       d}t        j                  |      |k(  sJ t        j                  |      \  }}|dk(  sJ |ddiddidk(  sJ t        j
                  ||      dk(  sJ y)	zoThe digon should receive the maximum amount of flow it can handle.
        Taken from ticket #749 by @chuongdo.r   r   r   rH   rP   r2   rt   N)r   r   r   r   r"   r!   )r$   r%   min_costr&   r'   s        r)   test_finite_capacity_neg_digonz.TestMinCostFlow.test_finite_capacity_neg_digond  s     JJL	

3a
3	

3a
3$$Q'8333))!,!2~~3(#q2222q!$***r+   c                    t        j                         }|j                  ddgd       t        j                  |      \  }}|dk(  sJ |dddiidddiii dk(  sJ t        j                  |      \  }}|dk(  sJ |dddiidddiii dk(  sJ y	)
zMultidigraphs are acceptable.)r   r   r   )r   r   r   r   r0   r   r   r   re   N)r   MultiDiGraphadd_weighted_edges_fromr   r"   r$   r%   r&   r'   s       r)   test_multidigraphz!TestMinCostFlow.test_multidigraphr  s    OO	!!9i"8!L((+!1}}QFQF;;;;))!,!1}}QFQF;;;;r+   c                    t        j                         }|j                  ddd       t        j                  t         j
                  t         j                  |       t        j                  t         j
                  t         j                  |       d|d   d   d<   t        j                  |      \  }}|dk(  sJ |dddiik(  sJ t        j                  |      \  }}|dk(  sJ |dddiik(  sJ t        j                         }|j                  dddd       |j                  dddd       t        j                  t         j
                  t         j                  |       t        j                  t         j
                  t         j                  |       d|d   d   d   d<   t        j                  |      \  }}|dk(  sJ |dddd	d
iik(  sJ t        j                  |      \  }}|dk(  sJ |dddd	d
iik(  sJ y)zqNegative selfloops should cause an exception if uncapacitated and
        always be saturated otherwise.
        r   rH   r0   r   r   r2   xyr   )r   r   N)	r   r   r   r3   r4   r6   r   r"   r   r   s       r)   test_negative_selfloopsz'TestMinCostFlow.test_negative_selfloops~  s    JJL	

1a
#b**B,>,>Bb**B,?,?C!Q
((+!2~~QAK))!,!2~~QAKOO	

1aR
(	

1aQ
'b**B,>,>Bb**B,?,?C#$!QZ ((+!2~~Q!!,-....))!,!2~~Q!!,-....r+   c                    t        j                         }|j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  dd       |j                  d	d       |j                  ddd
       |j                  ddd
       |j                  ddd
       |j                  d	dd
       |j                  ddd
       t        j                  |      \  }}|dk(  sJ |ddddi i i ddiddidk(  sJ t        j
                  |      \  }}|dk(  sJ |ddddi i i ddiddidk(  sJ y )Nr   rA   r   r   r   r   r   r2   r   r_   re   )r   r   r   r   r   r   )r   r   r   r   r   r"   r   s       r)   test_bone_shapedz TestMinCostFlow.test_bone_shaped  s_   JJL	

1R
 	

1Q
	

1Q
	

1Q
	

1R
 	

1R
 	

1a!
$	

1a!
$	

1a!
$	

1a!
$	

1a!
$((+!1}}A!*rbRQFPQSTvVVVV))!,!1}}A!*rbRQFPQSTvVVVVr+   c                    t        j                         }t        j                  t         j                  t         j
                  |       t        j                  t         j                  t         j                  |       t        j                         }t        j                  t         j                  t         j
                  |       t        j                  t         j                  t         j                  |       t        j                         }t        j                  t         j                  t         j
                  |       |j                  dt        d             t        j                  t         j                  t         j
                  |       t        j                  t         j                  t         j                  |       d|j                  d   d<   |j                  dd       |j                  ddt        d              t        j                  t         j                  t         j
                  |       t        j                  t         j                  t         j                  |       d|d   d   d<   |j                  ddt        d             t        j                  t         j                  t         j
                  |       d|d   d   d<   d|d   d   d	<   t        j                  t         j                  t         j
                  |       d|d   d   d	<   d|d   d   d	<   t        j                  t         j                  t         j
                  |       y )
Nr   infr   r	   r   r0   r   rH   r   )r   Graphr3   r4   NetworkXNotImplementedr   r"   
MultiGraphr   NetworkXErrorr   floatr5   r|   r   r7   s     r)   test_exceptionszTestMinCostFlow.test_exceptions  s1   HHJb//1C1CQGb//1D1DaHMMOb//1C1CQGb//1D1DaHJJLb&&(:(:A>	

1U5\
*b&&(:(:A>b++R-@-@!D 
8	

1Q
	

1au
.b&&(:(:A>b++R-@-@!D!Q	

1ae
-b&&(:(:A>!Q !Q
b++R-?-?C!Q
 !Q
b++R-?-?Cr+   c                    t         j                  j                  d      dz  }t        j                  |d      5 }t        j                  |      }d d d        t        j                        \  }}d|k(  sJ dt        j                  ||      k(  sJ t        j                  |      \  }}d|k(  sJ dt        j                  ||      k(  sJ y # 1 sw Y   ~xY w)Nznetworkx.algorithms.flow.testsznetgen-2.gpickle.bz2rbl   [$ )	importlib	resourcesfilesbz2BZ2Filepickleloadr   r   r!   r"   )r$   fnamerB   r%   r&   flowDicts         r)   
test_largezTestMinCostFlow.test_large  s    %%&FG$% 	 [[% 	AA	//2(X%%%R__Q9999003(X%%%R__Q9999	 	s   CCN)__name__
__module____qualname__r*   r8   r;   r>   rK   rV   r]   rh   rz   r}   r   r   r   r   r   r   r   r   r   rl   r+   r)   r   r   
   sl    *DEE.`=:%,N'/R+7Z*>02
BD+
</:W*D>:r+   r   )r   importlib.resourcesr   r   r3   networkxr   r   rl   r+   r)   <module>r      s     
    Q: Q:r+   