
    Vh.                     j    d Z ddlZddlZddlZddlmZmZmZm	Z	m
Z
  G d d      Zd Z G d d      Zy)	zHUnit tests for the :mod:`networkx.algorithms.bipartite.matching` module.    N)eppstein_matchinghopcroft_karp_matchingmaximum_matchingminimum_weight_full_matchingto_vertex_coverc                   d    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y)TestMatchingz(Tests for bipartite matching algorithms.c                 h   t        j                  dd      | _        ddddd| _        g d}t	        t        d            | _        t        j                         | _        | j                  j                  t        d             | j                  j                  |       t        j                         }|j                  g 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       |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       |j                  dd       || _        y)a&  Creates a bipartite graph for use in testing matching algorithms.

        The bipartite graph has a maximum cardinality matching that leaves
        vertex 1 and vertex 10 unmatched. The first six numbers are the left
        vertices and the next six numbers are the right vertices.

              r      r   r   r   r   ))r      )r      )r      )r   	   )r   r   )   r   )r   r   )      r      )r   Cr   Br   Gr   Fr   Er   r   r   Dr   Ir   A)r   r#   )r   r   r   r    )r   Hr   r   )r   r'   )r   r%   )r   r   r   r)   r   r&   r   r   r$   r+   r   r!   r(   r   r"   r*   N)nxcomplete_bipartite_graphsimple_graphsimple_solutionsetrange	top_nodesGraphgraphadd_nodes_fromadd_edges_fromadd_edgedisconnected_graph)selfedgesr   s      a/home/dcms/DCMS/lib/python3.12/site-packages/networkx/algorithms/bipartite/tests/test_matching.pysetup_methodzTestMatching.setup_method   s    771=#$qQ7QU1XXXZ


!!%),

