
    VhI                     &   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  Zeez  Zd Zd Zd ZddZ G d d	      Z G d
 d      Zd Zd Zd Z G d d      Zy)z#Maximum flow algorithms test suite.    N)boykov_kolmogorovbuild_flow_dictbuild_residual_networkdinitzedmonds_karppreflow_pushshortest_augmenting_pathc                      |\  }t               } fd|D        D ]   \  }|j                  fd|D               " |S )Nc              3   ,   K   | ]  }||   f  y wN .0nGs     [/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/flow/tests/test_maxflow.py	<genexpr>z!compute_cutset.<locals>.<genexpr>!   s     1!Q!I1s   c              3   0   K   | ]  }|v s|f  y wr   r   )r   vnon_reachableus     r   r   z!compute_cutset.<locals>.<genexpr>"   s     Aa=.@q!fAs   		)setupdate)r   	partition	reachablecutsetnbrsr   r   s   `    @@r   compute_cutsetr      sE    (I}UF1y1 B4AdAABM    c                 6   d|j                    }t        |       t        |      k(  sJ |       | D ]&  }t        | |         t        ||         k(  r!J |        t        j                  |d      }	|D ]]  }||   j	                         D ]E  \  }
}|| |   |
   v r|| |   |
   |   k  sJ |dk\  sJ |       |	|xx   |z  cc<   |	|
xx   |z  cc<   G _ |	j	                         D ]6  \  }}||k(  r|| k(  rJ |       ||k(  r||k(  r$J |       |dk(  r1J |        y )NAssertion failed in function: r   )__name__r   dictfromkeysitems)r   stflowDict	solnValuecapacity	flow_funcerrmsgr   excessr   flowexcs                r   validate_flowsr0   &   s\   -i.@.@-ABFq6S]"*F*" 51Q4yC,,4f4,5]]8Q'F {((* 	GAt1Q47"qtAwx000019$f$91II1II	 ,,. $369*$,f,$!V)#+V+#!8#V#8$r   c                     d|j                    }t         fd|d   D              sJ |       t         fd|d   D              sJ |       t         |      }t         fd|D              sJ |       |t         fd|D              k(  sJ |        j	                         }	|	j                  |        j                         st        j                  |	      rJ |       y t        j                  |	      rJ |       y )Nr!   c              3   &   K   | ]  }|v  
 y wr   r   r   s     r   r   z validate_cuts.<locals>.<genexpr>>        ,!qAv,   r   c              3   &   K   | ]  }|v  
 y wr   r   r   s     r   r   z validate_cuts.<locals>.<genexpr>?   r3   r4      c              3   H   K   | ]  \  }}j                  ||        y wr   )has_edge)r   r   r   r   s      r   r   z validate_cuts.<locals>.<genexpr>A   s      5FQqzz!Q5s   "c              3   :   K   | ]  \  }}|   |        y wr   r   )r   r   r   r   r*   s      r   r   z validate_cuts.<locals>.<genexpr>B   s"     C&1aAaDGH-Cs   )
r"   allr   sumcopyremove_edges_fromis_directednxis_connectedis_strongly_connected)
r   r&   r'   r)   r   r*   r+   r,   r   Hs
   `    `    r   validate_cutsrC   <   s    -i.@.@-ABF,y|,,4f4,,y|,,4f4,Ay)F5f55=v=5CFCCCKVKC	A==???1%-v-%%++A.66..r   c           
         t         D ]  }d|j                   } || |||      }|j                  d   }t        | |      }	||k(  sJ |       t	        | |||	|||       t        j                  | ||||      \  }
}t        | ||||||        y )Nr!   
flow_value)r*   r+   )
flow_funcsr"   graphr   r0   r?   minimum_cutrC   )r   r&   r'   r)   r*   r+   r,   RrE   	flow_dict	cut_valuer   s               r   compare_flows_and_cutsrL   K   s     J	1)2D2D1EFaAx(WW\*
#Aq)	Y&..&q!Q	9h	J!~~q!h) 
	9 	aAy)XyIJr   c                   l    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y)TestMaxflowMinCutCommonc                 p    t        j                         }|j                  ddd       t        |ddd       y )Nr6            ?r*   r?   Graphadd_edgerL   selfr   s     r   test_graph1z#TestMaxflowMinCutCommon.test_graph1\   s/    HHJ	

