Ë
    ÜÓ^j†  ã                   ó.  — d Z ddlZddlZddlmZ ddlm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 dd
lmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZ  ej:                  e«      Z G d„ dej@                  «      Z! G d„ dej@                  «      Z" G d„ dejF                  «      Z$ G d„ dejF                  «      Z% G d„ de«      Z&e G d„ de«      «       Z' G d„ de'«      Z( ed¬«       G d „ d!e'«      «       Z) ed"¬«       G d#„ d$e'e«      «       Z*d$dgZ+y)%z/PyTorch TrOCR decoder model (based on RoBERTa).é    N)Únn)ÚCrossEntropyLossé   )ÚACT2FN)ÚCacheÚDynamicCacheÚEncoderDecoderCache)ÚGenerationMixin)Úcreate_bidirectional_maskÚcreate_causal_mask)ÚGradientCheckpointingLayer)Ú)BaseModelOutputWithPastAndCrossAttentionsÚ!CausalLMOutputWithCrossAttentions)ÚPreTrainedModel)Úauto_docstringÚloggingé   )ÚTrOCRConfigc                   óv   ‡ — e Zd ZdZdedefˆ fd„Z	 d
dej                  dedej                  dz  fˆ fd	„Zˆ xZ	S )ÚTrOCRLearnedPositionalEmbeddingzN
    This module learns positional embeddings up to a fixed maximum size.
    Únum_embeddingsÚembedding_dimc                 óN   •— d| _         t        ‰| �	  || j                   z   |«       y ©Né   )ÚoffsetÚsuperÚ__init__)Úselfr   r   Ú	__class__s      €ús/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/trocr/modeling_trocr.pyr   z(TrOCRLearnedPositionalEmbedding.__init__*   s$   ø€ ð ˆŒÜ‰Ñ˜¨$¯+©+Ñ5°}ÕEó    NÚ	input_idsÚpast_key_values_lengthÚposition_idsc                 ó$  •— |€a|j                   dd \  }}t        j                  |||z   t        j                  | j                  j
                  ¬«      j                  |d«      }n|j                  d«      }t        ‰| �%  || j                  z   «      S )z3`input_ids' shape is expected to be [bsz x seqlen].Nr   )ÚdtypeÚdeviceéÿÿÿÿr   )ÚshapeÚtorchÚarangeÚlongÚweightr(   ÚexpandÚ	unsqueezer   Úforwardr   )r   r#   r$   r%   ÚbszÚseq_lenr    s         €r!   r1   z'TrOCRLearnedPositionalEmbedding.forward0   sˆ   ø€ ð
 ÐØ$Ÿ?™?¨2¨AÐ.‰LˆC�Ü Ÿ<™<Ø&Ð(>ÀÑ(HÔPU×PZÑPZÐcg×cnÑcn×cuÑcuôç‰f�S˜"‹oñ ð (×1Ñ1°!Ó4ˆLä‰w‰˜|¨d¯k©kÑ9Ó:Ð:r"   )r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r+   ÚTensorr1   Ú__classcell__©r    s   @r!   r   r   %   sW   ø„ ñðF sð F¸3õ Fð mqñ;ØŸ™ð;Ø?Bð;ØV[×VbÑVbÐeiÑVi÷;ñ ;r"   r   c            
       ó`   ‡ — e Zd ZdZd
dededededz  fˆ fd„Zdej                  fˆ fd	„Z	ˆ xZ
S )ÚTrOCRScaledWordEmbeddingz\
    This module overrides nn.Embeddings' forward by multiplying with embeddings scale.
    r   r   Úpadding_idxÚembed_scaleNc                 ó6   •— t         ‰| �  |||«       || _        y ©N)r   r   r?   )r   r   r   r>   r?   r    s        €r!   r   z!TrOCRScaledWordEmbedding.__init__F   s   ø€ Ü‰Ñ˜¨¸ÔDØ&ˆÕr"   r#   c                 ó<   •— t         ‰| �  |«      | j                  z  S rA   )r   r1   r?   )r   r#   r    s     €r!   r1   z TrOCRScaledWordEmbedding.forwardJ   s   ø€ Ü‰w‰˜yÓ)¨D×,<Ñ,<Ñ<Ð<r"   )ç      ð?)r4   r5   r6   r7   r8   Úfloatr   r+   r9   r1   r:   r;   s   @r!   r=   r=   A   sE   ø„ ññ' sð '¸3ð 'ÈSð 'Ð_dÐgkÑ_kõ 'ð= §¡÷ =ñ =r"   r=   c            	       óÞ   ‡ — e Zd ZdZddedededz  fˆ fd„Zeddedededz  fd„«       Z ej                  «       dd	ej                  d
