Ë
    T^(h0Ö  ã                  ó–  — d Z ddlmZ ddlmZmZmZmZ ddlZ	ddl
mZ ddlmZmZmZmZ ddlmZmZmZmZ dd	lmZmZmZmZmZ dd
lmZmZ ddlm Z  ddl!m"Z"  e jF                  e$«      Z%dZ&dZ'g d¢Z(dZ)dZ*dAdBd„Z+ G d„ dejX                  jZ                  «      Z. G d„ dejX                  jZ                  «      Z/ G d„ dejX                  jZ                  «      Z0 G d„ dejX                  jZ                  «      Z1 G d„ dejX                  jZ                  «      Z2 G d„ dejX                  jZ                  «      Z3 G d„ d ejX                  jZ                  «      Z4 G d!„ d"ejX                  jZ                  «      Z5 G d#„ d$ejX                  jZ                  «      Z6 G d%„ d&ejX                  jZ                  «      Z7 G d'„ d(ejX                  jZ                  «      Z8 G d)„ d*ejX                  jZ                  «      Z9e G d+„ d,ejX                  jZ                  «      «       Z: G d-„ d.e«      Z;d/Z<d0Z= ed1e<«       G d2„ d3e;«      «       Z> ed4e<«       G d5„ d6e;e«      «       Z? G d7„ d8ejX                  jZ                  «      Z@ G d9„ d:ejX                  jZ                  «      ZA G d;„ d<ejX                  jZ                  «      ZB ed=e<«       G d>„ d?e;«      «       ZCg d@¢ZDy)CzTensorFlow 2.0 MobileViT model.é    )Úannotations)ÚDictÚOptionalÚTupleÚUnionNé   )Úget_tf_activation)Úadd_code_sample_docstringsÚadd_start_docstringsÚ%add_start_docstrings_to_model_forwardÚreplace_return_docstrings)ÚTFBaseModelOutputÚTFBaseModelOutputWithPoolingÚ&TFImageClassifierOutputWithNoAttentionÚ(TFSemanticSegmenterOutputWithNoAttention)ÚTFPreTrainedModelÚTFSequenceClassificationLossÚkerasÚkeras_serializableÚunpack_inputs)Ú
shape_listÚstable_softmax)Úloggingé   )ÚMobileViTConfigr   zapple/mobilevit-small)r   i€  é   r   ztabby, tabby catc                ó|   — |€|}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)ÚvalueÚdivisorÚ	min_valueÚ	new_values       úq/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/models/mobilevit/modeling_tf_mobilevit.pyÚmake_divisibler&   @   sS   € ð ÐØˆ	Ü�Iœs 5¨7°Q©;Ñ#6Ó7¸7ÑBÀWÑLÓM€Ià�3˜‘;ÒØ�WÑˆ	Üˆy‹>Ðó    c                  ój   ‡ — e Zd Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zddd„Zdd„Zˆ xZS )	ÚTFMobileViTConvLayerc           
     óÚ  •— t        ‰| �  di |¤Ž t        j                  d| j                  j
                  › d�«       t        |dz
  dz  «      |z  }t        j                  j                  |«      | _
        ||z  dk7  rt        d|› d|› d�«      ‚t        j                  j                  |||d	|||d
¬«      | _        |	r(t        j                  j                  ddd¬«      | _        nd | _        |
rht!        |
t"        «      rt%        |
«      | _        nNt!        |j(                  t"        «      rt%        |j(                  «      | _        n|j(                  | _        nd | _        || _        || _        y )Nú
z� has backpropagation operations that are NOT supported on CPU. If you wish to train/fine-tune this model, you need a GPU or a TPUr   r   r   zOutput channels (z) are not divisible by z groups.ÚVALIDÚconvolution)ÚfiltersÚkernel_sizeÚstridesÚpaddingÚdilation_rateÚgroupsÚuse_biasÚnamegñhãˆµøä>gš™™™™™¹?Únormalization)ÚepsilonÚmomentumr5   © )ÚsuperÚ__init__ÚloggerÚwarningÚ	__class__Ú__name__r    r   ÚlayersÚZeroPadding2Dr1   Ú
ValueErrorÚConv2Dr-   ÚBatchNormalizationr6   Ú
isinstanceÚstrr	   Ú
activationÚ
hidden_actÚin_channelsÚout_channels)ÚselfÚconfigrI   rJ   r/   Ústrider3   ÚbiasÚdilationÚuse_normalizationÚuse_activationÚkwargsr1   r>   s                €r%   r;   zTFMobileViTConvLayer.__init__P   s[  ø€ ô 	‰ÑÑ"˜6Ò"Ü�‰Ø�—‘×(Ñ(Ð)ð *Eð Eô	
ô
 �{ Q‘¨!Ñ+Ó,¨xÑ7ˆÜ—|‘|×1Ñ1°'Ó:ˆŒà˜&Ñ  AÒ%ÜÐ0°°Ð>UÐV\ÐU]Ð]eÐfÓgÐgä Ÿ<™<×.Ñ.Ø Ø#ØØØ"ØØØð /ó 	
ˆÔñ Ü!&§¡×!@Ñ!@ÈÐX[ÐbqÐ!@Ó!rˆDÕà!%ˆDÔáÜ˜.¬#Ô.Ü"3°NÓ"C�•Ü˜F×-Ñ-¬sÔ3Ü"3°F×4EÑ4EÓ"F�•à"(×"3Ñ"3�•à"ˆDŒOØ&ˆÔØ(ˆÕr'   c                óÂ   — | j                  |«      }| j                  |«      }| j                  �| j                  ||¬«      }| j                  �| j                  |«      }|S ©N©Útraining)r1   r-   r6   rG   )rK   ÚfeaturesrV   Úpadded_featuress       r%   ÚcallzTFMobileViTConvLayer.call†   s^   € ØŸ,™, xÓ0ˆØ×#Ñ# OÓ4ˆØ×ÑÐ)Ø×)Ñ)¨(¸XÐ)ÓFˆHØ�?‰?Ð&Ø—‘ xÓ0ˆHØˆr'   c                ó,  — | j                   ry d| _         t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d d | j                  g«       d d d «       t        | dd «      �st        | j                  d«      r\t        j                  | j                  j
                  «      5  | j                  j                  d d d | j                  g«       d d d «       y y y # 1 sw Y   ŒŠxY w# 1 sw Y   y xY w)NTr-   r6   r5   )ÚbuiltÚgetattrÚtfÚ
name_scoper-   r5   ÚbuildrI   Úhasattrr6   rJ   ©rK   Úinput_shapes     r%   r_   zTFMobileViTConvLayer.build�   sù   € Ø�:Š:ØØˆŒ
Ü�4˜¨Ó-Ð9Ü—‘˜t×/Ñ/×4Ñ4Ó5ñ MØ× Ñ ×&Ñ&¨¨d°D¸$×:JÑ:JÐ'KÔL÷Mä�4˜¨$Ó/Ð;Ü�t×)Ñ)¨6Ô2Ü—]‘] 4×#5Ñ#5×#:Ñ#:Ó;ñ TØ×&Ñ&×,Ñ,¨d°D¸$À×@QÑ@QÐ-RÔS÷Tð Tð 3ð <÷Mð Mú÷Tð Tús   Á*C>Ã	*D
Ã>DÄ
D)r   r   Fr   TT)rL   r   rI   r    rJ   r    r/   r    rM   r    r3   r    rN   ÚboolrO   r    rP   rc   rQ   zUnion[bool, str]ÚreturnÚNone©F©rW   ú	tf.TensorrV   rc   rd   rh   ©N©r?   Ú
__module__Ú__qualname__r;   rY   r_   Ú__classcell__©r>   s   @r%   r)   r)   O   s”   ø„ ð ØØØØ"&Ø+/ð4)àð4)ð ð4)ð ð	4)ð
 ð4)ð ð4)ð ð4)ð ð4)ð ð4)ð  ð4)ð )ð4)ð 
õ4)ôl÷
Tr'   r)   c                  óP   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zddd„Zd	d„Zˆ xZS )
ÚTFMobileViTInvertedResidualzQ
    Inverted residual block (MobileNetv2): https://arxiv.org/abs/1801.04381
    c           
     óH  •— t        ‰| �  di |¤Ž t        t        t	        ||j
                  z  «      «      d«      }|dvrt        d|› d�«      ‚|dk(  xr ||k(  | _        t        |||dd¬«      | _	        t        |||d|||d	¬
«      | _
        t        |||ddd¬«      | _        y )Nr   )r   r   zInvalid stride ú.r   Ú
