o
    *j
'                     @   s   d dl mZ d dlZd dlm  mZ dd Z		dddZd de	d	 fd
dZ
dd Z								ddedededede	de	dedefddZdd Z									d dededede	de	dededefddZdS )!    )ListNc              
   C   s.  |   \}}|r|}nd}ttj|||f| jd|d||}tj|tj| jd}|d	| }|r9|
 }|s=|rt|D ]M}	||	| |	 |kf }
|rS|

 }
d}t|
  d D ]0}|
| }|rud||	d|d dd|d f< |r||	|d df  |d | 8  < |d }q]qA|dk }||fS )z4Build masks and position id for left to right model.   )device)Zdtyper   r   Ng      ?)sizetorchZtrilonesr   viewZarangelongZ	unsqueezeZ	expand_asclonerange)data	eod_tokenreset_position_idsreset_attention_maskmicro_batch_size
seq_lengthZatt_mask_batchattention_maskposition_idsbZ	eod_indexZ
prev_indexji r   i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/codegeex/inference.pyget_ltor_masks_and_position_ids	   sH   	
 $r   Fc                 C   s0   |  |d  }t||||\}}|||fS )z#Generate batch from context tokens.)r   
contiguouscudar   )context_tokensr   r   r   r   tokensr   r   r   r   r   	get_batchB   s   
r           ZInfc           
      C   s   |dkr| t | |d d k }|| |< |dkr^t j| ddd\}}t jtj|dddd}||k}|dd	df  |dd
d	f< d|d< t|dD ]}	||	 ||	  }|| |	 |< qM| S )zThis function has been mostly taken from huggingface conversational
    ai code at
        https://medium.com/huggingface/how-to-build-a-state-of-the-art-
             conversational-ai-with-transfer-learning-2d818ac26313r   ).r   Nr    Tr   )Z
descendingdimr!   .Nr   ).r   )	r   topksortZcumsumFsoftmaxr
   r   r   )
logitstop_ktop_pZfilter_valueZindices_to_removeZsorted_logitsZsorted_indicesZcumulative_probsZsorted_indices_to_remover   r   r   r   top_k_logitsV   s*   

r*   c                 C   sD   g }| D ]}t |}||k r||g||   || q| |fS )N)lenextendappend)batchZpad_idr   context_lengthsr   context_lengthr   r   r   	pad_batchx   s   r1         ?return_scoresprompt_lengthr   bad_idstemperaturetoppr#   greedyc                 c   s    t ||j|\}}tj|}tj|}|  }t|||j\}}}t| |||||||||||	|
||d}|D ]\}}|d7 }|d urU|d d d |f |fV  q;dV  q;d S )N)	r   out_seq_lengthr3   r4   r5   r6   r7   r#   r8   r   )NN)	r1   eos_token_idr   r   Z
LongTensorminitemr   sample_sequence_batch)model	tokenizerr   r9   r   r3   r4   r   r5   r6   r7   r#   r8   r/   Zcontext_tokens_tensorZcontext_length_tensorr0   r   r   r   Zbatch_token_iteratorlengthsr   r   r   get_token_stream   sH   
rA   c                 C   s   | | }d| |  ||  S )Nr   )Ztype_as)Zval1Zval2booleanr   r   r   switch   s   
rC   	recomputec           )   
   c   s\   |    t  |  }|j}d}|}d }|d}t|g 	 }|}|d u r=|d }||| kr=|| }t
|g 	 | }|	rUt|g 	 }||kr|rs| ||||
|d}|d d |d d d f }nP|dkr|d d d |f }|d d d |f }n|d d |d f |d}|d d |d f |d}| ||||d|
|d\}}|d d df |d }|d ur|D ]
}d|d d |f< q|rtj|ddd}n)| }|	rtj|dd} || }t|||d	}tj|dd}!tj|!dd
d}||k}"t|d d |f d||"}#|sB|	rB|dd}$| d|$d}%|%|" }%|%|   }%||%7 }|#|d d |f< ||k |" @ }&|&| @  }'|||'d< ||&B }t|}(|	rv|||ffV  n||fV  |d7 }|d7 }|(rn||ksZW d    d S W d    d S W d    d S 1 sw   Y  d S )Nr   r   )r4   r0   r   T)
layer_pastZget_key_valuer4   r0   ir"   )r(   r)   )Znum_samples)evalr   Zno_gradr;   r<   r:   r   Zzerosbyter   r   r	   floatr   r   ZargmaxZlog_softmaxr*   r%   r&   ZmultinomialrC   ZgatherboolZlogical_notall))r>   r?   r   r/   r   r   r   r9   maxlenr3   r4   r5   r6   r7   r#   rD   r8   r0   Zeos_idZcounterZorg_context_lengthrE   Z
batch_sizeZis_doner   r@   Zscoresr'   Z
tokens2useZpositions2useZbad_idprevZorig_log_probsZ	log_probsstartedZ
new_tokensindicesZ
new_scoresZ
done_tokenZjust_finisheddoner   r   r   r=      s   


	


\$r=   )FF)FNNNr2   r2   r    F)	NFNNr2   r2   r    FF)typingr   r   Ztorch.nn.functionalnnZ
functionalr%   r   r   rH   r*   r1   rI   intrA   rC   r=   r   r   r   r   <module>   sz   =
"	

6
