Ë
    ÛÓ^jP¦  ã                   óê  — d Z ddlmZ ddlmZ ddlZddlmZ ddlmZm	Z	m
Z
 ddlmZ dd	lmZmZ  e«       rdd
l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m Z  ddl!m"Z" ddl#m$Z$ ddlm%Z% ddl&m'Z'  e%jP                  e)«      Z*d„ Z+d„ Z,d„ Z- G d„ dej\                  «      Z/ G d„ dej\                  «      Z0 G d„ dej\                  «      Z1 G d„ dej\                  «      Z2 G d„ dej\                  «      Z3 G d „ d!ej\                  «      Z4 G d"„ d#e«      Z5 G d$„ d%ej\                  «      Z6 G d&„ d'ej\                  «      Z7 G d(„ d)ej\                  «      Z8 G d*„ d+ej\                  «      Z9 G d,„ d-ej\                  «      Z: G d.„ d/ej\                  «      Z; G d0„ d1ej\                  «      Z<e G d2„ d3e"«      «       Z= ed4¬5«      e G d6„ d7e«      «       «       Z>e G d8„ d9e=«      «       Z? ed:¬5«       G d;„ d<e=«      «       Z@e G d=„ d>e=«      «       ZA ed?¬5«       G d@„ dAe=«      «       ZB edB¬5«       G dC„ dDe=«      «       ZCe G dE„ dFe=«      «       ZDe G dG„ dHe=«      «       ZEe G dI„ dJe=«      «       ZFg dK¢ZGy)LzPyTorch FNet model.é    )Ú	dataclass)ÚpartialN)Únn)ÚBCEWithLogitsLossÚCrossEntropyLossÚMSELossé   )Úinitialization)Úauto_docstringÚis_scipy_available)Úlinalg)ÚACT2FN)ÚGradientCheckpointingLayer)	ÚBaseModelOutputÚBaseModelOutputWithPoolingÚMaskedLMOutputÚModelOutputÚMultipleChoiceModelOutputÚNextSentencePredictorOutputÚQuestionAnsweringModelOutputÚSequenceClassifierOutputÚTokenClassifierOutput)ÚPreTrainedModel)Úapply_chunking_to_forward)Úloggingé   )Ú
FNetConfigc                 ó¤   — | j                   d   }|d|…d|…f   }| j                  t        j                  «      } t        j                  d| ||«      S )z4Applies 2D matrix multiplication to 3D input arrays.r   Nzbij,jk,ni->bnk)ÚshapeÚtypeÚtorchÚ	complex64Úeinsum)ÚxÚmatrix_dim_oneÚmatrix_dim_twoÚ
seq_lengths       úq/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/fnet/modeling_fnet.pyÚ_two_dim_matmulr)   5   sN   € à—‘˜‘€JØ# K Z K°°*°Ð$<Ñ=€NØ	�‰Œu�‰Ó€AÜ�<‰<Ð(¨!¨^¸^ÓLÐLó    c                 ó   — t        | ||«      S ©N)r)   )r$   r%   r&   s      r(   Útwo_dim_matmulr-   >   s   € Ü˜1˜n¨nÓ=Ð=r*   c                 ó˜   — | }t        t        | j                  «      dd «      D ]#  }t        j                  j	                  ||¬«      }Œ% |S )zÑ
    Applies n-dimensional Fast Fourier Transform (FFT) to input array.

    Args:
        x: Input n-dimensional array.

    Returns:
        n-dimensional Fourier transform of input n-dimensional array.
    r   N)Úaxis)ÚreversedÚrangeÚndimr!   Úfft)r$   Úoutr/   s      r(   Úfftnr5   C   sG   € ð €CÜœ˜qŸv™v› q rÐ*Ó+ò ,ˆÜ�i‰i�m‰m˜C dˆmÓ+‰ð,à€Jr*   c                   ó*   ‡ — e Zd ZdZˆ fd„Zdd„Zˆ xZS )ÚFNetEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                 óx  •— t         ‰| �  «        t        j                  |j                  |j
                  |j                  ¬«      | _        t        j                  |j                  |j
                  «      | _	        t        j                  |j                  |j
                  «      | _        t        j                  |j
                  |j                  ¬«      | _        t        j                  |j
                  |j
                  «      | _        t        j                   |j"                  «      | _        | j'                  dt)        j*                  |j                  «      j-                  d«      d¬«       | j'                  dt)        j.                  | j0                  j3                  «       t(        j4                  ¬«      d¬«       y )	N)Úpadding_idx©ÚepsÚposition_ids©r   éÿÿÿÿF)Ú
persistentÚtoken_type_ids©Údtype)Ú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ÚLinearÚ
projectionÚDropoutÚhidden_dropout_probÚdropoutÚregister_bufferr!   ÚarangeÚexpandÚzerosr<   ÚsizeÚlong©ÚselfÚconfigÚ	__class__s     €r(   rD   zFNetEmbeddings.__init__V   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ˆŒäŸ)™) F×$6Ñ$6¸×8JÑ8JÓKˆŒÜ—z‘z &×"<Ñ"<Ó=ˆŒð 	×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	ô 	
ð 	×ÑØœeŸk™k¨$×*;Ñ*;×*@Ñ*@Ó*BÌ%Ï*É*ÔUÐbgð 	õ 	
r*   c                 óX  — |�|j                  «       }n|j                  «       d d }|d   }|€| j                  d d …d |…f   }|€st        | d«      r-| j                  d d …d |…f   }|j	                  |d   |«      }|}n:t        j                  |t
        j                  | j                  j                  ¬«      }|€| j                  |«      }| j                  |«      }	||	z   }
