ó
    ˆŽ¡jª|  ã                   óø  • S r SSKJr  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  SSKJr  SSKJrJrJr  SSKJrJr  SSKJr  SSKJr  SSKJrJrJ r J!r!J"r"  SSK#J$r$  SSK%J&r&  SSK'J(r(  \!RR                  " \*5      r+ " S S\RX                  5      r- S?S\RX                  S\R\                  S\R\                  S\R\                  S\R\                  S-  S\/S\/4S jjr0 " S S \RX                  5      r1 " S! S"\RX                  5      r2 " S# S$\RX                  5      r3 " S% S&\RX                  5      r4 " S' S(\RX                  5      r5 " S) S*\5      r6 " S+ S,\RX                  5      r7\ " S- S.\5      5       r8\ " S/ S0\85      5       r9 " S1 S2\RX                  5      r: " S3 S4\RX                  5      r;\ " S5 S6\85      5       r<\" S7S89\ " S9 S:\5      5       5       r=\" S;S89 " S< S=\85      5       r>/ S>Qr?g)@zPyTorch Splinter model.é    )ÚCallable)Ú	dataclassN)Únn)ÚCrossEntropyLossé   )Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚModelOutputÚQuestionAnsweringModelOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)Úapply_chunking_to_forward)ÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚloggingÚtorch_compilable_check)Úmerge_with_config_defaults)Úcapture_outputsé   )ÚSplinterConfigc                   ó¾   ^ • \ rS rSrSrU 4S jr    SS\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S	\	4
S
 jjr
SrU =r$ )ÚSplinterEmbeddingsé(   zGConstruct the embeddings from word, position and token_type embeddings.c                 óˆ  >• [         TU ]  5         [        R                  " UR                  UR
                  UR                  S9U l        [        R                  " UR                  UR
                  5      U l	        [        R                  " UR                  UR
                  5      U l        [        R                  " UR
                  UR                  S9U l        [        R                  " UR                  5      U l        [        R"                  " [$        R&                  " UR                  5      R)                  S5      SS9U l        g )N)Úpadding_idx©Úeps©r   éÿÿÿÿF)Ú
persistent)ÚsuperÚ__init__r   Ú	EmbeddingÚ
vocab_sizeÚhidden_sizeÚpad_token_idÚword_embeddingsÚmax_position_embeddingsÚposition_embeddingsÚtype_vocab_sizeÚtoken_type_embeddingsÚ	LayerNormÚlayer_norm_epsÚDropoutÚhidden_dropout_probÚdropoutÚBufferÚtorchÚarangeÚexpandÚposition_ids©ÚselfÚconfigÚ	__class__s     €Ú¼C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/models/splinter/modeling_splinter.pyr'   ÚSplinterEmbeddings.__init__+   sÚ   ø€ Ü‰ÑÔÜ!Ÿ|š|¨F×,=Ñ,=¸v×?QÑ?QÐ_e×_rÑ_rÑsˆÔÜ#%§<¢<°×0NÑ0NÐPV×PbÑPbÓ#cˆÔ Ü%'§\¢\°&×2HÑ2HÈ&×J\ÑJ\Ó%]ˆÔ"äŸš f×&8Ñ&8¸f×>SÑ>SÑTˆŒÜ—z’z &×"<Ñ"<Ó=ˆŒô ŸIšI¤e§l¢l°6×3QÑ3QÓ&R×&YÑ&YÐZaÓ&bÐotÑuˆÕó    NÚ	input_idsÚtoken_type_idsr:   Úinputs_embedsÚreturnc                 óÄ  • Ub  UR                  5       nOUR                  5       S S nUS   nUc  U R                  S S 2S U24   nUc8  [        R                  " U[        R                  U R                  R
                  S9nUc  U R                  U5      nU R                  U5      nXG-   nU R                  U5      n	X‰-  nU R                  U5      nU R                  U5      nU$ )Nr$   r   ©ÚdtypeÚdevice)Úsizer:   r7   ÚzerosÚlongrI   r,   r0   r.   r1   r5   )
r<   rB   rC   r:   rD   Úinput_shapeÚ
seq_lengthr0   Ú
embeddingsr.   s
             r?   ÚforwardÚSplinterEmbeddings.forward7   sä   € ð Ñ Ø#Ÿ.™.Ó*‰Kà'×,Ñ,Ó.¨s°Ð3ˆKà  ‘^ˆ
