o
    *j'                     @   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Zdtype)
batch_sizeinvalid_slicestemperaturetopktop_peps
end_tokensnpzerosbool_is_done)selfr   r	   r
   Ztop_kr   r   r    r   u/var/www/html/Deteccion_Ine/venv/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   Z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   r1   r2   r   r   r   finalize;   s   zBaseStrategy.finalizer   )	__name__
__module____qualname__r   propertyr   r   r7   r8   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   r>   r?   rB   r   r	   Zno_repeat_ngram_sizerA   rC   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   rE   r   r   rF   r   r   r   rI   \   rJ   r   c                    s    g | ]}d d t  jD qS )c                 S   s   g | ]}i qS r   r   rF   r   r   r   rI   _   rJ   z=BeamSearchStrategy._init_cache.<locals>.<listcomp>.<listcomp>)r-   r>   rF   r   r   r   rI   _   s    r   )r-   r   	end_beamsend_beams_penalized_scorescached_beam_scorescached_beam_ngram_banslength_generatedr   r   r   r   r   r   r   r   rD   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#   )lenr?   r-   rK   rL   insertr>   )r   Zscorebeam	batch_idxr6   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)Z
descendingr"   trunc)Zrounding_mode)devicerP   rQ   )-r'   r*   r	   rA   rO   r   r@   r-   tolistrN   gettupler(   Zlog_softmaxrM   
isinstancer+   ZTensorZ	expand_asr%   r)   r>   rC   r   maxrR   indicesr,   ZarangeZ	unsqueezesortdivr/   r   intrV   appendcopystackZtensorrY   r   rK   rL   r?   )r   r0   r1   r2   r   r>   Z
vocab_sizeZseq_lenr3   Z	end_tokenrU   r6   Zngram_prefixZbanned_indexZnext_token_scoresZprev_scoresr4   Znext_tokensZ_indicesZnext_indicesZbeam_continue_batchZscore_continue_batchZmems_continue_batchZbeam_continueZscores_continueZbans_continueZmems_contiuerT   Zbansr   r   r   r7   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   )rB   r'   r-   r   rV   rM   rK   rD   )r   r1   r2   r   r>   rU   r6   retr   r   r   r8      s   
zBeamSearchStrategy.finalizeN)r9   r:   r;   r   rD   rV   r<   r   r   r7   r8   r   r   r   r   r=   @   s    
kr=   )numpyr   r+   Ztorch.nn.functionalnnZ
functionalr(   ZASwissArmyTransformer.generation.sampling_strategies.base_strategyr   r   r=   r   r   r   r   <module>   s   7