| j                  |«      }|
|z  }
| j                  |
«      }
| j                  |
«      }
| j                  |
«      }
|
S )Nr>   r   r@   r   ©rB   Údevice)rY   r<   Úhasattrr@   rW   r!   rX   rZ   ra   rI   rM   rK   rN   rQ   rT   )r\   Ú	input_idsr@   r<   Úinputs_embedsÚinput_shaper'   Úbuffered_token_type_idsÚ buffered_token_type_ids_expandedrM   Ú
embeddingsrK   s               r(   ÚforwardzFNetEmbeddings.forwardj   s=  € ØÐ Ø#Ÿ.™.Ó*‰Kà'×,Ñ,Ó.¨s°Ð3ˆKà  ‘^ˆ
àÐØ×,Ñ,ªQ°°°¨^Ñ<ˆLð
 Ð!Ü�tÐ-Ô.Ø*.×*=Ñ*=ºaÀÀ*À¸nÑ*MÐ'Ø3J×3QÑ3QÐR]Ð^_ÑR`ÐblÓ3mÐ0Ø!A‘ä!&§¡¨[ÄÇ
Á
ÐSW×SdÑSd×SkÑSkÔ!l�àÐ Ø ×0Ñ0°Ó;ˆMØ $× :Ñ :¸>Ó JÐà"Ð%:Ñ:ˆ
à"×6Ñ6°|ÓDÐØÐ)Ñ)ˆ
Ø—^‘^ JÓ/ˆ
Ø—_‘_ ZÓ0ˆ
Ø—\‘\ *Ó-ˆ
ØÐr*   )NNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   ri   Ú__classcell__©r^   s   @r(   r7   r7   S   s   ø„ ÙQô
÷(!r*   r7   c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚFNetBasicFourierTransformc                 óD   •— t         ‰| �  «        | j                  |«       y r,   )rC   rD   Ú_init_fourier_transformr[   s     €r(   rD   z"FNetBasicFourierTransform.__init__�   s   ø€ Ü‰ÑÔØ×$Ñ$ VÕ,r*   c                 óœ  — |j                   s+t        t        j                  j                  d¬«      | _        y |j                  dk  rût        «       rÐ| j                  dt        j                  t        j                  |j                  «      t        j                  ¬«      «       | j                  dt        j                  t        j                  |j                  «      t        j                  ¬«      «       t        t        | j                   | j"                  ¬«      | _        y t%        j&                  d«       t        | _        y t        | _        y )	N)r   é   ©Údimé   Údft_mat_hiddenrA   Údft_mat_seq)r%   r&   zpSciPy is needed for DFT matrix calculation and is not found. Using TPU optimized fast fourier transform instead.)Úuse_tpu_fourier_optimizationsr   r!   r3   r5   Úfourier_transformrJ   r   rU   Útensorr   ÚdftrG   r"   Útpu_short_seq_lengthr-   rz   ry   r   Úwarning)r\   r]   s     r(   rs   z1FNetBasicFourierTransform._init_fourier_transform“   sè   € Ø×3Ò3Ü%,¬U¯Y©Y¯^©^ÀÔ%HˆDÕ"Ø×+Ñ+¨tÒ3Ü!Ô#Ø×$Ñ$Ø$¤e§l¡l´6·:±:¸f×>PÑ>PÓ3QÔY^×YhÑYhÔ&iôð ×$Ñ$Ø!¤5§<¡<´·
±
¸6×;VÑ;VÓ0WÔ_d×_nÑ_nÔ#oôô *1Ü"°4×3CÑ3CÐTX×TgÑTgô*�Õ&ô —‘ð*ôô *.�Õ&ä%)ˆDÕ"r*   c                 ó>   — | j                  |«      j                  }|fS r,   )r|   Úreal)r\   Úhidden_statesÚoutputss      r(   ri   z!FNetBasicFourierTransform.forwardª   s"   € ð ×(Ñ(¨Ó7×<Ñ<ˆØˆzÐr*   )rj   rk   rl   rD   rs   ri   rn   ro   s   @r(   rq   rq   Ž   s   ø„ ô-ò*ö.r*   rq   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetBasicOutputc                 ó‚   •— t         ‰| �  «        t        j                  |j                  |j
                  ¬«      | _        y ©Nr:   )rC   rD   r   rN   rG   rO   r[   s     €r(   rD   zFNetBasicOutput.__init__µ   s,   ø€ Ü‰ÑÔÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆ�r*   c                 ó.   — | j                  ||z   «      }|S r,   )rN   ©r\   rƒ   Úinput_tensors      r(   ri   zFNetBasicOutput.forward¹   s   € ØŸ™ |°mÑ'CÓDˆØÐr*   ©rj   rk   rl   rD   ri   rn   ro   s   @r(   r†   r†   ´   s   ø„ ôUör*   r†   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetFourierTransformc                 ób   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        y r,   )rC   rD   rq   r\   r†   Úoutputr[   s     €r(   rD   zFNetFourierTransform.__init__¿   s&   ø€ Ü‰ÑÔÜ-¨fÓ5ˆŒ	Ü% fÓ-ˆ�r*   c                 óX   — | j                  |«      }| j                  |d   |«      }|f}|S ©Nr   )r\   r�   )r\   rƒ   Úself_outputsÚfourier_outputr„   s        r(   ri   zFNetFourierTransform.forwardÄ   s1   € Ø—y‘y Ó/ˆØŸ™ \°!¡_°mÓDˆØ!Ð#ˆØˆr*   rŒ   ro   s   @r(   rŽ   rŽ   ¾   s   ø„ ô.ö
r*   rŽ   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚFNetIntermediatec                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        |j                  t        «      rt        |j                     | _        y |j                  | _        y r,   )rC   rD   r   rP   rG   Úintermediate_sizeÚdenseÚ
isinstanceÚ
hidden_actÚstrr   Úintermediate_act_fnr[   s     €r(   rD   zFNetIntermediate.__init__Í   s]   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3KÑ3KÓLˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r*   rƒ   Úreturnc                 óJ   — | j                  |«      }| j                  |«      }|S r,   )r™   r�   ©r\   rƒ   s     r(   ri   zFNetIntermediate.forwardÕ   s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr*   ©rj   rk   rl   rD   r!   ÚTensorri   rn   ro   s   @r(   r–   r–   Ì   s#   ø„ ô9ð U§\¡\ð °e·l±l÷ r*   r–   c                   ón   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  dej
                  fd„Zˆ xZS )Ú
FNetOutputc                 ó(  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        j                  |j
                  |j                  ¬«      | _        t        j                  |j                  «      | _        y rˆ   )rC   rD   r   rP   r˜   rG   r™   rN   rO   rR   rS   rT   r[   s     €r(   rD   zFNetOutput.__init__Ý   s`   ø€ Ü‰ÑÔÜ—Y‘Y˜v×7Ñ7¸×9KÑ9KÓLˆŒ
ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ—z‘z &×"<Ñ"<Ó=ˆ�r*   rƒ   r‹   rž   c                 ór   — | j                  |«      }| j                  |«      }| j                  ||z   «      }|S r,   )r™   rT   rN   rŠ   s      r(   ri   zFNetOutput.forwardã   s7   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØŸ™ }°|Ñ'CÓDˆØÐr*   r¡   ro   s   @r(   r¤   r¤   Ü   s1   ø„ ô>ð U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r*   r¤   c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )Ú	FNetLayerc                 ó²   •— t         ‰| �  «        |j                  | _        d| _        t	        |«      | _        t        |«      | _        t        |«      | _	        y ©Nr   )
rC   rD   Úchunk_size_feed_forwardÚseq_len_dimrŽ   Úfourierr–   Úintermediater¤   r�   r[   s     €r(   rD   zFNetLayer.__init__ë   sI   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ+¨FÓ3ˆŒÜ,¨VÓ4ˆÔÜ  Ó(ˆ�r*   c                 ó�   — | j                  |«      }|d   }t        | j                  | j                  | j                  |«      }|f}|S r’   )r­   r   Úfeed_forward_chunkr«   r¬   )r\   rƒ   Úself_fourier_outputsr”   Úlayer_outputr„   s         r(   ri   zFNetLayer.forwardó   sO   € Ø#Ÿ|™|¨MÓ:ÐØ-¨aÑ0ˆä0Ø×#Ñ# T×%AÑ%AÀ4×CSÑCSÐUcó
ˆð  �/ˆàˆr*   c                 óL   — | j                  |«      }| j                  ||«      }|S r,   )r®   r�   )r\   r”   Úintermediate_outputr²   s       r(   r°   zFNetLayer.feed_forward_chunkÿ   s*   € Ø"×/Ñ/°Ó?ÐØ—{‘{Ð#6¸ÓGˆØÐr*   )rj   rk   rl   rD   ri   r°   rn   ro   s   @r(   r¨   r¨   ê   s   ø„ ô)ò
ör*   r¨   c                   ó&   ‡ — e Zd Zˆ fd„Zdd„Zˆ xZS )ÚFNetEncoderc                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w )NF)
rC   rD   r]   r   Ú
ModuleListr1   Únum_hidden_layersr¨   ÚlayerÚgradient_checkpointing)r\   r]   Ú_r^   s      €r(   rD   zFNetEncoder.__init__  sN   ø€ Ü‰ÑÔØˆŒÜ—]‘]¼uÀV×E]ÑE]Ó?^Ö#_¸!¤I¨fÕ$5Ò#_Ó`ˆŒ
Ø&+ˆÕ#ùò $`s   ½A#c                 óÈ   — |rdnd }t        | j                  «      D ]  \  }}|r||fz   } ||«      }|d   }Œ |r||fz   }|st        d„ ||fD «       «      S t        ||¬«      S )N© r   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr,   r¾   )Ú.0Úvs     r(   ú	<genexpr>z&FNetEncoder.forward.<locals>.<genexpr>  s   è ø€ ÒX˜qÈ!É-œÑXùs   ‚Š)Úlast_hidden_staterƒ   )Ú	enumeraterº   Útupler   )r\   rƒ   Úoutput_hidden_statesÚreturn_dictÚall_hidden_statesÚiÚlayer_moduleÚlayer_outputss           r(   ri   zFNetEncoder.forward  sˆ   € Ù"6™B¸DÐä(¨¯©Ó4ò 	-‰OˆAˆ|Ù#Ø$5¸Ð8HÑ$HÐ!á(¨Ó7ˆMà)¨!Ñ,‰Mð	-ñ  Ø 1°]Ð4DÑ DÐáÜÑX ]Ð4EÐ$FÔXÓXÐXä°ÐN_Ô`Ð`r*   )FTrŒ   ro   s   @r(   r¶   r¶     s   ø„ ô,÷ar*   r¶   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )Ú
FNetPoolerc                 ó²   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  «       | _        y r,   )rC   rD   r   rP   rG   r™   ÚTanhÚ
activationr[   s     €r(   rD   zFNetPooler.__init__"  s9   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
ÜŸ'™'›)ˆ�r*   rƒ   rž   c                 ó\   — |d d …df   }| j                  |«      }| j                  |«      }|S r’   )r™   rÐ   )r\   rƒ   Úfirst_token_tensorÚpooled_outputs       r(   ri   zFNetPooler.forward'  s6   € ð +ª1¨a¨4Ñ0ÐØŸ
™
Ð#5Ó6ˆØŸ™¨Ó6ˆØÐr*   r¡   ro   s   @r(   rÍ   rÍ   !  s#   ø„ ô$ð
 U§\¡\ð °e·l±l÷ r*   rÍ   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚFNetPredictionHeadTransformc                 óh  •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        |j                  t        «      rt        |j                     | _
        n|j                  | _
        t        j                  |j                  |j                  ¬«      | _        y rˆ   )rC   rD   r   rP   rG   r™   rš   r›   rœ   r   Útransform_act_fnrN   rO   r[   s     €r(   rD   z$FNetPredictionHeadTransform.__init__2  s{   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü�f×'Ñ'¬Ô-Ü$*¨6×+<Ñ+<Ñ$=ˆDÕ!à$*×$5Ñ$5ˆDÔ!ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆ�r*   rƒ   rž   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r,   )r™   r×   rN   r    s     r(   ri   z#FNetPredictionHeadTransform.forward;  s4   € ØŸ
™
 =Ó1ˆØ×-Ñ-¨mÓ<ˆØŸ™ }Ó5ˆØÐr*   r¡   ro   s   @r(   rÕ   rÕ   1  s$   ø„ ôUð U§\¡\ð °e·l±l÷ r*   rÕ   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetLMPredictionHeadc                 ó  •— t         ‰| �  «        t        |«      | _        t	        j
                  |j                  |j                  «      | _        t	        j                  t        j                  |j                  «      «      | _        y r,   )rC   rD   rÕ   Ú	transformr   rP   rG   rF   ÚdecoderÚ	Parameterr!   rX   Úbiasr[   s     €r(   rD   zFNetLMPredictionHead.__init__C  sW   ø€ Ü‰ÑÔÜ4°VÓ<ˆŒÜ—y‘y ×!3Ñ!3°V×5FÑ5FÓGˆŒÜ—L‘L¤§¡¨V×->Ñ->Ó!?Ó@ˆ�	r*   c                 óJ   — | j                  |«      }| j                  |«      }|S r,   )rÜ   rÝ   r    s     r(   ri   zFNetLMPredictionHead.forwardI  s$   € ØŸ™ }Ó5ˆØŸ™ ]Ó3ˆØÐr*   rŒ   ro   s   @r(   rÚ   rÚ   B  s   ø„ ôAör*   rÚ   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetOnlyMLMHeadc                 óB   •— t         ‰| �  «        t        |«      | _        y r,   )rC   rD   rÚ   Úpredictionsr[   s     €r(   rD   zFNetOnlyMLMHead.__init__P  s   ø€ Ü‰ÑÔÜ/°Ó7ˆÕr*   c                 ó(   — | j                  |«      }|S r,   )rä   )r\   Úsequence_outputÚprediction_scoress      r(   ri   zFNetOnlyMLMHead.forwardT  s   € Ø ×,Ñ,¨_Ó=ÐØ Ð r*   rŒ   ro   s   @r(   râ   râ   O  s   ø„ ô8ö!r*   râ   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetOnlyNSPHeadc                 ól   •— t         ‰| �  «        t        j                  |j                  d«      | _        y ©Nru   )rC   rD   r   rP   rG   Úseq_relationshipr[   s     €r(   rD   zFNetOnlyNSPHead.__init__[  s'   ø€ Ü‰ÑÔÜ "§	¡	¨&×*<Ñ*<¸aÓ @ˆÕr*   c                 ó(   — | j                  |«      }|S r,   )rì   )r\   rÓ   Úseq_relationship_scores      r(   ri   zFNetOnlyNSPHead.forward_  s   € Ø!%×!6Ñ!6°}Ó!EÐØ%Ð%r*   rŒ   ro   s   @r(   ré   ré   Z  s   ø„ ôAö&r*   ré   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFNetPreTrainingHeadsc                 óŒ   •— t         ‰| �  «        t        |«      | _        t	        j
                  |j                  d«      | _        y rë   )rC   rD   rÚ   rä   r   rP   rG   rì   r[   s     €r(   rD   zFNetPreTrainingHeads.__init__f  s4   ø€ Ü‰ÑÔÜ/°Ó7ˆÔÜ "§	¡	¨&×*<Ñ*<¸aÓ @ˆÕr*   c                 óN   — | j                  |«      }| j                  |«      }||fS r,   )rä   rì   )r\   ræ   rÓ   rç   rî   s        r(   ri   zFNetPreTrainingHeads.forwardk  s0   € Ø ×,Ñ,¨_Ó=ÐØ!%×!6Ñ!6°}Ó!EÐØ Ð"8Ð8Ð8r*   rŒ   ro   s   @r(   rð   rð   e  s   ø„ ôAö
9r*   rð   c                   ó2   ‡ — e Zd ZU eed<   dZdZˆ fd„Zˆ xZS )ÚFNetPreTrainedModelr]   ÚfnetTc                 ó6  •— t         ‰| �  |«       t        |t        «      ryt	        j
                  |j                  t        j                  |j                  j                  d   «      j                  d«      «       t	        j                  |j                  «       y y )Nr>   r=   )rC   Ú_init_weightsrš   r7   ÚinitÚcopy_r<   r!   rV   r   rW   Úzeros_r@   )r\   Úmoduler^   s     €r(   r÷   z!FNetPreTrainedModel._init_weightsw  sl   ø€ Ü‰Ñ˜fÔ%Ü�fœnÔ-Ü�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÔhÜ�K‰K˜×-Ñ-Õ.ð .r*   )	rj   rk   rl   r   Ú__annotations__Úbase_model_prefixÚsupports_gradient_checkpointingr÷   rn   ro   s   @r(   rô   rô   q  s   ø… àÓØÐØ&*Ð#÷/ð /r*   rô   z0
    Output type of [`FNetForPreTraining`].
    )Úcustom_introc                   ó¸   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
eej                     dz  ed<   y)ÚFNetForPreTrainingOutputa–  
    loss (*optional*, returned when `labels` is provided, `torch.FloatTensor` of shape `(1,)`):
        Total loss as the sum of the masked language modeling loss and the next sequence prediction
        (classification) loss.
    prediction_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`):
        Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
    seq_relationship_logits (`torch.FloatTensor` of shape `(batch_size, 2)`):
        Prediction scores of the next sequence prediction (classification) head (scores of True/False continuation
        before SoftMax).
    NÚlossÚprediction_logitsÚseq_relationship_logitsrƒ   )rj   rk   rl   rm   r  r!   ÚFloatTensorrü   r  r  rƒ   rÅ   r¾   r*   r(   r  r  ~  sd   … ñ	ð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø26Ð�u×(Ñ(¨4Ñ/Ó6Ø8<Ð˜U×.Ñ.°Ñ5Ó<Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ô9r*   r  c                   óæ   ‡ — e Zd ZdZdˆ fd„	Zd„ Zd„ Ze	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  d	ej                  dz  d
edz  dedz  deez  fd„«       Zˆ xZS )Ú	FNetModelzø

    The model can behave as an encoder, following the architecture described in [FNet: Mixing Tokens with Fourier
    Transforms](https://huggingface.co/papers/2105.03824) by James Lee-Thorp, Joshua Ainslie, Ilya Eckstein, Santiago Ontanon.

    c                 óº   •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        |rt        |«      nd| _        | j                  «        y)zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        N)
rC   rD   r]   r7   rh   r¶   ÚencoderrÍ   ÚpoolerÚ	post_init)r\   r]   Úadd_pooling_layerr^   s      €r(   rD   zFNetModel.__init__Ÿ  sM   ø€ ô
 	‰Ñ˜Ô ØˆŒä(¨Ó0ˆŒÜ" 6Ó*ˆŒá,=”j Ô(À4ˆŒð 	�‰Õr*   c                 ó.   — | j                   j                  S r,   ©rh   rI   ©r\   s    r(   Úget_input_embeddingszFNetModel.get_input_embeddings¯  s   € Ø�‰×.Ñ.Ð.r*   c                 ó&   — || j                   _        y r,   r  )r\   Úvalues     r(   Úset_input_embeddingszFNetModel.set_input_embeddings²  s   € Ø*/ˆ�‰Õ'r*   Nrc   r@   r<   rd   rÆ   rÇ   rž   c                 ó|  — |�|n| j                   j                  }|�|n| j                   j                  }|�|�t        d«      ‚|�|j	                  «       }|\  }	}
n&|�|j	                  «       d d }|\  }	}
nt        d«      ‚| j                   j
                  r)|
dk  r$| j                   j                  |
k7  rt        d«      ‚|�|j                  n|j                  }|€pt        | j                  d«      r4| j                  j                  d d …d |
…f   }|j                  |	|
«      }|}n&t        j                  |t        j                  |¬«      }| j                  ||||¬«      }| j                  |||¬	«      }|d
   }| j                   �| j!                  |«      nd }|s
||f|dd  z   S t#        |||j$                  ¬«      S )NzDYou cannot specify both input_ids and inputs_embeds at the same timer>   z5You have to specify either input_ids or inputs_embedsrx   z‹The `tpu_short_seq_length` in FNetConfig should be set equal to the sequence length being passed to the model when using TPU optimizations.r@   r`   )rc   r<   r@   rd   )rÆ   rÇ   r   r   )rÃ   Úpooler_outputrƒ   )r]   rÆ   rÇ   Ú
ValueErrorrY   r{   r   ra   rb   rh   r@   rW   r!   rX   rZ   r	  r
  r   rƒ   )r\   rc   r@   r<   rd   rÆ   rÇ   Úkwargsre   Ú
