o
    ߥi                     @   s   d dl mZmZmZ d dlZd dlZd dlm  m	Z
 d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ e ZG dd dejZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZdS )    )absolute_importdivisionprint_functionN)nn)
checkpoint)
AutoConfig	DPRConfigDPRQuestionEncoderMT5ForConditionalGenerationRagTokenForGeneration#XLMRobertaForSequenceClassificationXLMRobertaModelXLMRobertaTokenizer)
get_loggerc                       $   e Zd Z fddZdd Z  ZS )Wrapperc                    s   t t|   || _d S N)superr   __init__encoder)selfr   	__class__ W/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/dgds/backbone.pyr   $   s   
zWrapper.__init__c                 C   s   |  ||jS r   )r   pooler_output)r   	input_idsattention_maskdummy_tensorr   r   r   forward(   s   zWrapper.forward__name__
__module____qualname__r   r   __classcell__r   r   r   r   r   "   s    r   c                       s6   e Zd Z fddZedddZ	dddZ  ZS )	DPRModelc                    sf   t    || _tttj|dd}tttj|dd}t	|| _
t	|| _t | _d S )Nqry_encoderconfigctx_encoder)r   r   r(   r   r   from_pretrainedospathjoinr   r&   r)   r   CrossEntropyLossloss_fct)r   	model_dirr(   r&   r)   r   r   r   r   .   s   


zDPRModel.__init__    c           
      C   st   t jdt jdd}g }td|jd |D ]}||||  }||||  }t| |||}	||	 qt j|ddS )N   T)dtyperequires_gradr   dim)torchonesfloat32rangeshaper   appendcat)
modelr   r   gck_segmentr   pooled_output
mini_batchmini_batch_input_idsmini_batch_attention_maskmini_batch_pooled_outputr   r   r   encode<   s   zDPRModel.encodec                 C   sF   |  | j|||}|  | j|||}t||j}	| |	|}
|
|	fS r   )rE   r&   r)   r7   matmulTr/   )r   query_input_idsquery_attention_maskcontext_input_idscontext_attention_masklabelsr?   query_vectorcontext_vectorlogitslossr   r   r   r   K   s   

zDPRModel.forward)r1   )r!   r"   r#   r   staticmethodrE   r   r$   r   r   r   r   r%   ,   s    r%   c                       s:   e Zd Z fddZ										dddZ  ZS )ClassifyRerankc                    s   t    t|| _d S r   )r   r   r   r*   
base_model)r   r0   r   r   r   r   ]   s   

zClassifyRerank.__init__Nc                 O   s"   | j j||||||||	|
d	}|S )N)	r   r   token_type_idsposition_ids	head_maskinputs_embedsoutput_attentionsoutput_hidden_statesreturn_dict)rS   r   )r   r   r   rT   rU   rV   rW   rL   rX   rY   rZ   argskwargsoutputsr   r   r   r   b   s   
zClassifyRerank.forward)
NNNNNNNNNNr    r   r   r   r   rR   [   s    rR   c                       r   )Rerankc                    s   t    || _|| _d S r   )r   r   r   top_k)r   r   r_   r   r   r   r   ~   s   

zRerank.__init__c                 C   sN   | j }tj|di |d ddd d df }|d| j}tj|dd}|S )Nr   r5   r2   r   )r   Flog_softmaxviewr_   )r   inputsr>   rO   logprobsr   r   r   r      s
   (zRerank.forwardr    r   r   r   r   r^   |   s    r^   c                       s,   e Zd Z fddZdd Zdd Z  ZS )	Re2GModelc                    s   t t|   || _| jd | _tttj	
|dd}tttj	
|dd}t|| j| _t }|jj|_tt||d}d |j_|| _d S )Nr_   rerankr'   
generation)question_encoder	generator)r   rf   r   r(   r_   r   r   r*   r+   r,   r-   r
   r^   rg   r   
vocab_sizer   r	   ragri   rj   )r   r0   r(   r   rj   
dpr_config	rag_modelr   r   r   r      s,   

zRe2GModel.__init__c                 C   s$   |  |}| j||||| jd}|S )N)rL   rJ   rK   
doc_scoresn_docs)rg   rj   r_   )r   rerank_input_idsr   r   	label_idsro   r]   r   r   r   r      s   
zRe2GModel.forwardc                 C   sT   |  |}| jj| j||||| jd | jd d| jd ddd}|   }|S )N	num_beamstarget_sequence_lengthTno_repeat_ngram_size)rp   encoder_input_idsrJ   rK   ro   rs   
max_lengthearly_stoppingru   return_dict_in_generateoutput_scores)rg   rj   generater_   r(   detachcpunumpy)r   rq   r   r   ro   beam_search_outputgenerated_idsr   r   r   r{      s    
zRe2GModel.generate)r!   r"   r#   r   r   r{   r$   r   r   r   r   rf      s    rf   )
__future__r   r   r   os.pathr+   r7   torch.nn.functionalr   
functionalra   torch.utils.checkpointr   transformersr   r   r	   r
   r   r   r   r   modelscope.utils.loggerr   loggerModuler   r%   rR   r^   rf   r   r   r   r   <module>   s   (
/!