Ë
    éÓ^jË7  ã                   óH   — d Z ddlZddlZddlmZmZmZ ddlZ G d„ d«      Zy)aX  Patch-level random erasing augmentation for NaFlex Vision Transformers.

This module implements random erasing specifically designed for patchified images,
operating at the patch granularity rather than pixel level. It supports two modes:
- 'patch': Randomly erases individual patches (speckle-like noise)
- 'region': Erases contiguous rectangular regions of patches (similar to original RandomErasing)

The implementation is coordinate-aware, respecting valid patch boundaries and supporting
variable patch sizes in NaFlex training.

Hacked together by / Copyright 2025, Ross Wightman, Hugging Face
é    N)ÚOptionalÚUnionÚTuplec                   ó®  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 ddedededee   deded	ed
ee   dededededeee	j                  f   ddfd„Zde	j                  dfdeeedf   e	j                  f   dee	j                     de	j                   deeee	j                  f      de	j                  f
d„Zde	j                  de	j                  de	j                  dee	j                  e	j                  e	j                  f   fd„Ze	j                  fde	j                  de	j                  de	j                  de	j                  de	j                   ddfd„Ze	j                  fde	j                  de	j                  de	j                  de	j                  de	j                   ddfd„Z	 d de	j                  de	j                  dee	j                     de	j                  fd„Zdefd„Zy)!ÚPatchRandomErasingzÝRandom erasing for patchified images in NaFlex format.

    Supports two modes:
    1. 'patch': Simple mode that erases randomly selected valid patches
    2. 'region': Erases rectangular regions at patch granularity
    NÚ
erase_probÚpatch_drop_probÚ	min_countÚ	max_countÚmin_areaÚmax_areaÚ
min_aspectÚ
max_aspectÚmodeÚvalueÚspatial_modeÚ
num_splitsÚdeviceÚreturnc                 ó€  — || _         || _        || _        |xs || _        || _        || _        |xs d|z  }t        j                  |«      t        j                  |«      f| _        || _	        || _
        || _        | j                  dv sJ ‚|	j                  «       | _        | j                  dv sJ ‚|
| _        d| _        y)aé  Initialize PatchRandomErasing.

        Args:
            erase_prob: Probability that the Random Erasing operation will be performed.
            patch_drop_prob: Patch dropout probability. Remove random patches instead of erasing.
            min_count: Minimum number of erasing operations.
            max_count: Maximum number of erasing operations.
            min_area: Minimum percentage of valid patches/area to erase.
            max_area: Maximum percentage of valid patches/area to erase.
            min_aspect: Minimum aspect ratio of erased area (only used in 'region' mode).
            max_aspect: Maximum aspect ratio of erased area (only used in 'region' mode).
            mode: Patch content mode, one of 'const', 'rand', or 'pixel'.
            value: Constant value for 'const' mode.
            spatial_mode: Erasing strategy, one of 'patch' or 'region'.
            num_splits: Number of splits to apply erasing to (0 for all).
            device: Computation device.
        é   )ÚpatchÚregion)ÚrandÚpixelÚconstTN)r   r	   r
   r   r   r   ÚmathÚlogÚlog_aspect_ratior   r   r   ÚlowerÚ
erase_modeÚconst_valueÚunique_noise_per_patch)Úselfr   r	   r
   r   r   r   r   r   r   r   r   r   r   s                 új/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/data/naflex_random_erasing.pyÚ__init__zPatchRandomErasing.__init__   sÅ   € ðB %ˆŒØ.ˆÔØ"ˆŒØ"Ò/ iˆŒØ ˆŒØ ˆŒð  Ò1 1 z¡>ˆ
Ü!%§¡¨*Ó!5´t·x±xÀ
Ó7KÐ LˆÔð %ˆŒØˆŒð )ˆÔØ× Ñ Ð$7Ñ7Ð7Ð7ð Ÿ*™*›,ˆŒØ�‰Ð"<Ñ<Ð<Ð<Ø ˆÔØ&*ˆÕ#ó    Úshape.Údtypec                 ó  — |xs | j                   }| j                  dk(  r&t        j                  |||¬«      j	                  «       S t        |«      dk(  rdd|d   fnd|d   f}| j                  dk(  s|�q|xs | j                  }t        |t        t        f«      rt        j                  ||||¬«      }|S t        j                  |||¬«      }t        j                  ||«      }|S t        j                  |||¬«      j	                  «       }|S )aL  Generate values for erased patches based on the specified mode.

        Args:
            shape: Shape of patches to erase.
            value: Value to use in const (or rand) mode.
            dtype: Data type to use.
            device: Device to use.

        Returns:
            Tensor with values for erasing patches.
        r   ©r)   r   é   r   éÿÿÿÿr   )r   r!   ÚtorchÚemptyÚnormal_Úlenr"   Ú
