Ë
    éÓ^jÎ>  ã                   ój   — d Z ddlZddlZdd„Zdd„Zdd„Zdd„Zdd„Z G d„ d	«      Z	 G d
„ de	«      Z
y)aY   Mixup and Cutmix

Papers:
mixup: Beyond Empirical Risk Minimization (https://arxiv.org/abs/1710.09412)

CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features (https://arxiv.org/abs/1905.04899)

Code Reference:
CutMix: https://github.com/clovaai/CutMix-PyTorch

Hacked together by / Copyright 2019, Ross Wightman
é    Nc                 óÎ   — | j                  «       j                  dd«      } t        j                  | j	                  «       d   |f|| j
                  ¬«      j                  d| |«      S )Néÿÿÿÿé   r   )Údevice)ÚlongÚviewÚtorchÚfullÚsizer   Úscatter_)ÚxÚnum_classesÚon_valueÚ	off_values       úZ/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/data/mixup.pyÚone_hotr      sP   € Ø	�‰‹�‰�b˜!Ó€AÜ�:‰:�q—v‘v“x ‘{ KÐ0°)ÀAÇHÁHÔM×VÑVÐWXÐZ[Ð]eÓfÐfó    c                 ó’   — ||z  }d|z
  |z   }t        | |||¬«      }t        | j                  d«      |||¬«      }||z  |d|z
  z  z   S )Nç      ð?)r   r   r   )r   Úflip)Útargetr   ÚlamÚ	smoothingr   r   Úy1Úy2s           r   Úmixup_targetr      sY   € Ø˜KÑ'€IØ�I‰~ 	Ñ)€HÜ	�˜¨xÀ9Ô	M€BÜ	�—‘˜Q“ °xÈ9Ô	U€BØ�‰8�b˜B ™H‘oÑ%Ð%r   c                 óF  — t        j                  d|z
  «      }| dd \  }}t        ||z  «      t        ||z  «      }}t        ||z  «      t        ||z  «      }
}	t         j                  j	                  d|	z   ||	z
  |¬«      }t         j                  j	                  d|
z   ||
z
  |¬«      }t        j
                  ||dz  z
  d|«      }t        j
                  ||dz  z   d|«      }t        j
                  ||dz  z
  d|«      }t        j
                  ||dz  z   d|«      }||||fS )a»   Standard CutMix bounding-box
    Generates a random square bbox based on lambda value. This impl includes
    support for enforcing a border margin as percent of bbox dimensions.

    Args:
        img_shape (tuple): Image shape as tuple
        lam (float): Cutmix lambda value
        margin (float): Percentage of bbox dimension to enforce as margin (reduce amount of box outside image)
        count (int): Number of bbox to generate
    r   éþÿÿÿNr   ©r   é   )ÚnpÚsqrtÚintÚrandomÚrandintÚclip)Ú	img_shaper   ÚmarginÚcountÚratioÚimg_hÚimg_wÚcut_hÚcut_wÚmargin_yÚmargin_xÚcyÚcxÚylÚyhÚxlÚxhs                    r   Ú	rand_bboxr7      s  € ô �G‰G�A˜‘GÓ€EØ˜R˜S�>�L€Eˆ5Ü�u˜u‘}Ó%¤s¨5°5©=Ó'9ˆ5€EÜ˜V e™^Ó,¬c°&¸5±.Ó.Aˆh€HÜ	�‰×	Ñ	˜1˜x™<¨°Ñ)9ÀÐ	Ó	F€BÜ	�‰×	Ñ	˜1˜x™<¨°Ñ)9ÀÐ	Ó	F€BÜ	�‰��e˜q‘j‘ ! UÓ	+€BÜ	�‰��e˜q‘j‘ ! UÓ	+€BÜ	�‰��e˜q‘j‘ ! UÓ	+€BÜ	�‰��e˜q‘j‘ ! UÓ	+€BØˆr�2�rˆ>Ðr   c                 óæ  — t        |«      dk(  sJ ‚| dd \  }}t        j                  j                  t	        ||d   z  «      t	        ||d   z  «      |¬«      }t        j                  j                  t	        ||d   z  «      t	        ||d   z  «      |¬«      }t        j                  j                  d||z
  |¬«      }t        j                  j                  d||z
  |¬«      }||z   }	||z   }
