Ë
    çÍ:jÜ  ã                   ó   — d dl mZ d„ Zy)é    )Údefaultdictc                 ó®  ‡ ‡‡	‡
‡‡— |j                  «       D �cg c]*  }t        t        t        |j                  d«      «      «      ‘Œ, }}|j                  «       D �cg c]*  }t        t        t        |j                  d«      «      «      ‘Œ, }}g d¢Št	        |«      j                  t	        |«      «      Š
t	        |«      j                  t	        |«      «      Št        t        «      Š	‰
D ]-  \  }}‰	d   j                  |«       ‰	d   j                  |«       Œ/ ˆ	ˆ
ˆˆ ˆˆfd„}ˆ	ˆ
ˆ ˆˆfd„} |«         ||«        ||«       t        ‰
«      S c c}w c c}w )u"  
    This module symmetrisatizes the source-to-target and target-to-source
    word alignment output and produces, aka. GDFA algorithm (Koehn, 2005).

    Step 1: Find the intersection of the bidirectional alignment.

    Step 2: Search for additional neighbor alignment points to be added, given
            these criteria: (i) neighbor alignments points are not in the
            intersection and (ii) neighbor alignments are in the union.

    Step 3: Add all other alignment points that are not in the intersection, not in
            the neighboring alignments that met the criteria but in the original
            forward/backward alignment outputs.

        >>> forw = ('0-0 2-1 9-2 21-3 10-4 7-5 11-6 9-7 12-8 1-9 3-10 '
        ...         '4-11 17-12 17-13 25-14 13-15 24-16 11-17 28-18')
        >>> back = ('0-0 1-9 2-9 3-10 4-11 5-12 6-6 7-5 8-6 9-7 10-4 '
        ...         '11-6 12-8 13-12 15-12 17-13 18-13 19-12 20-13 '
        ...         '21-3 22-12 23-14 24-17 25-15 26-17 27-18 28-18')
        >>> srctext = ("ã�“ã�® ã‚ˆã�† ã�ª ãƒ�ãƒ­ãƒ¼ ç™½è‰² ã‚�ã�„ æ˜Ÿ ã�® ï¼¬ é–¢æ•° "
        ...            "ã�¯ ï¼¬ ã�¨ å…± ã�« ä¸�é€£ç¶š ã�« å¢—åŠ  ã�™ã‚‹ ã�“ã�¨ ã�Œ "
        ...            "æœŸå¾… ã�• ã‚Œã‚‹ ã�“ã�¨ ã‚’ ç¤ºã�— ã�Ÿ ã€‚")
        >>> trgtext = ("Therefore , we expect that the luminosity function "
        ...            "of such halo white dwarfs increases discontinuously "
        ...            "with the luminosity .")
        >>> srclen = len(srctext.split())
        >>> trglen = len(trgtext.split())
        >>>
        >>> gdfa = grow_diag_final_and(srclen, trglen, forw, back)
        >>> gdfa == sorted(set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
        ...         (2, 9), (3, 10), (26, 17), (25, 15), (8, 6), (9, 7), (20,
        ...         13), (18, 13), (0, 0), (10, 4), (13, 15), (23, 14), (7, 5),
        ...         (25, 14), (1, 9), (17, 13), (4, 11), (11, 17), (9, 2), (22,
        ...         12), (27, 18), (24, 16), (21, 3), (19, 12), (17, 12), (5,
        ...         12), (11, 6), (12, 8)]))
        True

    References:
    Koehn, P., A. Axelrod, A. Birch, C. Callison, M. Osborne, and D. Talbot.
    2005. Edinburgh System Description for the 2005 IWSLT Speech
    Translation Evaluation. In MT Eval Workshop.

    :type srclen: int
    :param srclen: the number of tokens in the source language
    :type trglen: int
    :param trglen: the number of tokens in the target language
    :type e2f: str
    :param e2f: the forward word alignment outputs from source-to-target
                language (in pharaoh output format)
    :type f2e: str
    :param f2e: the backward word alignment outputs from target-to-source
                language (in pharaoh output format)
    :rtype: set(tuple(int))
    :return: the symmetrized alignment points from the GDFA algorithm
    ú-))éÿÿÿÿr   )r   r   )é   r   )r   r   )r   r   )r   r   )r   r   )r   r   ÚeÚfc            
      ó¨  •— t        ‰«      dz
  } | t        ‰«      k  rµd}t        ‰