àÑØ×,Ñ,ªQ°°°¨^Ñ<ˆLàÑ!Ü"Ÿ[š[¨¼E¿J¹JÈt×O`ÑO`×OgÑOgÑhˆNàÑ Ø ×0Ñ0°Ó;ˆMØ $× :Ñ :¸>Ó JÐØ"Ñ:ˆ
à"×6Ñ6°|ÓDÐØÑ)ˆ
à—^‘^ JÓ/ˆ
Ø—\‘\ *Ó-ˆ
ØÐrA   )r1   r5   r.   r:   r0   r,   )NNNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r'   r7   Ú
LongTensorÚFloatTensorÚtuplerP   Ú__static_attributes__Ú__classcell__©r>   s   @r?   r   r   (   s€   ø† ÙQõ
vð .2Ø26Ø04Ø26ñà×#Ñ# dÑ*ðð ×(Ñ(¨4Ñ/ðð ×&Ñ&¨Ñ-ð	ð
 ×(Ñ(¨4Ñ/ðð 
÷ó rA   r   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingr5   c                 ó°  • [         R                  " XR                  SS5      5      U-  nUb  X„-   n[        R                  R                  US[         R                  S9R                  UR                  5      n[        R                  R                  X†U R                  S9n[         R                  " Xƒ5      n	U	R                  SS5      R                  5       n	X˜4$ )Né   r   r$   )ÚdimrH   )ÚpÚtrainingr   )r7   ÚmatmulÚ	transposer   Ú
functionalÚsoftmaxÚfloat32ÚtorH   r5   rg   Ú
contiguous)
r]   r^   r_   r`   ra   rb   r5   ÚkwargsÚattn_weightsÚattn_outputs
             r?   Úeager_attention_forwardrr   Y   s°   € ô —<’< §}¡}°Q¸Ó':Ó;¸gÑE€LØÑ!Ø#Ñ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÐS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨È6Ï?É?Ð(Ð[€Lä—,’,˜|Ó3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€KØÐ$Ð$rA   c                   ó´   ^ • \ rS rSrU 4S jr S
S\R                  S\R                  S-  S\\	   S\
\R                  \R                  S-  4   4S jjrS	rU =r$ )ÚSplinterSelfAttentionép   c                 ó6  >• [         TU ]  5         UR                  UR                  -  S:w  a7  [	        US5      (       d&  [        SUR                   SUR                   S35      eXl        UR                  U l        [        UR                  UR                  -  5      U l        U R                  U R                  -  U l	        [        R                  " UR                  U R                  5      U l        [        R                  " UR                  U R                  5      U l        [        R                  " UR                  U R                  5      U l        [        R                  " UR                   5      U l        UR                   U l        U R                  S-  U l        g )Nr   Úembedding_sizezThe hidden size (z6) is not a multiple of the number of attention heads (Ú)g      à¿)r&   r'   r*   Únum_attention_headsÚhasattrÚ
ValueErrorr=   ÚintÚattention_head_sizeÚall_head_sizer   ÚLinearr^   r_   r`   r3   Úattention_probs_dropout_probr5   Úattention_dropoutrb   r;   s     €r?   r'   ÚSplinterSelfAttention.__init__q   sD  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÓ?ÌÐPVÐXh×HiÑHiÜØ# F×$6Ñ$6Ð#7ð 8Ø ×4Ñ4Ð5°Qð8óð ð
 ŒØ#)×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔä—Y’Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