||	||
fS )aÖ   Min-Max CutMix bounding-box
    Inspired by Darknet cutmix impl, generates a random rectangular bbox
    based on min/max percent values applied to each dimension of the input image.

    Typical defaults for minmax are usually in the  .2-.3 for min and .8-.9 range for max.

    Args:
        img_shape (tuple): Image shape as tuple
        minmax (tuple or list): Min and max bbox ratios (as percent of image size)
        count (int): Number of bbox to generate
    r    r   Nr   r   r   )Úlenr!   r$   r%   r#   )r'   Úminmaxr)   r+   r,   r-   r.   r3   r5   ÚyuÚxus              r   Úrand_bbox_minmaxr=   6   só   € ô ˆv‹;˜!ÒÐÐØ˜R˜S�>�L€Eˆ5Ü�I‰I×Ñœc %¨&°©)Ñ"3Ó4´c¸%À&ÈÁ)Ñ:KÓ6LÐSXÐÓY€EÜ�I‰I×Ñœc %¨&°©)Ñ"3Ó4´c¸%À&ÈÁ)Ñ:KÓ6LÐSXÐÓY€EÜ	�‰×	Ñ	˜1˜e e™m°%Ð	Ó	8€BÜ	�‰×	Ñ	˜1˜e e™m°%Ð	Ó	8€BØ	ˆe‰€BØ	ˆe‰€BØˆr�2�rˆ>Ðr   c                 ó¶   — |�t        | ||¬«      \  }}}}nt        | ||¬«      \  }}}}|s|�%||z
  ||z
  z  }	d|	t        | d   | d   z  «      z  z
  }||||f|fS )z0 Generate bbox and apply lambda correction.
    )r)   r   r   r   )r=   r7   Úfloat)
r'   r   Úratio_minmaxÚcorrect_lamr)   r3   r;   r5   r<   Ú	bbox_areas
             r   Úcutmix_bbox_and_lamrC   M   s…   € ð ÐÜ)¨)°\ÈÔO‰ˆˆB�‘Bä" 9¨c¸Ô?‰ˆˆB��BÙ�lÐ.Ø˜"‘W  b¡Ñ)ˆ	Ø�9œu Y¨r¡]°Y¸r±]Ñ%BÓCÑCÑCˆØ��B˜Ð˜SÐ Ð r   c                   ó@   — e Zd ZdZ	 	 d
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
y)ÚMixupas   Mixup/Cutmix that applies different params to each element or whole batch

    Args:
        mixup_alpha (float): mixup alpha value, mixup is active if > 0.
        cutmix_alpha (float): cutmix alpha value, cutmix is active if > 0.
        cutmix_minmax (List[float]): cutmix min/max image ratio, cutmix is active and uses this vs alpha if not None.
        prob (float): probability of applying mixup or cutmix per batch or element
        switch_prob (float): probability of switching to cutmix instead of mixup when both are active
        mode (str): how to apply mixup/cutmix params (per 'batch', 'pair' (pair of elements), 'elem' (element)
        correct_lam (bool): apply lambda correction when cutmix bbox clipped by image borders
        label_smoothing (float): apply label smoothing to the mixed target tensor
        num_classes (int): number of classes for target
    Nc
                 óê   — || _         || _        || _        | j                  �!t        | j                  «      dk(  sJ ‚d| _        || _        || _        || _        |	| _        || _        || _	        d| _
        y )Nr    r   T)Úmixup_alphaÚcutmix_alphaÚcutmix_minmaxr9   Úmix_probÚswitch_probÚlabel_smoothingr   ÚmoderA   Úmixup_enabled)
