Ë
    T^(hV�  ã            	       óJ  — d Z ddlZddlmZmZmZmZmZ ddl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mZmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZm Z m!Z! ddl"m#Z#  ejH                  e%«      Z&dZ'dZ(g d¢Z)dZ*dZ+dCde,de,dee,   de,f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
j\                  «      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/„ d0e«      Z;d1Z<d2Z= ed3e<«       G d4„ d5e;«      «       Z> ed6e<«       G d7„ d8e;«      «       Z? G d9„ d:e
j\                  «      Z@ G d;„ d<e
j\                  «      ZA G d=„ d>e
j\                  «      ZB ed?e<«       G d@„ dAe;«      «       ZCg dB¢ZDy)DzPyTorch MobileViT model.é    N)ÚDictÚOptionalÚSetÚTupleÚUnion)Únn)ÚBCEWithLogitsLossÚCrossEntropyLossÚMSELossé   )ÚACT2FN)ÚBaseModelOutputWithNoAttentionÚ(BaseModelOutputWithPoolingAndNoAttentionÚ$ImageClassifierOutputWithNoAttentionÚSemanticSegmenterOutput)ÚPreTrainedModel)Ú find_pruneable_heads_and_indicesÚprune_linear_layer)Úadd_code_sample_docstringsÚadd_start_docstringsÚ%add_start_docstrings_to_model_forwardÚloggingÚreplace_return_docstringsÚ	torch_inté   )ÚMobileViTConfigr   zapple/mobilevit-small)r   i€  é   r   ztabby, tabby catÚvalueÚdivisorÚ	min_valueÚreturnc                 ó|   — |€|}t        |t        | |dz  z   «      |z  |z  «      }|d| z  k  r||z  }t        |«      S )a  
    Ensure that all layers have a channel count that is divisible by `divisor`. This function is taken from the
    original TensorFlow repo. It can be seen here:
    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py
    é   gÍÌÌÌÌÌì?)ÚmaxÚint)r   r   r    Ú	new_values       ún/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/models/mobilevit/modeling_mobilevit.pyÚmake_divisibler(   >   sS   € ð ÐØˆ	Ü�Iœs 5¨7°Q©;Ñ#6Ó7¸7ÑBÀWÑLÓM€Ià�3˜‘;ÒØ�WÑˆ	Üˆy‹>Ðó    c                   óœ   ‡ — e Zd Z	 	 	 	 	 	 ddedededededededed	ed
eeef   ddfˆ fd„Zde	j                  de	j                  fd„Zˆ xZS )ÚMobileViTConvLayerÚconfigÚin_channelsÚout_channelsÚkernel_sizeÚstrideÚgroupsÚbiasÚdilationÚuse_normalizationÚuse_activationr!   Nc                 ó$  •— t         ‰| �  «        t        |dz
  dz  «      |z  }||z  dk7  rt        d|› d|› d�«      ‚||z  dk7  rt        d|› d|› d�«      ‚t	        j
                  ||||||||d¬	«	      | _        |	r t	        j                  |d
ddd¬«      | _        nd | _        |
rdt        |
t        «      rt        |
   | _        y t        |j                  t        «      rt        |j                     | _        y |j                  | _        y d | _        y )Nr   r#   r   zInput channels (z) are not divisible by z groups.zOutput channels (Úzeros)	r-   r.   r/   r0   Úpaddingr3   r1   r2   Úpadding_modegñhãˆµøä>gš™™™™™¹?T)Únum_featuresÚepsÚmomentumÚaffineÚtrack_running_stats)ÚsuperÚ__init__r%   Ú
ValueErrorr   ÚConv2dÚconvolutionÚBatchNorm2dÚnormalizationÚ
isinstanceÚstrr   Ú
activationÚ
hidden_act)Úselfr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r8   Ú	__class__s               €r'   r@   zMobileViTConvLayer.__init__N   s*  ø€ ô 	‰ÑÔÜ�{ Q‘¨!Ñ+Ó,¨xÑ7ˆà˜Ñ 1Ò$ÜÐ/°¨}Ð<SÐTZÐS[Ð[cÐdÓeÐeØ˜&Ñ  AÒ%ÜÐ0°°Ð>UÐV\ÐU]Ð]eÐfÓgÐgäŸ9™9Ø#Ø%Ø#ØØØØØØ ô

ˆÔñ Ü!#§¡Ø)ØØØØ$(ô"ˆDÕð "&ˆDÔáÜ˜.¬#Ô.Ü"(¨Ñ"8�•Ü˜F×-Ñ-¬sÔ3Ü"(¨×):Ñ):Ñ";�•à"(×"3Ñ"3�•à"ˆD�Or)   Úfeaturesc                 óœ   — | j                  |«      }| j                  �| j                  |«      }| j                  �| j                  |«      }|S ©N)rC   rE   rH   )rJ   rL   s     r'   ÚforwardzMobileViTConvLayer.forward„   sK   € Ø×#Ñ# HÓ-ˆØ×ÑÐ)Ø×)Ñ)¨(Ó3ˆHØ�?‰?Ð&Ø—‘ xÓ0ˆHØˆr)   )r   r   Fr   TT)Ú__name__Ú
__module__Ú__qualname__r   r%   Úboolr   rG   r@   ÚtorchÚTensorrO   Ú__classcell__©rK   s   @r'   r+   r+   M   s­   ø„ ð ØØØØ"&Ø+/ñ4#àð4#ð ð4#ð ð	4#ð
 ð4#ð ð4#ð ð4#ð ð4#ð ð4#ð  ð4#ð ˜d C˜iÑ(ð4#ð 
