
    tKg.                        d dl mZ d dlZd dlmZmZ d dlZd dlm	Z	m
Z
mZ d dlmZmZ d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zej4                  j7                  dg d      d        Zej4                  j7                  dg dg dg dgg dg dg dgg dg dg dgg dg dgg dg dgdd gdd gd d ggg      d!        Zd" Zd# Zd$ Z  ed%dgg d&g d'g d(gg d)fg d*g d+g d,gg d-fg d.g d/g d0gg d1fg d2g d3g d4gg d5fd6 e!d7       e!d7      g e!d7       e!d7      dg e!d7      d8 e!d7      ggg d1fg      Z"ej4                  j7                  d9e"      d:        Z#y);    )productN)assert_array_equalassert_equal)
csr_matrix
coo_matrixdiags)maximum_bipartite_matching"min_weight_full_bipartite_matchingc                      t        j                  t              5  t        j                  ddgddgg      } t        |        d d d        y # 1 sw Y   y xY w)Nr      )pytestraises	TypeErrornparrayr	   )graphs    l/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/sparse/csgraph/tests/test_matching.py5test_maximum_bipartite_matching_raises_on_dense_inputr      s=    	y	!1a&1a&)*"5) 
"	!	!s   'A

Ac                      t        d      } t        | d      }t        | d      }t        j                  g       }t	        ||       t	        ||       y )Nr   r   row	perm_typecolumnr   r	   r   r   r   r   xyexpected_matchings       r   +test_maximum_bipartite_matching_empty_graphr       sH    vE"5E:A"5H=A(!,(!,    c                      t        d      } t        | d      }t        | d      }t        t        j                  g       |       t        t        j                  ddg      |       y )N   r   r   r   r   r   r	   r   r   r   r   r   r   s      r   4test_maximum_bipartite_matching_empty_left_partitionr(      sM    vE"5E:A"5H=Arxx|Q'rxxR)1-r!   c                      t        d      } t        | d      }t        | d      }t        t        j                  g d      |       t        t        j                  g       |       y )Nr      r   r   r   )r%   r%   r%   r&   r'   s      r   5test_maximum_bipartite_matching_empty_right_partitionr,   $   sI    vE"5E:A"5H=Arxx-q1rxx|Q'r!   c                      t        d      } t        | d      }t        | d      }t        t        j                  ddg      |       t        t        j                  ddg      |       y )Nr$   r$   r   r   r   r%   r&   r'   s      r   3test_maximum_bipartite_matching_graph_with_no_edgesr/   ,   sR    vE"5E:A"5H=ArxxR)1-rxxR)1-r!   c                      t        ddgddgg      } t        | d      }t        | d      }t        j                  ddg      }t	        ||       t	        ||       y )Nr   r   r   r   r   r   r   s       r   >test_maximum_bipartite_matching_graph_that_causes_augmentationr1   4   s\     AA'(E"5H=A"5E:A!Q((!,(!,r!   c                      t        ddgddgddgg      } t        | d      }t        | d      }t        t        j                  g d      |       t        t        j                  ddg      |       y )Nr   r   r   r   r   r   r%   r   r$   r&   r'   s      r   Atest_maximum_bipartite_matching_graph_with_more_rows_than_columnsr4   ?   sa    AAA/0E"5H=A"5E:Arxx
+Q/rxxA'+r!   c                      t        g dg dg      } t        | d      }t        | d      }t        t        j                  ddg      |       t        t        j                  g d      |       y )	N)r   r   r   r   r   r   r   r   r   r   r$   r3   r&   r'   s      r   Atest_maximum_bipartite_matching_graph_with_more_columns_than_rowsr7   G   sS    	9-.E"5H=A"5E:ArxxA'+rxx
+Q/r!   c                      ddg} ddg}g d}t        | ||fd      }t        |d      }t        |d      }t        j                  ddg      }t	        ||       t	        ||       y )	Nr   r   )r   r   r$   r.   shaper   r   r   r   )dataindicesindptrr   r   r   r   s          r   =test_maximum_bipartite_matching_explicit_zeros_count_as_edgesr>   O   sm    q6D!fGFgv.f=E"5E:A"5H=A!Q((!,(!,r!   c                     t        j                  dt              } g d}g d}t        | ||fd      }t	        |d      }t	        |d	      }|d
k7  j                         dk(  sJ |d
k7  j                         dk(  sJ t        t        |j                  d         |      D ]  \  }}|d
k7  s|||f   rJ  t        |t        |j                  d               D ]  \  }}|d
k7  s|||f   rJ  y )N2   dtype)2                  rF   r+      
   rH      rC   rD      rH   rL         rF   r+      r+   rL   rM   rC   rD   rE   rF   rG   rH   rF   r+   rI   rJ   rH   rK   rC   rD   rL   rH   rL   rM   rN   rF   r+   rO   r+   rL   rM   )r   rH      rJ   rJ   rO   rN   rF   rF   rG             #   rT   (   -   /   rW   0   r@   )rN   rQ   r9   r   r   r   r%   rL   r   r   )	r   onesintr   r	   sumzipranger:   )r;   r<   r=   r   r   r   uvs           r   5test_maximum_bipartite_matching_feasibility_of_resultr`   [   s    772S!DJGFgv.h?E"5E:A"5H=AG==?b   G==?b   E%++a.)1-17A;; . AuU[[^,-17A;; .r!   c                  h   t         j                  j                  d       t        t        j                  d      dd      } t         j                  j                  d      }t         j                  j                  d      }t        j                  d      }|}t        j                  dt              }t        |||ff      j                         }|}t        j                  d      }t        j                  dt              }	t        |	||ff      j                         }
