o
    ̳i,                     @   s  d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlZddlmZ ddlmZmZmZ ddlmZmZmZmZmZ dd	lmZmZmZmZmZmZ dd
lm Z  e	dZ!dede
e"df fddZ#de!de"de!fddZ$eddG dd dZ%dd Z&dee'ef fddZ(dS )z"Contains definitions of the methods used by the _BaseDataLoaderIter workers.

These **needs** to be in global scope since Py2 doesn't support serializing
static methods.
    N)	dataclass)AnyDictOptionalTypeVarUnion)ExceptionWrapper)	HAS_NUMPYMP_STATUS_CHECK_INTERVALsignal_handling)_generate_state_IterableDatasetStopIteration_ResumeIterationManagerWatchdog
WorkerInfo   )_DATASET_ITER_STATE_DATASET_STATE_FETCHER_ENDED_FETCHER_STATE_IncrementalWorkerState
_WORKER_ID)StatefulTobjreturnc                 C   s   t | tr|  }|S d }|S N)
isinstancer   
state_dict)r   	obj_state r    X/home/ubuntu/.local/lib/python3.10/site-packages/torchdata/stateful_dataloader/worker.pytry_to_serialize.   s
   
r"   r   c                 C   s   t | tr| | | S | S r   )r   r   load_state_dict)r   r   r    r    r!   try_to_deserialize7   s   

r$   T)frozenc                   @   sB   e Zd ZU dZeed< eeee	e
f ef  ed< dZeed< dS )_AckStartupz:Dummy class used to ack startup and return state at time 0	worker_idinitial_stateFis_deltaN)__name__
__module____qualname____doc__int__annotations__r   r   r   strr   r   r)   boolr    r    r    r!   r&   >   s
   
 r&   c           %      C   sB  zt   td ||
 }t| t| tr*t||
}dd l	}|j| ddl
m} ddlm} t }t||rO|d usEJ || |||}t|
|||dtjjjj_ddl
m} d }d }d }d}zs|	d urs|	|
 |d u r|| ||||}t|
| ||}t|}nPt|}|t d urt||t }|| ||||}|t d ur| |jkr|t t d urt|j|t t }|d ur||_d|_ d}|!t|
| ||}d}~W n t"y   t#d	|
 d
}Y nw d}t$ }|% rz|j&t'd}W n t(j)y   Y qw t|t*r%|+|t*|
|p||df ~~qt|t,rd}t||rF|jd us;J ||j |||}z|| ||||}t|
| ||}t|}W n t"yn   t#d	|
 d
}Y nw |+|t*|
|px|df ~q|d u r|- s|sJ nu|- s|rq|\}\} }!d }"|d ur|}#d }nGz4z|.| }#W n t/y   | |jks t0|
}#d}Y nw |!s|rt|
| ||}$|!|$}"~$W n t"y   t#d	|
 d
}#Y nw |+||#|
|"ff ~#~~ ~~"|% sW n
 t1y   Y nw |- r|2  |3  d S d S )Nr   r   )IterDataPipe)apply_random_seed)idnum_workersseeddataset_DatasetKindFTzin DataLoader worker process )where)timeout)r'   r(   r)   )r'   r(   )4r   _set_worker_signal_handlerstorchset_num_threadsrandomr6   manual_seedr	   r   numpytorch.utils.datar2   torch.utils.data.graph_settingsr3   	Generatorr   r   utilsdata_utilsworker_worker_infor9   create_fetcher_make_state_dictr   r   r$   r   Iterabler   dataset_iterendedgenerate_delta	Exceptionr   r   is_alivegetr
   queueEmptyr&   putr   is_setfetchStopIterationr   KeyboardInterruptcancel_join_threadclose)%dataset_kindr7   index_queue
data_queue
done_eventauto_collation
collate_fn	drop_last	base_seedinit_fnr'   r5   persistent_workersshared_seedworker_stater6   np_seednpr2   r3   
shared_rngr9   init_exceptionfetcherr(   r)   incremental_worker_staterM   iteration_endwatchdogridxindexsnapshotdelta_state_dictrF   r   r    r    r!   _worker_loopG   s  















O
ru   c                 C   sb   ddl m} ||jkr#tt|jt|ji}d }|j|jur"t|j}nd }t|}t	| t
|t|iS )Nr   r8   )rB   r9   rL   r   r"   rM   r   rN   r7   r   r   r   )r'   r\   rl   r7   r9   fetcher_statedataset_stater    r    r!   rK     s   


rK   ))r-   rS   r?   dataclassesr   typingr   r   r   r   r   r=   torch._utilsr   torch.utils.data._utilsr	   r
   r   torch.utils.data._utils.workerr   r   r   r   r   incremental_stater   r   r   r   r   r   statefulr   r   dictr"   r$   r&   ru   r0   rK   r    r    r    r!   <module>   s&    		 J