Ë
    ÿÍ:jV3  ã                   ó  — d dl mZmZmZ d dlZd dlmZmZm	Z	 d dl
mZ ddlmZmZ ddlmZmZ ddlm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  G d„ de«      Z! G d„ de!«      Z" G d„ de!«      Z# G d„ dee«      Z$ G d„ de$«      Z%y) é    )ÚTupleÚUnionÚOptionalN)ÚSegmentÚTimelineÚ
Annotation)Úpairwiseé   )Ú
BaseMetricÚ	f_measure)ÚMetricComponentsÚDetails)ÚUEMSupportMixinzsegmentation purityzsegmentation coveragezsegmentation F[purity|coverage]ztotal durationzintersection durationzpty total durationzpty intersection durationzcvg total durationzcvg intersection durationzsegmentation precisionzsegmentation recallznumber of boundariesznumber of matchesc                   óÊ   ‡ — e Zd ZdZddefˆ fd„Zdededefd„Zded	e	eef   de
eef   fd
„Zded	edefd„Zed„ «       Zedefd„«       Zded	e	eef   fd„Zdedefd„Zˆ xZS )ÚSegmentationCoveragezÑSegmentation coverage

    Parameters
    ----------
    tolerance : float, optional
        When provided, preprocess reference by filling intra-label gaps shorter
        than `tolerance` (in seconds).

    Ú	tolerancec                 ó2   •— t        ‰| �  di |¤Ž || _        y ©N© ©ÚsuperÚ__init__r   ©Úselfr   ÚkwargsÚ	__class__s      €úr/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/pyannote/metrics/segmentation.pyr   zSegmentationCoverage.__init__G   s   ø€ Ü‰ÑÑ"˜6Ò"Ø"ˆ�ó    ÚtimelineÚcoverageÚreturnc                 óB  — t        g «      }|D ]8  }|j                  |j                  «       |j                  |j                  «       Œ: t	        «       }t        t        |«      «      D ]  \  }}t        ||«      }d||<   Œ |j                  |d¬«      j                  «       S )NÚ_Úintersection)Úmode)
ÚsetÚaddÚstartÚendr   r	   Úsortedr   ÚcropÚrelabel_tracks)r   r   r    Ú
boundariesÚsegmentÚ	partitionr(   r)   s           r   Ú
_partitionzSegmentationCoverage._partitionK   s–   € ô
 ˜“Wˆ
Øò 	(ˆGØ�N‰N˜7Ÿ=™=Ô)Ø�N‰N˜7Ÿ;™;Õ'ð	(ô
 “Lˆ	Ü"¤6¨*Ó#5Ó6ò 	%‰JˆE�3Ü˜e SÓ)ˆGØ!$ˆI�gÒð	%ð �~‰~˜h¨^ˆ~Ó<×KÑKÓMÐMr   Ú	referenceÚ
hypothesisc                 ó  — t        |t        «      st        d«      ‚t        |t        «      r|j                  «       }t	        «       }|j                  «       D ]y  }|j                  |«      }|j                  «       D ]-  }|j                  | j                  k  sŒ|j                  |«       Œ/ |j                  «       D ]  }|j                  |«       Œ Œ{ |j                  «       }| j                  ||«      }	| j                  ||«      }
|	|
fS )Nz-reference must be an instance of `Annotation`)Ú
isinstancer   Ú	TypeErrorÚget_timeliner   ÚlabelsÚlabel_timelineÚgapsÚdurationr   r'   Úsupportr0   )r   r1   r2   ÚfilledÚlabelr8   Úgapr.   r    Úreference_partitionÚhypothesis_partitions              r   Ú_preprocessz SegmentationCoverage._preprocess]   sû   € ô ˜)¤ZÔ0ÜÐKÓLÐLä�j¤*Ô-Ø#-×#:Ñ#:Ó#<ˆJô “ˆØ×%Ñ%Ó'ò 	$ˆEØ&×5Ñ5°eÓ<ˆNØ%×*Ñ*Ó,ò ,�Ø—<‘< $§.¡.Ó0Ø"×&Ñ& sÕ+ð,ð *×1Ñ1Ó3ò $�Ø—
‘
˜7Õ#ñ$ð	$ð —>‘>Ó#ˆà"Ÿo™o¨f°hÓ?ÐØ#Ÿ™¨z¸8ÓDÐà"Ð$8Ð8Ð8r   c                 ó  — | j                  «       }||z  }t        j                  |«      j                  «       |t        <   t        j                  t        j
                  |d¬«      «      j                  «       |t        <   |S )Nr
   ©Úaxis)Úinit_componentsÚnpÚsumÚitemÚPTY_CVG_TOTALÚmaxÚPTY_CVG_INTER©r   r1   r2   ÚdetailÚKs        r   Ú_processzSegmentationCoverage._processz   sa   € à×%Ñ%Ó'ˆð ˜
