o
    ̳i                     @   s   d dl Z d dlmZmZmZmZmZmZ d dlZ	d dl
mZ d dlmZ d dlmZ ddlmZ G dd	 d	ee eZG d
d dee ZG dd deee  eZG dd de	jjjjZG dd de	jjjjZdS )    N)AnyDictIteratorListOptionalSized)Dataset)_InfiniteConstantSampler)Sampler   )Statefulc                   @   s^   e Zd ZdZdZdd Zdd Zdee fdd	Z	d
d Z
defddZdeddfddZdS )_StatefulRandomSamplerIterator	generatoryieldedc                 C   s\   || _ | j j | _d| _d | _t|j| _|j	| _	|j
| _
d| _|  | _d| _d| _d S )Nr       )samplerr   	get_stategenerator_stater   next_yieldedlendata_sourcenreplacementnum_samples
chunk_size	_get_permperm
perm_indexchunk_index)selfr    r    Y/home/ubuntu/.local/lib/python3.10/site-packages/torchdata/stateful_dataloader/sampler.py__init__   s   

z'_StatefulRandomSamplerIterator.__init__c                 C   s   | S Nr    r   r    r    r!   __iter__#   s   z'_StatefulRandomSamplerIterator.__iter__returnc                 C   s@   | j rtj| j| jftj| jjd S tj	| j| jjd S )N)highsizedtyper   )r   )
r   torchrandintr   r   int64r   r   tolistrandpermr$   r    r    r!   r   &   s   z(_StatefulRandomSamplerIterator._get_permc                 C   s^   | j | jkr	t | jt| jkr|  | _d| _| j| j }|  jd7  _|  j d7  _ |S Nr   r   )r   r   StopIterationr   r   r   r   )r   valr    r    r!   __next__1   s   
z'_StatefulRandomSamplerIterator.__next__c                 C   s   | j | j| j| jiS r#   )_YIELDEDr   
_GENERATORr   r$   r    r    r!   
state_dict<   s   z)_StatefulRandomSamplerIterator.state_dictr5   Nc                 C   sj   || j  | _|| j | _| jj| j | jd ur3|  | _t	| jD ]}t
|  q#| j| _d | _d S d S r#   )r3   r   r4   r   r   r   	set_stater   r   rangenextr   r   r5   _r    r    r!   load_state_dictB   s   



z._StatefulRandomSamplerIterator.load_state_dict)__name__
__module____qualname__r4   r3   r"   r%   r   intr   r2   dictr5   r;   r    r    r    r!   r      s    r   c                	   @   sd   e Zd Z			ddededee ddfddZedefd	d
Z	de
e fddZdefddZdS )RandomSamplerFNr   r   r   r&   c                 C   s   || _ || _|| _|d u r$ttjdtjd  }t	 }|
| || _t| jts5td| j t| jtr@| jdkrHtd| j d S )Nr    )r)   z;replacement should be a boolean value, but got replacement=r   zDnum_samples should be a positive integer value, but got num_samples=)r   r   _num_samplesr?   r*   emptyr,   random_item	Generatormanual_seedr   
isinstancebool	TypeErrorr   
ValueError)r   r   r   r   r   seedr    r    r!   r"   P   s   
zRandomSampler.__init__c                 C   s   | j d u r
t| jS | j S r#   )rB   r   r   r$   r    r    r!   r   e   s   

zRandomSampler.num_samplesc                 C   s   t | S r#   )r   r$   r    r    r!   r%   l   s   zRandomSampler.__iter__c                 C   s   | j S r#   )r   r$   r    r    r!   __len__o   s   zRandomSampler.__len__)FNN)r<   r=   r>   r   rI   r   r?   r"   propertyr   r   r%   rM   r    r    r    r!   rA   O   s"    
rA   c                   @   sv   e Zd ZdZdZdZdedefddZde	e fd	d
Z
deeef fddZdeeef ddfddZdddZdS )_BatchSamplerIteratorsamples_yieldedsampler_statesampler_iter_state
batch_size	drop_lastc                 C   s(   || _ t| j | _|| _|| _d| _d S Nr   )r   itersampler_iterrS   rT   rP   r   r   rS   rT   r    r    r!   r"   x   s
   