efd„«       Z	 dd	ej                  ded
edz  fd„Zˆ xZS )Ú"TrOCRSinusoidalPositionalEmbeddingzDThis module produces sinusoidal positional embeddings of any length.NÚnum_positionsr   r>   c                 ó|   •— t         ‰| �  «        d| _        || _        || _        | j                  |||«      | _        y r   )r   r   r   r   r>   Úget_embeddingÚweights)r   rG   r   r>   r    s       €r!   r   z+TrOCRSinusoidalPositionalEmbedding.__init__Q   s;   ø€ Ü‰ÑÔØˆŒØ*ˆÔØ&ˆÔØ×)Ñ)¨-¸ÈÓTˆ�r"   r   c                 óâ  — |dz  }t        j                  d«      |dz
  z  }t        j                  t        j                  |t        j
                  ¬«      j                  «       | z  «      }t        j                  | t        j
                  ¬«      j                  «       j                  d«      |j                  d«      z  }t        j                  t        j                  |«      t        j                  |«      gd¬«      j                  | d«      }|dz  dk(  r-t        j                  |t        j                  | d«      gd¬«      }|�	d||dd…f<   |j                  t        j                  «       «      S )	zÁ
        Build sinusoidal embeddings. This matches the implementation in tensor2tensor, but differs slightly from the
        description in Section 3.5 of "Attention Is All You Need".
        r   i'  r   )r'   r   ©Údimr)   N)ÚmathÚlogr+   Úexpr,   Úint64rD   r0   ÚcatÚsinÚcosÚviewÚzerosÚtoÚget_default_dtype)r   r   r>   Úhalf_dimÚembs        r!   rI   z0TrOCRSinusoidalPositionalEmbedding.get_embeddingX   s  € ð ! AÑ%ˆÜ�h‰h�u‹o ¨A¡Ñ.ˆÜ�i‰iœŸ™ X´U·[±[ÔA×GÑGÓIÈSÈDÑPÓQˆÜ�l‰l˜>´·±Ô=×CÑCÓE×OÑOÐPQÓRÐUX×UbÑUbÐcdÓUeÑeˆÜ�i‰iœŸ™ 3›¬¯©°3«Ð8¸aÔ@×EÑEÀnÐVXÓYˆØ˜1Ñ Ò!ä—)‘)˜S¤%§+¡+¨n¸aÓ"@ÐAÀqÔIˆCØÐ"Ø"#ˆC�šQ�Ñà�v‰v”e×-Ñ-Ó/Ó0Ð0r"   r#   r$   c                 óü  — |j                  «       \  }}| j                  || j                  |«      j                  |j                  «      }| j                  dz   |z   }| j
                  �|| j
                  j                  d«      kD  r,| j                  || j                  | j                  «      | _        | j
                  j                  d|j                  d«      «      j                  ||d«      j                  «       }|S )Nr   r   r)   )ÚsizeÚ"create_position_ids_from_input_idsr>   rW   r(   rJ   rI   r   Úindex_selectrU   Údetach)r   r#   r$   r2   r3   r%   Úmax_posÚxs           r!   r1   z*TrOCRSinusoidalPositionalEmbedding.forwardk   sÙ   € à —~‘~Ó'‰ˆˆWà×>Ñ>¸yÈ$×JZÑJZÐ\rÓs×vÑvØ×Ñó
ˆð
 ×"Ñ" QÑ&¨Ñ0ˆØ�<‰<Ð 7¨T¯\©\×->Ñ->¸qÓ-AÒ#Aà×-Ñ-¨g°t×7IÑ7IÈ4×K[ÑK[Ó\ˆDŒLà�L‰L×%Ñ% a¨×):Ñ):¸2Ó)>Ó?×DÑDÀSÈ'ÐSUÓV×]Ñ]Ó_ˆàˆr"   c                 ó¾   — |j                  |«      j                  «       }t        j                  |d¬«      j	                  |«      |z   |z  }|j                  «       |z   S )zÐ
        Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding
        symbols are ignored. This is modified from fairseq's `utils.make_positions`.
        r   rL   )Úner8   r+   ÚcumsumÚtype_asr-   )r   r#   r>   r$   ÚmaskÚincremental_indicess         r!   r]   zETrOCRSinusoidalPositionalEmbedding.create_position_ids_from_input_ids}   sW   € ð �|‰|˜KÓ(×,Ñ,Ó.ˆÜ$Ÿ|™|¨D°aÔ8×@Ñ@ÀÓFÐI_Ñ_ÐcgÑgÐØ"×'Ñ'Ó)¨KÑ7Ð7r"   rA   )r   )r4   r5   r6   r7   r8   r   ÚstaticmethodrI   r+   Úno_gradr9   r1   r]   r:   r;   s   @r!   rF   rF   N   s³   ø„ ÙNñU cð U¸#ð UÈCÐRVÉJõ Uð ñ1 cð 1¸#ð 1ÈCÐRVÉJò 1ó ð1ð$ €U‡]�]ƒ_ñ §¡ð Àsò ó ðð$ _`ñ
