a
    h2                     @   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   [/var/www/html/assistant/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 `Iterable`):
                        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 d}ni } j D ]d\}}t |tr| }t |d tjrzt	 fdd|D ||< q2t |d t
jr2t	 fdd|D ||< q2|dv rt |t	rt |d tjrt	 fdd|D ||< q2t |d t
jr2t	 fdd|D ||< q2|dkr q2|d	u r4d	||< q2t | j tjr^| j d||< q2t | j t
jrt
| j d||< q2| j ||< q2 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hidden_statesZ
attentionsc                 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.   Zpast_key_valuesNr   )
isinstancer!   torchTensorr    r)   itemsr   Zto_tupletupler0   Zndarrayr1   	__class__)r   resultZloader_batchedkelementr   r   r   loader_batch_itemF   s:    



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|t
rl|d }nt| d }|| }t|trt|}n
|jd }d|  k r| jk rn n|| _t|t
r|d n|| _d| _ |  S |S d S )Nr   )r    r   r;   nextr%   r   r   r2   r3   r4   r6   listkeysr   shaper!   )r   r   r   first_tensorkeyobserved_batch_sizer   r   r   __next__w   s(    






zPipelineIterator.__next__)N)r   r   r   r   r   r&   r;   rC   r   r   r   r   r      s
   
'1r   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	PipelineChunkIteratorNc                    s   t  ||| dS )aI  
        Roughly equivalent to

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

                Arguments:
                    loader (`torch.utils.data.DataLoader` or `Iterable`):
                        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 `Iterable`):
                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   2  s    zKeyDataset.__len__c                 C   s   | j | | j S r   rP   r   r   r   r   r   r   5  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   :  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   B  s    zKeyPairDataset.__getitem__NrR   r   r   r   r   rT   9  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