Ë
    Dêñi($  ã                   óÀ  — d dl mZ d dlmZmZmZ d dlZd dlmZmZ d dl	m
Z
mZ ddlmZmZ ddlmZ d	d
lmZmZmZ d	dlmZ d	dlmZmZ d	dlmZmZmZmZmZ ddl m!Z!m"Z" g d¢Z# G d„ de«      Z$ G d„ de«      Z% G d„ de«      Z&de'e   de(dee   de)de)dede&fd„Z* G d„ d e«      Z+ ed!¬"«       ed#d$„ f¬%«      dd&d'd(œdeee+ef      de)de)dede&f
d)„«       «       Z,y)*é    )Úpartial)ÚAnyÚOptionalÚUnionN)ÚnnÚTensor)ÚDeQuantStubÚ	QuantStubé   )ÚConv2dNormActivationÚSqueezeExcitation)ÚImageClassificationé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interface)Ú_mobilenet_v3_confÚInvertedResidualÚInvertedResidualConfigÚMobileNet_V3_Large_WeightsÚMobileNetV3é   )Ú_fuse_modulesÚ_replace_relu)ÚQuantizableMobileNetV3Ú#MobileNet_V3_Large_QuantizedWeightsÚmobilenet_v3_largec                   ób   ‡ — e Zd ZdZdededdfˆ fd„Zdedefd„Zdd	ee	   ddfd
„Z
ˆ fd„Zˆ xZS )ÚQuantizableSqueezeExcitationr   ÚargsÚkwargsÚreturnNc                 ó�   •— t         j                  |d<   t        ‰| �  |i |¤Ž t         j                  j                  «       | _        y )NÚscale_activation)r   ÚHardsigmoidÚsuperÚ__init__Ú	quantizedÚFloatFunctionalÚskip_mul©Úselfr#   r$   Ú	__class__s      €úm/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/torchvision/models/quantization/mobilenetv3.pyr*   z%QuantizableSqueezeExcitation.__init__!   s8   ø€ Ü%'§^¡^ˆÐ!Ñ"Ü‰Ñ˜$Ð) &Ò)ÜŸ™×4Ñ4Ó6ˆ�ó    Úinputc                 óX   — | j                   j                  | j                  |«      |«      S ©N)r-   ÚmulÚ_scale)r/   r3   s     r1   Úforwardz$QuantizableSqueezeExcitation.forward&   s"   € Ø�}‰}× Ñ  §¡¨UÓ!3°UÓ;Ð;r2   Úis_qatc                 ó&   — t        | ddg|d¬«       y )NÚfc1Ú
activationT©Úinplace)r   )r/   r9   s     r1   Ú
fuse_modelz'QuantizableSqueezeExcitation.fuse_model)   s   € Ü�d˜U LÐ1°6À4ÖHr2   c           	      ó
  •— |j                  dd «      }t        | d«      rÏ|�|dk  rÈt        j                  dg«      t        j                  dg«      t        j                  dgt        j                  ¬«      t        j                  dgt        j                  ¬«      t        j                  dg«      t        j                  dg«      dœ}	|	j                  «       D ]  \  }
}||
z   }||vsŒ|||<   Œ t        ‰| �  |||||||«       y )	NÚversionÚqconfigr   g      ð?r   )Údtyper   )z.scale_activation.activation_post_process.scalezFscale_activation.activation_post_process.activation_post_process.scalez3scale_activation.activation_post_process.zero_pointzKscale_activation.activation_post_process.activation_post_process.zero_pointz;scale_activation.activation_post_process.fake_quant_enabledz9scale_activation.activation_post_process.observer_enabled)ÚgetÚhasattrÚtorchÚtensorÚint32Úitemsr)   Ú_load_from_state_dict)r/   Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsrA   Údefault_state_dictÚkÚvÚfull_keyr0   s                €r1   rJ   z2QuantizableSqueezeExcitation._load_from_state_dict,   s  ø€ ð !×$Ñ$ Y°Ó5ˆä�4˜Ô#¨¨¸GÀaºKäBGÇ,Á,ÐPSÈuÓBUÜZ_×ZfÑZfÐhkÐglÓZmÜGLÇ|Á|ÐUVÐTWÔ_d×_jÑ_jÔGkÜ_d×_kÑ_kØ�CœuŸ{™{ô`ô PUÏ|É|Ð]^Ð\_ÓO`ÜMRÏ\É\Ð[\ÐZ]ÓM^ñ	"Ðð +×0Ñ0Ó2ò -‘��1Ø! A™:�Ø :Ò-Ø+,�J˜xÒ(ð-ô
 	‰Ñ%ØØØØØØØõ	