õ4#ðl §¡ð °·±÷ r)   r+   c                   óx   ‡ — e Zd ZdZ	 ddedededededdfˆ fd	„Zd
ej                  dej                  fd„Z	ˆ xZ
S )ÚMobileViTInvertedResidualzQ
    Inverted residual block (MobileNetv2): https://arxiv.org/abs/1801.04381
    r,   r-   r.   r0   r3   r!   Nc           	      ó@  •— t         ‰| �  «        t        t        t	        ||j
                  z  «      «      d«      }|dvrt        d|› d�«      ‚|dk(  xr ||k(  | _        t        |||d¬«      | _	        t        |||d|||¬«      | _
        t        |||dd	¬
«      | _        y )Nr   )r   r#   zInvalid stride ú.r   ©r-   r.   r/   r   )r-   r.   r/   r0   r1   r3   F©r-   r.   r/   r5   )r?   r@   r(   r%   ÚroundÚexpand_ratiorA   Úuse_residualr+   Ú
expand_1x1Úconv_3x3Ú
reduce_1x1)rJ   r,   r-   r.   r0   r3   Úexpanded_channelsrK   s          €r'   r@   z"MobileViTInvertedResidual.__init__’   s¼   ø€ ô 	‰ÑÔÜ*¬3¬u°[À6×CVÑCVÑ5VÓ/WÓ+XÐZ[Ó\Ðà˜ÑÜ˜¨v¨h°aÐ8Ó9Ð9à# q™[ÒK¨{¸lÑ/JˆÔä,Ø Ð:KÐYZô
ˆŒô +ØØ)Ø*ØØØ$Øô
ˆŒô -ØØ)Ø%ØØ ô
ˆ�r)   rL   c                 ó’   — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  r||z   S |S rN   )ra   rb   rc   r`   )rJ   rL   Úresiduals      r'   rO   z!MobileViTInvertedResidual.forward³   sI   € Øˆà—?‘? 8Ó,ˆØ—=‘= Ó*ˆØ—?‘? 8Ó,ˆà&*×&7Ò&7ˆx˜(Ñ"ÐE¸XÐEr)   ©r   )rP   rQ   rR   Ú__doc__r   r%   r@   rT   rU   rO   rV   rW   s   @r'   rY   rY   �   sc   ø„ ñð
 jkñ
Ø%ð
Ø47ð
ØGJð
ØTWð
Øcfð
à	õ
ðBF §¡ð F°·±÷ Fr)   rY   c                   ót   ‡ — e Zd Z	 ddedededededdfˆ fd„Zd	ej                  dej                  fd
„Zˆ xZ	S )ÚMobileViTMobileNetLayerr,   r-   r.   r0   Ú
num_stagesr!   Nc                 óÚ   •— t         ‰| �  «        t        j                  «       | _        t        |«      D ]5  }t        ||||dk(  r|nd¬«      }| j                  j                  |«       |}Œ7 y )Nr   r   )r-   r.   r0   )r?   r@   r   Ú
ModuleListÚlayerÚrangerY   Úappend)	rJ   r,   r-   r.   r0   rk   Úirn   rK   s	           €r'   r@   z MobileViTMobileNetLayer.__init__¾   sh   ø€ ô 	‰ÑÔä—]‘]“_ˆŒ
Ü�zÓ"ò 	'ˆAÜ-ØØ'Ø)Ø!" a¢‘v¨Qô	ˆEð �J‰J×Ñ˜eÔ$Ø&‰Kñ	'r)   rL   c                 ó8   — | j                   D ]
  } ||«      }Œ |S rN   ©rn   )rJ   rL   Úlayer_modules      r'   rO   zMobileViTMobileNetLayer.forwardÎ   s$   € Ø ŸJ™Jò 	.ˆLÙ# HÓ-‰Hð	.àˆr)   )r   r   ©
rP   rQ   rR   r   r%   r@   rT   rU   rO   rV   rW   s   @r'   rj   rj   ½   sV   ø„ àopñ'Ø%ð'Ø47ð'ØGJð'ØTWð'Øilð'à	õ'ð  §¡ð °·±÷ r)   rj   c                   óœ   ‡ — e Zd Zdededdfˆ fd„Zdej                  dej                  fd„Zdej                  dej                  fd	„Z	ˆ xZ
S )
ÚMobileViTSelfAttentionr,   Úhidden_sizer!   Nc                 ó„  •— t         ‰| �  «        ||j                  z  dk7  rt        d|› d|j                  › d�«      ‚|j                  | _        t	        ||j                  z  «      | _        | j                  | j
                  z  | _        t        j                  || j                  |j                  ¬«      | _
        t        j                  || j                  |j                  ¬«      | _        t        j                  || j                  |j                  ¬«      | _        t        j                  |j                  «      | _        y )Nr   zThe hidden size z4 is not a multiple of the number of attention heads r[   )r2   )r?   r@   Únum_attention_headsrA   r%   Úattention_head_sizeÚall_head_sizer   ÚLinearÚqkv_biasÚqueryÚkeyr   ÚDropoutÚattention_probs_dropout_probÚdropout©rJ   r,   rx   rK   s      €r'   r@   zMobileViTSelfAttention.__init__Õ   sþ   ø€ Ü‰ÑÔà˜×3Ñ3Ñ3°qÒ8ÜØ" ; -ð 0Ø×3Ñ3Ð4°Að7óð ð
 $*×#=Ñ#=ˆÔ Ü#& {°V×5OÑ5OÑ'OÓ#PˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔä—Y‘Y˜{¨D×,>Ñ,>ÀVÇ_Á_ÔUˆŒ
Ü—9‘9˜[¨$×*<Ñ*<À6Ç?Á?ÔSˆŒÜ—Y‘Y˜{¨D×,>Ñ,>ÀVÇ_Á_ÔUˆŒ
ä—z‘z &×"EÑ"EÓFˆ�r)   Úxc                 ó    — |j                  «       d d | j                  | j                  fz   } |j                  |Ž }|j	                  dddd«      S )Néÿÿÿÿr   r#   r   r   )Úsizerz   r{   ÚviewÚpermute)rJ   r…   Únew_x_shapes      r'   Útranspose_for_scoresz+MobileViTSelfAttention.transpose_for_scoresè   sN   € Ø—f‘f“h˜s �m t×'?Ñ'?À×AYÑAYÐ&ZÑZˆØˆA�F‰F�KÐ ˆØ�y‰y˜˜A˜q !Ó$Ð$r)   Úhidden_statesc                 óŽ  — | j                  |«      }| j                  | j                  |«      «      }| j                  | j                  |«      «      }| j                  |«      }t	        j
                  ||j                  dd«      «      }|t        j                  | j                  «      z  }t        j                  j                  |d¬«      }| j                  |«      }t	        j
                  ||«      }|j                  dddd«      j                  «       }|j!                  «       d d | j"                  fz   }	 |j$                  |	Ž }|S )Nr‡   éþÿÿÿ©Údimr   r#   r   r   )r   rŒ   r€   r   rT   ÚmatmulÚ	transposeÚmathÚsqrtr{   r   Ú
functionalÚsoftmaxrƒ   rŠ   Ú
contiguousrˆ   r|   r‰   )
rJ   r�   Úmixed_query_layerÚ	key_layerÚvalue_layerÚquery_layerÚattention_scoresÚattention_probsÚcontext_layerÚnew_context_layer_shapes
             r'   rO   zMobileViTSelfAttention.forwardí   s&  € Ø ŸJ™J }Ó5Ðà×-Ñ-¨d¯h©h°}Ó.EÓFˆ	Ø×/Ñ/°·
±
¸=Ó0IÓJˆØ×/Ñ/Ð0AÓBˆô !Ÿ<™<¨°Y×5HÑ5HÈÈRÓ5PÓQÐØ+¬d¯i©i¸×8PÑ8PÓ.QÑQÐô Ÿ-™-×/Ñ/Ð0@ÀbÐ/ÓIˆð Ÿ,™, Ó7ˆäŸ™ _°kÓBˆà%×-Ñ-¨a°°A°qÓ9×DÑDÓFˆØ"/×"4Ñ"4Ó"6°s¸Ð";¸t×?QÑ?QÐ>SÑ"SÐØ*˜×*Ñ*Ð,CÐDˆØÐr)   )rP   rQ   rR   r   r%   r@   rT   rU   rŒ   rO   rV   rW   s   @r'   rw   rw   Ô   sW   ø„ ðG˜ð G¸Sð GÀTõ Gð&% e§l¡lð %°u·|±|ó %ð
 U§\¡\ð °e·l±l÷ r)   rw   c                   ód   ‡ — e Zd Zdededdfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )ÚMobileViTSelfOutputr,   rx   r!   Nc                 ó    •— t         ‰| �  «        t        j                  ||«      | _        t        j
                  |j                  «      | _        y rN   ©r?   r@   r   r}   Údenser�   Úhidden_dropout_probrƒ   r„   s      €r'   r@   zMobileViTSelfOutput.__init__  s6   ø€ Ü‰ÑÔÜ—Y‘Y˜{¨KÓ8ˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r)   r�   c                 óJ   — | j                  |«      }| j                  |«      }|S rN   ©r¥   rƒ   ©rJ   r�   s     r'   rO   zMobileViTSelfOutput.forward  s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØÐr)   ru   rW   s   @r'   r¢   r¢     s8   ø„ ð>˜ð >¸Sð >ÀTõ >ð
 U§\¡\ð °e·l±l÷ r)   r¢   c                   óz   ‡ — e Zd Zdededdfˆ fd„Zdee   ddfd„Zdej                  dej                  fd	„Z
ˆ xZS )
ÚMobileViTAttentionr,   rx   r!   Nc                 ó„   •— t         ‰| �  «        t        ||«      | _        t	        ||«      | _        t        «       | _        y rN   )r?   r@   rw   Ú	attentionr¢   ÚoutputÚsetÚpruned_headsr„   s      €r'   r@   zMobileViTAttention.__init__  s4   ø€ Ü‰ÑÔÜ/°¸ÓDˆŒÜ)¨&°+Ó>ˆŒÜ›EˆÕr)   Úheadsc                 ó>  — t        |«      dk(  ry t        || j                  j                  | j                  j                  | j
                  «      \  }}t        | j                  j                  |«      | j                  _        t        | j                  j                  |«      | j                  _        t        | j                  j                  |«      | j                  _	        t        | j                  j                  |d¬«      | j                  _        | j                  j                  t        |«      z
  | j                  _        | j                  j                  | j                  j                  z  | j                  _        | j
                  j                  |«      | _        y )Nr   r   r�   )Úlenr   r­   rz   r{   r°   r   r   r€   r   r®   r¥   r|   Úunion)rJ   r±   Úindexs      r'   Úprune_headszMobileViTAttention.prune_heads  s  € Üˆu‹:˜Š?ØÜ7Ø�4—>‘>×5Ñ5°t·~±~×7YÑ7YÐ[_×[lÑ[ló
‰ˆˆuô
  2°$·.±.×2FÑ2FÈÓNˆ�‰ÔÜ/°·±×0BÑ0BÀEÓJˆ�‰ÔÜ1°$·.±.×2FÑ2FÈÓNˆ�‰ÔÜ.¨t¯{©{×/@Ñ/@À%ÈQÔOˆ�‰Ôð .2¯^©^×-OÑ-OÔRUÐV[ÓR\Ñ-\ˆ�‰Ô*Ø'+§~¡~×'IÑ'IÈDÏNÉN×LnÑLnÑ'nˆ�‰Ô$Ø ×-Ñ-×3Ñ3°EÓ:ˆÕr)   r�   c                 óJ   — | j                  |«      }| j                  |«      }|S rN   )r­   r®   )rJ   r�   Úself_outputsÚattention_outputs       r'   rO   zMobileViTAttention.forward,  s%   € Ø—~‘~ mÓ4ˆØŸ;™; |Ó4ÐØÐr)   )rP   rQ   rR   r   r%   r@   r   r¶   rT   rU   rO   rV   rW   s   @r'   r«   r«     sO   ø„ ð"˜ð "¸Sð "ÀTõ "ð;  S¡ð ;¨dó ;ð$  U§\¡\ð  °e·l±l÷  r)   r«   c                   óh   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )	ÚMobileViTIntermediater,   rx   Úintermediate_sizer!   Nc                 óà   •— t         ‰| �  «        t        j                  ||«      | _        t        |j                  t        «      rt        |j                     | _	        y |j                  | _	        y rN   )
r?   r@   r   r}   r¥   rF   rI   rG   r   Úintermediate_act_fn©rJ   r,   rx   r¼   rK   s       €r'   r@   zMobileViTIntermediate.__init__3  sR   ø€ Ü‰ÑÔÜ—Y‘Y˜{Ð,=Ó>ˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r)   r�   c                 óJ   — | j                  |«      }| j                  |«      }|S rN   )r¥   r¾   r©   s     r'   rO   zMobileViTIntermediate.forward;  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr)   ru   rW   s   @r'   r»   r»   2  sA   ø„ ð9˜ð 9¸Sð 9ÐUXð 9Ð]aõ 9ð U§\¡\ð °e·l±l÷ r)   r»   c                   ó€   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  dej                  fd	„Zˆ xZ	S )
ÚMobileViTOutputr,   rx   r¼   r!   Nc                 ó    •— t         ‰| �  «        t        j                  ||«      | _        t        j
                  |j                  «      | _        y rN   r¤   r¿   s       €r'   r@   zMobileViTOutput.__init__B  s7   ø€ Ü‰ÑÔÜ—Y‘YÐ0°+Ó>ˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r)   r�   Úinput_tensorc                 óT   — | j                  |«      }| j                  |«      }||z   }|S rN   r¨   )rJ   r�   rÄ   s      r'   rO   zMobileViTOutput.forwardG  s.   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØ%¨Ñ4ˆØÐr)   ru   rW   s   @r'   rÂ   rÂ   A  sO   ø„ ð>˜ð >¸Sð >ÐUXð >Ð]aõ >ð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r)   rÂ   c                   óh   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )	ÚMobileViTTransformerLayerr,   rx   r¼   r!   Nc                 ó$  •— t         ‰| �  «        t        ||«      | _        t	        |||«      | _        t        |||«      | _        t        j                  ||j                  ¬«      | _        t        j                  ||j                  ¬«      | _        y )N©r;   )r?   r@   r«   r­   r»   ÚintermediaterÂ   r®   r   Ú	LayerNormÚlayer_norm_epsÚlayernorm_beforeÚlayernorm_afterr¿   s       €r'   r@   z"MobileViTTransformerLayer.__init__O  sq   ø€ Ü‰ÑÔÜ+¨F°KÓ@ˆŒÜ1°&¸+ÐGXÓYˆÔÜ% f¨kÐ;LÓMˆŒÜ "§¡¨[¸f×>SÑ>SÔ TˆÔÜ!Ÿ|™|¨K¸V×=RÑ=RÔSˆÕr)   r�   c                 ó¸   — | j                  | j                  |«      «      }||z   }| j                  |«      }| j                  |«      }| j	                  ||«      }|S rN   )r­   rÍ   rÎ   rÊ   r®   )rJ   r�   r¹   Úlayer_outputs       r'   rO   z!MobileViTTransformerLayer.forwardW  s\   € ØŸ>™>¨$×*?Ñ*?ÀÓ*NÓOÐØ(¨=Ñ8ˆà×+Ñ+¨MÓ:ˆØ×(Ñ(¨Ó6ˆØ—{‘{ <°Ó?ˆØÐr)   ru   rW   s   @r'   rÇ   rÇ   N  sF   ø„ ðT˜ð T¸Sð TÐUXð TÐ]aõ Tð U§\¡\ð °e·l±l÷ r)   rÇ   c                   óh   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )	ÚMobileViTTransformerr,   rx   rk   r!   Nc           	      óò   •— t         ‰| �  «        t        j                  «       | _        t        |«      D ]A  }t        ||t        ||j                  z  «      ¬«      }| j                  j                  |«       ŒC y )N)rx   r¼   )
r?   r@   r   rm   rn   ro   rÇ   r%   Ú	mlp_ratiorp   )rJ   r,   rx   rk   Ú_Útransformer_layerrK   s         €r'   r@   zMobileViTTransformer.__init__b  sh   ø€ Ü‰ÑÔä—]‘]“_ˆŒ
Ü�zÓ"ò 	1ˆAÜ 9ØØ'Ü"% k°F×4DÑ4DÑ&DÓ"Eô!Ðð
 �J‰J×ÑÐ/Õ0ñ	1r)   r�   c                 ó8   — | j                   D ]
  } ||«      }Œ |S rN   rs   )rJ   r�   rt   s      r'   rO   zMobileViTTransformer.forwardn  s%   € Ø ŸJ™Jò 	8ˆLÙ(¨Ó7‰Mð	8àÐr)   ru   rW   s   @r'   rÒ   rÒ   a  s@   ø„ ð
1˜ð 
1¸Sð 
1Ècð 
1ÐVZõ 
1ð U§\¡\ð °e·l±l÷ r)   rÒ   c                   óþ   ‡ — e Zd ZdZ	 ddededededededed	d
fˆ fd„Zdej                  d	e	ej                  e
f   fd„Zdej                  de
d	ej                  fd„Zdej                  d	ej                  fd„Zˆ xZS )ÚMobileViTLayerz;
    MobileViT block: https://arxiv.org/abs/2110.02178
    r,   r-   r.   r0   rx   rk   r3   r!   Nc                 ó  •— t         ‰| �  «        |j                  | _        |j                  | _        |dk(  r)t        ||||dk(  r|nd|dkD  r|dz  nd¬«      | _        |}nd | _        t        ||||j                  ¬«      | _	        t        |||ddd¬«      | _
        t        |||¬«      | _        t        j                  ||j                  ¬«      | _        t        |||d¬«      | _        t        |d|z  ||j                  ¬«      | _        y )	Nr#   r   )r-   r.   r0   r3   r\   F)r-   r.   r/   r4   r5   )rx   rk   rÉ   )r?   r@   Ú
patch_sizeÚpatch_widthÚpatch_heightrY   Údownsampling_layerr+   Úconv_kernel_sizeÚconv_kxkÚconv_1x1rÒ   Útransformerr   rË   rÌ   Ú	layernormÚconv_projectionÚfusion)	rJ   r,   r-   r.   r0   rx   rk   r3   rK   s	           €r'   r@   zMobileViTLayer.__init__y  s  ø€ ô 	‰ÑÔØ!×,Ñ,ˆÔØ"×-Ñ-ˆÔà�QŠ;Ü&?ØØ'Ø)Ø!)¨Q¢‘v°AØ*2°Qª,˜ Qš¸Aô'ˆDÔ#ð '‰Kà&*ˆDÔ#ä*ØØ#Ø$Ø×/Ñ/ô	
ˆŒô +ØØ#Ø$ØØ#Ø ô
ˆŒô 0ØØ#Ø!ô
ˆÔô Ÿ™ k°v×7LÑ7LÔMˆŒä1Ø ¸+ÐSTô 
ˆÔô )Ø  K¡¸kÐW]×WnÑWnô
ˆ�r)   rL   c                 ó|  — | j                   | j                  }}t        ||z  «      }|j                  \  }}}}t        j
                  j                  «       r$t        t	        j                  ||z  «      |z  «      n#t        t        j                  ||z  «      |z  «      }	t        j
                  j                  «       r$t        t	        j                  ||z  «      |z  «      n#t        t        j                  ||z  «      |z  «      }
d}|
|k7  s|	|k7  r't        j                  j                  ||	|
fdd¬«      }d}|
|z  }|	|z  }||z  }|j                  ||z  |z  |||«      }|j                  dd«      }|j                  ||||«      }|j                  dd«      }|j                  ||z  |d«      }||f||||||d	œ}||fS )
NFÚbilinear©rˆ   ÚmodeÚalign_cornersTr   r#   r   r‡   )Ú	orig_sizeÚ
batch_sizeÚchannelsÚinterpolateÚnum_patchesÚnum_patches_widthÚnum_patches_height)rÜ   rÝ   r%   ÚshaperT   ÚjitÚ
is_tracingr   Úceilr”   r   r–   rî   Úreshaper“   )rJ   rL   rÜ   rÝ   Ú
patch_arearì   rí   Úorig_heightÚ
orig_widthÚ
new_heightÚ	new_widthrî   Únum_patch_widthÚnum_patch_heightrï   ÚpatchesÚ	info_dicts                    r'   Ú	unfoldingzMobileViTLayer.unfolding³  sä  € Ø$(×$4Ñ$4°d×6GÑ6G�\ˆÜ˜ |Ñ3Ó4ˆ
à8@¿¹Ñ5ˆ
�H˜k¨:ô �y‰y×#Ñ#Ô%ô ”e—j‘j ¨|Ñ!;Ó<¸|ÑKÔLä”T—Y‘Y˜{¨\Ñ9Ó:¸\ÑIÓJð 	ô �y‰y×#Ñ#Ô%ô ”e—j‘j ¨kÑ!9Ó:¸[ÑHÔIä”T—Y‘Y˜z¨KÑ7Ó8¸;ÑFÓGð 	ð ˆØ˜
Ò" j°KÒ&?ä—}‘}×0Ñ0Ø 
¨IÐ6¸ZÐW\ð 1ó ˆHð ˆKð $ {Ñ2ˆØ%¨Ñ5ÐØ&¨Ñ8ˆð ×"Ñ"Ø˜Ñ!Ð$4Ñ4°lÀOÐU`ó
ˆð ×#Ñ# A qÓ)ˆØ—/‘/ *¨h¸ÀZÓPˆØ×#Ñ# A qÓ)ˆØ—/‘/ *¨zÑ"9¸;ÈÓKˆð & zÐ2Ø$Ø Ø&Ø&Ø!0Ø"2ñ
ˆ	ð ˜	Ð!Ð!r)   rþ   rÿ   c                 óÎ  — | j                   | j                  }}t        ||z  «      }|d   }|d   }|d   }|d   }	|d   }
|j                  «       j	                  |||d«      }|j                  dd«      }|j                  ||z  |	z  |
||«      }|j                  dd	«      }|j                  |||	|z  |
|z  «      }|d
   r&t        j                  j                  ||d   dd¬«      }|S )Nrì   rí   rï   rñ   rð   r‡   r   r   r#   rî   rë   rç   Frè   )
