Ë
    þÍ:jN<  ã                   ó*  — 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 g d¢Zde	dede	fd„Z G d„ dej4                  «      Z G d„ dej4                  «      Zdee   dedededef
d„ZdeddœZ G d„ de«      Z  G d„ d e«      Z! G d!„ d"e«      Z" G d#„ d$e«      Z# e«        ed%e jH                  f¬&«      dd'd(œdee    dededefd)„«       «       Z% e«        ed%e!jH                  f¬&«      dd'd(œdee!   dededefd*„«       «       Z& e«        ed%e"jH                  f¬&«      dd'd(œdee"   dededefd+„«       «       Z' e«        ed%e#jH                  f¬&«      dd'd(œdee#   dededefd,„«       «       Z(y)-é    )Úpartial)ÚAnyÚCallableÚOptionalN)ÚTensoré   )ÚImageClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interface)	ÚShuffleNetV2ÚShuffleNet_V2_X0_5_WeightsÚShuffleNet_V2_X1_0_WeightsÚShuffleNet_V2_X1_5_WeightsÚShuffleNet_V2_X2_0_WeightsÚshufflenet_v2_x0_5Úshufflenet_v2_x1_0Úshufflenet_v2_x1_5Úshufflenet_v2_x2_0ÚxÚgroupsÚreturnc                 óÖ   — | j                  «       \  }}}}||z  }| j                  |||||«      } t        j                  | dd«      j	                  «       } | j                  ||||«      } | S )Nr   r   )ÚsizeÚviewÚtorchÚ	transposeÚ
contiguous)r   r   Ú	batchsizeÚnum_channelsÚheightÚwidthÚchannels_per_groups          út/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/models/shufflenetv2.pyÚchannel_shuffler*      sp   € Ø-.¯V©V«XÑ*€Iˆ|˜V UØ%¨Ñ/Ðð 	
�‰ˆy˜&Ð"4°f¸eÓD€Aä�‰˜˜1˜aÓ ×+Ñ+Ó-€Að 	
�‰ˆy˜,¨°Ó6€Aà€Hó    c                   ó†   ‡ — e Zd Zdedededdfˆ fd„Ze	 ddeded	eded
ededej                  fd„«       Z	de
de
fd„Zˆ xZS )ÚInvertedResidualÚinpÚoupÚstrider   Nc                 ó  •— t         ‰| �  «        d|cxk  rdk  st        d«      ‚ t        d«      ‚|| _        |dz  }| j                  dk(  r||dz  k7  rt        d|› d|› d|› d�«      ‚| j                  dkD  r�t	        j
                  | j                  ||d| j                  d¬	«      t	        j                  |«      t	        j                  ||ddd
d¬«      t	        j                  |«      t	        j                  d¬«      «      | _
        nt	        j
                  «       | _
        t	        j
                  t	        j                  | j                  dkD  r|n||ddd
d¬«      t	        j                  |«      t	        j                  d¬«      | j                  ||d| j                  d¬	«      t	        j                  |«      t	        j                  ||ddd
d¬«      t	        j                  |«      t	        j                  d¬«      «      | _        y )Nr   é   zillegal stride valuer   zInvalid combination of stride z, inp z	 and oup zB values. If stride == 1 then inp should be equal to oup // 2 << 1.©Úkernel_sizer0   Úpaddingr   F)r4   r0   r5   ÚbiasT©Úinplace)ÚsuperÚ__init__Ú
ValueErrorr0   ÚnnÚ
SequentialÚdepthwise_convÚBatchNorm2dÚConv2dÚReLUÚbranch1Úbranch2)Úselfr.   r/   r0   Úbranch_featuresÚ	__class__s        €r)   r:   zInvertedResidual.__init__,   sÄ  ø€ Ü‰ÑÔà�VÔ ˜qÒ ÜÐ3Ó4Ð4ð !ÜÐ3Ó4Ð4ØˆŒà ™(ˆØ�K‰K˜1Ò 3¨/¸QÑ*>Ò#>ÜØ0°°¸¸s¸eÀ9ÈSÈEð  RTð  Uóð ð �;‰;˜Š?ÜŸ=™=Ø×#Ñ# C¨¸!ÀDÇKÁKÐYZÐ#Ó[Ü—‘˜sÓ#Ü—	‘	˜#˜¸AÀaÐQRÐY^Ô_Ü—‘˜Ó/Ü—‘ Ô%óˆD�Lô Ÿ=™=›?ˆDŒLä—}‘}Ü�I‰IØŸ™ aš‘¨oØØØØØôô �N‰N˜?Ó+Ü�G‰G˜DÔ!Ø×Ñ °ÈaÐX\×XcÑXcÐmnÐÓoÜ�N‰N˜?Ó+Ü�I‰I�o ÀAÈaÐYZÐafÔgÜ�N‰N˜?Ó+Ü�G‰G˜DÔ!ó
ˆ�r+   ÚiÚor4   r5   r6   c           	      ó:   — t        j                  | |||||| ¬«      S )N)r6   r   )r<   r@   )rG   rH   r4   r0   r5   r6   s         r)   r>   zInvertedResidual.depthwise_convV   s   € ô �y‰y˜˜A˜{¨F°GÀ$ÈqÔQÐQr+   r   c                 ó(  — | j                   dk(  r?|j                  dd¬«      \  }}t        j                  || j	                  |«      fd¬«      }n7t        j                  | j                  |«      | j	                  |«      fd¬«      }t        |d«      }|S )Nr   r   )Údim)r0   Úchunkr!   ÚcatrC   rB   r*   )rD   r   Úx1Úx2Úouts        r)   ÚforwardzInvertedResidual.forward\   sx   € Ø�;‰;˜!ÒØ—W‘W˜Q A�WÓ&‰FˆB�Ü—)‘)˜R §¡¨bÓ!1Ð2¸Ô:‰Cä—)‘)˜TŸ\™\¨!›_¨d¯l©l¸1«oÐ>ÀAÔFˆCä˜c 1Ó%ˆàˆ
r+   )r   r   F)Ú__name__Ú
__module__Ú__qualname__Úintr:   ÚstaticmethodÚboolr<   r@   r>   r   rQ   Ú__classcell__©rF   s   @r)   r-   r-   +   s”   ø„ ð(
˜Cð (
 cð (
°3ð (
¸4õ (
ðT àZ_ñRØðRØðRØ%(ðRØ25ðRØDGðRØSWðRà	�‰òRó ðRð
	˜ð 	 F÷ 	r+   r-   c                   ó„   ‡ — e Zd Zdefdee   dee   dededej                  f   ddf
ˆ fd	„Z	d
e
de
fd„Zd
e
de
fd„Zˆ xZS )r   iè  Ústages_repeatsÚstages_out_channelsÚnum_classesÚinverted_residual.r   Nc           
      óú  •— t         ‰| �  «        t        | «       t        |«      dk7  rt	        d«      ‚t        |«      dk7  rt	        d«      ‚|| _        d}| j
                  d   }t        j                  t        j                  ||dddd¬	«      t        j                  |«      t        j                  d
¬«      «      | _        |}t        j                  ddd¬«      | _        |  |  |  dD �cg c]  }d|› �‘Œ	 }}t        ||| j
                  dd  «      D ]\  \  }	}
} |||d«      g}t        |
dz
  «      D ]  }|j!                   |||d«      «       Œ t#        | |	t        j                  |Ž «       |}Œ^ | j
                  d   }t        j                  t        j                  ||dddd¬	«      t        j                  |«      t        j                  d