8ØŸ™ð
8Ø47ð
8ØQTÐW[ÑQ[÷
8r"   rF   c                   óZ  ‡ — e Zd ZdZ	 	 	 	 	 	 	 ddedededz  dedz  dedz  dedz  d	edz  d
edz  dedz  fˆ fd„Z	 	 	 	 ddej                  dej                  dz  de
dz  dej                  dz  dedz  deej                  ej                  dz  eej                     dz  f   fd„Zˆ xZS )ÚTrOCRAttentionz>Multi-headed attention from 'Attention Is All You Need' paper.NÚ	embed_dimÚ	num_headsÚkdimÚvdimÚdropoutÚ
is_decoderÚbiasÚis_cross_attentionÚ	layer_idxc                 óP  •— t         ‰| �  «        || _        |�|n|| _        |�|n|| _        || _        || _        ||z  | _        | j                  |z  | j                  k(  st        d| j                  › d|› d�«      ‚| j                  dz  | _	        || _
        |
| _        t        j                  | j                  ||¬«      | _        t        j                  | j                  ||¬«      | _        t        j                  |||¬«      | _        t        j                  |||¬«      | _        y )Nz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: z).g      à¿©rr   )r   r   rl   rn   ro   rm   rp   Úhead_dimÚ
ValueErrorÚscalingrq   rt   r   ÚLinearÚk_projÚv_projÚq_projÚout_proj)r   Úconfigrl   rm   rn   ro   rp   rq   rr   rs   rt   r    s              €r!   r   zTrOCRAttention.__init__�   s  ø€ ô 	‰ÑÔØ"ˆŒØ Ð,‘D°)ˆŒ	Ø Ð,‘D°)ˆŒ	Ø"ˆŒØˆŒØ! YÑ.ˆŒØ—‘ 	Ñ)¨T¯^©^Ò;ÜØMÈdÏnÉnÐM]ð ^Ø�;˜bð"óð ð —}‘} dÑ*ˆŒØ$ˆŒØ"ˆŒä—i‘i §	¡	¨9¸4Ô@ˆŒÜ—i‘i §	¡	¨9¸4Ô@ˆŒÜ—i‘i 	¨9¸4Ô@ˆŒäŸ	™	 )¨Y¸TÔBˆ�r"   Úhidden_statesÚkey_value_statesÚpast_key_valuesÚattention_maskÚoutput_attentionsÚreturnc                 óz	  — |du}|j                  «       \  }}	}
| j                  |«      | j                  z  }d}|�St        |t        «      rA|j
                  j                  | j                  «      }|r|j                  }n|j                  }n|}|r|n|}|rK|�I|rGj                  | j                     j                  }|j                  | j                     j                  }nß| j                  |«      }| j                  |«      }|j                  |d| j                   | j"                  «      j%                  dd«      }|j                  |d| j                   | j"                  «      j%                  dd«      }|�Kj'                  ||| j                  «      \  }}|r)t        |t        «      rd|j
                  | j                  <   || j                   z  d| j"                  f}|j                  ||	| j                   | j"                  «      j%                  dd«      } |j(                  |Ž } |j(                  |Ž } |j(                  |Ž }|j                  d«      }t+        j,                  ||j%                  dd«      «      }|j                  «       || j                   z  |	|fk7  r/t/        d|| j                   z  |	|f› d|j                  «       › �«      ‚|�{|j                  «       |d|	|fk7  r#t/        d	|d|	|f› d|j                  «       › �«      ‚|j                  || j                   |	|«      |z   }|j                  || j                   z  |	|«      }t0        j2                  j5                  |d¬
«      }|r?|j                  || j                   |	|«      }|j                  || j                   z  |	|«      }nd}t0        j2                  j7                  || j6                  | j8                  ¬«      }t+        j,                  ||«      }|j                  «       || j                   z  |	| j"                  fk7  r7t/        d|| j                   |	| j"                  f› d|j                  «       › �«      ‚|j                  || j                   |	| j"                  «      }|j%                  dd«      }|j)                  ||	|
«      }| j;                  |«      }||fS )z#Input shape: Batch x Time x ChannelNFr)   r   r   Tz$Attention weights should be of size z	, but is z!Attention mask should be of size rL   ©ÚpÚtrainingz `attn_output` should be of size )r\   r}   ry   Ú
isinstancer	   Ú
is_updatedÚgetrt   Úcross_attention_cacheÚself_attention_cacheÚlayersÚkeysÚvaluesr{   r|   rU   rm   rw   Ú	transposeÚupdateÚreshaper+   Úbmmrx   r   Ú
functionalÚsoftmaxrp   r‰   r~   )r   r€   r�   r‚   rƒ   r„   Úkwargsrs   r2   Útgt_lenrl   Úquery_statesr‹   Úcurr_past_key_valuesÚcurrent_statesÚ
key_statesÚvalue_statesÚ
proj_shapeÚsrc_lenÚattn_weightsÚattn_weights_reshapedÚ
attn_probsÚattn_outputs                          r!   r1   zTrOCRAttention.forward°   sŠ  € ð .°TÐ9ÐØ"/×"4Ñ"4Ó"6ÑˆˆW�ið —{‘{ =Ó1°D·L±LÑ@ˆàˆ
ØÐ&Ü˜/Ô+>Ô?Ø,×7Ñ7×;Ñ;¸D¿N¹NÓK�
Ù%à+:×+PÑ+PÑ(à+:×+OÑ+OÑ(à'6Ð$á-?Ñ)À]ˆÙ /Ð"=Á*à-×4Ñ4°T·^±^ÑD×IÑIˆJØ/×6Ñ6°t·~±~ÑF×MÑM‰LàŸ™ ^Ó4ˆJØŸ;™; ~Ó6ˆLØ#Ÿ™¨¨b°$·.±.À$Ç-Á-ÓP×ZÑZÐ[\Ð^_Ó`ˆJØ'×,Ñ,¨S°"°d·n±nÀdÇmÁmÓT×^Ñ^Ð_`ÐbcÓdˆLàÐ*à+?×+FÑ+FÀzÐS_Ðae×aoÑaoÓ+pÑ(�
˜Lá%¬*°_ÔFYÔ*ZØAE�O×.Ñ.¨t¯~©~Ñ>à˜DŸN™NÑ*¨B°·±Ð>ˆ
Ø#×(Ñ(¨¨g°t·~±~ÀtÇ}Á}ÓU×_Ñ_Ð`aÐcdÓeˆØ+�|×+Ñ+¨ZÐ8ˆØ'�Z×'Ñ'¨Ð4ˆ
Ø+�|×+Ñ+¨ZÐ8ˆà—/‘/ !Ó$ˆÜ—y‘y ¨z×/CÑ/CÀAÀqÓ/IÓJˆà×ÑÓ 3¨¯©Ñ#7¸À'Ð"JÒJÜØ6¸¸d¿n¹nÑ8LÈgÐW^Ð7_Ð6`ð aØ ×%Ñ%Ó'Ð(ð*óð ð
 Ð%Ø×"Ñ"Ó$¨¨a°¸'Ð(BÒBÜ Ø7¸¸aÀÈ'Ð8RÐ7SÐS\Ð]k×]pÑ]pÓ]rÐ\sÐtóð ð (×,Ñ,¨S°$·.±.À'È7ÓSÐVdÑdˆLØ'×,Ñ,¨S°4·>±>Ñ-AÀ7ÈGÓTˆLä—}‘}×,Ñ,¨\¸rÐ,ÓBˆáð
 %1×$5Ñ$5°c¸4¿>¹>È7ÐT[Ó$\Ð!Ø0×5Ñ5°c¸D¿N¹NÑ6JÈGÐU\Ó]‰Là$(Ð!ä—]‘]×*Ñ*¨<¸4¿<¹<ÐRV×R_ÑR_Ð*Ó`ˆ
ä—i‘i 
¨LÓ9ˆà×ÑÓ #¨¯©Ñ"6¸ÀÇÁÐ!OÒOÜØ2°C¸¿¹ÈÐRV×R_ÑR_Ð3`Ð2að bØ×$Ñ$Ó&Ð'ð)óð ð
 "×&Ñ& s¨D¯N©N¸GÀTÇ]Á]ÓSˆØ!×+Ñ+¨A¨qÓ1ˆØ!×)Ñ)¨#¨w¸	ÓBˆà—m‘m KÓ0ˆàÐ1Ð1Ð1r"   )NNg        FTFN)NNNF)r4   r5   r6   r7   r8   rD   Úboolr   r+   r9   r   Útupler1   r:   r;   s   @r!   rk   rk   Š   s<  ø„ ÙHð  ØØ #Ø"'Ø Ø*/Ø!%ñ!Cð ð!Cð ð	!Cð
 �D‰jð!Cð �D‰jð!Cð ˜‘ð!Cð ˜4‘Kð!Cð �T‰kð!Cð ! 4™Kð!Cð ˜$‘;õ!CðL 15Ø(,Ø.2Ø).ñd2à—|‘|ðd2ð  Ÿ,™,¨Ñ-ðd2ð  ™ð	d2ð
 Ÿ™ tÑ+ðd2ð   $™;ðd2ð 
