Ë
    D^(hÎN  ã                   ó¨   — d dl Z d dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
  G d„ d«      Z G d„ d	«      Z G d
„ d«      Z G d„ d«      Z G d„ d«      Zy)é    N)Úpermutations)Úraises)Úmatching_dict_to_set)Úedges_equalc                   ó”   — 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d„ Zd„ Zd„ Zd„ Zy)ÚTestMaxWeightMatchingz`Unit tests for the
    :func:`~networkx.algorithms.matching.max_weight_matching` function.

    c                 ó´   — t        j                  «       }t        j                  |«      t        «       k(  sJ ‚t        j                  |«      t        «       k(  sJ ‚y)zEmpty graphN)ÚnxÚGraphÚmax_weight_matchingÚsetÚmin_weight_matching©ÚselfÚGs     úe/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_matching.pyÚtest_trivial1z#TestMaxWeightMatching.test_trivial1   sC   € ä�H‰H‹JˆÜ×%Ñ% aÓ(¬C«EÒ1Ð1Ð1Ü×%Ñ% aÓ(¬C«EÒ1Ð1Ñ1ó    c                 óÜ   — t        j                  «       }|j                  ddd¬«       t        j                  |«      t	        «       k(  sJ ‚t        j
                  |«      t	        «       k(  sJ ‚y )Nr   éd   ©Úweight)r
   r   Úadd_edger   r   r   r   s     r   Útest_selfloopz#TestMaxWeightMatching.test_selfloop   sU   € Ü�H‰H‹JˆØ	�
‰
�1�a ˆ
Ô$Ü×%Ñ% aÓ(¬C«EÒ1Ð1Ð1Ü×%Ñ% aÓ(¬C«EÒ1Ð1Ñ1r   c                 ó  — t        j                  «       }|j                  dd«       t        t        j                  |«      t        dddœ«      «      sJ ‚t        t        j                  |«      t        dddœ«      «      sJ ‚y )Nr   é   ©r   r   ©r
   r   r   r   r   r   r   r   s     r   Útest_single_edgez&TestMaxWeightMatching.test_single_edge   su   € Ü�H‰H‹JˆØ	�
‰
�1�aÔÜÜ×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ñ 
r   c                 ó0  — t        j                  «       }|j                  ddd¬«       |j                  ddd¬«       t        t        j                  |«      t        dddœ«      «      sJ ‚t        t        j                  |«      t        dddœ«      «      sJ ‚y )	NÚoneÚtwoé
   r   Úthreeé   )r$   r"   ©r!   r"   r   r   s     r   Útest_two_pathz#TestMaxWeightMatching.test_two_path'   s�   € Ü�H‰H‹JˆØ	�
‰
�5˜%¨ˆ
Ô+Ø	�
‰
�5˜'¨"ˆ
Ô-ÜÜ×"Ñ" 1Ó%Ü ¨5¸Ñ!AÓBô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ü ¨°uÑ!=Ó>ô
ð 	
ñ 
r   c           
      ó  — t        j                  «       }|j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       t        t        j                  |«      t        dddœ«      «      sJ ‚t        t        j                  |d«      t        ddddd	œ«      «      sJ ‚t        t        j                  |«      t        ddd
œ«      «      sJ ‚t        t        j                  |d«      t        ddd
œ«      «      sJ ‚y )Nr   é   é   r   é   r%   é   ©r)   r+   ©r   r)   r+   r,   ©r   r+   r   r   s     r   Ú	test_pathzTestMaxWeightMatching.test_path4   s  € Ü�H‰H‹JˆØ	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô#Ø	�
‰
�1�a ˆ
Ô"ÜÜ×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ð 
ô Ü×"Ñ" 1 aÓ(Ô*>À1ÈÈqÐUVÑ?WÓ*Xô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ð 
ô Ü×"Ñ" 1 aÓ(Ô*>À1È¹|Ó*Lô
ð 	
ñ 
r   c                 ó€  — t        j                  «       }|j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       t        t        j                  |«      t        dddœ«      «      sJ ‚t        t        j                  |«      t        dddœ«      «      sJ ‚y )Nr   r,   r)   r   r+   r/   ©r   r)   r   r   s     r   Útest_squarez!TestMaxWeightMatching.test_squareF   s¯   € Ü�H‰H‹JˆØ	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô"ÜÜ×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ñ 
r   c                 ó:  — t        j                  «       }|j                  dddd¬«       |j                  dddd¬«       t        t        j                  |d¬«      t        ddd	œ«      «      sJ ‚t        t        j                  |d¬«      t        ddi«      «      sJ ‚y )
Nr!   r"   r#   r%   )r   Úabcdr$   r5   r   r&   r   r   s     r   Útest_edge_attribute_namez.TestMaxWeightMatching.test_edge_attribute_nameS   s•   € Ü�H‰H‹JˆØ	�
‰
�5˜%¨°ˆ
Ô4Ø	�
‰
�5˜'¨"°2ˆ
Ô6ÜÜ×"Ñ" 1¨VÔ4Ü ¨°uÑ!=Ó>ô
ð 	
ð 
ô Ü×"Ñ" 1¨VÔ4Ü  '¨5Ð!1Ó2ô
ð 	
ñ 
r   c           
      óð  — t        j                  «       }|j                  ddt        j                  ¬«       |j                  ddt        j
                  d«      ¬«       |j                  ddd¬«       |j                  ddt        j                  d«      ¬«       t        t        j                  |«      t        dddddœ«      «      sJ ‚t        t        j                  |«      t        dddddœ«      «      sJ ‚y )	Nr   r)   r   r+   g      @r,   g       @r.   )r
   r   r   ÚmathÚpiÚexpÚsqrtr   r   r   r   r   s     r   Útest_floating_point_weightsz1TestMaxWeightMatching.test_floating_point_weights`   sÏ   € Ü�H‰H‹JˆØ	�
‰
�1�a¤§¡ˆ
Ô(Ø	�
‰
�1�a¤§¡¨£ˆ
Ô,Ø	�
‰
�1�a ˆ
Ô$Ø	�
‰
�1�a¤§	¡	¨#£ˆ
Ô/ÜÜ×"Ñ" 1Ó%Ô';ÀÀaÈAÐRSÑ<TÓ'Uô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ô';ÀÀaÈAÐRSÑ<TÓ'Uô
ð 	
ñ 
r   c           
      ó
  — t        j                  «       }|j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       t        t        j                  |«      t        ddd	œ«      «      sJ ‚t        t        j                  |d
¬«      t        dddddœ«      «      sJ ‚t        t        j                  |«      t        dddœ«      «      sJ ‚y )Nr   r)   r   r+   éþÿÿÿr,   éÿÿÿÿiúÿÿÿr2   T)Úmaxcardinalityr.   r/   r   r   s     r   Útest_negative_weightsz+TestMaxWeightMatching.test_negative_weightsm   sö   € Ü�H‰H‹JˆØ	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô#Ø	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô#Ø	�
‰
�1�a ˆ
Ô#ÜÜ×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ð 
ô Ü×"Ñ" 1°TÔ:Ü  Q¨1°°qÑ!9Ó:ô
ð 	
ð 
ô Ü×"Ñ" 1Ó%Ô';ÀÀa¹LÓ'Iô
ð 	
ñ 
r   c           	      óÄ  — t        j                  «       }|j                  g d¢«       t        dddddœ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚|j                  ddg«       t        d	ddd
dddœ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z-Create S-blossom and use it for augmentation:)©r   r)   é   ©r   r+   é	   ©r)   r+   r#   )r+   r,   é   r)   r   r,   r+   r.   )r   é   r*   )r,   r*   rI   rI   r*   ©r   r)   r+   r,   r*   rI   N©r
   r   Úadd_weighted_edges_fromr   r   r   r   ©r   r   Úanswers      r   Útest_s_blossomz$TestMaxWeightMatching.test_s_blossom   sÅ   € ä�H‰H‹JˆØ	×!Ñ!Ò"OÔPÜ%¨!°°a¸AÑ&>Ó?ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=à	×!Ñ! 9¨iÐ"8Ô9Ü%¨!°°a¸AÀ!ÈÑ&JÓKˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c           	      óÂ  — t        j                  «       }|j                  g d¢«       t        dddddddœ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚|j                  ddd¬	«       |j                  ddd¬	«       t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚|j                  dd«       |j                  ddd¬	«       t        dddddddœ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y
)z=Create S-blossom, relabel as T-blossom, use for augmentation:)©r   r)   rF   ©r   r+   rD   rG   )r   r,   r*   )r,   r*   r,   )r   rI   r+   rI   r+   r)   r*   r,   r   rJ   r   N)	r
   r   rL   r   r   r   r   r   Úremove_edgerM   s      r   Útest_s_t_blossomz&TestMaxWeightMatching.test_s_t_blossomŒ   s4  € ä�H‰H‹JˆØ	×!Ñ!ÚOô	
