a
    dE1                     @   s   d dl Zd dlZd dlmZmZ ddlm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G dd deZG dd deZdS )    N)DatasetIterableDataset   )ModelOutputc                   @   s$   e Zd Zdd Zdd Zdd ZdS )PipelineDatasetc                 C   s   || _ || _|| _d S Ndatasetprocessparams)selfr	   r
   r    r   h/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/transformers/pipelines/pt_utils.py__init__	   s    zPipelineDataset.__init__c                 C   s
   t | jS r   lenr	   r   r   r   r   __len__   s    zPipelineDataset.__len__c                 C   s"   | j | }| j|fi | j}|S r   r   )r   iitem	processedr   r   r   __getitem__   s    
zPipelineDataset.__getitem__N)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   r   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )PipelineIteratorNc                 C   s4   || _ || _|| _|dkrd}|| _d| _d| _dS )a  
        Roughly equivalent to

        ```
        for item in loader:
            yield infer(item, **params)
        ```

                Arguments:
                    loader (`torch.utils.data.DataLoader` or any iterator):
                        The iterator that will be used to apply `infer` on.
                    infer (any function):
                        The function to apply of each element of `loader`.
                    params (`dict`):
                        The parameters passed to `infer` along with every item
                    loader_batch_size (`int`, *optional*):
                        If specified, the items of `loader` are supposed to come as batch, and are loader_batched here
                        making it roughly behave as


        ```
        for items in loader:
            for i in loader_batch_size:
                item = items[i]
                yield infer(item, **params)
        ```   N)loaderinferr   loader_batch_size_loader_batch_index_loader_batch_datar   r   r   r   r   r   r   r   r      s    zPipelineIterator.__init__c                 C   s
   t | jS r   )r   r   r   r   r   r   r   ?   s    zPipelineIterator.__len__c                 C   s   t | j| _| S r   iterr   iteratorr   r   r   r   __iter__B   s    zPipelineIterator.__iter__c                    s  t  jtjr j j }nvi } j D ]X\}}t |tr| }t |d tjrtt fdd|D ||< q,t |d t	j
r,t fdd|D ||< q,|dv rt |trt |d tjrt fdd|D ||< q,t |d t	j
r,t fdd|D ||< q,|du r"d||< q,t | j tjrL| j d||< q,t | j t	j
rxt	| j d||< q,| j ||< q, j|}  jd	7  _|S )
ze
        Return item located at `loader_batch_index` within the current `loader_batch_data`.
        r   c                 3   s   | ]}| j  d V  qdS r   Nr    	unsqueeze.0elr   r   r   	<genexpr>U       z5PipelineIterator.loader_batch_item.<locals>.<genexpr>c                 3   s    | ]}t | j d V  qdS r'   npexpand_dimsr    r*   r   r   r   r-   W   r.   >   Z
attentionsZpast_key_valuesZhidden_statesc                 3   s   | ]}| j  d V  qdS r'   r(   r*   r   r   r   r-   \   r.   c                 3   s    | ]}t | j d V  qdS r'   r/   r*   r   r   r   r-   ^   r.   Nr   )
isinstancer!   torchTensorr    itemsr   Zto_tupletupler0   Zndarrayr)   r1   	__class__)r   resultZloader_batchedkelementr   r   r   loader_batch_itemF   s6    


z"PipelineIterator.loader_batch_itemc                 C   s   | j d ur| j | jk r|  S t| j}| j|fi | j}| jd urt|tj	rX|}nt
| d }|| }t|t
rt|}n
|jd }d|  k r| jk rn n|| _|| _d| _ |  S |S d S )Nr   )r    r   r;   nextr%   r   r   r2   r3   r4   listkeysr   shaper!   )r   r   r   first_tensorkeyobserved_batch_sizer   r   r   __next__u   s$    




zPipelineIterator.__next__)N)r   r   r   r   r   r&   r;   rC   r   r   r   r   r      s
   