ˆu�|‰|˜UŸ\™\¨DÑ0°%¸¿¹Ñ2EÈÑ2LÐLÑ	M÷d2r"   rk   c                   óÌ   ‡ — e Zd Zddefˆ fd„Z	 	 	 	 	 	 ddej                  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dz  fd„Z	ˆ xZ
S )ÚTrOCRDecoderLayerNr   c                 ób  •— t         ‰| �  «        |j                  | _        t	        || j                  |j
                  |j                  d|¬«      | _        |j                  | _        t        |j                     | _        |j                  | _        t        j                  | j                  «      | _        |j                   rot	        || j                  |j
                  |j"                  |j"                  |j                  dd|¬«	      | _        t        j                  | j                  «      | _        t        j(                  | j                  |j*                  «      | _        t        j(                  |j*                  | j                  «      | _        t        j                  | j                  «      | _        y )NT)rl   rm   rp   rq   rt   )rl   rm   rn   ro   rp   rq   rs   rt   )r   r   Úhidden_sizerl   rk   Údecoder_attention_headsÚattention_dropoutÚ	self_attnrp   r   Úactivation_functionÚactivation_fnÚactivation_dropoutr   Ú	LayerNormÚself_attn_layer_normrq   Úcross_attention_hidden_sizeÚencoder_attnÚencoder_attn_layer_normrz   Údecoder_ffn_dimÚfc1Úfc2Úfinal_layer_norm)r   r   rt   r    s      €r!   r   zTrOCRDecoderLayer.__init__  s=  ø€ Ü‰ÑÔØ×+Ñ+ˆŒä'ØØ—n‘nØ×4Ñ4Ø×,Ñ,ØØô