batch_sizer'   ra   rf   rg   Úembedding_outputÚencoder_outputsræ   r  s                     r(   ri   zFNetModel.forwardµ  sì  € ð %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐ  ]Ð%>ÜÐcÓdÐdØÐ"Ø#Ÿ.™.Ó*ˆKØ%0Ñ"ˆJ™
ØÐ&Ø'×,Ñ,Ó.¨s°Ð3ˆKØ%0Ñ"ˆJ™
äÐTÓUÐUð �K‰K×5Ò5Ø˜dÒ"Ø—‘×0Ñ0°JÒ>äð;óð ð
 &/Ð%:�×!Ò!À×@TÑ@TˆàÐ!Ü�t—‘Ð(8Ô9Ø*.¯/©/×*HÑ*HÊÈKÈZÈKÈÑ*XÐ'Ø3J×3QÑ3QÐR\Ð^hÓ3iÐ0Ø!A‘ä!&§¡¨[ÄÇ
Á
ÐSYÔ!Z�àŸ?™?ØØ%Ø)Ø'ð	 +ó 
Ðð Ÿ,™,ØØ!5Ø#ð 'ó 
ˆð
 *¨!Ñ,ˆà8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆáØ# ]Ð3°oÀaÀbÐ6IÑIÐIä)Ø-Ø'Ø)×7Ñ7ô