ÚselfrG   rH   rI   ÚprobrK   rM   rA   rL   r   s
             r   Ú__init__zMixup.__init__h   s}   € à&ˆÔØ(ˆÔØ*ˆÔØ×ÑÐ)Ü�t×)Ñ)Ó*¨aÒ/Ð/Ð/à #ˆDÔØˆŒØ&ˆÔØ.ˆÔØ&ˆÔØˆŒ	Ø&ˆÔØ!ˆÕr   c           	      óP  — t        j                  |t         j                  ¬«      }t        j                  |t        ¬«      }| j
                  �rÖ| j                  dkD  r»| j                  dkD  r¬t         j                  j                  |«      | j                  k  }t        j                  |t         j                  j                  | j                  | j                  |¬«      t         j                  j                  | j                  | j                  |¬«      «      }n®| j                  dkD  r7t         j                  j                  | j                  | j                  |¬«      }nh| j                  dkD  rRt        j                  |t        ¬«      }t         j                  j                  | j                  | j                  |¬«      }nJ d«       ‚t        j                  t         j                  j                  |«      | j                  k  |j                  t         j                  «      |«      }||fS )N©Údtypeç        r   úROne of mixup_alpha > 0., cutmix_alpha > 0., cutmix_minmax not None should be true.)r!   ÚonesÚfloat32ÚzerosÚboolrN   rG   rH   r$   ÚrandrK   ÚwhereÚbetarJ   Úastype)rO   Ú
batch_sizer   Ú
use_cutmixÚlam_mixs        r   Ú_params_per_elemzMixup._params_per_elemy   sƒ  € Ü�g‰g�j¬¯
©
Ô3ˆÜ—X‘X˜j´Ô5ˆ
Ø×ÓØ×Ñ "Ò$¨×):Ñ):¸RÒ)?ÜŸY™YŸ^™^¨JÓ7¸$×:JÑ:JÑJ�
ÜŸ(™(ØÜ—I‘I—N‘N 4×#4Ñ#4°d×6GÑ6GÈj�NÓYÜ—I‘I—N‘N 4×#3Ñ#3°T×5EÑ5EÈJ�NÓWóY‘ð ×!Ñ! BÒ&ÜŸ)™)Ÿ.™.¨×)9Ñ)9¸4×;KÑ;KÐR\˜.Ó]‘Ø×"Ñ" RÒ'ÜŸW™W Z´tÔ<�
ÜŸ)™)Ÿ.™.¨×):Ñ):¸D×<MÑ<MÐT^˜.Ó_‘àrÐrÓr�uÜ—(‘(œ2Ÿ9™9Ÿ>™>¨*Ó5¸¿¹ÑEÀwÇ~Á~ÔVX×V`ÑV`ÓGaÐcfÓgˆCØ�JˆÐr   c                 ó$  — d}d}| j                   �r|t        j                  j                  «       | j                  k  �rP| j
                  dkD  r¥| j                  dkD  r–t        j                  j                  «       | j                  k  }|r4t        j                  j                  | j                  | j                  «      n3t        j                  j                  | j
                  | j
                  «      }n‘| j
                  dkD  r5t        j                  j                  | j
                  | j
                  «      }nM| j                  dkD  r7d}t        j                  j                  | j                  | j                  «      }nJ d«       ‚t        |«      }||fS )Nr   FrU   TrV   )