expand_1x1©rI   rJ   r/   r5   r   Úconv_3x3)rI   rJ   r/   rM   r3   rO   r5   FÚ
reduce_1x1©rI   rJ   r/   rQ   r5   r9   )r:   r;   r&   r    ÚroundÚexpand_ratiorB   Úuse_residualr)   rs   ru   rv   )	rK   rL   rI   rJ   rM   rO   rR   Úexpanded_channelsr>   s	           €r%   r;   z$TFMobileViTInvertedResidual.__init__¡   sÊ   ø€ ô 	‰ÑÑ"˜6Ò"Ü*¬3¬u°[À6×CVÑCVÑ5VÓ/WÓ+XÐZ[Ó\Ðà˜ÑÜ˜¨v¨h°aÐ8Ó9Ð9à# q™[ÒK¨{¸lÑ/JˆÔä.Ø Ð:KÐYZÐamô
ˆŒô -ØØ)Ø*ØØØ$ØØô	
ˆŒô /ØØ)Ø%ØØ Øô
ˆ�r'   c                óž   — |}| j                  ||¬«      }| j                  ||¬«      }| j                  ||¬«      }| j                  r||z   S |S rT   )rs   ru   rv   rz   )rK   rW   rV   Úresiduals       r%   rY   z TFMobileViTInvertedResidual.callÄ   sU   € Øˆà—?‘? 8°h�?Ó?ˆØ—=‘= °H�=Ó=ˆØ—?‘? 8°h�?Ó?ˆà&*×&7Ò&7ˆx˜(Ñ"ÐE¸XÐEr'   c                ó’  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   Œ¿xY w# 1 sw Y   ŒqxY w# 1 sw Y   y xY w)NTrs   ru   rv   )	r[   r\   r]   r^   rs   r5   r_   ru   rv   ra   s     r%   r_   z!TFMobileViTInvertedResidual.buildÍ   s  € Ø�:Š:ØØˆŒ
Ü�4˜ tÓ,Ð8Ü—‘˜tŸ™×3Ñ3Ó4ñ ,Ø—‘×%Ñ% dÔ+÷,ä�4˜ TÓ*Ð6Ü—‘˜tŸ}™}×1Ñ1Ó2ñ *Ø—‘×#Ñ# DÔ)÷*ä�4˜ tÓ,Ð8Ü—‘˜tŸ™×3Ñ3Ó4ñ ,Ø—‘×%Ñ% dÔ+÷,ð ,ð 9÷,ð ,ú÷*ð *ú÷,ð ,ús$   ÁD%Â%D1Ã?D=Ä%D.Ä1D:Ä=E©r   )rL   r   rI   r    rJ   r    rM   r    rO   r    rd   re   rf   rg   ri   ©r?   rk   rl   Ú__doc__r;   rY   r_   rm   rn   s   @r%   rp   rp   œ   sP   ø„ ñð
 jkð!
Ø%ð!
Ø47ð!
ØGJð!
ØTWð!
Øcfð!
à	õ!
ôFF÷,r'   rp   c                  óN   ‡ — e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zddd„Zdd„Zˆ xZS )	ÚTFMobileViTMobileNetLayerc           	     óÀ   •— t        ‰	| �  di |¤Ž g | _        t        |«      D ]9  }t	        ||||dk(  r|ndd|› �¬«      }| j                  j                  |«       |}Œ; y )Nr   r   úlayer.)rI   rJ   rM   r5   r9   )r:   r;   r@   Úrangerp   Úappend)
rK   rL   rI   rJ   rM   Ú
num_stagesrR   ÚiÚlayerr>   s
            €r%   r;   z"TFMobileViTMobileNetLayer.__init__Ý   sp   ø€ ô 	‰ÑÑ"˜6Ò"àˆŒÜ�zÓ"ò 		'ˆAÜ/ØØ'Ø)Ø!" a¢‘v¨QØ˜a˜S�\ôˆEð �K‰K×Ñ˜uÔ%Ø&‰Kñ		'r'   c                ó<   — | j                   D ]  } |||¬«      }Œ |S rT   ©r@   )rK   rW   rV   Úlayer_modules       r%   rY   zTFMobileViTMobileNetLayer.callô   s(   € Ø ŸK™Kò 	AˆLÙ# H°xÔ@‰Hð	Aàˆr'   c                óô   — | j                   ry d| _         t        | dd «      �K| j                  D ];  }t        j                  |j
                  «      5  |j                  d «       d d d «       Œ= y y # 1 sw Y   ŒIxY w©NTr@   ©r[   r\   r@   r]   r^   r5   r_   ©rK   rb   r�   s      r%   r_   zTFMobileViTMobileNetLayer.buildù   ót   € Ø�:Š:ØØˆŒ
Ü�4˜ 4Ó(Ð4Ø $§¡ò -�Ü—]‘] <×#4Ñ#4Ó5ñ -Ø ×&Ñ& tÔ,÷-ð -ñ-ð 5÷-ð -úó   ÁA.Á.A7	)r   r   )rL   r   rI   r    rJ   r    rM   r    rˆ   r    rd   re   rf   rg   ri   rj   rn   s   @r%   rƒ   rƒ   Ü   sT   ø„ ð Øð'àð'ð ð'ð ð	'ð
 ð'ð ð'ð 
õ'ô.÷
-r'   rƒ   c                  ó:   ‡ — e Zd Zdˆ fd„Zdd„Zddd„Zd	d„Zˆ xZS )
ÚTFMobileViTSelfAttentionc                óŠ  •— t        ‰| �  d
i |¤Ž ||j                  z  dk7  rt        d|› d|j                  › d�«      ‚|j                  | _        t	        ||j                  z  «      | _        | j                  | j
                  z  | _        t        j                  | j
                  t        j                  ¬«      }t        j                  j                  |«      | _        t        j                  j                  | j                  |j                   d¬«      | _        t        j                  j                  | j                  |j                   d¬«      | _        t        j                  j                  | j                  |j                   d	¬«      | _        t        j                  j)                  |j*                  «      | _        || _        y )Nr   zThe hidden size z4 is not a multiple of the number of attention heads rr   ©ÚdtypeÚquery)r4   r5   Úkeyr!   r9   )r:   r;   Únum_attention_headsrB   r    Úattention_head_sizeÚall_head_sizer]   ÚcastÚfloat32ÚmathÚsqrtÚscaler   r@   ÚDenseÚqkv_biasr™   rš   r!   ÚDropoutÚattention_probs_dropout_probÚdropoutÚhidden_size)rK   rL   r¨   rR   r¢   r>   s        €r%   r;   z!TFMobileViTSelfAttention.__init__  s]  ø€ Ü‰ÑÑ"˜6Ò"à˜×3Ñ3Ñ3°qÒ8ÜØ" ; -ð 0Ø×3Ñ3Ð4°Að7óð ð
 $*×#=Ñ#=ˆÔ Ü#& {°V×5OÑ5OÑ'OÓ#PˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔÜ—‘˜×0Ñ0¼¿
¹
ÔCˆÜ—W‘W—\‘\ %Ó(ˆŒ
ä—\‘\×'Ñ'¨×(:Ñ(:ÀVÇ_Á_Ð[bÐ'ÓcˆŒ
Ü—<‘<×%Ñ% d×&8Ñ&8À6Ç?Á?ÐY^Ð%Ó_ˆŒÜ—\‘\×'Ñ'¨×(:Ñ(:ÀVÇ_Á_Ð[bÐ'ÓcˆŒ
ä—|‘|×+Ñ+¨F×,OÑ,OÓPˆŒØ&ˆÕr'   c                óÂ   — t        j                  |«      d   }t        j                  ||d| j                  | j                  f¬«      }t        j
                  |g d¢¬«      S )Nr   éÿÿÿÿ©Úshape©r   r   r   r   ©Úperm)r]   r¬   Úreshaper›   rœ   Ú	transpose)rK   ÚxÚ
batch_sizes      r%   Útranspose_for_scoresz-TFMobileViTSelfAttention.transpose_for_scores  sI   € Ü—X‘X˜a“[ ‘^ˆ
Ü�J‰J�q ¨R°×1IÑ1IÈ4×KcÑKcÐ dÔeˆÜ�|‰|˜A¢LÔ1Ð1r'   c                ó*  — t        j                  |«      d   }| j                  | j                  |«      «      }| j                  | j	                  |«      «      }| j                  | j                  |«      «      }t        j                  ||d¬«      }|| j                  z  }t        |d¬«      }| j                  ||¬«      }t        j                  ||«      }	t        j                  |	g d¢¬«      }	t        j                  |	|d| j                  f¬	«      }	|	S )
Nr   T)Útranspose_brª   ©ÚaxisrU   r­   r®   r«   )r]   r¬   r´   rš   r!   r™   Úmatmulr¢   r   r§   r±   r°   r�   )
rK   Úhidden_statesrV   r³   Ú	key_layerÚvalue_layerÚquery_layerÚattention_scoresÚattention_probsÚcontext_layers
             r%   rY   zTFMobileViTSelfAttention.call  sê   € Ü—X‘X˜mÓ,¨QÑ/ˆ
à×-Ñ-¨d¯h©h°}Ó.EÓFˆ	Ø×/Ñ/°·
±
¸=Ó0IÓJˆØ×/Ñ/°·
±
¸=Ó0IÓJˆô Ÿ9™9 [°)ÈÔNÐØ+¨d¯j©jÑ8Ðô )Ð)9ÀÔCˆð Ÿ,™, À˜,ÓJˆäŸ	™	 /°;Ó?ˆäŸ™ ]ºÔFˆÜŸ
™
 =¸ÀRÈ×I[ÑI[Ð8\Ô]ˆØÐr'   c                óà  — | j                   ry d| _         t        | dd «      �Zt        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       t        | dd «      �Zt        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       y y # 1 sw Y   ŒÙxY w# 1 sw Y   Œ~xY w# 1 sw Y   y xY w)NTr™   rš   r!   )
r[   r\   r]   r^   r™   r5   r_   r¨   rš   r!   ra   s     r%   r_   zTFMobileViTSelfAttention.build7  s)  € Ø�:Š:ØØˆŒ
Ü�4˜ $Ó'Ð3Ü—‘˜tŸz™zŸ™Ó/ñ AØ—
‘
× Ñ  $¨¨d×.>Ñ.>Ð!?Ô@÷Aä�4˜ Ó%Ð1Ü—‘˜tŸx™xŸ}™}Ó-ñ ?Ø—‘—‘  d¨D×,<Ñ,<Ð=Ô>÷?ä�4˜ $Ó'Ð3Ü—‘˜tŸz™zŸ™Ó/ñ AØ—
‘
× Ñ  $¨¨d×.>Ñ.>Ð!?Ô@÷Að Að 4÷Að Aú÷?ð ?ú÷Að Aús$   Á)EÂ2)EÄ)E$ÅEÅE!Å$E-©rL   r   r¨   r    rd   re   )r²   rh   rd   rh   rf   ©rº   rh   rV   rc   rd   rh   ri   )r?   rk   rl   r;   r´   rY   r_   rm   rn   s   @r%   r•   r•     s   ø„ õ'ó,2ô
÷0Ar'   r•   c                  ó2   ‡ — e Zd Zdˆ fd„Zddd„Zdd„Zˆ xZS )ÚTFMobileViTSelfOutputc                óÚ   •— t        ‰| �  di |¤Ž t        j                  j	                  |d¬«      | _        t        j                  j                  |j                  «      | _        || _	        y ©NÚdense©r5   r9   )
r:   r;   r   r@   r£   rÈ   r¥   Úhidden_dropout_probr§   r¨   ©rK   rL   r¨   rR   r>   s       €r%   r;   zTFMobileViTSelfOutput.__init__G  sR   ø€ Ü‰ÑÑ"˜6Ò"Ü—\‘\×'Ñ'¨¸'Ð'ÓBˆŒ
Ü—|‘|×+Ñ+¨F×,FÑ,FÓGˆŒØ&ˆÕr'   c                óN   — | j                  |«      }| j                  ||¬«      }|S rT   ©rÈ   r§   )rK   rº   rV   s      r%   rY   zTFMobileViTSelfOutput.callM  s(   € ØŸ
™
 =Ó1ˆØŸ™ ]¸X˜ÓFˆØÐr'   c                ó  — | j                   ry d| _         t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       y y # 1 sw Y   y xY w©NTrÈ   ©r[   r\   r]   r^   rÈ   r5   r_   r¨   ra   s     r%   r_   zTFMobileViTSelfOutput.buildR  óy   € Ø�:Š:ØØˆŒ
