ó
    È9iñ  ã                   óØ   • S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJr  SS	KJrJrJr  S
/r\	R$                  " \R&                  \R(                  S9 " S S
\5      5       rg)é    )ÚdeepcopyN)Únn)ÚModels)Ú
TorchModel)ÚMODELS)Ú	ModelFileÚTasksé   )ÚBertEncoderÚ	BertModelÚBertPreTrainedModelÚSiameseUieModel)Úmodule_namec                   ó\   ^ • \ rS rSrSrU 4S jrSS jrS rS r  SS jr	S r
S	 rS
rU =r$ )r   é   aÌ  SiameseUIE general information extraction model,
based on the construction idea of prompt (Prompt) + text (Text),
uses pointer network (Pointer Network) to
realize segment extraction (Span Extraction), so as to
realize named entity recognition (NER), relation extraction (RE),
Extraction of various tasks such as event extraction (EE),
attribute sentiment extraction (ABSA), etc. Different from
the existing general information extraction tasks on the market:
c                 ód  >• [         TU ]  U5        Xl        [        U R                  SS9U l        [
        R                  " UR                  5      U l        [
        R                  " UR                  S5      U l        [
        R                  " UR                  S5      U l        U R                  5         g )NT)Úadd_pooling_layerr
   )ÚsuperÚ__init__Úconfigr   Úplmr   ÚDropoutÚhidden_dropout_probÚdropoutÚLinearÚhidden_sizeÚ	head_clsfÚ	tail_clsfÚset_crossattention_layer)Úselfr   ÚkwargsÚ	__class__s      €Úf/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/nlp/bert/siamese_uie.pyr   ÚSiameseUieModel.__init__   sy   ø€ Ü‰Ñ˜Ô ØŒÜ˜TŸ[™[¸DÑAˆŒÜ—z’z &×"<Ñ"<Ó=ˆŒÜŸš 6×#5Ñ#5°qÓ9ˆŒÜŸš 6×#5Ñ#5°qÓ9ˆŒØ×%Ñ%Õ'ó    c                 óÄ  • [        U R                  5      nXl        U R                  =R                  U-  sl        [        U5      U l        U R
                  R                  R                  U R                  R                  S  U R                  l        U R
                  R                  R                  S U R                  R                   U R
                  R                  l        g )N)r   r   Únum_hidden_layersr   Úcrossattentionr   ÚencoderÚlayer)r    r'   Úcrossattention_configs      r#   r   Ú(SiameseUieModel.set_crossattention_layer%   s«   € Ü (¨¯©Ó 5ÐØ2CÔ/Ø‰×%Ò%Ð):Ñ:Õ%Ü)Ð*?Ó@ˆÔØ$(§H¡H×$4Ñ$4×$:Ñ$:¸4¿;¹;ß;LÑ;Lð<Nð %Oˆ×ÑÔ!à!%§¡×!1Ñ!1×!7Ñ!7ð 9J¸¿¹ß8IÑ8Ið"Kˆ‰×ÑÕr%   c                 ó´  • UR                  S5      nUR                  US5      nUR                  US5      nSSU-  -
  U-  nXS-  -
  nUSU-
  S-  -
  n[        R                  " US S 2S S24   5      n[        R                  " XF/SS9n[        R                  " XV/SS9n[        R
                  " USS9n[        R
                  " USS9nXx-   R                  5       $ )Nr   éÿÿÿÿr
   é   g   ¢”mB©Údim)ÚsizeÚviewÚtorchÚ
zeros_likeÚcatÚ	logsumexpÚmean)	r    Úy_predÚy_trueÚ
batch_sizeÚ
y_pred_negÚ
y_pred_posÚzerosÚneg_lossÚpos_losss	            r#   Úcircle_lossÚSiameseUieModel.circle_loss/   sÔ   € Ø—[‘[ “^ˆ
Ø—‘˜Z¨Ó,ˆØ—‘˜Z¨Ó,ˆØa˜&‘j‘. FÑ*ˆØ t™mÑ+ˆ
Ø˜q 6™z¨TÑ1Ñ1ˆ
Ü× Ò  ª¨2¨A¨2¨¡Ó/ˆÜ—Y’Y 
Ð2¸Ñ;ˆ
Ü—Y’Y 
Ð2¸Ñ;ˆ
Ü—?’? :°2Ñ6ˆÜ—?’? :°2Ñ6ˆØÑ#×)Ñ)Ó+Ð+r%   c                 ó  • [         R                  " X/SS9n[         R                  " X$/SS9nU R                  R                  UUR	                  5       S S 5      nU R                  XVS9S   S S 2S UR	                  5       S   2S S 24   nU$ )Nr
   r0   r/   )Úhidden_statesÚattention_maskr   )r4   r6   r   Úget_extended_attention_maskr2   r(   )r    rD   rE   Úencoder_hidden_statesÚencoder_attention_maskÚcat_hidden_statesÚcat_attention_masks          r#   Úget_cross_attention_outputÚ*SiameseUieModel.get_cross_attention_output=   sª   € ô "ŸIšI }Ð&LØ*+ñ-Ðä"ŸYšYØÐ4¸!ñ=Ðà!ŸX™X×AÑAØØ×"Ñ"Ó$ R aÐ(ó*Ðð ×+Ñ+Ø+ð ,ð 