r2   r5   )Ú__name__Ú
__module__Ú__qualname__Ú_versionr   r*   r   r8   r   Úboolr?   rJ   Ú__classcell__©r0   s   @r1   r"   r"      sY   ø„ Ø€Hð7˜cð 7¨Sð 7°Tõ 7ð
<˜Vð <¨ó <ñI ¨$¡ð I¸4ó I÷$
ð $
r2   r"   c                   ó<   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zˆ xZS )ÚQuantizableInvertedResidualr#   r$   r%   Nc                 óv   •— t        ‰| �  |dt        i|¤Ž t        j                  j                  «       | _        y )NÚse_layer)r)   r*   r"   r   r+   r,   Úskip_addr.   s      €r1   r*   z$QuantizableInvertedResidual.__init__U   s/   ø€ Ü‰Ñ˜$ÐPÔ)EÐPÈÒPÜŸ™×4Ñ4Ó6ˆ�r2   Úxc                 ó’   — | j                   r+| j                  j                  || j                  |«      «      S | j                  |«      S r5   )Úuse_res_connectra   ÚaddÚblock©r/   rb   s     r1   r8   z#QuantizableInvertedResidual.forwardY   s8   € Ø×ÒØ—=‘=×$Ñ$ Q¨¯
©
°1«Ó6Ð6à—:‘:˜a“=Ð r2   )rV   rW   rX   r   r*   r   r8   r[   r\   s   @r1   r^   r^   S   s0   ø„ ð7˜cð 7¨Sð 7°Tõ 7ð!˜ð ! F÷ !r2   r^   c                   óT   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zd
dee   ddfd	„Z	ˆ xZ
S )r   r#   r$   r%   Nc                 ó`   •— t        ‰| �  |i |¤Ž t        «       | _        t	        «       | _        y)zq
        MobileNet V3 main class

        Args:
           Inherits args from floating point MobileNetV3
        N)r)   r*   r
   Úquantr	   Údequantr.   s      €r1   r*   zQuantizableMobileNetV3.__init__a   s)   ø€ ô 	‰Ñ˜$Ð) &Ò)Ü“[ˆŒ
Ü"“}ˆ�r2   rb   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r5   )rj   Ú_forward_implrk   rg   s     r1   r8   zQuantizableMobileNetV3.forwardl   s1   € Ø�J‰J�q‹MˆØ×Ñ˜qÓ!ˆØ�L‰L˜‹OˆØˆr2   r9   c                 ó8  — | j                  «       D ]‡  }t        |«      t        u rQddg}t        |«      dk(  r/t        |d   «      t        j
                  u r|j                  d«       t        |||d¬«       Œet        |«      t        u sŒw|j                  |«       Œ‰ y )NÚ0Ú1r   r   Ú2Tr=   )
ÚmodulesÚtyper   Úlenr   ÚReLUÚappendr   r"   r?   )r/   r9   ÚmÚmodules_to_fuses       r1   r?   z!QuantizableMobileNetV3.fuse_modelr   s€   € Ø—‘“ò 	%ˆAÜ�A‹wÔ.Ñ.Ø#&¨ *�Ü�q“6˜Q’;¤4¨¨!©£:´·±Ñ#8Ø#×*Ñ*¨3Ô/Ü˜a °&À$ÖGÜ�a“Ô8Ò8Ø—‘˜VÕ$ñ	%r2   r5   )rV   rW   rX   r   r*   r   r8   r   rZ   r?   r[   r\   s   @r1   r   r   `   sG   ø„ ð	%˜cð 	%¨Sð 	%°Tõ 	%ð˜ð  Fó ñ% ¨$¡ð %¸4÷ %r2   r   Úinverted_residual_settingÚlast_channelÚweightsÚprogressÚquantizer$   r%   c                 óœ  — |�Kt        |dt        |j                  d   «      «       d|j                  v rt        |d|j                  d   «       |j                  dd«      }t	        | |fdt
        i|¤Ž}t        |«       |rk|j                  d¬«       t        j                  j                  j                  |«      |_        t        j                  j                  j                  |d¬«       |�"|j                  |j                  |d¬	«      «       |r;t        j                  j                  j!                  |d¬«       |j#                  «        |S )