Ü�4˜ $Ó'Ð3Ü—‘˜tŸz™zŸ™Ó/ñ AØ—
‘
× Ñ  $¨¨d×.>Ñ.>Ð!?Ô@÷Að Að 4÷Að Aúó   Á)A>Á>BrÂ   rf   rÃ   ri   rj   rn   s   @r%   rÅ   rÅ   F  s   ø„ õ'ô÷
Ar'   rÅ   c                  ó8   ‡ — e Zd Zdˆ fd„Zd„ Zddd„Zdd„Zˆ xZS )	ÚTFMobileViTAttentionc                óp   •— t        ‰| �  di |¤Ž t        ||d¬«      | _        t	        ||d¬«      | _        y )NÚ	attentionrÉ   Úoutputr9   )r:   r;   r•   rÖ   rÅ   Údense_outputrË   s       €r%   r;   zTFMobileViTAttention.__init__\  s4   ø€ Ü‰ÑÑ"˜6Ò"Ü1°&¸+ÈKÔXˆŒÜ1°&¸+ÈHÔUˆÕr'   c                ó   — t         ‚ri   ©ÚNotImplementedError)rK   Úheadss     r%   Úprune_headsz TFMobileViTAttention.prune_headsa  s   € Ü!Ð!r'   c                óR   — | j                  ||¬«      }| j                  ||¬«      }|S rT   )rÖ   rØ   )rK   rº   rV   Úself_outputsÚattention_outputs        r%   rY   zTFMobileViTAttention.calld  s0   € Ø—~‘~ m¸h�~ÓGˆØ×,Ñ,¨\ÀHÐ,ÓMÐØÐr'   c                óÆ  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   ŒexY w# 1 sw Y   y xY w)NTrÖ   rØ   )r[   r\   r]   r^   rÖ   r5   r_   rØ   ra   s     r%   r_   zTFMobileViTAttention.buildi  s¹   € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ä�4˜¨Ó.Ð:Ü—‘˜t×0Ñ0×5Ñ5Ó6ñ .Ø×!Ñ!×'Ñ'¨Ô-÷.ð .ð ;÷+ð +ú÷.ð .úó   ÁCÂ%CÃCÃC rÂ   rf   rÃ   ri   )r?   rk   rl   r;   rÝ   rY   r_   rm   rn   s   @r%   rÔ   rÔ   [  s   ø„ õVò
"ô ÷
	.r'   rÔ   c                  ó0   ‡ — e Zd Zdˆ fd„Zdd„Zdd„Zˆ xZS )ÚTFMobileViTIntermediatec                ó  •— t        ‰| �  di |¤Ž t        j                  j	                  |d¬«      | _        t        |j                  t        «      r"t        |j                  «      | _
        || _        y |j                  | _
        || _        y rÇ   )r:   r;   r   r@   r£   rÈ   rE   rH   rF   r	   Úintermediate_act_fnr¨   ©rK   rL   r¨   Úintermediate_sizerR   r>   s        €r%   r;   z TFMobileViTIntermediate.__init__v  st   ø€ Ü‰ÑÑ"˜6Ò"Ü—\‘\×'Ñ'Ð(9ÀÐ'ÓHˆŒ
Ü�f×'Ñ'¬Ô-Ü'8¸×9JÑ9JÓ'KˆDÔ$ð 'ˆÕð (.×'8Ñ'8ˆDÔ$Ø&ˆÕr'   c                óJ   — | j                  |«      }| j                  |«      }|S ri   )rÈ   ræ   )rK   rº   s     r%   rY   zTFMobileViTIntermediate.call  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr'   c                ó  — | j                   ry d| _         t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       y y # 1 sw Y   y xY wrÏ   rÐ   ra   s     r%   r_   zTFMobileViTIntermediate.build„  rÑ   rÒ   ©rL   r   r¨   r    rè   r    rd   re   )rº   rh   rd   rh   ri   rj   rn   s   @r%   rä   rä   u  s   ø„ õ'ó÷
Ar'   rä   c                  ó2   ‡ — e Zd Zdˆ fd„Zddd„Zdd„Zˆ xZS )ÚTFMobileViTOutputc                óÚ   •— t        ‰| �  di |¤Ž t        j                  j	                  |d¬«      | _        t        j                  j                  |j                  «      | _        || _	        y rÇ   )
r:   r;   r   r@   r£   rÈ   r¥   rÊ   r§   rè   rç   s        €r%   r;   zTFMobileViTOutput.__init__Ž  sR   ø€ Ü‰ÑÑ"˜6Ò"Ü—\‘\×'Ñ'¨¸'Ð'ÓBˆŒ
Ü—|‘|×+Ñ+¨F×,FÑ,FÓGˆŒØ!2ˆÕr'   c                óX   — | j                  |«      }| j                  ||¬«      }||z   }|S rT   rÍ   )rK   rº   Úinput_tensorrV   s       r%   rY   zTFMobileViTOutput.call”  s2   € ØŸ
™
 =Ó1ˆØŸ™ ]¸X˜ÓFˆØ%¨Ñ4ˆØÐr'   c                ó  — | j                   ry d| _         t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       y y # 1 sw Y   y xY wrÏ   )r[   r\   r]   r^   rÈ   r5   r_   rè   ra   s     r%   r_   zTFMobileViTOutput.buildš  sy   € Ø�:Š:ØØˆŒ