¬«      «      | _        t        j&                  ||«      | _        y c c}w )Nr2   z2expected stages_repeats as list of 3 positive intsé   z7expected stages_out_channels as list of 5 positive intsr   r   r   F)r6   Tr7   r3   )r   r2   é   Ústageéÿÿÿÿ)r9   r:   r
   Úlenr;   Ú_stage_out_channelsr<   r=   r@   r?   rA   Úconv1Ú	MaxPool2dÚmaxpoolÚzipÚrangeÚappendÚsetattrÚconv5ÚLinearÚfc)rD   r[   r\   r]   r^   Úinput_channelsÚoutput_channelsrG   Ústage_namesÚnameÚrepeatsÚseqrF   s               €r)   r:   zShuffleNetV2.__init__i   s×  ø€ ô 	‰ÑÔÜ˜DÔ!äˆ~Ó !Ò#ÜÐQÓRÐRÜÐ"Ó# qÒ(ÜÐVÓWÐWØ#6ˆÔ àˆØ×2Ñ2°1Ñ5ˆÜ—]‘]Ü�I‰I�n o°q¸!¸QÀUÔKÜ�N‰N˜?Ó+Ü�G‰G˜DÔ!ó
ˆŒ
ð
 )ˆä—|‘|°¸!ÀQÔGˆŒñ 	ÙÙØ,5Ö6 q˜˜q˜c’{Ð6ˆÐ6Ü.1°+¸~Èt×OgÑOgÐhiÐhjÐOkÓ.lò 	-Ñ*ˆD�'˜?Ù$ ^°_ÀaÓHÐIˆCÜ˜7 Q™;Ó'ò S�Ø—
‘
Ñ,¨_¸oÈqÓQÕRðSä�D˜$¤§¡¨sÐ 3Ô4Ø,‰Nð	-ð ×2Ñ2°2Ñ6ˆÜ—]‘]Ü�I‰I�n o°q¸!¸QÀUÔKÜ�N‰N˜?Ó+Ü�G‰G˜DÔ!ó
ˆŒ
ô —)‘)˜O¨[Ó9ˆ�ùò 7s   Ã*G8r   c                 ó  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }|j                  ddg«      }| j                  |«      }|S )Nr   r2   )rf   rh   Ústage2Ústage3Ústage4rm   Úmeanro   ©rD   r   s     r)   Ú_forward_implzShuffleNetV2._forward_impl™   ss   € à�J‰J�q‹MˆØ�L‰L˜‹OˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�J‰J�q‹MˆØ�F‰F�A�q�6‹NˆØ�G‰G�A‹JˆØˆr+   c                 ó$   — | j                  |«      S )N)r|   r{   s     r)   rQ   zShuffleNetV2.forward¥   s   € Ø×!Ñ! !Ó$Ð$r+   )rR   rS   rT   r-   ÚlistrU   r   r<   ÚModuler:   r   r|   rQ   rX   rY   s   @r)   r   r   h   s|   ø„ ð
  Ø6Fñ.:à˜S™	ð.:ð " #™Yð.:ð ð	.:ð
 $ C¨¯© NÑ3ð.:ð 
