Ë
    çÍ:jv<  ã                   óŒ   — d dl mZ d dlZd dlmZmZmZmZ  G d„ d«      Z G d„ d«      Z	 G d„ d	«      Z
d
„ Zd„ Z G d„ d«      Zy)é    )ÚTupleN)Úedit_distanceÚedit_distance_alignÚjaro_similarityÚjaro_winkler_similarityc                   óp   — e Zd Zej                  j                  dg d¢«      dedededeeef   fd„«       Z	y)	ÚTestEditDistancez&left,right,substitution_cost,expecteds))ÚabcÚcaé   ©é   é   )r
   r   é   r   )ÚwantsÚwaspr   ©r   r   )r   r   r   r   )ÚrainÚshiner   r   )r   r   r   ©r   r   )ÚacbdefÚabcdefr   ©r   r   )r   r   r   r   )ÚlnaguaegÚlanguager   ©r   é   )r   r   r   r   )Úlnaugager   r   r   )r   r   r   r   )Úlngauager   r   ©r   r   )r   r   r   r    )r   Úswimr   r   )r   r!   r   )é   é   )ÚkittenÚsittingr   r   )r$   r%   r   r   )Ú
duplicatedÚduuplicatedr   ©r   r   )r&   r'   r   r(   )zvery duplicatedzvery duuplicateedr   r    ÚleftÚrightÚsubstitution_costÚ	expectedsc                 ó|   — ||f||ffD ]1  \  }}t        |ddg«      D ]  \  }}t        ||||¬«      }	|	|k(  rŒJ ‚ Œ3 y)a\  
        Test `edit_distance` between two strings, given some `substitution_cost`,
        and whether transpositions are allowed.

        :param str left: First input string to `edit_distance`.
        :param str right: Second input string to `edit_distance`.
        :param int substitution_cost: The cost of a substitution action in `edit_distance`.
        :param Tuple[int, int] expecteds: A tuple of expected outputs, such that `expecteds[0]` is
            the expected output with `transpositions=True`, and `expecteds[1]` is
            the expected output with `transpositions=False`.
        TF)r+   ÚtranspositionsN)Úzipr   )
Úselfr)   r*   r+   r,   Ús1Ús2Úexpectedr.   Ú	predicteds
             úq/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/nltk/test/unit/test_distance.pyÚtest_with_transpositionsz)TestEditDistance.test_with_transpositions   sj   € ð^ ˜e�} u¨d mÐ4ò 		-‰FˆB�ä,/°	¸DÀ%¸=Ó,Iò -Ñ(�˜.Ü)ØØØ&7Ø#1ô	�	ð ! HÓ,Ð,Ð,ñ-ñ		-ó    N)