Ñ"ˆÜ "§¡ q£	§¡Ó 0ˆŒ}ÑÜ "§¡¤r§v¡v¨a°aÔ'8Ó 9× >Ñ >Ó @ˆŒ}Ñàˆr   c                 ó   — t         S ©N)ÚCOVERAGE_NAME©Úclss    r   Úmetric_namez SegmentationCoverage.metric_name…   s   € äÐr   c                 ó   — t         t        gS rQ   )rI   rK   rS   s    r   Úmetric_componentsz&SegmentationCoverage.metric_components‰   s   € äœ}Ð-Ð-r   c                 óP   — | j                  ||«      \  }}| j                  ||«      S rQ   ©rA   rO   ©r   r1   r2   r   s       r   Úcompute_componentsz'SegmentationCoverage.compute_components�   s*   € à $× 0Ñ 0°¸JÓ GÑˆ	�:Ø�}‰}˜Y¨
Ó3Ð3r   rM   c                 ó(   — |t            |t           z  S rQ   )rK   rI   )r   rM   s     r   Úcompute_metricz#SegmentationCoverage.compute_metric’   s   € Ø”mÑ$ v¬mÑ'<Ñ<Ð<r   )ç      à?)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úfloatr   r   r   r0   r   r   rA   r   rO   ÚclassmethodrU   r   rW   r[   r]   Ú__classcell__©r   s   @r   r   r   <   sà   ø„ ññ# %õ #ðNØ%ðNà%ðNà*4óNð$9 Zð 9Ø % j°(Ð&:Ñ ;ð9à�Z Ð+Ñ,ó9ð:	 *ð 	¸*ð 	Èó 	ð ñó ðð ð.Ð"2ò .ó ð.ð4¨Jð 4Ø',¨Z¸Ð-AÑ'Bó4ð
= Wð =°÷ =r   r   c                   óD   — e Zd ZdZedefd„«       Zdedeee	f   de
fd„Zy)ÚSegmentationPurityzÏSegmentation purity

    Parameters
    ----------
    tolerance : float, optional
        When provided, preprocess reference by filling intra-label gaps shorter
        than `tolerance` (in seconds).

    r!   c                 ó   — t         S rQ   )ÚPURITY_NAMErS   s    r   rU   zSegmentationPurity.metric_name¡   ó   € äÐr   r1   r2   c                 óP   — | j                  ||«      \  }}| j                  ||«      S rQ   rY   rZ   s       r   r[   z%SegmentationPurity.compute_components¦   s,   € ð !%× 0Ñ 0°¸JÓ GÑˆ	�:Ø�}‰}˜Z¨Ó3Ð3r   N)r_   r`   ra   rb   rd   ÚstrrU   r   r   r   r   r[   r   r   r   rh   rh   –   sH   „ ñð ð˜Cò ó ðð4¨Jð 4Ø',¨Z¸Ð-AÑ'Bð4à(/ô4r   rh   c                   óÀ   ‡ — e Zd ZdZdˆ fd„	Zdedeeef   defd„Z	dedeeef   defd„Z
dedefd	„Zddee   deeeef   fd
„Zedefd„«       Zedefd„«       Zˆ xZS )Ú"SegmentationPurityCoverageFMeasureal  
    Compute segmentation purity and coverage, and return their F-score.


    Parameters
    ----------
    tolerance : float, optional
        When provided, preprocess reference by filling intra-label gaps shorter
        than `tolerance` (in seconds).

    beta : float, optional
            When beta > 1, greater importance is given to coverage.
            When beta < 1, greater importance is given to purity.
            Defaults to 1.

    See also
    --------
    pyannote.metrics.segmentation.SegmentationPurity
    pyannote.metrics.segmentation.SegmentationCoverage
    pyannote.metrics.base.f_measure
    c                 ó>   •— t        t        | �
  dd|i|¤Ž || _        y )Nr   r   )r   ro   r   Úbeta)r   r   rq   r   r   s       €r   r   z+SegmentationPurityCoverageFMeasure.__init__Ä   s#   ø€ ÜÔ0°$Ñ@Ñ_È9Ð_ÐX^Ò_Øˆ�	r   r1   r2   r!   c                 óÊ  — | j                  ||«      \  }}| j                  «       }||z  }t        j                  |«      j	                  «       |t
        <   t        j                  t        j                  |d¬«      «      j	                  «       |t        <   |t
           |t        <   t        j                  t        j                  |d¬«      «      j	                  «       |t        <   |S )Nr
   rC   r   )
rA   rE   rF   rG   rH   Ú	CVG_TOTALrJ   Ú	CVG_INTERÚ	PTY_TOTALÚ	PTY_INTERrL   s        r   rO   z+SegmentationPurityCoverageFMeasure._processÈ   s°   € à $× 0Ñ 0°¸JÓ GÑˆ	�:à×%Ñ%Ó'ˆð ˜
Ñ"ˆÜŸF™F 1›IŸN™NÓ,ˆŒyÑÜŸF™F¤2§6¡6¨!°!Ô#4Ó5×:Ñ:Ó<ˆŒyÑð #¤9Ñ-ˆŒyÑÜŸF™F¤2§6¡6¨!°!Ô#4Ó5×:Ñ:Ó<ˆŒyÑàˆr   c                 ó&   — | j                  ||«      S rQ   )rO   rZ   s       r   r[   z5SegmentationPurityCoverageFMeasure.compute_componentsÙ   s   € ð �}‰}˜Y¨
Ó3Ð3r   rM   c                 ó2   — | j                  |¬«      \  }}}|S )N)rM   )Úcompute_metrics)r   rM   r#   Úvalues       r   r]   z1SegmentationPurityCoverageFMeasure.compute_metricÞ   s    € Ø×*Ñ*°&Ð*Ó9‰ˆˆ1ˆeØˆr   c                 óÜ   — |€| j                   n|}|t           dk(  rdn|t           |t           z  }|t           dk(  rdn|t           |t           z  }||t        ||| j                  ¬«      fS )Nç        ç      ð?)rq   )Úaccumulated_ru   rv   rs   rt   r   rq   )r   rM   Úpurityr    s       r   ry   z2SegmentationPurityCoverageFMeasure.compute_metricsâ   s   € à&, n�×"Ò"¸&ˆð œÑ# rÒ)‰BØœIÑ&¨´	Ñ):Ñ:ð 	ð
 œÑ# rÒ)‰BØœIÑ&¨´	Ñ):Ñ:ð 	ð �x¤¨6°8À$Ç)Á)Ô!LÐLÐLr   c                 ó   — t         S rQ   )ÚPURITY_COVERAGE_NAMErS   s    r   rU   z.SegmentationPurityCoverageFMeasure.metric_nameð   s   € ä#Ð#r   c                 ó.   — t         t        t        t        gS rQ   )ru   rv   rs   rt   rS   s    r   rW   z4SegmentationPurityCoverageFMeasure.metric_componentsô   s   € äœ9¤i´Ð;Ð;r   )r^   r
   rQ   )r_   r`   ra   rb   r   r   r   r   r   rO   r[   rc   r]   r   r   ry   rd   rm   rU   r   rW   re   rf   s   @r   ro   ro   ­   sË   ø„ ñõ,ð *ð Ø" :¨xÐ#7Ñ8ðØ=Dóð"4¨Jð 4Ø',¨Z¸Ð-AÑ'Bð4à(/ó4ð
 Wð °ó ñM h¨wÑ&7ð MØ�U˜E 5Ð(Ñ)óMð ð$˜Cò $ó ð$ð ð<Ð"2ò <ó ô<r   ro   c                   ó|   ‡ — e Zd ZdZed„ «       Zed„ «       Zdˆ fd„	Zdee	e
f   dee	e
f   defd„Zd	edefd
„Zˆ xZS )ÚSegmentationPrecisionaÅ  Segmentation precision

    >>> from pyannote.core import Timeline, Segment
    >>> from pyannote.metrics.segmentation import SegmentationPrecision
    >>> precision = SegmentationPrecision()

    >>> reference = Timeline()
    >>> reference.add(Segment(0, 1))
    >>> reference.add(Segment(1, 2))
    >>> reference.add(Segment(2, 4))

    >>> hypothesis = Timeline()
    >>> hypothesis.add(Segment(0, 1))
    >>> hypothesis.add(Segment(1, 2))
    >>> hypothesis.add(Segment(2, 3))
    >>> hypothesis.add(Segment(3, 4))
    >>> precision(reference, hypothesis)
    0.6666666666666666

    >>> hypothesis = Timeline()
    >>> hypothesis.add(Segment(0, 4))
    >>> precision(reference, hypothesis)
    1.0

    c                 ó   — t         S rQ   )ÚPRECISION_NAMErS   s    r   rU   z!SegmentationPrecision.metric_name  s   € äÐr   c                 ó   — t         t        gS rQ   )Ú