|| z  |
z  }t        |d      }t        j                  d      }|}t        j                  dt              }t        |||ff      j                         }||z  }t        |d	      }|}t        j                  d      }t        j                  dt              }	t        |	||ff      j                         }
||
z  }t        t        |j                         dk(        d
       t        t        |j                         dk(        d
       y )N*   rQ   r   csr)offsetsformatrA   r   r   r   F)r   randomseedr   rY   permutationarangerZ   r   tocsrr	   r   anydiagonal)A	rand_perm
rand_perm2RrowRcolRdataRmatCrowCcolCdataCmatBpermC1perm2C2s                   r   Ftest_matching_large_random_graph_with_one_edge_incident_to_each_vertexr}   q   s   IINN2bggbk1U3A		%%b)I&&r*J99R=DDGGBc"EutTl+,224DD99R=DGGBc"EutTl+,224Dq4A &a59D99R=DDGGBc"EutTl+,224D	B 'qH=ED99R=DGGBc"EutTl+,224D	
TB R[[]a'(%0R[[]a'(%0r!   znum_rows,num_cols)r   r#   r*   c                 z    t        || f      }t        |      \  }}t        |      dk(  sJ t        |      dk(  sJ y )Nr   )r   r
   len)num_rowsnum_colsbiadjacency_matrixrow_indcol_inds        r   +test_min_weight_full_matching_trivial_graphr      sF    #Xx$899:LMGWw<1w<1r!   r   )r   r   r   )r   r   r   r6   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r$   r   r   )r   r   r   )r   r$   r   r   r$   rH   c                     t        j                  t              5  t        t	        |              d d d        y # 1 sw Y   y xY wN)r   r   
ValueErrorr
   r   r   s    r   1test_min_weight_full_matching_infeasible_problemsr      s*     
z	"*:6H+IJ 
#	"	"s	   8Ac                  :   t        j                  g dg dg dg dg dg dg dg dg d	g d
g dg dg dg dg dg dg dg dg dg dg dg dg      } t        j                  t        d      5  t        t        |              d d d        y # 1 sw Y   y xY w)N)        r   r   r   r   r   r   r   r   r   r   r   r   MbP?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   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   )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   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   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   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   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   r   r   )r   g|{?r   r   gCw}?gNRDD9?r   r   r   gp?r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   g<(@?r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   gI} 7?r   r   r   r   g	v?r   r   r   r   r   r   r   r   r   r   r   r   )r   gV?r   r   r   gY\?r   r   r   g!?r   r   r   r   r   r   r   r   r   r   r   r   )gj]8J=?r   g$]}?r   r   r   r   r   g⦫\H?r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   gYI!?r   r   r   r   r   g$?r   r   r   r   r   r   r   r   r   r   r   r   r   )g- O?r   r   r   r   r   r   r   g-J;?r   r   r   r   r   r   r   r   r   r   r   r   r   )r   gzm)Ի?r   r   r   gz{!.?r   r   r   goFI%?r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   g-en?r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   g?r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   g7?r   r   gqfb?g]!?r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   gk?r   r   gT#P?g:w?r   r   r   r   r   r   r   r   r   r   )gvC?r   r   r   r   r   r   r   g8?r   r   r   r   r   r   r   r   r   r   r   r   r   zno full matching exists)match)r   asarrayr   r   r   r
   r   )as    r   .test_min_weight_full_matching_large_infeasibler      s    


	B	B	B	B	B	B	B	B	B	"	E	E		J	J	J	E	B	E	F	G	E[/
 /	A` 
z)B	C*:a=9 
D	C	Cs   3BBc                      t        j                  t              5  t        d      } t	        |        d d d        y # 1 sw Y   y xY w)N))r$   r   r+   )r   r   r   )r   r$   r+   )r   warnsUserWarningr   r
   r   s    r   !test_explicit_zero_causes_warningr      s/    	k	"'(IJ*+=> 
#	"	"s	   :Ac           
      :   |\  }}|dk(  }| ||      z  }|t        j                  |      z  } | ||      \  }}t        |t        j                  |             t        |t        j                  |||f         j	                                |j
                  } | ||      \  }}t        |t        j                  |             t        t        j                  |      t        j                  t        j                  |||f               j	                                y )Nr%   )maximize)r   r   r   sortflattenT)	solver
array_typesign	test_casecost_matrixexpected_costr   r   r   s	            r    linear_sum_assignment_assertionsr      s     "+KrzHK00K288M22MkH=GWw 01}xxGW,< =>FFHJ --KkH=GWw 01rww}-wwrxx&w'78 : ;;B79Fr!   r%   )     r   )r     X  ),     r   )r   r   r   )r   r   r   r   )r   r   r   r$   )r   r   r   r+   )r   r$   r   )rJ   rJ   rI   )	   rI   r   )r   rP      )rJ   r   rP   )rJ   rJ   rI   rC   )r   rI   r   r   )r   rP   r   rJ   )rJ   r   r   rJ   infrP   zsign,test_casec                 0    t        t        t        | |       y r   )r   r
   r   )r   r   s     r   *test_min_weight_full_matching_small_inputsr   #  s    $*JiIr!   )$	itertoolsr   numpyr   numpy.testingr   r   r   scipy.sparser   r   r   scipy.sparse.csgraphr	   r
   r   r    r(   r,   r/   r1   r4   r7   r>   r`   r}   markparametrizer   r   r   r   r   float linear_sum_assignment_test_casesr    r!   r   <module>r      s     :  6 6
*-.(.-,0	-,$1N ,.FG H -&	9=&	9=)<F&	2&	2VaVaV4KK
3:l?F* $+G 


 
	 


 
	
 


 
	 


 
	 uU|U5\
*<uq
)<E%L
)
+ 
	3$  D )+KLI MIr!   