1a#
&
 	q!Q,r   c                    t        j                         }|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        |ddd
       y Nxa      @rR   brQ   c      @d      @e       @yrS   rV   s     r   test_graph2z#TestMaxflowMinCutCommon.test_graph2f   s     HHJ	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
* 	q#sC0r   c                    t        j                         }|j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       t        |ddd       y )	Nr\   r^   g     @@rR   r_   rQ   ra   g     @@r?   DiGraphrU   rL   rV   s     r   test_digraph1z%TestMaxflowMinCutCommon.test_digraph1   sw    JJL	

3f
-	

3f
-	

3c
*	

3f
-	

3f
- 	q#sF3r   c                 8   t        j                         }|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        |dd	d       y )
Nr&   r^   rP   rR   r_   r6   ra   r\   r'   rh   rV   s     r   test_digraph2z%TestMaxflowMinCutCommon.test_digraph2   s    JJL	

3a
(	

3a
(	

3a
(	

3a
(	

3a
(	

3a
( 	q#sA.r   c                    t        j                         }|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        |ddd       y )Nr&   v1g      0@rR   v2g      *@g      $@rb   v3g      (@g      "@v4g      ,@g      @r'   g      4@g      7@rh   rV   s     r   test_digraph3z%TestMaxflowMinCutCommon.test_digraph3   s    JJL	

3t
,	

3t
,	

4
-	

4
,	

4
-	

4
,	

4
-	

4
,	

4t
,	

4s
+ 	q#sD1r   c                    t        j                         }|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        |ddd       y rZ   rh   rV   s     r   test_digraph4z%TestMaxflowMinCutCommon.test_digraph4   s     JJL	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
* 	q#sC0r   c                    t        j                         }|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        |dd
d       y )Nr&   r6   
   rR   rP            	   r'         rh   rV   s     r   test_wikipedia_dinitz_examplez5TestMaxflowMinCutCommon.test_wikipedia_dinitz_example   s    JJL	

3B
'	

3B
'	

1a!
$	

1a!
$	

1a!
$	

1a!
$	

1cB
'	

1a!
$	

1cB
' 	q#sB/r   c                    t        j                         }|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}d}d}t        ||||d       y )Nr[   r\   r]   )spamr^   rQ   r_   r`   ra   rb   rc   rd   re   r   rR   rh   )rW   r   r)   r&   r'   s        r   test_optional_capacityz.TestMaxflowMinCutCommon.test_optional_capacity   s    JJL	

3#
&	

3#
&	

3#
&	

3#
&	

3#
&	

3#
&	

3#
&	

3#
& 	q!Q	FCr   c                    t        j                         }|j                  dd       |j                  ddd       |j                  ddd       |j                  ddd       |j                  dd	d
       |j                  dd	       t        |dd	d       t        j                         }|j                  ddd       |j                  ddd       |j                  dd       |j                  dd       |j                  ddd       |j                  dd	d
       |j                  dd	d       t        |dd	d       y )Nr&   r\   r^      rR   r_         r'   <   a   U   %   rh   rV   s     r   test_digraph_infcap_edgesz1TestMaxflowMinCutCommon.test_digraph_infcap_edges  s   JJL	

3	

3b
)	

3b
)	

3b
)	

3b
)	

3 	q#sB/ JJL	

3b
)	

3b
)	

3	

3	

3b
)	

3b
)	

