o
    ߥi'                     @   sN   d dl Zd dlZd dlm  mZ d dlmZ G dd dZ	G dd dZ
dS )    N)top_k_logitsc                   @   sF   e Zd Zg dddddfddZedefd	d
ZdddZdd ZdS )BaseStrategy      ?   g-C6?g        Nc                 C   sL   || _ || _|| _|| _|| _|| _|d u rg }|| _tj| j t	d| _
d S Ndtype)
batch_sizeinvalid_slicestemperaturetopktop_peps
end_tokensnpzerosbool_is_done)selfr	   r
   r   top_kr   r   r    r   h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/glm_130b/generation/strategies.py__init__   s   zBaseStrategy.__init__returnc                 C   
   | j  S Nr   allr   r   r   r   is_done      
zBaseStrategy.is_donec           
      C   s   | d|d}|jd }|d u r| j}|| }| jD ]}d|d|f< qt|| j| j}tj	|
 dd}tj|dd}t| jD ]$}	|	|krNd| j|	< qB| j|	 rXd||	< qB||	  | jv rfd| j|	< qBtj|| |jd d d	 fdd}||fS )
Nr     .dim   num_samplesT)r%   )viewsizeshaper   r
   r   r   r   Fsoftmaxfloattorchmultinomialranger	   r   itemr   cat)
r   logitstokensmemsr   r	   invalid_sliceprobspredir   r   r   forward"   s2   




zBaseStrategy.forwardc                 C   s   t j| jtd| _||fS r   )r   r   r	   r   r   )r   r4   r5   r   r   r   finalize;   s   zBaseStrategy.finalizer   )	__name__
__module____qualname__r   propertyr   r   r:   r;   r   r   r   r   r   	   s    

r   c                   @   sV   e Zd Zddg g dddfddZdd Zdd	 Zed
efddZdd Z	dd Z
dS )BeamSearchStrategyr   Fr   c
           
      C   sB   || _ || _|| _|| _|| _|| _|| _|| _|	| _| 	  d S r   )
r	   	num_beamslength_penaltyr   ngrammin_gen_lengthr
   consider_enddeterministic_init_cache)
r   r	   rA   rB   rE   r   r
   no_repeat_ngram_sizerD   rF   r   r   r   r   B   s   zBeamSearchStrategy.__init__c                    sh   dd t  jD  _dd t  jD  _d _ fddt  jD  _d _tj jt	d _
d S )Nc                 S      g | ]}g qS r   r   .0_r   r   r   
<listcomp>Z       z2BeamSearchStrategy._init_cache.<locals>.<listcomp>c                 S   rI   r   r   rJ   r   r   r   rM   \   rN   r   c                    s    g | ]}d d t  jD qS )c                 S   s   g | ]}i qS r   r   rJ   r   r   r   rM   _   rN   z=BeamSearchStrategy._init_cache.<locals>.<listcomp>.<listcomp>)r0   rA   rJ   r   r   r   rM   _   s    r   )r0   r	   	end_beamsend_beams_penalized_scorescached_beam_scorescached_beam_ngram_banslength_generatedr   r   r   r   r   r   r   r   rG   Y   s   
zBeamSearchStrategy._init_cachec                 C   s   |dt | d | j  }tt | j| ddD ]}|dks)|| j| |d  k r+ nq| j| || | j| || | j| d | j | j|< | j| d | j | j|< d S )N      @   r!   r   r%   )lenrB   r0   rO   rP   insertrA   )r   scorebeam	batch_idxr9   r   r   r   _add_end_beamsd   s(   z!BeamSearchStrategy._add_end_beamsr   c                 C   r   r   r   r   r   r   r   r   s   r    zBeamSearchStrategy.is_donec              
   C   sd  |j \}}}|j d }| }| jD ]}d|d|f< q| j| jkr-| jD ]}	d|d|	f< q$| jdkrk|| jkrkt|D ]/}
t|D ](}||
|| jd  d f  }| j	|
 | 
t|g D ]	}d||
||f< q_qAq;tj|dd}| j}t|tjr|d |}|| }|||| }tj|dd}|| jk r|dd |f }| jrtj|tdt| jd | j dj}ntj|tdt| jd | j d	}|t|d|f }tj|d
dd\}}|t|d|f }tj||dd}|| }g g g }}}t|D ]}
g }g }g }g }tt||
 D ]}t ||
||
|f f ||
||d f f}| j!|
 sOt"||
|f | jv rO| #||
|f ||
 qt|| jk r|$| |$|d d |
||
|f f  |$||
|f  | jdkr| j	|
 ||
|f  % }t||
||
|f | jd  d f  }|
|t ||
|f f ||< |$| q |$t&| |$tj&|dd |$| || j	|
< qt&|}tj&|dd}tj'||j(d| _|  jd7  _t| j)D ]9}
|
|krd
| j!|
< qt| j*|
 | jkr,| j+|
 d | j|
  d|d  d | j,  kr,d
| j!|
< q||fS )Nr!   r"   .r   r%   r#   ).N)kr&   T)
descendingr$   trunc)rounding_mode)devicerT   rU   )-r*   r-   r
   rD   rS   r   rC   r0   tolistrR   gettupler+   log_softmaxrQ   
isinstancer.   Tensor	expand_asr(   r,   rA   rF   r   maxrV   indicesr/   arange	unsqueezesortdivr2   r   intr[   appendcopystacktensorr`   r	   rO   rP   rB   )r   r3   r4   r5   r	   rA   
vocab_sizeseq_lenr6   	end_tokenrZ   r9   ngram_prefixbanned_indexnext_token_scoresprev_scoresr7   next_tokens_indicesnext_indicesbeam_continue_batchscore_continue_batchmems_continue_batchbeam_continuescores_continuebans_continuemems_contiuerY   bansr   r   r   r:   w   s  














zBeamSearchStrategy.forwardc                 C   s   | j r9|jd d \}}t|D ]}| j| s.t|D ]}| | j||f |||f | qqd }| jd | }n|}|   ||fS )N   )rE   r*   r0   r   r[   rQ   rO   rG   )r   r4   r5   r	   rA   rZ   r9   retr   r   r   r;      s   
zBeamSearchStrategy.finalizeN)r<   r=   r>   r   rG   r[   r?   r   r   r:   r;   r   r   r   r   r@   @   s    
kr@   )numpyr   r.   torch.nn.functionalnn
functionalr+   ASwissArmyTransformer.generation.sampling_strategies.base_strategyr   r   r@   r   r   r   r   <module>   s   7