o
    ߥi                      @   s   d dl Z G dd deZdS )    Nc                   @   sB   e Zd Z			dddZdd Zddd	ZdddZdddZdS )TextGeneratorN c                 C   s   d| _ || _tj dk| _|| _|| _|| _d| _d| _	|| _
d| _d| _d| _|| _| jdk| _d | _| jrBg g g g d| _d S d S )	Ng333333?r   e   f      i  r   )predicted_idsbeam_parent_idsscores	log_probs)alphaloggertorchcudadevice_countmodelvocabsymbolsstart_token	end_tokenglobal_scorer	beam_size
min_length
max_length	dump_beam
beam_trace
beam_accum)selfr   r   r   r   r   r    r   X/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/plug/generator.py__init__   s,   zTextGenerator.__init__c                    sf   g }|D ]}t |}|| |d  jkr|d d } nq fdd|D } j|d}|S )Nc                    s   g | ]}|t  jk r|qS r   )lenr   ).0tr   r   r   
<listcomp>5   s    z6TextGenerator._build_target_tokens.<locals>.<listcomp> )intappendr   r   	DecodeIdssplit)r   predtokenstokr   r$   r   _build_target_tokens-   s   
z"TextGenerator._build_target_tokensr   c                 C   s   t tt| }|dkr"|| |d |d< ||< || }t | }|d  |9  < |d}||ddd|ddd j| }|dkrW|| }|S )z7
        Tiles x on dimension dim count times.
        r   r       )	listranger!   sizepermute
contiguousview	transposerepeat)r   xcountdimpermout_sizebatchr   r   r   tile9   s"   

zTextGenerator.tileFc                 C   s@   t   | j|| j| jdW  d    S 1 sw   Y  d S )N)r   )r   no_grad_fast_translate_batchr   r   )r   encoder_inputsfastr   r   r   translate_batchN   s
   

$zTextGenerator.translate_batchc           /      C   sV  | j rJ | j}|\}}}|d}|j}	tj|dg| jtj|	d}
| j||||
d d dddd d
\}}}|}| j	||dd}| j	||dd}tj
|tj|	d}tj
d|| |tj|	d}tj|| dg| jtj|	d}tjd	gtd
g|d   |	d|}dd t|D }i }dd t|D |d< dd t|D |d< dg| |d< g |d< d }d }t|D ]t}| j||||||ddd|d
\}}}|d d dd d f }|d}ttj|d|dd}||k rd|d d | jf< ||dd7 }| j}d|d  d | }|| }|d|| }|j|dd\}} || }| j|dd}!| |} |!|d |!d d }"|"d}#t|d|#| ddgd}| | j}$|d |krd|$d |$d d df d}%|$ r|d||d}&t|$dD ]^}'||' }(|%|' r|$|' d |$|'  d})|)D ]}*||( ||'|*f |&|'|*dd f f q|%|' rt ||( dd dd}+|+d \},}-|d |( |, |d |( |- q|%d d}.t!|.dkr |S |d|.}|"d|.}"|d|.}|&d|.d|d}|"d}#|d|#}|d|#}q|S )Nr   r/   )dtypedeviceFT)checkpoint_activationsis_inferparallel_outputsequence_output)r:   )steprD   rE   g        z-inf)rE   c                 S      g | ]}g qS r   r   r"   _r   r   r   r%          z7TextGenerator._fast_translate_batch.<locals>.<listcomp>c                 S   rK   r   r   rL   r   r   r   r%      rN   predictionsc                 S   rK   r   r   rL   r   r   r   r%      rN   r	   
gold_scorer=   r    g@xg      @g      @trunc)rounding_modec                 S   s   | d S )Nr   r   )r8   r   r   r   <lambda>   s    z5TextGenerator._fast_translate_batch.<locals>.<lambda>)keyreverse)"r   r   r2   rE   r   fullr   longr   r>   arangetensorfloatr7   r1   logsoftmaxr5   r   	unsqueezer   reshapetopkdivfmodcatindex_selecteqfill_anynonzeror(   sortedr!   )/r   rA   r   r   r   r,   typespadding_mask
batch_sizerE   tmp_alive_seqprediction_scoresdec_feat_seqrI   src_featuresattention_maskbatch_offsetbeam_offset	alive_seqtopk_log_probs
hypothesesresultsdec_attn_maskdec_position_idsrJ   rM   
vocab_sizer
   r   length_penaltycurr_scorestopk_scorestopk_idstopk_beam_indexbatch_indexselect_indicesis_finishedend_conditionrO   ibfinished_hypjbest_hypscorer+   non_finishedr   r   r   r@   S   s  














z#TextGenerator._fast_translate_batch)NNr   )r   )F)__name__
__module____qualname__r   r.   r>   rC   r@   r   r   r   r   r      s    
&

r   )r   objectr   r   r   r   r   <module>   s   