Ü�4˜ $Ó'Ð3Ü—‘˜tŸz™zŸ™Ó/ñ GØ—
‘
× Ñ  $¨¨d×.DÑ.DÐ!EÔF÷Gð Gð 4÷Gð GúrÒ   rë   rf   )rº   rh   rð   rh   rV   rc   rd   rh   ri   rj   rn   s   @r%   rí   rí   �  s   ø„ õ3ô÷Gr'   rí   c                  ó2   ‡ — e Zd Zdˆ fd„Zddd„Zdd„Zˆ xZS )ÚTFMobileViTTransformerLayerc                óh  •— t        ‰| �  di |¤Ž t        ||d¬«      | _        t	        |||d¬«      | _        t        |||d¬«      | _        t        j                  j                  |j                  d¬«      | _        t        j                  j                  |j                  d¬«      | _        || _        y )	NrÖ   rÉ   Úintermediater×   Úlayernorm_before©r7   r5   Úlayernorm_afterr9   )r:   r;   rÔ   rÖ   rä   rõ   rí   Úmobilevit_outputr   r@   ÚLayerNormalizationÚlayer_norm_epsrö   rø   r¨   rç   s        €r%   r;   z$TFMobileViTTransformerLayer.__init__¤  s›   ø€ Ü‰ÑÑ"˜6Ò"Ü-¨f°kÈÔTˆŒÜ3°F¸KÐIZÐaoÔpˆÔÜ 1°&¸+ÐGXÐ_gÔ hˆÔÜ %§¡× ?Ñ ?È×H]ÑH]ÐdvÐ ?Ó wˆÔÜ$Ÿ|™|×>Ñ>Àv×G\ÑG\ÐctÐ>ÓuˆÔØ&ˆÕr'   c                óÀ   — | j                  | j                  |«      |¬«      }||z   }| j                  |«      }| j                  |«      }| j	                  |||¬«      }|S rT   )rÖ   rö   rø   rõ   rù   )rK   rº   rV   rà   Úlayer_outputs        r%   rY   z TFMobileViTTransformerLayer.call­  si   € ØŸ>™>¨$×*?Ñ*?ÀÓ*NÐYa˜>ÓbÐØ(¨=Ñ8ˆà×+Ñ+¨MÓ:ˆØ×(Ñ(¨Ó6ˆØ×,Ñ,¨\¸=ÐS[Ð,Ó\ˆØÐr'   c                ób  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Zt        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       t        | dd «      �[t        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       y y # 1 sw Y   �ŒŽxY w# 1 sw Y   �ŒAxY w# 1 sw Y   ŒóxY w# 1 sw Y   Œ˜xY w# 1 sw Y   y xY w)NTrÖ   rõ   rù   rö   rø   )r[   r\   r]   r^   rÖ   r5   r_   rõ   rù   rö   r¨   rø   ra   s     r%   r_   z!TFMobileViTTransformerLayer.build¶  sÏ  € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ä�4˜¨Ó.Ð:Ü—‘˜t×0Ñ0×5Ñ5Ó6ñ .Ø×!Ñ!×'Ñ'¨Ô-÷.ä�4Ð+¨TÓ2Ð>Ü—‘˜t×4Ñ4×9Ñ9Ó:ñ 2Ø×%Ñ%×+Ñ+¨DÔ1÷2ä�4Ð+¨TÓ2Ð>Ü—‘˜t×4Ñ4×9Ñ9Ó:ñ LØ×%Ñ%×+Ñ+¨T°4¸×9IÑ9IÐ,JÔK÷Lä�4Ð*¨DÓ1Ð=Ü—‘˜t×3Ñ3×8Ñ8Ó9ñ KØ×$Ñ$×*Ñ*¨D°$¸×8HÑ8HÐ+IÔJ÷Kð Kð >÷+ñ +ú÷.ñ .ú÷2ð 2ú÷Lð Lú÷Kð Kús<   ÁG3Â%H Ã?HÅ)HÇ )H%Ç3G=È H
ÈHÈH"È%H.rë   rf   rÃ   ri   rj   rn   s   @r%   ró   ró   £  s   ø„ õ'ô÷Kr'   ró   c                  ó2   ‡ — e Zd Zdˆ fd„Zddd„Zdd„Zˆ xZS )ÚTFMobileViTTransformerc           	     óØ   •— t        ‰| �  di |¤Ž g | _        t        |«      D ]E  }t	        ||t        ||j                  z  «      d|› �¬«      }| j                  j                  |«       ŒG y )Nr…   )r¨   rè   r5   r9   )r:   r;   r@   r†   ró   r    Ú	mlp_ratior‡   )rK   rL   r¨   rˆ   rR   r‰   Útransformer_layerr>   s          €r%   r;   zTFMobileViTTransformer.__init__Ì  sp   ø€ Ü‰ÑÑ"˜6Ò"àˆŒÜ�zÓ"ò 	2ˆAÜ ;ØØ'Ü"% k°F×4DÑ4DÑ&DÓ"EØ˜a˜S�\ô	!Ðð �K‰K×ÑÐ0Õ1ñ	2r'   c                ó<   — | j                   D ]  } |||¬«      }Œ |S rT   rŒ   )rK   rº   rV   r�   s       r%   rY   zTFMobileViTTransformer.callÙ  s)   € Ø ŸK™Kò 	KˆLÙ(¨ÀÔJ‰Mð	KàÐr'   c                óô   — | j                   ry d| _         t        | dd «      �K| j                  D ];  }t        j                  |j
                  «      5  |j                  d «       d d d «       Œ= y y # 1 sw Y   ŒIxY wr�   r�   r‘   s      r%   r_   zTFMobileViTTransformer.buildÞ  r’   r“   )rL   r   r¨   r    rˆ   r    rd   re   rf   rÃ   ri   rj   rn   s   @r%   r   r   Ë  s   ø„ õ2ô÷
-r'   r   c                  óh   ‡ — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd	d„Zd
d„Zddd„Zdd„Zˆ xZ	S )ÚTFMobileViTLayerz;
    MobileViT block: https://arxiv.org/abs/2110.02178
    c           	     óD  •— t        ‰	| �  di |¤Ž |j                  | _        |j                  | _        |dk(  r*t        ||||dk(  r|nd|dkD  r|dz  ndd¬«      | _        |}nd | _        t        ||||j                  d¬«      | _	        t        |||dddd¬	«      | _
        t        |||d
¬«      | _        t        j                  j                  |j                   d¬«      | _        t        |||dd¬«      | _        t        |d|z  ||j                  d¬«      | _        || _        y )Nr   r   Údownsampling_layer)rI   rJ   rM   rO   r5   Úconv_kxkrt   FÚconv_1x1)rI   rJ   r/   rP   rQ   r5   Útransformer)r¨   rˆ   r5   Ú	layernormr÷   Úconv_projectionÚfusionr9   )r:   r;   Ú
patch_sizeÚpatch_widthÚpatch_heightrp   r	  r)   Úconv_kernel_sizer
  r  r   r  r   r@   rú   rû   r  r  r  r¨   )
rK   rL   rI   rJ   rM   r¨   rˆ   rO   rR   r>   s
            €r%   r;   zTFMobileViTLayer.__init__í  sE  ø€ ô 	‰ÑÑ"˜6Ò"Ø!×,Ñ,ˆÔØ"×-Ñ-ˆÔà�QŠ;Ü&AØØ'Ø)Ø!)¨Q¢‘v°AØ*2°Qª,˜ Qš¸AØ)ô'ˆDÔ#ð '‰Kà&*ˆDÔ#ä,ØØ#Ø$Ø×/Ñ/Øô
ˆŒô -ØØ#Ø$ØØ#Ø Øô
ˆŒô 2Ø ¸
Èô
ˆÔô Ÿ™×8Ñ8À×AVÑAVÐ]hÐ8ÓiˆŒä3Ø ¸+ÐSTÐ[lô 
ˆÔô +ØØ˜K™Ø$Ø×/Ñ/Øô
ˆŒð 'ˆÕr'   c                óæ  — | j                   | j                  }}t        j                  ||z  d«      }t        j                  |«      d   }t        j                  |«      d   }t        j                  |«      d   }t        j                  |«      d   }t        j                  t        j
                  j                  ||z  «      |z  d«      }	t        j                  t        j
                  j                  ||z  «      |z  d«      }
|
|k7  xs |	|k7  }|r$t        j                  j                  ||	|
fd¬«      }|
|z  }|	|z  }||z  }t        j                  |g d¢«      }t        j                  |||z  |z  |||f«      }t        j                  |g d	¢«      }t        j                  |||||f«      }t        j                  |g d
¢«      }t        j                  |||z  ||f«      }||f||||||dœ}||fS )NÚint32r   r   r   r   Úbilinear©ÚsizeÚmethod©r   r   r   r   r­   ©r   r   r   r   )Ú	orig_sizer³   ÚchannelsÚinterpolateÚnum_patchesÚnum_patches_widthÚnum_patches_height)r  r  r]   rž   r¬   r    ÚceilÚimageÚresizer±   r°   )rK   rW   r  r  Ú
patch_arear³   Úorig_heightÚ
orig_widthr  Ú
new_heightÚ	new_widthr  Únum_patch_widthÚnum_patch_heightr  ÚpatchesÚ	info_dicts                    r%   Ú	unfoldingzTFMobileViTLayer.unfolding.  sß  € Ø$(×$4Ñ$4°d×6GÑ6G�\ˆÜ—W‘W˜[¨<Ñ7¸ÓAˆ
ä—X‘X˜hÓ'¨Ñ*ˆ
Ü—h‘h˜xÓ(¨Ñ+ˆÜ—X‘X˜hÓ'¨Ñ*ˆ
Ü—8‘8˜HÓ% aÑ(ˆä—W‘WœRŸW™WŸ\™\¨+¸Ñ*DÓEÈÑTÐV]Ó^ˆ
Ü—G‘GœBŸG™GŸL™L¨°kÑ)AÓBÀ[ÑPÐRYÓZˆ	à :Ñ-ÒJ°¸{Ñ1JˆÙä—x‘x—‘ x°zÀ9Ð6MÐV`�ÓaˆHð $ {Ñ2ˆØ%¨Ñ5ÐØ&¨Ñ8ˆô —<‘< ª,Ó7ˆÜ—*‘*Ø�z HÑ,Ð/?Ñ?ÀÈÐ`kÐló
ˆô —,‘,˜wªÓ5ˆÜ—*‘*˜W z°8¸[È*Ð&UÓVˆÜ—,‘,˜wªÓ5ˆÜ—*‘*˜W z°JÑ'>ÀÈXÐ&VÓWˆð & zÐ2Ø$Ø Ø&Ø&Ø!0Ø"2ñ
ˆ	ð ˜	Ð!Ð!r'   c                ó  — | j                   | j                  }}t        ||z  «      }|d   }|d   }|d   }|d   }	|d   }
t        j                  ||||df«      }t        j
                  |d¬«      }t        j                  |||z  |	z  |
||f«      }t        j
                  |d	¬«      }t        j                  ||||	|z  |
|z  f«      }t        j
                  |d
¬«      }|d   r%t        j                  j                  ||d   d¬«      }|S )Nr³   r  r  r!  r   rª   r  r®   r­   ©r   r   r   r   r  r  r  r  )r  r  r    r]   r°   r±   r#  r$  )rK   r,  r-  r  r  r%  r³   r  r  r+  r*  rW   s               r%   ÚfoldingzTFMobileViTLayer.foldingZ  s&  € Ø$(×$4Ñ$4°d×6GÑ6G�\ˆÜ˜ |Ñ3Ó4ˆ
à˜|Ñ,ˆ
Ø˜ZÑ(ˆØ Ñ.ˆØ$Ð%9Ñ:ÐØ#Ð$7Ñ8ˆô —:‘:˜g¨
°JÀÈRÐ'PÓQˆÜ—<‘< ¨|Ô<ˆÜ—:‘:Ø�z HÑ,Ð/?Ñ?ÀÐR^Ð`kÐló
ˆô —<‘< ¨|Ô<ˆÜ—:‘:Ø�z 8Ð-=ÀÑ-LÈoÐ`kÑNkÐló
ˆô —<‘< ¨|Ô<ˆà�]Ò#Ü—x‘x—‘ x°iÀÑ6LÐU_�Ó`ˆHàˆr'   c                ó¢  — | j                   r| j                  ||¬«      }|}| j                  ||¬«      }| j                  ||¬«      }| j                  |«      \  }}| j	                  ||¬«      }| j                  |«      }| j                  ||«      }| j                  ||¬«      }| j                  t        j                  ||gd¬«      |¬«      }|S )NrU   rª   r·   )r	  r
  r  r.  r  r  r1  r  r  r]   Úconcat)rK   rW   rV   r}   r,  r-  s         r%   rY   zTFMobileViTLayer.callv  sÔ   € à×"Ò"Ø×.Ñ.¨xÀ(Ð.ÓKˆHàˆð —=‘= °H�=Ó=ˆØ—=‘= °H�=Ó=ˆð "Ÿ^™^¨HÓ5Ñˆ�ð ×"Ñ" 7°XÐ"Ó>ˆØ—.‘. Ó)ˆð —<‘< ¨Ó3ˆà×'Ñ'¨¸8Ð'ÓDˆØ—;‘;œrŸy™y¨(°HÐ)=ÀBÔGÐRZ�;Ó[ˆØˆr'   c                óä  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Zt        j                  | j                  j
                  «      5  | j                  j                  d d | j                  g«       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   �Œ5xY w# 1 sw Y   �ŒèxY w# 1 sw Y   �Œ›xY w# 1 sw Y   �ŒAxY w# 1 sw Y   ŒóxY w# 1 sw Y   Œ¥xY w# 1 sw Y   y xY w)	NTr
  r  r  r  r  r  r	  )r[   r\   r]   r^   r
  r5   r_   r  r  r  r¨   r  r  r	  ra   s     r%   r_   zTFMobileViTLayer.build�  sQ  € Ø�:Š:ØØˆŒ
