
    khW=              [          d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlZddlmZmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ  G d d      Zddddddddddddddddddddddddddeedddddddddddej:                   ej<                  d      ddf+deeeeef   ef      dee
e      dee
e       deed f   d!ed"ed#e!d$ee   d%e!d&e d'e"d(ed)e!d*ee"   d+eee e f      d,eee e f      d-e d.e d/e d0ee    d1e d2e d3ee"   d4ed5ed6e"d7ee d f   d8ee d f   d9ee    d:ee"   d;ee   d<ed=e!d>ed?ed@edAedBe!dCe!dDejF                  dEee"ej<                  f   dFe!dGe"dHeejH                  jJ                  jL                  ef   fXdIZ'y)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                   p   e Zd ZdZeed ej                  d      dddddf	d	ej                  j                  j                  d
eedf   deedf   dedej                  deej                     dededededdfdZdeeeeej(                  f   ej(                  f      fdZdefdZed        Zed        Zy)NaFlexPrefetchLoaderz;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s t        j                  | _        t        ||      }t        ||      }dd|f}|| _        t        j                  |D cg c]  }|dz  	 c}|| j                        j                  |      | _	        t        j                  |D cg c]  }|dz  	 c}|| j                        j                  |      | _
        |dkD  rt        |||	|
|      | _        nd| _        |j                  dk(  xr t        j                  j                         | _        |j                  dk(  xr t        j"                  j                         | _        yc c}w c c}w )	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                S/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/data/naflex_loader.py__init__zNaFlexPrefetchLoader.__init__   s?   6 "3emm D(+3) !X. LL"#QW#F$..JJN$ObJc 		<<!"QW"6IIMNaIb 	 R<"4""(#D #'D {{f,J1H1H1JkkU*Guyy/E/E/G# $"s   E%&E*c           
   #     K   d}| j                   rPt        j                  j                  | j                        }t        t        j                  j                  |      }nd| j                  rPt        j                  j                  | j                        }t        t        j                  j                  |      }nd}t        }| j                  D ]n  \  }} |       5  |j                         D ]W  \  }}t        |t        j                        s!|dk(  r| j                  nd}||   j                  | j                  d|      ||<   Y |j                  | j                  d      }|d   }	|	j                   }
|	j"                  dk(  r%|
\  }}}|	j%                  ||d	| j&                        }nu|	j"                  d
k(  rM|
\  }}}}}|| j&                  k(  sJ d| j&                   d|        |	j%                  ||d	| j&                        }nt)        d|	j"                   d      |j+                  | j,                        j/                  | j0                        }| j2                  '| j3                  ||d   |j5                  dd            }|j%                  |
      |d<   ddd       |sf nd}|| j                   r:t        j                  j7                  | j                        j9                  |       nE| j                  r9t        j                  j7                  | j                        j9                  |       |}|}q f y# 1 sw Y   xY ww)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   r?   r      z	Expected z channels, got z&Unexpected patches tensor dimensions: z. Expected 3 or 5.patch_coordpatch_valid)rB   rC   F)r5   r.   r   Streamr   r   r=   r6   r-   r   r   items
isinstanceTensorr    toshapendimr1   r   
ValueErrorsubr   divr   r2   getcurrent_streamwait_stream)r7   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__zNaFlexPrefetchLoader.__iter__V   s	     <<ZZ&&dkk&:F$UZZ%6%6vFN[[YY%%T[[%9F$UYY%5%5fENF%N,0KK 9	!(O[! *J+113 DAq!!U\\223y.d-<Q-?-B-B#';;)-"' .C .* *nnDKKdnS "1!;!/!5!5!&&!+<J9J\,11*k2t}}]G#((A-JXGJWgx#t}}4j	$--P_`h_i6jj4,11*k2t}}]G$'MnNaNaMbbt%uvv "++dii044TXX>&&2"11$3M$B$3$7$7t$L 2 G .5\\.-I	*U*JX  &((!<<JJ--T[[-AMMfU[[II,,DKK,@LLVT(J Fs9	!v &  u*J *Js&   CM1M
FM
B.M
M	Mc                 ,    t        | j                        S )zhGet length of underlying loader.

        Returns:
            Number of batches in the loader.
        )lenr   r7   s    r:   __len__zNaFlexPrefetchLoader.__len__   s     4;;    c                 .    | j                   j                  S )zrGet sampler from underlying loader.

        Returns:
            Sampler from the underlying DataLoader.
        )r   samplerrc   s    r:   rg   zNaFlexPrefetchLoader.sampler        {{"""re   c                 .    | j                   j                  S )zrGet dataset from underlying loader.

        Returns:
            Dataset from the underlying DataLoader.
        )r   datasetrc   s    r:   rj   zNaFlexPrefetchLoader.dataset   rh   re   )__name__
__module____qualname____doc__r   r   r.   r   utilsdata
DataLoaderr
   floatintr	   r(   strr;   r   r   rG   r`   rd   propertyrg   rj    re   r:   r   r      s>   E
 '<%9#/5<<#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!\    # # # #re   r   )      @  i  i   ry       Fr   r   g      ?g?bilinear   *   Tr   all
patch_sizepatch_size_choicespatch_size_choice_probstrain_seq_lens.max_seq_lenrY   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,                    |r|dk(  sJ d       t        t        fi ddd|	d|d|d|d	|d
|d|d|d|d|d|d|d|d|d|d|d|d|
d|d|d|&dd},t        |      }-||-z  }.t        | t        j
                  j                  j                        rJ d       t        | |,|||||.||$|!|"|#d|%      }/t        j
                  j                  j                  |/dd| d|'t        t        |+      |*       }0|&rt        |0|||(|)|
||!      }0|0S t        d||||&d||d"	      | _        t        |#      }1d}2|!r<t        | t        j
                  j                  j                        sdd$lm}3  |3|       }2t        j
                  j                  j                  | |d| |2|1|'d%      }0|&rt        |0|||(|)&      }0|0S )'aD	  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   )rY   r   r   rg   r   worker_init_fnr   )r   r   r    r   r!   r"   r#   )	r   r   r   r   r   r   r   r   patchify)r   )OrderedDistributedSampler)rY   r   r   rg   
collate_fnr   	drop_last)r   r   r    r   )r   r   maxrF   r.   ro   rp   IterableDatasetr   rq   r   r   	transformr   timm.data.distributed_samplerr   )4rj   r   r   r   r   r   rY   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   rg   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O/8G!!,,!#!! - 	
 )#F Mre   )(rn   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   r/   r   rs   rr   boolrt   r(   ro   rp   rq   r   rv   re   r:   <module>r      s  	    I I I  B . C 5 0a# a#L =A269=*D!'+)-/3/3!-1 "$&&* '"7!5$(#',0!#!&+75<<+?#'#]_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__re   