ð 	
r*   )T)NNNNNN)rj   rk   rl   rm   rD   r  r  r   r!   Ú
LongTensorr  ÚboolrÅ   r   ri   rn   ro   s   @r(   r  r  –  sÅ   ø„ ñõò /ò0ð ð .2Ø26Ø04Ø26Ø,0Ø#'ñD
à×#Ñ# dÑ*ðD
ð ×(Ñ(¨4Ñ/ðD
ð ×&Ñ&¨Ñ-ð	D
ð
 ×(Ñ(¨4Ñ/ðD
ð # T™kðD
ð ˜D‘[ðD
ð 
�Ñ	 òD
ó ôD
r*   r  z¨
    FNet Model with two heads on top as done during the pretraining: a `masked language modeling` head and a `next
    sentence prediction (classification)` head.
    c                   ó*  ‡ — e Zd ZdddœZˆ fd„Zd„ Zd„ Ze	 	 	 	 	 	 	 	 ddej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  dej                  dz  dej                  dz  de
dz  de
dz  deez  fd„«       Zˆ xZS )ÚFNetForPreTrainingúcls.predictions.biasú&fnet.embeddings.word_embeddings.weight©zcls.predictions.decoder.biaszcls.predictions.decoder.weightc                 ó„   •— t         ‰| �  |«       t        |«      | _        t	        |«      | _        | j                  «        y r,   )rC   rD   r  rõ   rð   Úclsr  r[   s     €r(   rD   zFNetForPreTraining.__init__	  s4   ø€ Ü‰Ñ˜Ô ä˜fÓ%ˆŒ	Ü'¨Ó/ˆŒð 	�‰Õr*   c                 óB   — | j                   j                  j                  S r,   ©r#  rä   rÝ   r  s    r(   Úget_output_embeddingsz(FNetForPreTraining.get_output_embeddings  ó   € Ø�x‰x×#Ñ#×+Ñ+Ð+r*   c                 ó„   — || j                   j                  _        |j                  | j                   j                  _        y r,   ©r#  rä   rÝ   rß   ©r\   Únew_embeddingss     r(   Úset_output_embeddingsz(FNetForPreTraining.set_output_embeddings  ó,   € Ø'5ˆ�‰×ÑÔ$Ø$2×$7Ñ$7ˆ�‰×ÑÕ!r*   Nrc   r@   r<   rd   ÚlabelsÚnext_sentence_labelrÆ   rÇ   rž   c	                 óî  — |�|n| j                   j                  }| j                  ||||||¬«      }
|
dd \  }}| j                  ||«      \  }}d}|�u|�st	        «       } ||j                  d| j                   j                  «      |j                  d«      «      } ||j                  dd«      |j                  d«      «      }||z   }|s||f|
dd z   }|�|f|z   S |S t        ||||
j                  ¬«      S )aH  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
            config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are ignored (masked), the
            loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`
        next_sentence_label (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the next sequence prediction (classification) loss. Input should be a sequence pair
            (see `input_ids` docstring) Indices should be in `[0, 1]`:

            - 0 indicates sequence B is a continuation of sequence A,
            - 1 indicates sequence B is a random sequence.

        Example:

        ```python
        >>> from transformers import AutoTokenizer, FNetForPreTraining
        >>> import torch

        >>> tokenizer = AutoTokenizer.from_pretrained("google/fnet-base")
        >>> model = FNetForPreTraining.from_pretrained("google/fnet-base")
        >>> inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
        >>> outputs = model(**inputs)
        >>> prediction_logits = outputs.prediction_logits
        >>> seq_relationship_logits = outputs.seq_relationship_logits
        ```N©r@   r<   rd   rÆ   rÇ   ru   r>   )r  r  r  rƒ   )	r]   rÇ   rõ   r#  r   ÚviewrF   r  rƒ   )r\   rc   r@   r<   rd   r.  r/  rÆ   rÇ   r  r„   ræ   rÓ   rç   rî   Ú
total_lossÚloss_fctÚmasked_lm_lossÚnext_sentence_lossr�   s                       r(   ri   zFNetForPreTraining.forward  s5  € ðL &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð *1°°!¨Ñ&ˆ˜Ø48·H±H¸_ÈmÓ4\Ñ1ÐÐ1àˆ
ØÐÐ"5Ð"AÜ'Ó)ˆHÙ%Ð&7×&<Ñ&<¸RÀÇÁ×AWÑAWÓ&XÐZ`×ZeÑZeÐfhÓZiÓjˆNÙ!)Ð*@×*EÑ*EÀbÈ!Ó*LÐNa×NfÑNfÐgiÓNjÓ!kÐØ'Ð*<Ñ<ˆJáØ'Ð)?Ð@À7È1È2À;ÑNˆFØ/9Ð/E�Z�M FÑ*ÐQÈ6ÐQä'ØØ/Ø$:Ø!×/Ñ/ô	
ð 	
r*   ©NNNNNNNN)rj   rk   rl   Ú_tied_weights_keysrD   r&  r,  r   r!   r¢   r  rÅ   r  ri   rn   ro   s   @r(   r  r  ý  s÷   ø„ ð )?Ø*RñÐô
ò,ò8ð ð *.Ø.2Ø,0Ø-1Ø&*Ø37Ø,0Ø#'ñC
à—<‘< $Ñ&ðC
ð Ÿ™ tÑ+ðC
ð —l‘l TÑ)ð	C
ð
 —|‘| dÑ*ðC