ˆŒð —~‘~ˆŒÜ# F×$>Ñ$>Ñ?ˆÔØ"(×";Ñ";ˆÔä$&§L¡L°·±Ó$@ˆÔ!à×ÒÜ .ØØŸ.™.Ø ×8Ñ8Ø×7Ñ7Ø×7Ñ7Ø×0Ñ0ØØ#'Ø#ô
!ˆDÔô ,.¯<©<¸¿¹Ó+GˆDÔ(ä—9‘9˜TŸ^™^¨V×-CÑ-CÓDˆŒÜ—9‘9˜V×3Ñ3°T·^±^ÓDˆŒÜ "§¡¨T¯^©^Ó <ˆÕr"   r€   rƒ   Úencoder_hidden_statesÚencoder_attention_maskr‚   r„   Ú	use_cachec                 ó*  — |}	| j                  ||||¬«      \  }}
t        j                  j                  || j                  | j                  ¬«      }|	|z   }| j                  |«      }d}|�g|}	| j                  |||||¬«      \  }}t        j                  j                  || j                  | j                  ¬«      }|	|z   }| j                  |«      }|}	| j                  | j                  |«      «      }t        j                  j                  || j                  | j                  ¬«      }| j                  |«      }t        j                  j                  || j                  | j                  ¬«      }|	|z   }| j                  |«      }|f}|r||
|fz  }|S )aÆ  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`): attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
            encoder_hidden_states (`torch.FloatTensor`):
                cross attention input to the layer of shape `(batch, seq_len, embed_dim)`
            encoder_attention_mask (`torch.FloatTensor`): encoder attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
            past_key_values (`Cache`): cached past key and value projection states
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
        )r€   r‚   rƒ   r„   r‡   N)r€   r�   rƒ   r‚   r„   )r­   r   r–   rp   r‰   r²   r´   rµ   r¯   r·   r°   r¸   r¹   )r   r€   rƒ   rº   r»   r‚   r„   r¼   r˜   ÚresidualÚself_attn_weightsÚcross_attn_weightsÚoutputss                r!   r1   zTrOCRDecoderLayer.forward<  s©  € ð2 !ˆð ,0¯>©>Ø'Ø+Ø)Ø/ð	 ,:ó ,
Ñ(ˆÐ(ô Ÿ™×-Ñ-¨m¸t¿|¹|ÐVZ×VcÑVcÐ-ÓdˆØ  =Ñ0ˆØ×1Ñ1°-Ó@ˆð "ÐØ Ð,Ø$ˆHà04×0AÑ0AØ+Ø!6Ø5Ø /Ø"3ð 1Bó 1Ñ-ˆMÐ-ô ŸM™M×1Ñ1°-À4Ç<Á<ÐZ^×ZgÑZgÐ1ÓhˆMØ$ }Ñ4ˆMØ ×8Ñ8¸ÓGˆMð !ˆØ×*Ñ*¨4¯8©8°MÓ+BÓCˆÜŸ™×-Ñ-¨m¸t×?VÑ?VÐae×anÑanÐ-ÓoˆØŸ™ Ó/ˆäŸ™×-Ñ-¨m¸t¿|¹|ÐVZ×VcÑVcÐ-ÓdˆØ  =Ñ0ˆØ×-Ñ-¨mÓ<ˆà Ð"ˆáØÐ)Ð+=Ð>Ñ>ˆGàˆr"   rA   )NNNNFT)r4   r5   r6   r   r   r+   r9   r   r¥   r1   r:   r;   s   @r!   r¨   r¨     s    ø„ ñ"=˜{õ "=ðN /3Ø59Ø6:Ø(,Ø).Ø!%ñGà—|‘|ðGð Ÿ™ tÑ+ðGð  %Ÿ|™|¨dÑ2ð	Gð
 !&§¡¨tÑ 3ðGð  ™ðGð   $™;ðGð ˜$‘;÷Gr"   r¨   c                   ó&   — e Zd ZU eed<   dZdZdgZy)ÚTrOCRPreTrainedModelr   ÚmodelTr¨   N)r4   r5   r6   r   Ú__annotations__Úbase_model_prefixÚsupports_gradient_checkpointingÚ_no_split_modules© r"   r!   rÃ   rÃ   †  s   … àÓØÐØ&*Ð#Ø,Ð-Ñr"   rÃ   c                   óD   ‡ — e Zd ZdZdefˆ fd„Z	 	 	 	 	 	 	 	 	 	 dd„Zˆ xZS )ÚTrOCRDecoderz˜
    Transformer decoder consisting of *config.decoder_layers* layers. Each layer is a [`TrOCRDecoderLayer`]

    Args:
        config: TrOCRConfig
    r   c           	      ó`  •— t         ‰| �  |«       |j                  | _        |j                  | _        |j
                  | _        |j                  rt        j                  |j                  «      nd}t        |j                  |j                  | j                  |¬«      | _        |j                  r&t        |j                   |j                  «      | _        n@t%        |j                   | j                  z   dz   |j                  | j                  «      | _        |j&                  r%t)        j*                  |j                  «      | _        nd | _        t)        j,                  t/        |j0                  «      D �cg c]  }t3        ||¬«      ‘Œ c}«      | _        d| _        | j9                  «        y c c}w )NrC   )r?   r   )rt   F)r   r   rp   Údecoder_layerdropÚ	layerdropÚpad_token_idr>   Úscale_embeddingrN   Úsqrtrª   r=   Ú
vocab_sizeÚembed_tokensÚuse_learned_position_embeddingsr   Úmax_position_embeddingsÚembed_positionsrF   Úlayernorm_embeddingr   r±   Ú
ModuleListÚrangeÚdecoder_layersr¨   r�   Úgradient_checkpointingÚ	post_init)r   r   r?   Úir    s       €r!   r   zTrOCRDecoder.__init__–  sP  ø€ Ü‰Ñ˜Ô Ø—~‘~ˆŒØ×1Ñ1ˆŒØ!×.Ñ.ˆÔØ7=×7MÒ7M”d—i‘i × 2Ñ 2Ô3ÐSVˆä4Ø×Ñ˜v×1Ñ1°4×3CÑ3CÐQ\ô
ˆÔð ×1Ò1Ü#BÀ6×CaÑCaÐci×cuÑcuÓ#vˆDÕ ä#EØ×.Ñ.°×1AÑ1AÑAÀAÑEØ×"Ñ"Ø× Ñ ó$ˆDÔ ð ×%Ò%Ü')§|¡|°F×4FÑ4FÓ'GˆDÕ$à'+ˆDÔ$ä—m‘mÔUZÐ[a×[pÑ[pÓUqÖ$rÐPQÔ%6°vÈÖ%KÒ$rÓsˆŒà&+ˆÔ#à�‰Õùò	 %ss   Å3F+c           
      óB  — |�|n| j                   j                  }|	�|	n| j                   j                  }	|�|n| j                   j                  }|