à
ñâÐ(×#Ñ#Ó% aÑ(Ð(ª!Ð+ñ-ˆð Ðr%   c                 ón   • U(       a  [         R                  " U5      OS nU R                  UUUUS9S   nU$ )N)rE   Útoken_type_idsÚposition_idsr   )r4   Ú	ones_liker   )r    Ú	input_idsrE   rO   Úis_hintrN   Úsequence_outputs          r#   Úget_plm_sequence_outputÚ'SiameseUieModel.get_plm_sequence_outputL   sH   € ö
 =DœŸš¨Ô8ÈˆØŸ(™(ØØ)Ø)Ø%ð	 #ð 'ð ()ñ	*ˆð
 Ðr%   c                 óF  • U R                  UU5      nUR                  S5      UR                  S5      -   S::  d   e[        R                  " UR                  S5      5      R	                  S5      UR                  S5      -   nUR                  UR                  5      nU R                  X4USS9n	U R                  XrU	U5      nU R                  U5      R                  S5      n
U R                  U5      R                  S5      nU R                  nU" X¥5      nU" X¶5      nSXÞ-   0$ )a¢  train forward

Args:
    input_ids (Tensor): input token ids of text.
    attention_masks (Tensor): attention_masks of text.
    hint_ids (Tensor): input token ids of prompt.
    cross_attention_masks (Tensor): attention_masks of prompt.
    head_labels (Tensor): labels of start position.
    tail_labels (Tensor): labels of end position.

Returns:
    Dict[str, float]: the loss
    Example:
    {"loss": 0.5091743}
r
   i   ©r
   r.   T©rR   r.   Úloss)rT   r2   r4   ÚarangeÚexpandÚtoÚdevicerK   r   Úsqueezer   rA   )r    rQ   Úattention_masksÚhint_idsÚcross_attention_masksÚhead_labelsÚtail_labelsrS   rO   Úhint_sequence_outputÚhead_logitsÚtail_logitsÚ	loss_funcÚ	head_lossÚ	tail_losss                  r#   ÚforwardÚSiameseUieModel.forwardY   s!  € ð" ×6Ñ6°yØ7FóHˆà}‰}˜QÓ )§.¡.°Ó"3Ñ3°sÓ:Ð:Ð:Ü—|’| H§M¡M°!Ó$4Ó5×<Ñ<ØóØ —~‘~ aÓ(ñ)ˆà#—‘ ×'=Ñ'=Ó>ˆØ#×;Ñ;Ø¨\À4ð  <ð  IÐà×9Ñ9ØÐ.BØ!ó#ˆð —n‘n _Ó5×=Ñ=¸bÓAˆØ—n‘n _Ó5×=Ñ=¸bÓAˆØ×$Ñ$ˆ	Ù˜kÓ7ˆ	Ù˜kÓ7ˆ	Ø˜	Ñ-Ð.Ð.r%   c                 ó¾  • [         R                  " UR                  S5      5      R                  S5      UR                  S5      -   nUR	                  UR
                  5      nU R                  X4USS9nU R                  XUU5      nU R                  U5      R                  S5      nU R                  U5      R                  S5      nUSU-
  S-  -   n	USU-
  S-  -   n
Xš4$ )a'  

Args:
    sequence_output(tensor): 3-dimension tensor (batch size, sequence length, hidden size)
    attention_masks(tensor): attention mask, 2-dimension tensor (batch size, sequence length)
    hint_ids(tensor): token ids of prompt 2-dimension tensor (batch size, sequence length)
    cross_attention_masks(tensor): cross attention mask, 2-dimension tensor (batch size, sequence length)
Default Returns:
    head_probs(tensor): 2-dimension tensor(batch size, sequence length)
    tail_probs(tensor): 2-dimension tensor(batch size, sequence length)
r
   rW   TrX   r.   iðØÿÿ)r4   rZ   r2   r[   r\   r]   rT   rK   r   r^   r   )r    rS   r_   r`   ra   rO   rd   re   rf   Ú
head_probsÚ
tail_probss              r#   Úfast_inferenceÚSiameseUieModel.fast_inference}   sì   € ô —|’| H§M¡M°!Ó$4Ó5×<Ñ<ØóØ&×+Ñ+¨AÓ.ñ/ˆà#—‘ ×'=Ñ'=Ó>ˆØ#×;Ñ;Ø¨\À4ð  <ð  IÐà×9Ñ9ØÐ.BØ!ó#ˆð —n‘n _Ó5×=Ñ=¸bÓAˆØ—n‘n _Ó5×=Ñ=¸bÓAˆØ  A¨Ñ$7¸6Ñ#AÑAˆ
Ø  A¨Ñ$7¸6Ñ#AÑAˆ
ØÐ%Ð%r%   )r   r(   r   r   r   r   )é   )NF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   rA   rK   rT   rj   ro   Ú__static_attributes__Ú__classcell__)r"   s   @r#   r   r      s:   ø† ñõ(ôKò,òð$ .2Ø(-ô	ò"/÷H&ð &r%   )Úcopyr   r4   r   Úmodelscope.metainfor   Úmodelscope.models.baser   Úmodelscope.models.builderr   Úmodelscope.utils.constantr   r	   Úbackboner   r   r   Ú__all__Úregister_moduleÚsiamese_uieÚbertr   © r%   r#   Ú<module>r„      s_   ðå ã Ý å &Ý -Ý ,ß 6ß AÑ AàÐ
€ð ×Ò˜×)Ñ)°v·{±{ÑCôF&Ð)ó F&ó DñF&r%   