3b
) 	q#sB/r   c                 t   t        j                         }|j                  dd       |j                  ddd       |j                  dd       |j                  ddd       |j                  ddd	       |j                  dd       t        D ])  }t	        j
                  t         j                  ||dd       + y )
Nr&   r\   r^   r   rR   r_   r   r'   r   )r?   ri   rU   	all_funcspytestraisesNetworkXUnboundedrW   r   r+   s      r   test_digraph_infcap_pathz0TestMaxflowMinCutCommon.test_digraph_infcap_path<  s    JJL	

3	

3b
)	

3	

3b
)	

3b
)	

3" 	HIMM"..	1c3G	Hr   c                 0   t        j                         }|j                  dd       |j                  ddd       |j                  ddd       |j                  ddd       |j                  dd	d
       |j                  dd	       t        |dd	d       y )Nr&   r\   r^   r   rR   r_   r   r   r'   r   r   rS   rV   s     r   test_graph_infcap_edgesz/TestMaxflowMinCutCommon.test_graph_infcap_edgesI  s    HHJ	

3	

3b
)	

3b
)	

3b
)	

3b
)	

3 	q#sB/r   c                 8   t        j                         }|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        |ddd
       y )Nr&   r\   rP   rR   r^      r'   r6   rw   rx   rh   rV   s     r   test_digraph5z%TestMaxflowMinCutCommon.test_digraph5^  s    JJL	

