o
    zi                     @   s   d dl mZmZ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 )    )AnyIteratorListOptional)override)	sized_len)_ITERATOR_RETURNCombinedLoader)MisconfigurationExceptionreturnNc                   C   s   d S N r   r   r   T/home/ubuntu/.local/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__1   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__7   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#   G   s
   
z_DataFetcher.resetc                 C   s&   |    | jd ur| j   d | _d S r   )r#   r   r   r   r   r   r   teardownN   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   
ValueErrorr2   batches)r   r2   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   )	r3   r$   r   ranger2   r*   r5   appendr'   )r   _r)   r6   r   r   r$   f   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+   )r5   popr8   r3   r*   r'   r   r(   r6   r   r   r*   w   s   

z_PrefetchDataFetcher.__next__c                    s   t    g | _d S r   )r3   r#   r5   r   r6   r   r   r#      s   

z_PrefetchDataFetcher.reset)r%   )r   r1   r-   )r   r.   r/   __doc__intr   r   r$   r   r*   r#   __classcell__r   r   r6   r   r1   U   s    	r1   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+   )r3   r   _batch
_batch_idx_dataloader_idx)r   r?   r@   r6   r   r   r      s   
z#_DataLoaderIterDataFetcher.__init__c                    s   t    tt| | _| S r   )r3   r$   r"   _DataFetcherWrapperiterator_wrapperr   r6   r   r   r$      s   
z#_DataLoaderIterDataFetcher.__iter__rD   c                 C   s   | j rt| jS r   )r   r'   rE   r   r   r   r   r*      s   z#_DataLoaderIterDataFetcher.__next__c                    s    t    d | _d| _d| _d S r+   )r3   r#   rA   rB   rC   r   r6   r   r   r#      s   

z _DataLoaderIterDataFetcher.reset)r   r>   r-   )r   r.   r/   r;   r   r   r   r$   r   r*   r#   r=   r   r   r6   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 )rD   data_fetcherr   Nc                 C   r   r   )rF   )r   rF   r   r   r   r      r!   z_DataFetcherWrapper.__init__c                 C      | j jS r   )rF   r   r   r   r   r   r         z_DataFetcherWrapper.donec                 C   rG   r   )rF   r   r   r   r   r   r      rH   z_DataFetcherWrapper.fetchedc                 C   rG   r   )rF   r   r   r   r   r   r      rH   z_DataFetcherWrapper.lengthc                    s@   | j }|jrttt| \}}}||_||_||_|||fS r   )	rF   r   r'   r3   r>   r*   rA   rB   rC   )r   fetcherr)   	batch_idxdataloader_idxr6   r   r   r*      s   
z_DataFetcherWrapper.__next__)r   r.   r/   r>   r   r0   boolr   r<   r   r   r   r   r   r*   r=   r   r   r6   r   rD      s    rD   r-   )typingr   r   r   r   typing_extensionsr   lightning_fabric.utilities.datar   +pytorch_lightning.utilities.combined_loaderr   r	   &pytorch_lightning.utilities.exceptionsr
   r   r   r1   r>   rD   r   r   r   r   <module>   s   
9<)