isinstanceÚintÚfloatÚfullÚtensorÚexpand_copy)r$   r(   r   r)   r   Úerase_valueÚvaluess          r%   Ú_get_valueszPatchRandomErasing._get_valuesW   sù   € ð$ Ò&˜4Ÿ;™;ˆØ�?‰?˜gÒ%ä—;‘;˜u¨E¸&ÔA×IÑIÓKÐKä),¨U«°qª�Q˜˜5 ™9Ñ%¸qÀ%ÈÁ)¸nˆEØ�‰ 'Ò)¨UÐ->Ø#Ò7 t×'7Ñ'7�Ü˜k¬C´¨<Ô8Ü"ŸZ™Z¨¨{À%ÐPVÔW�Fð ˆMô	 #(§,¡,¨{À%ÐPVÔ"W�KÜ"×.Ñ.¨{¸EÓB�Fð ˆMô Ÿ™ U°%ÀÔG×OÑOÓQ�ØˆMr'   ÚpatchesÚpatch_coordÚpatch_validc           	      óP  — t        j                   «       | j                  kD  ryt        j                  |d¬«      d   j	                  «       }|s|||fS t        |«      }| j                  rºt        dt        |d| j                  z
  z  «      «      }t        j                  t        j                  d|| j                  ¬«      d¬	«      dd…d|…f   }|j                  d¬	«      d   }|j                  d|j                  d«      j                  d
|j                   dd z   «      «      }|||fS )aå  Patch Dropout.

        Fully drops patches from datastream. Only mode that saves compute BUT requires support
        for non-contiguous patches and associated patch coordinate and valid handling.

        Args:
            patches: Tensor of patches.
            patch_coord: Tensor of patch coordinates.
            patch_valid: Tensor indicating which patches are valid.

        Returns:
            Tuple of (patches, patch_coord, patch_valid) with some patches dropped.
        NT©Úas_tupler   r   g      ð?©r   r-   )Údim)r-   r-   é   )Úrandomr   r.   ÚnonzeroÚtolistr1   r	   Úmaxr3   ÚargsortÚrandnr   ÚsortÚgatherÚ	unsqueezeÚexpandr(   )r$   r;   r<   r=   Úvalid_indicesÚ	num_validÚnum_keepÚkeep_indicess           r%   Ú_drop_patchesz PatchRandomErasing._drop_patchesz   s  € ô( �=‰=‹?˜TŸ_™_Ò,Øô Ÿ™ k¸DÔAÀ!ÑD×KÑKÓMˆñ Ø˜K¨Ð4Ð4ä˜Ó&ˆ	Ø×Òä˜1œc )¨r°D×4HÑ4HÑ/HÑ"IÓJÓKˆHÜ Ÿ=™=¬¯©°Q¸	È$Ï+É+Ô)VÐ\^Ô_Ò`aÐclÐdlÐclÐ`lÑmˆLà'×,Ñ,°Ð,Ó4°QÑ7ˆLØ—n‘n Q¨×(>Ñ(>¸rÓ(B×(IÑ(IÈ(ÐU\×UbÑUbÐcdÐceÐUfÑJfÓ(gÓhˆGà˜ [Ð0Ð0r'   Úpatch_shapec           
      óˆ  — t        j                   «       | j                  kD  ryt        j                  |d¬«      d   }t	        |«      }|dk(  ryt        j
                  | j                  | j                  «      }t        |t        dt        ||z  | j                  z  «      «      «      }	t        dt        ||z  | j                  z  «      «      }
t        j
                  |
|	«      }|t        j                  ||j                  ¬«      d|    }| j                  r| j                   dk(  r|f|z   }n|}| j#                  ||¬«      ||<   y)	aü  Apply erasing by selecting individual patches randomly.

        The simplest mode, aligned on patch boundaries. Behaves similarly to speckle or 'sprinkles'
        noise augmentation at patch size.

        Args:
            patches: Tensor of patches to modify in-place.
            patch_coord: Tensor of patch coordinates.
            patch_valid: Tensor indicating which patches are valid.
            patch_shape: Shape of individual patches.
            dtype: Data type for generated values.
        NTr?   r   r   rA   r   ©r)   )rD   r   r.   rE   r1   Úrandintr
   r   ÚminrG   r3   r   r   Úrandpermr   r#   r!   r:   )r$   r;   r<   r=   rS   r)   rN   rO   ÚcountÚ	max_eraseÚ	min_eraseÚ	num_eraseÚ	erase_idxÚ
