o
    ॵi                     @   sR   d dl mZ d dlZd dlZdd Z						dddZd	eej fd
dZdS )    )ListNc                    s$  t dkri S  fdd}t i d}d dddur)|d|d d< d d	ddur?td
d D |d	< d dddure|d|d< tfddD }|  }||d< d dddurw|d|d d< d dddurtjdd D dd|d d< d dddurt	dd D |d d< d dddurt	dd D |d d< d dddurt	dd D |d< d dddurtj	dd D dd|d< d d ddurtd!d D |d < d d"ddurtd#d D 
 |d$< d d%ddur0|d%|d&< d d'ddurGtd(d D |d)< d d*ddurX|d*|d+< d d,ddurqtjd-d D dd|d.< d d/ddurtjd0d D dd|d1< d d2ddurtjd3d D dd|d4< d d5ddurd6d D |d7< d d8ddurtd9d D |d d8< tjd:d D tjd;|d d<< d d=ddurt	d>d D |d d?< d d@ddur|d@|d dA< t	dBd D |d dC< d dDddur:|dD|dD< tjdEd D tjd;|dF< d dGddurPdHd D }||dG< d dIddurfdJd D }||dI< d dKddur{|dK}	|	|d dK< d dLddur|dL}
|
|d dL< |S )Mz-
    convert the sample to batch tensor.
    r   c                    s   t  fddD dS )Nc                    s   g | ]}|  qS  r   .0skeyr   ^/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/preprocessors/ofa/utils/collate.py
<listcomp>       z-collate_fn.<locals>.merge.<locals>.<listcomp>)eos_idx)collate_tokensr   r   pad_idxsamplesr   r	   merge   s   zcollate_fn.<locals>.merge)
nsentences	net_inputsourceNr   	input_idsidc                 S   s   g | ]}| d qS )r   )getr   r   r   r	   r
      s    zcollate_fn.<locals>.<listcomp>targetc                    s"   g | ]}|d      qS )r   )nelongsumr   )r   r   r	   r
       s   " ntokensprev_output_tokensdecoder_input_idspatch_imagec                 S      g | ]}|d  qS )r   r   r   sampler   r   r	   r
   '   r   )dimpatch_images
patch_maskc                 S   r    )r%   r   r!   r   r   r	   r
   *   r   patch_masks	code_maskc                 S   r    )r'   r   r!   r   r   r	   r
   .   r   
code_masks
code_imagec                 S   r    )r)   r   r!   r   r   r	   r
   1   r   code_imagesconfc                 S   r    )r+   r   r   r   r   r	   r
   4   r   ref_dictc                 S   r    )r,   r   r   r   r   r	   r
   6   r   labelc                 S   r    )r-   r   r   r   r   r	   r
   8   r   labelsconstraint_maskconstraint_masksdecoder_promptc                 S   s   g | ]}|d    qS )r1   )tolistr   r   r   r	   r
   =   s    decoder_promptsprefix_tokenprefix_tokensw_resize_ratioc                 S   r    )r6   r   r   r   r   r	   r
   C   r   w_resize_ratiosh_resize_ratioc                 S   r    )r8   r   r   r   r   r	   r
   F   r   h_resize_ratiosregion_coordc                 S   r    )r:   r   r   r   r   r	   r
   I   r   region_coordsr"   c                 S   r    )r"   r   r   r   r   r	   r
   K   r   r   fbankc                 S   r    )r<   r   r   r   r   r	   r
   O   r   c                 S      g | ]	}|d   dqS )r<   r   sizer   r   r   r	   r
   Q       )dtypefbank_length
fbank_maskc                 S   r    )rC   r   r   r   r   r	   r
   T   r   fbank_masks
phone_itemphone_itemsc                 S   r    )
phone_maskr   r   r   r   r	   r
   X   r   phone_masksphone_targetc                 S   r=   )rI   r   r>   r   r   r   r	   r
   \   r@   phone_length	db_structc                 S   r    )rK   r   r!   r   r   r	   r
   `   r   
mask_ratioc                 S   r    )rL   r   r!   r   r   r	   r
   c   r   seg_col_tokensseg_row_tokens)lenr   nparraytorch
LongTensorr   itemstackcatr2   _collate_framestensorr   )r   r   r   r   batchtgt_lengthsr   rK   rL   rM   rN   r   r   r	   
collate_fn	   s   



r[   F   c                    s"  t dd | D }|du r|nt ||}|dkr*|| dkr*t|d | d | } fdd}	| d  dkrG| d t| ||}
n$| d  d	krid
u sUJ | d t| || d d|}
ntt| D ]\}}|	||r|
| |t| d n	|
| dt|  qo|
S )z5Convert a list of 1d tensors into a padded 2d tensor.c                 s       | ]}| d V  qdS r   Nr>   )r   vr   r   r	   	<genexpr>z       z!collate_tokens.<locals>.<genexpr>Nr\   r   g?c                    s\   |  |   ks
J r' d u r| d |d< n |d< | d d |dd < d S ||  d S )Nr   r\   )numelcopy_)srcdstr   move_eos_to_beginningr   r	   copy_tensor   s   z#collate_tokens.<locals>.copy_tensor   F)	maxintr#   newrO   fill_r?   NotImplementedError	enumerate)valuesr   r   left_padrh   pad_to_lengthpad_to_multiple
pad_to_bszr?   ri   resir_   r   rg   r	   r   o   s$   8r   framesc                 C   s`   t dd | D }| d t| || d df}t| D ]\}}|||d|df< q|S )a;  
    Convert a list of 2D frames into a padded 3D tensor
    Args:
        frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is
            length of i-th frame and f_dim is static dimension of features
    Returns:
        3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i]
    c                 s   r]   r^   r>   )r   framer   r   r	   r`      ra   z"_collate_frames.<locals>.<genexpr>r   r\   N)rk   	new_zerosrO   r?   rp   )rx   max_lenoutrw   r_   r   r   r	   rW      s
   	"rW   )NFFNr\   N)	typingr   numpyrP   rR   r[   r   TensorrW   r   r   r   r	   <module>   s   i
*