rÜ   rÝ   r%   r˜   r‰   r“   rö   r   r–   rî   )rJ   rþ   rÿ   rÜ   rÝ   r÷   rì   rí   rï   rý   rü   rL   s               r'   ÚfoldingzMobileViTLayer.foldingæ  s&  € Ø$(×$4Ñ$4°d×6GÑ6G�\ˆÜ˜ |Ñ3Ó4ˆ
à˜|Ñ,ˆ
Ø˜ZÑ(ˆØ Ñ.ˆØ$Ð%9Ñ:ÐØ#Ð$7Ñ8ˆð ×%Ñ%Ó'×,Ñ,¨Z¸À[ÐRTÓUˆØ×%Ñ% a¨Ó+ˆØ×#Ñ#Ø˜Ñ!Ð$4Ñ4°oÀ|ÐU`ó
ˆð ×%Ñ% a¨Ó+ˆØ×#Ñ#Ø˜Ð"2°\Ñ"AÀ?ÐU`ÑC`ó
ˆð �]Ò#Ü—}‘}×0Ñ0Ø˜y¨Ñ5¸JÐV[ð 1ó ˆHð ˆr)   c                 óŠ  — | j                   r| j                  |«      }|}| j                  |«      }| j                  |«      }| j                  |«      \  }}| j	                  |«      }| j                  |«      }| j                  ||«      }| j                  |«      }| j                  t        j                  ||fd¬«      «      }|S ©Nr   r�   )rÞ   rà   rá   r   râ   rã   r  rä   rå   rT   Úcat)rJ   rL   rf   rþ   rÿ   s        r'   rO   zMobileViTLayer.forward  s¸   € à×"Ò"Ø×.Ñ.¨xÓ8ˆHàˆð —=‘= Ó*ˆØ—=‘= Ó*ˆð "Ÿ^™^¨HÓ5Ñˆ�ð ×"Ñ" 7Ó+ˆØ—.‘. Ó)ˆð —<‘< ¨Ó3ˆà×'Ñ'¨Ó1ˆØ—;‘;œuŸy™y¨(°HÐ)=À1ÔEÓFˆØˆr)   rg   )rP   rQ   rR   rh   r   r%   r@   rT   rU   r   r   r   r  rO   rV   rW   s   @r'   rÙ   rÙ   t  sÄ   ø„ ñð ñ8
àð8
ð ð8
ð ð	8
ð
 ð8