z_BatchSamplerIterator.__init__r&   c                 C   sf   g }zt | jD ]}|t| j |  jd7  _q|W S  ty2   | js,t|dkr.t| Y S w )Nr   r   )	r7   rS   appendr8   rW   rP   r0   rT   r   )r   batchr:   r    r    r!   r2      s   z_BatchSamplerIterator.__next__c                 C   sH   | j | ji}t| jtr| j || j< t| jtr"| j || j< |S r#   )	_SAMPLES_YIELDEDrP   rH   r   r   r5   _SAMPLER_STATErW   _SAMPLER_ITER_STATE)r   sdr    r    r!   r5      s   z _BatchSamplerIterator.state_dictr5   Nc                 C   s   || j  | _| j|v rt| jtsJ | j|| j  t| j| _| j	|v r8t| jts/J | j|| j	  t| jtsWt| jtsYt| jt
s[t| jD ]}t| j qOd S d S d S d S r#   )r[   rP   r\   rH   r   r   r;   rV   rW   r]   r	   r7   r8   r9   r    r    r!   r;      s   

z%_BatchSamplerIterator.load_state_dictc                 C   s.   t | jtrt| jdr| j  d S d S d S )Nupdate_state_dict)rH   rW   r   hasattrr_   r$   r    r    r!   r_      s   z'_BatchSamplerIterator.update_state_dict)r&   N)r<   r=   r>   r[   r\   r]   r?   rI   r"   listr2   r   strr   r5   r;   r_   r    r    r    r!   rO   s   s    rO   c                       s$   e Zd Z fddZdd Z  ZS )BatchSamplerc                    s   t  ||| d S r#   )superr"   rX   	__class__r    r!   r"      s   zBatchSampler.__init__c                 C   s   t | j| j| jdS )N)r   rS   rT   )rO   r   rS   rT   r$   r    r    r!   r%      s
   zBatchSampler.__iter__)r<   r=   r>   r"   r%   __classcell__r    r    re   r!   rc      s    rc   c                       s   e Zd ZdZ					ddedee dee d	ed
ededdf fddZ fddZ	de
eef fddZde
eef ddfddZ  ZS )StatefulDistributedSamplerr   NTr   Fdatasetnum_replicasrankshufflerL   rT   r&   c                    s&   t  |||||| d| _d | _d S rU   )rd   r"   r   r   )r   ri   rj   rk   rl   rL   rT   re   r    r!   r"      s   	
z#StatefulDistributedSampler.__init__c                 #   sX    d| _ | jd ur| j| _ d | _t  }t|| j d D ]}|  j d7  _ |V  qd S r/   )r   r   rd   r%   	itertoolsislice)r   itidxre   r    r!   r%      s   

z#StatefulDistributedSampler.__iter__c                 C   s   | j | jiS r#   )r3   r   r$   r    r    r!   r5      s   z%StatefulDistributedSampler.state_dictr5   c                 C   s8   | j |vr	td|| j  dk rtd|| j  | _d S )NzInvalid state_dictr   z2Cannot load state_dict with negative yielded value)r3   rK   r   )r   r5   r    r    r!   r;      s
   
z*StatefulDistributedSampler.load_state_dict)NNTr   F)r<   r=   r>   r3   r   r   r?   rI   r"   r%   r   rb   r   r5   r;   rg   r    r    re   r!   rh      s2    
"rh   )rm   typingr   r   r   r   r   r   torch.utils.data.samplerr*   torch.utils.datar   torch.utils.data.dataloaderr	   r
   statefulr   r?   r   rA   ra   rO   utilsdatar   rc   distributedDistributedSamplerrh   r    r    r    r!   <module>   s    =$7