o
    piD                     @  s~   d dl mZ d dlmZmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ dd	lmZ G d
d deeZdS )    )annotations)DictOptionalSequenceUnionN)Protocol)BaseWaveformTransform)Metric)Task   ))SupervisedRepresentationLearningTaskMixinc                      s@   e Zd ZdZ										d d! fddZdd Z  ZS )"+SupervisedRepresentationLearningWithArcFacea  Supervised representation learning with ArcFace loss

    Representation learning is the task of ...

    Parameters
    ----------
    protocol : Protocol
        pyannote.database protocol
    duration : float, optional
        Chunks duration in seconds. Defaults to two seconds (2.).
    min_duration : float, optional
        Sample training chunks duration uniformely between `min_duration`
        and `duration`. Defaults to `duration` (i.e. fixed length chunks).
    num_classes_per_batch : int, optional
        Number of classes per batch. Defaults to 32.
    num_chunks_per_class : int, optional
        Number of chunks per class. Defaults to 1.
    margin : float, optional
        Margin. Defaults to 28.6.
    scale : float, optional
        Scale. Defaults to 64.
    num_workers : int, optional
        Number of workers used for generating training samples.
        Defaults to multiprocessing.cpu_count() // 2.
    pin_memory : bool, optional
        If True, data loaders will copy tensors into CUDA pinned
        memory before returning them. See pytorch documentation
        for more details. Defaults to False.
    augmentation : BaseWaveformTransform, optional
        torch_audiomentations waveform transform, used by dataloader
        during training.
    metric : optional
        Validation metric(s). Can be anything supported by torchmetrics.MetricCollection.
        Defaults to AUROC (area under the ROC curve).
    N       @    r   皙<@      P@Fprotocolr   min_durationOptional[float]durationfloatnum_classes_per_batchintnum_chunks_per_classmarginscalenum_workersOptional[int]
pin_memoryboolaugmentationOptional[BaseWaveformTransform]metric2Union[Metric, Sequence[Metric], Dict[str, Metric]]c              
     s:   || _ || _|| _|| _t j|||| j||	|
|d d S )N)r   r   
batch_sizer   r   r    r"   )r   r   r   r   super__init__r$   )selfr   r   r   r   r   r   r   r   r   r    r"   	__class__ Z/home/ubuntu/.local/lib/python3.10/site-packages/pyannote/audio/tasks/embedding/arcface.pyr&   R   s   
z4SupervisedRepresentationLearningWithArcFace.__init__c                 C  s<   |  | j jj\}}tjjt| jj|| j	| j
d| j _d S )N)r   r   )modelexample_input_arrayshapepytorch_metric_learninglossesArcFaceLosslenspecificationsclassesr   r   	loss_func)r'   _embedding_sizer*   r*   r+   setup_loss_funcr   s   
z;SupervisedRepresentationLearningWithArcFace.setup_loss_func)
Nr   r   r   r   r   NFNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   )__name__
__module____qualname____doc__r&   r8   __classcell__r*   r*   r(   r+   r   &   s    + r   )
__future__r   typingr   r   r   r   pytorch_metric_learning.lossesr/   pyannote.databaser   /torch_audiomentations.core.transforms_interfacer   torchmetricsr	   pyannote.audio.core.taskr
   mixinsr   r   r*   r*   r*   r+   <module>   s   