NÚnum_classesÚ
categoriesÚbackendÚqnnpackrf   T)r9   r=   )r|   Ú
check_hash)r   rt   ÚmetaÚpopr   r^   r   r?   rF   ÚaoÚquantizationÚget_default_qat_qconfigrB   Úprepare_qatÚload_state_dictÚget_state_dictÚconvertÚeval)ry   rz   r{   r|   r}   r$   r�   Úmodels           r1   Ú_mobilenet_v3_modelr�   }   s  € ð ÐÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUØ˜Ÿ™Ñ$Ü! &¨)°W·\±\À)Ñ5LÔMØ�j‰j˜ IÓ.€Gä"Ð#<¸lÑxÔRmÐxÐqwÑx€EÜ�%Ôáð
 	×Ñ ÐÔ%ÜŸ™×-Ñ-×EÑEÀgÓNˆŒÜ�‰×Ñ×)Ñ)¨%¸Ð)Ô>àÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYáÜ�‰×Ñ×%Ñ% e°TÐ%Ô:Ø�
‰
Œà€Lr2   c                   ój   — e Zd Z ed eed¬«      ddeddej                  dd	d
dœiddddœ
¬«      Z	e	Z
y)r   zUhttps://download.pytorch.org/models/quantized/mobilenet_v3_large_qnnpack-5bcacf28.pthéà   )Ú	crop_sizeiªS )r   r   r‚   zUhttps://github.com/pytorch/vision/tree/main/references/classification#qat-mobilenetv3zImageNet-1KgÇK7‰A@R@gôýÔxé¶V@)zacc@1zacc@5g-²�ï§ÆË?gçû©ñÒ�5@z«
                These weights were produced by doing Quantization Aware Training (eager mode) on top of the unquantized
                weights listed below.
            )
Ú
num_paramsÚmin_sizer€   r�   ÚrecipeÚunquantizedÚ_metricsÚ_opsÚ
_file_sizeÚ_docs)ÚurlÚ
transformsr„   N)rV   rW   rX   r   r   r   r   r   ÚIMAGENET1K_V1ÚIMAGENET1K_QNNPACK_V1ÚDEFAULT© r2   r1   r   r   ¡   s_   „ Ù#ØcÙÐ.¸#Ô>à!ØØ.Ø ØmØ5×CÑCàØ#Ø#ñ ðð Ø ðñ
ôÐð0 $�Gr2   r   Úquantized_mobilenet_v3_large)ÚnameÚ
pretrainedc                 óf   — | j                  dd«      rt        j                  S t        j                  S )Nr}   F)rD   r   rž   r   r�   )r$   s    r1   ú<lambda>r¥   Á   s0   € à�z‰z˜* eÔ,ô 0×EÑEð ô ,×9Ñ9ð r2   )r{   TF)r{   r|   r}   c                 óx   — |rt         nt        j                  | «      } t        di |¤Ž\  }}t	        ||| ||fi |¤ŽS )aÔ  
    MobileNetV3 (Large) model from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`_.

    .. note::
        Note that ``quantize = True`` returns a quantized model with 8 bit
        weights. Quantized models only support inference and run on CPUs.
        GPU inference is not yet supported.

    Args:
        weights (:class:`~torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights` or :class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool): If True, displays a progress bar of the
            download to stderr. Default is True.
        quantize (bool): If True, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights
        :members:
    .. autoclass:: torchvision.models.MobileNet_V3_Large_Weights
        :members:
        :noindex:
    )r    )r   r   Úverifyr   r�   )r{   r|   r}   r$   ry   rz   s         r1   r    r    ½   sL   € ñ^ 7?Õ2ÔD^×fÑfÐgnÓo€Gä.@Ñ.`ÐY_Ñ.`Ñ+Ð˜|ÜÐ8¸,ÈÐQYÐ[cÑnÐgmÑnÐnr2   )-Ú	functoolsr   Útypingr   r   r   rF   r   r   Útorch.ao.quantizationr	   r
   Úops.miscr   r   Útransforms._presetsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Úmobilenetv3r   r   r   r   r   Úutilsr   r   Ú__all__r"   r^   r   ÚlistÚintrZ   r�   r   r    r    r2   r1   ú<module>rµ      sN  ðÝ ß 'Ñ 'ã ß ß 8ç ?Ý 6ß 7Ñ 7Ý (ß C÷õ ÷ 0ò€ô2
Ð#4ô 2
ôj
!Ð"2ô 
!ô%˜[ô %ð:!Ø#Ð$:Ñ;ð!àð!ð �kÑ"ð!ð ð	!ð
 ð!ð ð!ð ó!ôH$¨+ô $ñ8 Ð3Ô4Ùàñ	
ðô	ð aeØØò	'oà�eÐ?ÐA[Ð[Ñ\Ñ]ð'oð ð'oð ð	'oð
 ð'oð ò'oó	ó 5ñ'or2   