Ë
    þÍ:jnB  ã                   ób  — d dl mZ d dlmZmZmZ d dlZd dlmZ d dlm	Z	 d dl
mZ ddlmZ dd	lmZ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 ddlmZmZmZ g d¢Z G d„ dej@                  «      Z! G d„ dejD                  «      Z#de$e%   de$e%   dee   de&de&dede#fd„Z'dedddd œZ( G d!„ d"e«      Z) G d#„ d$e«      Z* G d%„ d&e«      Z+ G d'„ d(e«      Z, ed)¬*«       ed+d,„ f¬-«      dd.d/d0œdeee)ef      de&de&dede#f
d1„«       «       Z- ed2¬*«       ed+d3„ f¬-«      dd.d/d0œdeee*ef      de&de&dede#f
d4„«       «       Z. ed5¬*«       ed+d6„ f¬-«      dd.d/d0œdeee+ef      de&de&dede#f
d7„«       «       Z/ ed8¬*«       ed+d9„ f¬-«      dd.d/d0œdeee,ef      de&de&dede#f
d:„«       «       Z0y);é    )Úpartial)ÚAnyÚOptionalÚUnionN)ÚTensor)Úshufflenetv2é   )ÚImageClassificationé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interface)ÚShuffleNet_V2_X0_5_WeightsÚShuffleNet_V2_X1_0_WeightsÚShuffleNet_V2_X1_5_WeightsÚShuffleNet_V2_X2_0_Weightsé   )Ú_fuse_modulesÚ_replace_reluÚquantize_model)	ÚQuantizableShuffleNetV2Ú#ShuffleNet_V2_X0_5_QuantizedWeightsÚ#ShuffleNet_V2_X1_0_QuantizedWeightsÚ#ShuffleNet_V2_X1_5_QuantizedWeightsÚ#ShuffleNet_V2_X2_0_QuantizedWeightsÚshufflenet_v2_x0_5Úshufflenet_v2_x1_0Úshufflenet_v2_x1_5Úshufflenet_v2_x2_0c                   ó<   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zˆ xZS )ÚQuantizableInvertedResidualÚargsÚkwargsÚreturnNc                 ój   •— t        ‰| �  |i |¤Ž t        j                  j	                  «       | _        y ©N)ÚsuperÚ__init__ÚnnÚ	quantizedÚFloatFunctionalÚcat©Úselfr%   r&   Ú	__class__s      €ú�/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/models/quantization/shufflenetv2.pyr+   z$QuantizableInvertedResidual.__init__$   s)   ø€ Ü‰Ñ˜$Ð) &Ò)Ü—<‘<×/Ñ/Ó1ˆ�ó    Úxc                 óT  — | j                   dk(  rE|j                  dd¬«      \  }}| j                  j                  || j                  |«      gd¬«      }n=| j                  j                  | j	                  |«      | j                  |«      gd¬«      }t        j                  |d«      }|S )Nr   r   )Údim)ÚstrideÚchunkr/   Úbranch2Úbranch1r   Úchannel_shuffle)r1   r5   Úx1Úx2Úouts        r3   Úforwardz#QuantizableInvertedResidual.forward(   sŠ   € Ø�;‰;˜!ÒØ—W‘W˜Q A�WÓ&‰FˆB�Ø—(‘(—,‘,  D§L¡L°Ó$4Ð5¸1�,Ó=‰Cà—(‘(—,‘, §¡¨Q£°·±¸a³ÐAÀq�,ÓIˆCä×*Ñ*¨3°Ó2ˆàˆ
r4   )Ú__name__Ú
__module__Ú__qualname__r   r+   r   r@   Ú__classcell__©r2   s   @r3   r$   r$   #   s0   ø„ ð2˜cð 2¨Sð 2°Tõ 2ð	˜ð 	 F÷ 	r4   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        ‰| �  |dt        i|¤Ž t        j                  j
                  j                  «       | _        t        j                  j
                  j                  «       | _	        y )NÚinverted_residual)