õ.:ð`
˜vð 
¨&ó 
ð%˜ð % F÷ %r+   r   ÚweightsÚprogressÚargsÚkwargsc                 ó®   — | �#t        |dt        | j                  d   «      «       t        |i |¤Ž}| �"|j	                  | j                  |d¬«      «       |S )Nr]   Ú
categoriesT)r�   Ú
check_hash)r   rd   Úmetar   Úload_state_dictÚget_state_dict)r€   r�   r‚   rƒ   Úmodels        r)   Ú_shufflenetv2r‹   ©   s]   € ð ÐÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUä˜$Ð) &Ñ)€EàÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYà€Lr+   )r   r   z2https://github.com/ericsun99/Shufflenet-v2-Pytorch)Úmin_sizer…   Úrecipec                   óT   — e Zd Z ed eed¬«      i e¥dddddœid	d
ddœ¥¬«      ZeZy)r   zDhttps://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pthéà   ©Ú	crop_sizeiÛ úImageNet-1Kg-²�ï§FN@g9´Èv¾oT@©zacc@1zacc@5g{®Gáz¤?gTã¥›Ä @úVThese weights were trained from scratch to reproduce closely the results of the paper.©Ú
num_paramsÚ_metricsÚ_opsÚ
_file_sizeÚ_docs©ÚurlÚ
transformsr‡   N©	rR   rS   rT   r   r   r	   Ú_COMMON_METAÚIMAGENET1K_V1ÚDEFAULT© r+   r)   r   r   Á   sT   „ ÙàRÙÐ.¸#Ô>ð
Øð
à!àØ#Ø#ñ ðð ØØqò
ô	€Mð$ �Gr+   r   c                   óT   — e Zd Z ed eed¬«      i e¥dddddœid	d
ddœ¥¬«      ZeZy)r   zBhttps://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pthr�   r�   iÌÄ" r’   gºI+WQ@gNbX9V@r“   g�Âõ(\�Â?g¢E¶óý”!@r”   r•   r›   Nrž   r¢   r+   r)   r   r   ×   sT   „ ÙàPÙÐ.¸#Ô>ð
Øð
à!àØ#Ø#ñ ðð ØØqò
ô	€Mð$ �Gr+   r   c                   óX   — e Zd Z ed eedd¬«      i e¥ddddd	d
œiddddœ¥¬«      ZeZy)r   zBhttps://download.pytorch.org/models/shufflenetv2_x1_5-3c479a10.pthr�   éè   ©r‘   Úresize_sizeú+https://github.com/pytorch/vision/pull/5906iv5 r’   g9´Èv¾?R@g/Ý$�ÅV@r“   g‹lçû©ñÒ?gw¾Ÿ/+@úé
                These weights were trained from scratch by using TorchVision's `new training recipe
                <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
            ©r�   r–   r—   r˜   r™   rš   r›   Nrž   r¢   r+   r)   r   r   í   ó[   „ ÙØPÙÐ.¸#È3ÔOð
Øð
àCØ!àØ#Ø#ñ ðð Ø ðò
ô€Mð* �Gr+   r   c                   óX   — e Zd Z ed eedd¬«      i e¥ddddd	d
œiddddœ¥¬«      ZeZy)r   zBhttps://download.pytorch.org/models/shufflenetv2_x2_0-8be3c8ee.pthr�   r¥   r¦   r¨   iÌÒp r’   g…ëQ¸S@gªñÒMb@W@r“   g-²�ï§â?g+‡Ùn<@r©   rª   r›   Nrž   r¢   r+   r)   r   r     r«   r+   r   Ú
pretrained)r€   T)r€   r�   c                 óR   — t         j                  | «      } t        | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 0.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X0_5_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X0_5_Weights` 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.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X0_5_Weights
        :members:
    ©ra   é   ra   )é   é0   é`   éÀ   é   )r   Úverifyr‹   ©r€   r�   rƒ   s      r)   r   r     s,   € ô4 )×/Ñ/°Ó8€Gä˜ (ªIÒ7NÑYÐRXÑYÐYr+   c                 óR   — t         j                  | «      } t        | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 1.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X1_0_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X1_0_Weights` 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.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_0_Weights
        :members:
    r¯   )r±   ét   r¥   iÐ  rµ   )r   r¶   r‹   r·   s      r)   r   r   >  ó,   € ô4 )×/Ñ/°Ó8€Gä˜ (ªIÒ7PÑ[ÐTZÑ[Ð[r+   c                 óR   — t         j                  | «      } t        | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 1.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X1_5_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X1_5_Weights` 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.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_5_Weights
        :members:
    r¯   )r±   é°   i`  iÀ  rµ   )r   r¶   r‹   r·   s      r)   r   r   ]  rº   r+   c                 óR   — t         j                  | «      } t        | |g d¢g d¢fi |¤ŽS )a  
    Constructs a ShuffleNetV2 architecture with 2.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    Args:
        weights (:class:`~torchvision.models.ShuffleNet_V2_X2_0_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.ShuffleNet_V2_X2_0_Weights` 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.
        **kwargs: parameters passed to the ``torchvision.models.shufflenetv2.ShuffleNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ShuffleNet_V2_X2_0_Weights
        :members:
    r¯   )r±   éô   iè  iÐ  i   )r   r¶   r‹   r·   s      r)   r   r   |  rº   r+   ))Ú	functoolsr   Útypingr   r   r   r!   Útorch.nnr<   r   Útransforms._presetsr	   Úutilsr
   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Ú__all__rU   r*   r   r-   r   rW   r‹   rŸ   r   r   r   r   r    r   r   r   r   r¢   r+   r)   ú<module>rÈ      sn  ðÝ ß *Ñ *ã Ý Ý å 5Ý 'ß 6Ñ 6Ý 'ß Bò
€ð�vð  sð ¨vó ô:�r—y‘yô :ôz>%�2—9‘9ô >%ðBØ�kÑ"ðàðð ðð ð	ð
 óð$ Ø&ØBñ€ô ô ô, ô ô, ô ô2 ô ñ2 ÓÙ ,Ð0J×0XÑ0XÐ!YÔZà7;ÈdòZØÐ3Ñ4ðZØGKðZØ^aðZàòZó [ó ðZñ: ÓÙ ,Ð0J×0XÑ0XÐ!YÔZà7;Èdò\ØÐ3Ñ4ð\ØGKð\Ø^að\àò\ó [ó ð\ñ: ÓÙ ,Ð0J×0XÑ0XÐ!YÔZà7;Èdò\ØÐ3Ñ4ð\ØGKð\Ø^að\àò\ó [ó ð\ñ: ÓÙ ,Ð0J×0XÑ0XÐ!YÔZà7;Èdò\ØÐ3Ñ4ð\ØGKð\Ø^að\àò\ó [ó ñ\r+   