«      D ]’  }t        ‰«      D ]‚  }||f‰v sŒ
‰	D ]t  }t        d„ t        ||f|«      D «       «      }|\  }}|‰vsŒ+|‰vsŒ0|‰v sŒ5‰j	                  |«       ‰d   j	                  |«       ‰d   j	                  |«       | dz  } d}Œv Œ„ Œ” |ry| t        ‰«      k  rŒ´yy)zz
        Search for the neighbor points and them to the intersected alignment
        points if criteria are met.
        r   Tc              3   ó,   K  — | ]  \  }}||z   –— Œ y ­w)N© )Ú.0ÚiÚjs      úh/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/nltk/translate/gdfa.pyú	<genexpr>z9grow_diag_final_and.<locals>.grow_diag.<locals>.<genexpr>c   s   è ø€ Ò,U±t°q¸!¨Q°­UÑ,Uùs   ‚r   r	   FN)ÚlenÚrangeÚtupleÚzipÚadd)Úprev_lenÚno_new_pointsr   r	   ÚneighborÚe_newÚf_newÚalignedÚ	alignmentÚ	neighborsÚsrclenÚtrglenÚunions          €€€€€€r   Ú	grow_diagz&grow_diag_final_and.<locals>.grow_diagR   sö   ø€ ô
 �y“> AÑ%ˆàœ˜Y›Ò'Ø ˆMä˜6“]ò 6�ä˜v›ò 6�Aà˜1�v Ò*à(1ò 6˜HÜ',Ñ,U¼sÀAÀqÀ6È8Ó?TÔ,UÓ'U˜HØ+3™L˜E 5ð !&¨WÒ 4¸ÀgÒ9MØ"*¨eÒ"3Ø )§¡¨hÔ 7Ø '¨¡× 0Ñ 0°Ô 7Ø '¨¡× 0Ñ 0°Ô 7Ø (¨A¡ Ø05¡ñ6ñ	6ð6ñ( Øð1 œ˜Y›Õ'ó    c                 óÞ   •— t        ‰«      D ]^  }t        ‰«      D ]N  }|‰vsŒ|‰vsŒ||f‰v sŒ‰j                  ||f«       ‰d   j                  |«       ‰d   j                  |«       ŒP Œ` y)z¢
        Adds remaining points that are not in the intersection, not in the
        neighboring alignments but in the original *e2f* and *f2e* alignments
        r   r	   N)r   r   )Úar   r   r   r   r   r    r!   s      €€€€€r   Ú	final_andz&grow_diag_final_and.<locals>.final_ands   s}   ø€ ô ˜6“]ò 	,ˆEä˜v›ò 
,�ð  Ò(Ø WÒ,Ø ˜¨%Ò/à—M‘M 5¨% .Ô1Ø˜C‘L×$Ñ$ UÔ+Ø˜C‘L×$Ñ$ UÕ+ñ
,ñ	,r#   )
Úsplitr   ÚmapÚintÚsetÚintersectionr!   r   r   Úsorted)r   r    Úe2fÚf2er%   r   r   r"   r&   r   r   r   r!   s   ``       @@@@r   Úgrow_diag_final_andr/      s  ý€ ðt 36·)±)³+Ö
>¨QŒ5””S˜!Ÿ'™' #›,Ó'Õ(Ð
>€CÐ
>Ø25·)±)³+Ö
>¨QŒ5””S˜!Ÿ'™' #›,Ó'Õ(Ð
>€CÐ
>âV€IÜ�C“×%Ñ%¤c¨#£hÓ/€IÜ�‹H�N‰Nœ3˜s›8Ó$€Eô œ#Ó€GØò ‰ˆˆ1Ø�‰×Ñ˜ÔØ�‰×Ñ˜Õð÷ñ ÷B,ð ,ñ( „KÙˆc„NÙˆc„NÜ�)ÓÐùòK ?ùÚ
>s   ™/EÁ/EN)Úcollectionsr   r/   r   r#   r   ú<module>r1      s   ðõ $ór#   