fill_shapes                 r%   Ú_erase_patchesz!PatchRandomErasing._erase_patches£   s  € ô( �=‰=‹?˜TŸ_™_Ò,Øô Ÿ™ k¸DÔAÀ!ÑDˆÜ˜Ó&ˆ	Ø˜Š>Øä—‘˜tŸ~™~¨t¯~©~Ó>ˆä˜	¤3 q¬#¨i¸%Ñ.?À$Ç-Á-Ñ.OÓ*PÓ#QÓRˆ	Ü˜œ3˜y¨5Ñ0°4·=±=Ñ@ÓAÓBˆ	Ü—N‘N 9¨iÓ8ˆ	ð "¤%§.¡.°À7Ç>Á>Ô"RÐS]ÐT]Ð"^Ñ_ˆ	à×&Ò&¨4¯?©?¸gÒ+Eà#˜¨Ñ3‰Jà$ˆJà!×-Ñ-¨jÀÐ-ÓFˆ�	Òr'   c           
      óÐ  — t        j                   «       | j                  kD  ry||   }t        |«      dk(  ry|dd…df   j                  «       j	                  «       dz   }|dd…df   j                  «       j	                  «       dz   }||}
}	|	|
z  }|dd…df   |dd…df   }}t        j
                  | j                  | j                  «      }t        |«      D �]Œ  }t        d«      D �]z  }t        j                  | j                  | j                  «      |z  }t        j                  t        j                  | j                  Ž «      }t        t!        t        j"                  ||z  «      «      «      }t        t!        t        j"                  ||z  «      «      «      }||	kD  s||
kD  rŒ¿t        j
                  d|	|z
  «      }t        j
                  d|
|z
  «      }||z   ||z   }}||k\  ||k  z  ||k\  z  ||k  z  |z  }t        |j%                  «       j	                  «       «      }|s�Œ@| j&                  r| j(                  dk(  r|f|z   }n|}| j+                  ||¬«      ||<    �ŒŒ �Œ� y)a  Apply erasing by selecting rectangular regions of patches randomly.

        Closer to the original RandomErasing implementation. Erases
        spatially contiguous rectangular regions of patches (aligned with patches).

        Args:
            patches: Tensor of patches to modify in-place.
            patch_coord: Tensor of patch coordinates.
            patch_valid: Tensor indicating which patches are valid.
            patch_shape: Shape of individual patches.
            dtype: Data type for generated values.
        Nr   r   é
   r   rU   )rD   r   r1   rG   ÚitemrV   r
   r   ÚrangeÚuniformr   r   r   Úexpr   r3   ÚroundÚsqrtÚsumr#   r!   r:   )r$   r;   r<   r=   rS   r)   Úvalid_coordÚmax_yÚmax_xÚgrid_hÚgrid_wÚ
total_areaÚysÚxsrY   Ú_ÚattemptÚtarget_areaÚaspect_ratioÚhÚwÚtopÚleftÚbottomÚrightÚregion_maskÚnum_selectedr^   s                               r%   Ú_erase_regionz PatchRandomErasing._erase_regionÑ   sG  € ô( �=‰=‹?˜TŸ_™_Ò,Øð " +Ñ.ˆÜˆ{Ó˜qÒ ØØšA˜q˜DÑ!×%Ñ%Ó'×,Ñ,Ó.°Ñ2ˆØšA˜q˜DÑ!×%Ñ%Ó'×,Ñ,Ó.°Ñ2ˆØ �ˆØ˜f‘_ˆ
ØšQ ˜TÑ" K²°1°Ñ$5ˆBˆä—‘˜tŸ~™~¨t¯~©~Ó>ˆÜ�u“ó %	ˆAä  ›9ó #�ä$Ÿn™n¨T¯]©]¸D¿M¹MÓJÈZÑW�Ü#Ÿx™x¬¯©¸×8MÑ8MÐ(NÓO�ô œœdŸi™i¨°lÑ(BÓCÓDÓE�ÜœœdŸi™i¨°lÑ(BÓCÓDÓE�à�v’:  V¢Øô —n‘n Q¨°©
Ó3�Ü—~‘~ a¨°!©Ó4�Ø # a¡¨°©˜�ð ˜s™ r¨F¡{Ñ3Ø˜t™ñ%Ø(*¨U©
ñ4à#ñ$ð ô
  # ;§?¡?Ó#4×#9Ñ#9Ó#;Ó<�Ù#Ùà×.Ò.°4·?±?ÀgÒ3Mà". °;Ñ!>‘Jà!,�Jà'+×'7Ñ'7¸
È%Ð'7Ó'P�˜Ñ$âòG#ñ%	r'   c                 ó€  — |j                   dk(  r|j                  \  }}}}n$|j                   dk(  r|j                  \  }}}}	}nJ ‚|j                  dd }
|€2t        j                  ||ft        j                  |j
                  ¬«      }| j                  dkD  r|| j                  z  nd}t        ||«      D ]†  }| j                  rJ d«       ‚| j                  d	k(  r)| j                  ||   ||   ||   |
