Ë
    ÛÓ^jE¥  ã                   ó¾  — d Z ddlZddlZddlm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 dd	lmZ dd
lmZmZmZmZ ddlmZ  ej0                  e«      Z ed¬«      e G d„ de«      «       «       Z ed¬«      e G d„ de«      «       «       Z ed¬«      e G d„ de«      «       «       Zd„ Zd„ Z G d„ dej@                  «      Z! G d„ dej@                  «      Z" G d„ dej@                  «      Z# G d„ d ej@                  «      Z$ G d!„ d"ej@                  «      Z% G d#„ d$ej@                  «      Z& G d%„ d&ej@                  «      Z' G d'„ d(ej@                  «      Z( G d)„ d*ej@                  «      Z) G d+„ d,ej@                  «      Z* G d-„ d.e«      Z+ G d/„ d0ej@                  «      Z,e G d1„ d2e«      «       Z-e G d3„ d4e-«      «       Z. ed5¬«       G d6„ d7e-«      «       Z/g d8¢Z0y)9z¢PyTorch Donut Swin Transformer model.

This implementation is identical to a regular Swin Transformer, without final layer norm on top of the final hidden
states.é    N)Ú	dataclass)Únné   )Úinitialization)ÚACT2FN)ÚGradientCheckpointingLayer)ÚPreTrainedModel)ÚModelOutputÚauto_docstringÚloggingÚ	torch_inté   )ÚDonutSwinConfigzS
    DonutSwin encoder's outputs, with potential hidden states and attentions.
    )Úcustom_introc                   óÐ   — e Zd ZU dZdZej                  dz  ed<   dZe	ej                  df   dz  ed<   dZ
e	ej                  df   dz  ed<   dZe	ej                  df   dz  ed<   y)ÚDonutSwinEncoderOutputaí  
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    NÚlast_hidden_state.Úhidden_statesÚ
attentionsÚreshaped_hidden_states)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   Útupler   r   © ó    úx/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/donut/modeling_donut_swin.pyr   r   %   s}   … ñð 37Ð�u×(Ñ(¨4Ñ/Ó6Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ó;ØCGÐ˜E %×"3Ñ"3°SÐ"8Ñ9¸DÑ@ÔGr    r   z[
    DonutSwin model's outputs that also contains a pooling of the last hidden states.
    c                   óø   — 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
ej                  df   dz  ed<   dZe
ej                  df   dz  ed<   dZe
ej                  df   dz  ed<   y)	ÚDonutSwinModelOutputa±  
    pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`, *optional*, returned when `add_pooling_layer=True` is passed):
        Average pooling of the last layer hidden-state.
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    Nr   Úpooler_output.r   r   r   )r   r   r   r   r   r   r   r   r$   r   r   r   r   r   r    r!   r#   r#   <   s’   … ñ	ð 37Ð�u×(Ñ(¨4Ñ/Ó6Ø.2€M�5×$Ñ$ tÑ+Ó2Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ó;ØCGÐ˜E %×"3Ñ"3°SÐ"8Ñ9¸DÑ@ÔGr    r#   z5
    DonutSwin outputs for image classification.
    c                   óø   — 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
ej                  df   dz  ed<   dZe
ej                  df   dz  ed<   dZe
ej                  df   dz  ed<   y)	ÚDonutSwinImageClassifierOutputa7  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Classification (or regression if config.num_labels==1) loss.
    logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`):
        Classification (or regression if config.num_labels==1) scores (before SoftMax).
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    NÚlossÚlogits.r   r   r   )r   r   r   r   r'   r   r   r   r(   r   r   r   r   r   r    r!   r&   r&   V   s‘   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ó;ØCGÐ˜E %×"3Ñ"3°SÐ"8Ñ9¸DÑ@ÔGr    r&   c                 óÄ   — | j                   \  }}}}| j                  |||z  |||z  ||«      } | j                  dd«      j                  «       j                  d|||«      }|S )z2
    Partitions the given input into windows.
    é   r   éÿÿÿÿ©ÚshapeÚviewÚ	transposeÚ
contiguous)Úinput_featureÚwindow_sizeÚ
batch_sizeÚheightÚwidthÚnum_channelsÚwindowss          r!   Úwindow_partitionr8   s   st   € ð /<×.AÑ.AÑ+€J�˜˜|Ø!×&Ñ&Ø�F˜kÑ)¨;¸ÀÑ8LÈkÐ[gó€Mð ×%Ñ% a¨Ó+×6Ñ6Ó8×=Ñ=¸bÀ+È{Ð\hÓi€GØ€Nr    c                 óÀ   — | j                   d   }| j                  d||z  ||z  |||«      } | j                  dd«      j                  «       j                  d|||«      } | S )z?
    Merges windows to produce higher resolution features.
    r+   r*   r   r,   )r7   r2   r4   r5   r6   s        r!   Úwindow_reverser:   €   sg   € ð —=‘= Ñ$€LØ�l‰l˜2˜v¨Ñ4°e¸{Ñ6JÈKÐYdÐfrÓs€GØ×Ñ  1Ó%×0Ñ0Ó2×7Ñ7¸¸FÀEÈ<ÓX€GØ€Nr    c            
       óÐ   ‡ — e Zd ZdZdˆ fd„	Zdej                  dededej                  fd„Z	 	 dd	ej                  dz  d
ej                  dz  dedeej                     fd„Zˆ xZS )ÚDonutSwinEmbeddingszW
    Construct the patch and position embeddings. Optionally, also the mask token.
    c                 ó~  •— t         ‰| �  «        t        |«      | _        | j                  j                  }| j                  j
                  | _        |r4t        j                  t        j                  dd|j                  «      «      nd | _        |j                  r=t        j                  t        j                  d|dz   |j                  «      «      | _        nd | _        t        j                  |j                  «      | _        t        j"                  |j$                  «      | _        |j(                  | _        || _        y )Nr   )ÚsuperÚ__init__ÚDonutSwinPatchEmbeddingsÚpatch_embeddingsÚnum_patchesÚ	grid_sizeÚ
patch_gridr   Ú	Parameterr   ÚzerosÚ	embed_dimÚ
mask_tokenÚuse_absolute_embeddingsÚposition_embeddingsÚ	LayerNormÚnormÚDropoutÚhidden_dropout_probÚdropoutÚ
patch_sizeÚconfig)ÚselfrQ   Úuse_mask_tokenrB   Ú	__class__s       €r!   r?   zDonutSwinEmbeddings.__init__�   sâ   ø€ Ü‰ÑÔä 8¸Ó @ˆÔØ×+Ñ+×7Ñ7ˆØ×/Ñ/×9Ñ9ˆŒÙO]œ"Ÿ,™,¤u§{¡{°1°a¸×9IÑ9IÓ'JÔKÐcgˆŒà×)Ò)Ü')§|¡|´E·K±KÀÀ;ÐQRÁ?ÐTZ×TdÑTdÓ4eÓ'fˆDÕ$à'+ˆDÔ$ä—L‘L ×!1Ñ!1Ó2ˆŒ	Ü—z‘z &×"<Ñ"<Ó=ˆŒØ ×+Ñ+ˆŒØˆ�r    Ú
embeddingsr4   r5   Úreturnc                 ó¦  — |j                   d   dz
  }| j                  j                   d   dz
  }t        j                  j	                  «       s||k(  r||k(  r| j                  S | j                  dd…dd…f   }| j                  dd…dd…f   }|j                   d   }|| j
                  z  }	|| j
                  z  }