�|
n| j                   j                  }
|�|�t        d«      ‚|�"|}|j                  d|j                  d   «      }n|�|dd…dd…df   }nt        d«      ‚| j                  r%| j                  r|rt        j                  d«       d}|rd|€b|€| j                   j                  r4t        t        | j                   ¬«      t        | j                   ¬«      «      nt        | j                   ¬«      }|�|j                  «       nd}|€| j!                  |«      }| j                   j"                  r| j%                  ||¬	«      }n| j%                  ||¬	«      }|j'                  |j(                  «      }||z   }| j*                  �| j+                  |«      }t,        j.                  j1                  || j0                  | j                  ¬
«      }t3        | j                   |||¬«      }|�|�t5        | j                   |||¬«      }|	rdnd}|rdnd}|r|�dnd}t7        | j8                  «      D ]j  \  }}|	r||fz  }| j                  r%t;        j<                  g «      }|| j>                  k  rŒ? ||||||||¬«      }|d   }|sŒV||d   fz  }|€Œb||d   fz  }Œl |	r||fz  }|
stA        d„ |||||fD «       «      S tC        |||||¬«      S )aU  
        Args:
            input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
                Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you
                provide it.

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

                [What are input IDs?](../glossary#input-ids)
            attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
                Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.

                [What are attention masks?](../glossary#attention-mask)
            encoder_hidden_states (`torch.FloatTensor` of shape `(batch_size, encoder_sequence_length, hidden_size)`, *optional*):
                Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention
                of the decoder.
            encoder_attention_mask (`torch.LongTensor` of shape `(batch_size, encoder_sequence_length)`, *optional*):
                Mask to avoid performing cross-attention on padding tokens indices of encoder input_ids. Mask values
                selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.

                [What are attention masks?](../glossary#attention-mask)
            past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):
                It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache).

                Contains pre-computed hidden-states (key and values in the self-attention blocks and in the
                cross-attention blocks) that can be used (see `past_key_values` input) to speed up sequential decoding.

                If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those
                that don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of
                all `decoder_input_ids` of shape `(batch_size, sequence_length)`.
            inputs_embeds (`torch.FloatTensor` of shape `(batch_size, 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.
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
            output_hidden_states (`bool`, *optional*):
                Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors
                for more detail.
            return_dict (`bool`, *optional*):
                Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
        NzTYou cannot specify both decoder_input_ids and decoder_inputs_embeds at the same timer)   zEYou have to specify either decoder_input_ids or decoder_inputs_embedsz^`use_cache = True` is incompatible with gradient checkpointing. Setting `use_cache = False`...F)r   r   )r$   r‡   )r   Úinputs_embedsrƒ   r‚   )r   rß   rƒ   rº   rÉ   )r»   r‚   r„   r¼   r   r   c              3   ó$   K  — | ]  }|�|–— Œ
 y ­wrA   rÉ   )Ú.0Úvs     r!   ú	<genexpr>z'TrOCRDecoder.forward.<locals>.<genexpr>[  s   è ø€ ò àØ�=ô ñùs   ‚)Úlast_hidden_stater‚   r€   Ú
attentionsÚcross_attentions)"r   r„   Úoutput_hidden_statesr¼   Úreturn_dictrx   rU   r*   rÛ   r‰   ÚloggerÚwarning_onceÚis_encoder_decoderr	   r   Úget_seq_lengthrÓ   rÔ   rÖ   rW   r(   r×   r   r–   rp   r   r   Ú	enumerater�   r+   ÚrandrÎ   r¦   r   )r   r#   rƒ   rº   r»   r‚   rß   r¼   r„   rç   rè   r˜   Úinputr$   Ú	embed_posr€   Úall_hidden_statesÚall_self_attnsÚall_cross_attentionsÚidxÚdecoder_layerÚdropout_probabilityÚlayer_outputss                          r!   r1   zTrOCRDecoder.forwardµ  sz  € ð@ 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð "+Ð!6‘I¸D¿K¹K×<QÑ<Qˆ	Ø%0Ð%<‘kÀ$Ç+Á+×BYÑBYˆð Ð  ]Ð%>ÜÐsÓtÐtØÐ"ØˆEØ!Ÿ™ r¨5¯;©;°r©?Ó;‰IØÐ&Ø!¢!¢Q¨ (Ñ+‰EäÐdÓeÐeà×&Ò&¨4¯=ª=ÙÜ×#Ñ#Øtôð "�	á˜Ð0ð )Ð4¸¿¹×8VÒ8Vô $¤L¸¿¹Ô$DÄlÐZ^×ZeÑZeÔFfÔgä!¨¯©Ô5ð ð FUÐE` ×!?Ñ!?Ô!AÐfgÐàÐ Ø ×-Ñ-¨iÓ8ˆMà�;‰;×6Ò6Ø×,Ñ,¨UÐKaÐ,Ób‰Ià×,Ñ,¨YÐOeÐ,ÓfˆIØ—L‘L ×!5Ñ!5Ó6ˆ	à%¨	Ñ1ˆà×#Ñ#Ð/Ø ×4Ñ4°]ÓCˆMäŸ™×-Ñ-¨m¸t¿|¹|ÐVZ×VcÑVcÐ-Ódˆä+Ø—;‘;Ø'Ø)Ø+ô	
ˆð !Ð,Ð1GÐ1SÜ%>Ø—{‘{Ø+Ø5Ø&;ô	&Ð"ñ #7™B¸DÐÙ0™°dˆÙ&7Ð<QÐ<]™rÐdhÐä"+¨D¯K©KÓ"8ò 	@ÑˆC�á#Ø! mÐ%5Ñ5Ð!Ø�}Š}Ü&+§j¡j°£nÐ#Ø&¨¯©Ò7Øá)ØØØ%Ø'=Ø /Ø"3Ø#ôˆMð *¨!Ñ,ˆMâ Ø =°Ñ#3Ð"5Ñ5�à(Ñ4Ø(¨]¸1Ñ-=Ð,?Ñ?Ñ(ð1	@ñ6  Ø -Ð!1Ñ1ÐáÜñ à'¨Ð:KÈ^Ð]qÐrôó ð ô
 9Ø+Ø+Ø+Ø%Ø1ô
ð 	
r"   )
NNNNNNNNNN)r4   r5   r6   r7   r   r   r1   r:   r;   s   @r!   rË   rË   Ž  s;   ø„ ñð˜{õ ðB ØØ"Ø#ØØØØØ!Ø÷q
r"   rË   a  
    The TrOCR Model with a language modeling head. Can be used for summarization.
    This wrapper class is a helper class to correctly load pretrained checkpoints when the causal language model is
    used in combination with the [`EncoderDecoderModel`] framework.
    )Úcustom_introc                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚTrOCRDecoderWrapperc                 ód   •— t         ‰| �  |«       t        |«      | _        | j	                  «        y rA   )r   r   rË   ÚdecoderrÜ   ©r   r   r    s     €r!   r   zTrOCRDecoderWrapper.__init__q  s&   ø€ Ü‰Ñ˜Ô Ü# FÓ+ˆŒØ�‰Õr"   c                 ó&   —  | j                   |i |¤ŽS rA   )rü   )r   Úargsr˜   s      r!   r1   zTrOCRDecoderWrapper.forwardv  s   € Øˆt�|‰|˜TÐ, VÑ,Ð,r"   )r4   r5   r6   r   r1   r:   r;   s   @r!   rú   rú   i  s   ø„ ôö
-r"   rú   zy
    The TrOCR Decoder with a language modeling head. Can be used as the decoder part of [`EncoderDecoderModel`] and
    c                   óX  ‡ — e Zd ZddiZˆ fd„Zd„ Z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
j                  dz  de
j                  dz  dedz  dedz  dedz  dedz  deez  fd„«       Zˆ xZS )ÚTrOCRForCausalLMzoutput_projection.weightz!model.decoder.embed_tokens.weightc                 óâ   •— d|_         d|_        t        ‰| �  |«       t	        |«      | _        t        j                  |j                  |j                  d¬«      | _
        | j                  «        y )NTFrv   )rq   rë   r   r   rú   rÄ   r   rz   rª   rÒ   Úoutput_projectionrÜ   rý   s     €r!   r   zTrOCRForCausalLM.__init__‚  sZ   ø€ Ø ˆÔØ$)ˆÔ!Ü‰Ñ˜Ô Ü(¨Ó0ˆŒ
ä!#§¡¨6×+=Ñ+=¸v×?PÑ?PÐW\Ô!]ˆÔð 	�‰Õr"   c                 óB   — | j                   j                  j                  S rA   ©rÄ   rü   rÓ   ©r   s    r!   Úget_input_embeddingsz%TrOCRForCausalLM.get_input_embeddings�  s   € Ø�z‰z×!Ñ!×.Ñ.Ð.r"   c                 ó:   — || j                   j                  _        y rA   r  )r   Úvalues     r!   Úset_input_embeddingsz%TrOCRForCausalLM.set_input_embeddings�  s   € Ø*/ˆ�
‰
×ÑÕ'r"   c                 ó   — | j                   S rA   ©r  r  s    r!   Úget_output_embeddingsz&TrOCRForCausalLM.get_output_embeddings“  s   € Ø×%Ñ%Ð%r"   c                 ó   — || _         y rA   r  )r   Únew_embeddingss     r!   Úset_output_embeddingsz&TrOCRForCausalLM.set_output_embeddings–  s
   € Ø!/ˆÕr"   Nr#   rƒ   rº   r»   r‚   rß   Úlabelsr¼   r„   rç   rè   r…   c                 ó@  — |	�|	n| j                   j                  }	|
�|
n| j                   j                  }
|�|n| j                   j                  }| j                  j                  ||||||||	|
|¬«
      }| j                  |d   «      }d}|�Ft        «       } ||j                  d| j                   j                  «      |j                  d«      «      }|s|f|dd z   }|�|f|z   S |S t        |||j                  |j                  |j                  |j                  ¬«      S )a
  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.vocab_size]` or -100 (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]`.

        Example:

        ```python
        >>> from transformers import (
        ...     TrOCRConfig,
        ...     TrOCRProcessor,
        ...     TrOCRForCausalLM,
        ...     ViTConfig,
        ...     ViTModel,
        ...     VisionEncoderDecoderModel,
        ... )
        >>> import httpx
        >>> from io import BytesIO
        >>> from PIL import Image

        >>> # TrOCR is a decoder model and should be used within a VisionEncoderDecoderModel
        >>> # init vision2text model with random weights
        >>> encoder = ViTModel(ViTConfig())
        >>> decoder = TrOCRForCausalLM(TrOCRConfig())
        >>> model = VisionEncoderDecoderModel(encoder=encoder, decoder=decoder)

        >>> # If you want to start from the pretrained model, load the checkpoint with `VisionEncoderDecoderModel`
        >>> processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-handwritten")
        >>> model = VisionEncoderDecoderModel.from_pretrained("microsoft/trocr-base-handwritten")

        >>> # load image from the IAM dataset
        >>> url = "https://fki.tic.heia-fr.ch/static/img/a01-122-02.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read())).convert("RGB")
        >>> pixel_values = processor(image, return_tensors="pt").pixel_values
        >>> text = "industry, ' Mr. Brown commented icily. ' Let us have a"

        >>> # training
        >>> model.config.decoder_start_token_id = processor.tokenizer.eos_token_id
        >>> model.config.pad_token_id = processor.tokenizer.pad_token_id
        >>> model.config.vocab_size = model.config.decoder.vocab_size

        >>> labels = processor.tokenizer(text, return_tensors="pt").input_ids
        >>> outputs = model(pixel_values, labels=labels)
        >>> loss = outputs.loss
        >>> round(loss.item(), 2)
        5.30

        >>> # inference
        >>> generated_ids = model.generate(pixel_values)
        >>> generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
        >>> generated_text
        'industry, " Mr. Brown commented icily. " Let us have a'
        ```N)