|j                  «       ŒN| j                  d
k(  r)| j                  ||   ||   ||   |
|j                  «       Œ†J ‚ |S )aq  Apply random patch erasing.

        Args:
            patches: Tensor of shape [B, N, P*P, C] or [B, N, Ph, Pw, C].
            patch_coord: Tensor of shape [B, N, 2] with (y, x) coordinates.
            patch_valid: Boolean tensor of shape [B, N] indicating which patches are valid.

        Returns:
            Erased patches tensor of same shape as input.
        é   é   rC   Nr+   r   r   zWIP, not completedr   r   )Úndimr(   r.   ÚonesÚboolr   r   rc   r	   rR   r   r_   r)   r}   )r$   r;   r<   r=   Ú
batch_sizeÚnum_patchesÚ	patch_dimÚchannelsÚpatch_hÚpatch_wrS   Úbatch_startÚis                r%   Ú__call__zPatchRandomErasing.__call__  sS  € ð  �<‰<˜1ÒØ;B¿=¹=Ñ8ˆJ˜ Y±Ø�\‰\˜QÒØBIÇ-Á-Ñ?ˆJ˜ W¨g±xà�5Ø—m‘m A BÐ'ˆð ÐÜŸ*™* j°+Ð%>ÄeÇjÁjÐY`×YgÑYgÔhˆKð 8<·±ÈÒ7J�j D§O¡OÒ3ÐPQˆô �{ JÓ/ò 	ˆAØ×#Ò#Ø2Ð2Ó2�uð ×"Ñ" gÒ-à×#Ñ#Ø˜A‘JØ ‘NØ ‘NØØ—M‘Mõð ×"Ñ" hÒ.Ø×"Ñ"Ø˜A‘JØ ‘NØ ‘NØØ—M‘Mõð �uð5	ð8 ˆr'   c                 ó  — | j                   j                  d| j                  › d| j                  › �z   }|d| j                  › d| j
                  › d| j                  › d�z  }|d| j                  › d| j                  › d�z  }|S )zReturn string representation of PatchRandomErasing.

        Returns:
            String representation of the object.
        z(p=z, mode=z
, spatial=z, area=(z, z))z	, count=()	Ú	__class__Ú__name__r   r!   r   r   r   r
   r   )r$   Úfss     r%   Ú__repr__zPatchRandomErasing.__repr__Y  s†   € ð �^‰^×$Ñ$¨¨T¯_©_Ð,=¸WÀTÇ_Á_ÐDUÐ'VÑVˆØ
�
˜4×,Ñ,Ð-¨X°d·m±m°_ÀBÀtÇ}Á}ÀoÐUWÐXÑXˆØ
�	˜$Ÿ.™.Ð)¨¨D¯N©NÐ+;¸2Ð>Ñ>ˆØˆ	r'   )g      à?ç        r   Ng{®Gáz”?gUUUUUUÕ?g333333Ó?Nr   r’   r   r   Úcuda)N)r�   Ú
__module__Ú__qualname__Ú__doc__r4   r3   r   Ústrr   r.   r   r&   Úfloat32r   ÚSizeÚTensorr)   r:   rR   r_   r}   rŒ   r‘   © r'   r%   r   r      s¿  „ ñð !$Ø%(ØØ'+Ø"Ø#Ø #Ø*.ØØØ (ØØ/5ñ8+àð8+ð #ð8+ð ð	8+ð
   ‘}ð8+ð ð8+ð ð8+ð ð8+ð ! ™ð8+ð ð8+ð ð8+ð ð8+ð ð8+ð ˜#˜uŸ|™|Ð+Ñ,ð8+ð 
ó8+ðz -1Ø!&§¡Ø9=ñ!à˜˜s C˜x™¨%¯*©*Ð4Ñ5ð!ð ˜EŸL™LÑ)ð!ð —;‘;ð	!ð
 ˜U 3¨¯©Ð#4Ñ5Ñ6ð!ð 
�‰ó!ðF'1à—\‘\ð'1ð Ÿ™ð'1ð Ÿ™ð	'1ð
 
ˆu�|‰|˜UŸ\™\¨5¯<©<Ð7Ñ	8ó'1ð^ "'§¡ñ,Gà—\‘\ð,Gð Ÿ™ð,Gð Ÿ™ð	,Gð
 Ÿ™ð,Gð —;‘;ð,Gð 
ó,Gðh "'§¡ñGà—\‘\ðGð Ÿ™ðGð Ÿ™ð	Gð
 Ÿ™ðGð —;‘;ðGð 
óGðZ 37ñ	=à—\‘\ð=ð Ÿ™ð=ð " %§,¡,Ñ/ð	=ð
 
�‰ó=ð~	˜#ô 	r'   r   )	r–   rD   r   Útypingr   r   r   r.   r   r›   r'   r%   ú<module>r�      s'   ðñó Û ß )Ñ )ã ÷Mò Mr'   