Ü—9’9˜V×/Ñ/°×1CÑ1CÓDˆŒÜ—Y’Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
ä—z’z &×"EÑ"EÓFˆŒØ!'×!DÑ!DˆÔØ×/Ñ/°Ñ5ˆ�rA   NÚhidden_statesra   ro   rE   c                 ó€  • UR                   S S n/ UQSPU R                  P7nU R                  U5      R                  U5      R	                  SS5      nU R                  U5      R                  U5      R	                  SS5      nU R                  U5      R                  U5      R	                  SS5      n[        R                  " U R                  R                  [        5      n	U	" U UUUU4U R                  (       d  SOU R                  U R                  S.UD6u  p«U
R                  " / UQSP76 R!                  5       n
X«4$ )Nr$   r   rd   ç        )r5   rb   )Úshaper}   r^   Úviewri   r_   r`   r   Úget_interfacer=   Ú_attn_implementationrr   rg   r�   rb   Úreshapern   )r<   rƒ   ra   ro   rM   Úhidden_shapeÚquery_statesÚ
key_statesÚvalue_statesÚattention_interfacerq   rp   s               r?   rP   ÚSplinterSelfAttention.forward†   s8  € ð $×)Ñ)¨#¨2Ð.ˆØC˜ÐC bÐC¨$×*BÑ*BÑCˆà—z‘z -Ó0×5Ñ5°lÓC×MÑMÈaÐQRÓSˆØ—X‘X˜mÓ,×1Ñ1°,Ó?×IÑIÈ!ÈQÓOˆ
Ø—z‘z -Ó0×5Ñ5°lÓC×MÑMÈaÐQRÓSˆä(?×(MÒ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð  $Ÿ}Ÿ}‘C°$×2HÑ2HØ—L‘Lñ	%
ð ñ	%
Ñ!ˆð "×)Ò)Ð;¨;Ð;¸Ò;×FÑFÓHˆØÐ(Ð(rA   )
r~   r�   r}   r=   r5   r_   ry   r^   rb   r`   ©N)rR   rS   rT   rU   r'   r7   ÚTensorrX   r   r   rY   rP   rZ   r[   r\   s   @r?   rt   rt   p   si   ø† õ6ð0 48ñ)à—|‘|ð)ð ×)Ñ)¨DÑ0ð)ð Ð+Ñ,ð	)ð
 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1÷)ó )rA   rt   c                   óz   ^ • \ rS rSrU 4S jrS\R                  S\R                  S\R                  4S jrSrU =r	$ )ÚSplinterSelfOutputé§   c                 ó(  >• [         TU ]  5         [        R                  " UR                  UR                  5      U l        [        R                  " UR                  UR                  S9U l        [        R                  " UR                  5      U l
        g ©Nr!   )r&   r'   r   r   r*   Údenser1   r2   r3   r4   r5   r;   s     €r?   r'   ÚSplinterSelfOutput.__init__¨   s`   ø€ Ü‰ÑÔÜ—Y’Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
ÜŸš f×&8Ñ&8¸f×>SÑ>SÑTˆŒÜ—z’z &×"<Ñ"<Ó=ˆ�rA   rƒ   Úinput_tensorrE   c                 óp   • U R                  U5      nU R                  U5      nU R                  X-   5      nU$ r‘   ©r˜   r5   r1   ©r<   rƒ   rš   s      r?   rP   ÚSplinterSelfOutput.forward®   ó5   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØŸ™ }Ñ'CÓDˆØÐrA   ©r1   r˜   r5   ©
rR   rS   rT   rU   r'   r7   r’   rP   rZ   r[   r\   s   @r?   r”   r”   §   ó6   ø† õ>ð U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ ò rA   r”   c            	       ó�   ^ • \ rS rSrU 4S jr S
S\R                  S\R                  S-  S\\	   S\R                  4S jjr
S	rU =r$ )ÚSplinterAttentioné¶   c                 ób   >• [         TU ]  5         [        U5      U l        [	        U5      U l        g r‘   )r&   r'   rt   r<   r”   Úoutputr;   s     €r?   r'   ÚSplinterAttention.__init__·   s&   ø€ Ü‰ÑÔÜ)¨&Ó1ˆŒ	Ü(¨Ó0ˆ�rA   Nrƒ   ra   ro   rE   c                 óZ   • UnU R                   " U4SU0UD6u  pU R                  X5      nU$ ©Nra   )r<   r§   )r<   rƒ   ra   ro   ÚresidualÚ_s         r?   rP   ÚSplinterAttention.forward¼   sE   € ð !ˆØŸ9š9Øñ
à)ð
ð ñ
Ñˆð
 Ÿ™ MÓ<ˆØÐrA   )r§   r<   r‘   )rR   rS   rT   rU   r'   r7   r’   rX   r   r   rP   rZ   r[   r\   s   @r?   r¤   r¤   ¶   sV   ø† õ1ð 48ñà—|‘|ðð ×)Ñ)¨DÑ0ðð Ð+Ñ,ð	ð
 
�‰÷ó rA   r¤   c                   ób   ^ • \ rS rSrU 4S jrS\R                  S\R                  4S jrSrU =r	$ )ÚSplinterIntermediateéÍ   c                 ó  >• [         TU ]  5         [        R                  " UR                  UR
                  5      U l        [        UR                  [        5      (       a  [        UR                     U l        g UR                  U l        g r‘   )r&   r'   r   r   r*   Úintermediate_sizer˜   Ú
isinstanceÚ
hidden_actÚstrr	   Úintermediate_act_fnr;   s     €r?   r'   ÚSplinterIntermediate.__init__Î   s`   ø€ Ü‰ÑÔÜ—Y’Y˜v×1Ñ1°6×3KÑ3KÓLˆŒ
Ü�f×'Ñ'¬×-Ñ-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$rA   rƒ   rE   c                 óJ   • U R                  U5      nU R                  U5      nU$ r‘   ©r˜   r¶   )r<   rƒ   s     r?   rP   ÚSplinterIntermediate.forwardÖ   s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐrA   r¹   r¡   r\   s   @r?   r¯   r¯   Í   s(   ø† õ9ð U§\¡\ð °e·l±l÷ ò rA   r¯   c                   óz   ^ • \ rS rSrU 4S jrS\R                  S\R                  S\R                  4S jrSrU =r	$ )ÚSplinterOutputéÝ   c                 ó(  >• [         TU ]  5         [        R                  " UR                  UR
                  5      U l        [        R                  " UR
                  UR                  S9U l        [        R                  " UR                  5      U l        g r—   )r&   r'   r   r   r²   r*   r˜   r1   r2   r3   r4   r5   r;   s     €r?   r'   ÚSplinterOutput.__init__Þ   s`   ø€ Ü‰ÑÔÜ—Y’Y˜v×7Ñ7¸×9KÑ9KÓLˆŒ
ÜŸš f×&8Ñ&8¸f×>SÑ>SÑTˆŒÜ—z’z &×"<Ñ"<Ó=ˆ�rA   rƒ   rš   rE   c                 óp   • U R                  U5      nU R                  U5      nU R                  X-   5      nU$ r‘   rœ   r�   s      r?   rP   ÚSplinterOutput.forwardä   rŸ   rA   r    r¡   r\   s   @r?   r¼   r¼   Ý   r¢   rA   r¼   c            	       ó–   ^ • \ rS rSrU 4S jr SS\R                  S\R                  S-  S\\	   S\R                  4S jjr
S	 rS
rU =r$ )ÚSplinterLayeréì   c                 ó²   >• [         TU ]  5         UR                  U l        SU l        [	        U5      U l        [        U5      U l        [        U5      U l	        g )Nr   )
r&   r'   Úchunk_size_feed_forwardÚseq_len_dimr¤   Ú	attentionr¯   Úintermediater¼   r§   r;   s     €r?   r'   ÚSplinterLayer.__init__í   sI   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ*¨6Ó2ˆŒÜ0°Ó8ˆÔÜ$ VÓ,ˆ�rA   Nrƒ   ra   ro   rE   c                 óˆ   • U R                   " U4SU0UD6n[        U R                  U R                  U R                  U5      nU$ rª   )rÈ   r   Úfeed_forward_chunkrÆ   rÇ   )r<   rƒ   ra   ro   s       r?   rP   ÚSplinterLayer.forwardõ   sW   € ð ŸšØñ
à)ð
ð ñ
ˆô 2Ø×#Ñ# T×%AÑ%AÀ4×CSÑCSÐUbó
ˆð ÐrA   c                 óJ   • U R                  U5      nU R                  X!5      nU$ r‘   )rÉ   r§   )r<   Úattention_outputÚintermediate_outputÚlayer_outputs       r?   rÌ   Ú SplinterLayer.feed_forward_chunk  s)   € Ø"×/Ñ/Ð0@ÓAÐØ—{‘{Ð#6ÓIˆØÐrA   )rÈ   rÆ   rÉ   r§   rÇ   r‘   )rR   rS   rT   rU   r'   r7   r’   rX   r   r   rP   rÌ   rZ   r[   r\   s   @r?   rÃ   rÃ   ì   s[   ø† õ-ð 48ñà—|‘|ðð ×)Ñ)¨DÑ0ðð Ð+Ñ,ð	ð
 
�‰õ÷$ð rA   rÃ   c            	       ó|   ^ • \ rS rSrU 4S jr S
S\R                  S\R                  S-  S\\	   S\
4S jjrS	rU =r$ )ÚSplinterEncoderi  c                 óÖ   >• [         TU ]  5         Xl        [        R                  " [        UR                  5       Vs/ s H  n[        U5      PM     sn5      U l        SU l	        g s  snf )NF)
r&   r'   r=   r   Ú
ModuleListÚrangeÚnum_hidden_layersrÃ   ÚlayerÚgradient_checkpointing)r<   r=   Úir>   s      €r?   r'   ÚSplinterEncoder.__init__  sR   ø€ Ü‰ÑÔØŒÜ—]’]Ä5È×IaÑIaÔCbÓ#cÒCb¸a¤M°&Ö$9ÑCbÑ#cÓdˆŒ
Ø&+ˆÕ#ùò $ds   ½A&Nrƒ   ra   ro   rE   c                 óN   • U R                    H  nU" UU40 UD6nM     [        US9$ )N©Úlast_hidden_state)rÙ   r   )r<   rƒ   ra   ro   Úlayer_modules        r?   rP   ÚSplinterEncoder.forward  s>   € ð !ŸJœJˆLÙ(ØØñð ñŠMñ 'ô Ø+ñ
ð 	
rA   )r=   rÚ   rÙ   r‘   )rR   rS   rT   rU   r'   r7   r’   rX   r   r   r   rP   rZ   r[   r\   s   @r?   rÔ   rÔ     sR   ø† õ,ð 48ñ
à—|‘|ð
ð ×)Ñ)¨DÑ0ð
ð Ð+Ñ,ð	
ð
 
