o
    h.                     @   s.  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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ejdg ddd Zej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-d. Zd/d0 Zd1d2 Zd3d4 Z ed5d*gg d6g d7g d8gg d9fg d:g d;g d<gg d=fg d>g d?g d@gg dAfg dBg dCg dDgg dEfdFe!dGe!dGge!dGe!dGd*ge!dGdHe!dGggg dAfgZ"ejdIe"dJdK Z#dS )L    )productN)assert_array_equalassert_equal)
csr_matrix
coo_matrixdiags)maximum_bipartite_matching"min_weight_full_bipartite_matchingc                  C   sN   t t tddgddgg} t|  W d    d S 1 s w   Y  d S )Nr      )pytestraises	TypeErrornparrayr   )graph r   c/var/www/html/scripts/venv/lib/python3.10/site-packages/scipy/sparse/csgraph/tests/test_matching.py5test_maximum_bipartite_matching_raises_on_dense_input   s   
"r   c                  C   sB   t d} t| dd}t| dd}tg }t|| t|| d S )Nr   r   row	perm_typecolumnr   r   r   r   r   r   xyexpected_matchingr   r   r   +test_maximum_bipartite_matching_empty_graph   s   

r   c                  C   sH   t d} t| dd}t| dd}ttg | ttddg| d S )N   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   4test_maximum_bipartite_matching_empty_left_partition   s
   r$   c                  C   sH   t d} t| dd}t| dd}ttg d| ttg | d S )Nr      r   r   r   )r!   r!   r!   r"   r#   r   r   r   5test_maximum_bipartite_matching_empty_right_partition$   s
   r'   c                  C   sL   t d} t| dd}t| dd}ttddg| ttddg| d S )Nr    r    r   r   r   r!   r"   r#   r   r   r   3test_maximum_bipartite_matching_graph_with_no_edges,   s
   r)   c                  C   sR   t ddgddgg} t| dd}t| dd}tddg}t|| t|| d S )Nr
   r   r   r   r   r   r   r   r   r   >test_maximum_bipartite_matching_graph_that_causes_augmentation4   s   
r*   c                  C   s^   t ddgddgddgg} t| dd}t| dd}ttg d| ttddg| d S )Nr
   r   r   r   r   r   r!   r
   r    r"   r#   r   r   r   Atest_maximum_bipartite_matching_graph_with_more_rows_than_columns?   s
   r,   c                  C   sX   t g dg dg} t| dd}t| dd}ttddg| ttg d| d S )	N)r
   r
   r   r   r   r
   r   r   r   r   r    r+   r"   r#   r   r   r   Atest_maximum_bipartite_matching_graph_with_more_columns_than_rowsG   s
   r.   c                  C   sh   ddg} ddg}g d}t | ||fdd}t|dd}t|dd}tddg}t|| t|| d S )	Nr   r
   )r   r
   r    r(   shaper   r   r   r   )dataindicesindptrr   r   r   r   r   r   r   =test_maximum_bipartite_matching_explicit_zeros_count_as_edgesO   s   
r4   c                  C   s   t jdtd} g d}g d}t| ||fdd}t|dd}t|d	d}|d
k dks.J |d
k dks8J tt|jd |D ]\}}|d
krR|||f sRJ qBt|t|jd D ]\}}|d
krm|||f smJ q]d S )N2   dtype)2                  r;   r&      
   r=      r8   r9      r=   rA         r;   r&      r&   rA   rB   r8   r9   r:   r;   r<   r=   r;   r&   r>   r?   r=   r@   r8   r9   rA   r=   rA   rB   rC   r;   r&   rD   r&   rA   rB   )r   r=      r?   r?   rD   rC   r;   r;   r<             #   rI   (   -   /   rL   0   r5   )rC   rF   r/   r   r   r   r!   rA   r   r
   )	r   onesintr   r   sumzipranger0   )r1   r2   r3   r   r   r   uvr   r   r   5test_maximum_bipartite_matching_feasibility_of_result[   s"   rU   c                  C   s\  t jd tt dddd} t jd}t jd}t d}|}t jdtd}t|||ff	 }|}t d}t jdtd}	t|	||ff	 }
||  |
 }t
|dd}t d}|}t jdtd}t|||ff	 }|| }t
|d	d}|}t d}t jdtd}	t|	||ff	 }
||
 }tt| dkd
 tt| dkd
 d S )N*   rF   r   csr)offsetsformatr6   r   r   r   F)r   randomseedr   rN   permutationarangerO   r   tocsrr   r   anydiagonal)A	rand_perm
rand_perm2RrowRcolRdataRmatCrowCcolCdataCmatBpermC1perm2C2r   r   r   Ftest_matching_large_random_graph_with_one_edge_incident_to_each_vertexq   s6   



rq   znum_rows,num_cols)r   r   r%   c                 C   s<   t || f}t|\}}t|dksJ t|dksJ d S )Nr   )r   r	   len)num_rowsnum_colsbiadjacency_matrixrow_indcol_indr   r   r   +test_min_weight_full_matching_trivial_graph   s   rx   ru   )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=   c                 C   s<   t t tt|  W d    d S 1 sw   Y  d S N)r   r   
ValueErrorr	   r   ru   r   r   r   1test_min_weight_full_matching_infeasible_problems   s   
"r|   c                  C   s   t 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d tt|  W d    d S 1 s`w   Y  d S )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   rz   r	   r   )ar   r   r   .test_min_weight_full_matching_large_infeasible   s6   0"r   c                  C   s@   t t td} t|  W d    d S 1 sw   Y  d S )N))r    r   r&   )r   r
   r
   )r   r    r&   )r   warnsUserWarningr   r	   r{   r   r   r   !test_explicit_zero_causes_warning   s   
"r   c           	   	   C   s   |\}}|dk}||| }|t | }| ||d\}}t|t | t|t |||f   |j}| ||d\}}t|t | tt |t t |||f   d S )Nr!   )maximize)r   r   r   sortflattenT)	solver
array_typesign	test_casecost_matrixexpected_costr   rv   rw   r   r   r    linear_sum_assignment_assertions   s$   

r   r!   )     r   )r     X  ),     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   rE      )r?   r
   rE   )r?   r?   r>   r8   )r   r>   r
   r
   )r   rE   r   r?   )r?   r
   r   r?   infrE   zsign,test_casec                 C   s   t tt| | d S ry   )r   r	   r   )r   r   r   r   r   *test_min_weight_full_matching_small_inputs#  s   r   )$	itertoolsr   numpyr   numpy.testingr   r   r   scipy.sparser   r   r   scipy.sparse.csgraphr   r	   r   r   r$   r'   r)   r*   r,   r.   r4   rU   rq   markparametrizerx   r|   r   r   r   float linear_sum_assignment_test_casesr   r   r   r   r   <module>   s    	'

	6"