3a
(	

3a
(	

3a
(	

3a
(	

3a
(	

3a
( 	q#sA.r   c                     t        j                         }|j                  g dd       |j                  d       t        j                  |dd      dk(  sJ t        |ddd       y )N)r   r6   r6   )r6   rP   r6   )rP   rw   r6   r*   weightr6   r   rw   )r?   rT   add_weighted_edges_fromremove_nodemaximum_flow_valuerL   rV   s     r   test_disconnectedz)TestMaxflowMinCutCommon.test_disconnectedp  sZ    HHJ	!!"CJ!W	a$$Q1-222 	q!Q*r   c                    t        j                         }|j                  g dd       |j                  d       t        D ])  }t        j                  t         j                  ||dd       + |j                  g dd       |j                  d       t        D ])  }t        j                  t         j                  ||dd       + y )Nr   r*   r   r   rw   )r?   rT   r   r   r   r   r   NetworkXErrorr   s      r   test_source_target_not_in_graphz7TestMaxflowMinCutCommon.test_source_target_not_in_graphy  s    HHJ	!!"CJ!W	a" 	@IMM"**Iq!Q?	@	!!"CJ!W	a" 	@IMM"**Iq!Q?	@r   c                     t        j                         }|j                  d       t        D ])  }t	        j
                  t         j                  ||dd       + y )Nr   )r?   rT   add_noder   r   r   r   r   s      r   test_source_target_coincidez3TestMaxflowMinCutCommon.test_source_target_coincide  sC    HHJ	

1" 	@IMM"**Iq!Q?	@r   c                     t        j                         }t        j                         }|j                  ddgd       t        D ])  }t        j                  t         j                  ||dd       + y )N)r   r6   )r6   r   TrR   r   )r?   
MultiGraphMultiDiGraphadd_edges_fromr   r   r   r   )rW   r   Mr+   s       r   test_multigraphs_raisez.TestMaxflowMinCutCommon.test_multigraphs_raise  s\    MMOOO	&&)D9" 	@IMM"**Iq!Q?	@r   N)r"   
__module____qualname__rX   rf   rj   rl   rr   rt   r}   r   r   r   r   r   r   r   r   r   r   r   r   rN   rN   [   sX    -144&/,241402D8(0TH0*/$+	@@@r   rN   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestMaxFlowMinCutInterfacec                     t        j                         }|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                         }|j                  ddd       |j                  ddd       || _        y )Nr[   r\   r]   rR   r^   rQ   r_   r`   ra   rb   rc   rd   re   r   r6   rP   )r?   ri   rU   r   rB   )rW   r   rB   s      r   setup_methodz'TestMaxFlowMinCutInterface.setup_method  s    JJL	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*	

3c
*JJL	

1a#
&	

1a#
&r   c           
      ,   ddh dg}t        j                         }|j                  g dd       t        D ][  }|D ]T  }t	        j
                  t         j                  ||dd|	       t	        j
                  t         j                  ||dd|	       V ] y )
Nthis_should_be_callablerv   >   r6   rP   rw   r   r*   r   r   r6   r+   )r?   rT   r   interface_funcsr   r   r   )rW   elementsr   r+   elements        r   test_flow_func_not_callablez6TestMaxFlowMinCutInterface.test_flow_func_not_callable  s    -r9=HHJ	!!"CJ!W( 	WI# Wb..	1agVb..	1agVW	Wr   c                     | j                   }d}t        D ]N  }t        D ]C  }d|j                   d|j                   } ||dd|      }|t        v r|d   }||k(  r>J |        P y )Nr]   r!    in interface r[   re   r   r   )r   r   rF   r"   max_min_funcs)rW   r   fvinterface_funcr+   r,   results          r   test_flow_func_parametersz4TestMaxFlowMinCutInterface.test_flow_func_parameters  s    FF- 		,N' ,	4Y5G5G4H I$$2$;$;#<>  (3yI!]2#AYFV|+V+|,		,r   c           	         | j                   }t        j                  t        j                  t        j
                  |ddt        d       t        j                  t        j                  t        j                  |ddt        d       y )Nr[   re   rQ   r+   cutoff)r   r   r   r?   r   rH   r   minimum_cut_valuerV   s     r   test_minimum_cut_no_cutoffz5TestMaxFlowMinCutInterface.test_minimum_cut_no_cutoff  se    FFNN"	
 	  "	
r   c                     | j                   }d}t        ddift        ddiff}t        D ]N  }|D ]G  \  }}d|j                   d|j                   } ||dd	fd
|i|}|t
        v r|d   }||k(  rBJ |        P y )NrQ   	two_phaseTglobal_relabel_freqr   r!   r   r   rP   r+   )rB   r	   r   r   r"   r   )	rW   r   r   to_testr   r+   kwargsr,   r   s	            r   test_kwargsz&TestMaxFlowMinCutInterface.test_kwargs  s    FF%T':;1156
 . 		,N%, ,!	64Y5G5G4H I$$2$;$;#<>  (1aO9OO!]2#AYFV|+V+|,		,r   c           	          | j                   }t        D ]+  }t        j                  t        j
                  ||ddd       - y )Nr   r6   rP   r   )rB   r   r   r   r?   r   )rW   r   r   s      r   test_kwargs_default_flow_funcz8TestMaxFlowMinCutInterface.test_kwargs_default_flow_func  s9    FF- 	NMM  .!Qq	r   c           
         | j                   }d}d\  }}t        |d      }t        D ]_  }t        D ]T  }d|j                   d|j                   }t        d      D ](  }	 ||dd||	      }
|t        v r|
d
   }
||
k(  r#J |        V a y )Nr]   )r[   re   r*   r!   r   rw   r[   re   )r+   residualr   )r   r   r   rF   r"   ranger   )rW   r   r   r&   r'   rI   r   r+   r,   ir   s              r   test_reusing_residualz0TestMaxFlowMinCutInterface.test_reusing_residual  s    FF1"1j1- 	0N' 0	4Y5G5G4H I$$2$;$;#<>  q 0A+3y1F &6!'<//<00	0r   N)
r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s&     W,
*,$0r   r   c                      t        j                         } | j                  ddd       t        | ddd       }|j                  d   dk(  sJ t        j                  t         j                  t        | ddd       y )Nr6   rP   rR   r   rE   )r?   ri   rU   r   rG   r   r   r   r   rI   s     r   %test_preflow_push_global_relabel_freqr     sb    


AJJq!aJ Q1$7A77< A%%%
MM"""L!QrRr   c                      t        j                         } t        j                  | g dd       t        j                  | g dd       t        | ddd      }|j                  d	   dk(  sJ y )
N)r   r6   rw   r6   rR   )r6   rP   rw   r   rw   F)
value_onlyrE   )r?   ri   add_pathr   rG   r   s     r   $test_preflow_push_makes_enough_spacer     sT    


AKK9q)KK9q)Q1/A77< A%%%r   c                     d} d}t        j                         }t        |       D ][  |j                  ddfd       t        j                  |fdt        |      D        d       |j                  |dz
  fdd       ] t        |ddd	
      }|j                  d   | k(  sJ t        |ddd
      }|j                  d   | k(  sJ y )Nr     r&   r   r6   rR   c              3   &   K   | ]  }|f 
 y wr   r   r   jr   s     r   r   z:test_shortest_augmenting_path_two_phase.<locals>.<genexpr>  s     11A1r4   r'   T)r   rE   F)r?   ri   r   rU   r   r	   rG   )kpr   rI   r   s       @r   'test_shortest_augmenting_path_two_phaser     s    	AA


A1X 0	

3A
+
A1a1A>	

Aq1u:sQ
/0 	!C=A77< A%%% C>A77< A%%%r   c                       e Zd Zd Zd Zy)
TestCutoffc                    d}d}t        j                         }t        |      D ][  |j                  ddfd       t        j                  |fdt        |      D        d       |j                  |dz
  fd	d       ] t        |dd	d
|      }||j                  d   cxk  r	d|z  k  sJ  J t        |dd	d|      }||j                  d   cxk  r	d|z  k  sJ  J t        |dd	|      }||j                  d   cxk  r	d|z  k  sJ  J t        |dd	|      }||j                  d   cxk  r	d|z  k  sJ  J t        |dd	|      }||j                  d   cxk  r	d|z  k  sJ  J y )Nr   r   r&   r   rP   rR   c              3   &   K   | ]  }|f 
 y wr   r   r   s     r   r   z)TestCutoff.test_cutoff.<locals>.<genexpr>#  s     5qQF5r4   r6   r'   T)r   r   rE   F)r   )
r?   ri   r   rU   r   r	   rG   r   r   r   )rW   r   r   r   rI   r   s        @r   test_cutoffzTestCutoff.test_cutoff  s   JJLq 	4AJJsQFQJ/KK5E!H5BJJ1q5z3J3	4 %QSDKAGGL)4a!e44444$QSE!LAGGL)4a!e44444CQ/AGGL)4a!e444441c3q)AGGL)4a!e44444ac!4AGGL)4a!e44444r   c           	      J   t        j                  d      }t        j                  |t        j	                  |j                         d      d       t        t        t        t        fD ]<  }dD ]5  }t        j                  |dd||      }||k(  r#J d|j                           > y )	Nr   r6   r*   )rw   rP   r6   r   rx   r   zcutoff error in )r?   complete_graphset_edge_attributesr#   r$   edgesr	   r   r   r   r   r"   )rW   r   r+   r   r   s        r   test_complete_graph_cutoffz%TestCutoff.test_complete_graph_cutoff0  s    a 
q$--	1"=zJ$	
 
	QI $ Q..q!y 'P+;I<N<N;O)PP'	Q
	Qr   N)r"   r   r   r   r   r   r   r   r   r     s    5&Qr   r   rR   )__doc__r   networkxr?   networkx.algorithms.flowr   r   r   r   r   r   r	   rF   maximum_flowrH   r   r   r   flow_value_funcsr   r   r   r0   rC   rL   rN   r   r   r   r   r   r   r   r   <module>r      s    )     

 "..1))2+?+?@ "22(	$,7J t@ t@n	g0 g0VS&&!Q !Qr   