o
    ϯi                  	   @   s   d dl mZ d dlZd dlmZ 		ddejdeded	efd
dZG dd dej	j
ZG dd dej	j
ZG dd dej	j
ZdS )    )TupleN)convert_to_one_hot      ?        labelsnum_classeslamlabel_smoothingc                 C   s2   t | ||}t | d||}|| |d|   S )aJ  
    This function converts class indices to one-hot vectors and mix labels, given the
    number of classes.

    Args:
        labels (torch.Tensor): Class labels.
        num_classes (int): Total number of classes.
        lam (float): lamba value for mixing labels.
        label_smoothing (float): Label smoothing value.
    r   r   )r   flip)r   r   r   r	   labels1labels2 r   O/home/ubuntu/.local/lib/python3.10/site-packages/pytorchvideo/transforms/mix.py_mix_labels	   s   r   c                	       s`   e Zd ZdZ			ddedededd	f fd
dZdejdejde	ejejf fddZ
  ZS )MixUpzV
    Mixup: Beyond Empirical Risk Minimization (https://arxiv.org/abs/1710.09412)
    r   r     alphar	   r   returnNc                    ,   t    tjj||| _|| _|| _dS )z
        This implements MixUp for videos.

        Args:
            alpha (float): Mixup alpha value.
            label_smoothing (float): Label smoothing value.
            num_classes (int): Number of total classes.
        N)	super__init__torchdistributionsbetaBetamixup_beta_samplerr	   r   selfr   r	   r   	__class__r   r   r   #      

zMixUp.__init__xr   c                 C   s^   | ddksJ d| j }|dd| }||| t|| j|| j}||fS )"  
        The input is a batch of samples and their corresponding labels.

        Args:
            x (torch.Tensor): Input tensor. The input should be a batch of videos with
                shape (B, C, T, H, W).
            labels (torch.Tensor): Labels for input with shape (B).
        r      z-MixUp cannot be applied to a single instance.r   )	sizer   sampler
   mul_add_r   r   r	   )r   r!   r   mixup_lambda	x_flipped
new_labelsr   r   r   forward6   s   
zMixUp.forwardr   r   r   )__name__
__module____qualname____doc__floatintr   r   Tensorr   r+   __classcell__r   r   r   r   r      s*    r   c                	       s   e Zd ZdZ			ddedededd	f fd
dZdedededefddZdee dedee fddZ	de
jdedee
jef fddZde
jde
jdee
je
jf fddZ  ZS )CutMixz
    CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features
    (https://arxiv.org/abs/1905.04899)
    r   r   r   r   r	   r   r   Nc                    r   )z
        This implements CutMix for videos.

        Args:
            alpha (float): CutMix alpha value.
            label_smoothing (float): Label smoothing value.
            num_classes (int): Number of total classes.
        N)	r   r   r   r   r   r   cutmix_beta_samplerr	   r   r   r   r   r   r   U   r    zCutMix.__init__value	min_value	max_valuec                 C   s   t t|||S )zF
        Clip value based on minimum value and maximum value.
        )minmax)r   r7   r8   r9   r   r   r   _cliph   s   zCutMix._clipinput_shapecutmix_lamdac                 C   s   d| d }|dd \}}t || t || }}t|d }t|d }	| ||d  d|}
| ||d  d|}| |	|d  d|}| |	|d  d|}|
|||fS )z?
        Get a random square box given a lambda value.
        r#         ?N)r#      r   )r2   r   randintitemr<   )r   r=   r>   ratioinput_hinput_wcut_hcut_wcycxylyhxlxhr   r   r   _get_rand_boxo   s   zCutMix._get_rand_boxr!   c           	      C   s~   |  | |\}}}}t|| ||  }d||d|d   }|dd||||f |d||||f< ||fS )zC
        Perform CutMix and return corrected lambda value.
        r   r@   r   .)rO   r$   r1   r
   )	r   r!   r>   rK   rL   rM   rN   box_areacutmix_lamda_correctedr   r   r   _cutmix   s
   .zCutMix._cutmixr   c                 C   sj   | ddksJ d| dks| dksJ d| j }| ||\}}t|| j|| j}||fS )r"   r   r#   z.Cutmix cannot be applied to a single instance.      zPlease correct input shape.)r$   dimr6   r%   rS   r   r   r	   )r   r!   r   r>   rR   r*   r   r   r   r+      s    
zCutMix.forwardr,   )r-   r.   r/   r0   r1   r2   r   r<   r   rO   r   r3   rS   r+   r4   r   r   r   r   r5   O   s<    
r5   c                       sX   e Zd ZdZ					ddededed	ed
ef
 fddZdejdejfddZ	  Z
S )MixVideozK
    Stochastically applies either MixUp or CutMix to the input video.
    r?   r   r   r   cutmix_probmixup_alphacutmix_alphar	   r   c                    sX   d|  krdksJ d J dt    || _t|||d| _t|||d| _dS )a  
        Args:
            cutmix_prob (float): Probability of using CutMix. MixUp will be used with
                probability 1 - cutmix_prob. If cutmix_prob is 0, then MixUp is always
                used. If cutmix_prob is 1, then CutMix is always used.
            mixup_alpha (float): MixUp alpha value.
            cutmix_alpha (float): CutMix alpha value.
            label_smoothing (float): Label smoothing value.
            num_classes (int): Number of total classes.
        r   r   z)cutmix_prob should be between 0.0 and 1.0)r   r	   r   N)r   r   rX   r   mixupr5   cutmix)r   rX   rY   rZ   r	   r   r   r   r   r      s   $
zMixVideo.__init__r!   r   c                 C   s,   t d | jk r| ||S | ||S )r"   r#   )r   randrC   rX   r\   r[   )r   r!   r   r   r   r   r+      s   
zMixVideo.forward)r?   r   r   r   r   )r-   r.   r/   r0   r1   r2   r   r   r3   r+   r4   r   r   r   r   rW      s&    rW   )r   r   )typingr   r   "pytorchvideo.transforms.functionalr   r3   r2   r1   r   nnModuler   r5   rW   r   r   r   r   <module>   s"   
1V