o
    iw                     @   sL   d Z ddlZddlZG dd dZG dd dejjjZG dd deZ	dS )	zCpytorch dataset and dataloader implementation for chainer training.    Nc                   @   s    e Zd ZdZdd Zdd ZdS )	Transforma)  Transform function container.

    lambda can't work well when using DDP because
    lambda is not pickable in the case of multi process.
    This class is required for DDP use case.

    Args:
        converter: batch converter
        load: function object to load data and create minibatch
    c                 C   s   || _ || _dS )zInitialize.N
_converter_load)self	converterload r	   H/home/ubuntu/.local/lib/python3.10/site-packages/espnet/utils/dataset.py__init__   s   
zTransform.__init__c                 C   s   |  | |gS )z+Apply a given converter and a given loader.r   )r   datar	   r	   r
   __call__   s   zTransform.__call__N)__name__
__module____qualname____doc__r   r   r	   r	   r	   r
   r      s    r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )TransformDatasetzTransform Dataset for pytorch backend.

    Args:
        data: list object from make_batchset
        transform: transform function

    c                    s   t t  || _|| _dS )Init function.N)superr   r   r   	transform)r   r   r   	__class__r	   r
   r   +   s   
zTransformDataset.__init__c                 C   s
   t | jS )zLen function.)lenr   r   r	   r	   r
   __len__1   s   
zTransformDataset.__len__c                 C   s   |  | j| S )z[] operator.)r   r   )r   idxr	   r	   r
   __getitem__5   s   zTransformDataset.__getitem__)r   r   r   r   r   r   r   __classcell__r	   r	   r   r
   r   "   s
    r   c                   @   sX   e Zd ZdZedd Zdd Zdd Zdd	 Ze	d
d Z
dd Zdd Zdd ZdS )ChainerDataLoaderzqPytorch dataloader in chainer style.

    Args:
        all args for torch.utils.data.dataloader.Dataloader

    c                 C   s   | d S )z/Get first element of a given array-like object.r   r	   )xr	   r	   r
   get_first_elementB   s   z#ChainerDataLoader.get_first_elementc                 K   s\   t jjjjdi || _t| jdrt| j| _nt|d | _d| _d| _	d| _
|| _dS )r   r   datasetr   Nr	   )torchutilsr   
dataloader
DataLoaderloaderhasattrr   current_positionepochiterkwargs)r   r+   r	   r	   r
   r   G   s   
zChainerDataLoader.__init__c                 C   sv   | j du rt | j| _ zt| j }W n ty"   d| _ |   Y S w |  jd7  _| j| jkr9| jd | _d| _|S )zImplement next function.N   r   )r*   r&   nextStopIterationr(   r   r)   )r   retr	   r	   r
   r-   X   s   
zChainerDataLoader.nextc                 c   s    | j D ]}|V  qdS )zImplement iter function.Nr&   )r   batchr	   r	   r
   __iter__g   s   
zChainerDataLoader.__iter__c                 C   s   | j | j| j  S )z!Epoch_detail required by chainer.)r)   r(   r   r   r	   r	   r
   epoch_detaill   s   zChainerDataLoader.epoch_detailc                 C   s(   |d| j }|d| j}|| _ || _dS )z#Serialize and deserialize function.r)   r(   N)r)   r(   )r   
serializerr)   r(   r	   r	   r
   	serializeq   s   
zChainerDataLoader.serializec                 C   s(   d| j d< tjjjjdi | j | _dS )zShuffle function for sortagrad.TshuffleNr	   )r+   r"   r#   r   r$   r%   r&   r   r	   r	   r
   start_shufflex   s   
zChainerDataLoader.start_shufflec                 C   s   | ` dS )zImplement finalize function.Nr0   r   r	   r	   r
   finalize}   s   zChainerDataLoader.finalizeN)r   r   r   r   staticmethodr    r   r-   r2   propertyr3   r5   r7   r8   r	   r	   r	   r
   r   :   s    

r   )
r   r"   torch.utils.datar   r#   r   Datasetr   objectr   r	   r	   r	   r
   <module>   s   