rN   r!   r$   r[   rJ   rG   rH   rK   r]   r?   )rO   r   r`   ra   s       r   Ú_params_per_batchzMixup._params_per_batch�   s#  € ØˆØˆ
Ø×Ó¤"§)¡)§.¡.Ó"2°T·]±]Ó"BØ×Ñ "Ò$¨×):Ñ):¸RÒ)?ÜŸY™YŸ^™^Ó-°×0@Ñ0@Ñ@�
ÙR\œ"Ÿ)™)Ÿ.™.¨×):Ñ):¸D×<MÑ<MÔNÜ—I‘I—N‘N 4×#3Ñ#3°T×5EÑ5EÓFñ à×!Ñ! BÒ&ÜŸ)™)Ÿ.™.¨×)9Ñ)9¸4×;KÑ;KÓL‘Ø×"Ñ" RÒ'Ø!�
ÜŸ)™)Ÿ.™.¨×):Ñ):¸D×<MÑ<MÓN‘àrÐrÓr�uÜ˜“.ˆCØ�JˆÐr   c                 ó  — t        |«      }| j                  |«      \  }}|j                  «       }t        |«      D ]�  }||z
  dz
  }||   }|dk7  sŒ||   r^t	        ||   j
                  || j                  | j                  ¬«      \  \  }	}
}}}||   d d …|	|
…||…f   ||   d d …|	|
…||…f<   |||<   Œy||   |z  ||   d|z
  z  z   ||<   Œ‘ t        j                  ||j                  |j                  ¬«      j                  d«      S )Nr   r   ©r@   rA   ©r   rT   )r9   rb   ÚcloneÚrangerC   ÚshaperI   rA   r	   Útensorr   rT   Ú	unsqueeze©rO   r   r_   Ú	lam_batchr`   Úx_origÚiÚjr   r3   r4   r5   r6   s                r   Ú	_mix_elemzMixup._mix_elemŸ   s#  € Ü˜“Vˆ
Ø $× 5Ñ 5°jÓ AÑˆ	�:Ø—‘“ˆÜ�zÓ"ò 
	>ˆAØ˜Q‘ Ñ"ˆAØ˜A‘,ˆCØ�b‹yØ˜a’=Ü,?Ø˜!™Ÿ
™
 C°d×6HÑ6HÐVZ×VfÑVfô-hÑ)Ñ$�R˜˜R  cà,2°1©I²a¸¸B¸ÀÀ2À°oÑ,F�A�a‘Dš˜B˜r˜E 2 b 5˜Ñ)Ø#&�I˜a’Là˜Q™4 #™:¨¨q©	°Q¸±WÑ(=Ñ=�A�a’Dð
	>ô �|‰|˜I¨a¯h©h¸a¿g¹gÔF×PÑPÐQRÓSÐSr   c                 óÄ  — t        |«      }| j                  |dz  «      \  }}|j                  «       }t        |dz  «      D ]Æ  }||z
  dz
  }||   }|dk7  sŒ||   r~t	        ||   j
                  || j                  | j                  ¬«      \  \  }	}
}}}||   d d …|	|
…||…f   ||   d d …|	|
…||…f<   ||   d d …|	|
…||…f   ||   d d …|	|
…||…f<   |||<   Œ™||   |z  ||   d|z
  z  z   ||<   ||   |z  ||   d|z
  z  z   ||<   ŒÈ t        j                  ||d d d…   f«      }t        j                  ||j                  |j                  ¬«      j                  d«      S )Nr    r   r   rf   r   rg   )r9   rb   rh   ri   rC   rj   rI   rA   r!   Úconcatenater	   rk   r   rT   rl   rm   s                r   Ú	_mix_pairzMixup._mix_pair°   sœ  € Ü˜“Vˆ