ð ð8
ð ð8
ð ð8
ð 
õ8
ðt1" %§,¡,ð 1"°5¸¿¹ÀtÐ9KÑ3Ló 1"ðf˜uŸ|™|ð ¸ð ÀÇÁó ð: §¡ð °·±÷ r)   rÙ   c                   ód   ‡ — e Zd Zdeddfˆ fd„Z	 	 d	dej                  dededee	e
f   fd„Zˆ xZS )
ÚMobileViTEncoderr,   r!   Nc           	      óì  •— t         ‰
| �  «        || _        t        j                  «       | _        d| _        dx}}|j                  dk(  rd}d}n|j                  dk(  rd}d}t        ||j                  d   |j                  d   dd¬«      }| j
                  j                  |«       t        ||j                  d   |j                  d   dd	¬«      }| j
                  j                  |«       t        ||j                  d   |j                  d	   d|j                  d   d¬
«      }| j
                  j                  |«       |r|dz  }t        ||j                  d	   |j                  d   d|j                  d   d|¬«      }| j
                  j                  |«       |r|dz  }t        ||j                  d   |j                  d   d|j                  d   d	|¬«      }	| j
                  j                  |	«       y )NFr   Té   r   r   )r-   r.   r0   rk   r#   r   )r-   r.   r0   rx   rk   é   )r-   r.   r0   rx   rk   r3   é   )r?   r@   r,   r   rm   rn   Úgradient_checkpointingÚoutput_striderj   Úneck_hidden_sizesrp   rÙ   Úhidden_sizes)rJ   r,   Údilate_layer_4Údilate_layer_5r3   Úlayer_1Úlayer_2Úlayer_3Úlayer_4Úlayer_5rK   s             €r'   r@   zMobileViTEncoder.__init__  sý  ø€ Ü‰ÑÔØˆŒä—]‘]“_ˆŒ