t        |dz  «      }|j                  d|||«      }|j                  dddd«      }t        j                  j                  ||	|
fdd	¬
«      }|j                  dddd«      j                  dd|«      }t        j                  ||fd¬«      S )a   
        This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher resolution
        images. This method is also adapted to support torch.jit tracing.

        Adapted from:
        - https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
        - https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
        r   Nr+   g      à?r   r   r*   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)r-   rJ   r   ÚjitÚ
is_tracingrP   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolater.   Úcat)rR   rU   r4   r5   rB   Únum_positionsÚclass_pos_embedÚpatch_pos_embedr]   Ú
new_heightÚ	new_widthÚsqrt_num_positionss               r!   Úinterpolate_pos_encodingz,DonutSwinEmbeddings.interpolate_pos_encoding£   s`  € ð !×&Ñ& qÑ)¨AÑ-ˆØ×0Ñ0×6Ñ6°qÑ9¸AÑ=ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×+Ñ+Ð+à×2Ñ2²1°b°q°b°5Ñ9ˆØ×2Ñ2²1°a±b°5Ñ9ˆà×Ñ˜rÑ"ˆà˜tŸ™Ñ.ˆ
Ø˜TŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐI[Ð]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØ˜iÐ(ØØð	 4ó 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆä�y‰y˜/¨?Ð;ÀÔCÐCr    NÚpixel_valuesÚbool_masked_posrk   c                 óÂ  — |j                   \  }}}}| j                  |«      \  }}	| j                  |«      }|j                  «       \  }
}}|�K| j                  j                  |
|d«      }|j                  d«      j                  |«      }|d|z
  z  ||z  z   }| j                  �(|r|| j                  |||«      z   }n|| j                  z   }| j                  |«      }||	fS )Nr+   g      ð?)r-   rA   rL   rY   rH   ÚexpandÚ	unsqueezeÚtype_asrJ   rk   rO   )rR   rl   rm   rk   Ú_r6   r4   r5   rU   Úoutput_dimensionsr3   Úseq_lenÚmask_tokensÚmasks                 r!   ÚforwardzDonutSwinEmbeddings.forwardË   sô   € ð *6×);Ñ);Ñ&ˆˆ<˜ Ø(,×(=Ñ(=¸lÓ(KÑ%ˆ
Ð%Ø—Y‘Y˜zÓ*ˆ
Ø!+§¡Ó!2Ñˆ
�G˜QàÐ&ØŸ/™/×0Ñ0°¸WÀbÓIˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¡zÑ2°[À4Ñ5GÑGˆJà×#Ñ#Ð/Ù'Ø'¨$×*GÑ*GÈ
ÐTZÐ\aÓ*bÑb‘
à'¨$×*BÑ*BÑB�
à—\‘\ *Ó-ˆ
àÐ,Ð,Ð,r    )F©NF)r   r   r   r   r?   r   ÚTensorÚintrk   r   Ú
BoolTensorÚboolr   rw   Ú__classcell__©rT   s   @r!   r<   r<   ‹   s’   ø„ ñõð&&D°5·<±<ð &DÈð &DÐUXð &DÐ]b×]iÑ]ió &DðV 48Ø).ñ	-à×'Ñ'¨$Ñ.ð-ð ×)Ñ)¨DÑ0ð-ð #'ð	-ð
 
ˆu�|‰|Ñ	÷-r    r<   c                   óv   ‡ — e Zd ZdZˆ fd„Zd„ Zdej                  dz  deej                  ee
   f   fd„Zˆ xZS )r@   zì
    This class turns `pixel_values` of shape `(batch_size, num_channels, height, width)` into the initial
    `hidden_states` (patch embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer.
    c                 óæ  •— t         ‰| �  «        |j                  |j                  }}|j                  |j
                  }}t        |t        j                  j                  «      r|n||f}t        |t        j                  j                  «      r|n||f}|d   |d   z  |d   |d   z  z  }|| _        || _
        |d   |d   z  |d   |d   z  f| _        t        j                  ||||¬«      | _        y )Nr   r   )Úkernel_sizeÚstride)r>   r?   Ú
image_sizerP   r6   rG   Ú
isinstanceÚcollectionsÚabcÚIterablerB   rC   r   ÚConv2dÚ
projection)rR   rQ   rƒ   rP   r6   Úhidden_sizerB   rT   s          €r!   r?   z!DonutSwinPatchEmbeddings.__init__ï   sì   ø€ Ü‰ÑÔØ!'×!2Ñ!2°F×4EÑ4E�Jˆ
Ø$*×$7Ñ$7¸×9IÑ9I�kˆÜ#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ü#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ø! !‘}¨
°1©Ñ5¸*ÀQ¹-È:ÐVWÉ=Ñ:XÑYˆØ$ˆŒØ&ˆÔØ$ Q™-¨:°a©=Ñ8¸*ÀQ¹-È:ÐVWÉ=Ñ:XÐYˆŒäŸ)™) L°+È:Ð^hÔiˆ�r    c                 ón  — || j                   d   z  dk7  rDd| j                   d   || j                   d   z  z
  f}t        j                  j                  ||«      }|| j                   d   z  dk7  rFddd| j                   d   || j                   d   z  z
  f}t        j                  j                  ||«      }|S )z9Pad pixel_values to be divisible by patch_size if needed.r   r   )rP   r   rb   Úpad)rR   rl   r4   r5   Ú
pad_valuess        r!   Ú	maybe_padz"DonutSwinPatchEmbeddings.maybe_padü   s±   € à�4—?‘? 1Ñ%Ñ%¨Ò*Ø˜TŸ_™_¨QÑ/°%¸$¿/¹/È!Ñ:LÑ2LÑLÐMˆJÜŸ=™=×,Ñ,¨\¸:ÓFˆLØ�D—O‘O AÑ&Ñ&¨!Ò+Ø˜Q  4§?¡?°1Ñ#5¸ÀÇÁÐQRÑASÑ8SÑ#SÐTˆJÜŸ=™=×,Ñ,¨\¸:ÓFˆLØÐr    rl   NrV   c                 óà   — |j                   \  }}}}| j                  |||«      }| j                  |«      }|j                   \  }}}}||f}|j                  d«      j	                  dd«      }||fS )Nr*   r   )r-   rŽ   r‰   Úflattenr/   )rR   rl   rr   r6   r4   r5   rU   rs   s           r!   rw   z DonutSwinPatchEmbeddings.forward  s}   € Ø)5×);Ñ);Ñ&ˆˆ<˜ à—~‘~ l°F¸EÓBˆØ—_‘_ \Ó2ˆ
Ø(×.Ñ.Ñˆˆ1ˆf�eØ# U˜OÐØ×'Ñ'¨Ó*×4Ñ4°Q¸Ó:ˆ
àÐ,Ð,Ð,r    )r   r   r   r   r?   rŽ   r   r   r   ry   rz   rw   r}   r~   s   @r!   r@   r@   è   sF   ø„ ñôjòð	- E×$5Ñ$5¸Ñ$<ð 	-ÀÀuÇ|Á|ÐUZÐ[^ÑU_ÐG_ÑA`÷ 	-r    r@   c                   ó²   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dededej                  fd	„Zdej                  d
e	eef   dej                  fd„Z
ˆ xZS )ÚDonutSwinPatchMergingzd
    Patch Merging Layer.

    Args:
        dim (`int`):
            Number of input channels.
    r]   rV   Nc                 ó¢   •— t         ‰| �  «        t        j                  d|z  d|z  d¬«      | _        t        j
                  d|z  «      | _        y )Né   r*   F©Úbias)r>   r?   r   ÚLinearÚ	reductionrK   rL   )rR   r]   rT   s     €r!   r?   zDonutSwinPatchMerging.__init__  s>   ø€ Ü‰ÑÔÜŸ™ 1 s¡7¨A°©G¸%Ô@ˆŒÜ—L‘L  S¡Ó)ˆ�	r    r1   r4   r5   c           
      ó~   — |dz  dk(  s|dz  dk(  r,t         j                  j                  |ddd|dz  d|dz  f«      }|S )zPPad input feature map to be divisible by 2 in both spatial dimensions if needed.r*   r   r   )r   rb   rŒ   )rR   r1   r4   r5   s       r!   rŽ   zDonutSwinPatchMerging.maybe_pad!  sL   € à�Q‰J˜!ŠO ¨¡¨a¢ÜŸM™M×-Ñ-¨m¸aÀÀAÀuÈqÁyÐRSÐU[Ð^_ÑU_Ð=`ÓaˆMØÐr    Úinput_dimensionsc                 óœ  — |\  }}|j                   \  }}}|j                  ||||«      }| j                  |||«      }t        j                  t        d«      D ��	cg c]%  }t        d«      D ]  }	|d d …|	d d…|d d…d d …f   ‘Œ Œ' c}	}d¬«      }|j                  |dd|z  «      }| j                  |«      }| j                  |«      }|S c c}	}w )Nr*   r+   r\   r”   )r-   r.   rŽ   r   rd   ÚrangerL   r˜   )
rR   r1   rš   r4   r5   r3   r]   r6   ÚcolÚrows
             r!   rw   zDonutSwinPatchMerging.forward'  sÙ   € Ø(‰ˆ�à(5×(;Ñ(;Ñ%ˆ
�C˜à%×*Ñ*¨:°v¸uÀlÓSˆàŸ™ }°f¸eÓDˆäŸ	™	Ü<AÀ!»H×Y°SÔPUÐVWÓPXÒYÈˆ]š1˜c˜f 1˜f c f¨1 fªaÐ/Ó0ÐYÐ0ÓYÐ_aô
ˆð &×*Ñ*¨:°r¸1¸|Ñ;KÓLˆàŸ	™	 -Ó0ˆØŸ™ }Ó5ˆàÐùó Zs   Á*C
)r   r   r   r   rz   r?   r   ry   rŽ   r   rw   r}   r~   s   @r!   r’   r’     su   ø„ ñð*˜Cð * Dõ *ð
 u§|¡|ð ¸Sð Èð ÐQV×Q]ÑQ]ó ð U§\¡\ð ÀUÈ3ÐPSÈ8Á_ð ÐY^×YeÑYe÷ r    r’   c            
       ó�   ‡ — e Zd Zˆ fd„Z	 	 d	dej
                  dej                  dz  dedz  deej
                     fd„Z	d„ Z
ˆ xZS )
ÚDonutSwinSelfAttentionc                 ó¼  •— t         ‰| �  «        ||z  dk7  rt        d|› d|› d�«      ‚|| _        t	        ||z  «      | _        | j                  | j
                  z  | _        t        |t        j                  j                  «      r|n||f| _        t        j                  t        j                  d| j                  d   z  dz
  d| j                  d   z  dz
  z  |«      «      | _        | j#                  d| j%                  «       «       t        j&                  | j                  | j                  |j(                  ¬«      | _        t        j&                  | j                  | j                  |j(                  ¬«      | _        t        j&                  | j                  | j                  |j(                  ¬«      | _        t        j0                  |j2                  «      | _        y )	Nr   zThe hidden size (z6) is not a multiple of the number of attention heads (ú)r*   r   Úrelative_position_indexr•   )r>   r?   Ú
ValueErrorÚnum_attention_headsrz   Úattention_head_sizeÚall_head_sizer„   r…   r†   r‡   r2   r   rE   r   rF   Úrelative_position_bias_tableÚregister_bufferÚcreate_relative_position_indexr—   Úqkv_biasÚqueryÚkeyÚvaluerM   Úattention_probs_dropout_probrO   ©rR   rQ   r]   Ú	num_headsr2   rT   s        €r!   r?   zDonutSwinSelfAttention.__init__=  sˆ  ø€ Ü‰ÑÔØ�‰?˜aÒÜØ# C 5Ð(^Ð_hÐ^iÐijÐkóð ð $-ˆÔ Ü#& s¨Y¡Ó#7ˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔä% k´;·?±?×3KÑ3KÔL‰KÐS^Ð`kÐRlð 	Ôô -/¯L©LÜ�K‰K˜˜T×-Ñ-¨aÑ0Ñ0°1Ñ4¸¸T×=MÑ=MÈaÑ=PÑ9PÐSTÑ9TÑUÐW`Óaó-
ˆÔ)ð 	×ÑÐ6¸×8[Ñ8[Ó8]Ô^ä—Y‘Y˜t×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
Ü—9‘9˜T×/Ñ/°×1CÑ1CÈ&Ï/É/ÔZˆŒÜ—Y‘Y˜t×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
ä—z‘z &×"EÑ"EÓFˆ�r    Nr   Úattention_maskÚoutput_attentionsrV   c                 ó€  — |j                   \  }}}||d| j                  f}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }	| j                  |«      j                  |«      j	                  dd«      }
t        j                  ||	j	                  dd«      «      }|t        j                  | j                  «      z  }| j                  | j                  j                  d«         }|j                  | j                  d   | j                  d   z  | j                  d   | j                  d   z  d«      }|j                  ddd«      j                  «       }||j!                  d«      z   }|�r|j                   d   }|j                  ||z  || j"                  ||«      }||j!                  d«      j!                  d«      z   }|j                  d| j"                  ||«      }t$        j&                  j)                  |d¬«      }| j+                  |«      }t        j                  ||
«      }|j                  dddd«      j                  «       }|j-                  «       d d | j.                  fz   }|j                  |«      }|r||f}|S |f}|S )Nr+   r   r*   éþÿÿÿr   r\   r   )r-   r¦   r¬   r.   r/   r­   r®   r   ÚmatmulÚmathÚsqrtr¨   r£   r2   ra   r0   rp   r¥   r   rb   ÚsoftmaxrO   rY   r§   )rR   r   r²   r³   r3   r]   r6   Úhidden_shapeÚquery_layerÚ	key_layerÚvalue_layerÚattention_scoresÚrelative_position_biasÚ
mask_shapeÚattention_probsÚcontext_layerÚnew_context_layer_shapeÚoutputss                     r!   rw   zDonutSwinSelfAttention.forwardW  s¶  € ð )6×(;Ñ(;Ñ%ˆ
�C˜Ø" C¨¨T×-EÑ-EÐFˆà—j‘j Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆØ—H‘H˜]Ó+×0Ñ0°Ó>×HÑHÈÈAÓNˆ	Ø—j‘j Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆô !Ÿ<™<¨°Y×5HÑ5HÈÈRÓ5PÓQÐà+¬d¯i©i¸×8PÑ8PÓ.QÑQÐà!%×!BÑ!BÀ4×C_ÑC_×CdÑCdÐegÓChÑ!iÐØ!7×!<Ñ!<Ø×Ñ˜QÑ $×"2Ñ"2°1Ñ"5Ñ5°t×7GÑ7GÈÑ7JÈT×M]ÑM]Ð^_ÑM`Ñ7`Ðbdó"
Ðð "8×!?Ñ!?ÀÀ1ÀaÓ!H×!SÑ!SÓ!UÐØ+Ð.D×.NÑ.NÈqÓ.QÑQÐàÐ%à'×-Ñ-¨aÑ0ˆJØ/×4Ñ4Ø˜jÑ(¨*°d×6NÑ6NÐPSÐUXó Ðð  0°.×2JÑ2JÈ1Ó2M×2WÑ2WÐXYÓ2ZÑZÐØ/×4Ñ4°R¸×9QÑ9QÐSVÐX[Ó\Ðô Ÿ-™-×/Ñ/Ð0@ÀbÐ/ÓIˆð Ÿ,™, Ó7ˆäŸ™ _°kÓBˆØ%×-Ñ-¨a°°A°qÓ9×DÑDÓFˆØ"/×"4Ñ"4Ó"6°s¸Ð";¸t×?QÑ?QÐ>SÑ"SÐØ%×*Ñ*Ð+BÓCˆá6G�= /Ð2ˆàˆð O\ÐM]ˆàˆr    c                 ó†  — t        j                  | j                  d   «      }t        j                  | j                  d   «      }t        j                  t        j                  ||gd¬«      «      }t        j
                  |d«      }|d d …d d …d f   |d d …d d d …f   z
  }|j                  ddd«      j                  «       }|d d …d d …dfxx   | j                  d   dz
  z  cc<   |d d …d d …dfxx   | j                  d   dz
  z  cc<   |d d …d d …dfxx   d| j                  d   z  dz
  z  cc<   |j                  d«      }|S )Nr   r   Úij)Úindexingr*   r+   )	r   Úaranger2   ÚstackÚmeshgridr�   ra   r0   Úsum)rR   Úcoords_hÚcoords_wÚcoordsÚcoords_flattenÚrelative_coordsr£   s          r!   rª   z5DonutSwinSelfAttention.create_relative_position_indexŠ  s-  € ä—<‘< × 0Ñ 0°Ñ 3Ó4ˆÜ—<‘< × 0Ñ 0°Ñ 3Ó4ˆÜ—‘œUŸ^™^¨X°xÐ,@È4ÔPÓQˆÜŸ™ v¨qÓ1ˆØ(ªªA¨t¨Ñ4°~ÂaÈÊqÀjÑ7QÑQˆØ)×1Ñ1°!°Q¸Ó:×EÑEÓGˆØšš1˜a˜Ó  D×$4Ñ$4°QÑ$7¸!Ñ$;Ñ;Ó Øšš1˜a˜Ó  D×$4Ñ$4°QÑ$7¸!Ñ$;Ñ;Ó Øšš1˜a˜Ó  A¨×(8Ñ(8¸Ñ(;Ñ$;¸aÑ$?Ñ?Ó Ø"1×"5Ñ"5°bÓ"9ÐØ&Ð&r    rx   )r   r   r   r?   r   ry   r   r|   r   rw   rª   r}   r~   s   @r!   r    r    <  s^   ø„ ôGð: 48Ø).ñ	1à—|‘|ð1ð ×)Ñ)¨DÑ0ð1ð   $™;ð	1ð
 
ˆu�|‰|Ñ	ó1öf'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 )ÚDonutSwinSelfOutputc                 ó    •— t         ‰| �  «        t        j                  ||«      | _        t        j
                  |j                  «      | _        y ©N)r>   r?   r   r—   ÚdenserM   r¯   rO   ©rR   rQ   r]   rT   s      €r!   r?   zDonutSwinSelfOutput.__init__›  s6   ø€ Ü‰ÑÔÜ—Y‘Y˜s CÓ(ˆŒ
Ü—z‘z &×"EÑ"EÓFˆ�r    r   Úinput_tensorrV   c                 óJ   — | j                  |«      }| j                  |«      }|S rÔ   ©rÕ   rO   )rR   r   r×   s      r!   rw   zDonutSwinSelfOutput.forward   s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆàÐr    ©r   r   r   r?   r   ry   rw   r}   r~   s   @r!   rÒ   rÒ   š  s2   ø„ ôGð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r    rÒ   c            
       óŠ   ‡ — e Zd Zˆ fd„Z	 	 ddej
                  dej                  dz  dedz  deej
                     fd„Z	ˆ xZ
S )	ÚDonutSwinAttentionc                 ój   •— t         ‰| �  «        t        ||||«      | _        t	        ||«      | _        y rÔ   )r>   r?   r    rR   rÒ   Úoutputr°   s        €r!   r?   zDonutSwinAttention.__init__©  s.   ø€ Ü‰ÑÔÜ*¨6°3¸	À;ÓOˆŒ	Ü)¨&°#Ó6ˆ�r    Nr   r²   r³   rV   c                 óh   — | j                  |||«      }| j                  |d   |«      }|f|dd  z   }|S )Nr   r   )rR   rÞ   )rR   r   r²   r³   Úself_outputsÚattention_outputrÄ   s          r!   rw   zDonutSwinAttention.forward®  sE   € ð —y‘y °Ð@QÓRˆØŸ;™; |°A¡¸ÓFÐØ#Ð%¨°Q°RÐ(8Ñ8ˆØˆr    rx   )r   r   r   r?   r   ry   r   r|   r   rw   r}   r~   s   @r!   rÜ   rÜ   ¨  sW   ø„ ô7ð 48Ø).ñ		à—|‘|ð	ð ×)Ñ)¨DÑ0ð	ð   $™;ð		ð
 
ˆu�|‰|Ñ	÷	r    rÜ   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚDonutSwinIntermediatec                 ó  •— t         ‰| �  «        t        j                  |t	        |j
                  |z  «      «      | _        t        |j                  t        «      rt        |j                     | _        y |j                  | _        y rÔ   )r>   r?   r   r—   rz   Ú	mlp_ratiorÕ   r„   Ú
hidden_actÚstrr   Úintermediate_act_fnrÖ   s      €r!   r?   zDonutSwinIntermediate.__init__¼  sa   ø€ Ü‰ÑÔÜ—Y‘Y˜s¤C¨×(8Ñ(8¸3Ñ(>Ó$?Ó@ˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r    r   rV   c                 óJ   — | j                  |«      }| j                  |«      }|S rÔ   )rÕ   rè   ©rR   r   s     r!   rw   zDonutSwinIntermediate.forwardÄ  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr    rÚ   r~   s   @r!   rã   rã   »  s#   ø„ ô9ð 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 )ÚDonutSwinOutputc                 óÌ   •— t         ‰| �  «        t        j                  t	        |j
                  |z  «      |«      | _        t        j                  |j                  «      | _	        y rÔ   )
r>   r?   r   r—   rz   rå   rÕ   rM   rN   rO   rÖ   s      €r!   r?   zDonutSwinOutput.__init__Ì  sF   ø€ Ü‰ÑÔÜ—Y‘Yœs 6×#3Ñ#3°cÑ#9Ó:¸CÓ@ˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r    r   rV   c                 óJ   — | j                  |«      }| j                  |«      }|S rÔ   rÙ   rê   s     r!   rw   zDonutSwinOutput.forwardÑ  s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØÐr    rÚ   r~   s   @r!   rì   rì   Ë  s#   ø„ ô>ð
 U§\¡\ð °e·l±l÷ r    rì   c                   ór   ‡ — e Zd ZdZd	deddfˆ fd„Zdej                  dej                  fd„Zde	fd„Z
ˆ xZS )
ÚDonutDropPathzÏStochastic depth (DropPath) per sample, for residual blocks.

    Identity when ``drop_prob`` is 0 or outside training. See `Deep Networks with Stochastic Depth
    <https://arxiv.org/abs/1603.09382>`_.
    Ú	drop_probrV   Nc                 ó0   •— t         ‰| �  «        || _        y rÔ   )r>   r?   rñ   )rR   rñ   rT   s     €r!   r?   zDonutDropPath.__init__ß  s   ø€ Ü‰ÑÔØ"ˆ�r    r   c                 óP  — | j                   dk(  s| j                  s|S d| j                   z
  }|j                  d   fd|j                  dz
  z  z   }t	        j
                  ||j                  |j                  ¬«      }t	        j                  ||z   «      }|j                  |«      |z  S )Nç        r   r   )r   ©ÚdtypeÚdevice)
