o
    8wi                     @   s   d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ dd	d
ZG dd deZG dd deZG dd deZG dd deZdS )    )Iterator)AnyOptional)override)	sized_len)_ITERATOR_RETURNCombinedLoader)MisconfigurationExceptionreturnNc                   C   s   d S N r   r   r   ]/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/pytorch_lightning/loops/fetchers.py_profile_nothing   s   r   c                   @   sn   e Zd ZdddZedefddZdeddfdd	Zedd
dZ	ede
fddZdddZdddZdS )_DataFetcherr
   Nc                 C   s.   d | _ d | _d| _d| _d | _t| _t| _d S )Nr   F)_combined_loaderiteratorfetcheddonelengthr   _start_profiler_stop_profilerselfr   r   r   __init__   s   
z_DataFetcher.__init__c                 C   s$   | j d u rtd| jj d| j S )N`z3` should have been `setup` with a `CombinedLoader`.)r   r	   	__class____name__r   r   r   r   combined_loader'   s
   
z_DataFetcher.combined_loaderr   c                 C   
   || _ d S r   )r   )r   r   r   r   r   setup/      
z_DataFetcher.setupc                 C   s   t | j| _|   | S r   )iterr   r   resetr   r   r   r   __iter__2   s   z_DataFetcher.__iter__c                 C   s~   | j d usJ |   zzt| j }W n ty   d| _ w W |   n|   w |  jd7  _| jd ur=| j| jk| _|S )NT   )r   r   nextStopIterationr   r   r   r   r   batchr   r   r   __next__8   s   
z_DataFetcher.__next__c                 C   s0   d| _ | jd urt| j| _| jdk| _d S d S Nr   )r   r   r   r   r   r   r   r   r   r   r"   H   s
   
z_DataFetcher.resetc                 C   s&   |    | jd ur| j   d | _d S r   )r"   r   r   r   r   r   r   teardownO   s   


z_DataFetcher.teardownr
   N)r
   r   )r   
__module____qualname__r   propertyr   r   r   r   r#   r   r)   r"   r+   r   r   r   r   r      s    
	
r   c                       sf   e Zd ZdZddeddf fddZed fdd	Zedef fd
dZ	ed fddZ
  ZS )_PrefetchDataFetchera{  This class is used to control batch fetching flow.

    Args:
        prefetch_batches: Number of batches to pre-fetch. Pre-fetching at least 1 batch is necessary to properly track
            whether a batch is the last one (available with :attr:`self.done`) when the length is not available. The
            value of this argument is ignored when the length is available.

    r$   prefetch_batchesr
   Nc                    s*   t    |dk rtd|| _g | _d S )Nr   z(`prefetch_batches` should at least be 0.)superr   
ValueErrorr1   batches)r   r1   r   r   r   r   `   s
   

z_PrefetchDataFetcher.__init__c              	      s\   t    | jd ur| S t| jD ]}zt   }| j| W q ty+   Y  | S w | S r   )	r2   r#   r   ranger1   r)   r4   appendr&   )r   _r(   r5   r   r   r#   g   s   


z_PrefetchDataFetcher.__iter__c                    sb   | j r%| j d}z| j t   W |S  ty$   | j  | _Y |S w | js/t  }|S tr*   )r4   popr7   r2   r)   r&   r   r'   r5   r   r   r)   x   s   

z_PrefetchDataFetcher.__next__c                    s   t    g | _d S r   )r2   r"   r4   r   r5   r   r   r"      s   

z_PrefetchDataFetcher.reset)r$   )r
   r0   r,   )r   r-   r.   __doc__intr   r   r#   r   r)   r"   __classcell__r   r   r5   r   r0   V   s    	r0   c                       sh   e Zd ZdZdededdf fddZed fdd	Zeded
 fddZ	ed fddZ
  ZS )_DataLoaderIterDataFetchera9  This class is used to return directly the `dataloader_iter` to the ``LightningModule`` training_step for users
    to implement their own pre-fetching logic. This feature can be activated as follows:

    Example::

        Class MyModel(LightningModule):
            def training_step(self, dataloader_iter: Iterator) -> None:
                # it is the user responsibility to fetch and move the batch to the right device.
                batch, batch_idx, dataloader_idx = next(dataloader_iter)
                batch = batch.to(self.device)
                ...

    argskwargsr
   Nc                    s(   t  j|i | d | _d| _d| _d S r*   )r2   r   _batch
_batch_idx_dataloader_idx)r   r>   r?   r5   r   r   r      s   
z#_DataLoaderIterDataFetcher.__init__c                    s   t    tt| | _| S r   )r2   r#   r!   _DataFetcherWrapperiterator_wrapperr   r5   r   r   r#      s   
z#_DataLoaderIterDataFetcher.__iter__rC   c                 C   s   | j rt| jS r   )r   r&   rD   r   r   r   r   r)      s   z#_DataLoaderIterDataFetcher.__next__c                    s    t    d | _d| _d| _d S r*   )r2   r"   r@   rA   rB   r   r5   r   r   r"      s   

z _DataLoaderIterDataFetcher.reset)r
   r=   r,   )r   r-   r.   r:   r   r   r   r#   r   r)   r"   r<   r   r   r5   r   r=      s    r=   c                       sr   e Zd ZdeddfddZedefddZedefdd	Z	ede
e fd
dZedef fddZ  ZS )rC   data_fetcherr
   Nc                 C   r   r   )rE   )r   rE   r   r   r   r      r    z_DataFetcherWrapper.__init__c                 C      | j jS r   )rE   r   r   r   r   r   r         z_DataFetcherWrapper.donec                 C   rF   r   )rE   r   r   r   r   r   r      rG   z_DataFetcherWrapper.fetchedc                 C   rF   r   )rE   r   r   r   r   r   r      rG   z_DataFetcherWrapper.lengthc                    s@   | j }|jrttt| \}}}||_||_||_|||fS r   )	rE   r   r&   r2   r=   r)   r@   rA   rB   )r   fetcherr(   	batch_idxdataloader_idxr5   r   r   r)      s   
z_DataFetcherWrapper.__next__)r   r-   r.   r=   r   r/   boolr   r;   r   r   r   r   r   r)   r<   r   r   r5   r   rC      s    rC   r,   )collections.abcr   typingr   r   typing_extensionsr   lightning_fabric.utilities.datar   +pytorch_lightning.utilities.combined_loaderr   r   &pytorch_lightning.utilities.exceptionsr	   r   r   r0   r=   rC   r   r   r   r   <module>   s   
9<)