Ø $× 5Ñ 5°jÀA±oÓ FÑˆ	�:Ø—‘“ˆÜ�z Q‘Ó'ò 	>ˆAØ˜Q‘ Ñ"ˆAØ˜A‘,ˆCØ�b‹yØ˜a’=Ü,?Ø˜!™Ÿ
™
 C°d×6HÑ6HÐVZ×VfÑVfô-hÑ)Ñ$�R˜˜R  cà,2°1©I²a¸¸B¸ÀÀ2À°oÑ,F�A�a‘Dš˜B˜r˜E 2 b 5˜Ñ)Ø,2°1©I²a¸¸B¸ÀÀ2À°oÑ,F�A�a‘Dš˜B˜r˜E 2 b 5˜Ñ)Ø#&�I˜a’Là˜Q™4 #™:¨¨q©	°Q¸±WÑ(=Ñ=�A�a‘DØ˜Q™4 #™:¨¨q©	°Q¸±WÑ(=Ñ=�A�a’Dð	>ô —N‘N I¨y¹¸2¸©Ð#?Ó@ˆ	Ü�|‰|˜I¨a¯h©h¸a¿g¹gÔF×PÑPÐQRÓSÐSr   c                 óŽ  — | j                  «       \  }}|dk(  ry|rft        |j                  || j                  | j                  ¬«      \  \  }}}}}|j                  d«      d d …d d …||…||…f   |d d …d d …||…||…f<   |S |j                  d«      j                  d|z
  «      }|j                  |«      j                  |«       |S )Nr   rf   r   )rd   rC   rj   rI   rA   r   Úmul_Úadd_)	rO   r   r   r`   r3   r4   r5   r6   Ú	x_flippeds	            r   Ú
_mix_batchzMixup._mix_batchÄ   sÊ   € Ø×0Ñ0Ó2‰ˆˆZØ�"Š9ØÙÜ$7Ø—‘˜¨4×+=Ñ+=È4×K[ÑK[ô%]Ñ!ÑˆR��R˜˜cà$%§F¡F¨1£Iªa²°B°r°E¸2¸b¸5Ð.@Ñ$AˆAŠa’�B�r�E˜2˜b˜5Ð Ñ!ð ˆ
ð Ÿ™˜q›	Ÿ™ r¨C¡xÓ0ˆIØ�F‰F�3‹K×Ñ˜YÔ'Øˆ
r   c                 ó$  — t        |«      dz  dk(  sJ d«       ‚| j                  dk(  r| j                  |«      }n2| j                  dk(  r| j                  |«      }n| j	                  |«      }t        || j                  || j                  «      }||fS )Nr    r   ú)Batch size should be even when using thisÚelemÚpair)r9   rM   rr   ru   rz   r   r   rL   )rO   r   r   r   s       r   Ú__call__zMixup.__call__Ñ   s„   € Ü�1‹v˜‰z˜QŠÐKÐ KÓKˆØ�9‰9˜ÒØ—.‘. Ó#‰CØ�Y‰Y˜&Ò Ø—.‘. Ó#‰Cà—/‘/ !Ó$ˆCÜ˜f d×&6Ñ&6¸¸T×=QÑ=QÓRˆØ�&ˆyÐr   )	r   rU   Nr   g      à?ÚbatchTgš™™™™™¹?iè  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   rb   rd   rr   ru   rz   r   © r   r   rE   rE   Z   s6   „ ñð cfØRVó"ò"ò(ò$Tò"Tò(ó	r   rE   c                   ó,   — e Zd ZdZdd„Zd„ Zd„ Zdd„Zy)	ÚFastCollateMixupzŸ Fast Collate w/ Mixup/Cutmix that applies different params to each element or whole batch

    A Mixup impl that's performed while collating the batches.
    c           	      ó°  — t        |«      }|r|dz  n|}t        |«      |k(  sJ ‚| j                  |«      \  }}t        |d   d   t        j                  «      }t        |«      D �]   }	||	z
  dz
  }
||	   }||	   d   }|dk7  �r3||	   r|s"|r|j                  «       n|j                  «       }t        |j                  || j                  | j                  ¬«      \  \  }}}}}||
   d   d d …||…||…f   |d d …||…||…f<   |||	<   n¯|rf|j                  t        j                  «      |z  ||
   d   j                  t        j                  «      d|z
  z  z   }t        j                  ||¬«       nG|j                  «       |z  ||
   d   j                  «       d|z
  z  z   }t!        j"                  ||¬«       ||	xx   |r2t!        j$                  |j                  t        j&                  «      «      n|j)                  «       z  cc<   �Œ£ |r*t        j*                  |t        j,                  |«      f«      }t!        j.                  |«      j1                  d«      S )Nr    r   r   r   rf   ©Úout)r9   rb   Ú
isinstancer!   Úndarrayri   Úcopyrh   rC   rj   rI   rA   r^   rX   Úrintr?   r	   ÚroundÚ
from_numpyÚuint8Úbytert   rW   rk   rl   )rO   Úoutputr€   Úhalfr_   Únum_elemrn   r`   Úis_nprp   rq   r   Úmixedr3   r4   r5   r6   s                    r   Ú_mix_elem_collatez"FastCollateMixup._mix_elem_collateã   s(  € Ü˜“Zˆ
Ù&*�: ’?°
ˆÜ�6‹{˜hÒ&Ð&Ð&Ø $× 5Ñ 5°hÓ ?Ñˆ	�:Ü˜5 ™8 A™;¬¯
©
Ó3ˆä�x“ó 	]ˆAØ˜Q‘ Ñ"ˆAØ˜A‘,ˆCØ˜!‘H˜Q‘KˆEØ�b‹yØ˜a’=ÙÙ05 §
¡
¤¸5¿;¹;»=˜Ü,?ØŸ™ØØ%)×%7Ñ%7Ø$(×$4Ñ$4ô	-Ñ)Ñ$�R˜˜R  cð .3°1©X°a©[º¸B¸r¸EÀ2ÀbÀ5¸Ñ-I�Eš!˜R ˜U B r E˜/Ñ*Ø#&�I˜a’LáØ %§¡¬R¯Z©ZÓ 8¸3Ñ >ÀÀqÁÈ!Á×ASÑASÔTV×T^ÑT^ÓA_ÐcdÐgjÑcjÑAkÑ k˜ÜŸ™ ¨5Ö1à %§¡£°Ñ 3°e¸A±h¸q±k×6GÑ6GÓ6IÈQÐQTÉWÑ6UÑ U˜ÜŸ™ E¨uÕ5Ø�1‹IÁUœ×)Ñ)¨%¯,©,´r·x±xÓ*@ÔAÐPU×PZÑPZÓP\Ñ\�Ið/	]ñ0 ÜŸ™¨	´2·7±7¸8Ó3DÐ'EÓFˆIÜ�|‰|˜IÓ&×0Ñ0°Ó3Ð3r   c           	      ó¨  — t        |«      }| j                  |dz  «      \  }}t        |d   d   t        j                  «      }t        |dz  «      D �]¾  }||z
  dz
  }||   }	||   d   }