Ø&+ˆÔ#ð +0Ð/ˆ˜Ø×Ñ 1Ò$Ø!ˆNØ!‰NØ×!Ñ! RÒ'Ø!ˆNàˆä)ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØô
ˆð 	�
‰
×Ñ˜'Ô"ä)ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØô
ˆð 	�
‰
×Ñ˜'Ô"ä ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.Øô
ˆð 	�
‰
×Ñ˜'Ô"áØ˜‰MˆHä ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.ØØô
ˆð 	�
‰
×Ñ˜'Ô"áØ˜‰MˆHä ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.ØØô
ˆð 	�
‰
×Ñ˜'Õ"r)   r�   Úoutput_hidden_statesÚreturn_dictc                 ó  — |rdnd }t        | j                  «      D ]K  \  }}| j                  r)| j                  r| j	                  |j
                  |«      }n ||«      }|sŒF||fz   }ŒM |st        d„ ||fD «       «      S t        ||¬«      S )N© c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wrN   r  )Ú.0Úvs     r'   ú	<genexpr>z+MobileViTEncoder.forward.<locals>.<genexpr>}  s   è ø€ ÒX˜qÈ!É-œÑXùs   ‚Š)Úlast_hidden_stater�   )Ú	enumeratern   r  ÚtrainingÚ_gradient_checkpointing_funcÚ__call__Útupler   )rJ   r�   r  r  Úall_hidden_statesrq   rt   s          r'   rO   zMobileViTEncoder.forwardh  sž   € ñ #7™B¸DÐä(¨¯©Ó4ò 
	I‰OˆAˆ|Ø×*Ò*¨t¯}ª}Ø $× AÑ AØ ×)Ñ)Ø!ó!‘ñ
 !-¨]Ó ;�â#Ø$5¸Ð8HÑ$HÑ!ð
	Iñ ÜÑX ]Ð4EÐ$FÔXÓXÐXä-ÀÐ]nÔoÐor)   )FT)rP   rQ   rR   r   r@   rT   rU   rS   r   r$  r   rO   rV   rW   s   @r'   r  r    sa   ø„ ðH#˜ð H#°4õ H#ðZ &+Ø ñ	pà—|‘|ðpð #ðpð ð	pð
 