Ü�4˜ TÓ*Ð6Ü—‘˜tŸ}™}×1Ñ1Ó2ñ *Ø—‘×#Ñ# DÔ)÷*ä�4˜ TÓ*Ð6Ü—‘˜tŸ}™}×1Ñ1Ó2ñ *Ø—‘×#Ñ# DÔ)÷*ä�4˜¨Ó-Ð9Ü—‘˜t×/Ñ/×4Ñ4Ó5ñ -Ø× Ñ ×&Ñ& tÔ,÷-ä�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ EØ—‘×$Ñ$ d¨D°$×2BÑ2BÐ%CÔD÷Eä�4Ð*¨DÓ1Ð=Ü—‘˜t×3Ñ3×8Ñ8Ó9ñ 1Ø×$Ñ$×*Ñ*¨4Ô0÷1ä�4˜ 4Ó(Ð4Ü—‘˜tŸ{™{×/Ñ/Ó0ñ (Ø—‘×!Ñ! $Ô'÷(ä�4Ð-¨tÓ4Ð@Ü—‘˜t×6Ñ6×;Ñ;Ó<ñ 4Ø×'Ñ'×-Ñ-¨dÔ3÷4ð 4ð A÷#*ñ *ú÷*ñ *ú÷-ñ -ú÷Eñ Eú÷1ð 1ú÷(ð (ú÷4ð 4úsT   ÁJÂ%J'Ã?J4Å)KÇ KÈKÉ4K&ÊJ$Ê'J1Ê4J>ËKËKËK#Ë&K/r   )rL   r   rI   r    rJ   r    rM   r    r¨   r    rˆ   r    rO   r    rd   re   )rW   rh   rd   zTuple[tf.Tensor, Dict])r,  rh   r-  r   rd   rh   rf   rg   ri   )
r?   rk   rl   r�   r;   r.  r1  rY   r_   rm   rn   s   @r%   r  r  è  sv   ø„ ñð ð?'àð?'ð ð?'ð ð	?'ð
 ð?'ð ð?'ð ð?'ð ð?'ð 
õ?'óB*"óXô8÷24r'   r  c                  óJ   ‡ — e Zd Zdˆ fd„Z	 	 	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Zˆ xZS )ÚTFMobileViTEncoderc           
     óÆ  •— t        ‰| �  di |¤Ž || _        g | _        dx}}|j                  dk(  rd}d}n|j                  dk(  rd}d}t        ||j                  d   |j                  d   ddd¬«      }| j                  j                  |«       t        ||j                  d   |j                  d	   d	d
d¬«      }| j                  j                  |«       t        ||j                  d	   |j                  d
   d	|j                  d   d	d¬«      }| j                  j                  |«       |r|d	z  }t        ||j                  d
   |j                  d   d	|j                  d   d|d¬«      }	| j                  j                  |	«       |r|d	z  }t        ||j                  d   |j                  d   d	|j                  d	   d
|d¬«      }
| j                  j                  |
«       y )NFr   Té   r   r   zlayer.0)rI   rJ   rM   rˆ   r5   r   r   zlayer.1zlayer.2)rI   rJ   rM   r¨   rˆ   r5   é   zlayer.3)rI   rJ   rM   r¨   rˆ   rO   r5   é   zlayer.4r9   )
r:   r;   rL   r@   Úoutput_striderƒ   Úneck_hidden_sizesr‡   r  Úhidden_sizes)rK   rL   rR   Údilate_layer_4Údilate_layer_5rO   Úlayer_1Úlayer_2Úlayer_3Úlayer_4Úlayer_5r>   s              €r%   r;   zTFMobileViTEncoder.__init__«  s  ø€ Ü‰ÑÑ"˜6Ò"ØˆŒàˆŒð +0Ð/ˆ˜Ø×Ñ 1Ò$Ø!ˆNØ!‰NØ×!Ñ! RÒ'Ø!ˆNàˆä+ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØØô
ˆð 	�‰×Ñ˜7Ô#ä+ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØØô
ˆð 	�‰×Ñ˜7Ô#ä"ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.ØØô
ˆð 	�‰×Ñ˜7Ô#áØ˜‰MˆHä"ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.ØØØô	
ˆð 	�‰×Ñ˜7Ô#áØ˜‰MˆHä"ØØ×0Ñ0°Ñ3Ø×1Ñ1°!Ñ4ØØ×+Ñ+¨AÑ.ØØØô	
ˆð 	�‰×Ñ˜7Õ#r'   c                ó´   — |rdnd }t        | j                  «      D ]  \  }} |||¬«      }|sŒ||fz   }Œ |st        d„ ||fD «       «      S t        ||¬«      S )Nr9   rU   c              3  ó&   K  — | ]	  }|€Œ|–— Œ y ­wri   r9   )Ú.0Úvs     r%   ú	<genexpr>z*TFMobileViTEncoder.call.<locals>.<genexpr>	  s   è ø€ ÒX˜qÈ!É-œÑXùs   ‚Š)Úlast_hidden_staterº   )Ú	enumerater@   Útupler   )rK   rº   Úoutput_hidden_statesÚreturn_dictrV   Úall_hidden_statesr‰   r�   s           r%   rY   zTFMobileViTEncoder.callù  ss   € ñ #7™B¸DÐä(¨¯©Ó5ò 	I‰OˆAˆ|Ù(¨ÀÔJˆMâ#Ø$5¸Ð8HÑ$HÑ!ð		Iñ ÜÑX ]Ð4EÐ$FÔXÓXÐXä °=ÐPaÔbÐbr'   c                óô   — | j                   ry d| _         t        | dd «      �K| j                  D ];  }t        j                  |j
                  «      5  |j                  d «       d d d «       Œ= y y # 1 sw Y   ŒIxY wr�   r�   r‘   s      r%   r_   zTFMobileViTEncoder.build  r’   r“   ©rL   r   rd   re   )FTF)
rº   rh   rM  rc   rN  rc   rV   rc   rd   zUnion[tuple, TFBaseModelOutput]ri   rj   rn   s   @r%   r6  r6  ª  sU   ø„ õL$ðb &+Ø Øðcà ðcð #ðcð ð	cð
 ðcð 
)óc÷(-r'   r6  c                  ób   ‡ — e Zd ZeZddˆ fd„Zd„ Ze	 	 	 	 d	 	 	 	 	 	 	 	 	 dd„«       Zd	d„Z	ˆ xZ
S )
ÚTFMobileViTMainLayerc                ó€  •— t        ‰| �  di |¤Ž || _        || _        t	        ||j
                  |j                  d   ddd¬«      | _        t        |d¬«      | _	        | j                  r/t	        ||j                  d   |j                  d	   d
d¬«      | _
        t        j                  j                  dd¬«      | _        y )Nr   r   r   Ú	conv_stem)rI   rJ   r/   rM   r5   ÚencoderrÉ   r:  é   r   Úconv_1x1_exprt   Úchannels_firstÚpooler)Údata_formatr5   r9   )r:   r;   rL   Úexpand_outputr)   Únum_channelsr<  rU  r6  rV  rX  r   r@   ÚGlobalAveragePooling2DrZ  )rK   rL   r\  rR   r>   s       €r%   r;   zTFMobileViTMainLayer.__init__  s»   ø€ Ü‰ÑÑ"˜6Ò"ØˆŒØ*ˆÔä-ØØ×+Ñ+Ø×1Ñ1°!Ñ4ØØØô
ˆŒô *¨&°yÔAˆŒà×ÒÜ 4ØØ"×4Ñ4°QÑ7Ø#×5Ñ5°aÑ8ØØ#ô!ˆDÔô —l‘l×9Ñ9ÐFVÐ]eÐ9Ófˆ�r'   c                ó   — t         ‚)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
        rÚ   )rK   Úheads_to_prunes     r%   Ú_prune_headsz!TFMobileViTMainLayer._prune_heads6  s
   € ô
 "Ð!r'   c           	     ó4  — |�|n| j                   j                  }|�|n| j                   j                  }t        j                  |d¬«      }| j                  ||¬«      }| j                  ||||¬«      }| j                  r?| j                  |d   «      }t        j                  |g d¢¬«      }| j                  |«      }n |d   }t        j                  |g d¢¬«      }d }|s[|�||fn|f}	| j                  s>|dd  }
