o
    rq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__ j/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/models/nlp/dgds/backbone.pyr   $   s   
zWrapper.__init__c                 C   s   |  ||jS r   )r   Z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   Z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)ZdtypeZrequires_gradr   dim)torchZonesZfloat32rangeshaper   appendcat)
modelr   r   gck_segmentr   Zpooled_outputZ
mini_batchZmini_batch_input_idsZmini_batch_attention_maskZmini_batch_pooled_outputr   r   r   encode<   s   zDPRModel.encodec                 C   sF   |  | j|||}|  | j|||}t||j}	| |	|}
|
|	fS r   )r:   r%   r(   r3   matmulTr-   )r   Zquery_input_idsZquery_attention_maskcontext_input_idscontext_attention_masklabelsr9   Zquery_vectorZcontext_vectorlogitsZlossr   r   r   r   K   s   

zDPRModel.forward)r/   )r    r!   r"   r   staticmethodr:   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   r.   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)rC   r   )r   r   r   rD   rE   rF   rG   r?   rH   rI   rJ   argskwargsoutputsr   r   r   r   b   s   
zClassifyRerank.forward)
NNNNNNNNNNr   r   r   r   r   rB   [   s    rB   c                       r   )Rerankc                    s   t    || _|| _d S r   )r   r   r   top_k)r   r   rO   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   r1   r0   r   )r   FZlog_softmaxviewrO   )r   Zinputsr8   r@   Zlogprobsr   r   r   r      s
   (zRerank.forwardr   r   r   r   r   rN   |   s    rN   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 )NrO   rerankr&   Z
generation)question_encoder	generator)r   rS   r   r'   rO   r   r   r)   r*   r+   r,   r
   rN   rT   r   Z
vocab_sizer   r	   ZragrU   rV   )r   r.   r'   r   rV   Z
dpr_configZ	rag_modelr   r   r   r      s,   

zRe2GModel.__init__c                 C   s$   |  |}| j||||| jd}|S )N)r?   r=   r>   
doc_scoresn_docs)rT   rV   rO   )r   rerank_input_idsr   r   Z	label_idsrW   rM   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_beamsZtarget_sequence_lengthTno_repeat_ngram_size)rX   Zencoder_input_idsr=   r>   rW   rZ   
max_lengthZearly_stoppingr[   Zreturn_dict_in_generateZoutput_scores)rT   rV   generaterO   r'   detachcpunumpy)r   rY   r   r   rW   Zbeam_search_outputZgenerated_idsr   r   r   r]      s    
zRe2GModel.generate)r    r!   r"   r   r   r]   r#   r   r   r   r   rS      s    rS   )
__future__r   r   r   Zos.pathr*   r3   Ztorch.nn.functionalr   Z
functionalrQ   Ztorch.utils.checkpointr   Ztransformersr   r   r	   r
   r   r   r   r   Zmodelscope.utils.loggerr   loggerModuler   r$   rB   rN   rS   r   r   r   r   <module>   s   (
/!