Ú__name__Ú
__module__Ú__qualname__ÚpytestÚmarkÚparametrizeÚstrÚintÚtupler6   © r7   r5   r	   r	      sZ   „ Ø‡[�[×ÑØ0ò\	
ó_ð@-Øð-Ø #ð-Ø8;ð-ØHMÈcÐSVÈhÉò-óA_ñ@-r7   r	   c                   ó¾   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zej                  j                  dg d¢«      d„ «       Zej                  j                  d	g d
¢«      d„ «       Zd„ Zy)ÚTestJaroSimilarityz;Tests for jaro_similarity against the algorithm pseudocode.c                 ó&   — t        dd«      dk(  sJ ‚y)z,Identical empty strings have similarity 1.0.Ú ç      ð?N©r   ©r0   s    r5   Útest_both_emptyz"TestJaroSimilarity.test_both_empty�   s   € ä˜r 2Ó&¨#Ò-Ð-Ñ-r7   c                 óH   — t        dd«      dk(  sJ ‚t        dd«      dk(  sJ ‚y)z-Empty vs non-empty string has similarity 0.0.rE   r
   ç        NrG   rH   s    r5   Útest_empty_vs_nonemptyz)TestJaroSimilarity.test_empty_vs_nonempty”   s,   € ä˜r 5Ó)¨SÒ0Ð0Ð0Ü˜u bÓ)¨SÒ0Ð0Ñ0r7   c                 ó&   — t        dd«      dk(  sJ ‚y)z«Single-char identical strings have similarity 1.0.

        Regression: match_bound = max(1,1)//2 - 1 = -1 caused 0
        matches, returning 0.0 instead of 1.0.
        ÚarF   NrG   rH   s    r5   Útest_single_char_identicalz-TestJaroSimilarity.test_single_char_identical™   s   € ô ˜s CÓ(¨CÒ/Ð/Ñ/r7   c                 ó&   — t        dd«      dk(  sJ ‚y ©NrN   ÚbrK   rG   rH   s    r5   Útest_single_char_differentz-TestJaroSimilarity.test_single_char_different¡   s   € Ü˜s CÓ(¨CÒ/Ð/Ñ/r7   zs1,s2,expected))ÚMARTHAÚMARHTAgh‘í|?5î?)ÚDWAYNEÚDUANEgçû©ñÒMê?)ÚDIXONÚDICKSONgHáz®Gé?)ÚCRATEÚTRACEgÛù~j¼tç?)Úbillyr\   rF   )r\   ÚbillgB`åÐ"Ûí?)r\   ÚsusanrK   c                 ó:   — t        t        ||«      d«      |k(  sJ ‚y )Nr   )Úroundr   )r0   r1   r2   r3   s       r5   Útest_known_valuesz$TestJaroSimilarity.test_known_values¨   s    € ô ”_ R¨Ó,¨aÓ0°HÒ<Ð<Ñ<r7   zs1,s2)©rT   rU   )r
   rE   )rN   rR   )rX   rY   c                 ó:   — t        ||«      t        ||«      k(  sJ ‚y )NrG   ©r0   r1   r2   s      r5   Útest_symmetryz TestJaroSimilarity.test_symmetry»   s    € ô ˜r 2Ó&¬/¸"¸bÓ*AÒAÐAÑAr7   c                 óä   — t        t        dd«      t        «      sJ ‚t        t        dd«      t        «      sJ ‚t        t        dd«      t        «      sJ ‚t        t        dd«      t        «      sJ ‚y)z(All return paths should produce a float.rN   rR   rE   rT   rU   N)Ú
isinstancer   ÚfloatrH   s    r5   Útest_return_type_is_floatz,TestJaroSimilarity.test_return_type_is_floatË   s^   € äœ/¨#¨sÓ3´UÔ;Ð;Ð;Üœ/¨#¨sÓ3´UÔ;Ð;Ð;Üœ/¨"¨bÓ1´5Ô9Ð9Ð9Üœ/¨(°HÓ=¼uÔEÐEÑEr7   N)r8   r9   r:   Ú__doc__rI   rL   rO   rS   r;   r<   r=   ra   re   ri   rA   r7   r5   rC   rC   ‰   sw   „ ÙEò.ò1ò
0ò0ð ‡[�[×ÑØò	
óñ=óð=ð ‡[�[×ÑØò	
óñBóðBóFr7   rC   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTestJaroWinklerSimilarityz-Tests for jaro_winkler_similarity edge cases.c                 ó&   — t        dd«      dk(  sJ ‚y )NrE   rF   ©r   rH   s    r5   rI   z)TestJaroWinklerSimilarity.test_both_emptyÖ   s   € Ü& r¨2Ó.°#Ò5Ð5Ñ5r7   c                 ó&   — t        dd«      dk(  sJ ‚y )NrN   rF   rn   rH   s    r5   rO   z4TestJaroWinklerSimilarity.test_single_char_identicalÙ   ó   € Ü& s¨CÓ0°CÒ7Ð7Ñ7r7   c                 ó&   — t        dd«      dk(  sJ ‚y rQ   rn   rH   s    r5   rS   z4TestJaroWinklerSimilarity.test_single_char_differentÜ   rp   r7   c                 ó:   — t        t        dd«      d«      dk(  sJ ‚y )NrT   rU   r   g�—nƒÀî?)r`   r   rH   s    r5   Útest_known_valuez*TestJaroWinklerSimilarity.test_known_valueß   s   € ÜÔ,¨X°xÓ@À!ÓDÈÒMÐMÑMr7   c                 óD   — d\  }}t        ||«      t        ||«      k\  sJ ‚y)z:Winkler similarity >= Jaro similarity for common prefixes.rb   N)r   r   rd   s      r5   Útest_winkler_ge_jaroz.TestJaroWinklerSimilarity.test_winkler_ge_jaroâ   s'   € à#‰ˆˆBÜ& r¨2Ó.´/À"ÀbÓ2IÒIÐIÑIr7   N)	r8   r9   r:   rj   rI   rO   rS   rs   ru   rA   r7   r5   rl   rl   Ó   s    „ Ù7ò6ò8ò8òNóJr7   rl   c                 óˆ   — t        t        | «      dz
  «      D ](  }| |   \  }}| |dz      \  }}||dz   k(  sŒ||dz   k(  sŒ( y y)zTCheck that no step in the alignment is a diagonal move between mismatched positions.r   FT©ÚrangeÚlen)Ú	alignmentÚkÚi1Új1Úi2Új2s         r5   Ú_alignment_has_no_substitutionsr€   è   s[   € ä”3�y“> AÑ%Ó&ò ˆØ˜1‘‰ˆˆBØ˜1˜q™5Ñ!‰ˆˆBØ��a‘‹<˜B " q¡&›LÙð	ð
 r7   c                 óú   — d}t        t        | «      dz
  «      D ]^  }| |   \  }}| |dz      \  }}	||dz   k(  r|	|dz   k(  r||   ||   k7  sŒ2||z  }Œ8||dz   k(  r|	|k(  r|dz  }ŒK||k(  sŒQ|	|dz   k(  sŒZ|dz  }Œ` |S )z'Compute the total cost of an alignment.r   r   rw   )
rz   r1   r2   r+   Úcostr{   r|   r}   r~   r   s
             r5   Ú_alignment_costrƒ   ò   s®   € à€DÜ”3�y“> AÑ%Ó&ò ˆØ˜1‘‰ˆˆBØ˜1˜q™5Ñ!‰ˆˆBØ��a‘Š<˜B " q¡&šLà�"‰v˜˜B™ÓØÐ)Ñ)‘à�2˜‘6Š\˜b BšhØ�A‰I‰DØ�2‹X˜"  Q¡›,Ø�A‰I‰Dðð €Kr7   c                   óš  — 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ej                   j#                  ddddddd ed«      fdd ed«      fdddg	«      d„ «       Zej                   j#                  dddd ed«      fddd ed«      fg«      d„ «       Zej                   j#                  dddd ed«      fdg«      d„ «       Zy )!ÚTestEditDistanceAlignc                 ó.   — t        dd«      }|g d¢k(  sJ ‚y)zBDocstring example: rain -> shine with default substitution_cost=1.r   r   )©r   r   r(   r    r   )r   r   )r   r   N©r   ©r0   Úresults     r5   Útest_default_rain_to_shinez0TestEditDistanceAlign.test_default_rain_to_shine  s   € ä$ V¨WÓ5ˆØÒIÒIÐIÑIr7   c                 ó.   — t        dd«      }|g d¢k(  sJ ‚y)z;Identical strings should produce a pure diagonal alignment.r
   ©r‡   r(   r    r   Nrˆ   r‰   s     r5   Útest_identical_stringsz,TestEditDistanceAlign.test_identical_strings
  s   € ä$ U¨EÓ2ˆØÒ9Ò9Ð9Ñ9r7   c                 ó.   — t        dd«      }|g d¢k(  sJ ‚y)zEmpty s1 -> all insertions.rE   r
   )r‡   ©r   r   )r   r   )r   r   Nrˆ   r‰   s     r5   Útest_empty_to_nonemptyz,TestEditDistanceAlign.test_empty_to_nonempty  s   € ä$ R¨Ó/ˆØÒ9Ò9Ð9Ñ9r7   c                 ó.   — t        dd«      }|g d¢k(  sJ ‚y)z*Non-empty s1 to empty s2 -> all deletions.r
   rE   )r‡   ©r   r   )r   r   )r   r   Nrˆ   r‰   s     r5   Útest_nonempty_to_emptyz,TestEditDistanceAlign.test_nonempty_to_empty  s   € ä$ U¨BÓ/ˆØÒ9Ò9Ð9Ñ9r7   c                 ó,   — t        dd«      }|dgk(  sJ ‚y )NrE   r‡   rˆ   r‰   s     r5   rI   z%TestEditDistanceAlign.test_both_empty  s   € Ü$ R¨Ó,ˆØ˜&˜Ò!Ð!Ñ!r7   c                 ó.   — t        dd«      }|ddgk(  sJ ‚y)z0Single character substitution with default cost.rN   rR   r‡   r(   Nrˆ   r‰   s     r5   Útest_single_char_substitutionz3TestEditDistanceAlign.test_single_char_substitution  s!   € ä$ S¨#Ó.ˆØ˜& &Ð)Ò)Ð)Ñ)r7   c                 óH   — t        ddt        d«      «      }|g d¢g d¢fv sJ ‚y)z=Bug from issue #3017: sub_cost=inf should avoid substitution.rN   rR   Úinf©r‡   r�   r(   ©r‡   r“   r(   N©r   rh   r‰   s     r5   Ú!test_inf_sub_cost_different_charsz7TestEditDistanceAlign.test_inf_sub_cost_different_chars$  s1   € ä$ S¨#¬u°U«|Ó<ˆàÚ$Ú$ð
ñ 
ð 	
ñ 
r7   c                 óB   — t        ddt        d«      «      }|g d¢k(  sJ ‚y)zMWith sub_cost=inf, identical strings must still use diagonal (match, cost 0).r
   r™   r�   Nrœ   r‰   s     r5   Ú#test_inf_sub_cost_identical_stringsz9TestEditDistanceAlign.test_inf_sub_cost_identical_strings-  s#   € ä$ U¨E´5¸³<Ó@ˆØÒ9Ò9Ð9Ñ9r7   c                 ó~   — t        ddt        d«      «      }|g d¢k(  sJ ‚t        |ddt        d«      «      }|dk(  sJ ‚y)zGWith sub_cost=inf, matching chars use diagonal, mismatched use del+ins.ÚabÚcbr™   )r‡   r�   r(   r    r   N©r   rh   rƒ   ©r0   rŠ   r‚   s      r5   Útest_inf_sub_cost_partial_matchz5TestEditDistanceAlign.test_inf_sub_cost_partial_match2  sC   € ä$ T¨4´°u³Ó>ˆàÒ9Ò9Ð9Ð9Ü˜v t¨T´5¸³<Ó@ˆØ�qŠyÐ‰yr7   c                 ól   — t        ddt        d«      «      }t        |ddt        d«      «      }|dk(  sJ ‚y)zNLonger string with inf sub_cost: matches use diagonal, mismatches use del+ins.ÚabcdÚaxcyr™   r   Nr£   r¤   s      r5   Ú&test_inf_sub_cost_longer_partial_matchz<TestEditDistanceAlign.test_inf_sub_cost_longer_partial_match:  s4   € ä$ V¨V´U¸5³\ÓBˆÜ˜v v¨v´u¸U³|ÓDˆØ�qŠyÐ‰yr7   c                 ó0   — t        ddd«      }|ddgk(  sJ ‚y)zMWhen sub_cost=2 (equal to del+ins), substitution is preferred per precedence.rN   rR   r   r‡   r(   Nrˆ   r‰   s     r5   Ú$test_sub_cost_2_prefers_substitutionz:TestEditDistanceAlign.test_sub_cost_2_prefers_substitution@  s#   € ä$ S¨#¨qÓ1ˆà˜& &Ð)Ò)Ð)Ñ)r7   c                 ó6   — t        ddd«      }|g d¢g d¢fv sJ ‚y)zAWhen sub_cost=3 (more than del+ins=2), should avoid substitution.rN   rR   r   rš   r›   Nrˆ   r‰   s     r5   Ú#test_sub_cost_3_avoids_substitutionz9TestEditDistanceAlign.test_sub_cost_3_avoids_substitutionF  s-   € ä$ S¨#¨qÓ1ˆØÚ$Ú$ð
ñ 
ð 	
ñ 
r7   zs1,s2,sub_cost)r   r   r   )r$   r%   r   )r
   Údefr   )r
   r®   r   r
   r®   r™   )rE   r
   r   )r
   rE   r   )ÚsaturdayÚsundayr   c                 ód   — t        |||«      }t        ||||«      }t        |||¬«      }||k(  sJ ‚y)z<The cost of the alignment path must equal the edit distance.)r+   N)r   rƒ   r   )r0   r1   r2   Úsub_costrz   r‚   r3   s          r5   Ú(test_alignment_cost_equals_edit_distancez>TestEditDistanceAlign.test_alignment_cost_equals_edit_distanceP  s>   € ô  (¨¨B°Ó9ˆ	Ü˜y¨"¨b°(Ó;ˆÜ   R¸8ÔDˆØ�xÒÐÑr7   )r
   Úxyzr   r´   )ÚhelloÚworldr   rµ   r¶   c                 ón   — t        |||«      }|d   dk(  sJ ‚|d   t        |«      t        |«      fk(  sJ ‚y)z<Alignment must start at (0,0) and end at (len(s1), len(s2)).r   r‡   éÿÿÿÿN)r   ry   )r0   r1   r2   r²   rz   s        r5   Ú(test_alignment_starts_and_ends_correctlyz>TestEditDistanceAlign.test_alignment_starts_and_ends_correctlyg  sC   € ô (¨¨B°Ó9ˆ	Ø˜‰|˜vÒ%Ð%Ð%Ø˜‰}¤ R£¬#¨b«'Ð 2Ò2Ð2Ñ2r7   c                 ó¾   — t        |||«      }t        t        |«      dz
  «      D ]6  }||   \  }}||dz      \  }}	||z
  |	|z
  }}
|
|fdv rŒ'J d||f› d||	f› �«       ‚ y)z9Each step must advance by exactly (1,1), (1,0), or (0,1).r   )r(   r“   r�   zInvalid step from z to N)r   rx   ry   )r0   r1   r2   r²   rz   r{   r|   r}   r~   r   ÚdiÚdjs               r5   Útest_alignment_steps_are_validz4TestEditDistanceAlign.test_alignment_steps_are_validv  s™   € ô (¨¨B°Ó9ˆ	Ü”s˜9“~¨Ñ)Ó*ò 	;ˆAØ˜q‘\‰FˆB�Ø˜q 1™uÑ%‰FˆB�Ø˜"‘W˜b 2™g�ˆBØ˜�8ð  ò ð ;ð $ R¨ G 9¨D°"°R°°	Ð:ó	;ð ñ		;r7   N)r8   r9   r:   r‹   rŽ   r‘   r”   rI   r—   r�   rŸ   r¥   r©   r«   r­   r;   r<   r=   rh   r³   r¹   r½   rA   r7   r5   r…   r…     s'  „ òJò
:ò
:ò
:ò
"ò*ò
ò:ò
òò*ò
ð ‡[�[×ÑØà Ø$ØØØ�E™5 ›<Ð(Ø�E™5 ›<Ð(ØØØ%ð
	
óñ óð ð ‡[�[×ÑØàØ�E™5 ›<Ð(Ø!Ø�g™u U›|Ð,ð		
óñ3óð3ð ‡[�[×ÑØàØ�E™5 ›<Ð(Ø ð	
óñ;óñ;r7   r…   )Útypingr   r;   Únltk.metrics.distancer   r   r   r   r	   rC   rl   r€   rƒ   r…   rA   r7   r5   ú<module>rÀ      sS   ðÝ ã ÷ó ÷y-ñ y-÷xGFñ GF÷TJñ Jò*ò÷$E;ò E;r7   