o
    *Îjï&  ã                   @   st   d Z ddlZddlZddlmZ G dd„ dejjƒZG dd„ dejjƒZG d	d
„ d
ejjƒZ	G dd„ dejjƒZ
dS )zMultiple choice model.é    Né   )ÚGLMModelc                       s`   e Zd Z		ddef‡ fdd„Zdd	d
„Zddd„Zddedefdd„Z				ddd„Z
‡  ZS )ÚGLMForMultiTokenClozeTç        Úlanguage_modelc                    ó$   t t| ƒ ¡  || _|| _|| _d S ©N)Úsuperr   Ú__init__ÚmodelÚtake_softmaxÚlength_penalty©Úselfr   r   r   ©Ú	__class__© úl/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/mglm/model/downstream.pyr
      s   
zGLMForMultiTokenCloze.__init__NÚ Fc                 C   ó   | j  |||¡}|S r   ©r   Ú
state_dict©r   ZdestinationÚprefixZ	keep_varsÚsdr   r   r   r      ó   z GLMForMultiTokenCloze.state_dictc                 C   ó   | j j||dS ©N)Ústrict©r   Úload_state_dict©r   r   r   r   r   r   r       ó   z%GLMForMultiTokenCloze.load_state_dictr   Úrecursec                 C   r   ©N)r   r#   ©r   Únamed_parameters©r   r   r#   r   r   r   r&      r"   z&GLMForMultiTokenCloze.named_parametersc                 C   s¦  |d u r|   |||¡S d }t|jƒdkrc|jd d… \}}| d| d¡¡}|jdg| ¡ dd … ¢R Ž }|jdg| ¡ dd … ¢R Ž }| d| d¡¡}| d| d¡¡}|d urc| d| d¡¡}| j ||||d^}	}
| jrztjjj	|	dd}	tj
| d¡tj|jd}| d¡ |¡}tj
| d¡tj|jd}| d¡ |¡}|	|||f }|| jdd}| jd	krÃ||jdd| j  }|d urÍ| d|¡}|g|
¢R S )
Né   é   éÿÿÿÿ©Ú
prompt_pos©Údimr   ©ÚdtypeÚdevicer   r   )r   ÚlenÚshapeÚreshapeÚsizer   ÚtorchÚnnÚ
functionalÚlog_softmaxÚarangeÚlongr1   Ú	unsqueezeÚ	expand_asÚsumr   Úview)r   Ú	input_idsÚposition_idsÚattention_maskÚ
target_idsÚ
logit_maskr,   Únum_choicesÚ
batch_sizeÚoutputsÚmemsÚ	batch_idsÚseq_idsÚlogitsr   r   r   Úforward    sD   ÿ
ÿÿÿ
zGLMForMultiTokenCloze.forward©Tr   ©Nr   F©T©r   T©NNN)Ú__name__Ú
__module__Ú__qualname__r   r
   r   r    ÚstrÚboolr&   rL   Ú__classcell__r   r   r   r   r   
   s    ýÿ
	
úr   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGLMForMultiTokenClozeFastTr   c                    r   r   )r	   rX   r
   r   r   r   r   r   r   r   r
   J   s   
z"GLMForMultiTokenClozeFast.__init__c	                    sÒ  | j |||ddd^}	}
| ¡ \‰ ‰}| d¡}g ‰|
D ]!}| d¡ dˆdd¡jˆ ˆ g| ¡ dd … ¢R Ž }ˆ |¡ qd‡ ‡‡fdd„	}| d|¡}|jdg| ¡ d	d … ¢R Ž }||| d¡|ƒ}| d| d¡¡}| d| d¡¡}| j |||gˆ¢R Ž ^}	}
| jrtjj	j
|	dd
}	tj| d¡tj|jd}| d¡ |¡}tj| d¡tj|jd}| d¡ |¡}|	|||f }|| jdd
}| jdkrÙ||jdd
| j  }ˆd urã| dˆ¡}|g|
¢R S )NTF)Zreturn_memoryZdetach_memoryr*   r   r   c                    s”   ˆd   d| | f¡}t |¡}tj||j|jd dd¡}|| dd¡k }| d¡ ¡  	d| d¡}| 	ˆ ˆ dd¡}tj
||fdd}| d¡}|S )Nr   r   )r1   r0   r*   r)   r-   )Znew_onesr6   Ztrilr:   r1   r0   r?   r<   ÚfloatÚexpandÚcat)Z
seq_lengthÚsepZmemory_lengthÚmZidsÚmask©rF   Zenc_memsrE   r   r   Úbuild_dec_mask_matrixe   s   

ÿÿ
z@GLMForMultiTokenClozeFast.forward.<locals>.build_dec_mask_matrixr)   r-   r/   r   )r   )r   r5   r<   rZ   r4   Úappendr   r6   r7   r8   r9   r:   r;   r1   r=   r>   r   r?   )r   r@   rA   rB   Zdec_input_idsZdec_position_idsZdec_attention_maskZdec_target_idsZdec_logit_maskrG   rH   Zmax_dec_lenZmax_enc_lenZhiddenr`   rI   rJ   rK   r   r_   r   rL   P   st   
û
ÿþýÿþÿÿÿýý
z!GLMForMultiTokenClozeFast.forwardrM   ©rR   rS   rT   r
   rL   rW   r   r   r   r   rX   H   s    rX   c                       sV   e Zd Zd‡ fdd„	Zddd„Zdd	d
