U
    9%eE1                     @   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/Darija-Ai-API/env/lib/python3.8/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| 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k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k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   s     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   s     >   
attentionshidden_statespast_key_valuesc                 3   s   | ]}| j  d V  qdS r'   r(   r*   r   r   r   r-   \   s     c                 3   s    | ]}t | j d V  qdS r'   r.   r*   r   r   r   r-   ^   s     Nr   )
isinstancer!   torchTensorr    itemsr   Zto_tupletupler/   Zndarrayr)   r0   	__class__)r   resultZloader_batchedkelementr   r   r   loader_batch_itemF   s6    


z"PipelineIterator.loader_batch_itemc                 C   s   | j d k	r| j | jk r|  S t| j}| j|f| j}| jd k	rt|tj	rT|}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   r4   r5   r6   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=   rE   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"   r9   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   sl   | j d kr"| jt| jf| j| _ zt| j }W n6 tk
rf   | jt| jf| j| _ t| j }Y nX |S r   )rI   r   r>   r%   r   StopIteration)r   r   r   r   r   rE      s    
zPipelineChunkIterator.__next__)N)r   r   r   r   r&   rE   __classcell__r   r   rH   r   rF      s   rF   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   s@  d}g }| j d k	rP| j | jk rP| j | jk rP|  }|d}|| |r|S q|s<| jt| jf| j}| jd k	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   r4   r5   r6   r?   r@   r   rA   r!   )r   rM   Zaccumulatorr   r   rB   rC   rD   r   r   r   rE      sB    	







zPipelinePackIterator.__next__N)r   r   r   __doc__r&   rE   r   r   r   r   rL      s   -rL   c                   @   s,   e Zd ZeedddZdd Zdd ZdS )	
KeyDatasetr	   rC   c                 C   s   || _ || _d S r   rR   )r   r	   rC   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   rR   r   r   r   r   r   r   0  s    zKeyDataset.__getitem__Nr   r   r   r   strr   r   r   r   r   r   r   rQ   (  s   rQ   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   rW   )r   r	   rX   rY   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_pairrW   rS   r   r   r   r   =  s    zKeyPairDataset.__getitem__NrT   r   r   r   r   rV   4  s   rV   )numpyr/   r5   Ztorch.utils.datar   r   Zutils.genericr   r   r   rF   rL   rQ   rV   r   r   r   r   <module>   s    -d