ˆuÐ4Ð4Ñ	5÷pr)   r  c                   ó~   — e Zd ZdZeZdZdZdZdgZ	de
ej                  ej                  ej                  f   ddfd	„Zy)
ÚMobileViTPreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    Ú	mobilevitÚpixel_valuesTrÙ   Úmoduler!   Nc                 óú  — t        |t        j                  t        j                  f«      rm|j                  j
                  j                  d| j                  j                  ¬«       |j                  �%|j                  j
                  j                  «        yyt        |t        j                  «      rJ|j                  j
                  j                  «        |j                  j
                  j                  d«       yy)zInitialize the weightsg        )ÚmeanÚstdNg      ð?)rF   r   r}   rB   ÚweightÚdataÚnormal_r,   Úinitializer_ranger2   Úzero_rË   Úfill_)rJ   r*  s     r'   Ú_init_weightsz&MobileViTPreTrainedModel._init_weightsŽ  s¨   € ä�fœrŸy™y¬"¯)©)Ð4Ô5ð �M‰M×Ñ×&Ñ&¨C°T·[±[×5RÑ5RÐ&ÔSØ�{‰{Ð&Ø—‘× Ñ ×&Ñ&Õ(ð 'ä˜¤§¡Ô-Ø�K‰K×Ñ×"Ñ"Ô$Ø�M‰M×Ñ×$Ñ$ SÕ)ð .r)   )rP   rQ   rR   rh   r   Úconfig_classÚbase_model_prefixÚmain_input_nameÚsupports_gradient_checkpointingÚ_no_split_modulesr   r   r}   rB   rË   r4  r  r)   r'   r'  r'  ‚  sT   „ ñð
 #€LØ#ÐØ$€OØ&*Ð#Ø)Ð*Ðð
* E¨"¯)©)°R·Y±YÀÇÁÐ*LÑ$Mð 
*ÐRVô 
*r)   r'  aK  
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it
    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`MobileViTConfig`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
aF  
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`MobileViTImageProcessor.__call__`] for details.
        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.
zWThe bare MobileViT model outputting raw hidden-states without any specific head on top.c                   ó¶   ‡ — e Zd Zddedefˆ fd„Zd„ Z ee«       e	e
eede¬«      	 	 	 ddeej                      dee   d	ee   d
eeef   fd„«       «       Zˆ xZS )ÚMobileViTModelr,   Úexpand_outputc                 óL  •— t         ‰| �  |«       || _        || _        t	        ||j
                  |j                  d   dd¬«      | _        t        |«      | _	        | j                  r.t	        ||j                  d   |j                  d   d¬«      | _
        | j                  «        y )	Nr   r   r#   )r-   r.   r/   r0   r  é   r   r\   )r?   r@   r,   r<  r+   Únum_channelsr  Ú	conv_stemr  ÚencoderÚconv_1x1_expÚ	post_init)rJ   r,   r<  rK   s      €r'   r@   zMobileViTModel.__init__¸  s�   ø€ Ü‰Ñ˜Ô ØˆŒØ*ˆÔä+ØØ×+Ñ+Ø×1Ñ1°!Ñ4ØØô
ˆŒô (¨Ó/ˆŒà×ÒÜ 2ØØ"×4Ñ4°QÑ7Ø#×5Ñ5°aÑ8Øô	!ˆDÔð 	�‰Õr)   c                 óô   — |j                  «       D ]e  \  }}| j                  j                  |   }t        |t        «      sŒ0|j
                  j                  D ]  }|j                  j                  |«       Œ Œg y)z”Prunes heads of the model.
        heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base class PreTrainedModel
        N)ÚitemsrA  rn   rF   rÙ   râ   r­   r¶   )rJ   Úheads_to_pruneÚlayer_indexr±   Úmobilevit_layerrÖ   s         r'   Ú_prune_headszMobileViTModel._prune_headsÒ  ss   € ð #1×"6Ñ"6Ó"8ò 	CÑˆK˜Ø"Ÿl™l×0Ñ0°Ñ=ˆOÜ˜/¬>Õ:Ø)8×)DÑ)D×)JÑ)Jò CÐ%Ø%×/Ñ/×;Ñ;¸EÕBñCñ	Cr)   Úvision)Ú
checkpointÚoutput_typer5  ÚmodalityÚexpected_outputr)  r  r  r!   c                 ó¨  — |�|n| j                   j                  }|�|n| j                   j                  }|€t        d«      ‚| j	                  |«      }| j                  |||¬«      }| j                  r/| j                  |d   «      }t        j                  |ddgd¬«      }n|d   }d }|s|�||fn|f}||dd  z   S t        |||j                  ¬	«      S )
Nz You have to specify pixel_values©r  r  r   r�   r‡   F)r‘   Úkeepdimr   )r  Úpooler_outputr�   )r,   r  Úuse_return_dictrA   r@  rA  r<  rB  rT   r,  r   r�   )	rJ   r)  r  r  Úembedding_outputÚencoder_outputsr  Úpooled_outputr®   s	            r'   rO   zMobileViTModel.forwardÜ  s  € ð %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐÜÐ?Ó@Ð@àŸ>™>¨,Ó7ÐàŸ,™,ØØ!5Ø#ð 'ó 
ˆð ×ÒØ $× 1Ñ 1°/À!Ñ2DÓ EÐô "ŸJ™JÐ'8¸rÀ2¸hÐPUÔV‰Mà /°Ñ 2ÐØ ˆMáØ;HÐ;TÐ'¨Ñ7Ð[lÐZnˆFØ˜O¨A¨BÐ/Ñ/Ð/ä7Ø/Ø'Ø)×7Ñ7ô
ð 	
r)   )T)NNN)rP   rQ   rR   r   rS   r@   rI  r   ÚMOBILEVIT_INPUTS_DOCSTRINGr   Ú_CHECKPOINT_FOR_DOCr   Ú_CONFIG_FOR_DOCÚ_EXPECTED_OUTPUT_SHAPEr   rT   rU   r   r$  rO   rV   rW   s   @r'   r;  r;  ³  s    ø„ ñ
˜ð ¸tõ ò4Cñ +Ð+EÓFÙØ&Ø<Ø$ØØ.ôð 04Ø/3Ø&*ñ	'
à˜uŸ|™|Ñ,ð'
ð ' t™nð'
ð ˜d‘^ð	'
ð
 
ˆuÐ>Ð>Ñ	?ò'
óó Gô'
r)   r;  z‰
    MobileViT model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    c                   óÌ   ‡ — e Zd Zdeddfˆ fd„Z ee«       eee	e