„Zddedefdd„Z			ddd„Z	‡  Z
S )ÚGLMForSingleTokenClozeFc                    s   t ƒ  ¡  || _|| _d S r   )r	   r
   r   r   )r   r   r   r   r   r   r
   ˜   s   

zGLMForSingleTokenCloze.__init__Nr   c                 C   r   r   r   r   r   r   r   r      r   z!GLMForSingleTokenCloze.state_dictTc                 C   r   r   r   r!   r   r   r   r    ¢   r"   z&GLMForSingleTokenCloze.load_state_dictr   r#   c                 C   r   r$   r%   r'   r   r   r   r&   ¥   r"   z'GLMForSingleTokenCloze.named_parametersc                 C   s¬   |d u r|   |||¡S t|jƒdksJ ‚| j ||||d^}}tj| d¡|j|jd}	||	|f }
| jr?tj	j
j|
dd}n|
}|	 d¡ |¡}	||	|f }||
g|¢R S )Nr)   r+   r   r/   r*   r-   r   )r   r2   r3   r6   r:   r5   r0   r1   r   r7   r8   r9   r<   r=   )r   r@   rA   rB   rC   rD   r,   rG   rH   rI   Ztarget_logitsZtarget_probÚoutputr   r   r   rL   ¨   s(   
ÿýÿzGLMForSingleTokenCloze.forward)FrN   rO   rP   rQ   )rR   rS   rT   r
   r   r    rU   rV   r&   rL   rW   r   r   r   r   rc   –   s    

úrc   c                       s(   e Zd Z	d‡ fdd„	Zdd„ Z‡  ZS )ÚGLMForSequenceClassificationr   c                    sN   t ƒ  ¡  || _|| _|| _tj ||¡| _tj 	|¡| _
tj ||¡| _d S r   )r	   r
   Ú
pool_tokenr   Ú	num_classr6   r7   ZLinearÚ
pool_layerZDropoutÚmultichoice_dropoutÚmultichoice_head)r   r   Zhidden_sizeZhidden_dropoutrf   rg   r   r   r   r
   Æ   s   
z%GLMForSequenceClassification.__init__c                 C   sV  d }t |jƒdkr@| jdksJ ‚|jd d… \}}| d| d¡¡}|jdg| ¡ dd … ¢R Ž }|jdg| ¡ dd … ¢R Ž }|  |||¡^}}| jdkr`|tj| d¡|j	|j
d|f }n)| jdkry|tj| d¡|j	|j
d|d f }n| jd	kr‡|d d …df }nt‚t |  |¡¡}|  |¡}	|  |	¡}
|d ur¥|
 d|¡}
|
g|¢R S )
Nr(   r   r)   r*   Ústartr   r/   ÚpadÚcls)r2   r3   rg   r4   r5   r   rf   r6   r:   r0   r1   ÚNotImplementedErrorÚtanhrh   ri   rj   r?   )r   r@   rA   rB   rE   rF   rG   rH   rd   Zmultichoice_outputrK   r   r   r   rL   Õ   sF   ÿ
ýý
ýý


z$GLMForSequenceClassification.forward)r   rb   r   r   r   r   re   Ä   s    ûre   )Ú__doc__r6   Ztorch.nnZmodeling_glmr   r7   ÚModuler   rX   rc   re   r   r   r   r   Ú<module>   s   >N.