||   d   }d|	cxk  rdk  sJ ‚ J ‚|	dk  �rê||   ržt        |j                  |	| j                  | j                  ¬«      \  \  }}}}}	|r|
d d …||…||…f   j                  «       n|
d d …||…||…f   j                  «       }|d d …||…||…f   |
d d …||…||…f<   ||d d …||…||…f<   |	||<   �nG|rÁ|
j                  t        j                  «      |	z  |j                  t        j                  «      d|	z
  z  z   }|j                  t        j                  «      |	z  |
j                  t        j                  «      d|	z
  z  z   }|}
t        j                  ||¬«       t        j                  |
|
¬«       n„|
j                  «       |	z  |j                  «       d|	z
  z  z   }|j                  «       |	z  |
j                  «       d|	z
  z  z   }|}
t!        j"                  ||¬«       t!        j"                  |
|
¬«       ||xx   |r2t!        j$                  |
j                  t        j&                  «      «      n|
j)                  «       z  cc<   ||xx   |r2t!        j$                  |j                  t        j&                  «      «      n|j)                  «       z  cc<   �ŒÁ t        j*                  ||d d d…   f«      }t!        j,                  |«      j/                  d«      S )Nr    r   r   r   rf   r‰   r   )r9   rb   r‹   r!   rŒ   ri   rC   rj   rI   rA   r�   rh   r^   rX   rŽ   r?   r	   r�   r�   r‘   r’   rt   rk   rl   )rO   r“   r€   r_   rn   r`   r–   rp   rq   r   Úmixed_iÚmixed_jr3   r4   r5   r6   Úpatch_iÚ
mixed_temps                     r   Ú_mix_pair_collatez"FastCollateMixup._mix_pair_collate  s  € Ü˜“Zˆ
Ø $× 5Ñ 5°jÀA±oÓ FÑˆ	�:Ü˜5 ™8 A™;¬¯
©
Ó3ˆä�z Q‘Ó'ó  	aˆAØ˜Q‘ Ñ"ˆAØ˜A‘,ˆCØ˜A‘h˜q‘kˆGØ˜A‘h˜q‘kˆGØ˜”?˜s’?Ð"‘?Ð"�?Ø�R‹xØ˜a’=Ü,?ØŸ™ØØ%)×%7Ñ%7Ø$(×$4Ñ$4ô	-Ñ)Ñ$�R˜˜R  cñ BG˜g¢a¨¨B¨°°2° oÑ6×;Ñ;Ô=ÈGÒTUÐWYÐZ\ÐW\Ð^`ÐacÐ^cÐTcÑLd×LjÑLjÓLl�GØ/6²q¸"¸R¸%ÀÀBÀ°Ñ/G�GšA˜r "˜u b¨ e˜OÑ,Ø/6�GšA˜r "˜u b¨ e˜OÑ,Ø#&�I˜a“LáØ%,§^¡^´B·J±JÓ%?À#Ñ%EÈÏÉÔWY×WaÑWaÓHbÐfgÐjmÑfmÑHnÑ%n˜
Ø")§.¡.´·±Ó"<¸sÑ"BÀWÇ^Á^ÔTV×T^ÑT^ÓE_ÐcdÐgjÑcjÑEkÑ"k˜Ø",˜ÜŸ™ ¨WÕ5ÜŸ™ ¨WÖ5à%,§]¡]£_°sÑ%:¸W¿]¹]»_ÐPQÐTWÑPWÑ=XÑ%X˜
Ø")§-¡-£/°CÑ"7¸'¿-¹-»/ÈQÐQTÉWÑ:UÑ"U˜Ø",˜ÜŸ™ G°Õ9ÜŸ™ G°Õ9Ø�1‹IÁuœ×)Ñ)¨'¯.©.¼¿¹Ó*BÔCÐRY×R^ÑR^ÓR`Ñ`‹IØ�1‹IÁuœ×)Ñ)¨'¯.©.¼¿¹Ó*BÔCÐRY×R^ÑR^ÓR`Ñ`�IðA 	aôB —N‘N I¨y¹¸2¸©Ð#?Ó@ˆ	Ü�|‰|˜IÓ&×0Ñ0°Ó3Ð3r   c           	      óÄ  — t        |«      }| j                  «       \  }}t        |d   d   t        j                  «      }|r5t        |j                  || j                  | j                  ¬«      \  \  }}}	}
}t        |«      D �][  }||z
  dz
  }||   d   }|dk7  rô|rC|r|j                  «       n|j                  «       }||   d   d d ……	
