U
    <c4                     @   s
  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZmZ erddlZddlmZmZmZ G d	d
 d
eZnG dd
 d
eZdaG dd deZdd ZeddG dd deZeddG dd deZdd Z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)ExceptionWrapper)OptionalUnion   )signal_handlingMP_STATUS_CHECK_INTERVAL
IS_WINDOWS	HAS_NUMPY)DWORDBOOLHANDLEc                   @   s   e Zd Zdd Zdd ZdS )ManagerWatchdogc                 C   s   t  | _tjddd| _tttf| jj_	t
| jj_t
tf| jj_	t| jj_d}| j|d| j| _| jsxtt d| _d S )Nkernel32T)use_last_errori   r   F)osgetppidmanager_pidctypesWinDLLr   r   r   ZOpenProcessargtypesr   restypeWaitForSingleObjectmanager_handleZWinErrorZget_last_errormanager_dead)selfZSYNCHRONIZE r   B/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/data/_utils/worker.py__init__   s    


ManagerWatchdog.__init__c                 C   s$   | j s| j| jddk| _ | j  S )Nr   )r   r   r   r   r   r   r   r   is_alive+   s    ManagerWatchdog.is_aliveN__name__
__module____qualname__r   r!   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   t  | _d| _d S )NF)r   r   r   r   r    r   r   r   r   2   s    
r   c                 C   s   | j st | jk| _ | j  S N)r   r   r   r   r    r   r   r   r!   6   s    r"   Nr#   r   r   r   r   r   1   s   c                       s0   e Zd ZdZdd Z fddZdd Z  ZS )
WorkerInfoFc                 K   s6   |  D ]\}}t| || qt| | _d| _d S )NT)itemssetattrtuplekeys_WorkerInfo__keys_WorkerInfo__initialized)r   kwargskvr   r   r   r   A   s    zWorkerInfo.__init__c                    s*   | j rtd| jjtt| ||S )Nz&Cannot assign attributes to {} objects)r.   RuntimeErrorformat	__class__r$   superr(   __setattr__)r   keyvalr4   r   r   r6   G   s    zWorkerInfo.__setattr__c              	   C   s>   g }| j D ]}|d|t| | q
d| jjd|S )Nz{}={}z{}({})z, )r-   appendr3   getattrr4   r$   join)r   r)   r0   r   r   r   __repr__L   s    
zWorkerInfo.__repr__)r$   r%   r&   r.   r   r6   r=   __classcell__r   r   r9   r   r(   >   s   r(   c                   C   s   t S )a  Returns the information about the current
    :class:`~torch.utils.data.DataLoader` iterator worker process.

    When called in a worker, this returns an object guaranteed to have the
    following attributes:

    * :attr:`id`: the current worker id.
    * :attr:`num_workers`: the total number of workers.
    * :attr:`seed`: the random seed set for the current worker. This value is
      determined by main process RNG and the worker id. See
      :class:`~torch.utils.data.DataLoader`'s documentation for more details.
    * :attr:`dataset`: the copy of the dataset object in **this** process. Note
      that this will be a different object in a different process than the one
      in the main process.

    When called in the main process, this returns ``None``.

    .. note::
       When used in a :attr:`worker_init_fn` passed over to
       :class:`~torch.utils.data.DataLoader`, this method can be useful to
       set up each worker process differently, for instance, using ``worker_id``
       to configure the ``dataset`` object to only read a specific fraction of a
       sharded dataset, or use ``seed`` to seed other libraries used in dataset
       code.
    )_worker_infor   r   r   r   get_worker_infoS   s    r@   T)frozenc                   @   s   e Zd ZU eed< dS )_IterableDatasetStopIteration	worker_idN)r$   r%   r&   int__annotations__r   r   r   r   rB   q   s   
rB   c                   @   s   e Zd ZU dZee ed< dS )_ResumeIterationNseed)r$   r%   r&   rG   r   rD   rE   r   r   r   r   rF   v   s   
rF   c                    s.  d}dd}d}dddd ||  @ | d	? d
g}d
gd }| fdd} fdd}t t|D ]}	|||	 ||	< qrt t|D ]8}
t t|D ]&}|
|kr||| |||
 ||< qq|}g }t dD ]J}|| }||A  @ }||  @ }||  @ }||? A  @ }|| q|S )NiװCl   u=& l   y iXl   y isI   l        r      c                    s8   | A  @ }   @ |   @ } | | ? A  @ } | S r'   r   )value)MASK32MULT_AXSHIFThash_const_Ar   r   hash   s
    z_generate_state.<locals>.hashc                    s8   |   @ }|  @ }||  @ }||? A  @ }|S r'   r   )xyZresult_xZresult_yresult)rL   
MIX_MULT_L
MIX_MULT_RrN   r   r   mix   s
    z_generate_state.<locals>.mix)rangelenr:   )	base_seedrC   ZINIT_AZINIT_BZMULT_BZentropypoolrP   rV   iZi_srcZi_dstZhash_const_BstateZdata_valr   )rL   rT   rU   rM   rN   rO   r   _generate_state   s:    
r]   c              
   C   s  zt   td ||
 }t| t| trTt||
}dd l	}|j| ddl
m} ddlm} t }t||r|d k	st|| |||}t|
|||daddl
m} d }z&|	d k	r|	|
 || ||||}W n& tk
r
   td|
d}Y nX d	}t }| rz|jtd
}W n tjk
rN   Y qY nX t|tr||d f d	}t||r|jd k	st||j |||}|| ||||}qn8|d kr|  s|stqn|  s|rq|\}}|d k	r|}d }njz|!|}W nZ tk
rt } z:t|t"rT| |j#krTt$|
}d}ntd|
d}W 5 d }~X Y nX |||f ~~~~qW n t%k
r   Y nX |  r|&  |'  d S )Nr   r   )IterDataPipe)apply_random_seed)idnum_workersrG   dataset)_DatasetKindzin DataLoader worker process {})whereF)timeoutT)(r   Z_set_worker_signal_handlerstorchZset_num_threadsrandomrG   Zmanual_seedr
   r]   ZnumpyZtorch.utils.datar^   Ztorch.utils.data.graph_settingsr_   	Generator
isinstanceAssertionErrorr(   r?   rc   Zcreate_fetcher	Exceptionr   r3   r   r!   getr   queueEmptyrF   putis_setfetchStopIterationIterablerB   KeyboardInterruptZcancel_join_threadclose)Zdataset_kindrb   Zindex_queueZ
data_queueZ
done_eventZauto_collationZ
collate_fnZ	drop_lastrY   Zinit_fnrC   ra   Zpersistent_workersZshared_seedrG   Znp_seednpr^   r_   Z
shared_rngrc   Zinit_exceptionZfetcherZiteration_endZwatchdogridxindexdataer   r   r   _worker_loop   s    






 

    


r|   )__doc__rf   rg   r   rm   Zdataclassesr   Ztorch._utilsr   typingr   r    r   r   r	   r
   r   Zctypes.wintypesr   r   r   objectr   r?   r(   r@   rB   rF   r]   r|   r   r   r   r   <module>   s,   
 3