PR_MATCHESÚPR_BOUNDARIESrS   s    r   rW   z'SegmentationPrecision.metric_components  s   € äœMÐ*Ð*r   c                 ó2   •— t        ‰| �  di |¤Ž || _        y r   r   r   s      €r   r   zSegmentationPrecision.__init__  s   ø€ ä‰ÑÑ"˜6Ò"Ø"ˆ�r   r1   r2   r!   c                 ó  — t        |t        «      r|j                  «       }t        |t        «      r|j                  «       }| j                  «       }d}t	        |«      dz
  }t	        |«      dz
  }||t
        <   |dk(  s|dk(  rd|t        <   |S |D �cg c]  }|j                  ‘Œ c}d d }	|D �cg c]  }|j                  ‘Œ c}d d }
t        j                  ||f«      }t        |	«      D ]+  \  }}t        |
«      D ]  \  }}t        ||z
  «      |||f<   Œ Œ- t        j                  |t        j                  || j                  kD  «      <   t        j                  |«      }|t        j                  k  r{|dz  }t        j                   |«      }||z  }||z  }t        j                  ||d d …f<   t        j                  |d d …|f<   t        j                  |«      }|t        j                  k  rŒ{||t        <   |S c c}w c c}w )Nr|   r
   r   éÿÿÿÿ)r4   r   r6   rE   Úlenr‰   rˆ   r)   rF   ÚzerosÚ	enumerateÚabsÚinfÚwherer   ÚaminÚargmin)r   r1   r2   r   rM   Ú	n_matchesÚNÚMr.   Úref_boundariesÚhyp_boundariesÚdeltaÚrÚrefBoundaryÚhÚhypBoundaryÚkÚiÚjs                      r   r[   z(SegmentationPrecision.compute_components!  sè  € ô �i¤Ô,Ø!×.Ñ.Ó0ˆIÜ�j¤*Ô-Ø#×0Ñ0Ó2ˆJà×%Ñ%Ó'ˆð ˆ	ô �	‹N˜QÑˆÜ�
‹O˜aÑˆð !"ˆŒ}Ñð �Š6�Q˜!’VØ!#ˆF”:ÑØˆMð 6?Ö?¨'˜'Ÿ+›+Ò?ÀÀÐDˆØ5?Ö@¨'˜'Ÿ+›+Ò@ÀÀ"ÐEˆô —‘˜!˜Q˜Ó ˆÜ'¨Ó7ò 	=‰NˆAˆ{Ü"+¨NÓ";ò =‘��;Ü! +°Ñ";Ó<��a˜�d’ñ=ð	=ô 35·&±&ˆŒb�h‰h�u˜tŸ~™~Ñ-Ó.Ñ/ô �G‰G�E‹Nˆð ”"—&‘&Šjà˜‰NˆIô —	‘	˜%Ó ˆAØ�Q‘ˆAØ�A‘ˆAô Ÿ&™&ˆE�!’Q�$‰KÜŸ&™&ˆE’!�Q�$‰Kô —‘˜“ˆAð ”"—&‘&‹jð  'ˆŒzÑØˆùòG @ùÚ@s   ÂG8Â.G=rM   c                 ó\   — |t            }|t           }|dk(  r|dk(  ryt        d«      ‚||z  S )Nr|   r   r}   Ú )rˆ   r‰   Ú
ValueError)r   rM   Ú	numeratorÚdenominators       r   r]   z$SegmentationPrecision.compute_metricc  s=   € àœ:Ñ&ˆ	Øœ]Ñ+ˆà˜"ÒØ˜AŠ~Øä  “nÐ$à˜{Ñ*Ð*r   )r|   )r_   r`   ra   rb   rd   rU   rW   r   r   r   r   r   r[   rc   r]   re   rf   s   @r   r„   r„   ù   s€   ø„ ñð4 ñó ðð ñ+ó ð+õ#ð
@Ø&+¨J¸Ð,@Ñ&Að@à',¨Z¸Ð-AÑ'Bð@ð )0ó@ðD+ Wð +°÷ +r   r„   c                   óT   ‡ — e Zd ZdZed„ «       Zdeeef   deeef   de	fˆ fd„Z
ˆ xZS )ÚSegmentationRecalla¤  Segmentation recall

    >>> from pyannote.core import Timeline, Segment
    >>> from pyannote.metrics.segmentation import SegmentationRecall
    >>> recall = SegmentationRecall()

    >>> reference = Timeline()
    >>> reference.add(Segment(0, 1))
    >>> reference.add(Segment(1, 2))
    >>> reference.add(Segment(2, 4))

    >>> hypothesis = Timeline()
    >>> hypothesis.add(Segment(0, 1))
    >>> hypothesis.add(Segment(1, 2))
    >>> hypothesis.add(Segment(2, 3))
    >>> hypothesis.add(Segment(3, 4))
    >>> recall(reference, hypothesis)
    1.0

    >>> hypothesis = Timeline()
    >>> hypothesis.add(Segment(0, 4))
    >>> recall(reference, hypothesis)
    0.0

    c                 ó   — t         S rQ   )ÚRECALL_NAMErS   s    r   rU   zSegmentationRecall.metric_nameŒ  rk   r   r1   r2   r!   c                 ó,   •— t         t        | �  ||«      S rQ   )r   r¨   r[   )r   r1   r2   r   r   s       €r   r[   z%SegmentationRecall.compute_components�  s   ø€ ô Ô'¨ÑAØ˜	ó#ð 	#r   )r_   r`   ra   rb   rd   rU   r   r   r   r   r[   re   rf   s   @r   r¨   r¨   q  sQ   ø„ ñð4 ñó ðð#¨E°*¸hÐ2FÑ,Gð #Ø',¨Z¸Ð-AÑ'Bð#à(/÷#ñ #r   r¨   )&Útypingr   r   r   ÚnumpyrF   Úpyannote.corer   r   r   Úpyannote.core.utils.generatorsr	   Úbaser   r   Útypesr   r   Úutilsr   rj   rR   r�   rI   rK   ru   rv   rs   rt   r†   rª   r‰   rˆ   r   rh   ro   r„   r¨   r   r   r   ú<module>r³      s°   ð÷> *Ñ )ã ß 7Ñ 7Ý 3ç 'ß ,Ý "ð $€Ø'€Ø8Ð Ø €Ø'€à €	Ø'€	Ø €	Ø'€	à)€Ø#€à&€Ø €
ôW=˜:ô W=ôt4Ð-ô 4ô.I<Ð)=ô I<ôXu+˜O¨Zô u+ôp##Ð.õ ##r   