o
    i                     @   s   d dl mZmZmZmZmZ d dlZd dlZd dl	m
Z
mZ d dlmZ G dd dZ				dd
eeeeeejf f  deeef dedee deee eeejf f f
ddZdS )    )
CollectionDictListTupleUnionN)check_argument_typescheck_return_type)pad_listc                   @   s   e Zd ZdZ			ddeeef dedee fdd	Z	d
d Z
deeeeeejf f  deee eeejf f fddZdS )CommonCollateFnz$Functor class of common_collate_fn()          float_pad_valueint_pad_valuenot_sequencec                 C   s$   t  sJ || _|| _t|| _d S )N)r   r   r   setr   )selfr   r   r   r   r   L/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/train/collate_fn.py__init__   s   
zCommonCollateFn.__init__c                 C   s   | j  d| j d| j dS )Nz(float_pad_value=z, int_pad_value=))	__class__r   )r   r   r   r   __repr__   s   zCommonCollateFn.__repr__datareturnc                 C   s   t || j| j| jdS )N)r   r   r   )common_collate_fnr   r   r   )r   r   r   r   r   __call__   s   zCommonCollateFn.__call__Nr   r   r   )__name__
__module____qualname____doc__r   floatintr   strr   r   r   r   npndarrayr   torchTensorr   r   r   r   r   r
   
   s$    

r
   r   r   r   r   r   r   r   r   c                    s  t  sJ dd  D }dd  D  t fdd D s"J dtdd  d D s8J d	t d  i } d D ]C d  jjd
krM|}n|}fdd D }dd |D }t||}	|	|< |vrtjfdd D tjd}
|
|d < q>||f}t	|sJ |S )as  Concatenate ndarray-list to an array and convert to torch.Tensor.

    Examples:
        >>> from espnet2.samplers.constant_batch_sampler import ConstantBatchSampler,
        >>> import espnet2.tasks.abs_task
        >>> from espnet2.train.dataset import ESPnetDataset
        >>> sampler = ConstantBatchSampler(...)
        >>> dataset = ESPnetDataset(...)
        >>> keys = next(iter(sampler)
        >>> batch = [dataset[key] for key in keys]
        >>> batch = common_collate_fn(batch)
        >>> model(**batch)

        Note that the dict-keys of batch are propagated from
        that of the dataset as they are.

    c                 S   s   g | ]\}}|qS r   r   ).0u_r   r   r   
<listcomp>A       z%common_collate_fn.<locals>.<listcomp>c                 S   s   g | ]\}}|qS r   r   )r(   r*   dr   r   r   r+   B   r,   c                 3   s$    | ]}t  d  t |kV  qdS )r   N)r   r(   r-   )r   r   r   	<genexpr>D   s   " z$common_collate_fn.<locals>.<genexpr>zdict-keys mismatchingc                 s   s    | ]	}| d  V  qdS )_lengthsN)endswith)r(   kr   r   r   r/   E   s    
r   z*_lengths is reserved: ic                    s   g | ]}|  qS r   r   r.   keyr   r   r+   S   r,   c                 S   s   g | ]}t |qS r   )r&   
from_numpy)r(   ar   r   r   r+   W   s    c                    s   g | ]	}|  j d  qS )r   )shaper.   r4   r   r   r+   ^   s    )dtyper0   )
r   alllistr9   kindr	   r&   tensorlongr   )r   r   r   r   uttidsoutput	pad_value
array_listtensor_listr=   lensr   )r   r5   r   r   )   s2   


r   r   )typingr   r   r   r   r   numpyr$   r&   	typeguardr   r   &espnet.nets.pytorch_backend.nets_utilsr	   r
   r#   r%   r!   r"   r'   r   r   r   r   r   <module>   s(    !