ð —‘˜tÑ#ðC
ð #Ÿ\™\¨DÑ0ðC
ð # T™kðC
ð ˜D‘[ðC
ð 
Ð)Ñ	)òC
ó ôC
r*   r  c                   ó
  ‡ — e Zd ZdddœZˆ fd„Zd„ Zd„ Ze	 	 	 	 	 	 	 ddej                  dz  d	ej                  dz  d
ej                  dz  dej                  dz  dej                  dz  de
dz  de
dz  deez  fd„«       Zˆ xZS )ÚFNetForMaskedLMr  r   r!  c                 ó„   •— t         ‰| �  |«       t        |«      | _        t	        |«      | _        | j                  «        y r,   )rC   rD   r  rõ   râ   r#  r  r[   s     €r(   rD   zFNetForMaskedLM.__init__g  ó4   ø€ Ü‰Ñ˜Ô ä˜fÓ%ˆŒ	Ü" 6Ó*ˆŒð 	�‰Õr*   c                 óB   — | j                   j                  j                  S r,   r%  r  s    r(   r&  z%FNetForMaskedLM.get_output_embeddingsp  r'  r*   c                 ó„   — || j                   j                  _        |j                  | j                   j                  _        y r,   r)  r*  s     r(   r,  z%FNetForMaskedLM.set_output_embeddingss  r-  r*   Nrc   r@   r<   rd   r.  rÆ   rÇ   rž   c                 ó~  — |�|n| j                   j                  }| j                  ||||||¬«      }	|	d   }
| j                  |
«      }d}|�Ft	        «       } ||j                  d| j                   j                  «      |j                  d«      «      }|s|f|	dd z   }|�|f|z   S |S t        |||	j                  ¬«      S )a£  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
            config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are ignored (masked), the
            loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.
        Nr1  r   r>   ru   ©r  Úlogitsrƒ   )	r]   rÇ   rõ   r#  r   r2  rF   r   rƒ   )r\   rc   r@   r<   rd   r.  rÆ   rÇ   r  r„   ræ   rç   r5  r4  r�   s                  r(   ri   zFNetForMaskedLM.forwardw  sã   € ð$ &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð " !™*ˆØ ŸH™H _Ó5ÐàˆØÐÜ'Ó)ˆHÙ%Ð&7×&<Ñ&<¸RÀÇÁ×AWÑAWÓ&XÐZ`×ZeÑZeÐfhÓZiÓjˆNáØ'Ð)¨G°A°B¨KÑ7ˆFØ3AÐ3M�^Ð%¨Ñ.ÐYÐSYÐYä >Ð:KÐ[b×[pÑ[pÔqÐqr*   ©NNNNNNN)rj   rk   rl   r8  rD   r&  r,  r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   r:  r:  `  sß   ø„ ð )?Ø*RñÐô