…f   |d d …||…|	|
…f<   n¯|rf|j                  t        j                  «      |z  ||   d   j                  t        j                  «      d|z
  z  z   }t        j                  ||¬«       nG|j                  «       |z  ||   d   j                  «       d|z
  z  z   }t!        j"                  ||¬«       ||xx   |r2t!        j$                  |j                  t        j&                  «      «      n|j)                  «       z  cc<   �Œ^ |S )Nr   rf   r   r   r‰   )r9   rd   r‹   r!   rŒ   rC   rj   rI   rA   ri   r�   rh   r^   rX   rŽ   r?   r	   r�   r�   r‘   r’   )rO   r“   r€   r_   r   r`   r–   r3   r4   r5   r6   rp   rq   r—   s                 r   Ú_mix_batch_collatez#FastCollateMixup._mix_batch_collate/  s½  € Ü˜“Zˆ
Ø×0Ñ0Ó2‰ˆˆZÜ˜5 ™8 A™;¬¯
©
Ó3ˆáÜ$7Ø—‘ØØ!×/Ñ/Ø ×,Ñ,ô	%Ñ!ÑˆR��R˜˜cô �zÓ"ó 	]ˆAØ˜Q‘ Ñ"ˆAØ˜!‘H˜Q‘KˆEØ�bŠyÙÙ,1˜EŸJ™JœL°u·{±{³}�EØ-2°1©X°a©[º¸B¸r¸EÀ2ÀbÀ5¸Ñ-I�Eš!˜R ˜U B r E˜/Ò*áØ %§¡¬R¯Z©ZÓ 8¸3Ñ >ÀÀqÁÈ!Á×ASÑASÔTV×T^ÑT^ÓA_ÐcdÐgjÑcjÑAkÑ k˜ÜŸ™ ¨5Ö1à %§¡£°Ñ 3°e¸A±h¸q±k×6GÑ6GÓ6IÈQÐQTÉWÑ6UÑ U˜ÜŸ™ E¨uÕ5Ø�1‹IÁUœ×)Ñ)¨%¯,©,´r·x±xÓ*@ÔAÐPU×PZÑPZÓP\Ñ\�Ið	]ð ˆ
r   Nc                 ól  — t        |«      }|dz  dk(  sJ d«       ‚d| j                  v }|r|dz  }t        j                  |g|d   d   j                  ¢­t        j
                  ¬«      }| j                  dk(  s| j                  dk(  r| j                  |||¬«      }n4| j                  dk(  r| j                  ||«      }n| j                  ||«      }t        j                  |D �cg c]  }|d	   ‘Œ	 c}t        j                  ¬«      }t        || j                  || j                  «      }|d | }||fS c c}w )