ô &¨!°°a¸AÀ!ÈÑ&JÓKˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=à	�
‰
�1�a ˆ
Ô"Ø	�
‰
�1�a ˆ
Ô"Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=à	�‰�a˜ÔØ	�
‰
�1�a ˆ
Ô"Ü%¨!°°a¸AÀ!ÈÑ&JÓKˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 óŒ  — t        j                  «       }|j                  g d¢«       dddddddœ}t        |«      D �ch c]  }t	        |«      ’Œ }}t        j
                  |«      D �ch c]  }t	        |«      ’Œ }}||k(  sJ ‚t        j                  |«      D �ch c]  }t	        |«      ’Œ }}||k(  sJ ‚y	c c}w c c}w c c}w )
z.Create nested S-blossom, use for augmentation:)rQ   rE   rG   )r)   r,   rD   )r+   r*   rD   )r,   r*   r#   )r*   rI   rI   r+   r,   r   r)   rI   r*   rJ   N)r
   r   rL   r   Ú	frozensetr   r   )r   r   Údict_formatÚeÚexpectedrN   s         r   Útest_nested_s_blossomz+TestMaxWeightMatching.test_nested_s_blossom¡   s¾   € ô �H‰H‹JˆØ	×!Ñ!òô
	
ð   a¨A°!¸Ñ:ˆÜ*>¸{Ó*KÖL Q”I˜a•LÐLˆÐLÜ(*×(>Ñ(>¸qÓ(AÖB 1”)˜A•,ÐBˆÐBØ˜Ò!Ð!Ð!Ü(*×(>Ñ(>¸qÓ(AÖB 1”)˜A•,ÐBˆÐBØ˜Ò!Ð!Ñ!ùò	 MùÚBùâBs   ¾B7Á)B<ÂCc                 óþ   — t        j                  «       }|j                  g d¢«       t        dddddddd	d
œ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z<Create S-blossom, relabel as S, include in nested S-blossom:)	)r   r)   r#   )r   rH   r#   )r)   r+   é   )r+   r,   é   )r+   r*   r]   ©r,   r*   é   )r*   rI   r#   )rI   rH   r#   )rH   rD   rD   r)   r   r,   r+   rI   r*   rD   rH   ©r   r)   r+   r,   r*   rI   rH   rD   NrK   rM   s      r   Útest_nested_s_blossom_relabelz3TestMaxWeightMatching.test_nested_s_blossom_relabel·   ót   € ä�H‰H‹JˆØ	×!Ñ!ò
ô	
ô &¨!°°a¸AÀ!ÈÈaÐTUÑ&VÓWˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 óþ   — t        j                  «       }|j                  g d¢«       t        dddddddd	d
œ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z5Create nested S-blossom, augment, expand recursively:)
rC   rR   rG   )r)   r,   r\   )r+   r*   r\   )r,   r*   é   )r,   rI   r\   )r*   rH   r\   )rI   rH   rd   )rH   rD   r\   r)   r   r*   rI   r+   r,   rD   rH   r`   NrK   rM   s      r   Útest_nested_s_blossom_expandz2TestMaxWeightMatching.test_nested_s_blossom_expandË   st   € ä�H‰H‹JˆØ	×!Ñ!òô	
ô &¨!°°a¸AÀ!ÈÈaÐTUÑ&VÓWˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 óþ   — t        j                  «       }|j                  g d¢«       t        dddddddd	d
œ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z'Create S-blossom, relabel as T, expand:))r   r)   é   )r   r*   é   )r   rI   é   ©r)   r+   r_   )r+   r,   rh   r^   )r,   rD   rd   )r*   rH   é   rI   r+   r)   rD   rH   r   r*   r,   r`   NrK   rM   s      r   Útest_s_blossom_relabel_expandz3TestMaxWeightMatching.test_s_blossom_relabel_expandà   st   € ä�H‰H‹JˆØ	×!Ñ!ò	ô	
ô &¨!°°a¸AÀ!ÈÈaÐTUÑ&VÓWˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 óþ   — t        j                  «       }|j                  g d¢«       t        dddddddd	d
œ«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z.Create nested S-blossom, relabel as T, expand:)	)r   r)   é   )r   r+   r]   )r   rD   rD   rj   )r)   r,   é   )r+   r*   ro   )r,   r*   rk   )r,   rH   rH   )r*   rI   rH   rD   r+   r)   rH   rI   r*   r,   r   r`   NrK   rM   s      r   Ú$test_nested_s_blossom_relabel_expandz:TestMaxWeightMatching.test_nested_s_blossom_relabel_expandó   rb   r   c                 ó  — t        j                  «       }|j                  g d¢«       dddddddd	d
ddœ
}t        |«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)zTCreate blossom, relabel as T in more than one way, expand,
        augment:
        )
©r   r)   é-   ©r   r*   rs   ©r)   r+   é2   ©r+   r,   rs   ©r,   r*   rv   ©r   rI   é   ©r+   rF   é#   )r,   rD   r|   ©r*   rH   é   ©rF   r#   r*   rI   r+   r)   rD   rH   r   r*   r,   r#   rF   ©
r   r)   r+   r,   r*   rI   rH   rD   rF   r#   NrK   )r   r   ÚansdictrN   s       r   Útest_nasty_blossom1z)TestMaxWeightMatching.test_nasty_blossom1  s~   € ô �H‰H‹JˆØ	×!Ñ!òô	
ð ˜A !¨¨a°A¸!ÀÀbÈaÑPˆÜ% gÓ.ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 ó  — t        j                  «       }|j                  g d¢«       dddddddd	d
ddœ
}t        |«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)zAgain but slightly different:)
rr   rt   ru   rw   rx   ry   r{   )r,   rD   r~   )r*   rH   é(   r   rI   r+   r)   rD   rH   r   r*   r,   r#   rF   r€   NrK   ©r   r   ÚansrN   s       r   Útest_nasty_blossom2z)TestMaxWeightMatching.test_nasty_blossom2  s|   € ä�H‰H‹JˆØ	×!Ñ!òô	
ð ˜˜a A¨!°°a¸AÀ"È!ÑLˆÜ% cÓ*ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 ó  — t        j                  «       }|j                  g d¢«       dddddddd	d
ddœ
}t        |«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)zuCreate blossom, relabel as T, expand such that a new
        least-slack S-to-free dge is produced, augment:
        )
rr   rt   ru   rw   rx   ry   r{   )r,   rD   é   r}   r   rI   r+   r)   rD   rH   r   r*   r,   r#   rF   r€   NrK   r…   s       r   Útest_nasty_blossom_least_slackz4TestMaxWeightMatching.test_nasty_blossom_least_slack5  s~   € ô �H‰H‹JˆØ	×!Ñ!òô	
ð ˜˜a A¨!°°a¸AÀ"È!ÑLˆÜ% cÓ*ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 ó
  — t        j                  «       }|j                  g d¢«       dddddddd	d
ddddœ}t        |«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z8Create nested blossom, relabel as T in more than one way)rr   )r   rH   rs   ru   rw   )r,   r*   é_   )r,   rI   é^   )r*   rI   r�   )rI   rH   rv   )r   rD   rz   )r+   r%   r|   )r*   rF   é$   )rH   r#   r~   )r%   r\   r*   rD   r+   r)   rI   rF   r,   r#   r   r*   rH   r\   r%   )r   r)   r+   r,   r*   rI   rH   rD   rF   r#   r%   r\   NrK   r…   s       r   Útest_nasty_blossom_augmentingz3TestMaxWeightMatching.test_nasty_blossom_augmentingM  s‘   € ô �H‰H‹JˆØ	×!Ñ!òô	
ð$ ØØØØØØØØØØØñ
ˆô & cÓ*ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 ó  — t        j                  «       }|j                  g d¢«       dddddddd	d
ddœ
}t        |«      }t	        t        j
                  |«      |«      sJ ‚t	        t        j                  |«      |«      sJ ‚y)z:Create nested S-blossom, relabel as S, expand recursively:))r   r)   r„   )r   r+   r„   )r)   r+   é<   )r)   r,   é7   )r+   r*   r’   rx   )r   rD   ri   )r*   rH   rz   )rH   rI   r#   )rD   r#   r#   )r,   rF   rz   r)   r   r*   rF   r+   rH   rI   r#   r,   rD   r€   NrK   r…   s       r   Ú%test_nasty_blossom_expand_recursivelyz;TestMaxWeightMatching.test_nasty_blossom_expand_recursivelyu  s|   € ä�H‰H‹JˆØ	×!Ñ!òô	
ð ˜˜a A¨!°°a¸BÀ1È!ÑLˆÜ% cÓ*ˆÜœ2×1Ñ1°!Ó4°fÔ=Ð=Ð=Üœ2×1Ñ1°!Ó4°fÔ=Ð=Ñ=r   c                 óŒ  — t         j                  }t        |t         j                  t        j                  «       «       t        |t         j                  t        j
                  «       «       t        |t         j                  t        j                  «       «       t        |t         j                  t        j                  «       «       y ©N)r
   ÚNetworkXNotImplementedr   r   Ú
MultiGraphÚMultiDiGraphÚDiGraphr   ©r   Úerrors     r   Útest_wrong_graph_typez+TestMaxWeightMatching.test_wrong_graph_typeŒ  sn   € Ü×)Ñ)ˆÜˆu”b×,Ñ,¬b¯m©m«oÔ>Üˆu”b×,Ñ,¬b¯o©oÓ.?Ô@Üˆu”b×,Ñ,¬b¯j©j«lÔ;Üˆu”b×,Ñ,¬b¯j©j«lÕ;r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r'   r0   r3   r6   r<   rA   rO   rT   rZ   ra   re   rl   rp   r‚   r‡   rŠ   r�   r“   rœ   © r   r   r   r      sv   „ ñò
2ò2ò
ò
ò
ò$
ò
ò
ò
ò$>ò>ò*"ò,>ò(>ò*>ò&>ò(>ò0>ò,>ò0&>òP>ó.<r   r   c                   óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚTestIsMatchingzXUnit tests for the
    :func:`~networkx.algorithms.matching.is_matching` function.

    c                 óh   — t        j                  d«      }t        j                  |dddddœ«      sJ ‚y ©Nr,   r   r   r+   r)   )r   r   r)   r+   ©r
   Ú
path_graphÚis_matchingr   s     r   Ú	test_dictzTestIsMatching.test_dictš  s-   € Ü�M‰M˜!ÓˆÜ�~‰~˜a Q¨1°°qÑ!9Ô:Ð:Ñ:r   c                 ón   — t        j                  d«      }t        j                  |t        «       «      sJ ‚y )Nr,   )r
   r§   r¨   r   r   s     r   Útest_empty_matchingz"TestIsMatching.test_empty_matchingž  s&   € Ü�M‰M˜!ÓˆÜ�~‰~˜a¤£Ô'Ð'Ñ'r   c                 ó`   — t        j                  d«      }t        j                  |dh«      sJ ‚y )Nr,   r2   r¦   r   s     r   r   zTestIsMatching.test_single_edge¢  s&   € Ü�M‰M˜!ÓˆÜ�~‰~˜a & Ô*Ð*Ñ*r   c                 óþ   — t        j                  d«      }t        j                  |ddh«      sJ ‚t        j                  |ddh«      sJ ‚t        j                  |ddh«      sJ ‚t        j                  |ddh«      sJ ‚y )Nr,   r   r-   ©r   r   )r+   r)   r¦   r   s     r   Útest_edge_orderzTestIsMatching.test_edge_order¦  st   € Ü�M‰M˜!ÓˆÜ�~‰~˜a &¨&Ð!1Ô2Ð2Ð2Ü�~‰~˜a &¨&Ð!1Ô2Ð2Ð2Ü�~‰~˜a &¨&Ð!1Ô2Ð2Ð2Ü�~‰~˜a &¨&Ð!1Ô2Ð2Ñ2r   c                 ób   — t        j                  d«      }t        j                  |ddh«      sJ ‚y ©Nr,   r   r-   r¦   r   s     r   Útest_valid_matchingz"TestIsMatching.test_valid_matching­  s)   € Ü�M‰M˜!ÓˆÜ�~‰~˜a &¨&Ð!1Ô2Ð2Ñ2r   c                 ó  — t         j                  }t        j                  d«      }t        |t         j                  |ddh«       t        |t         j                  |ddh«       t        |t         j                  |ddh«       y )Nr,   ©r   r*   r-   ©r   r   r)   ©r   )r
   ÚNetworkXErrorr§   r   r¨   ©r   r›   r   s      r   Útest_invalid_inputz!TestIsMatching.test_invalid_input±  s_   € Ü× Ñ ˆÜ�M‰M˜!Óˆäˆu”b—n‘n a¨&°&Ð)9Ô:äˆu”b—n‘n a¨)°VÐ)<Ô=Üˆu”b—n‘n a¨$°¨Õ8r   c                 ó  — t         j                  }t        j                  d«      }t        |t         j                  |ddh«       t        j                  |h d£«      rJ ‚|j                  dd«       t        j                  |ddh«      rJ ‚y ©Nr,   )r*   r*   r-   >   ©r   r   r2   r-   r   r¼   r2   )r
   r·   r§   r   r¨   r   r¸   s      r   Útest_selfloopszTestIsMatching.test_selfloopsº  sq   € Ü× Ñ ˆÜ�M‰M˜!Óˆäˆu”b—n‘n a¨&°&Ð)9Ô:ä—>‘> !Ò%=Ô>Ð>Ð>à	�
‰
�1�aÔÜ—>‘> ! f¨fÐ%5Ô6Ð6Ð6Ð6r   c                 ób   — t        j                  d«      }t        j                  |h d£«      rJ ‚y )Nr,   ¾   r   r2   r-   r¦   r   s     r   Útest_invalid_matchingz$TestIsMatching.test_invalid_matchingÅ  s(   € Ü�M‰M˜!ÓˆÜ—>‘> !Ò%=Ô>Ð>Ð>Ð>r   c                 óZ  — t        j                  d«      }t        j                  |ddh«      rJ ‚t        t         j                  t         j                  |dh«       t        j
                  |j                  «      }t        j                  |dh«      sJ ‚t        j                  |dh«      rJ ‚y )Nr,   ©r   r+   r2   )r   r’   r   r®   )r
   r§   r¨   r   r·   r™   Úedgesr   s     r   Útest_invalid_edgez TestIsMatching.test_invalid_edgeÉ  s„   € Ü�M‰M˜!ÓˆÜ—>‘> ! f¨fÐ%5Ô6Ð6Ð6ÜŒr×Ñ¤§¡°°W°IÔ>ä�J‰J�q—w‘wÓˆÜ�~‰~˜a & Ô*Ð*Ð*Ü—>‘> ! f XÔ.Ð.Ð.Ð.r   N)r�   rž   rŸ   r    r©   r«   r   r¯   r²   r¹   r½   rÀ   rÄ   r¡   r   r   r£   r£   ”  s4   „ ñò