rñ   Útrainingr-   Úndimr   Úrandrö   r÷   ÚfloorÚdiv)rR   r   Ú	keep_probr-   Úrandom_tensors        r!   rw   zDonutDropPath.forwardã  s—   € Ø�>‰>˜SÒ ¨¯ªØ Ð Ø˜Ÿ™Ñ&ˆ	Ø×$Ñ$ QÑ'Ð)¨D°M×4FÑ4FÈÑ4JÑ,KÑKˆÜŸ
™
 5°×0CÑ0CÈM×L`ÑL`ÔaˆÜŸ™ M°IÑ$=Ó>ˆØ× Ñ  Ó+¨mÑ;Ð;r    c                 ó    — d| j                   › �S )Nzp=)rñ   ©rR   s    r!   Ú
extra_reprzDonutDropPath.extra_reprì  s   € Ø�D—N‘NÐ#Ð$Ð$r    )rô   )r   r   r   r   Úfloatr?   r   ry   rw   rç   r  r}   r~   s   @r!   rð   rð   Ø  sB   ø„ ññ# %ð #°$õ #ð< U§\¡\ð <°e·l±ló <ð%˜C÷ %r    rð   c                   ó  ‡ — e Zd Zdˆ fd„	Zd„ Zdededej                  dej                  dej                  dz  f
d	„Z
d
„ Z	 	 ddej                  deeef   dedz  dedz  deej                  ej                  f   f
d„Zˆ xZS )ÚDonutSwinLayerc                 óì  •— t         ‰| �  «        |j                  | _        || _        |j                  | _        || _        t        j                  ||j                  ¬«      | _	        t        |||| j                  ¬«      | _        |dkD  rt        |«      nt        j                  «       | _        t        j                  ||j                  ¬«      | _        t!        ||«      | _        t%        ||«      | _        y )N)Úeps)r2   rô   )r>   r?   Úchunk_size_feed_forwardÚ
shift_sizer2   Úinput_resolutionr   rK   Úlayer_norm_epsÚlayernorm_beforerÜ   Ú	attentionrð   ÚIdentityÚ	drop_pathÚlayernorm_afterrã   Úintermediaterì   rÞ   )rR   rQ   r]   r	  r±   Údrop_path_rater  rT   s          €r!   r?   zDonutSwinLayer.__init__ò  sÀ   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$Ø$ˆŒØ!×-Ñ-ˆÔØ 0ˆÔÜ "§¡¨S°f×6KÑ6KÔ LˆÔÜ+¨F°C¸ÐPT×P`ÑP`ÔaˆŒØ:HÈ3Ò:Nœ ~Ô6ÔTV×T_ÑT_ÓTaˆŒÜ!Ÿ|™|¨C°V×5JÑ5JÔKˆÔÜ1°&¸#Ó>ˆÔÜ% f¨cÓ2ˆ�r    c                 ó  — t        |«      | j                  k  rgt        d«      | _        t        j
                  j                  «       r(t	        j                   t	        j                  |«      «      n
t        |«      | _        y y ©Nr   )Úminr2   r   r  r   r^   r_   Útensor)rR   r	  s     r!   Úset_shift_and_window_sizez(DonutSwinLayer.set_shift_and_window_sizeÿ  s\   € ÜÐÓ  D×$4Ñ$4Ò4ä'¨›lˆDŒOä=B¿Y¹Y×=QÑ=QÔ=S”—	‘	œ%Ÿ,™,Ð'7Ó8Ô9ÔY\Ð]mÓYnð Õð 5r    r4   r5   rö   r÷   rV   Nc                 óì  — | j                   dk  ryt        j                  ||¬«      }t        j                  ||¬«      }||| j                  z
  k\  j	                  «       ||| j                   z
  k\  j	                  «       z   }||| j                  z
  k\  j	                  «       ||| j                   z
  k\  j	                  «       z   }|ddd…ddf   dz  |dddd…df   z   j                  |«      }	t        |	| j                  «      }