ò,ò8ð ð *.Ø.2Ø,0Ø-1Ø&*Ø,0Ø#'ñ(rà—<‘< $Ñ&ð(rð Ÿ™ tÑ+ð(rð —l‘l TÑ)ð	(rð
 —|‘| dÑ*ð(rð —‘˜tÑ#ð(rð # T™kð(rð ˜D‘[ð(rð 
�Ñ	ò(ró ô(rr*   r:  zT
    FNet Model with a `next sentence prediction (classification)` head on top.
    c                   óô   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
ee	z  fd„«       Z
ˆ xZS )ÚFNetForNextSentencePredictionc                 ó„   •— t         ‰| �  |«       t        |«      | _        t	        |«      | _        | j                  «        y r,   )rC   rD   r  rõ   ré   r#  r  r[   s     €r(   rD   z&FNetForNextSentencePrediction.__init__©  r<  r*   Nrc   r@   r<   rd   r.  rÆ   rÇ   rž   c                 óV  — |�|n| j                   j                  }| j                  ||||||¬«      }	|	d   }
| j                  |
«      }d}|�2t	        «       } ||j                  dd«      |j                  d«      «      }|s|f|	dd z   }|�|f|z   S |S t        |||	j                  ¬«      S )a•  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the next sequence prediction (classification) loss. Input should be a sequence pair
            (see `input_ids` docstring). Indices should be in `[0, 1]`:

            - 0 indicates sequence B is a continuation of sequence A,
            - 1 indicates sequence B is a random sequence.

        Example:

        ```python
        >>> from transformers import AutoTokenizer, FNetForNextSentencePrediction
        >>> import torch

        >>> tokenizer = AutoTokenizer.from_pretrained("google/fnet-base")
        >>> model = FNetForNextSentencePrediction.from_pretrained("google/fnet-base")
        >>> prompt = "In Italy, pizza served in formal settings, such as at a restaurant, is presented unsliced."
        >>> next_sentence = "The sky is blue due to the shorter wavelength of blue light."
        >>> encoding = tokenizer(prompt, next_sentence, return_tensors="pt")
        >>> outputs = model(**encoding, labels=torch.LongTensor([1]))
        >>> logits = outputs.logits
        >>> assert logits[0, 0] < logits[0, 1]  # next sentence was random
        ```Nr1  r   r>   ru   r@  )r]   rÇ   rõ   r#  r   r2  r   rƒ   )r\   rc   r@   r<   rd   r.  rÆ   rÇ   r  r„   rÓ   Úseq_relationship_scoresr6  r4  r�   s                  r(   ri   z%FNetForNextSentencePrediction.forward²  sÞ   € ðH &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð   ™
ˆà"&§(¡(¨=Ó"9Ðà!ÐØÐÜ'Ó)ˆHÙ!)Ð*A×*FÑ*FÀrÈ1Ó*MÈvÏ{É{Ð[]ËÓ!_ÐáØ-Ð/°'¸!¸"°+Ñ=ˆFØ7IÐ7UÐ'Ð)¨FÑ2ÐaÐ[aÐaä*Ø#Ø*Ø!×/Ñ/ô
ð 	
r*   rB  )rj   rk   rl   rD   r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   rD  rD  £  s¼   ø„ ôð ð *.Ø.2Ø,0Ø-1Ø&*Ø,0Ø#'ñ?
à—<‘< $Ñ&ð?
ð Ÿ™ tÑ+ð?
ð —l‘l TÑ)ð	?
ð
 —|‘| dÑ*ð?
ð —‘˜tÑ#ð?
ð # T™kð?
ð ˜D‘[ð?
ð 
Ð,Ñ	,ò?
ó ô?
r*   rD  zœ
    FNet Model transformer with a sequence classification/regression head on top (a linear layer on top of the pooled
    output) e.g. for GLUE tasks.
    c                   óô   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
ee	z  fd„«       Z
ˆ xZS )ÚFNetForSequenceClassificationc                 ó,  •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  |j                  «      | _        t        j                  |j                  |j                  «      | _        | j                  «        y r,   ©rC   rD   Ú
num_labelsr  rõ   r   rR   rS   rT   rP   rG   Ú
classifierr  r[   s     €r(   rD   z&FNetForSequenceClassification.__init__ü  si   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒÜ˜fÓ%ˆŒ	ä—z‘z &×"<Ñ"<Ó=ˆŒÜŸ)™) F×$6Ñ$6¸×8IÑ8IÓJˆŒð 	�‰Õr*   Nrc   r@   r<   rd   r.  rÆ   rÇ   rž   c                 ó$  — |�|n| j                   j                  }| j                  ||||||¬«      }	|	d   }
| j                  |
«      }
| j	                  |
«      }d}|��‡| j                   j
                  €�| j                  dk(  rd| j                   _        nl| j                  dkD  rL|j                  t        j                  k(  s|j                  t        j                  k(  rd| j                   _        nd| j                   _        | j                   j
                  dk(  rIt        «       }| j                  dk(  r& ||j                  «       |j                  «       «      }nŒ |||«      }n‚| j                   j
                  dk(  r=t        «       } ||j                  d| j                  «      |j                  d«      «      }n,| j                   j
                  dk(  rt        «       } |||«      }|s|f|	dd z   }|�|f|z   S |S t!        |||	j"                  ¬	«      S )