r*   r+   r$   ÚtorchÚaoÚquantizationÚ	QuantStubÚquantÚDeQuantStubÚdequantr0   s      €r3   r+   z QuantizableShuffleNetV2.__init__6   sP   ø€ Ü‰Ñ˜$ÐXÔ2MÐXÐQWÒXÜ—X‘X×*Ñ*×4Ñ4Ó6ˆŒ
Ü—x‘x×,Ñ,×8Ñ8Ó:ˆ�r4   r5   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r)   )rM   Ú_forward_implrO   )r1   r5   s     r3   r@   zQuantizableShuffleNetV2.forward;   s1   € Ø�J‰J�q‹MˆØ×Ñ˜qÓ!ˆØ�L‰L˜‹OˆØˆr4   Úis_qatc                 ó¬  — | j                   j                  «       D ]  \  }}|dv sŒ|€Œt        |g d¢g|d¬«       Œ! | j                  «       D ]…  }t	        |«      t
        u sŒt        |j                  j                   j                  «       «      dkD  rt        |j                  ddgg d	¢g|d¬«       t        |j                  g d¢d
dgg d¢g|d¬«       Œ‡ y)aB  Fuse conv/bn/relu modules in shufflenetv2 model

        Fuse conv+bn+relu/ conv+relu/conv+bn modules to prepare for quantization.
        Model is modified in place.

        .. note::
            Note that this operation does not change numerics
            and the model after modification is in floating point
        )Úconv1Úconv5N)Ú0Ú1Ú2T)Úinplacer   rV   rW   )rX   Ú3Ú4rZ   r[   )Ú5Ú6Ú7)	Ú_modulesÚitemsr   ÚmodulesÚtyper$   Úlenr;   r:   )r1   rR   ÚnameÚms       r3   Ú
fuse_modelz"QuantizableShuffleNetV2.fuse_modelA   sÇ   € ð —}‘}×*Ñ*Ó,ò 	J‰GˆD�!ØÐ)Ò)¨a©mÜ˜a¢/Ð!2°FÀDÖIð	Jð —‘“ò 		ˆAÜ�A‹wÔ5Ò5Ü�q—y‘y×)Ñ)×/Ñ/Ó1Ó2°QÒ6Ü! !§)¡)¨s°C¨jº/Ð-JÈFÐ\`ÕaÜØ—I‘IÚ$ s¨C j²/ÐBØØ ö	ñ			r4   r)   )rA   rB   rC   r   r+   r   r@   r   Úboolrf   rD   rE   s   @r3   r   r   4   sG   ø„ ð;˜cð ;¨Sð ;°Tõ ;ð
˜ð  Fó ñ ¨$¡ð ¸4÷ r4   r   Ústages_repeatsÚstages_out_channelsÚweightsÚprogressÚquantizer&   r'   c                óX  — |�Kt        |dt        |j                  d   «      «       d|j                  v rt        |d|j                  d   «       |j                  dd«      }t	        | |fi |¤Ž}t        |«       |rt        ||«       |�"|j                  |j                  |d¬«      «       |S )NÚnum_classesÚ
categoriesÚbackendÚfbgemmT)rk   Ú
check_hash)	r   rc   ÚmetaÚpopr   r   r   Úload_state_dictÚget_state_dict)rh   ri   rj   rk   rl   r&   rp   Úmodels           r3   Ú_shufflenetv2rx   Z   s¦   € ð ÐÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUØ˜Ÿ™Ñ$Ü! &¨)°W·\±\À)Ñ5LÔMØ�j‰j˜ HÓ-€Gä# NÐ4GÑRÈ6ÑR€EÜ�%ÔÙÜ�u˜gÔ&àÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYà€Lr4   )r   r   rq   zdhttps://github.com/pytorch/vision/tree/main/references/classification#post-training-quantized-modelsz’
        These weights were produced by doing Post Training Quantization (eager mode) on top of the unquantized
        weights listed below.
    )Úmin_sizero   rp   ÚrecipeÚ_docsc                   óh   — e Zd Z ed eed¬«      i e¥dej                  ddddœid	d
