a
    d;                     @   sf   d dl Zd dlZd dlZd dlmZ G dd dejZG dd deZG dd dZ	G d	d
 d
Z
dS )    N)
DataLoaderc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )PrefetchGeneratorzA general prefetch generator.

    Ref:
    https://stackoverflow.com/questions/7323664/python-generator-pre-fetch

    Args:
        generator: Python generator.
        num_prefetch_queue (int): Number of prefetch queue.
    c                 C   s0   t j|  t|| _|| _d| _|   d S )NT)	threadingThread__init__Queuequeue	generatordaemonstart)selfr	   num_prefetch_queue r   i/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/data/prefetch_dataloader.pyr      s
    zPrefetchGenerator.__init__c                 C   s(   | j D ]}| j| q| jd  d S N)r	   r   put)r   itemr   r   r   run   s    
zPrefetchGenerator.runc                 C   s   | j  }|d u rt|S r   )r   getStopIteration)r   Z	next_itemr   r   r   __next__   s    
zPrefetchGenerator.__next__c                 C   s   | S r   r   r   r   r   r   __iter__$   s    zPrefetchGenerator.__iter__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r      s
   
r   c                       s,   e Zd ZdZ fddZ fddZ  ZS )PrefetchDataLoaderaN  Prefetch version of dataloader.

    Ref:
    https://github.com/IgorSusmelj/pytorch-styleguide/issues/5#

    TODO:
    Need to test on single gpu and ddp (multi-gpu). There is a known issue in
    ddp.

    Args:
        num_prefetch_queue (int): Number of prefetch queue.
        kwargs (dict): Other arguments for dataloader.
    c                    s    || _ tt| jf i | d S r   )r   superr   r   )r   r   kwargs	__class__r   r   r   7   s    zPrefetchDataLoader.__init__c                    s   t t  | jS r   )r   r   r   r   r   r    r   r   r   ;   s    zPrefetchDataLoader.__iter__)r   r   r   r   r   r   __classcell__r   r   r    r   r   (   s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	CPUPrefetcherz;CPU prefetcher.

    Args:
        loader: Dataloader.
    c                 C   s   || _ t|| _d S r   )
ori_loaderiterloader)r   r&   r   r   r   r   F   s    zCPUPrefetcher.__init__c                 C   s&   zt | jW S  ty    Y d S 0 d S r   )nextr&   r   r   r   r   r   r'   J   s    zCPUPrefetcher.nextc                 C   s   t | j| _d S r   )r%   r$   r&   r   r   r   r   resetP   s    zCPUPrefetcher.resetN)r   r   r   r   r   r'   r(   r   r   r   r   r#   ?   s   r#   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )CUDAPrefetcherzCUDA prefetcher.

    Ref:
    https://github.com/NVIDIA/apex/issues/304#

    It may consums more GPU memory.

    Args:
        loader: Dataloader.
        opt (dict): Options.
    c                 C   sJ   || _ t|| _|| _tj | _t|d dkr6dnd| _| 	  d S )NZnum_gpur   cudacpu)
r$   r%   r&   opttorchr*   ZStreamstreamdevicepreload)r   r&   r,   r   r   r   r   a   s    
zCUDAPrefetcher.__init__c                 C   s   zt | j| _W n ty*   d | _Y d S 0 tj| jJ | j D ].\}}t|rF| j| j	| j
dd| j|< qFW d    n1 s0    Y  d S )NT)r/   Znon_blocking)r'   r&   batchr   r-   r*   r.   itemsZ	is_tensortor/   )r   kvr   r   r   r0   i   s    
zCUDAPrefetcher.preloadc                 C   s$   t j | j | j}|   |S r   )r-   r*   Zcurrent_streamZwait_streamr.   r1   r0   )r   r1   r   r   r   r'   u   s    zCUDAPrefetcher.nextc                 C   s   t | j| _|   d S r   )r%   r$   r&   r0   r   r   r   r   r(   {   s    zCUDAPrefetcher.resetN)r   r   r   r   r   r0   r'   r(   r   r   r   r   r)   T   s
   r)   )r   r   r   r-   Ztorch.utils.datar   r   r   r   r#   r)   r   r   r   r   <module>   s   !