|
j                  d| j                  | j                  z  «      }
|
j                  d«      |
j                  d«      z
  }|j                  |dk7  d«      j                  |dk(  d	«      }|S )
uµ  Build the cyclic-shift attention mask for shifted-window MSA; returns None when shift_size is 0.

        Each (h, w) position belongs to one of 9 cyclic-shift regions (3 along each axis), encoded
        as ``h_region * 3 + w_region``. Regions per axis:
        - 0: indices ``[0, axis - window_size)``
        - 1: indices ``[axis - window_size, axis - shift_size)``
        - 2: indices ``[axis - shift_size, axis)``
        Implementation note: a single arithmetic pass on `torch.arange` (two comparisons +
        broadcast add) replaces the original 9-iteration nested-Python-loop slice-assignment â€”
        fully vectorised, no per-cell host-side scatter, no GPUâ†”host sync.
        r   N©r÷   r   r+   r   r*   g      YÀrô   )
r  r   rÈ   r2   ÚlongÚtor8   r.   rp   Úmasked_fill)rR   r4   r5   rö   r÷   Úh_idxÚw_idxÚh_regionÚw_regionÚimg_maskÚmask_windowsÚ	attn_masks               r!   Úget_attn_maskzDonutSwinLayer.get_attn_mask  si  € ð �?‰?˜aÒØÜ—‘˜V¨FÔ3ˆÜ—‘˜U¨6Ô2ˆØ˜V d×&6Ñ&6Ñ6Ñ6×<Ñ<Ó>À%È6ÐTX×TcÑTcÑKcÑBc×AiÑAiÓAkÑkˆØ˜U T×%5Ñ%5Ñ5Ñ5×;Ñ;Ó=ÀÈ%ÐRV×RaÑRaÑJaÑAa×@gÑ@gÓ@iÑiˆØ˜T¢1 d¨DÐ0Ñ1°AÑ5¸ÀÀtÊQÐPTÐATÑ8UÑU×YÑYÐZ_Ó`ˆÜ'¨°$×2BÑ2BÓCˆØ#×(Ñ(¨¨T×-=Ñ-=À×@PÑ@PÑ-PÓQˆØ ×*Ñ*¨1Ó-°×0FÑ0FÀqÓ0IÑIˆ	Ø×)Ñ)¨)°q©.¸&ÓA×MÑMÈiÐ[\ÉnÐ^aÓbˆ	ØÐr    c                 óþ   — | j                   || j                   z  z
  | j                   z  }| j                   || j                   z  z
  | j                   z  }ddd|d|f}t        j                  j                  ||«      }||fS r  )r2   r   rb   rŒ   )rR   r   r4   r5   Ú	pad_rightÚ
pad_bottomr�   s          r!   rŽ   zDonutSwinLayer.maybe_pad!  s�   € Ø×%Ñ%¨°×0@Ñ0@Ñ(@Ñ@ÀD×DTÑDTÑTˆ	Ø×&Ñ&¨°$×2BÑ2BÑ)BÑBÀd×FVÑFVÑVˆ
Ø˜˜A˜y¨!¨ZÐ8ˆ
ÜŸ™×)Ñ)¨-¸ÓDˆØ˜jÐ(Ð(r    r   rš   r³   Úalways_partitionc                 óÈ  — |s| j                  |«       n	 |\  }}|j                  «       \  }}}	|}
| j                  |«      }|j                  ||||	«      }| j	                  |||«      \  }}|j
                  \  }}}}| j                  dkD  r1t        j                  || j                   | j                   fd¬«      }n|}t        || j                  «      }|j                  d| j                  | j                  z  |	«      }| j                  |||j                  |j                  ¬«      }| j                  |||¬«      }|d   }|j                  d| j                  | j                  |	«      }t        || j                  ||«      }| j                  dkD  r/t        j                  || j                  | j                  fd¬«      }n|}|d   dkD  xs |d   dkD  }|r|d d …d |…d |…d d …f   j!                  «       }|j                  |||z  |	«      }|
| j#                  |«      z   }| j%                  |«      }| j'                  |«      }|| j)                  |«      z   }|r	||d	   f}|S |f}|S )
Nr   )r   r*   )ÚshiftsÚdimsr+   rõ   )r³   r   é   r   )r  rY   r  r.   rŽ   r-   r  r   Úrollr8   r2   r#  rö   r÷   r  r:   r0   r  r  r  rÞ   )rR   r   rš   r³   r'  r4   r5   r3   rr   ÚchannelsÚshortcutr�   Ú
height_padÚ	width_padÚshifted_hidden_statesÚhidden_states_windowsr"  Úattention_outputsrá   Úattention_windowsÚshifted_windowsÚ
was_paddedÚlayer_outputÚlayer_outputss                           r!   rw   zDonutSwinLayer.forward(  sš  € ñ  Ø×*Ñ*Ð+;Õ<àØ(‰ˆ�Ø"/×"4Ñ"4Ó"6Ñˆ
�A�xØ ˆà×-Ñ-¨mÓ<ˆà%×*Ñ*¨:°v¸uÀhÓOˆð %)§N¡N°=À&È%Ó$PÑ!ˆ�zà&3×&9Ñ&9Ñ#ˆˆ:�y !à�?‰?˜QÒÜ$)§J¡J¨}ÀtÇÁÐFVÐY]×YhÑYhÐXhÐEiÐpvÔ$wÑ!à$1Ð!ô !1Ð1FÈ×HXÑHXÓ YÐØ 5× :Ñ :¸2¸t×?OÑ?OÐRV×RbÑRbÑ?bÐdlÓ mÐØ×&Ñ&Ø˜	¨×)<Ñ)<ÐEZ×EaÑEað 'ó 
ˆ	ð !ŸN™NÐ+@À)Ð_p˜NÓqÐà,¨QÑ/Ðà,×1Ñ1°"°d×6FÑ6FÈ×HXÑHXÐZbÓcÐÜ(Ð):¸D×<LÑ<LÈjÐZcÓdˆð �?‰?˜QÒÜ %§
¡
¨?ÀDÇOÁOÐUY×UdÑUdÐCeÐlrÔ sÑà /Ðà ‘] QÑ&Ò;¨*°Q©-¸!Ñ*;ˆ
ÙØ 1²!°W°f°W¸f¸u¸fÂaÐ2GÑ H× SÑ SÓ UÐà-×2Ñ2°:¸vÈ¹~ÈxÓXÐà  4§>¡>Ð2CÓ#DÑDˆà×+Ñ+¨MÓ:ˆØ×(Ñ(¨Ó6ˆØ$ t§{¡{°<Ó'@Ñ@ˆá@Q˜Ð'8¸Ñ';Ð<ˆØÐð YeÐWfˆØÐr    )rô   r   ©FF)r   r   r   r?   r  rz   r   rö   r÷   ry   r#  rŽ   r   r|   rw   r}   r~   s   @r!   r  r  ñ  sµ   ø„ õ3òð Cð °ð ¸E¿K¹Kð ÐQV×Q]ÑQ]ð Ðbg×bnÑbnÐquÑbuó ò2)ð */Ø(-ñ>à—|‘|ð>ð    S ™/ð>ð   $™;ð	>ð
  ™+ð>ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*÷>r    r  c                   ó„   ‡ — e Zd Zˆ fd„Z	 	 d	dej
                  deeef   dedz  dedz  deej
                     f
d„Z	ˆ xZ
S )
ÚDonutSwinStagec                 óH  •— t         ‰	| �  «        || _        || _        t	        j
                  t        |«      D �cg c]-  }t        ||||||   |dz  dk(  rdn|j                  dz  ¬«      ‘Œ/ c}«      | _	        |� ||¬«      | _
        d| _        y d | _
        d| _        y c c}w )Nr*   r   )rQ   r]   r	  r±   r  r  r\   F)r>   r?   rQ   r]   r   Ú
ModuleListrœ   r  r2   ÚblocksÚ
downsampleÚpointing)
rR   rQ   r]   r	  Údepthr±   r  r?  ÚirT   s
            €r!   r?   zDonutSwinStage.__init__k  s®   ø€ Ü‰ÑÔØˆŒØˆŒÜ—m‘mô ˜u›ö
ð ô Ø!ØØ%5Ø'Ø#,¨Q¡<Ø%&¨¡U¨a¢Z™q°f×6HÑ6HÈAÑ6Möò
ó
ˆŒð Ð!Ù(¨SÔ1ˆDŒOð ˆ�ð #ˆDŒOàˆ�ùò'
s   º2Br   rš   r³   Nr'  rV   c                 ó  — |\  }}t        | j                  «      D ]  \  }} |||||«      }	|	d   }Œ |}
| j                  �)|dz   dz  |dz   dz  }}||||f}| j                  |
|«      }n||||f}||
|f}|r|	dd  z  }|S )Nr   r   r*   )Ú	enumerater>  r?  )rR   r   rš   r³   r'  r4   r5   rB  Úlayer_moduler8  Ú!hidden_states_before_downsamplingÚheight_downsampledÚwidth_downsampledrs   Ústage_outputss                  r!   rw   zDonutSwinStage.forward…  sÑ   € ð )‰ˆ�Ü(¨¯©Ó5ò 	-‰OˆAˆ|Ù(¨Ð8HÐJ[Ð]mÓnˆMà)¨!Ñ,‰Mð	-ð
 -:Ð)Ø�?‰?Ð&Ø5;¸a±ZÀAÑ4EÈÐPQÉ	ÐVWÑGWÐ 1ÐØ!'¨Ð0BÐDUÐ VÐØ ŸO™OÐ,MÐO_Ó`‰Mà!'¨°¸Ð >Ðà&Ð(IÐK\Ð]ˆáØ˜]¨1¨2Ð.Ñ.ˆMØÐr    r9  )r   r   r   r?   r   ry   r   rz   r|   rw   r}   r~   s   @r!   r;  r;  j  sb   ø„ ôð< */Ø(-ñà—|‘|ðð    S ™/ðð   $™;ð	ð
  ™+ðð 