e¬«      	 	 	 	 ddeej                     dee   deej                     d	ee   deee	f   f
d
„«       «       Zˆ xZS )ÚMobileViTForImageClassificationr,   r!   Nc                 ó|  •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  |j                  d¬«      | _        |j                  dkD  r-t        j                  |j                  d   |j                  «      nt        j                  «       | _        | j                  «        y )NT)Úinplacer   r‡   )r?   r@   Ú
num_labelsr;  r(  r   r�   Úclassifier_dropout_probrƒ   r}   r  ÚIdentityÚ
classifierrC  ©rJ   r,   rK   s     €r'   r@   z(MobileViTForImageClassification.__init__  s�   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ'¨Ó/ˆŒô —z‘z &×"@Ñ"@È$ÔOˆŒàJP×J[ÑJ[Ð^_ÒJ_ŒB�I‰I�f×.Ñ.¨rÑ2°F×4EÑ4EÔFÔeg×epÑepÓerð 	Œð
 	�‰Õr)   )rK  rL  r5  rN  r)  r  Úlabelsr  c                 ó6  — |�|n| j                   j                  }| j                  |||¬«      }|r|j                  n|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 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).
        NrP  r   Ú
regressionÚsingle_label_classificationÚmulti_label_classificationr‡   r#   )ÚlossÚlogitsr�   )r,   rS  r(  rR  rb  rƒ   Úproblem_typer_  ÚdtyperT   Úlongr%   r   Úsqueezer
   r‰   r	   r   r�   )rJ   r)  r  rd  r  ÚoutputsrV  rj  ri  Úloss_fctr®   s              r'   rO   z'MobileViTForImageClassification.forward%  sÊ  € ð( &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà—.‘. ÐDXÐfq�.Órˆá1<˜×-Ò-À'È!Á*ˆà—‘ §¡¨mÓ!<Ó=ˆàˆØÑØ�{‰{×'Ñ'Ð/Ø—?‘? 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ä3ØØØ!×/Ñ/ô
ð 	
r)   ©NNNN)rP   rQ   rR   r   r@   r   rW  r   Ú_IMAGE_CLASS_CHECKPOINTr   rY  Ú_IMAGE_CLASS_EXPECTED_OUTPUTr   rT   rU   rS   r   r$  rO   rV   rW   s   @r'   r\  r\    s­   ø„ ð˜ð °4õ ñ +Ð+EÓFÙØ*Ø8Ø$Ø4ô	ð 04Ø/3Ø)-Ø&*ñ4
à˜uŸ|™|Ñ,ð4
ð ' t™nð4
ð ˜Ÿ™Ñ&ð	4
ð
 ˜d‘^ð4
ð 
ˆuÐ:Ð:Ñ	;ò4
óó Gô4
r)   r\  c                   óh   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )	ÚMobileViTASPPPoolingr,   r-   r.   r!   Nc           	      ó†   •— t         ‰| �  «        t        j                  d¬«      | _        t        |||dddd¬«      | _        y )Nr   )Úoutput_sizeTÚrelu)r-   r.   r/   r0   r4   r5   )r?   r@   r   ÚAdaptiveAvgPool2dÚglobal_poolr+   rá   )rJ   r,   r-   r.   rK   s       €r'   r@   zMobileViTASPPPooling.__init__d  sB   ø€ Ü‰ÑÔä×/Ñ/¸AÔ>ˆÔä*ØØ#Ø%ØØØ"Ø!ô
ˆ�r)   rL   c                 ó®   — |j                   dd  }| j                  |«      }| j                  |«      }t        j                  j                  ||dd¬«      }|S )Nr�   rç   Frè   )rò   rz  rá   r   r–   rî   )rJ   rL   Úspatial_sizes      r'   rO   zMobileViTASPPPooling.forwards  sS   € Ø—~‘~ b cÐ*ˆØ×#Ñ# HÓ-ˆØ—=‘= Ó*ˆÜ—=‘=×,Ñ,¨X¸LÈzÐinÐ,ÓoˆØˆr)   ru   rW   s   @r'   ru  ru  c  sA   ø„ ð
˜ð 
¸Sð 
ÐPSð 
ÐX\õ 
ð §¡ð °·±÷ r)   ru  c                   ód   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )ÚMobileViTASPPzs
    ASPP module defined in DeepLab papers: https://arxiv.org/abs/1606.00915, https://arxiv.org/abs/1706.05587
    r,   r!   Nc                 ó~  •— t         ‰| �  «        |j                  d   }|j                  }t	        |j
                  «      dk7  rt        d«      ‚t        j                  «       | _	        t        |||dd¬«      }| j                  j                  |«       | j                  j                  |j
                  D �cg c]  }t        |||d|d¬«      ‘Œ c}«       t        |||«      }| j                  j                  |«       t        |d|z  |dd¬«      | _        t        j                  |j                   ¬	«      | _        y c c}w )