!!%( HHJ		
, 	


8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&	

8X&"#    c                     |t        t        j                  j                                }|t        t	        d            ddhz
  k(  sJ t        fdt	        d      D              sJ y)zAsserts that the matching is what we expect from the bipartite graph
        constructed in the :meth:`setup` fixture.

        r   r   
   c              3   >   K   | ]  }|v s||      k(    y wN ).0uMs     r;   	<genexpr>z+TestMatching.check_match.<locals>.<genexpr>`   s#     =Aa1f1!A$<=s   	N)	frozenset	itertoolschainitemsr1   all)r9   matchingmatched_verticesrE   s      @r;   check_matchzTestMatching.check_matchS   s^     $Y__aggi%@A9U2Y#71b'#AAAA =r====r=   c                 ~    t        |      dk(  sJ | j                  j                         D ]  \  }}||v r||v rJ  y)zAsserts that the given set of vertices is the vertex cover we
        expected from the bipartite graph constructed in the :meth:`setup`
        fixture.

        r   N)lenr4   r:   )r9   verticesrD   vs       r;   check_vertex_coverzTestMatching.check_vertex_coverb   sI     8}!!!JJ$$& 	2DAq=AM11	2r=   c                 b    | j                  t        | j                  | j                               y)zTests that David Eppstein's implementation of the Hopcroft--Karp
        algorithm produces a maximum cardinality matching.

        N)rN   r   r4   r2   r9   s    r;   test_eppstein_matchingz#TestMatching.test_eppstein_matchingp   s"    
 	*4::t~~FGr=   c                 b    | j                  t        | j                  | j                               y)zwTests that the Hopcroft--Karp algorithm produces a maximum
        cardinality matching in a bipartite graph.

        N)rN   r   r4   r2   rU   s    r;   test_hopcroft_karp_matchingz(TestMatching.test_hopcroft_karp_matchingw   s"    
 	/

DNNKLr=   c                     t        | j                  | j                        }t        | j                  || j                        }| j	                  |       y)zATest for converting a maximum matching to a minimum vertex cover.N)r   r4   r2   r   rS   )r9   rL   vertex_covers      r;   test_to_vertex_coverz!TestMatching.test_to_vertex_cover~   s:    #DJJ?&tzz8T^^L-r=   c                 P    t        | j                        }|| j                  k(  sJ y rA   )r   r.   r/   r9   matchs     r;   test_eppstein_matching_simplez*TestMatching.test_eppstein_matching_simple   s&    !$"3"34,,,,,r=   c                 P    t        | j                        }|| j                  k(  sJ y rA   )r   r.   r/   r]   s     r;   "test_hopcroft_karp_matching_simplez/TestMatching.test_hopcroft_karp_matching_simple   s&    &t'8'89,,,,,r=   c                     t        j                  t        j                        5  t	        | j
                        }d d d        y # 1 sw Y   y xY wrA   )pytestraisesr,   AmbiguousSolutionr   r8   r]   s     r;   #test_eppstein_matching_disconnectedz0TestMatching.test_eppstein_matching_disconnected   s9    ]]2//0 	?%d&=&=>E	? 	? 	?   AAc                     t        j                  t        j                        5  t	        | j
                        }d d d        y # 1 sw Y   y xY wrA   )rc   rd   r,   re   r   r8   r]   s     r;   (test_hopcroft_karp_matching_disconnectedz5TestMatching.test_hopcroft_karp_matching_disconnected   s=    ]]2//0 	D*4+B+BCE	D 	D 	Drg   c                 <   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	       t        j                  |      }t        j                         }|j                         D ](  }|j                  d
|f       |j                  d|f       * |j                         D ]  \  }}|j                  d
|fd|f        |D ch c]  }|d
   d
k(  s| }}t        ||      }t        |||      }	t        |      |	D 
ch c]  \  }
}|	 c}}
z
  }h d|k(  sJ yc c}w c c}}
w )zTest from issue 2127r'   r   r   r    r#   r   r   r%   r)   r   r   >   r   r#   r   r)   r%   N)r,   DiGraphr7   transitive_closurer3   nodesadd_noder:   r   r   r0   )r9   r   tcbtcrR   rD   nr2   rL   rZ   _independent_sets               r;   test_issue_2127zTestMatching.test_issue_2127   sq    JJL	

3	

3	

3	

3	

3	

3	

3	

3""1%hhj  	!ALL!Q LL!Q 	! HHJ 	)DAqLL!Q!Q(	) !$11qtqyQ1	1)#y9&sHi@a&,#?$!QA#??(O;;;	 2 $@s   ;F	F7Fc                     t        j                  g d      }t        |      }t        ||      }|j	                         D ]  \  }}||v r||v rJ  y )N))r   r   )r   r   )r   r   )r   r   )r,   r3   r   r   r:   )r9   r   rL   rZ   rD   rR   s         r;   test_vertex_cover_issue_2384z)TestMatching.test_vertex_cover_issue_2384   sU    HH56#A&&q(3GGI 	:DAq$\(999	:r=   c           	         t        j                         }g d}|j                  |D cg c]  \  }}|df|dff c}}       t        |      }t	        ||      }|j                         D ]  \  }}||v r||v rJ  y c c}}w )N))r   r   )r   r   )r   r   )r   r   )r   r   LR)r,   r3   r6   r   r   r:   )	r9   r   r:   ijrL   rZ   rD   rR   s	            r;   test_vertex_cover_issue_3306z)TestMatching.test_vertex_cover_issue_3306   s    HHJ8	5A41aAs8aX.AB#A&&q(3GGI 	:DAq$\(999	:	 Bs   A>
c                    t               }t               }t               }t               }t               }t        j                  ||f||f||f||fg      }t        |      }t	        ||      }|j                         D ]  \  }	}
|	|v r|
|v rJ  y rA   )objectr,   r3   r   r   r:   )r9   abcder   rL   rZ   rD   rR   s              r;   test_unorderable_nodesz#TestMatching.test_unorderable_nodes   s    HHHHHHHq!fq!fq!fq!f56#A&&q(3GGI 	:DAq$\(999	:r=   N)__name__
__module____qualname____doc__r<   rN   rS   rV   rX   r[   r_   ra   rf   ri   rt   rv   r|   r   rB   r=   r;   r	   r	      sO    2=$~>2HM.--?D<<::
:r=   r	   c                  \   t        j                         } | j                  g dd       | j                  g dd       | j                  g d       t	        |       t              t        t        |             k(  sJ t        fdt        j                               D              sJ y)	z!Test in accordance to issue #1927)r   r   r   r   r   	bipartite)r   r   r   r   ))r   r   )r   r   )r   r   )r   r   )r   r   )r   r   c              3   T   K   | ]  }|t        j                               v  ! y wrA   )r0   keys)rC   xrL   s     r;   rF   z)test_eppstein_matching.<locals>.<genexpr>   s!     IQqC((Is   %(N)
r,   r3   r5   r6   r   rP   r   rK   r0   values)r   rL   s    @r;   rV   rV      s    

A^q1]a0QR #Hx=C 0 34444I#hoo6G2HIIIIr=   c                   L    e Zd Zed        Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zy
)TestMinimumWeightFullMatchingc                 .    t        j                  d       y )Nscipy)rc   importorskip)clss    r;   setup_classz)TestMinimumWeightFullMatching.setup_class   s    G$r=   c                 &   t        j                         }|j                  ddgd       |j                  ddgd       |j                  ddd       |j                  ddd       |j                  ddd	       t	        |      }|ddddd
k(  sJ y )Nr   r   r   r   r   r   d   weight2   )r   r   r   r   )r,   r3   r5   r7   r   )r9   r   rL   s      r;   2test_minimum_weight_full_matching_incomplete_graphzPTestMinimumWeightFullMatching.test_minimum_weight_full_matching_incomplete_graph   s    HHJ	!Q1-	!Q1-	

1a
$	

1a
$	

1a
#/2qQ13333r=   c                    t        j                         }|j                  g dd       |j                  g dd       |j                  ddd       |j                  d	dd       |j                  d
dd       |j                  d
dd       |j                  d
dd       t	        j
                  t              5  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   r   r   r   r   r   )r,   r3   r5   r7   rc   rd   
ValueErrorr   )r9   r   s     r;   7test_minimum_weight_full_matching_with_no_full_matchingzUTestMinimumWeightFullMatching.test_minimum_weight_full_matching_with_no_full_matching   s    HHJ	a0	a0	

1a
$	

1a
$	

1a
#	

1a
#	

1a
#]]:& 	,(+	, 	, 	,s   <CCc                    t        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       t        |      }|dddddddk(  sJ y )Nr   r     r   r      r   r     X  r   ,     )r   r   r   r   r   r   r,   r-   r7   r   r9   r   rL   s      r;   (test_minimum_weight_full_matching_squarezFTestMinimumWeightFullMatching.test_minimum_weight_full_matching_square   s    ''1-	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$/2qQ1qQ????r=   c                 B   t        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       t        |      }|dddddd	dk(  sJ y )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   "  r   r   r   r   r   r   r   r   s      r;   .test_minimum_weight_full_matching_smaller_leftzLTestMinimumWeightFullMatching.test_minimum_weight_full_matching_smaller_left  s   ''1-	

1a
$	

1a
$	

1a
$	

1a
"	

1a
$	

1a
$	

1a
$	

1a
"	

1a
$	

1a
$	

1a
$	

1a
"/2qQ1qQ????r=   c                 J   t        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       t        |g d      }|dddddd	dk(  sJ y )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   )r2   r   r   r   s      r;   9test_minimum_weight_full_matching_smaller_top_nodes_rightzWTestMinimumWeightFullMatching.test_minimum_weight_full_matching_smaller_top_nodes_right  s   ''1-	

1a
$	

1a
$	

1a
$	

1a
"	

1a
$	

1a
$	

1a
$	

1a
"	

1a
$	

1a
$	

1a
$	

1a
"/\JqQ1qQ????r=   c                 B   t        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       t        |      }|dddd	dddk(  sJ y )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   s      r;   /test_minimum_weight_full_matching_smaller_rightzMTestMinimumWeightFullMatching.test_minimum_weight_full_matching_smaller_right&  s   ''1-	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
$	

1a
"	

1a
"	

1a
"/2qQ1qQ????r=   c                     t        j                  dd      }|j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       t        |      }|ddddd	k(  sJ y )
Nr   r   r   r   皙?r   g333333?r   r   r   s      r;   2test_minimum_weight_full_matching_negative_weightszPTestMinimumWeightFullMatching.test_minimum_weight_full_matching_negative_weights7  s}    ''1-	

1a
#	

1a
$	

1a
#	

1a
$/2qQ13333r=   c                    t        j                  dd      }|j                  ddd       |j                  ddd       |j                  ddd       |j                  ddd       t        |d      }|ddddd	k(  sJ y )
Nr   r   )massr   r   r   r   r   r   r   r   s      r;   6test_minimum_weight_full_matching_different_weight_keyzTTestMinimumWeightFullMatching.test_minimum_weight_full_matching_different_weight_key@  s    ''1-	

1aa
 	

1ac
"	

1aa
 	

1aa
 /&AqQ13333r=   N)r   r   r   classmethodr   r   r   r   r   r   r   r   r   rB   r=   r;   r   r      s@    % %4
,@@"@"@"44r=   r   )r   rH   rc   networkxr,   &networkx.algorithms.bipartite.matchingr   r   r   r   r   r	   rV   r   rB   r=   r;   <module>r      s:    N    |: |:~Jl4 l4r=   