o
    پiW=                  [   @   sN  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 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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j#dEee"ejf dFe!dGe"dHeej$j%j&ef fXdIdJZ'dS )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                   @   s   e Zd ZdZeede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dZdeeeeejf ejf  fddZdefddZedd Zedd ZdS )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                 C   s   || _ || _|p
tj| _t||}t||}dd|f}|| _tjdd |D || jd|| _	tjdd |D || jd|| _
|dkrQt|||	|
|d| _nd| _|jd	ko]tj | _|jd
kohtj | _dS )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   c                 S      g | ]}|d  qS     .0xr'   r'   K/home/ubuntu/.local/lib/python3.10/site-packages/timm/data/naflex_loader.py
<listcomp>C       z1NaFlexPrefetchLoader.__init__.<locals>.<listcomp>)r   dtypec                 S   r$   r%   r'   r(   r'   r'   r+   r,   E   r-   r   )
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_cudar3   is_npu)selfr   r   r   r   r   r   r   r    r!   r"   normalization_shaper'   r'   r+   __init__   s8   



zNaFlexPrefetchLoader.__init__c              	   c   s<   d}| j rtjj| jd}ttjj|d}n| jr+tjj| jd}ttjj|d}nd}t	}| j
D ]\}}|  | D ] \}}t|tjr^|dkrO| jnd}|| j| jd|d||< q>|j| jdd}|d }	|	j}
|	jdkr|
\}}}|	||d	| j}n/|	jd
kr|
\}}}}}|| jksJ d| j d| |	||d	| j}n	td|	j d|| j| j}| jdur| j||d |ddd}||
|d< W d   n1 sw   Y  |s||fV  nd}|dur| j rtjj| jd| n| jrtjj| jd| |}|}q2||fV  dS )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)rE   rF   F)r;   r4   r   Streamr   r   r@   r<   r3   r   r   items
isinstanceTensorr   toshapendimr7   r   
ValueErrorsubr   divr   r8   getcurrent_streamwait_stream)r=   firstr@   stream_contextnext_input_dictnext_targetkvr.   patches_tensororiginal_shape
batch_sizenum_patchespatch_pixelsrA   patch_hpatch_wr   
input_dicttargetr'   r'   r+   __iter__V   sh   



 

,
zNaFlexPrefetchLoader.__iter__c                 C   s
   t | jS )zhGet length of underlying loader.

        Returns:
            Number of batches in the loader.
        )lenr   r=   r'   r'   r+   __len__   s   
zNaFlexPrefetchLoader.__len__c                 C      | j jS )zrGet sampler from underlying loader.

        Returns:
            Sampler from the underlying DataLoader.
        )r   samplerre   r'   r'   r+   rh         zNaFlexPrefetchLoader.samplerc                 C   rg   )zrGet dataset from underlying loader.

        Returns:
            Dataset from the underlying DataLoader.
        )r   datasetre   r'   r'   r+   rj      ri   zNaFlexPrefetchLoader.dataset)__name__
__module____qualname____doc__r   r   r4   r   utilsdata
DataLoaderr	   floatintr   r.   strr?   r   r   rJ   rc   rf   propertyrh   rj   r'   r'   r'   r+   r      sP    

	

&8N
r   )      @  i  i   rx       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,           4      C   s  |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|}-||- }.t| tjjjriJ dt| |,|||||.||$|!|"|#d|%d}/tjjj	|/dd| d|'t t
|+d|*d }0|&rt|0|||(|)|
||d!}0|0S td||||&d||dd"	| _t|d#}1d}2|!rt| tjjjsdd$lm}3 |3| }2tjjj	| |d| |2|1|'dd%}0|&rt|0|||(|)d&}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   )r\   r   r   rh   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   rh   
collate_fnr   	drop_last)r   r   r   r   )r   r   maxrI   r4   ro   rp   IterableDatasetr   rq   r   r   	transformr   timm.data.distributed_samplerr   )4rj   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   rh   r   r'   r'   r+   create_naflex_loader   s   d	

8
r   )(rn   math
contextlibr   	functoolsr   typingr   r   r   r   r   r	   r
   r4   	constantsr   r   r   r   r   r   r   r   naflex_random_erasingr   transforms_factoryr   r   r5   r   rs   rr   boolrt   r.   ro   rp   rq   r   r'   r'   r'   r+   <module>   s"   $ '


	

 !#$%&'()*+,-./