
    RЦiW=              [       
   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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\\RH                  RJ                  RL                  \4   4XSI jjr'g)Ja  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	4	S
\R                  R                  R                  S\\S4   S\\S4   S\S\R                  S\\R                      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   loadermean.stdchannelsdevice	img_dtypere_probre_modere_countre_num_splitsreturnc                    Xl         XPl        U=(       d    [        R                  U l        [        X$5      n[        X45      nSSU4nX@l        [        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.
r      )r    dtyper   )
erase_probmode	max_count
num_splitsr    Nr   npu)r   r    torchfloat32r!   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%   normalization_shapexs                V/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/data/naflex_loader.py__init__NaFlexPrefetchLoader.__init__   s5   6 "3emm D+3) !X. 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    E+&E0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Hu  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  a#  U
u  pnU	R%                  XS	U R&                  5      nOuU	R"                  S
:X  aL  U
u  pnnnUU R&                  :X  d   SU R&                   SU 35       eU	R%                  XS	U R&                  5      nO[)        SU	R"                   S35      eUR+                  U R,                  5      R/                  U R0                  5      nU R2                  b$  U R3                  UUS   UR5                  SS5      S9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                  R7                  U R                  S9R9                  U5        OGU R                  (       a6  [        R                  R7                  U R                  S9R9                  U5        UnUnGMx     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    rA   r      z	Expected z channels, got z&Unexpected patches tensor dimensions: z. Expected 3 or 5.patch_coordpatch_valid)rD   rE   F)r6   r/   r   Streamr    r   r?   r7   r.   r   r   items
isinstanceTensorr!   toshapendimr2   r   
ValueErrorsubr   divr   r3   getcurrent_streamwait_stream)r8   firstr?   stream_contextnext_input_dictnext_targetkvr)   patches_tensororiginal_shape
batch_sizenum_patchespatch_pixelsr@   patch_hpatch_wr   
input_dicttargets                       r;   __iter__NaFlexPrefetchLoader.__iter__V   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!&&!+<J9J\,11*2t}}]G#((A-JXGJWgx#t}}4j	$--P_`h_i6jj4,11*2t}}]G$'MnNaNaMbbt%uvv "++dii044TXX>&&2"11$3M$B$3$7$7t$L 2 G .5\\.-I	*U "X  &((!<<JJ--T[[-AMMfU[[II,,DKK,@LLVT(J Fs -8v &  u "!s&   CM!3MFMB:M!
M	M!c                 ,    [        U R                  5      $ )zPGet length of underlying loader.

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

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

Returns:
    Dataset from the underlying DataLoader.
)r   datasetrf   s    r;   ro   NaFlexPrefetchLoader.dataset   rm   ri   )	r   r    r!   r6   r7   r   r   r3   r   )__name__
__module____qualname____firstlineno____doc__r   r   r/   r    utilsdata
DataLoaderr
   floatintr	   r)   strr<   r   r   rI   rb   rg   propertyrk   ro   __static_attributes__ ri   r;   r   r      s<   E
 '<%9#(<<#7/3"!"6HKK$$//6H s
#6H ucz"	6H
 6H LL6H  ,6H 6H 6H 6H 6H 6HpL!(5c5<<.?)@%,,)N#OP L!\    # # # #ri   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&   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_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%S9n/[        R
                  R                  R                  U/SSU SU'[        [        U+S9U*S 9n0U&(       a  [        U0UUU(U)U
UUS!9n0U0$ [        SUUUU&SUUSS"9	U l        [        US#9n1Sn2U!(       aA  [        U [        R
                  R                  R                  5      (       d  SS$KJn3  U3" U 5      n2[        R
                  R                  R                  U USU U2U1U'SS%9n0U&(       a  [        U0UUU(U)S&9n0U0$ )'a  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.

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   naflexFz IterableDataset Wrapper is a WIP)transform_factoryr   r   r   seq_lensmax_tokens_per_batchr   r   r   r   r   shuffler   N)r   )r[   r   r   rk   r   worker_init_fnr   )r   r   r!   r    r"   r#   r$   )	r   r   r   r   r   r   r   r   patchify)r   )OrderedDistributedSampler)r[   r   r   rk   
collate_fnr   	drop_last)r   r   r!   r    )r   r   maxrH   r/   rv   rw   IterableDatasetr   rx   r   r   	transformr   timm.data.distributed_samplerr   )4ro   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   rk   r   s4                                                       r;   create_naflex_loaderr      s   H !#d%dd##

 
 ,	

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