÷
ó 
rA   rÔ   c                   óF   ^ • \ rS rSr% \\S'   SrSr\\	S.r
U 4S jrSrU =r$ )ÚSplinterPreTrainedModeli'  r=   ÚsplinterT)rƒ   Ú
attentionsc                 ó  >• [         TU ]  U5        [        U[        5      (       a\  [        R
                  " UR                  [        R                  " UR                  R                  S   5      R                  S5      5        g g )Nr$   r#   )r&   Ú_init_weightsr³   r   ÚinitÚcopy_r:   r7   r8   r†   r9   )r<   r]   r>   s     €r?   rç   Ú%SplinterPreTrainedModel._init_weights1  s^   ø€ Ü‰Ñ˜fÔ%Ü�fÔ0×1Ñ1Ü�JŠJ�v×*Ñ*¬E¯LªL¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÕhð 2rA   © )rR   rS   rT   rU   r   Ú__annotations__Úbase_model_prefixÚsupports_gradient_checkpointingrÃ   rt   Ú_can_record_outputsrç   rZ   r[   r\   s   @r?   rã   rã   '  s/   ø‡ àÓØ"ÐØ&*Ð#à&Ø+ñÐ÷
ió irA   rã   c                   ó  ^ • \ rS rSrSrU 4S jrS rS r\\	\
     SS\R                  S-  S\R                  S-  S	\R                  S-  S
\R                  S-  S\R                  S-  S\\   S\\-  4S jj5       5       5       rSrU =r$ )ÚSplinterModeli7  a"  
The model is an encoder (with only self-attention) following the architecture described in [Attention is all you
need](https://huggingface.co/papers/1706.03762) by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones,
Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin.
c                 ó�   >• [         TU ]  U5        Xl        [        U5      U l        [        U5      U l        U R                  5         g r‘   )r&   r'   r=   r   rO   rÔ   ÚencoderÚ	post_initr;   s     €r?   r'   ÚSplinterModel.__init__?  s9   ø€ Ü‰Ñ˜Ô ØŒä,¨VÓ4ˆŒÜ& vÓ.ˆŒð 	�‰ÕrA   c                 ó.   • U R                   R                  $ r‘   ©rO   r,   )r<   s    r?   Úget_input_embeddingsÚ"SplinterModel.get_input_embeddingsI  s   € Ø�‰×.Ñ.Ð.rA   c                 ó$   • XR                   l        g r‘   r÷   )r<   r`   s     r?   Úset_input_embeddingsÚ"SplinterModel.set_input_embeddingsL  s   € Ø*/�‰Õ'rA   NrB   ra   rC   r:   rD   ro   rE   c                 ó  • Ub  Ub  [        S5      eUb"  U R                  X5        UR                  5       nO"Ub  UR                  5       SS nO[        S5      eUu  p‰Ub  UR                  OUR                  n
Uc  [        R
                  " X‰4U
S9nUc$  [        R                  " U[        R                  U
S9nU R                  UUUUS9n[        U R                  UUS9nU R                  " U4S	U0UD6nUS
   n[        US9$ )a‹  
token_type_ids (`torch.LongTensor` of shape `batch_size, sequence_length`, *optional*):
    Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
    1]`:

    - 0 corresponds to a *sentence A* token,
    - 1 corresponds to a *sentence B* token.

    [What are token type IDs?](../glossary#token-type-ids)
position_ids (`torch.LongTensor` of shape `batch_size, sequence_length`, *optional*):
    Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
    config.max_position_embeddings - 1]`.

    [What are position IDs?](../glossary#position-ids)
NzDYou cannot specify both input_ids and inputs_embeds at the same timer$   z5You have to specify either input_ids or inputs_embeds©rI   rG   )rB   r:   rC   rD   )r=   rD   ra   ra   r   rÞ   )r{   Ú%warn_if_padding_and_no_attention_maskrJ   rI   r7   ÚonesrK   rL   rO   r
   r=   ró   r   )r<   rB   ra   rC   r:   rD   ro   rM   Ú
batch_sizerN   rI   Úembedding_outputÚencoder_outputsÚsequence_outputs                 r?   rP   ÚSplinterModel.forwardO  s1  € ð6 Ñ  ]Ñ%>ÜÐcÓdÐdØÑ"Ø×6Ñ6°yÔQØ#Ÿ.™.Ó*‰KØÑ&Ø'×,Ñ,Ó.¨s°Ð3‰KäÐTÓUÐUà!,Ñˆ
Ø%.Ñ%:�×!Ò!À×@TÑ@TˆàÑ!Ü"ŸZšZ¨*Ð)AÈ6ÑRˆNØÑ!Ü"Ÿ[š[¨¼E¿J¹JÈvÑVˆNàŸ?™?ØØ%Ø)Ø'ð	 +ð 
Ðô 3Ø—;‘;Ø*Ø)ñ
ˆð Ÿ,š,Øñ
à)ð
ð ñ
ˆð
 *¨!Ñ,ˆäØ-ñ
ð 	
rA   )r=   rO   ró   )NNNNN)rR   rS   rT   rU   rV   r'   rø   rû   r   r   r   r7   r’   r   r   rY   r   rP   rZ   r[   r\   s   @r?   rñ   rñ   7  sÑ   ø† ñõò/ò0ð  ØØð *.Ø.2Ø.2Ø,0Ø-1ñ@
à—<‘< $Ñ&ð@
ð Ÿ™ tÑ+ð@
ð Ÿ™ tÑ+ð	@
ð
 —l‘l TÑ)ð@