a�  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
        Nr1  r   Ú
regressionÚsingle_label_classificationÚmulti_label_classificationr>   ru   r@  )r]   rÇ   rõ   rT   rM  Úproblem_typerL  rB   r!   rZ   Úintr   Úsqueezer   r2  r   r   rƒ   )r\   rc   r@   r<   rd   r.  rÆ   rÇ   r  r„   rÓ   rA  r  r4  r�   s                  r(   ri   z%FNetForSequenceClassification.forward  sÐ  € ð$ &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð   ™
ˆØŸ™ ]Ó3ˆØ—‘ Ó/ˆàˆØÑØ�{‰{×'Ñ'Ð/Ø—?‘? aÒ'Ø/;�D—K‘KÕ,Ø—_‘_ qÒ(¨f¯l©l¼e¿j¹jÒ.HÈFÏLÉLÔ\a×\eÑ\eÒLeØ/L�D—K‘KÕ,à/K�D—K‘KÔ,à�{‰{×'Ñ'¨<Ò7Ü"›9�Ø—?‘? aÒ'Ù# F§N¡NÓ$4°f·n±nÓ6FÓG‘Dá# F¨FÓ3‘DØ—‘×)Ñ)Ð-JÒJÜ+Ó-�Ù §¡¨B°·±Ó @À&Ç+Á+ÈbÃ/ÓR‘Ø—‘×)Ñ)Ð-IÒIÜ,Ó.�Ù ¨Ó/�ÙØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä'¨T¸&ÐPW×PeÑPeÔfÐfr*   rB  )rj   rk   rl   rD   r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   rI  rI  õ  sÆ   ø„ ô	ð ð *.Ø.2Ø,0Ø-1Ø&*Ø,0Ø#'ñ:gà—<‘< $Ñ&ð:gð Ÿ™ tÑ+ð:gð —l‘l TÑ)ð	:gð
 —|‘| dÑ*ð:gð —‘˜tÑ#ð:gð # T™kð:gð ˜D‘[ð:gð 
Ð)Ñ	)ò:gó ô:gr*   rI  c                   óô   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
ee	z  fd„«       Z
ˆ xZS )ÚFNetForMultipleChoicec                 óö   •— t         ‰| �  |«       t        |«      | _        t	        j
                  |j                  «      | _        t	        j                  |j                  d«      | _
        | j                  «        y rª   )rC   rD   r  rõ   r   rR   rS   rT   rP   rG   rM  r  r[   s     €r(   rD   zFNetForMultipleChoice.__init__G  sV   ø€ Ü‰Ñ˜Ô ä˜fÓ%ˆŒ	Ü—z‘z &×"<Ñ"<Ó=ˆŒÜŸ)™) F×$6Ñ$6¸Ó:ˆŒð 	�‰Õr*   Nrc   r@   r<   rd   r.  rÆ   rÇ   rž   c                 óæ  — |�|n| j                   j                  }|�|j                  d   n|j                  d   }	|�!|j                  d|j	                  d«      «      nd}|�!|j                  d|j	                  d«      «      nd}|�!|j                  d|j	                  d«      «      nd}|�1|j                  d|j	                  d«      |j	                  d«      «      nd}| j                  ||||||¬«      }