ˆu�|‰|Ñ	÷r    r;  c                   ó”   ‡ — e Zd Zˆ fd„Z	 	 	 	 	 ddej
                  deeef   de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 )ÚDonutSwinEncoderc                 óà  •— t         ‰| �  «        t        |j                  «      | _        || _        t        j                  d|j                  t        |j                  «      d¬«      D �cg c]  }|j                  «       ‘Œ }}t        j                  t        | j                  «      D �cg c]¥  }t        |t        |j                   d|z  z  «      |d   d|z  z  |d   d|z  z  f|j                  |   |j"                  |   |t        |j                  d | «      t        |j                  d |dz    «       || j                  dz
  k  rt$        nd ¬«      ‘Œ§ c}«      | _        d| _        y c c}w c c}w )Nr   Úcpur  r*   r   )rQ   r]   r	  rA  r±   r  r?  F)r>   r?   ÚlenÚdepthsÚ
num_layersrQ   r   Úlinspacer  rË   Úitemr   r=  rœ   r;  rz   rG   r±   r’   ÚlayersÚgradient_checkpointing)rR   rQ   rC   ÚxÚdprÚi_layerrT   s         €r!   r?   zDonutSwinEncoder.__init__£  sM  ø€ Ü‰ÑÔÜ˜fŸm™mÓ,ˆŒØˆŒÜ!&§¡°°6×3HÑ3HÌ#ÈfÏmÉmÓJ\ÐejÔ!kÖl˜Aˆq�v‰v�xÐlˆÐlÜ—m‘mô  % T§_¡_Ó5öð ô Ø!Ü˜F×,Ñ,¨q°'©zÑ9Ó:Ø&/°¡l°q¸'±zÑ&BÀIÈaÁLÐUVÐX_ÑU_ÑD`Ð%aØ Ÿ-™-¨Ñ0Ø$×.Ñ.¨wÑ7Ø!¤# f§m¡m°H°WÐ&=Ó">ÄÀVÇ]Á]ÐS`ÐU\Ð_`ÑU`ÐEaÓAbÐcØ9@À4Ç?Á?ÐUVÑCVÒ9VÕ4Ð]aöòó
ˆŒð ',ˆÕ#ùò! mùòs   Á)E&Â(B*E+r   rš   r³   NÚoutput_hidden_statesÚ(output_hidden_states_before_downsamplingr'  Úreturn_dictrV   c                 óÎ  — |rdnd }|rdnd }	|rdnd }
|rE|j                   \  }}} |j                  |g|¢|‘­Ž }|j                  dddd«      }||fz  }|	|fz  }	t        | j                  «      D ]Ï  \  }} |||||«      }|d   }|d   }|d   }|d   |d   f}|rP|rN|j                   \  }}} |j                  |g|d   |d   f¢|‘­Ž }|j                  dddd«      }||fz  }|	|fz  }	nI|rG|sE|j                   \  }}} |j                  |g|¢|‘­Ž }|j                  dddd«      }||fz  }|	|fz  }	|sŒÈ|
|dd  z  }
ŒÑ |st        d„ |||
fD «       «      S t        |||
|	¬	«      S )
Nr   r   r   r   r*   rµ   r+   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wrÔ   r   )Ú.0Úvs     r!   ú	<genexpr>z+DonutSwinEncoder.forward.<locals>.<genexpr>î  s   è ø€ Òm˜qÐ_`Ñ_lœÑmùs   ‚Š)r   r   r   r   )r-   r.   ra   rD  rS  r   r   )rR   r   rš   r³   rX  rY  r'  rZ  Úall_hidden_statesÚall_reshaped_hidden_statesÚall_self_attentionsr3   rr   rŠ   Úreshaped_hidden_staterB  rE  r8  rF  rs   s                       r!   rw   zDonutSwinEncoder.forward¹  s0  € ñ #7™B¸DÐÙ+?¡RÀTÐ"Ù$5™b¸4ÐáØ)6×)<Ñ)<Ñ&ˆJ˜˜;à$6 M×$6Ñ$6°zÐ$bÐDTÐ$bÐVaÒ$bÐ!Ø$9×$AÑ$AÀ!ÀQÈÈ1Ó$MÐ!Ø -Ð!1Ñ1ÐØ&Ð+@Ð*BÑBÐ&ä(¨¯©Ó5ò 	9‰OˆAˆ|Ù(¨Ð8HÐJ[Ð]mÓnˆMà)¨!Ñ,ˆMØ0=¸aÑ0@Ð-Ø -¨aÑ 0Ðà 1°"Ñ 5Ð7HÈÑ7LÐMÐá#Ñ(PØ-N×-TÑ-TÑ*�
˜A˜{ð )OÐ(I×(NÑ(NØð)Ø"3°AÑ"6Ð8IÈ!Ñ8LÐ!Mð)ØOZò)Ð%ð )>×(EÑ(EÀaÈÈAÈqÓ(QÐ%Ø!Ð&GÐ%IÑIÐ!Ø*Ð/DÐ.FÑFÑ*Ù%Ñ.VØ-:×-@Ñ-@Ñ*�
˜A˜{à(:¨×(:Ñ(:¸:Ð(fÐHXÐ(fÐZeÒ(fÐ%Ø(=×(EÑ(EÀaÈÈAÈqÓ(QÐ%Ø! mÐ%5Ñ5Ð!Ø*Ð/DÐ.FÑFÐ*â Ø# }°Q°RÐ'8Ñ8Ñ#ð9	9ñ< ÜÑm ]Ð4EÐGZÐ$[ÔmÓmÐmä%Ø+Ø+Ø*Ø#=ô	
ð 	
r    )FFFFT)r   r   r   r?   r   ry   r   rz   r|   r   rw   r}   r~   s   @r!   rK  rK  ¢  s’   ø„ ô,ð4 */Ø,1Ø@EØ(-Ø#'ñ<
à—|‘|ð<
ð    S ™/ð<
ð   $™;ð	<
ð
 # T™kð<
ð 37¸±+ð<
ð  ™+ð<
ð ˜D‘[ð<
ð 
Ð'Ñ	'÷<
r    rK  c                   óh   ‡ — e Zd ZU eed<   dZdZdZdZdgZ	 e
j                  «       ˆ fd„«       Zˆ xZS )ÚDonutSwinPreTrainedModelrQ   Údonutrl   )ÚimageTr;  c                 ó°  •— t         ‰| �  |«       t        |t        «      rX|j                  �t        j                  |j                  «       |j                  � t        j                  |j                  «       yyt        |t        «      rNt        j                  |j                  «       t        j                  |j                  |j                  «       «       yy)zInitialize the weightsN)r>   Ú_init_weightsr„   r<   rH   ÚinitÚzeros_rJ   r    r¨   Úcopy_r£   rª   )rR   ÚmodulerT   s     €r!   ri  z&DonutSwinPreTrainedModel._init_weights  s�   ø€ ô 	‰Ñ˜fÔ%Ü�fÔ1Ô2Ø× Ñ Ð,Ü—‘˜F×-Ñ-Ô.Ø×)Ñ)Ð5Ü—‘˜F×6Ñ6Õ7ð 6ä˜Ô 6Ô7Ü�K‰K˜×;Ñ;Ô<Ü�J‰J�v×5Ñ5°v×7\Ñ7\Ó7^Õ_ð 8r    )r   r   r   r   r   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesr   Úno_gradri  r}   r~   s   @r!   re  re  ø  sG   ø… ð ÓØÐØ$€OØ!ÐØ&*Ð#Ø)Ð*Ðà€U‡]�]ƒ_ó
`ó ô
`r    re  c                   ó®   ‡ — e Zd Zdˆ fd„	Zd„ Ze	 	 	 	 	 	 ddej                  dz  dej                  dz  de	dz  de	dz  de	d	e	dz  d
e
ez  fd„«       Zˆ xZS )ÚDonutSwinModelc                 óŠ  •— t         ‰| �  |«       || _        t        |j                  «      | _        t        |j                  d| j
                  dz
  z  z  «      | _        t        ||¬«      | _
        t        || j                  j                  «      | _        |rt        j                  d«      nd| _        | j#                  «        y)zû
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        use_mask_token (`bool`, *optional*, defaults to `False`):
            Whether to use a mask token for masked image modeling.
        r*   r   )rS   N)r>   r?   rQ   rN  rO  rP  rz   rG   Únum_featuresr<   rU   rK  rD   Úencoderr   ÚAdaptiveAvgPool1dÚpoolerÚ	post_init)rR   rQ   Úadd_pooling_layerrS   rT   s       €r!   r?   zDonutSwinModel.__init__  s—   ø€ ô 	‰Ñ˜Ô ØˆŒÜ˜fŸm™mÓ,ˆŒÜ × 0Ñ 0°1¸¿¹È1Ñ9LÑ3MÑ MÓNˆÔä-¨fÀ^ÔTˆŒÜ'¨°·±×0JÑ0JÓKˆŒá1B”b×*Ñ*¨1Ô-ÈˆŒð 	�‰Õr    c                 ó.   — | j                   j                  S rÔ   )rU   rA   r   s    r!   Úget_input_embeddingsz#DonutSwinModel.get_input_embeddings&  s   € Ø�‰×/Ñ/Ð/r    Nrl   rm   r³   rX  rk   rZ  rV   c                 ó  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚| j                  |||¬«      \  }}	| j                  ||	|||¬«      }
|
d   }d}| j                  �7| j                  |j                  dd«      «      }t        j                  |d«      }|s||f|
dd z   }|S t        |||
j                  |
j                  |
j                  ¬«      S )	z¿
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        Nz You have to specify pixel_values)rm   rk   )r³   rX  rZ  r   r   r*   )r   r$   r   r   r   )rQ   r³   rX  rZ  r¤   rU   rx  rz  r/   r   r�   r#   r   r   r   )rR   rl   rm   r³   rX  rk   rZ  ÚkwargsÚembedding_outputrš   Úencoder_outputsÚsequence_outputÚpooled_outputrÞ   s                 r!   rw   zDonutSwinModel.forward)  s<  € ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐÜÐ?Ó@Ð@à-1¯_©_Ø¨/ÐTlð .=ó .
Ñ*ÐÐ*ð Ÿ,™,ØØØ/Ø!5Ø#ð 'ó 
ˆð *¨!Ñ,ˆàˆØ�;‰;Ð"Ø ŸK™K¨×(AÑ(AÀ!ÀQÓ(GÓHˆMÜ!ŸM™M¨-¸Ó;ˆMáØ% }Ð5¸ÈÈÐ8KÑKˆFàˆMä#Ø-Ø'Ø)×7Ñ7Ø&×1Ñ1Ø#2×#IÑ#Iô
ð 	
r    )TF©NNNNFN)r   r   r   r?   r~  r   r   r   r{   r|   r   r#   rw   r}   r~   s   @r!   ru  ru    s¡   ø„ õò(0ð ð 26Ø37Ø)-Ø,0Ø).Ø#'ñ5
à×'Ñ'¨$Ñ.ð5
ð ×)Ñ)¨DÑ0ð5
ð   $™;ð	5
ð
 # T™kð5
ð #'ð5
ð ˜D‘[ð5
ð 
Ð%Ñ	%ò5
ó ô5
r    ru  aì  
    DonutSwin Model transformer with an image classification head on top (a linear layer on top of the final hidden state of
    the [CLS] token) e.g. for ImageNet.

    <Tip>

        Note that it's possible to fine-tune DonutSwin on higher resolution images than the ones it has been trained on, by
        setting `interpolate_pos_encoding` to `True` in the forward of the model. This will interpolate the pre-trained
        position embeddings to the higher resolution.

    </Tip>
    c                   ó¦   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 ddej                  dz  dej                  dz  dedz  dedz  dededz  d	e	e
z  fd
„«       Zˆ xZS )ÚDonutSwinForImageClassificationc                 ó>  •— t         ‰| �  |«       |j                  | _        t        |«      | _        |j                  dkD  r4t        j                  | j                  j                  |j                  «      nt        j                  «       | _	        | j                  «        y r  )r>   r?   Ú
num_labelsru  rf  r   r—   rw  r  Ú
classifierr{  )rR   rQ   rT   s     €r!   r?   z(DonutSwinForImageClassification.__init__r  sx   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ# FÓ+ˆŒ
ð FL×EVÑEVÐYZÒEZŒB�I‰I�d—j‘j×-Ñ-¨v×/@Ñ/@ÔAÔ`b×`kÑ`kÓ`mð 	Œð
 	�‰Õr    Nrl   Úlabelsr³   rX  rk   rZ  rV   c                 óV  — |�|n| j                   j                  }| j                  |||||¬«      }|d   }	| j                  |	«      }
d}|�| j	                  ||
| j                   «      }|s|
f|dd z   }|�|f|z   S |S t        ||
|j                  |j                  |j                  ¬«      S )aŠ  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image 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).
        N)r³   rX  rk   rZ  r   r*   )r'   r(   r   r   r   )	rQ   rZ  rf  rŠ  Úloss_functionr&   r   r   r   )rR   rl   r‹  r³   rX  rk   rZ  r€  rÄ   r„  r(   r'   rÞ   s                r!   rw   z'DonutSwinForImageClassification.forward€  sÒ   € ð" &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—*‘*ØØ/Ø!5Ø%=Ø#ð ó 
ˆð   ™
ˆà—‘ Ó/ˆàˆØÐØ×%Ñ% f¨f°d·k±kÓBˆDáØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä-ØØØ!×/Ñ/Ø×)Ñ)Ø#*×#AÑ#Aô
ð 	
r    r…  )r   r   r   r?   r   r   r   Ú
LongTensorr|   r   r&   rw   r}   r~   s   @r!   r‡  r‡  b  sœ   ø„ ô ð ð 26Ø*.Ø)-Ø,0Ø).Ø#'ñ,
à×'Ñ'¨$Ñ.ð,
ð × Ñ  4Ñ'ð,
ð   $™;ð	,
ð
 # T™kð,
ð #'ð,
ð ˜D‘[ð,
ð 
Ð/Ñ	/ò,
ó ô,
r    r‡  )ru  re  r‡  )1r   Úcollections.abcr…   r·   Údataclassesr   r   r   Ú r   rj  Úactivationsr   Úmodeling_layersr   Úmodeling_utilsr	   Úutilsr
   r   r   r   Úconfiguration_donut_swinr   Ú
get_loggerr   Úloggerr   r#   r&   r8   r:   ÚModuler<   r@   r’   r    rÒ   rÜ   rã   rì   rð   r  r;  rK  re  ru  r‡  Ú__all__r   r    r!   ú<module>r›     s  ðñó
 Û Ý !ã Ý å &Ý !Ý 9Ý -ß DÓ DÝ 5ð 
ˆ×	Ñ	˜HÓ	%€ñ ðôð
 ôH˜[ó Hó óðHñ  ðôð
 ôH˜;ó Hó óðHñ& ðôð
 ôH [ó Hó óðHò,	òôY-˜"Ÿ)™)ô Y-ôz'-˜rŸy™yô '-ôV%˜BŸI™Iô %ôRZ'˜RŸY™Yô Z'ô|
˜"Ÿ)™)ô 
ô˜Ÿ™ô ô&˜BŸI™Iô ô 	�b—i‘iô 	ô%�B—I‘Iô %ô2u�R—Y‘Yô uôr4Ð/ô 4ôpS
�r—y‘yô S
ðl ô`˜ó `ó ð`ð, ôN
Ð-ó N
ó ðN
ñb ðôô<
Ð&>ó <
óð<
ò~ \�r    