dœ¥¬«      Z	e	Z
y)r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x0.5_fbgemm-00845098.pthéà   ©Ú	crop_sizeiÛ úImageNet-1Kg#Ûù~jüL@gR¸…ëñS@©zacc@1zacc@5g{®Gáz¤?gj¼t“ø?©Ú
num_paramsÚunquantizedÚ_metricsÚ_opsÚ
_file_size©ÚurlÚ
transformsrs   N)rA   rB   rC   r   r   r
   Ú_COMMON_METAr   ÚIMAGENET1K_V1ÚIMAGENET1K_FBGEMM_V1ÚDEFAULT© r4   r3   r   r   €   s[   „ Ù"ØaÙÐ.¸#Ô>ð
Øð
à!Ø5×CÑCàØ#Ø#ñ ðð Øò
ôÐð" #�Gr4   r   c                   óh   — e Zd Z ed eed¬«      i e¥dej                  ddddœid	d
dœ¥¬«      Z	e	Z
y)r   zQhttps://download.pytorch.org/models/quantized/shufflenetv2_x1_fbgemm-1e62bb32.pthr}   r~   iÌÄ" r€   g×£p=
Q@gh‘í|?åU@r�   g�Âõ(\�Â?gyé&1¬@r‚   rˆ   N)rA   rB   rC   r   r   r
   r‹   r   rŒ   r�   rŽ   r�   r4   r3   r   r   •   s[   „ Ù"Ø_ÙÐ.¸#Ô>ð
Øð
à!Ø5×CÑCàØ#Ø#ñ ðð Øò
ôÐð" #�Gr4   r   c                   ól   — e Zd Z ed eedd¬«      i e¥ddej                  ddd	d
œidddœ¥¬«      Z	e	Z
y)r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x1_5_fbgemm-d7401f05.pthr}   éè   ©r   Úresize_sizeú+https://github.com/pytorch/vision/pull/5906iv5 r€   gÙÎ÷SR@gÍÌÌÌÌ¬V@r�   g‹lçû©ñÒ?gÇK7‰A`@©rz   rƒ   r„   r…   r†   r‡   rˆ   N)rA   rB   rC   r   r   r
   r‹   r   rŒ   r�   rŽ   r�   r4   r3   r   r   ª   ó`   „ Ù"ØaÙÐ.¸#È3ÔOð
Øð
àCØ!Ø5×CÑCàØ#Ø#ñ ðð Øò
ôÐð$ #�Gr4   r   c                   ól   — e Zd Z ed eedd¬«      i e¥ddej                  ddd	d
œidddœ¥¬«      Z	e	Z
y)r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pthr}   r’   r“   r•   iÌÒp r€   g-²�ï§ÖR@g¬Zd;W@r�   g-²�ï§â?g‘í|?5Þ@r–   rˆ   N)rA   rB   rC   r   r   r
   r‹   r   rŒ   r�   rŽ   r�   r4   r3   r   r   À   r—   r4   r   Úquantized_shufflenet_v2_x0_5)rd   Ú
pretrainedc                 óf   — | j                  dd«      rt        j                  S t        j                  S ©Nrl   F)Úgetr   r�   r   rŒ   ©r&   s    r3   ú<lambda>rŸ   Ú   ó0   € à�z‰z˜* eÔ,ô 0×DÑDð ô ,×9Ñ9ð r4   )rj   TF©rj   rk   rl   c                 óf   — |rt         nt        j                  | «      } t        g d¢g d¢f| ||dœ|¤ŽS )aQ  
    Constructs a ShuffleNetV2 with 0.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

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

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X0_5_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X0_5_Weights
        :members:
        :noindex:
    ©é   é   r¤   )é   é0   é`   éÀ   é   r¡   )r   r   Úverifyrx   ©rj   rk   rl   r&   s       r3   r   r   Ö   sD   € ñd 7?Õ2ÔD^×fÑfÐgnÓo€GÜÚÒ*ðØ4;ÀhÐYañØekñð r4   Úquantized_shufflenet_v2_x1_0c                 óf   — | j                  dd«      rt        j                  S t        j                  S rœ   )r�   r   r�   r   rŒ   rž   s    r3   rŸ   rŸ     r    r4   c                 óf   — |rt         nt        j                  | «      } t        g d¢g d¢f| ||dœ|¤ŽS )aQ  
    Constructs a ShuffleNetV2 with 1.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

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

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X1_0_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_0_Weights
        :members:
        :noindex:
    r£   )r¦   ét   r’   iÐ  rª   r¡   )r   r   r«   rx   r¬   s       r3   r    r      óD   € ñd 7?Õ2ÔD^×fÑfÐgnÓo€GÜÚÒ,ðØ6=ÈÐ[cñØgmñð r4   Úquantized_shufflenet_v2_x1_5c                 óf   — | j                  dd«      rt        j                  S t        j                  S rœ   )r�   r   r�   r   rŒ   rž   s    r3   rŸ   rŸ   J  r    r4   c                 óf   — |rt         nt        j                  | «      } t        g d¢g d¢f| ||dœ|¤ŽS )aQ  
    Constructs a ShuffleNetV2 with 1.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

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

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X1_5_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_5_Weights
        :members:
        :noindex:
    r£   )r¦   é°   i`  iÀ  rª   r¡   )r   r   r«   rx   r¬   s       r3   r!   r!   F  r±   r4   Úquantized_shufflenet_v2_x2_0c                 óf   — | j                  dd«      rt        j                  S t        j                  S rœ   )r�   r   r�   r   rŒ   rž   s    r3   rŸ   rŸ   ‚  r    r4   c                 óf   — |rt         nt        j                  | «      } t        g d¢g d¢f| ||dœ|¤ŽS )aQ  
    Constructs a ShuffleNetV2 with 2.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

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

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X2_0_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X2_0_Weights
        :members:
        :noindex:
    r£   )r¦   éô   iè  iÐ  i   r¡   )r   r   r«   rx   r¬   s       r3   r"   r"   ~  r±   r4   )1Ú	functoolsr   Útypingr   r   r   rI   Útorch.nnr,   r   Útorchvision.modelsr   Útransforms._presetsr
   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   r   r   r   r   Úutilsr   r   r   Ú__all__ÚInvertedResidualr$   ÚShuffleNetV2r   ÚlistÚintrg   rx   r‹   r   r   r   r   r   r    r!   r"   r�   r4   r3   ú<module>rÈ      s  ðÝ ß 'Ñ 'ã Ý Ý Ý +å 6ß 7Ñ 7Ý (ß C÷ó ÷ @Ñ ?ò
€ô ,×"?Ñ"?ô ô"#˜l×7Ñ7ô #ðLØ˜‘Iðà˜c™ðð �kÑ"ð	ð
 ðð ðð ðð óð6 Ø&ØØtðñ	€ô#¨+ô #ô*#¨+ô #ô*#¨+ô #ô,#¨+ô #ñ, Ð3Ô4Ùàñ	
ðô	ð aeØØò	*à�eÐ?ÐA[Ð[Ñ\Ñ]ð*ð ð*ð ð	*ð
 ð*ð ò*ó	ó 5ð*ñZ Ð3Ô4Ùàñ	
ðô	ð aeØØò	*à�eÐ?ÐA[Ð[Ñ\Ñ]ð*ð ð*ð ð	*ð
 ð*ð ò*ó	ó 5ð*ñZ Ð3Ô4Ùàñ	
ðô	ð aeØØò	*à�eÐ?ÐA[Ð[Ñ\Ñ]ð*ð ð*ð ð	*ð
 ð*ð ò*ó	ó 5ð*ñZ Ð3Ô4Ùàñ	
ðô	ð aeØØò	*à�eÐ?ÐA[Ð[Ñ\Ñ]ð*ð ð*ð ð	*ð
 ð*ð ò*ó	ó 5ñ*r4   