ð —|‘| dÑ*ð@
ð Ð+Ñ,ð@
ð 
�Ñ	 ô@
ó ó ó  ö@
rA   rñ   c                   óf   ^ • \ rS rSrSU 4S jjrS\R                  S\R                  4S jrSrU =r	$ )ÚSplinterFullyConnectedLayeri•  c                 ó   >• [         TU ]  5         Xl        X l        [        R
                  " U R                  U R                  5      U l        [        U   U l        [        R                  " U R                  5      U l	        g r‘   )
r&   r'   Ú	input_dimÚ
output_dimr   r   r˜   r	   Úact_fnr1   )r<   r	  r
  r´   r>   s       €r?   r'   Ú$SplinterFullyConnectedLayer.__init__–  sR   ø€ Ü‰ÑÔà"ŒØ$Œä—Y’Y˜tŸ~™~¨t¯©Ó?ˆŒ
Ü˜ZÑ(ˆŒÜŸš d§o¡oÓ6ˆ�rA   ÚinputsrE   c                 ól   • U R                  U5      nU R                  U5      nU R                  U5      nU$ r‘   )r˜   r  r1   )r<   r  rƒ   s      r?   rP   Ú#SplinterFullyConnectedLayer.forward   s2   € ØŸ
™
 6Ó*ˆØŸ™ MÓ2ˆØŸ™ }Ó5ˆØÐrA   )r1   r  r˜   r	  r
  )Úgelur¡   r\   s   @r?   r  r  •  s(   ø† ÷7ð˜eŸl™lð ¨u¯|©|÷ ò rA   r  c                   ó2   ^ • \ rS rSrSrU 4S jrS rSrU =r$ )ÚQuestionAwareSpanSelectionHeadi§  z^
Implementation of Question-Aware Span Selection (QASS) head, described in Splinter's paper:

c                 ó  >• [         TU ]  5         [        UR                  UR                  5      U l        [        UR                  UR                  5      U l        [        UR                  UR                  5      U l        [        UR                  UR                  5      U l        [        R                  " UR                  UR                  SS9U l
        [        R                  " UR                  UR                  SS9U l        g )NF)Úbias)r&   r'   r  r*   Úquery_start_transformÚquery_end_transformÚstart_transformÚend_transformr   r   Ústart_classifierÚend_classifierr;   s     €r?   r'   Ú'QuestionAwareSpanSelectionHead.__init__­  sÀ   ø€ Ü‰ÑÔä%@À×ASÑASÐU[×UgÑUgÓ%hˆÔ"Ü#>¸v×?QÑ?QÐSY×SeÑSeÓ#fˆÔ Ü:¸6×;MÑ;MÈv×OaÑOaÓbˆÔÜ8¸×9KÑ9KÈV×M_ÑM_Ó`ˆÔä "§	¢	¨&×*<Ñ*<¸f×>PÑ>PÐW\Ñ ]ˆÔÜ Ÿiši¨×(:Ñ(:¸F×<NÑ<NÐUZÑ[ˆÕrA   c                 ó  • UR                  5       u    p4UR                  S5      R                  SSU5      n[        R                  " USUS9nU R                  U5      nU R                  U5      nU R                  U5      n	U R                  U5      n
U R                  U5      nU	R                  SSS5      n	[        R                  " X¹5      nU R                  U5      nU
R                  SSS5      n
[        R                  " Xº5      nXÍ4$ )Nr$   r   )re   Úindexr   rd   )rJ   Ú	unsqueezeÚrepeatr7   Úgatherr  r  r  r  r  Úpermuterh   r  )r<   r  Ú	positionsr¬   re   r  Úgathered_repsÚquery_start_repsÚquery_end_repsÚ
start_repsÚend_repsrƒ   Ústart_logitsÚ
end_logitss                 r?   rP   Ú&QuestionAwareSpanSelectionHead.forward¸  sñ   € Ø—K‘K“M‰	ˆˆ1Ø×#Ñ# BÓ'×.Ñ.¨q°!°SÓ9ˆÜŸš V°¸%Ñ@ˆà×5Ñ5°mÓDÐØ×1Ñ1°-Ó@ˆØ×)Ñ)¨&Ó1ˆ
Ø×%Ñ% fÓ-ˆà×-Ñ-Ð.>Ó?ˆØ×'Ñ'¨¨1¨aÓ0ˆ
Ü—|’| MÓ>ˆà×+Ñ+¨NÓ;ˆØ×#Ñ# A q¨!Ó,ˆÜ—\’\ -Ó:ˆ
àÐ'Ð'rA   )r  r  r  r  r  r  )	rR   rS   rT   rU   rV   r'   rP   rZ   r[   r\   s   @r?   r  r  §  s   ø† ñõ
	\÷(ð (rA   r  c                   ó^  ^ • \ rS rSrU 4S jr\\        SS\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S	\R                  S-  S
\R                  S-  S\R                  S-  S\
\   S\\-  4S jj5       5       rSrU =r$ )ÚSplinterForQuestionAnsweringiÍ  c                 ó¦   >• [         TU ]  U5        [        U5      U l        [	        U5      U l        UR                  U l        U R                  5         g r‘   ©r&   r'   rñ   rä   r  Úsplinter_qassÚquestion_token_idrô   r;   s     €r?   r'   Ú%SplinterForQuestionAnswering.__init__Ï  óC   ø€ Ü‰Ñ˜Ô ä% fÓ-ˆŒÜ;¸FÓCˆÔØ!'×!9Ñ!9ˆÔð 	�‰ÕrA   NrB   ra   rC   r:   rD   Ústart_positionsÚend_positionsÚquestion_positionsro   rE   c	                 ó„  • Sn
Uc   UbB  [         R                  " [         R                  " XR                  5      R	                  5       SS9nOH[         R
                  " UR                  S5      [         R                  UR                  UR                  S9nUR                  S5      nSn
U R                  " U4UUUUS.U	D6nUS   nU R                  XØ5      u  pïU
(       a!  UR                  S	5      UR                  S	5      pþUbf  US	U-
  [         R                  " UR                  5      R                   -  -   nUS	U-
  [         R                  " UR                  5      R                   -  -   nSnUbµ  Ub²  [#        UR                  5       5      S	:”  a  UR                  S5      n[#        UR                  5       5      S	:”  a  UR                  S5      nUR                  S	5      nUR%                  SU5        UR%                  SU5        ['        US
9nU" Xæ5      nU" X÷5      nUU-   S-  n[)        UUUUR*                  UR,                  S9$ )aI  
token_type_ids (`torch.LongTensor` of shape `batch_size, sequence_length`, *optional*):
    Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
    1]`:

    - 0 corresponds to a *sentence A* token,
    - 1 corresponds to a *sentence B* token.

    [What are token type IDs?](../glossary#token-type-ids)
position_ids (`torch.LongTensor` of shape `batch_size, sequence_length`, *optional*):
    Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
    config.max_position_embeddings - 1]`.

    [What are position IDs?](../glossary#position-ids)
question_positions (`torch.LongTensor` of shape `(batch_size, num_questions)`, *optional*):
    The positions of all question tokens. If given, start_logits and end_logits will be of shape `(batch_size,
    num_questions, sequence_length)`. If None, the first question token in each sequence in the batch will be
    the only one for which start_logits and end_logits are calculated and they will be of shape `(batch_size,
    sequence_length)`.
FNr$   )re   r   )rH   ÚlayoutrI   T©ra   rC   r:   rD   r   ©Úignore_indexrd   ©Úlossr(  r)  rƒ   rå   )r7   ÚargmaxÚeqr0  r|   rK   rJ   rL   r7  rI   r  rä   r/  ÚsqueezeÚfinforH   ÚminÚlenÚclamp_r   r   rƒ   rå   )r<   rB   ra   rC   r:   rD   r3  r4  r5  ro   Úquestion_positions_were_noneÚ"question_position_for_each_exampleÚoutputsr  r(  r)  Ú
total_lossÚignored_indexÚloss_fctÚ
start_lossÚend_losss                        r?   rP   Ú$SplinterForQuestionAnswering.forwardÙ  s7  € ðD (-Ð$ØÑ%ØÑ$Ü5:·\²\Ü—X’X˜i×)?Ñ)?Ó@×EÑEÓGÈRñ6Ñ2ô 6;·[²[Ø!×&Ñ& qÓ)´·±ÀM×DXÑDXÐan×auÑauñ6Ð2ð "D×!MÑ!MÈbÓ!QÐØ+/Ð(à—-’-Øð
à)Ø)Ø%Ø'ñ
ð ñ
ˆð " !™*ˆØ#'×#5Ñ#5°oÓ#ZÑ ˆæ'Ø'3×';Ñ';¸AÓ'>À
×@RÑ@RÐSTÓ@U˜*àÑ%Ø'¨1¨~Ñ+=ÄÇÂÈ\×M_ÑM_ÓA`×AdÑAdÑ*dÑdˆLØ# q¨>Ñ'9¼U¿[º[È×IYÑIYÓ=Z×=^Ñ=^Ñ&^Ñ^ˆJàˆ
ØÑ&¨=Ñ+Dä�?×'Ñ'Ó)Ó*¨QÓ.Ø"1×"9Ñ"9¸"Ó"=�Ü�=×%Ñ%Ó'Ó(¨1Ó,Ø -× 5Ñ 5°bÓ 9�à(×-Ñ-¨aÓ0ˆMØ×"Ñ" 1 mÔ4Ø× Ñ   MÔ2ä'°]ÑCˆHÙ! ,Ó@ˆJÙ 
Ó:ˆHØ$ xÑ/°1Ñ4ˆJä+ØØ%Ø!Ø!×/Ñ/Ø×)Ñ)ñ
ð 	
rA   ©r0  rä   r/  ©NNNNNNNN)rR   rS   rT   rU   r'   r   r   r7   r’   rW   r   r   rY   r   rP   rZ   r[   r\   s   @r?   r,  r,  Í  s  ø† õð Øð *.Ø.2Ø.2Ø,0Ø-1Ø37Ø15Ø6:ñW
à—<‘< $Ñ&ðW
ð Ÿ™ tÑ+ðW
ð Ÿ™ tÑ+ð	W
ð
 —l‘l TÑ)ðW
ð —|‘| dÑ*ðW
ð ×)Ñ)¨DÑ0ðW
ð ×'Ñ'¨$Ñ.ðW
ð "×,Ñ,¨tÑ3ðW
ð Ð+Ñ,ðW
ð 
Ð-Ñ	-ôW
ó ó öW
rA   r,  zB
    Class for outputs of Splinter as a span selection model.
    )Úcustom_introc                   óî   • \ rS rSr% SrSr\R                  S-  \S'   Sr	\R                  S-  \S'   Sr
\R                  S-  \S'   Sr\\R                     S-  \S'   Sr\\R                     S-  \S'   S	rg)
ÚSplinterForPreTrainingOutputi5  aÏ  
loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when start and end positions are provided):
    Total span extraction loss is the sum of a Cross-Entropy for the start and end positions.