Nr�   r   z"Expected 3 values for atrous_ratesr   rx  r]   )r-   r.   r/   r3   r5   r  )Úp)r?   r@   r  Úaspp_out_channelsr³   Úatrous_ratesrA   r   rm   Úconvsr+   rp   Úextendru  Úprojectr�   Úaspp_dropout_probrƒ   )rJ   r,   r-   r.   Úin_projectionÚrateÚ
pool_layerrK   s          €r'   r@   zMobileViTASPP.__init__€  s(  ø€ Ü‰ÑÔà×.Ñ.¨rÑ2ˆØ×/Ñ/ˆäˆv×"Ñ"Ó# qÒ(ÜÐAÓBÐBä—]‘]“_ˆŒ
ä*ØØ#Ø%ØØ!ô
ˆð 	�
‰
×Ñ˜-Ô(à�
‰
×Ñð #×/Ñ/ö
ð ô #ØØ +Ø!-Ø !Ø!Ø#)öò
ô	
ô *¨&°+¸|ÓLˆ
Ø�
‰
×Ñ˜*Ô%ä)Ø  LÑ 0¸|ÐYZÐkqô
ˆŒô —z‘z F×$<Ñ$<Ô=ˆ�ùò)
s   Â5D:rL   c                 óÌ   — g }| j                   D ]  }|j                   ||«      «       Œ t        j                  |d¬«      }| j	                  |«      }| j                  |«      }|S r  )rƒ  rp   rT   r  r…  rƒ   )rJ   rL   ÚpyramidÚconvÚpooled_featuress        r'   rO   zMobileViTASPP.forward«  s\   € ØˆØ—J‘Jò 	+ˆDØ�N‰N™4 ›>Õ*ð	+ä—)‘)˜G¨Ô+ˆàŸ,™, wÓ/ˆØŸ,™, Ó7ˆØÐr)   ©
rP   rQ   rR   rh   r   r@   rT   rU   rO   rV   rW   s   @r'   r~  r~  {  s7   ø„ ñð)>˜ð )>°4õ )>ðV §¡ð °·±÷ r)   r~  c                   ód   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dej                  fd„Zˆ xZ	S )ÚMobileViTDeepLabV3zB
    DeepLabv3 architecture: https://arxiv.org/abs/1706.05587
    r,   r!   Nc           	      óà   •— t         ‰| �  «        t        |«      | _        t	        j
                  |j                  «      | _        t        ||j                  |j                  dddd¬«      | _        y )Nr   FT)r-   r.   r/   r4   r5   r2   )r?   r@   r~  Úasppr   Ú	Dropout2dr`  rƒ   r+   r�  r_  rb  rc  s     €r'   r@   zMobileViTDeepLabV3.__init__»  s]   ø€ Ü‰ÑÔÜ! &Ó)ˆŒ	ä—|‘| F×$BÑ$BÓCˆŒä,ØØ×0Ñ0Ø×*Ñ*ØØ#Ø Øô
ˆ�r)   r�   c                 ór   — | j                  |d   «      }| j                  |«      }| j                  |«      }|S )Nr‡   )r’  rƒ   rb  )rJ   r�   rL   s      r'   rO   zMobileViTDeepLabV3.forwardË  s6   € Ø—9‘9˜]¨2Ñ.Ó/ˆØ—<‘< Ó)ˆØ—?‘? 8Ó,ˆØˆr)   rŽ  rW   s   @r'   r�  r�  ¶  s6   ø„ ñð
˜ð 
°4õ 
ð  U§\¡\ð °e·l±l÷ r)   r�  zX
    MobileViT model with a semantic segmentation head on top, e.g. for Pascal VOC.
    c                   óÈ   ‡ — e Zd Zdeddfˆ fd„Z ee«       eee	¬«      	 	 	 	 dde
ej                     de
ej                     de
e   d	e
e   deeef   f
d
„«       «       Zˆ xZS )Ú MobileViTForSemanticSegmentationr,   r!   Nc                 óª   •— t         ‰| �  |«       |j                  | _        t        |d¬«      | _        t        |«      | _        | j                  «        y )NF)r<  )r?   r@   r_  r;  r(  r�  Úsegmentation_headrC  rc  s     €r'   r@   z)MobileViTForSemanticSegmentation.__init__Ù  sD   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ'¨¸eÔDˆŒÜ!3°FÓ!;ˆÔð 	�‰Õr)   )rL  r5  r)  rd  r  r  c                 óh  — |�|n| j                   j                  }|�|n| j                   j                  }|�$| j                   j                  dk(  rt	        d«      ‚| j                  |d|¬«      }|r|j                  n|d   }| j                  |«      }d}|�Yt        j                  j                  ||j                  dd dd¬	«      }	t        | j                   j                  ¬
«      }
 |
|	|«      }|s|r
|f|dd z   }n	|f|dd z   }|�|f|z   S |S t        |||r|j                  d¬«      S dd¬«      S )a�  
        labels (`torch.LongTensor` of shape `(batch_size, height, width)`, *optional*):
            Ground truth semantic segmentation maps for computing the loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels > 1`, a classification loss is computed (Cross-Entropy).

        Returns:

        Examples:

        ```python
        >>> import requests
        >>> import torch
        >>> from PIL import Image
        >>> from transformers import AutoImageProcessor, MobileViTForSemanticSegmentation

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

        >>> image_processor = AutoImageProcessor.from_pretrained("apple/deeplabv3-mobilevit-small")
        >>> model = MobileViTForSemanticSegmentation.from_pretrained("apple/deeplabv3-mobilevit-small")

        >>> inputs = image_processor(images=image, return_tensors="pt")

        >>> with torch.no_grad():
        ...     outputs = model(**inputs)

        >>> # logits are of shape (batch_size, num_labels, height, width)
        >>> logits = outputs.logits
        ```Nr   z/The number of labels should be greater than oneTrP  r�   rç   Frè   )Úignore_indexr#   )ri  rj  r�   Ú
attentions)r,   r  rS  r_  rA   r(  r�   r˜  r   r–   rî   rò   r
   Úsemantic_loss_ignore_indexr   )rJ   r)  rd  r  r  ro  Úencoder_hidden_statesrj  ri  Úupsampled_logitsrp  r®   s               r'   rO   z(MobileViTForSemanticSegmentation.forwardã  sq  € ðN %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐ $§+¡+×"8Ñ"8¸AÒ"=ÜÐNÓOÐOà—.‘.ØØ!%Ø#ð !ó 
ˆñ :E × 5Ò 5È'ÐRSÉ*Ðà×'Ñ'Ð(=Ó>ˆàˆØÐä!Ÿ}™}×8Ñ8Ø˜VŸ\™\¨"¨#Ð.°ZÈuð  9ó  Ðô (°T·[±[×5[Ñ5[Ô\ˆHÙÐ,¨fÓ5ˆDáÙ#Ø ˜ W¨Q¨R [Ñ0‘à ˜ W¨Q¨R [Ñ0�Ø)-Ð)9�T�G˜fÑ$ÐE¸vÐEä&ØØÙ3G˜'×/Ñ/Øô	
ð 	
ð NRØô	
ð 	
r)   rq  )rP   rQ   rR   r   r@   r   rW  r   r   rY  r   rT   rU   rS   r   r$  rO   rV   rW   s   @r'   r–  r–  Ò  s­   ø„ ð˜ð °4õ ñ +Ð+EÓFÙÐ+BÐQ`Ôað 04Ø)-Ø/3Ø&*ñK
à˜uŸ|™|Ñ,ðK
ð ˜Ÿ™Ñ&ðK
ð ' t™nð	K
ð
 ˜d‘^ðK
ð 
ˆuÐ-Ð-Ñ	.òK
ó bó GôK
r)   r–  )r\  r–  r;  r'  )r   N)Erh   r”   Útypingr   r   r   r   r   rT   Útorch.utils.checkpointr   Útorch.nnr	   r
   r   Úactivationsr   Úmodeling_outputsr   r   r   r   Úmodeling_utilsr   Úpytorch_utilsr   r   Úutilsr   r   r   r   r   r   Úconfiguration_mobilevitr   Ú
get_loggerrP   ÚloggerrY  rX  rZ  rr  rs  r%   r(   ÚModuler+   rY   rj   rw   r¢   r«   r»   rÂ   rÇ   rÒ   rÙ   r  r'  ÚMOBILEVIT_START_DOCSTRINGrW  r;  r\  ru  r~  r�  r–  Ú__all__r  r)   r'   ú<module>r­     sM  ðñ" ã ß 4Õ 4ã Û Ý ß AÑ Aå !÷ó õ .ß Q÷÷ õ 5ð 
ˆ×	Ñ	˜HÓ	%€ð $€ð .Ð Ú'Ð ð 2Ð Ø1Ð ñ˜#ð ¨ð ¸HÀS¹Mð ÐUXó ô=˜Ÿ™ô =ô@-F §	¡	ô -Fô`˜bŸi™iô ô.0˜RŸY™Yô 0ôf	˜"Ÿ)™)ô 	ô ˜Ÿ™ô  ô>˜BŸI™Iô ô
�b—i‘iô 
ô §	¡	ô ô&˜2Ÿ9™9ô ô&f�R—Y‘Yô fôRbp�r—y‘yô bpôJ*˜ô *ð2	Ð ð
Ð ñ Ø]ØóôT
Ð-ó T
ó	ðT
ñn ðð óôK
Ð&>ó K
óðK
ô\˜2Ÿ9™9ô ô08�B—I‘Iô 8ôv˜Ÿ™ô ñ8 ðð ó	ôX
Ð'?ó X
óðX
òv�r)   