|
d   }| j                  |«      }| j                  |«      }|j                  d|	«      }d}|�t        «       } |||«      }|s|f|
dd z   }|�|f|z   S |S t        |||
j                  ¬«      S )a[  
        input_ids (`torch.LongTensor` of shape `(batch_size, num_choices, 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_choices, 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_choices, 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_choices, 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.
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the multiple choice classification loss. Indices should be in `[0, ...,
            num_choices-1]` where `num_choices` is the size of the second dimension of the input tensors. (See
            `input_ids` above)
        Nr   r>   éþÿÿÿr1  ru   r@  )r]   rÇ   r   r2  rY   rõ   rT   rM  r   r   rƒ   )r\   rc   r@   r<   rd   r.  rÆ   rÇ   r  Únum_choicesr„   rÓ   rA  Úreshaped_logitsr  r4  r�   s                    r(   ri   zFNetForMultipleChoice.forwardQ  s¡  € ðT &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆØ,5Ð,A�i—o‘o aÒ(À}×GZÑGZÐ[\ÑG]ˆà>GÐ>S�I—N‘N 2 y§~¡~°bÓ'9Ô:ÐY]ˆ	ØM[ÐMg˜×,Ñ,¨R°×1DÑ1DÀRÓ1HÔIÐmqˆØGSÐG_�|×(Ñ(¨¨\×->Ñ->¸rÓ-BÔCÐeiˆð Ð(ð ×Ñ˜r =×#5Ñ#5°bÓ#9¸=×;MÑ;MÈbÓ;QÔRàð 	ð —)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð   ™
ˆàŸ™ ]Ó3ˆØ—‘ Ó/ˆØ Ÿ+™+ b¨+Ó6ˆàˆØÐÜ'Ó)ˆHÙ˜O¨VÓ4ˆDáØ%Ð'¨'°!°"¨+Ñ5ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä(¨d¸?ÐZa×ZoÑZoÔpÐpr*   rB  )rj   rk   rl   rD   r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   rV  rV  E  sÐ   ø„ ôð ð *.Ø.2Ø,0Ø-1Ø&*Ø,0Ø#'ñMqà—<‘< $Ñ&ðMqð Ÿ™ tÑ+ðMqð —l‘l TÑ)ð	Mqð
 —|‘| dÑ*ðMqð —‘˜tÑ#ðMqð # T™kðMqð ˜D‘[ðMqð 
Ð*Ñ	*òMqó ôMqr*   rV  c                   óô   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
ee	z  fd„«       Z
ˆ xZS )ÚFNetForTokenClassificationc                 ó,  •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  |j                  «      | _        t        j                  |j                  |j                  «      | _        | j                  «        y r,   rK  r[   s     €r(   rD   z#FNetForTokenClassification.__init__¤  si   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒä˜fÓ%ˆŒ	ä—z‘z &×"<Ñ"<Ó=ˆŒÜŸ)™) F×$6Ñ$6¸×8IÑ8IÓJˆŒð 	�‰Õr*   Nrc   r@   r<   rd   r.  rÆ   rÇ   rž   c                 óŒ  — |�|n| j                   j                  }| j                  ||||||¬«      }	|	d   }
| j                  |
«      }
| j	                  |
«      }d}|�<t        «       } ||j                  d| j                  «      |j                  d«      «      }|s|f|	dd z   }|�|f|z   S |S t        |||	j                  ¬«      S )zÛ
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the token classification loss. Indices should be in `[0, ..., config.num_labels - 1]`.
        Nr1  r   r>   ru   r@  )
r]   rÇ   rõ   rT   rM  r   r2  rL  r   rƒ   )r\   rc   r@   r<   rd   r.  rÆ   rÇ   r  r„   ræ   rA  r  r4  r�   s                  r(   ri   z"FNetForTokenClassification.forward°  sÝ   € ð  &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð " !™*ˆàŸ,™, Ó7ˆØ—‘ Ó1ˆàˆØÐÜ'Ó)ˆHá˜FŸK™K¨¨D¯O©OÓ<¸f¿k¹kÈ"»oÓNˆDáØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä$¨$°vÈW×MbÑMbÔcÐcr*   rB  )rj   rk   rl   rD   r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   r]  r]  ¢  sÆ   ø„ ô
ð ð *.Ø.2Ø,0Ø-1Ø&*Ø,0Ø#'ñ)dà—<‘< $Ñ&ð)dð Ÿ™ tÑ+ð)dð —l‘l TÑ)ð	)dð
 —|‘| dÑ*ð)dð —‘˜tÑ#ð)dð # T™kð)dð ˜D‘[ð)dð 
Ð&Ñ	&ò)dó ô)dr*   r]  c                   ó  ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	edz  d
edz  dee	z  fd„«       Z
ˆ xZS )ÚFNetForQuestionAnsweringc                 óä   •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  |j                  |j                  «      | _        | j                  «        y r,   )
rC   rD   rL  r  rõ   r   rP   rG   Ú
qa_outputsr  r[   s     €r(   rD   z!FNetForQuestionAnswering.__init__ß  sS   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒä˜fÓ%ˆŒ	ÜŸ)™) F×$6Ñ$6¸×8IÑ8IÓJˆŒð 	�‰Õr*   Nrc   r@   r<   rd   Ústart_positionsÚend_positionsrÆ   rÇ   rž   c	                 ó  — |�|n| j                   j                  }| j                  ||||||¬«      }
|
d   }| j                  |«      }|j	                  dd¬«      \  }}|j                  d«      j                  «       }|j                  d«      j                  «       }d }|�·|�µt        |j                  «       «      dkD  r|j                  d«      }t        |j                  «       «      dkD  r|j                  d«      }|j                  d«      }|j                  d|«      }|j                  d|«      }t        |¬«      } |||«      } |||«      }||z   dz  }|s||f|
dd  z   }|�|f|z   S |S t        ||||
j                  ¬«      S )	Nr1  r   r   r>   rv   )Úignore_indexru   )r  Ústart_logitsÚ
end_logitsrƒ   )r]   rÇ   rõ   rc  ÚsplitrT  Ú
contiguousÚlenrY   Úclampr   r   rƒ   )r\   rc   r@   r<   rd   rd  re  rÆ   rÇ   r  r„   ræ   rA  rh  ri  r3  Úignored_indexr4  Ú
start_lossÚend_lossr�   s                        r(   ri   z FNetForQuestionAnswering.forwardê  s®  € ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—)‘)ØØ)Ø%Ø'Ø!5Ø#ð ó 
ˆð " !™*ˆà—‘ Ó1ˆØ#)§<¡<°°r <Ó#:Ñ ˆ�jØ#×+Ñ+¨BÓ/×:Ñ:Ó<ˆØ×'Ñ'¨Ó+×6Ñ6Ó8ˆ
àˆ
ØÐ&¨=Ð+Dä�?×'Ñ'Ó)Ó*¨QÒ.Ø"1×"9Ñ"9¸"Ó"=�Ü�=×%Ñ%Ó'Ó(¨1Ò,Ø -× 5Ñ 5°bÓ 9�à(×-Ñ-¨aÓ0ˆMØ-×3Ñ3°A°}ÓEˆOØ)×/Ñ/°°=ÓAˆMä'°]ÔCˆHÙ! ,°Ó@ˆJÙ 
¨MÓ:ˆHØ$ xÑ/°1Ñ4ˆJáØ" JÐ/°'¸!¸"°+Ñ=ˆFØ/9Ð/E�Z�M FÑ*ÐQÈ6ÐQä+Ø¨,À:Ð]d×]rÑ]rô
ð 	
r*   r7  )rj   rk   rl   rD   r   r!   r¢   r  rÅ   r   ri   rn   ro   s   @r(   ra  ra  Ý  sÒ   ø„ ô	ð ð *.Ø.2Ø,0Ø-1Ø/3Ø-1Ø,0Ø#'ñ5
à—<‘< $Ñ&ð5
ð Ÿ™ tÑ+ð5
ð —l‘l TÑ)ð	5
ð
 —|‘| dÑ*ð5
ð Ÿ™¨Ñ,ð5
ð —|‘| dÑ*ð5
ð # T™kð5
ð ˜D‘[ð5
ð 
Ð-Ñ	-ò5
ó ô5
r*   ra  )
r:  rV  rD  r  ra  rI  r]  r¨   r  rô   )Hrm   Údataclassesr   Ú	functoolsr   r!   r   Útorch.nnr   r   r   Ú r
   rø   Úutilsr   r   Úscipyr   Úactivationsr   Úmodeling_layersr   Úmodeling_outputsr   r   r   r   r   r   r   r   r   Úmodeling_utilsr   Úpytorch_utilsr   r   Úconfiguration_fnetr   Ú
get_loggerrj   Úloggerr)   r-   r5   ÚModuler7   rq   r†   rŽ   r–   r¤   r¨   r¶   rÍ   rÕ   rÚ   râ   ré   rð   rô   r  r  r  r:  rD  rI  rV  r]  ra  Ú__all__r¾   r*   r(   ú<module>r�     sÊ  ðñ å !Ý ã Ý ß AÑ Aå &ß 7ñ ÔÝå !Ý 9÷
÷ 
õ 
õ .Ý 6Ý Ý *ð 
ˆ×	Ñ	˜HÓ	%€òMò>ò
ô 8�R—Y‘Yô 8ôv# §	¡	ô #ôL�b—i‘iô ô
˜2Ÿ9™9ô 
ô�r—y‘yô ô �—‘ô ôÐ*ô ô6a�"—)‘)ô aô8�—‘ô ô  "§)¡)ô ô"
˜2Ÿ9™9ô 
ô!�b—i‘iô !ô&�b—i‘iô &ô	9˜2Ÿ9™9ô 	9ð ô	/˜/ó 	/ó ð	/ñ ðôð
 ô:˜{ó :ó óð:ð$ ôc
Ð#ó c
ó ðc
ñL ðôôZ
Ð,ó Z
óðZ
ðz ô?rÐ)ó ?ró ð?rñD ðôô
J
Ð$7ó J
óð
J
ñZ ðôôGgÐ$7ó GgóðGgðT ôYqÐ/ó Yqó ðYqðx ô7dÐ!4ó 7dó ð7dðt ôB
Ð2ó B
ó ðB
òJ�r*   