t        |
d   D �cg c]  }t        j                  |d¬«      ‘Œ c}«      }
|
f}
|	|
z   S |	|dd  z   S |r1t        |d   D �cg c]  }t        j                  |d¬«      ‘Œ c}«      }t        |||r¬«      S |j                  ¬«      S c c}w c c}w )	Nr0  r®   rU   ©rM  rN  rV   r   r  r   )rJ  Úpooler_outputrº   )rL   rM  Úuse_return_dictr]   r±   rU  rV  r\  rX  rZ  rL  r   rº   )rK   Úpixel_valuesrM  rN  rV   Úembedding_outputÚencoder_outputsrJ  Úpooled_outputr×   Úremaining_encoder_outputsÚhrº   s                r%   rY   zTFMobileViTMainLayer.call=  sÍ  € ð %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆô
 —|‘| L°|ÔDˆàŸ>™>¨,À˜>ÓJÐàŸ,™,ØÐ3GÐU`Ðksð 'ó 
ˆð ×ÒØ $× 1Ñ 1°/À!Ñ2DÓ EÐô !#§¡Ð->Â\Ô RÐð !ŸK™KÐ(9Ó:‰Mà /°Ñ 2Ðä "§¡Ð->Â\Ô RÐØ ˆMáØ;HÐ;TÐ'¨Ñ7Ð[lÐZnˆFð ×%Ò%Ø,;¸A¸BÐ,?Ð)Ü,1ØAZÐ[\ÑA]Ö^¸A”R—\‘\ !¨,Ö7Ò^ó-Ð)ð .GÐ,HÐ)ØÐ 9Ñ9Ð9à °°Ð 3Ñ3Ð3ñ  Ü!ÈÐ_`ÑOaÖ"bÈ!¤2§<¡<°¸Ö#EÒ"bÓcˆMä+Ø/Ø'Ù+?˜-ô
ð 	
ð FU×EbÑEbô
ð 	
ùò _ùò #cs   ÄFÅ
Fc                ód  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Ot        j                  | j                  j
                  «      5  | j                  j                  g d¢«       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   �ŒxY w# 1 sw Y   ŒÎxY w# 1 sw Y   Œ~xY w# 1 sw Y   y xY w)NTrU  rV  rZ  ©NNNNrX  )
r[   r\   r]   r^   rU  r5   r_   rV  rZ  rX  ra   s     r%   r_   zTFMobileViTMainLayer.build{  sR  € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ä�4˜ DÓ)Ð5Ü—‘˜tŸ|™|×0Ñ0Ó1ñ )Ø—‘×"Ñ" 4Ô(÷)ä�4˜ 4Ó(Ð4Ü—‘˜tŸ{™{×/Ñ/Ó0ñ <Ø—‘×!Ñ!Ò":Ô;÷<ä�4˜¨Ó.Ð:Ü—‘˜t×0Ñ0×5Ñ5Ó6ñ .Ø×!Ñ!×'Ñ'¨Ô-÷.ð .ð ;÷+ñ +ú÷)ð )ú÷<ð <ú÷.ð .ús0   ÁFÂ%FÃ?FÅF&ÆFÆFÆF#Æ&F/©T©rL   r   r\  rc   ©NNNF©
rf  útf.Tensor | NonerM  úOptional[bool]rN  rs  rV   rc   rd   z5Union[Tuple[tf.Tensor], TFBaseModelOutputWithPooling]ri   )r?   rk   rl   r   Úconfig_classr;   ra  r   rY   r_   rm   rn   s   @r%   rS  rS    sk   ø„ à"€Lögò6"ð ð *.Ø/3Ø&*Øð;
à&ð;
ð -ð;
ð $ð	;
ð
 ð;
ð 
?ò;
ó ð;
÷z.r'   rS  c                  ó   — e Zd ZdZeZdZdZy)ÚTFMobileViTPreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    Ú	mobilevitrf  N)r?   rk   rl   r�   r   rt  Úbase_model_prefixÚmain_input_namer9   r'   r%   rv  rv  �  s   „ ñð
 #€LØ#ÐØ$�Or'   rv  a’	  
    This model inherits from [`TFPreTrainedModel`]. Check the superclass documentation for the generic methods the
    library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads
    etc.)

    This model is also a [keras.Model](https://www.tensorflow.org/api_docs/python/tf/keras/Model) subclass. Use it
    as a regular TF 2.0 Keras Model and refer to the TF 2.0 documentation for all matter related to general usage and
    behavior.

    <Tip>

    TensorFlow models and layers in `transformers` accept two formats as input:

    - having all inputs as keyword arguments (like PyTorch models), or
    - having all inputs as a list, tuple or dict in the first positional argument.

    The reason the second format is supported is that Keras methods prefer this format when passing inputs to models
    and layers. Because of this support, when using methods like `model.fit()` things should "just work" for you - just
    pass your inputs and labels in any format that `model.fit()` supports! If, however, you want to use the second
    format outside of Keras methods like `fit()` and `predict()`, such as when creating your own layers or models with
    the Keras `Functional` API, there are three possibilities you can use to gather all the input Tensors in the first
    positional argument:

    - a single Tensor with `pixel_values` only and nothing else: `model(pixel_values)`
    - a list of varying length with one or several input Tensors IN THE ORDER given in the docstring:
    `model([pixel_values, attention_mask])` or `model([pixel_values, attention_mask, token_type_ids])`
    - a dictionary with one or several input Tensors associated to the input names given in the docstring:
    `model({"pixel_values": pixel_values, "token_type_ids": token_type_ids})`

    Note that when creating models and layers with
    [subclassing](https://keras.io/guides/making_new_layers_and_models_via_subclassing/) then you don't need to worry
    about any of this, as you can just pass inputs like you would to any other Python function!

    </Tip>

    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 [`~TFPreTrainedModel.from_pretrained`] method to load the model weights.
aŽ  
    Args:
        pixel_values (`np.ndarray`, `tf.Tensor`, `List[tf.Tensor]`, `Dict[str, tf.Tensor]` or `Dict[str, np.ndarray]` and each example must have the 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. This argument can be used only in eager mode, in graph mode the value in the config will be
            used instead.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. This argument can be used in
            eager mode, in graph mode the value will always be set to True.
zWThe bare MobileViT model outputting raw hidden-states without any specific head on top.c            	      óŽ   ‡ — e Zd Zddˆ fd„Ze ee«       eee	e
de¬«      	 	 	 	 d	 	 	 	 	 	 	 	 	 d	d„«       «       «       Zd
d„Zˆ xZS )ÚTFMobileViTModelc                ón   •— t        ‰| �  |g|¢­i |¤Ž || _        || _        t	        ||d¬«      | _        y )Nrw  ©r\  r5   )r:   r;   rL   r\  rS  rw  )rK   rL   r\  ÚinputsrR   r>   s        €r%   r;   zTFMobileViTModel.__init__Ö  s:   ø€ Ü‰Ñ˜Ð3 &Ò3¨FÒ3ØˆŒØ*ˆÔä-¨fÀMÐXcÔdˆ�r'   Úvision)Ú
checkpointÚoutput_typert  ÚmodalityÚexpected_outputc                ó0   — | j                  ||||¬«      }|S rT   )rw  )rK   rf  rM  rN  rV   r×   s         r%   rY   zTFMobileViTModel.callÝ  s!   € ð  —‘ Ð.BÀKÐZb�ÓcˆØˆr'   c                óú   — | j                   ry d| _         t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   y xY w)NTrw  )r[   r\   r]   r^   rw  r5   r_   ra   s     r%   r_   zTFMobileViTModel.buildð  si   € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ð +ð 8÷+ð +ús   ÁA1Á1A:rn  ro  rp  rq  ri   )r?   rk   rl   r;   r   r   ÚMOBILEVIT_INPUTS_DOCSTRINGr
   Ú_CHECKPOINT_FOR_DOCr   Ú_CONFIG_FOR_DOCÚ_EXPECTED_OUTPUT_SHAPErY   r_   rm   rn   s   @r%   r{  r{  Ñ  s‹   ø„ ö
eð Ù*Ð+EÓFÙØ&Ø0Ø$ØØ.ôð *.Ø/3Ø&*Øðà&ðð -ðð $ð	ð
 ðð 
?òóó 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ˆ fd„Ze ee«       eee	e
e¬«      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„«       «       «       Zdd„Zˆ xZS )	Ú!TFMobileViTForImageClassificationc                óz  •— t        ‰| �  |g|¢­i |¤Ž |j                  | _        t        |d¬«      | _        t
        j                  j                  |j                  «      | _	        |j                  dkD  r+t
        j                  j                  |j                  d¬«      nt        j                  | _        || _        y )Nrw  rÉ   r   Ú
classifier)r:   r;   Ú
num_labelsrS  rw  r   r@   r¥   Úclassifier_dropout_probr§   r£   r]   Úidentityr�  rL   )rK   rL   r~  rR   r>   s       €r%   r;   z*TFMobileViTForImageClassification.__init__  s—   ø€ Ü‰Ñ˜Ð3 &Ò3¨FÒ3à ×+Ñ+ˆŒÜ-¨f¸;ÔGˆŒô —|‘|×+Ñ+¨F×,JÑ,JÓKˆŒàHN×HYÑHYÐ\]ÒH]ŒE�L‰L×Ñ˜v×0Ñ0°|ÐÔDÔce×cnÑcnð 	Œð ˆ�r'   )r€  r�  rt  rƒ  c                óR  — |�|n| j                   j                  }| j                  ||||¬«      }|r|j                  n|d   }| j	                  | j                  ||¬«      «      }|€dn| j                  ||¬«      }	|s|f|dd z   }
|	�|	f|
z   S |
S t        |	||j                  ¬«      S )aƒ  
        labels (`tf.Tensor` 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).
        Nrc  r   rU   )ÚlabelsÚlogitsr   ©Úlossr“  rº   )	rL   re  rw  rd  r�  r§   Úhf_compute_lossr   rº   )rK   rf  rM  r’  rN  rV   Úoutputsri  r“  r•  r×   s              r%   rY   z&TFMobileViTForImageClassification.call  sÇ   € ð, &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà—.‘.ØÐ/CÐQ\Ðgoð !ó 
