
    
3jG              ]          S r SSKrSSKJr  SSKJr  SSKJrJrJ	r	J
r
JrJrJr  SSKrSSKJrJr  SSKJrJr  SS	KJrJr  SS
KJr  SSKJr   " S S5      rSSSSSSSSSSSSSSSSSSSSSSSSSS\\SSSSSSSSSSS\R:                  \R<                  " S5      SSS4,S\\\\\4   \4      S\\
\      S\\
\       S\\S 4   S!\S"\S#\!S$\\   S%\!S&\ S'\"S(\S)\!S*\\"   S+\\\ \ 4      S,\\\ \ 4      S-\ S.\ S/\ S0\\    S1\ S2\ S3\\"   S4\S5\S6\"S7\\ S 4   S8\\ S 4   S9\\    S:\\"   S;\\   S<\S=\!S>\S?\S@\SA\SB\!SC\!SD\RF                  SE\\"\R<                  4   SF\!SG\"SH\!SI\\RH                  RJ                  RL                  \4   4ZSJ jjr'g)Ka  NaFlex data loader for dynamic sequence length training.

This module provides a specialized data loader for Vision Transformer models that supports:
- Dynamic sequence length sampling during training for improved efficiency
- Variable patch size training with probabilistic selection
- Patch-level random erasing augmentation
- Efficient GPU prefetching with normalization

Hacked together by / Copyright 2025, Ross Wightman, Hugging Face
    N)suppress)partial)CallableDictIteratorListOptionalTupleUnion   )IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)_worker_initadapt_to_chs)NaFlexMapDatasetWrapperNaFlexCollator)PatchRandomErasing)create_transformc                      \ rS rSrSr\\S\R                  " S5      SSSSS	S