Nr    r   r|   r”   rS   r}   )r”   r~   r   )r9   rM   r	   rY   rj   r‘   r˜   rž   r    rk   Úint64r   r   rL   )	rO   r€   Ú_r_   r”   r“   r   Úbr   s	            r   r   zFastCollateMixup.__call__L  s   € Ü˜“Zˆ
Ø˜A‰~ Ò"ÐOÐ$OÓOÐ"Ø˜Ÿ™Ð"ˆÙØ˜1ÑˆJÜ—‘˜jÐ=¨5°©8°A©;×+<Ñ+<Ñ=ÄUÇ[Á[ÔQˆØ�9‰9˜Ò $§)¡)¨vÒ"5Ø×(Ñ(¨°¸TÐ(ÓB‰CØ�Y‰Y˜&Ò Ø×(Ñ(¨°Ó7‰Cà×)Ñ)¨&°%Ó8ˆCÜ—‘¨UÖ3¨˜q ›tÒ3¼5¿;¹;ÔGˆÜ˜f d×&6Ñ&6¸¸T×=QÑ=QÓRˆØ˜˜Ð$ˆØ�vˆ~Ðùò 4s   Ã#D1)F©N)r�   r‚   rƒ   r„   r˜   rž   r    r   r…   r   r   r‡   r‡   Ý   s   „ ñó
!4òF'4òRô:r   r‡   )r   rU   )rU   Nr¥   )NTN)r„   Únumpyr!   r	   r   r   r7   r=   rC   rE   r‡   r…   r   r   ú<module>r§      sG   ðñó Û ógó
&óó0ó.
!÷@ñ @ôF�uõ r   