r#   rƒ   rº   r»   r‚   rß   r¼   r„   rç   rè   r   r)   r   )ÚlossÚlogitsr‚   r€   rå   ræ   )r   r„   rç   rè   rÄ   rü   r  r   rU   rÒ   r   r‚   r€   rå   ræ   )r   r#   rƒ   rº   r»   r‚   rß   r  r¼   r„   rç   rè   r˜   rÁ   r  r  Úloss_fctÚoutputs                     r!   r1   zTrOCRForCausalLM.forward™  sB  € ðP 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆð —*‘*×$Ñ$ØØ)Ø"7Ø#9Ø+Ø'ØØ/Ø!5Ø#ð %ó 
ˆð ×'Ñ'¨°©
Ó3ˆàˆØÐÜ'Ó)ˆHÙ˜FŸK™K¨¨D¯K©K×,BÑ,BÓCÀVÇ[Á[ÐQSÃ_ÓUˆDáØ�Y ¨¨ Ñ,ˆFØ'+Ð'7�D�7˜VÑ#ÐC¸VÐCä0ØØØ#×3Ñ3Ø!×/Ñ/Ø×)Ñ)Ø$×5Ñ5ô
ð 	
r"   )NNNNNNNNNNN)r4   r5   r6   Ú_tied_weights_keysr   r  r
  r  r  r   r+   Ú