4
S\R                  R                  R                  S\\S4   S\\S4   S\S\R                  S\\R                      S\S\S\S\S\SS4S jjrS\\\\\R,                  4   \R,                  4      4S jrS\4S jr\S 5       r\S 5       rSrg)NaFlexPrefetchLoader   z;Data prefetcher for NaFlex format which normalizes patches.   cudaN        constr   r   Tloadermean.stdchannelsdevice	img_dtypere_probre_modere_countre_num_splitspatchify_channels_lastreturnc                    Xl         XPl        U=(       d    [        R                  U l        [        X$5      n[        X45      nX@l        Xl        U(       a  SSU4OSUS4n[        R                  " U Vs/ s H  oS-  PM	     snXPR                  S9R                  U5      U l
        [        R                  " U Vs/ s H  oS-  PM	     snXPR                  S9R                  U5      U l        US:  a  [        UUU	U
US9U l        OSU l        UR                  S:H  =(       a    [        R                  R!                  5       U l        UR                  S:H  =(       a    [        R$                  R!                  5       U l        gs  snf s  snf )	a  Initialize NaFlexPrefetchLoader.

Args:
    loader: DataLoader to prefetch from.
    mean: Mean values for normalization.
    std: Standard deviation values for normalization.
    channels: Number of image channels.
    device: Device to move tensors to.
    img_dtype: Data type for image tensors.
    re_prob: Random erasing probability.
    re_mode: Random erasing mode.
    re_count: Maximum number of erasing rectangles.
    re_num_splits: Number of augmentation splits.
    patchify_channels_last: Per-patch flat layout produced by the
        upstream Patchify. ``True`` (default): channel index is the
        innermost (P-P-C). ``False``: channel index is the outermost
        (C-P-P). Controls how ``patches`` tensors are viewed for
        normalization and erasing.
r      )r    dtyper   )
erase_probmode	max_count
num_splitsr    Nr   npu)r   r    torchfloat32r!   r   r   r&   tensorviewr   r   r   random_erasingtyper   is_availableis_cudar/   is_npu)selfr   r   r   r   r    r!   r"   r#   r$   r%   r&   normalization_shapexs                 Q/home/wildlama/miniconda3/lib/python3.13/site-packages/timm/data/naflex_loader.py__init__NaFlexPrefetchLoader.__init__   sI   B "3emm D+3) &<#2Hq!X.qRZ\]N^LL"#dWd#F..JJN$ObJc 		<<!"cWc"6IIMNaIb 	 R<"4""(#D #'D {{f,J1H1H1JkkU*Guyy/E/E/G# $"s   2E=8Fc           
   #     #    SnU R                   (       aJ  [        R                  R                  U R                  S9n[        [        R                  R                  US9nOcU R                  (       aJ  [        R                  R                  U R                  S9n[        [        R                  R                  US9nOSn[        nU R                   GHh  u  pEU" 5          UR                  5        HY  u  pg[        U[        R                  5      (       d  M&  US:X  a  U R                  OSnXF   R                  U R                  SUS9XF'   M[     UR                  U R                  SS9nUS   n	U	R                   n
U	R"                  S:X  aR  U
u  pnU R$                  (       a  U	R'                  XS	U R(                  5      nOU	R'                  XU R(                  S	5      nOU	R"                  S
:X  a  U
SS u  pU R$                  (       aK  U
S	   U R(                  :X  d   SU R(                   SU
S	    35       eU	R'                  XS	U R(                  5      nOdU
S   U R(                  :X  d   SU R(                   SU
S    35       eU	R'                  XU R(                  S	5      nO[+        SU	R"                   S35      eUR-                  U R.                  5      R1                  U R2                  5      nU R4                  b  U R$                  (       d   UR7                  SS	5      R9                  5       nU R5                  UUS   UR;                  SS5      S9nU R$                  (       d   UR7                  SS	5      R9                  5       nUR'                  U
5      US'   SSS5        U(       d  WW4v   OSnUb  U R                   (       a7  [        R                  R=                  U R                  S9R?                  U5        OGU R                  (       a6  [        R                  R=                  U R                  S9R?                  U5        UnUnGMk     WW4v   g! , (       d  f       N= f7f)zIterate through the loader with prefetching and normalization.

Yields:
    Tuple of (input_dict, targets) with normalized patches.
T)r    )streamNpatches)r    non_blockingr*   )r    rB   r         z	Expected z channels, got z&Unexpected patches tensor dimensions: z. Expected 3 or 5.patch_coordpatch_valid)rG   rH   F) r7   r0   r   Streamr    r   r@   r8   r/   r   r   items
isinstanceTensorr!   toshapendimr&   r3   r   
ValueErrorsubr   divr   r4   	transpose
contiguousgetcurrent_streamwait_stream)r9   firstr@   stream_contextnext_input_dictnext_targetkvr*   patches_tensororiginal_shape
batch_sizenum_patches_rA   
input_dicttargets                    r<   __iter__NaFlexPrefetchLoader.__iter__`   s     <<ZZ&&dkk&:F$UZZ%6%6vFN[[YY%%T[[%9F$UYY%5%5fENF%N,0KK(O!+113DA!!U\\2223y.d-<-?-B-B#';;)-"' .C .* 4 *nnDKKdnS
 "1!;!/!5!5!&&!+1?.JQ22"0"5"5jrSWS`S`"a #1"5"5jt}}^`"a#((A-.<Ra.@+J22-b1T]]B ['onUWFXEYZ[B"0"5"5jrSWS`S`"a  .a0DMMA Z'onUVFWEXYZA"0"5"5jt}}^`"a$'MnNaNaMbbt%uvv "++dii044TXX>&&2  66")"3"3B";"F"F"H"11$3M$B$3$7$7t$L 2 G
  66")"3"3B";"F"F"H .5\\.-I	*{ "~  &((!<<JJ--T[[-AMMfU[[II,,DKK,@LLVT(J FY -8\ &  [ "!s&   CQ3QI6Q	B:Q
Q	Qc                 ,    [        U R                  5      $ )zPGet length of underlying loader.

Returns:
    Number of batches in the loader.
)lenr   r9   s    r<   __len__NaFlexPrefetchLoader.__len__   s     4;;    c                 .    U R                   R                  $ )zZGet sampler from underlying loader.

Returns:
    Sampler from the underlying DataLoader.
)r   samplerri   s    r<   rn   NaFlexPrefetchLoader.sampler        {{"""rl   c                 .    U R                   R                  $ )zZGet dataset from underlying loader.

Returns:
    Dataset from the underlying DataLoader.
)r   datasetri   s    r<   rr   NaFlexPrefetchLoader.dataset   rp   rl   )
r   r    r!   r7   r8   r   r   r&   r4   r   )__name__
__module____qualname____firstlineno____doc__r   r   r0   r    utilsdata
DataLoaderr
   floatintr	   r*   strboolr=   r   r   rL   re   rj   propertyrn   rr   __static_attributes__ rl   r<   r   r      sW   E
 '<%9#(<<#7/3"!"+/@HKK$$//@H s
#@H ucz"	@H
 @H LL@H  ,@H @H @H @H @H %)@H @HD_!(5c5<<.?)@%,,)N#OP _!B    # # # #rl   r   )      @  i  i   r       Fr   r   g      ?g?bilinear   *   Tr   all
patch_sizepatch_size_choicespatch_size_choice_probstrain_seq_lens.max_seq_lenr`   is_trainingmixup_fnno_augr"   r#   r$   re_splittrain_crop_modescaleratiohflipvflipcolor_jittercolor_jitter_probgrayscale_probgaussian_blur_probauto_augmentnum_aug_repeatsnum_aug_splitsinterpolationr   r   crop_pct	crop_modecrop_border_pixelsnum_workersdistributedrank
world_sizeseedepochuse_prefetcher
pin_memoryr!   r    persistent_workersworker_seedingr&   r'   c-                    U(       Ga  US:X  d   S5       e[        [        40 SS_SU	_SU_SU_SU_S	U_S
U_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU
_SU_SU_SU&_SS_SU,_6n-[        U5      n.UU.-  n/[        U [        R
                  R                  R                  5      (       a   S5       e[        U U-UUUUU/UU$U!U"U#SU%U,S9n0[        R
                  R                  R                  U0SSU SU'[        [        U+S 9U*S!9n1U&(       a  [        U1UUU(U)U
UUU,S"9	n1U1$ [        SUUUU&SUUSU,S#9
U l        [        US$9n2Sn3U!(       aA  [        U [        R
                  R                  R                  5      (       d  SS%KJn4  U4" U 5      n3[        R
                  R                  R                  U USU U3U2U'SS&9n1U&(       a  [        U1UUU(U)U,S'9n1U1$ )(u	  Create a data loader with dynamic sequence length sampling for training.

Args:
    dataset: Dataset to load from.
    patch_size: Single patch size to use.
    patch_size_choices: List of patch sizes for variable patch size training.
    patch_size_choice_probs: Probabilities for each patch size choice.
    train_seq_lens: Training sequence lengths for dynamic batching.
    max_seq_len: Fixed sequence length for validation.
    batch_size: Batch size for validation and max training sequence length.
    is_training: Whether this is for training (enables dynamic batching).
    mixup_fn: Optional mixup function.
    no_aug: Disable augmentation.
    re_prob: Random erasing probability.
    re_mode: Random erasing mode.
    re_count: Maximum number of erasing rectangles.
    re_split: Random erasing split flag.
    train_crop_mode: Training crop mode.
    scale: Scale range for random resize crop.
    ratio: Aspect ratio range for random resize crop.
    hflip: Horizontal flip probability.
    vflip: Vertical flip probability.
    color_jitter: Color jitter factor.
    color_jitter_prob: Color jitter probability.
    grayscale_prob: Grayscale conversion probability.
    gaussian_blur_prob: Gaussian blur probability.
    auto_augment: AutoAugment policy.
    num_aug_repeats: Number of augmentation repeats.
    num_aug_splits: Number of augmentation splits.
    interpolation: Interpolation method.
    mean: Normalization mean values.
    std: Normalization standard deviation values.
    crop_pct: Crop percentage for validation.
    crop_mode: Crop mode.
    crop_border_pixels: Crop border pixels.
    num_workers: Number of data loading workers.
    distributed: Whether using distributed training.
    rank: Process rank for distributed training.
    world_size: Total number of processes.
    seed: Random seed.
    epoch: Starting epoch.
    use_prefetcher: Whether to use prefetching.
    pin_memory: Whether to pin memory.
    img_dtype: Image data type.
    device: Device to move tensors to.
    persistent_workers: Whether to use persistent workers.
    worker_seeding: Worker seeding mode.
    patchify_channels_last: Per-patch flat layout. ``True`` (default):
        channel index varies fastest (NaFlex default). ``False``: C-P-P
        (channels first — Gemma4 / HF native layout). Forwarded to the
        upstream ``Patchify`` and to the prefetcher's normalization layout.

Returns:
    DataLoader or NaFlexPrefetchLoader instance.
r   z=Augmentation repeats not currently supported in NaFlex loaderr   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r#   r$   r   naflexr&   Fz IterableDataset Wrapper is a WIP)transform_factoryr   r   r   seq_lensmax_tokens_per_batchr   r   r   r   r   shuffler   r&   N)r   )r`   r   r   rn   r   worker_init_fnr   )r   r   r!   r    r"   r#   r$   r&   )
r   r   r   r   r   r   r   r   patchifyr&   )r   )OrderedDistributedSampler)r`   r   r   rn   
collate_fnr   	drop_last)r   r   r!   r    r&   )r   r   maxrK   r0   ry   rz   IterableDatasetr   r{   r   r   	transformr   timm.data.distributed_samplerr   )5rr   r   r   r   r   r   r`   r   r   r   r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r    r   r   r&   r   max_train_seq_lenr   naflex_datasetr   r   rn   r   s5                                                        r<   create_naflex_loaderr      s   R !#d%dd##

 
 ,	

 
 
 
 
 &
 0
 *
  2
 &
 (
 
  !
" #
$  %
&  2'
( )
* +
, -
. */
0 1
2 $:3
8  /),==gu{{//??@@<<<50/!1$;#!5#!#9
& !!,,#!"<O1 - 	
 )#!'=
Fv M[ -')!##9
 $<
 z'5;;3C3C3S3STTO/8G!!,,!#!! - 	
 )#'=F Mrl   )(rx   math
contextlibr   	functoolsr   typingr   r   r   r   r	   r
   r   r0   	constantsr   r   r   r   r   r   r   r   naflex_random_erasingr   transforms_factoryr   r   r1   r    r}   r|   r   r~   r*   ry   rz   r{   r   r   rl   r<   <module>r      s  	    I I I  B . C 5 0~# ~#F =A269=*D!'+)-/3/3!-1 "$&&* '"7!5$(#',0!#!&+0<<+?#'#'+_iU5c?C#789i %T#Y/i "*$u+!6	i
 c3hi i i i 8$i i i i i i  "#!i" eUl+,#i$ eUl+,%i& 'i( )i* +i, $E?-i. /i0 "1i2 sm3i4 5i6 7i8 9i: E3J;i< 5#:=i> 5/?i@ C=AiB %SMCiF GiH IiJ KiL MiN OiP QiR SiT UiV ;;WiX c5<<'(YiZ ![i\ ]i^ !%_i` 
u{{**,@@	Aairl   