ˆñ 2=˜×-Ò-À'È!Á*ˆà—‘ §¡¨mÀh Ó!OÓPˆØ�~‰t¨4×+?Ñ+?ÀvÐV\Ð+?Ó+]ˆáØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä5¸4ÈÐ^e×^sÑ^sÔtÐtr'   c                ó(  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �t        | j                  d«      rht        j                  | j                  j
                  «      5  | j                  j                  d d | j                  j                  d   g«       d d d «       y y y # 1 sw Y   Œ–xY w# 1 sw Y   y xY w)NTrw  r�  r5   rª   )r[   r\   r]   r^   rw  r5   r_   r`   r�  rL   r<  ra   s     r%   r_   z'TFMobileViTForImageClassification.build5  sä   € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ä�4˜ tÓ,Ð8Ü�t—‘¨Ô/Ü—]‘] 4§?¡?×#7Ñ#7Ó8ñ [Ø—O‘O×)Ñ)¨4°°t·{±{×7TÑ7TÐUWÑ7XÐ*YÔZ÷[ð [ð 0ð 9÷+ð +ú÷[ð [ús   ÁC<Â;6DÃ<DÄDrQ  ©NNNNF)rf  rr  rM  rs  r’  rr  rN  rs  rV   rs  rd   z4Union[tuple, TFImageClassifierOutputWithNoAttention]ri   )r?   rk   rl   r;   r   r   r†  r
   Ú_IMAGE_CLASS_CHECKPOINTr   rˆ  Ú_IMAGE_CLASS_EXPECTED_OUTPUTrY   r_   rm   rn   s   @r%   r‹  r‹  ù  s�   ø„ õð Ù*Ð+EÓFÙØ*Ø:Ø$Ø4ô	ð *.Ø/3Ø#'Ø&*Ø#(ðuà&ðuð -ðuð !ð	uð
 $ðuð !ðuð 
>òuóó Gó ðu÷>
[r'   r‹  c                  ó2   ‡ — e Zd Zdˆ fd„Zddd„Zdd„Zˆ xZS )ÚTFMobileViTASPPPoolingc           
     ó    •— t        ‰| �  di |¤Ž t        j                  j	                  dd¬«      | _        t        |||ddddd¬«      | _        y )	NTÚglobal_pool)Úkeepdimsr5   r   Úrelur  )rI   rJ   r/   rM   rP   rQ   r5   r9   )r:   r;   r   r@   r^  rŸ  r)   r  )rK   rL   rI   rJ   rR   r>   s        €r%   r;   zTFMobileViTASPPPooling.__init__C  sT   ø€ Ü‰ÑÑ"˜6Ò"ä Ÿ<™<×>Ñ>ÈÐS`Ð>ÓaˆÔä,ØØ#Ø%ØØØ"Ø!Øô	
ˆ�r'   c                ó®   — t        |«      dd }| j                  |«      }| j                  ||¬«      }t        j                  j                  ||d¬«      }|S )Nr   rª   rU   r  r  )r   rŸ  r  r]   r#  r$  )rK   rW   rV   Úspatial_sizes       r%   rY   zTFMobileViTASPPPooling.callS  sR   € Ü! (Ó+¨A¨bÐ1ˆØ×#Ñ# HÓ-ˆØ—=‘= °H�=Ó=ˆÜ—8‘8—?‘? 8°,Àz�?ÓRˆØˆr'   c                óÊ  — | j                   ry d| _         t        | dd «      �Ot        j                  | j                  j
                  «      5  | j                  j                  g d¢«       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   ŒexY w# 1 sw Y   y xY w)NTrŸ  rm  r  )r[   r\   r]   r^   rŸ  r5   r_   r  ra   s     r%   r_   zTFMobileViTASPPPooling.buildZ  s¾   € Ø�:Š:ØØˆŒ
Ü�4˜¨Ó-Ð9Ü—‘˜t×/Ñ/×4Ñ4Ó5ñ AØ× Ñ ×&Ñ&Ò'?Ô@÷Aä�4˜ TÓ*Ð6Ü—‘˜tŸ}™}×1Ñ1Ó2ñ *Ø—‘×#Ñ# DÔ)÷*ð *ð 7÷Að Aú÷*ð *ús   ÁCÂ'CÃCÃC")rL   r   rI   r    rJ   r    rd   re   rf   rg   ri   rj   rn   s   @r%   r�  r�  B  s   ø„ õ
ô ÷	*r'   r�  c                  ó6   ‡ — e Zd ZdZdˆ fd„Zddd„Zdd„Zˆ xZS )	ÚTFMobileViTASPPzs
    ASPP module defined in DeepLab papers: https://arxiv.org/abs/1606.00915, https://arxiv.org/abs/1706.05587
    c                óÔ  •— t        ‰	| �  di |¤Ž |j                  d   }|j                  }t	        |j
                  «      dk7  rt        d«      ‚g | _        t        |||ddd¬«      }| j                  j                  |«       | j                  j                  t        |j
                  «      D ��cg c]  \  }}t        |||d|dd|dz   › �¬	«      ‘Œ c}}«       t        |||dt	        |j
                  «      dz   › �¬
«      }| j                  j                  |«       t        |d|z  |ddd¬«      | _        t        j                  j!                  |j"                  «      | _        y c c}}w )Néþÿÿÿr   z"Expected 3 values for atrous_ratesr   r¡  zconvs.0rw   zconvs.)rI   rJ   r/   rO   rQ   r5   rÉ   r:  Úprojectr9   )r:   r;   r<  Úaspp_out_channelsÚlenÚatrous_ratesrB   Úconvsr)   r‡   ÚextendrK  r�  r©  r   r@   r¥   Úaspp_dropout_probr§   )
rK   rL   rR   rI   rJ   Úin_projectionr‰   ÚrateÚ
pool_layerr>   s
            €r%   r;   zTFMobileViTASPP.__init__k  sl  ø€ Ü‰ÑÑ"˜6Ò"à×.Ñ.¨rÑ2ˆØ×/Ñ/ˆäˆv×"Ñ"Ó# qÒ(ÜÐAÓBÐBàˆŒ
ä,ØØ#Ø%ØØ!Øô
ˆð 	�
‰
×Ñ˜-Ô(à�
‰
×Ñô  )¨×)<Ñ)<Ó=÷ñ �A�tô %ØØ +Ø!-Ø !Ø!Ø#)Ø! ! a¡% Ð)öóô	
ô ,Ø�K °f¼SÀ×ATÑATÓ=UÐXYÑ=YÐ<ZÐ4[ô
ˆ
ð 	�
‰
×Ñ˜*Ô%ä+ØØ˜LÑ(Ø%ØØ!Øô
ˆŒô —|‘|×+Ñ+¨F×,DÑ,DÓEˆ�ùó9s   Â/"E$
c                ó
  — t        j                  |g d¢¬«      }g }| j                  D ]  }|j                   |||¬«      «       Œ t        j                  |d¬«      }| j                  ||¬«      }| j                  ||¬«      }|S )Nr0  r®   rU   rª   r·   )r]   r±   r­  r‡   r3  r©  r§   )rK   rW   rV   ÚpyramidÚconvÚpooled_featuress         r%   rY   zTFMobileViTASPP.callŸ  sy   € ô —<‘< ª|Ô<ˆØˆØ—J‘Jò 	>ˆDØ�N‰N™4 °8Ô<Õ=ð	>ä—)‘)˜G¨"Ô-ˆàŸ,™, w¸˜,ÓBˆØŸ,™, À˜,ÓJˆØÐr'   c                óÀ  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �K| j                  D ];  }t        j                  |j
                  «      5  |j                  d «       d d d «       Œ= y y # 1 sw Y   ŒbxY w# 1 sw Y   ŒUxY w)NTr©  r­  )r[   r\   r]   r^   r©  r5   r_   r­  )rK   rb   rµ  s      r%   r_   zTFMobileViTASPP.build¬  s¼   € Ø�:Š:ØØˆŒ
Ü�4˜ DÓ)Ð5Ü—‘˜tŸ|™|×0Ñ0Ó1ñ )Ø—‘×"Ñ" 4Ô(÷)ä�4˜ $Ó'Ð3ØŸ
™
ò %�Ü—]‘] 4§9¡9Ó-ñ %Ø—J‘J˜tÔ$÷%ð %ñ%ð 4÷)ð )ú÷%ð %ús   ÁCÂ*CÃCÃC	rQ  rf   rg   ri   r€   rn   s   @r%   r¦  r¦  f  s   ø„ ñõ2Fôh÷
%r'   r¦  c                  ó6   ‡ — e Zd ZdZdˆ fd„Zddd„Zdd„Zˆ xZS )	ÚTFMobileViTDeepLabV3zB
    DeepLabv3 architecture: https://arxiv.org/abs/1706.05587
    c           
     óü   •— t        ‰| �  di |¤Ž t        |d¬«      | _        t        j
                  j                  |j                  «      | _        t        ||j                  |j                  ddddd¬«      | _        y )	NÚaspprÉ   r   FTr�  )rI   rJ   r/   rP   rQ   rN   r5   r9   )r:   r;   r¦  r»  r   r@   r¥   r�  r§   r)   rª  rŽ  r�  ©rK   rL   rR   r>   s      €r%   r;   zTFMobileViTDeepLabV3.__init__¾  sm   ø€ Ü‰ÑÑ"˜6Ò"Ü# F°Ô8ˆŒ	ä—|‘|×+Ñ+¨F×,JÑ,JÓKˆŒä.ØØ×0Ñ0Ø×*Ñ*ØØ#Ø ØØô	
ˆ�r'   c                ó~   — | j                  |d   |¬«      }| j                  ||¬«      }| j                  ||¬«      }|S )Nrª   rU   )r»  r§   r�  )rK   rº   rV   rW   s       r%   rY   zTFMobileViTDeepLabV3.callÏ  sB   € Ø—9‘9˜]¨2Ñ.¸�9ÓBˆØ—<‘< °8�<Ó<ˆØ—?‘? 8°h�?Ó?ˆØˆr'   c                óÆ  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   ŒexY w# 1 sw Y   y xY w)NTr»  r�  )r[   r\   r]   r^   r»  r5   r_   r�  ra   s     r%   r_   zTFMobileViTDeepLabV3.buildÕ  s±   € Ø�:Š:ØØˆŒ
Ü�4˜ Ó&Ð2Ü—‘˜tŸy™yŸ~™~Ó.ñ &Ø—	‘	—‘ Ô%÷&ä�4˜ tÓ,Ð8Ü—‘˜tŸ™×3Ñ3Ó4ñ ,Ø—‘×%Ñ% dÔ+÷,ð ,ð 9÷&ð &ú÷,ð ,úrâ   rQ  rf   rÃ   ri   r€   rn   s   @r%   r¹  r¹  ¹  s   ø„ ñõ
ô"÷	,r'   r¹  zX
    MobileViT model with a semantic segmentation head on top, e.g. for Pascal VOC.
    c                  ó’   ‡ — e Zd Zdˆ fd„Zd„ Ze ee«       ee	e
¬«      	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„«       «       «       Zd	d„Zˆ xZS )
Ú"TFMobileViTForSemanticSegmentationc                ó’   •— t        ‰| �  |fi |¤Ž |j                  | _        t        |dd¬«      | _        t        |d¬«      | _        y )NFrw  r}  Úsegmentation_headrÉ   )r:   r;   rŽ  rS  rw  r¹  rÂ  r¼  s      €r%   r;   z+TFMobileViTForSemanticSegmentation.__init__è  sC   ø€ Ü‰Ñ˜Ñ* 6Ò*à ×+Ñ+ˆŒÜ-¨fÀEÐP[Ô\ˆŒÜ!5°fÐCVÔ!WˆÕr'   c                óÆ   ‡ ‡— t        |«      dd  }t        j                  j                  ||d¬«      }t        j
                  j                  dd¬«      Šˆˆ fd„} |||«      S )Nr   r  r  TÚnone)Úfrom_logitsÚ	reductionc                ó  •—  ‰| |«      }t        j                  | ‰j                  j                  k7  |j                  ¬«      }||z  }t        j
                  |«      t        j
                  |«      z  }t        j                  |d«      S )Nr—   r   )r]   rž   rL   Úsemantic_loss_ignore_indexr˜   Ú
reduce_sumr°   )ÚrealÚpredÚunmasked_lossÚmaskÚmasked_lossÚreduced_masked_lossÚloss_fctrK   s         €€r%   rÎ  zGTFMobileViTForSemanticSegmentation.hf_compute_loss.<locals>.masked_lossø  sp   ø€ Ù$ T¨4Ó0ˆMÜ—7‘7˜4 4§;¡;×#IÑ#IÑIÐQ^×QdÑQdÔeˆDØ'¨$Ñ.ˆKô #%§-¡-°Ó"<¼r¿}¹}ÈTÓ?RÑ"RÐÜ—:‘:Ð1°4Ó8Ð8r'   )r   r]   r#  r$  r   ÚlossesÚSparseCategoricalCrossentropy)rK   r“  r’  Úlabel_interp_shapeÚupsampled_logitsrÎ  rÐ  s   `     @r%   r–  z2TFMobileViTForSemanticSegmentation.hf_compute_lossï  sa   ù€ ô (¨Ó/°°Ð3ÐäŸ8™8Ÿ?™?¨6Ð8JÐS]˜?Ó^Ðä—<‘<×=Ñ=È$ÐZ`Ð=Óaˆõ	9ñ ˜6Ð#3Ó4Ð4r'   )r�  rt  c                ó  — |�|n| j                   j                  }|�|n| j                   j                  }|�$| j                   j                  dkD  st	        d«      ‚| j                  |d||¬«      }|r|j                  n|d   }| j                  ||¬«      }d}	|�| j                  ||¬«      }	t        j                  |g d¢¬	«      }|s|r
|f|dd z   }
n	|f|d
d z   }
|	�|	f|
z   S |
S t        |	||r|j                  ¬«      S d¬«      S )aK  
        labels (`tf.Tensor` 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
        >>> from transformers import AutoImageProcessor, TFMobileViTForSemanticSegmentation
        >>> from PIL import Image
        >>> import requests

        >>> 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 = TFMobileViTForSemanticSegmentation.from_pretrained("apple/deeplabv3-mobilevit-small")

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

        >>> 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 oneTrc  rU   )r“  r’  r  r®   r   r”  )rL   rM  re  rŽ  rB   rw  rº   rÂ  r–  r]   r±   r   )rK   rf  r’  rM  rN  rV   r—  Úencoder_hidden_statesr“  r•  r×   s              r%   rY   z'TFMobileViTForSemanticSegmentation.call  sI  € ðN %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐ d§k¡k×&<Ñ&<¸qÒ&@ÜÐNÓOÐOà—.‘.ØØ!%Ø#Øð	 !ó 
ˆñ :E × 5Ò 5È'ÐRSÉ*Ðà×'Ñ'Ð(=ÈÐ'ÓQˆàˆØÐØ×'Ñ'¨v¸fÐ'ÓEˆDô —‘˜fª<Ô8ˆáÙ#Ø ˜ W¨Q¨R [Ñ0‘à ˜ W¨Q¨R [Ñ0�Ø)-Ð)9�T�G˜fÑ$ÐE¸vÐEä7ØØÙ3G˜'×/Ñ/ô
ð 	
ð NRô
ð 	
r'   c                óÆ  — | j                   ry d| _         t        | dd «      �Mt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       t        | dd «      �Nt        j                  | j                  j
                  «      5  | j                  j                  d «       d d d «       y y # 1 sw Y   ŒexY w# 1 sw Y   y xY w)NTrw  rÂ  )r[   r\   r]   r^   rw  r5   r_   rÂ  ra   s     r%   r_   z(TFMobileViTForSemanticSegmentation.buildQ  s»   € Ø�:Š:ØØˆŒ
Ü�4˜ dÓ+Ð7Ü—‘˜tŸ~™~×2Ñ2Ó3ñ +Ø—‘×$Ñ$ TÔ*÷+ä�4Ð,¨dÓ3Ð?Ü—‘˜t×5Ñ5×:Ñ:Ó;ñ 3Ø×&Ñ&×,Ñ,¨TÔ2÷3ð 3ð @÷+ð +ú÷3ð 3úrâ   rQ  r™  )rf  rr  r’  rr  rM  rs  rN  rs  rV   rc   rd   z6Union[tuple, TFSemanticSegmenterOutputWithNoAttention]ri   )r?   rk   rl   r;   r–  r   r   r†  r   r   rˆ  rY   r_   rm   rn   s   @r%   rÀ  rÀ  á  s�   ø„ õXò5ð( Ù*Ð+EÓFÙÐ+SÐbqÔrð *.Ø#'Ø/3Ø&*ØðI
à&ðI
ð !ðI
ð -ð	I
ð
 $ðI
ð ðI
ð 
@òI
ó só Gó ðI
÷V	3r'   rÀ  )r‹  rÀ  r{  rv  )r   N)r!   r    r"   r    r#   zOptional[int]rd   r    )Er�   Ú
__future__r   Útypingr   r   r   r   Ú
tensorflowr]   Úactivations_tfr	   Ú
file_utilsr
   r   r   r   Úmodeling_tf_outputsr   r   r   r   Úmodeling_tf_utilsr   r   r   r   r   Útf_utilsr   r   Úutilsr   Úconfiguration_mobilevitr   Ú
get_loggerr?   r<   rˆ  r‡  r‰  rš  r›  r&   r@   ÚLayerr)   rp   rƒ   r•   rÅ   rÔ   rä   rí   ró   r   r  r6  rS  rv  ÚMOBILEVIT_START_DOCSTRINGr†  r{  r‹  r�  r¦  r¹  rÀ  Ú__all__r9   r'   r%   ú<module>ræ     s¿  ðñ" &å "ç /Ó /ã å /÷ó ÷ó ÷õ ÷ 3Ý Ý 4ð 
ˆ×	Ñ	˜HÓ	%€ð $€ð .Ð Ú'Ð ð 2Ð Ø1Ð ôôJT˜5Ÿ<™<×-Ñ-ô JTôZ=, %§,¡,×"4Ñ"4ô =,ô@$- §¡× 2Ñ 2ô $-ôN@A˜uŸ|™|×1Ñ1ô @AôFA˜EŸL™L×.Ñ.ô Aô*.˜5Ÿ<™<×-Ñ-ô .ô4A˜eŸl™l×0Ñ0ô Aô0G˜Ÿ™×*Ñ*ô Gô,%K %§,¡,×"4Ñ"4ô %KôP-˜UŸ\™\×/Ñ/ô -ô:4�u—|‘|×)Ñ)ô 4ôDj-˜Ÿ™×+Ñ+ô j-ðZ ôr.˜5Ÿ<™<×-Ñ-ó r.ó ðr.ôj%Ð!2ô %ð'Ð ðRÐ ñ  Ø]Øóô!+Ð1ó !+ó	ð!+ñH ðð óô?[Ð(BÐD`ó ?[óð?[ôD!*˜UŸ\™\×/Ñ/ô !*ôHP%�e—l‘l×(Ñ(ô P%ôf%,˜5Ÿ<™<×-Ñ-ô %,ñP ðð ó	ôs3Ð)Có s3óðs3òl�r'   