start_logits (`torch.FloatTensor` of shape `(batch_size, num_questions, sequence_length)`):
    Span-start scores (before SoftMax).
end_logits (`torch.FloatTensor` of shape `(batch_size, num_questions, sequence_length)`):
    Span-end scores (before SoftMax).
Nr<  r(  r)  rƒ   rå   rë   )rR   rS   rT   rU   rV   r<  r7   rX   rì   r(  r)  rƒ   rY   rå   rZ   rë   rA   r?   rQ  rQ  5  s|   ‡ ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø-1€L�%×#Ñ# dÑ*Ó1Ø+/€J�×!Ñ! DÑ(Ó/Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ö6rA   rQ  zý
    Splinter Model for the recurring span selection task as done during the pretraining. The difference to the QA task
    is that we do not have a question, but multiple question tokens that replace the occurrences of recurring spans
    instead.
    c                   ó˜  ^ • \ rS rSrU 4S jr\\        SS\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S	\R                  S-  S
\R                  S-  S\R                  S-  S\
\   S\\-  4S jj5       5       rS\R                  S\R                  4S jrSrU =r$ )ÚSplinterForPreTrainingiL  c                 ó¦   >• [         TU ]  U5        [        U5      U l        [	        U5      U l        UR                  U l        U R                  5         g r‘   r.  r;   s     €r?   r'   ÚSplinterForPreTraining.__init__T  r2  rA   NrB   ra   rC   r:   rD   r3  r4  r5  ro   rE   c	                 ó  • Uc  Ub  Ub  [        S5      eUc  Uc  [        S5      eUc  U R                  U5      nU R                  " U4UUUUS.U	D6n
U
S   nUR                  5       u  pÍnU R	                  X¸5      u  nnUR                  S5      nUbˆ  UR                  S5      R                  UUU5      nUSU-
  [        R                  " UR                  5      R                  -  -   nUSU-
  [        R                  " UR                  5      R                  -  -   nSnUbÂ  Ub¿  UR                  S[        SUS-
  5      5        UR                  S[        SUS-
  5      5        [        U R                  R                  S9nU" UR!                  UU-  U5      UR!                  UU-  5      5      nU" UR!                  UU-  U5      UR!                  UU-  5      5      nUU-   S-  n[#        UUUU
R$                  U
R&                  S	9$ )
a
  
input_ids (`torch.LongTensor` of shape `(batch_size, num_questions, sequence_length)`):
    Indices of input sequence tokens in the vocabulary.

    Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
    [`PreTrainedTokenizer.__call__`] for details.

    [What are input IDs?](../glossary#input-ids)
token_type_ids (`torch.LongTensor` of shape `batch_size, num_questions, sequence_length`, *optional*):
    Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
    1]`:

    - 0 corresponds to a *sentence A* token,
    - 1 corresponds to a *sentence B* token.

    [What are token type IDs?](../glossary#token-type-ids)
position_ids (`torch.LongTensor` of shape `batch_size, num_questions, sequence_length`, *optional*):
    Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
    config.max_position_embeddings - 1]`.

    [What are position IDs?](../glossary#position-ids)
inputs_embeds (`torch.FloatTensor` of shape `(batch_size, num_questions, sequence_length, hidden_size)`, *optional*):
    Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
    is useful if you want more control over how to convert *input_ids* indices into associated vectors than the
    model's internal embedding lookup matrix.
start_positions (`torch.LongTensor` of shape `(batch_size, num_questions)`, *optional*):
    Labels for position (index) of the start of the labelled span for computing the token classification loss.
    Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence
    are not taken into account for computing the loss.
end_positions (`torch.LongTensor` of shape `(batch_size, num_questions)`, *optional*):
    Labels for position (index) of the end of the labelled span for computing the token classification loss.
    Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence
    are not taken into account for computing the loss.
question_positions (`torch.LongTensor` of shape `(batch_size, num_questions)`, *optional*):
    The positions of all question tokens. If given, start_logits and end_logits will be of shape `(batch_size,
    num_questions, sequence_length)`. If None, the first question token in each sequence in the batch will be
    the only one for which start_logits and end_logits are calculated and they will be of shape `(batch_size,
    sequence_length)`.
NzCquestion_positions must be specified in order to calculate the lossz?question_positions must be specified when inputs_embeds is usedr8  r   r   r9  rd   r;  )Ú	TypeErrorÚ_prepare_question_positionsrä   rJ   r/  r  r9   r7   r@  rH   rA  rC  Úmaxr   r=   r+   r‡   rQ  rƒ   rå   )r<   rB   ra   rC   r:   rD   r3  r4  r5  ro   rF  r  r  Úsequence_lengthre   r(  r)  Únum_questionsÚ attention_mask_for_each_questionrG  rI  rJ  rK  s                          r?   rP   ÚSplinterForPreTraining.forward^  s=  € ðj Ñ%¨/Ñ*EÈ-ÑJcÜÐaÓbÐbàÑ'¨IÑ,=ÜÐ]Ó^Ð^àÑ'Ø!%×!AÑ!AÀ)Ó!LÐà—-’-Øð
à)Ø)Ø%Ø'ñ
ð ñ
ˆð " !™*ˆØ+:×+?Ñ+?Ó+AÑ(ˆ
 Sà#'×#5Ñ#5°oÓ#ZÑ ˆ�jà*×/Ñ/°Ó2ˆØÑ%Ø/=×/GÑ/GÈÓ/J×/QÑ/QØ˜M¨?ó0Ð,ð (¨1Ð/OÑ+OÔSX×S^ÒS^Ð_k×_qÑ_qÓSr×SvÑSvÑ*vÑvˆLØ# qÐ+KÑ'KÌuÏ{Ê{Ð[e×[kÑ[kÓOl×OpÑOpÑ&pÑpˆJàˆ
àÑ&¨=Ñ+Dà×"Ñ" 1¤c¨!¨_¸qÑ-@Ó&AÔBØ× Ñ  ¤C¨¨?¸QÑ+>Ó$?Ô@ô (°T·[±[×5MÑ5MÑNˆHÙ!Ø×!Ñ! *¨}Ñ"<¸oÓNØ×$Ñ$ Z°-Ñ%?Ó@óˆJñ  Ø—‘ 
¨]Ñ :¸OÓLØ×"Ñ" :°Ñ#=Ó>óˆHð % xÑ/°1Ñ4ˆJä+ØØ%Ø!Ø!×/Ñ/Ø×)Ñ)ñ
ð 	
rA   c                 óB  • [         R                  " XR                  R                  :H  5      u  p#[         R                  " U5      n[        UR                  S5      UR                  S5      :H  S5        [         R                  " X"SS9n[         R                  " UR                  S5      UR                  S9U-
  n[         R                  " UR                  S5      UR                  5       4U R                  R                  [         R                  UR                  S9nX7X&4'   U$ )Nr   z?All samples in the batch must have at least one question token.Úleft)Úsiderþ   rG   )r7   Úwherer=   r0  Úbincountr   rJ   Úsearchsortedr8   rI   ÚfullrY  r+   rL   )r<   rB   ÚrowsÚflat_positionsr[  Ú	first_idxÚcolsr"  s           r?   rX  Ú2SplinterForPreTraining._prepare_question_positionsÐ  sá   € Ü$Ÿ{š{¨9¿¹×8UÑ8UÑ+UÓVÑˆÜŸš tÓ,ˆÜØ×Ñ˜qÓ! Y§^¡^°AÓ%6Ñ6ØMô	
ô
 ×&Ò& t¸Ñ?ˆ	Ü�|Š|˜DŸI™I a›L°·±Ñ=À	ÑIˆÜ—J’JØ�^‰^˜AÓ × 1Ñ 1Ó 3Ð4Ø�K‰K×$Ñ$Ü—*‘*Ø×#Ñ#ñ	
ˆ	ð !/�$�*ÑØÐrA   rM  rN  )rR   rS   rT   rU   r'   r   r   r7   r’   rW   r   r   rY   rQ  rP   rX  rZ   r[   r\   s   @r?   rS  rS  L  s'  ø† õð Øð *.Ø.2Ø.2Ø,0Ø-1Ø37Ø15Ø6:ñn
à—<‘< $Ñ&ðn
ð Ÿ™ tÑ+ðn
ð Ÿ™ tÑ+ð	n
ð
 —l‘l TÑ)ðn
ð —|‘| dÑ*ðn
ð ×)Ñ)¨DÑ0ðn
ð ×'Ñ'¨$Ñ.ðn
ð "×,Ñ,¨tÑ3ðn
ð Ð+Ñ,ðn
ð 
Ð-Ñ	-ôn
ó ó ðn
ð`°U·\±\ð ÀeÇlÁl÷ ò rA   rS  )r,  rS  rÃ   rñ   rã   )r…   )@rV   Úcollections.abcr   Údataclassesr   r7   r   Útorch.nnr   Ú r   rè   Úactivationsr	   Úmasking_utilsr
   Úmodeling_layersr   Úmodeling_outputsr   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úpytorch_utilsr   Úutilsr   r   r   r   r   Úutils.genericr   Úutils.output_capturingr   Úconfiguration_splinterr   Ú
get_loggerrR   ÚloggerÚModuler   r’   Úfloatrr   rt   r”   r¤   r¯   r¼   rÃ   rÔ   rã   rñ   r  r  r,  rQ  rS  Ú__all__rë   rA   r?   Ú<module>r~     s  ðñ å $Ý !ã Ý Ý %å &Ý !Ý 6Ý 9ß ZÑ Zß FÝ &Ý 6ß jÕ jÝ 7Ý 5Ý 2ð 
×	Ò	˜HÓ	%€ô-˜Ÿ™ô -ðp ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð õ%ô.3)˜BŸI™Iô 3)ôn˜Ÿ™ô ô˜Ÿ	™	ô ô.˜2Ÿ9™9ô ô �R—Y‘Yô ôÐ.ô ôD
�b—i‘iô 
ð2 ôi˜oó ió ðið ôZ
Ð+ó Z
ó ðZ
ôz "§)¡)ô ô$#( R§Y¡Yô #(ðL ôd
Ð#:ó d
ó ðd
ñN ðñð
 ô7 ;ó 7ó óð7ñ" ðñôNÐ4ó NóðNòb�rA   