;ò(ò+ò3ò3ò9ò	7ò?ó/r   r£   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestIsMaximalMatchingz`Unit tests for the
    :func:`~networkx.algorithms.matching.is_maximal_matching` function.

    c                 óh   — t        j                  d«      }t        j                  |dddddœ«      sJ ‚y r¥   ©r
   r§   Úis_maximal_matchingr   s     r   r©   zTestIsMaximalMatching.test_dictÙ  ó/   € Ü�M‰M˜!ÓˆÜ×%Ñ% a¨Q°1¸¸qÑ)AÔBÐBÑBr   c                 ó:  — t         j                  }t        j                  d«      }t        |t         j                  |dh«       t        |t         j                  |dh«       t        |t         j                  |ddh«       t        |t         j                  |ddh«       y ©Nr,   r´   )r*   r   rµ   r-   r¶   )r
   r·   r§   r   rÉ   r¸   s      r   r¹   z(TestIsMaximalMatching.test_invalid_inputÝ  óx   € Ü× Ñ ˆÜ�M‰M˜!Óˆäˆu”b×,Ñ,¨a°&°Ô:Üˆu”b×,Ñ,¨a°&°Ô:äˆu”b×,Ñ,¨a°)¸VÐ1DÔEÜˆu”b×,Ñ,¨a°$¸°Õ@r   c                 ób   — t        j                  d«      }t        j                  |ddh«      sJ ‚y r±   rÈ   r   s     r   Ú
test_validz TestIsMaximalMatching.test_validç  ó+   € Ü�M‰M˜!ÓˆÜ×%Ñ% a¨&°&Ð)9Ô:Ð:Ñ:r   c                 óê   — t        j                  d«      }t        j                  |h d£«      rJ ‚t        j                  |dh«      rJ ‚|j                  dd«       t        j                  |dh«      rJ ‚y )Nr,   r¿   rÂ   r   r¼   )r
   r§   rÉ   r   r   s     r   Útest_not_matchingz'TestIsMaximalMatching.test_not_matchingë  sh   € Ü�M‰M˜!ÓˆÜ×)Ñ)¨!Ò-EÔFÐFÐFÜ×)Ñ)¨!¨f¨XÔ6Ð6Ð6Ø	�
‰
�1�aÔÜ×)Ñ)¨!¨f¨XÔ6Ð6Ð6Ð6r   c                 ó`   — t        j                  d«      }t        j                  |dh«      rJ ‚y )Nr,   r   rÈ   r   s     r   Útest_not_maximalz&TestIsMaximalMatching.test_not_maximalò  s+   € Ü�M‰M˜!ÓˆÜ×)Ñ)¨!¨f¨XÔ6Ð6Ð6Ð6r   N)	r�   rž   rŸ   r    r©   r¹   rÏ   rÒ   rÔ   r¡   r   r   rÆ   rÆ   Ó  s"   „ ñò
CòAò;ò7ó7r   rÆ   c                   ó:   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚTestIsPerfectMatchingz`Unit tests for the
    :func:`~networkx.algorithms.matching.is_perfect_matching` function.

    c                 óh   — t        j                  d«      }t        j                  |dddddœ«      sJ ‚y r¥   ©r
   r§   Úis_perfect_matchingr   s     r   r©   zTestIsPerfectMatching.test_dictý  rÊ   r   c                 ób   — t        j                  d«      }t        j                  |ddh«      sJ ‚y r±   rØ   r   s     r   rÏ   z TestIsPerfectMatching.test_valid  rÐ   r   c                 óÎ   — t        j                  d«      }|j                  dd«       |j                  dd«       |j                  dd«       t        j                  |h d£«      sJ ‚y )Nr,   r   r   r*   r)   >   ©r*   r)   rÂ   ©r   r,   ©r
   Úcycle_graphr   rÙ   r   s     r   Útest_valid_not_pathz)TestIsPerfectMatching.test_valid_not_path  sQ   € Ü�N‰N˜1ÓˆØ	�
‰
�1�aÔØ	�
‰
�1�aÔØ	�
‰
�1�aÔä×%Ñ% aÒ)AÔBÐBÑBr   c                 ó:  — t         j                  }t        j                  d«      }t        |t         j                  |dh«       t        |t         j                  |dh«       t        |t         j                  |ddh«       t        |t         j                  |ddh«       y rÌ   )r
   r·   r§   r   rÙ   r¸   s      r   r¹   z(TestIsPerfectMatching.test_invalid_input  rÍ   r   c                 ó  — t         j                  }t        j                  d«      }t        |t         j                  |ddh«       t        j                  |h d£«      rJ ‚|j                  dd«       t        j                  |ddh«      rJ ‚y r»   )r
   r·   r§   r   rÙ   r   r¸   s      r   r½   z$TestIsPerfectMatching.test_selfloops  sw   € Ü× Ñ ˆÜ�M‰M˜!Óˆäˆu”b×,Ñ,¨a°&¸&Ð1AÔBä×)Ñ)¨!Ò-EÔFÐFÐFà	�
‰
�1�aÔÜ×)Ñ)¨!¨f°fÐ-=Ô>Ð>Ð>Ð>r   c                 ó”   — t        j                  d«      }t        j                  |dh«      rJ ‚t        j                  |h d£«      rJ ‚y )Nr,   rÂ   r¿   rØ   r   s     r   rÒ   z'TestIsPerfectMatching.test_not_matching"  sB   € Ü�M‰M˜!ÓˆÜ×)Ñ)¨!¨f¨XÔ6Ð6Ð6Ü×)Ñ)¨!Ò-EÔFÐFÐFÐFr   c                 óª   — t        j                  d«      }|j                  dd«       |j                  dd«       t        j                  |ddh«      rJ ‚y )Nr,   r   r   rÝ   rÂ   rÞ   r   s     r   Útest_maximal_but_not_perfectz2TestIsPerfectMatching.test_maximal_but_not_perfect'  sJ   € Ü�N‰N˜1ÓˆØ	�
‰
�1�aÔØ	�
‰
�1�aÔä×)Ñ)¨!¨f°fÐ-=Ô>Ð>Ð>Ð>r   N)r�   rž   rŸ   r    r©   rÏ   rà   r¹   r½   rÒ   rå   r¡   r   r   rÖ   rÖ   ÷  s.   „ ñò
Cò;òCòAò	?òGó
?r   rÖ   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestMaximalMatchingzTUnit tests for the
    :func:`~networkx.algorithms.matching.maximal_matching`.

    c                 ó�   — g d¢}t        j                  |«      }t        j                  |«      }t        j                  ||«      sJ ‚y )N)r2   )r   r*   r-   )r)   r*   )r+   r,   )r+   rI   )r*   rI   )r
   r   Úmaximal_matchingrÉ   )r   rÃ   r   Úmatchings       r   r²   z'TestMaximalMatching.test_valid_matching5  s:   € ÚHˆÜ�H‰H�U‹OˆÜ×&Ñ& qÓ)ˆÜ×%Ñ% a¨Ô2Ð2Ñ2r   c                 ó¨   — t        j                  d«      }t        j                  |«      }dt        |«      k(  sJ ‚t        j                  ||«      sJ ‚y )Nr*   r   )r
   Ú
star_graphré   ÚlenrÉ   ©r   r   rê   s      r   Útest_single_edge_matchingz-TestMaximalMatching.test_single_edge_matching;  sH   € ä�M‰M˜!ÓˆÜ×&Ñ& qÓ)ˆØ”C˜“MÒ!Ð!Ð!Ü×%Ñ% a¨Ô2Ð2Ñ2r   c                 óö   — t        j                  d«      }|j                  ddg«       t        j                  |«      }t	        |«      dk(  sJ ‚t        d„ |D «       «      rJ ‚t        j                  ||«      sJ ‚y )Nr+   r¼   )r   r   r   c              3   ó,   K  — | ]  \  }}||k(  –— Œ y ­wr•   r¡   )Ú.0ÚuÚvs      r   ú	<genexpr>z6TestMaximalMatching.test_self_loops.<locals>.<genexpr>I  s   è ø€ Ò3¡$ ! Q�q˜A•vÑ3ùs   ‚)r
   r§   Úadd_edges_fromré   rí   ÚanyrÉ   rî   s      r   Útest_self_loopsz#TestMaximalMatching.test_self_loopsB  so   € ä�M‰M˜!ÓˆØ	×Ñ˜& &Ð)Ô*Ü×&Ñ& qÓ)ˆÜ�8‹} Ò!Ð!Ð!äÑ3¨(Ô3Ô3Ð3Ð3Ü×%Ñ% a¨Ô2Ð2Ñ2r   c                 ó   — t        t        d«      «      D ]w  }t        j                  «       }|j	                  |«       |j                  ddg«       t        j                  |«      }t        |«      dk(  sJ ‚t        j                  ||«      rŒwJ ‚ y)z„Tests that a maximal matching is computed correctly
        regardless of the order in which nodes are added to the graph.

        r+   r   )r   r)   r   N)	r   Úranger
   r   Úadd_nodes_fromrö   ré   rí   rÉ   )r   Únodesr   rê   s       r   Útest_orderingz!TestMaximalMatching.test_orderingL  s€   € ô
 "¤%¨£(Ó+ò 	7ˆEÜ—‘“
ˆAØ×Ñ˜UÔ#Ø×Ñ˜f fÐ-Ô.Ü×*Ñ*¨1Ó-ˆHÜ�x“= AÒ%Ð%Ð%Ü×)Ñ)¨!¨XÕ6Ð6Ð6ñ	7r   c                 ó2  — t         j                  }t        |t         j                  t        j                  «       «       t        |t         j                  t        j
                  «       «       t        |t         j                  t        j                  «       «       y r•   )r
   r–   r   ré   r—   r˜   r™   rš   s     r   rœ   z)TestMaximalMatching.test_wrong_graph_typeY  sV   € Ü×)Ñ)ˆÜˆu”b×)Ñ)¬2¯=©=«?Ô;Üˆu”b×)Ñ)¬2¯?©?Ó+<Ô=Üˆu”b×)Ñ)¬2¯:©:«<Õ8r   N)	r�   rž   rŸ   r    r²   rï   rø   rý   rœ   r¡   r   r   rç   rç   /  s    „ ñò
3ò3ò3ò7ó9r   rç   )r8   Ú	itertoolsr   Úpytestr   Únetworkxr
   Únetworkx.algorithms.matchingr   Únetworkx.utilsr   r   r£   rÆ   rÖ   rç   r¡   r   r   ú<module>r     sO   ðÛ Ý "å ã Ý =Ý &÷F<ñ F<÷R</ñ </÷~!7ñ !7÷H5?ñ 5?÷p.9ò .9r   