LongTensorr9   ÚFloatTensorr   r¥   r¦   r   r1   r:   r;   s   @r!   r  r  z  s?  ø„ ð 5Ð6YÐZÐô	ò/ò0ò&ò0ð ð .2Ø.2Ø:>Ø:>Ø(,Ø26Ø*.Ø!%Ø)-Ø,0Ø#'ñm
à×#Ñ# dÑ*ðm
ð Ÿ™ tÑ+ðm
ð  %×0Ñ0°4Ñ7ð	m
ð
 !&× 0Ñ 0°4Ñ 7ðm
ð  ™ðm
ð ×(Ñ(¨4Ñ/ðm
ð × Ñ  4Ñ'ðm
ð ˜$‘;ðm
ð   $™;ðm
ð # T™kðm
ð ˜D‘[ðm
ð 
Ð2Ñ	2òm
ó ôm
r"   r  ),r7   rN   r+   r   Útorch.nnr   Úactivationsr   Úcache_utilsr   r   r	   Ú
generationr
   Úmasking_utilsr   r   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_utilsr   Úutilsr   r   Úconfiguration_trocrr   Ú
get_loggerr4   ré   Ú	Embeddingr   r=   ÚModulerF   rk   r¨   rÃ   rË   rú   r  Ú__all__rÉ   r"   r!   ú<module>r(     s&  ðñ 6ã ã Ý Ý %å !ß CÑ CÝ )ß JÝ 9ß lÝ -ß ,Ý ,ð 
ˆ×	Ñ	˜HÓ	%€ô; b§l¡lô ;ô8
=˜rŸ|™|ô 
=ô98¨¯©ô 98ôxJ2�R—Y‘Yô J2ôZlÐ2ô lð^ ô.˜?ó .ó ð.ôX
Ð'ô X
ñv ðôô-Ð.ó -óð-ñ ðôô
H
Ð+¨_ó H
óð
H
ðV Ð5Ð
6�r"   