'/r   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	PipelineChunkIteratorNc                    s   t  ||| dS )aK  
        Roughly equivalent to

        ```
        for iterator in loader:
            for item in iterator:
                yield infer(item, **params)
        ```

                Arguments:
                    loader (`torch.utils.data.DataLoader` or any iterator):
                        The iterator that will be used to apply `infer` on.
                    infer (any function):
                        The function to apply of each element of `loader`.
                    params (`dict`):
                        The parameters passed to `infer` along with every item
        N)superr   r"   r7   r   r   r      s    zPipelineChunkIterator.__init__c                 C   s   t | j| _d | _| S r   )r$   r   r%   subiteratorr   r   r   r   r&      s    zPipelineChunkIterator.__iter__c                 C   sr   | j d u r&| jt| jfi | j| _ zt| j }W n8 tyl   | jt| jfi | j| _ t| j }Y n0 |S r   )rG   r   r<   r%   r   StopIteration)r   r   r   r   r   rC      s    
zPipelineChunkIterator.__next__)N)r   r   r   r   r&   rC   __classcell__r   r   rF   r   rD      s   rD   c                   @   s    e Zd ZdZdd Zdd ZdS )PipelinePackIteratora  
    Roughly equivalent to

    ```
    packed =  []
    for item in loader:
        packed.append(item)
        if item["is_last"]:
            yield packed
            packed = []
    ```

        but it also handles cases where `item` are batched (meaning it's a dict of Tensor with first dimension > 1. In
        that case it does

    ```
    packed =  []
    for batch in loader:
        # item is batched
        for item in batch:
            packed.append(item)
            if item["is_last"]:
                yield packed
                packed = []
    ```

        Arguments:
            loader (`torch.utils.data.DataLoader` or any iterator):
                The iterator that will be used to apply `infer` on.
            infer (any function):
                The function to apply of each element of `loader`.
            params (`dict`):
                The parameters passed to `infer` along with every item
            loader_batch_size (`int`, *optional*):
                If specified, the items of `loader` are supposed to come as batch, and are loader_batched here making
                it roughly behave as


    ```
    for items in loader:
        for i in loader_batch_size:
            item = items[i]
            yield infer(item, **params)
    ```c                 C   s   t | j| _| S r   r#   r   r   r   r   r&      s    zPipelinePackIterator.__iter__c                 C   sD  d}g }| j d urP| j | jk rP| j | jk rP|  }|d}|| |r|S q|s@| jt| jfi | j}| jd ur&t	|t
jr|}nt| d }|| }t	|trt|}n
|jd }d|  k r| jk rn n|| _|| _d| _ | j | jk r>|  }|d}|| |r|S qqP|}|d}|| qP|S )NFis_lastr   )r    r   r;   popappendr   r<   r%   r   r2   r3   r4   r=   r>   r   r?   r!   )r   rK   Zaccumulatorr   r   r@   rA   rB   r   r   r   rC      sB    	







zPipelinePackIterator.__next__N)r   r   r   __doc__r&   rC   r   r   r   r   rJ      s   -rJ   c                   @   s,   e Zd ZeedddZdd Zdd ZdS )	
KeyDatasetr	   rA   c                 C   s   || _ || _d S r   rP   )r   r	   rA   r   r   r   r   )  s    zKeyDataset.__init__c                 C   s
   t | jS r   r   r   r   r   r   r   -  s    zKeyDataset.__len__c                 C   s   | j | | j S r   rP   r   r   r   r   r   r   0  s    zKeyDataset.__getitem__Nr   r   r   r   strr   r   r   r   r   r   r   rO   (  s   rO   c                   @   s.   e Zd ZeeedddZdd Zdd ZdS )	KeyPairDatasetr	   key1key2c                 C   s   || _ || _|| _d S r   rU   )r   r	   rV   rW   r   r   r   r   5  s    zKeyPairDataset.__init__c                 C   s
   t | jS r   r   r   r   r   r   r   :  s    zKeyPairDataset.__len__c                 C   s"   | j | | j | j | | j dS )N)textZ	text_pairrU   rQ   r   r   r   r   =  s    zKeyPairDataset.__getitem__NrR   r   r   r   r   rT   4  s   rT   )numpyr0   r3   Ztorch.utils.datar   r   Zutils.genericr   r   r   rD   rJ   rO   rT   r   r   r   r   <module>   s    -d